summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/doc/context
diff options
context:
space:
mode:
authorSiep Kroonenberg <siepo@cybercomm.nl>2023-02-26 14:44:25 +0000
committerSiep Kroonenberg <siepo@cybercomm.nl>2023-02-26 14:44:25 +0000
commit3425cde3987c69d7afd10e28e9e2b44bad3fbb23 (patch)
tree272be38d50a8451a6db2a419786d72f9a9f5cdc6 /Master/texmf-dist/doc/context
parentc2cbe5554ef9b3243e33d38ed75cfd00542103fd (diff)
ConTeXt LMTX: doc
git-svn-id: svn://tug.org/texlive/trunk@66176 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/doc/context')
-rw-r--r--Master/texmf-dist/doc/context/documents/general/manuals/bidi.pdfbin121014 -> 108054 bytes
-rw-r--r--Master/texmf-dist/doc/context/documents/general/manuals/canbedone-periods.pdfbin0 -> 37220 bytes
-rw-r--r--Master/texmf-dist/doc/context/documents/general/manuals/charts-mkiv.pdfbin144092 -> 123926 bytes
-rw-r--r--Master/texmf-dist/doc/context/documents/general/manuals/cld-mkiv.pdfbin804291 -> 692894 bytes
-rw-r--r--Master/texmf-dist/doc/context/documents/general/manuals/colors-mkiv.pdfbin2129948 -> 2319397 bytes
-rw-r--r--Master/texmf-dist/doc/context/documents/general/manuals/columnsets.pdfbin4509576 -> 2404352 bytes
-rw-r--r--Master/texmf-dist/doc/context/documents/general/manuals/followingup.pdfbin559412 -> 404791 bytes
-rw-r--r--Master/texmf-dist/doc/context/documents/general/manuals/languages-mkiv.pdfbin678284 -> 283651 bytes
-rw-r--r--Master/texmf-dist/doc/context/documents/general/manuals/lowlevel-alignments.pdfbin0 -> 74661 bytes
-rw-r--r--Master/texmf-dist/doc/context/documents/general/manuals/lowlevel-boxes.pdfbin78543 -> 87679 bytes
-rw-r--r--Master/texmf-dist/doc/context/documents/general/manuals/lowlevel-characters.pdfbin52979 -> 48469 bytes
-rw-r--r--Master/texmf-dist/doc/context/documents/general/manuals/lowlevel-conditionals.pdfbin104674 -> 96046 bytes
-rw-r--r--Master/texmf-dist/doc/context/documents/general/manuals/lowlevel-expansion.pdfbin48778 -> 86301 bytes
-rw-r--r--Master/texmf-dist/doc/context/documents/general/manuals/lowlevel-grouping.pdfbin30762 -> 28200 bytes
-rw-r--r--Master/texmf-dist/doc/context/documents/general/manuals/lowlevel-inserts.pdfbin0 -> 38122 bytes
-rw-r--r--Master/texmf-dist/doc/context/documents/general/manuals/lowlevel-loops.pdfbin0 -> 44159 bytes
-rw-r--r--Master/texmf-dist/doc/context/documents/general/manuals/lowlevel-macros.pdfbin87655 -> 88216 bytes
-rw-r--r--Master/texmf-dist/doc/context/documents/general/manuals/lowlevel-marks.pdfbin0 -> 62989 bytes
-rw-r--r--Master/texmf-dist/doc/context/documents/general/manuals/lowlevel-paragraphs.pdfbin208745 -> 296883 bytes
-rw-r--r--Master/texmf-dist/doc/context/documents/general/manuals/lowlevel-registers.pdfbin43435 -> 43739 bytes
-rw-r--r--Master/texmf-dist/doc/context/documents/general/manuals/lowlevel-scope.pdfbin46060 -> 44386 bytes
-rw-r--r--Master/texmf-dist/doc/context/documents/general/manuals/lowlevel-security.pdfbin41760 -> 40571 bytes
-rw-r--r--Master/texmf-dist/doc/context/documents/general/manuals/lowlevel.pdfbin0 -> 657745 bytes
-rw-r--r--Master/texmf-dist/doc/context/documents/general/manuals/luametafun.pdfbin5553137 -> 3803772 bytes
-rw-r--r--Master/texmf-dist/doc/context/documents/general/manuals/luametatex.pdfbin1385220 -> 1470739 bytes
-rw-r--r--Master/texmf-dist/doc/context/documents/general/manuals/luatex.pdfbin1544345 -> 1565548 bytes
-rw-r--r--Master/texmf-dist/doc/context/documents/general/manuals/math-mkiv.pdfbin853719 -> 764540 bytes
-rw-r--r--Master/texmf-dist/doc/context/documents/general/manuals/math-tweaks.pdfbin0 -> 7220 bytes
-rw-r--r--Master/texmf-dist/doc/context/documents/general/manuals/musings.pdfbin6002933 -> 1469208 bytes
-rw-r--r--Master/texmf-dist/doc/context/documents/general/manuals/notnow.pdfbin103814 -> 61024 bytes
-rw-r--r--Master/texmf-dist/doc/context/documents/general/manuals/onandon.pdfbin6602776 -> 2757973 bytes
-rw-r--r--Master/texmf-dist/doc/context/documents/general/manuals/ontarget.pdfbin0 -> 539819 bytes
-rw-r--r--Master/texmf-dist/doc/context/documents/general/manuals/primitives.pdfbin143288 -> 161106 bytes
-rw-r--r--Master/texmf-dist/doc/context/documents/general/manuals/rules-mkiv.pdfbin187549 -> 126440 bytes
-rw-r--r--Master/texmf-dist/doc/context/documents/general/manuals/spacing-mkiv.pdfbin40300 -> 97602 bytes
-rw-r--r--Master/texmf-dist/doc/context/documents/general/manuals/templates-mkiv.pdfbin92572 -> 44094 bytes
-rw-r--r--Master/texmf-dist/doc/context/documents/general/manuals/workflows-mkiv.pdfbin82860 -> 90351 bytes
-rw-r--r--Master/texmf-dist/doc/context/documents/general/manuals/xml-mkiv.pdfbin899449 -> 268614 bytes
-rw-r--r--Master/texmf-dist/doc/context/documents/general/manuals/xtables-mkiv.pdfbin157802 -> 97369 bytes
-rw-r--r--Master/texmf-dist/doc/context/documents/general/qrcs/setup-de.pdfbin952439 -> 845580 bytes
-rw-r--r--Master/texmf-dist/doc/context/documents/general/qrcs/setup-en.pdfbin963860 -> 848669 bytes
-rw-r--r--Master/texmf-dist/doc/context/documents/general/qrcs/setup-fr.pdfbin961163 -> 843783 bytes
-rw-r--r--Master/texmf-dist/doc/context/documents/general/qrcs/setup-it.pdfbin958941 -> 844753 bytes
-rw-r--r--Master/texmf-dist/doc/context/documents/general/qrcs/setup-mapping-de.pdfbin354810 -> 319913 bytes
-rw-r--r--Master/texmf-dist/doc/context/documents/general/qrcs/setup-mapping-en.pdfbin354208 -> 317685 bytes
-rw-r--r--Master/texmf-dist/doc/context/documents/general/qrcs/setup-mapping-fr.pdfbin357723 -> 321113 bytes
-rw-r--r--Master/texmf-dist/doc/context/documents/general/qrcs/setup-mapping-it.pdfbin355763 -> 319712 bytes
-rw-r--r--Master/texmf-dist/doc/context/documents/general/qrcs/setup-mapping-nl.pdfbin353260 -> 319146 bytes
-rw-r--r--Master/texmf-dist/doc/context/documents/general/qrcs/setup-nl.pdfbin947389 -> 840670 bytes
-rw-r--r--Master/texmf-dist/doc/context/presentations/bachotex/2010/bachotex-2010-clash.tex1
-rw-r--r--Master/texmf-dist/doc/context/presentations/context/2020/context-2020-concepts.pdfbin156486 -> 114016 bytes
-rw-r--r--Master/texmf-dist/doc/context/presentations/context/2020/context-2020-concepts.tex75
-rw-r--r--Master/texmf-dist/doc/context/presentations/context/2020/context-2020-datatypes.pdfbin42978 -> 41356 bytes
-rw-r--r--Master/texmf-dist/doc/context/presentations/context/2020/context-2020-implementers.pdfbin39686 -> 33665 bytes
-rw-r--r--Master/texmf-dist/doc/context/presentations/context/2020/context-2020-luametatex.tex2
-rw-r--r--Master/texmf-dist/doc/context/presentations/context/2020/context-2020-tokens.pdfbin45873 -> 42665 bytes
-rw-r--r--Master/texmf-dist/doc/context/presentations/context/2020/context-2020-tokens.tex26
-rw-r--r--Master/texmf-dist/doc/context/presentations/context/2021/context-2021-compactfonts.pdfbin0 -> 56466 bytes
-rw-r--r--Master/texmf-dist/doc/context/presentations/context/2021/context-2021-compactfonts.tex609
-rw-r--r--Master/texmf-dist/doc/context/presentations/context/2021/context-2021-localcontrol.pdfbin0 -> 35875 bytes
-rw-r--r--Master/texmf-dist/doc/context/presentations/context/2021/context-2021-localcontrol.tex369
-rw-r--r--Master/texmf-dist/doc/context/presentations/context/2021/context-2021-luametafun.pdfbin0 -> 37579 bytes
-rw-r--r--Master/texmf-dist/doc/context/presentations/context/2021/context-2021-luametafun.tex362
-rw-r--r--Master/texmf-dist/doc/context/presentations/context/2021/context-2021-math.pdfbin0 -> 21605 bytes
-rw-r--r--Master/texmf-dist/doc/context/presentations/context/2021/context-2021-math.tex236
-rw-r--r--Master/texmf-dist/doc/context/presentations/context/2021/context-2021-overloadprotection.pdfbin0 -> 32849 bytes
-rw-r--r--Master/texmf-dist/doc/context/presentations/context/2021/context-2021-overloadprotection.tex298
-rw-r--r--Master/texmf-dist/doc/context/presentations/context/2021/context-2021-paragraphs.pdfbin0 -> 24329 bytes
-rw-r--r--Master/texmf-dist/doc/context/presentations/context/2021/context-2021-paragraphs.tex162
-rw-r--r--Master/texmf-dist/doc/context/presentations/context/2021/context-2021-programming.pdfbin0 -> 32433 bytes
-rw-r--r--Master/texmf-dist/doc/context/presentations/context/2021/context-2021-programming.tex325
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkii/ctxtools.html64
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkii/ctxtools.man75
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkii/ctxtools.xml31
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkii/imgtopdf.html55
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkii/imgtopdf.man48
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkii/imgtopdf.xml22
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkii/mptopdf.1 (renamed from Master/texmf-dist/doc/context/scripts/mkii/rlxtools.man)19
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkii/mptopdf.html50
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkii/mptopdf.man1.pdfbin0 -> 16122 bytes
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkii/mptopdf.xml17
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkii/pdftools.html55
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkii/pdftools.man48
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkii/pdftools.xml22
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkii/pstopdf.man30
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkii/pstopdf.xml16
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkii/rlxtools.html49
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkii/rlxtools.xml16
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkii/texexec.html63
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkii/texexec.man72
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkii/texexec.xml30
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkii/texmfstart.html102
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkii/texmfstart.man153
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkii/texmfstart.xml80
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkii/textools.html63
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkii/textools.man72
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkii/textools.xml30
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkii/texutil.html54
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkii/texutil.man45
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkii/texutil.xml21
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkii/tmftools.html50
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkii/tmftools.xml18
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkii/xmltools.html54
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkii/xmltools.man45
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkii/xmltools.xml21
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/context.html7
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/context.man16
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/context.xml16
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/luatools.man2
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-babel.man2
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-base.man2
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-bibtex.man2
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-cache.man2
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-chars.man2
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-check.man2
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-colors.man2
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-context.html7
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-context.man16
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-context.xml16
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-dvi.man2
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-epub.man2
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-evohome.man2
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-fcd.man2
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-flac.man2
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-fonts.html2
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-fonts.man2
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-fonts.xml4
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-grep.man2
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-interface.html1
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-interface.man5
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-interface.xml1
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-metapost.man2
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-modules.man2
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-package.man2
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-patterns.man2
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-pdf.html1
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-pdf.man5
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-pdf.xml2
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-plain.man2
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-profile.man2
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-rsync.man2
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-scite.man2
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-server.man2
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-spell.html (renamed from Master/texmf-dist/doc/context/scripts/mkii/pstopdf.html)14
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-spell.man (renamed from Master/texmf-dist/doc/context/scripts/mkii/tmftools.man)22
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-spell.xml26
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-texworks.man2
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-timing.man2
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-tools.man2
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-unicode.man2
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-unzip.man2
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-update.man2
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-vscode.html3
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-vscode.man8
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-vscode.xml3
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-watch.man2
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtx-youless.man2
-rw-r--r--Master/texmf-dist/doc/context/scripts/mkiv/mtxrun.man2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/magazines/mag-0000-mkiv.tex4
-rw-r--r--Master/texmf-dist/doc/context/sources/general/magazines/mag-0002-mkiv.tex4
-rw-r--r--Master/texmf-dist/doc/context/sources/general/magazines/mag-0006-mkiv.tex4
-rw-r--r--Master/texmf-dist/doc/context/sources/general/magazines/mag-0007-mkiv.tex4
-rw-r--r--Master/texmf-dist/doc/context/sources/general/magazines/mag-0010-mkiv.tex4
-rw-r--r--Master/texmf-dist/doc/context/sources/general/magazines/mag-1101-mkiv.tex4
-rw-r--r--Master/texmf-dist/doc/context/sources/general/magazines/mag-1102-mkiv.tex4
-rw-r--r--Master/texmf-dist/doc/context/sources/general/magazines/mag-1103-mkiv.tex4
-rw-r--r--Master/texmf-dist/doc/context/sources/general/magazines/mag-1104-mkiv.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/magazines/mag-1105-mkiv.tex24
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/about/about-calls.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/about/about-contents.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/about/about-expanding.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/about/about-hashing.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/about/about-hz.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/about/about-introduction.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/about/about-jitting.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/about/about-luafunctions.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/about/about-mathstackers.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/about/about-mathstyles.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/about/about-metafun.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/about/about-mobility.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/about/about-nodes.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/about/about-nuts.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/about/about-properties.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/about/about-speed.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/about/about-threequarters.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/about/about.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/bidi/bidi-contents.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/bidi/bidi-fonts.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/bidi/bidi-introduction.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/bidi/bidi-lua.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/bidi/bidi-mixed.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/bidi/bidi-numbering.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/bidi/bidi-style.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/bidi/bidi-titlepage.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/bidi/bidi-vertical.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/bidi/bidi.tex8
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/canbedone/canbedone-periods.tex157
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/canbedone/canbedone-style.tex142
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/canbedone/canbedone.tex29
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/charts/charts-mkiv.tex4
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/cld/cld-abitoflua.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/cld/cld-afewdetails.tex4
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/cld/cld-backendcode.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/cld/cld-callbacks.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/cld/cld-contents.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/cld/cld-ctxfunctions.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/cld/cld-environment.tex25
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/cld/cld-files.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/cld/cld-gettingstarted.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/cld/cld-goodies.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/cld/cld-graphics.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/cld/cld-introduction.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/cld/cld-logging.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/cld/cld-luafunctions.tex6
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/cld/cld-macros.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/cld/cld-mkiv.tex4
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/cld/cld-moreonfunctions.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/cld/cld-nicetoknow.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/cld/cld-scanners.tex22
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/cld/cld-somemoreexamples.tex14
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/cld/cld-specialcommands.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/cld/cld-summary.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/cld/cld-titlepage.tex18
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/cld/cld-variables.tex7
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/cld/cld-verbatim.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/colors/colors-basics.tex12
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/colors/colors-environment.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/colors/colors-graphics.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/colors/colors-introduction.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/colors/colors-metafun.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/colors/colors-mkiv.tex4
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-000.tex4
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-001.tex4
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-002.tex4
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-003.tex4
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-004.tex6
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-005.tex4
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-006.tex4
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-007.tex4
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-101.tex4
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-102.tex4
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-103.tex4
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-201.tex4
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-202.tex4
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-203.tex4
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-204.tex6
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-205.tex12
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-206.tex4
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-301.tex4
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-401.tex4
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-402.tex4
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-403.tex4
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-404.tex4
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-405.tex4
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-601.tex4
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-701.tex4
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-702.tex4
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-703.tex4
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-704.tex4
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-801.tex4
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-802.tex4
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-803.tex4
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-804.tex4
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-805.tex4
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-806.tex4
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-901.tex4
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-902.tex4
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-903.tex4
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/details/back-0.tex4
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/details/details-backpage.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/details/details-captiontrickery.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/details/details-colofon.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/details/details-contents.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/details/details-environment.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/details/details-finetuningfloats.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/details/details-floatingaround.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/details/details-frontpage.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/details/details-gridtrickery.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/details/details-index.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/details/details-introduction.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/details/details-ornaments.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/details/details-pseudocolumns.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/details/details-snappingheads.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/details/details-textbackgrounds.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/details/details-tuningformulas.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/details/details.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/details/detcow.tex4
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/epub/epub-mkiv-demo.tex1
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/epub/epub-mkiv.tex4
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/evenmore/evenmore-bitwise.tex194
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/evenmore/evenmore-contents.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/evenmore/evenmore-expansion.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/evenmore/evenmore-expressions.tex336
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/evenmore/evenmore-fonts.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/evenmore/evenmore-formats.tex362
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/evenmore/evenmore-hyphenation.tex426
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/evenmore/evenmore-inserts.tex198
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/evenmore/evenmore-introduction.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/evenmore/evenmore-keywords.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/evenmore/evenmore-libraries.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/evenmore/evenmore-normalization.tex6
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/evenmore/evenmore-numbers.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/evenmore/evenmore-offloading.tex127
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/evenmore/evenmore-paragraphs.tex397
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/evenmore/evenmore-parameters.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/evenmore/evenmore-parsing.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/evenmore/evenmore-pi.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/evenmore/evenmore-style.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/evenmore/evenmore-threesix.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/evenmore/evenmore-titlepage.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/evenmore/evenmore-tokens.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/evenmore/evenmore-whattex.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/evenmore/evenmore.tex22
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/followingup/followingup-bitmaps.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/followingup/followingup-cleanup.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/followingup/followingup-compilation.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/followingup/followingup-contents.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/followingup/followingup-directions.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/followingup/followingup-evolution.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/followingup/followingup-feedback.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/followingup/followingup-fonts.tex56
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/followingup/followingup-introduction.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/followingup/followingup-logging.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/followingup/followingup-lua.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/followingup/followingup-memory.tex136
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/followingup/followingup-mp.tex4
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/followingup/followingup-performance.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/followingup/followingup-rejected.tex16
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/followingup/followingup-retrospect.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/followingup/followingup-stripping.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/followingup/followingup-stubs.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/followingup/followingup-style.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/followingup/followingup-tex.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/followingup/followingup-titlepage.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/followingup/followingup-whatsits.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/followingup/followingup.tex5
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/fonts/fonts-appendix.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/fonts/fonts-environment.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/fonts/fonts-extensions.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/fonts/fonts-features.tex62
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/fonts/fonts-formats.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/fonts/fonts-hooks.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/fonts/fonts-introduction.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/fonts/fonts-lookups.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/fonts/fonts-math.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/fonts/fonts-methods.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/fonts/fonts-mkiv.tex4
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/fonts/fonts-modes.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/fonts/fonts-scripts.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/fonts/fonts-tricks.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/graphics/graphics.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-backend.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-bidi.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-callbacks.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-characters.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-codebase.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-contents.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-ebooks.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-export.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-fontnames.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-glocal.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-goodies.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-inserts.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-intermezzo.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-introduction.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-italics.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-jit.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-languages.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-math.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-mathml.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-merge.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-mkvi.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-optimize.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-parbuilder.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-partests.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-tags.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-titlepage.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-weird.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/interaction/interaction-actions.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/interaction/interaction-annotations.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/interaction/interaction-attachments.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/interaction/interaction-bookmarks.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/interaction/interaction-buttons.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/interaction/interaction-contents.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/interaction/interaction-enabling.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/interaction/interaction-hyperlinks.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/interaction/interaction-importing.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/interaction/interaction-introduction.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/interaction/interaction-javascript.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/interaction/interaction-structure.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/interaction/interaction-tagging.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/interaction/interaction-titlepage.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/interaction/interaction-transitions.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/languages/languages-appendix.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/languages/languages-basics.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/languages/languages-environment.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/languages/languages-goodies.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/languages/languages-hyphenation.tex52
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/languages/languages-introduction.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/languages/languages-labels.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/languages/languages-mkiv.tex5
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/languages/languages-numbering.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/languages/languages-options.tex424
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/languages/languages-sorting.tex4
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/libraries/ecmascript-mkiv.tex4
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/libraries/libraries-mkiv.tex4
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/lowlevel/lowlevel-alignments.tex830
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/lowlevel/lowlevel-boxes.tex247
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/lowlevel/lowlevel-characters.tex30
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/lowlevel/lowlevel-conditionals.tex214
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/lowlevel/lowlevel-expansion.tex833
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/lowlevel/lowlevel-grouping.tex40
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/lowlevel/lowlevel-inserts.tex216
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/lowlevel/lowlevel-localboxes.tex408
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/lowlevel/lowlevel-loops.tex327
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/lowlevel/lowlevel-macros.tex168
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/lowlevel/lowlevel-marks.tex511
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/lowlevel/lowlevel-paragraphs.tex683
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/lowlevel/lowlevel-registers.tex59
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/lowlevel/lowlevel-scope.tex18
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/lowlevel/lowlevel-security.tex18
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/lowlevel/lowlevel-style.tex43
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/lowlevel/lowlevel.tex45
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/lua/lua-mkiv.tex6
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun-arrow.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun-axis.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun-chart.tex3
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun-color.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun-contents.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun-contour.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun-followtext.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun-fonts.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun-function.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun-grid.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun-groups.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun-interface.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun-introduction.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun-mesh-examples.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun-mesh.tex10
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun-outline.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun-placeholder.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun-poisson.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun-shade.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun-style.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun-surface.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun-svg.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun-technology.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun-text.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun-titlepage.tex1
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun.tex3
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex-building.tex1337
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex-callbacks.tex551
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex-codes.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex-contents.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex-differences.tex292
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex-enhancements.tex2048
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex-firstpage.tex6
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex-fonts.tex525
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex-introduction.tex146
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex-languages.tex173
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex-libraries.tex4
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex-lua.tex341
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex-math.tex2598
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex-metapost.tex538
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex-modifications.tex715
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex-nodes.tex737
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex-pdf.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex-preamble.tex189
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex-primitives.tex4
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex-registers.tex13
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex-rejected.tex94
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex-statistics.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex-style.tex137
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex-tex.tex420
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex-titlepage.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex.tex64
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luatex-primitives.lua1
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luatex-primitives.tex1
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/luatex/luatex-contents.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/luatex/luatex-enhancements.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/luatex/luatex-firstpage.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/luatex/luatex-fonts.tex33
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/luatex/luatex-introduction.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/luatex/luatex-languages.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/luatex/luatex-logos.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/luatex/luatex-lua.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/luatex/luatex-math.tex77
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/luatex/luatex-modifications.tex48
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/luatex/luatex-nodes.tex23
-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-registers.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/luatex/luatex-statistics.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/luatex/luatex-style.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/luatex/luatex-titlepage.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/luatex/luatex.tex4
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/manuals-explaining-contents.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/manuals-explaining-cover.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/manuals-explaining-environment.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/manuals-xml-environment.tex5
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/math/math-alignments.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/math/math-combining.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/math/math-contents.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/math/math-definitions.tex8
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/math/math-features.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/math/math-fonts-accents-001.tex23
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/math/math-fonts-helpers.tex83
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/math/math-fonts-italics-002.tex28
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/math/math-fonts-primes-001.tex28
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/math/math-fonts-radicals-001.tex18
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/math/math-fonts-scripts-001.tex18
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/math/math-fonts.tex263
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/math/math-framing-001.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/math/math-framing.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/math/math-fun.tex118
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/math/math-grouping.tex212
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/math/math-input.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/math/math-introduction.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/math/math-layout.tex32
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/math/math-mkiv.tex11
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/math/math-notdone.tex146
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/math/math-numbering.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/math/math-oddities.tex4
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/math/math-spacing-001.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/math/math-spacing.tex24
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/math/math-suboptimal.tex1
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/math/math-titlepage.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/math/math-tricks.tex13
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/math/math-tweaks.tex2008
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/mathml/envexamp.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/mathml/mmlexamp.tex4
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/mathml/mmlprime.tex36
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/mcommon.tex4
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-backgrounds.tex4
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-backpage.tex4
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-basics.tex6
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-colofon-paper.tex4
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-colofon-screen.tex4
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-colofon.tex4
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-contents.tex4
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-conventions.tex4
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-debugging.tex4
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-document.tex4
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-effects.tex168
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-embedding.tex4
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-environment-layout.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-environment-samples.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-environment-screen.tex4
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-environment.tex4
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-examples.tex43
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-functions.tex4
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-gadgets.tex4
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-graphics.tex4
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-index.tex4
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-introduction.tex15
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-layout.tex4
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-lua.tex62
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-macros.tex4
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-positioning.tex15
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-reference.tex5
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-sneaky.tex13
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-styles.tex4
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-syntax.tex4
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-text-lmtx.tex73
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-text.tex30
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-titlepage-paper.tex4
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-titlepage-screen.tex4
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-welcome.tex56
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun.tex17
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/metafun/mfun-700.tex4
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/metafun/mfun-771.tex4
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/metafun/mfun-772.tex4
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/metafun/mfun-773.tex4
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/metafun/mfun-774.tex4
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/metafun/mfun-775.tex4
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/metafun/mfun-776.tex4
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/metafun/mfun-800.tex4
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/metafun/mfun-900.tex4
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/metafun/mfun-901.tex4
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/metafun/mfun-902.tex4
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-arabic.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-breakingapart.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-calcmath.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-cjk.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-code.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-colors.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-contents.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-dirtytricks.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-environment.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-fallback.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-fonts.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-goingbeta.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-goingutf.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-halfway.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-iitoiv.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-initialization.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-introduction.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-itworks.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-last.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-luafitsin.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-math.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-memory.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-mix.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-mplib.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-nicetoknow.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-nodes.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-open.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-optimization.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-order.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-performance.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-plain.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-punk.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-reflection.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-structure.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-timing-1-luatex-progress.lut15979
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-titlepage.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-tokenspeak.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-tracking.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-xml.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-zapfino.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/mk/mk.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/musings/musings-children.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/musings/musings-contents.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/musings/musings-introduction.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/musings/musings-names.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/musings/musings-perception.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/musings/musings-plain.tex8
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/musings/musings-roadmap.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/musings/musings-speed.tex687
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/musings/musings-stability.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/musings/musings-staygo.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/musings/musings-style.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/musings/musings-titlepage.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/musings/musings-toocomplex.tex389
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/musings/musings-whytex.tex69
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/musings/musings.tex9
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/nodes/nodes.tex4
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/notnow/notnow-columns-and-notes.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/notnow/notnow-sidefloats.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/notnow/notnow.tex42
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/onandon/onandon-110.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/onandon/onandon-53.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/onandon/onandon-decade.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/onandon/onandon-editing.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/onandon/onandon-emoji.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/onandon/onandon-execute.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/onandon/onandon-expansion.tex74
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/onandon/onandon-fences.tex7
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/onandon/onandon-ffi.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/onandon/onandon-media.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/onandon/onandon-modern.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/onandon/onandon-performance.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/onandon/onandon-runtoks.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/onandon/onandon-seguiemj.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/onandon/onandon-variable.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/onandon/onandon.tex4
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/ontarget/ontarget-alsomath.tex90
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/ontarget/ontarget-anchoring.tex280
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/ontarget/ontarget-binary.tex99
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/ontarget/ontarget-contents.tex13
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/ontarget/ontarget-dk.tex90
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/ontarget/ontarget-eventually.tex375
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/ontarget/ontarget-gettingridof.tex1666
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/ontarget/ontarget-introduction.tex104
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/ontarget/ontarget-makesnosense.tex213
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/ontarget/ontarget-makessense.tex110
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/ontarget/ontarget-math.tex2179
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/ontarget/ontarget-metapost.tex755
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/ontarget/ontarget-registers.tex164
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/ontarget/ontarget-ridofjit.tex111
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/ontarget/ontarget-style.tex68
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/ontarget/ontarget-titlepage.tex73
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/ontarget/ontarget.tex30
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/pagecolumns/pagecolumns-000.tex4
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/pagecolumns/pagecolumns-001.tex4
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/pagecolumns/pagecolumns-002.tex4
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/pagecolumns/pagecolumns-003.tex4
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/pagecolumns/pagecolumns-004.tex4
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/pagecolumns/pagecolumns-005.tex4
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/pagecolumns/pagecolumns-006.tex4
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/pagecolumns/pagecolumns-007.tex4
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/pagecolumns/pagecolumns.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/primitives/primitives.tex1580
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/readme/mreadme.tex36
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/rules/rules-mkiv.tex185
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/spacing/spacing-contents.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/spacing/spacing-introduction.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/spacing/spacing-linecorrection.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/spacing/spacing-mkiv.tex4
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/spacing/spacing-periods.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/spacing/spacing-spaces.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/spacing/spacing-style.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/spacing/spacing-titlepage.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/spreadsheets/spreadsheets-mkiv.tex6
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/sql/sql-mkiv.tex6
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/start/en/hasseltbook.tex1
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/start/en/ma-cb-en-commands.texbin2135 -> 2229 bytes
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/start/en/ma-cb-en-usersetups.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/start/en/ma-cb-en.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/steps/steps-mkiv.tex4
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/still/still-backend.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/still/still-expanding.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/still/still-math.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/still/still-one.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/still/still-opentypemath.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/still/still-profiling.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/still/still-simple.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/still/still-tokens.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/still/still.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/svg/svg-lmtx-mozilla.lua144
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/svg/svg-lmtx.tex30
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/swiglib/swiglib-mkiv.tex4
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/templates/templates-mkiv.tex10
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/tiptrick/tiptrick.tex4
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/tools/tools-mkiv.tex6
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/units/units-mkiv.tex6
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/workflows/workflows-contents.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/workflows/workflows-graphics.tex32
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/workflows/workflows-hashed.tex160
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/workflows/workflows-injectors.tex4
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/workflows/workflows-introduction.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/workflows/workflows-mkiv.tex5
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/workflows/workflows-parallel.tex7
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/workflows/workflows-resources.tex24
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/workflows/workflows-running.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/workflows/workflows-setups.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/workflows/workflows-style.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/workflows/workflows-suspects.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/workflows/workflows-synctex.tex39
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/workflows/workflows-titlepage.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/workflows/workflows-xml.tex14
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/xml/xml-mkiv-03.xml11
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/xml/xml-mkiv-commands.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/xml/xml-mkiv-contents.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/xml/xml-mkiv-converter.tex4
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/xml/xml-mkiv-examples.tex8
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/xml/xml-mkiv-expressions.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/xml/xml-mkiv-filtering.tex18
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/xml/xml-mkiv-introduction.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/xml/xml-mkiv-lookups.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/xml/xml-mkiv-lpath.tex207
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/xml/xml-mkiv-style.tex11
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/xml/xml-mkiv-titlepage.tex32
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/xml/xml-mkiv-tricks.tex2
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/xml/xml-mkiv.tex4
-rw-r--r--Master/texmf-dist/doc/context/sources/general/manuals/xtables/xtables-mkiv.tex13
-rw-r--r--Master/texmf-dist/doc/context/third/context-notes-zh-cn/README12
-rw-r--r--Master/texmf-dist/doc/context/third/context-notes-zh-cn/ctxnotes.pdfbin738337 -> 0 bytes
-rw-r--r--Master/texmf-dist/doc/context/third/context-notes-zh-cn/src/Makefile22
-rw-r--r--Master/texmf-dist/doc/context/third/context-notes-zh-cn/src/basis.tex242
-rw-r--r--Master/texmf-dist/doc/context/third/context-notes-zh-cn/src/bibl-lyr.tex77
-rw-r--r--Master/texmf-dist/doc/context/third/context-notes-zh-cn/src/bibliography.bib53
-rw-r--r--Master/texmf-dist/doc/context/third/context-notes-zh-cn/src/ctxnotes.tex88
-rw-r--r--Master/texmf-dist/doc/context/third/context-notes-zh-cn/src/doc-env.tex153
-rw-r--r--Master/texmf-dist/doc/context/third/context-notes-zh-cn/src/figures/bookmark.pngbin33739 -> 0 bytes
-rw-r--r--Master/texmf-dist/doc/context/third/context-notes-zh-cn/src/figures/cow.pdfbin5526 -> 0 bytes
-rw-r--r--Master/texmf-dist/doc/context/third/context-notes-zh-cn/src/figures/gardeninglion.jpgbin59719 -> 0 bytes
-rw-r--r--Master/texmf-dist/doc/context/third/context-notes-zh-cn/src/figures/header.pngbin30981 -> 0 bytes
-rw-r--r--Master/texmf-dist/doc/context/third/context-notes-zh-cn/src/fonts.tex219
-rw-r--r--Master/texmf-dist/doc/context/third/context-notes-zh-cn/src/layout.tex233
-rw-r--r--Master/texmf-dist/doc/context/third/context-notes-zh-cn/src/metafun.tex463
-rw-r--r--Master/texmf-dist/doc/context/third/context-notes-zh-cn/src/project.tex67
-rw-r--r--Master/texmf-dist/doc/context/third/context-notes-zh-cn/src/references.tex362
-rw-r--r--Master/texmf-dist/doc/context/third/context-notes-zh-cn/src/t-layout.tex411
-rw-r--r--Master/texmf-dist/doc/context/third/context-notes-zh-cn/src/t-zhfonts.lua272
-rw-r--r--Master/texmf-dist/doc/context/third/context-notes-zh-cn/src/t-zhfonts.mkiv37
-rw-r--r--Master/texmf-dist/doc/context/third/context-notes-zh-cn/src/t-zhspuncs.lua178
-rw-r--r--Master/texmf-dist/doc/context/third/inifile/VERSION1
-rw-r--r--Master/texmf-dist/doc/context/third/inifile/inifile-demo.pdfbin8844 -> 0 bytes
-rw-r--r--Master/texmf-dist/doc/context/third/inifile/inifile-doc.pdfbin79148 -> 0 bytes
771 files changed, 31393 insertions, 25851 deletions
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 8485f05c7c3..18c57f654c6 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/canbedone-periods.pdf b/Master/texmf-dist/doc/context/documents/general/manuals/canbedone-periods.pdf
new file mode 100644
index 00000000000..0a292735d4f
--- /dev/null
+++ b/Master/texmf-dist/doc/context/documents/general/manuals/canbedone-periods.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/context/documents/general/manuals/charts-mkiv.pdf b/Master/texmf-dist/doc/context/documents/general/manuals/charts-mkiv.pdf
index 1a0289aa567..775cdab5d4a 100644
--- a/Master/texmf-dist/doc/context/documents/general/manuals/charts-mkiv.pdf
+++ b/Master/texmf-dist/doc/context/documents/general/manuals/charts-mkiv.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/context/documents/general/manuals/cld-mkiv.pdf b/Master/texmf-dist/doc/context/documents/general/manuals/cld-mkiv.pdf
index f0825379372..bb92f9aff0f 100644
--- a/Master/texmf-dist/doc/context/documents/general/manuals/cld-mkiv.pdf
+++ b/Master/texmf-dist/doc/context/documents/general/manuals/cld-mkiv.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/context/documents/general/manuals/colors-mkiv.pdf b/Master/texmf-dist/doc/context/documents/general/manuals/colors-mkiv.pdf
index f211288d9e1..e52eed2f05d 100644
--- a/Master/texmf-dist/doc/context/documents/general/manuals/colors-mkiv.pdf
+++ b/Master/texmf-dist/doc/context/documents/general/manuals/colors-mkiv.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/context/documents/general/manuals/columnsets.pdf b/Master/texmf-dist/doc/context/documents/general/manuals/columnsets.pdf
index e0be48ec50d..b426cf98dbf 100644
--- a/Master/texmf-dist/doc/context/documents/general/manuals/columnsets.pdf
+++ b/Master/texmf-dist/doc/context/documents/general/manuals/columnsets.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
index 4c2f2729167..4d55b772da7 100644
--- a/Master/texmf-dist/doc/context/documents/general/manuals/followingup.pdf
+++ b/Master/texmf-dist/doc/context/documents/general/manuals/followingup.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/context/documents/general/manuals/languages-mkiv.pdf b/Master/texmf-dist/doc/context/documents/general/manuals/languages-mkiv.pdf
index 026acfca5ed..6212bfc4751 100644
--- a/Master/texmf-dist/doc/context/documents/general/manuals/languages-mkiv.pdf
+++ b/Master/texmf-dist/doc/context/documents/general/manuals/languages-mkiv.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/context/documents/general/manuals/lowlevel-alignments.pdf b/Master/texmf-dist/doc/context/documents/general/manuals/lowlevel-alignments.pdf
new file mode 100644
index 00000000000..86b9a60b1c7
--- /dev/null
+++ b/Master/texmf-dist/doc/context/documents/general/manuals/lowlevel-alignments.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
index 0ee0f66a16e..028519623df 100644
--- a/Master/texmf-dist/doc/context/documents/general/manuals/lowlevel-boxes.pdf
+++ 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-characters.pdf b/Master/texmf-dist/doc/context/documents/general/manuals/lowlevel-characters.pdf
index e3e13063056..13867666baa 100644
--- a/Master/texmf-dist/doc/context/documents/general/manuals/lowlevel-characters.pdf
+++ b/Master/texmf-dist/doc/context/documents/general/manuals/lowlevel-characters.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
index 6de0090b3d3..251ccc758e1 100644
--- a/Master/texmf-dist/doc/context/documents/general/manuals/lowlevel-conditionals.pdf
+++ 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
index 8628f48962a..d9f2528bc43 100644
--- a/Master/texmf-dist/doc/context/documents/general/manuals/lowlevel-expansion.pdf
+++ 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-grouping.pdf b/Master/texmf-dist/doc/context/documents/general/manuals/lowlevel-grouping.pdf
index a8d103236c8..316edda6711 100644
--- a/Master/texmf-dist/doc/context/documents/general/manuals/lowlevel-grouping.pdf
+++ b/Master/texmf-dist/doc/context/documents/general/manuals/lowlevel-grouping.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/context/documents/general/manuals/lowlevel-inserts.pdf b/Master/texmf-dist/doc/context/documents/general/manuals/lowlevel-inserts.pdf
new file mode 100644
index 00000000000..d305899c16b
--- /dev/null
+++ b/Master/texmf-dist/doc/context/documents/general/manuals/lowlevel-inserts.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/context/documents/general/manuals/lowlevel-loops.pdf b/Master/texmf-dist/doc/context/documents/general/manuals/lowlevel-loops.pdf
new file mode 100644
index 00000000000..83620457c1c
--- /dev/null
+++ b/Master/texmf-dist/doc/context/documents/general/manuals/lowlevel-loops.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/context/documents/general/manuals/lowlevel-macros.pdf b/Master/texmf-dist/doc/context/documents/general/manuals/lowlevel-macros.pdf
index 63689f1c82f..5b3bcae1423 100644
--- a/Master/texmf-dist/doc/context/documents/general/manuals/lowlevel-macros.pdf
+++ b/Master/texmf-dist/doc/context/documents/general/manuals/lowlevel-macros.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/context/documents/general/manuals/lowlevel-marks.pdf b/Master/texmf-dist/doc/context/documents/general/manuals/lowlevel-marks.pdf
new file mode 100644
index 00000000000..a00a7f2aecf
--- /dev/null
+++ b/Master/texmf-dist/doc/context/documents/general/manuals/lowlevel-marks.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/context/documents/general/manuals/lowlevel-paragraphs.pdf b/Master/texmf-dist/doc/context/documents/general/manuals/lowlevel-paragraphs.pdf
index bde7fda146e..9115642ad05 100644
--- a/Master/texmf-dist/doc/context/documents/general/manuals/lowlevel-paragraphs.pdf
+++ b/Master/texmf-dist/doc/context/documents/general/manuals/lowlevel-paragraphs.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
index d00daa0cc43..5c5400ec640 100644
--- a/Master/texmf-dist/doc/context/documents/general/manuals/lowlevel-registers.pdf
+++ 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/lowlevel-scope.pdf b/Master/texmf-dist/doc/context/documents/general/manuals/lowlevel-scope.pdf
index 0a17a314c1b..d5b62839686 100644
--- a/Master/texmf-dist/doc/context/documents/general/manuals/lowlevel-scope.pdf
+++ b/Master/texmf-dist/doc/context/documents/general/manuals/lowlevel-scope.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/context/documents/general/manuals/lowlevel-security.pdf b/Master/texmf-dist/doc/context/documents/general/manuals/lowlevel-security.pdf
index b92f00ce3c0..d4c7d871c24 100644
--- a/Master/texmf-dist/doc/context/documents/general/manuals/lowlevel-security.pdf
+++ b/Master/texmf-dist/doc/context/documents/general/manuals/lowlevel-security.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/context/documents/general/manuals/lowlevel.pdf b/Master/texmf-dist/doc/context/documents/general/manuals/lowlevel.pdf
new file mode 100644
index 00000000000..8290f2118d6
--- /dev/null
+++ b/Master/texmf-dist/doc/context/documents/general/manuals/lowlevel.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
index 25c37bdcb30..79456a46dc9 100644
--- a/Master/texmf-dist/doc/context/documents/general/manuals/luametafun.pdf
+++ 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
index 5c2e3aea1f2..a6c0d6c4202 100644
--- a/Master/texmf-dist/doc/context/documents/general/manuals/luametatex.pdf
+++ 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 eed48236a58..7bd85bca6b1 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/math-mkiv.pdf b/Master/texmf-dist/doc/context/documents/general/manuals/math-mkiv.pdf
index 292c49527e6..432c6794132 100644
--- a/Master/texmf-dist/doc/context/documents/general/manuals/math-mkiv.pdf
+++ b/Master/texmf-dist/doc/context/documents/general/manuals/math-mkiv.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/context/documents/general/manuals/math-tweaks.pdf b/Master/texmf-dist/doc/context/documents/general/manuals/math-tweaks.pdf
new file mode 100644
index 00000000000..a6e3e57fd4e
--- /dev/null
+++ b/Master/texmf-dist/doc/context/documents/general/manuals/math-tweaks.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 26b421a03e7..69197240f0b 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/notnow.pdf b/Master/texmf-dist/doc/context/documents/general/manuals/notnow.pdf
index e597a48bd80..f809c093a92 100644
--- a/Master/texmf-dist/doc/context/documents/general/manuals/notnow.pdf
+++ b/Master/texmf-dist/doc/context/documents/general/manuals/notnow.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/context/documents/general/manuals/onandon.pdf b/Master/texmf-dist/doc/context/documents/general/manuals/onandon.pdf
index add04436705..e9c6930b587 100644
--- a/Master/texmf-dist/doc/context/documents/general/manuals/onandon.pdf
+++ b/Master/texmf-dist/doc/context/documents/general/manuals/onandon.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/context/documents/general/manuals/ontarget.pdf b/Master/texmf-dist/doc/context/documents/general/manuals/ontarget.pdf
new file mode 100644
index 00000000000..c8c3fe85458
--- /dev/null
+++ b/Master/texmf-dist/doc/context/documents/general/manuals/ontarget.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/context/documents/general/manuals/primitives.pdf b/Master/texmf-dist/doc/context/documents/general/manuals/primitives.pdf
index 9d6fe7670d3..c465be6cb58 100644
--- a/Master/texmf-dist/doc/context/documents/general/manuals/primitives.pdf
+++ b/Master/texmf-dist/doc/context/documents/general/manuals/primitives.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/context/documents/general/manuals/rules-mkiv.pdf b/Master/texmf-dist/doc/context/documents/general/manuals/rules-mkiv.pdf
index dee2a4607dc..d5b33fd28f7 100644
--- a/Master/texmf-dist/doc/context/documents/general/manuals/rules-mkiv.pdf
+++ b/Master/texmf-dist/doc/context/documents/general/manuals/rules-mkiv.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/context/documents/general/manuals/spacing-mkiv.pdf b/Master/texmf-dist/doc/context/documents/general/manuals/spacing-mkiv.pdf
index fde9d6c70ab..102fa58a6a5 100644
--- a/Master/texmf-dist/doc/context/documents/general/manuals/spacing-mkiv.pdf
+++ b/Master/texmf-dist/doc/context/documents/general/manuals/spacing-mkiv.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/context/documents/general/manuals/templates-mkiv.pdf b/Master/texmf-dist/doc/context/documents/general/manuals/templates-mkiv.pdf
index 47a0d70a669..15aa4f900c5 100644
--- a/Master/texmf-dist/doc/context/documents/general/manuals/templates-mkiv.pdf
+++ b/Master/texmf-dist/doc/context/documents/general/manuals/templates-mkiv.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 b63ecd05460..2c3f169baad 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 bd538c2153a..8e9af41a604 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/manuals/xtables-mkiv.pdf b/Master/texmf-dist/doc/context/documents/general/manuals/xtables-mkiv.pdf
index 255a730b8e6..d877a44fdd5 100644
--- a/Master/texmf-dist/doc/context/documents/general/manuals/xtables-mkiv.pdf
+++ b/Master/texmf-dist/doc/context/documents/general/manuals/xtables-mkiv.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 4d97df581d4..0da977ac590 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 552b8f5eb86..ee5d4853c99 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 9812f4e2cee..3a591a59333 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 b9aafe70eb9..2c0b57b9287 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-de.pdf b/Master/texmf-dist/doc/context/documents/general/qrcs/setup-mapping-de.pdf
index fafb7c17527..0cdae12ff26 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 505b8fcd26b..9a9f8ae7104 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 b04e5f50f04..272ec4b153f 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 d383904838f..c81c8a05b14 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 c8a6554476b..d5728f047ae 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-nl.pdf b/Master/texmf-dist/doc/context/documents/general/qrcs/setup-nl.pdf
index 336a7e35858..af3e99f3f89 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/presentations/bachotex/2010/bachotex-2010-clash.tex b/Master/texmf-dist/doc/context/presentations/bachotex/2010/bachotex-2010-clash.tex
index bda1934e91e..6b30ff083a8 100644
--- a/Master/texmf-dist/doc/context/presentations/bachotex/2010/bachotex-2010-clash.tex
+++ b/Master/texmf-dist/doc/context/presentations/bachotex/2010/bachotex-2010-clash.tex
@@ -1,6 +1,7 @@
% \enablemode[paper]
\usemodule[present-stepwise,present-wobbling,abr-02]
+% \usemodule[present-wobbling,abr-02]
\setuppapersize[S6][S6] \setupbodyfont[10pt] \def\METAPOST{MetaPost}
diff --git a/Master/texmf-dist/doc/context/presentations/context/2020/context-2020-concepts.pdf b/Master/texmf-dist/doc/context/presentations/context/2020/context-2020-concepts.pdf
index 913db5ef32b..ca6014f391e 100644
--- a/Master/texmf-dist/doc/context/presentations/context/2020/context-2020-concepts.pdf
+++ b/Master/texmf-dist/doc/context/presentations/context/2020/context-2020-concepts.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/context/presentations/context/2020/context-2020-concepts.tex b/Master/texmf-dist/doc/context/presentations/context/2020/context-2020-concepts.tex
index a472a33f462..23bdba43283 100644
--- a/Master/texmf-dist/doc/context/presentations/context/2020/context-2020-concepts.tex
+++ b/Master/texmf-dist/doc/context/presentations/context/2020/context-2020-concepts.tex
@@ -2,6 +2,11 @@
\usemodule[present-boring,abbreviations-logos]
+% This was a talk about a preliminary mechanism so it has been adapted to run in
+% the current version. I need to check other 2020 files and examples and will do
+% that when I update (especially the low level) manuals. Let me know when there
+% are issues.
+
\startdocument
[title={CONCEPTS},
banner={experiments turned features},
@@ -110,6 +115,10 @@ $\whatevera a = (-2) \quad \whateverb a = (-2)$ \par
\typebuffer \startpacked \getbuffer \stoppacked
+{\em We can now also enable and disable specific features in the engine that
+control traditional or \OPENTYPE\ approaches. This is only there for experimental
+and educational purposes.}
+
\stoptitle
\starttitle[title=Macros]
@@ -163,6 +172,9 @@ Special behaviour:
#3<-3
\stoptyping
+{\em There are more specifiers and I admit that they are hard to remember. But
+they are mostly used in low level macros anyway.}
+
\page
Optional tokens (we also show some \TEX-expansion-horror here):
@@ -184,6 +196,9 @@ Optional tokens (we also show some \TEX-expansion-horror here):
or as tokens (\type{\showluatokens\doifelseinset}) on the next page:
+{\em There are some expansion related extensions that are discussed in the low
+level expansion manual.}
+
\page
\starttyping
@@ -248,7 +263,7 @@ As in:
Hyphenation at work:
-\startlinecorrection[line]
+\startlinecorrection[line] \small
\startcombination[distance=3cm,nx=6]
{\vtop{\hsize 2mm \strut NEDERLANDS\vskip.5\lineheight}} {\type{NEDERLANDS}}
{\vtop{\hsize 2mm \strut Nederlands\vskip.5\lineheight}} {\type{Nederlands}}
@@ -360,6 +375,9 @@ nederlands\discretionary options 3 {!}{!}{!}nederlands
At some point it will become \quote {frozen} functionality and that's when it gets
documented (first we need to integrate and play a bit more with it in \CONTEXT).
+{\em There is now a plugin mechanism that provides more control over language
+specific hyphenation, e.g.\ compound words combined with ligatures.}
+
\stoptitle
\starttitle[title=Local control]
@@ -449,9 +467,12 @@ And a teaser:
\starttyping
\protected\def\widthofcontent#1{\beginlocalcontrol
- \setbox\scratchbox\hbox{#1}\endlocalcontrol \wd\scratchbox}
+ \setbox\scratchbox\hbox{#1}\endlocalcontrol \wd\scratchbox}
\stoptyping
+{\em These mechanisms can have surprising side effects due to input stacking.
+There is some more info in the low level expansion manual.}
+
\stoptitle
\starttitle[title=Conditionals]
@@ -544,6 +565,10 @@ v: \setbox0\hbox{uncopy \footnote{v: unhcopy}}\setbox2\vbox{\unhcopy0}\box2\par
% \setprelistbox0\hbox{BEFORE} \setpostlistbox0\hbox{AFTER}
% \box0
+{\em Everything insert related will always have side effects. It's complicated
+by the fact that the page flow interferes with expectations of where notes
+break cq.\ end up.}
+
\stoptitle
\starttitle[title=Normalizing lines]
@@ -559,16 +584,16 @@ We can have predictable lines:
Standard (but already with left skips):
\start
- \bitwiseflip \normalizelinemode -\indentskipmodecode
- \bitwiseflip \normalizelinemode -\normalizelinemodecode
+ \bitwiseflip \normalizelinemode -\parindentskipnormalizecode
+ \bitwiseflip \normalizelinemode -\normalizelinenormalizecode
\showmakeup \relax \getbuffer
\stop
Normalized (enhanced, no shifts, indent skip):
\start
- \bitwiseflip \normalizelinemode \indentskipmodecode
- \bitwiseflip \normalizelinemode \normalizelinemodecode
+ \bitwiseflip \normalizelinemode \parindentskipnormalizecode
+ \bitwiseflip \normalizelinemode \normalizelinenormalizecode
\showmakeup \relax \getbuffer
\stop
@@ -583,36 +608,51 @@ Normalized (enhanced, no shifts, indent skip):
Standard:
\start
- \bitwiseflip \normalizelinemode -\indentskipmodecode
- \bitwiseflip \normalizelinemode -\normalizelinemodecode
+ \bitwiseflip \normalizelinemode -\parindentskipnormalizecode
+ \bitwiseflip \normalizelinemode -\normalizelinenormalizecode
\showmakeup \relax \getbuffer
\stop
Normalized:
\start
- \bitwiseflip \normalizelinemode \indentskipmodecode
- \bitwiseflip \normalizelinemode \normalizelinemodecode
+ \bitwiseflip \normalizelinemode \parindentskipnormalizecode
+ \bitwiseflip \normalizelinemode \normalizelinenormalizecode
\showmakeup \relax \getbuffer
\stop
% {\showmakeup \getbuffer}
+{\em There might be some more normalization in the future in other subsystems of
+the engine. One should be aware of this when manipulating node lists after they
+come out such subsystems.}
+
\stoptitle
\starttitle[title=Freezing paragraph properties]
-\startbuffer
-\forgetparagraphfreezing \placefigure[left]{}{} {\bf Andrew Cuomo:} \input cuomo
+\startbuffer[sample]
+\startplacefigure[location=left,number=no] \externalfigure[halslegacy.jpg][width=30pt] \stopplacefigure
+
+{\bf David Stork:} \samplefile{stork}
\stopbuffer
-\typebuffer[style=\tt\small] \start \switchtobodyfont[8pt] \getbuffer \par \stop
+\startbuffer[demo]
+\forgetparagraphfreezing \getbuffer[sample]
+\stopbuffer
-\startbuffer
-\setparagraphfreezing \placefigure[left]{}{} {\bf Andrew Cuomo:} \input cuomo
+\typebuffer[demo][style=\tt\small] \start \switchtobodyfont[6pt] \getbuffer[demo] \par \stop
+
+\startbuffer[demo]
+\setparagraphfreezing \getbuffer[sample]
\stopbuffer
-\typebuffer[style=\tt\small] \start \switchtobodyfont[8pt] \getbuffer \par \stop
+\typebuffer[demo][style=\tt\small] \start \switchtobodyfont[6pt] \getbuffer[demo] \par \stop
+
+Sample: \typebuffer[sample][style=\tt\small\small]
+
+{\em This feature will stepwise be applied to mechanism and might have side effects when
+users have their own hacks around \TEX's limitations (and side effects).}
\stoptitle
@@ -689,6 +729,9 @@ Example 2:
\startcolumns \startpacked \getbuffer \stoppacked \stopcolumns
+{\em These are just weird examples, but you can expect more interesting features to
+show up. Beware of stacking because order matters.}
+
\stoptitle
\stopdocument
diff --git a/Master/texmf-dist/doc/context/presentations/context/2020/context-2020-datatypes.pdf b/Master/texmf-dist/doc/context/presentations/context/2020/context-2020-datatypes.pdf
index 906b1fe04d2..f7f7bd8b9e9 100644
--- a/Master/texmf-dist/doc/context/presentations/context/2020/context-2020-datatypes.pdf
+++ b/Master/texmf-dist/doc/context/presentations/context/2020/context-2020-datatypes.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/context/presentations/context/2020/context-2020-implementers.pdf b/Master/texmf-dist/doc/context/presentations/context/2020/context-2020-implementers.pdf
index 94c51513802..b7f7f7bb0d3 100644
--- a/Master/texmf-dist/doc/context/presentations/context/2020/context-2020-implementers.pdf
+++ b/Master/texmf-dist/doc/context/presentations/context/2020/context-2020-implementers.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/context/presentations/context/2020/context-2020-luametatex.tex b/Master/texmf-dist/doc/context/presentations/context/2020/context-2020-luametatex.tex
index 10b57660ea9..ae2b72713c6 100644
--- a/Master/texmf-dist/doc/context/presentations/context/2020/context-2020-luametatex.tex
+++ b/Master/texmf-dist/doc/context/presentations/context/2020/context-2020-luametatex.tex
@@ -526,4 +526,6 @@ documents that come with the distribution.
\stopitemize
+\stoptitle
+
\stopdocument
diff --git a/Master/texmf-dist/doc/context/presentations/context/2020/context-2020-tokens.pdf b/Master/texmf-dist/doc/context/presentations/context/2020/context-2020-tokens.pdf
index c508d25ac24..7233c46113b 100644
--- a/Master/texmf-dist/doc/context/presentations/context/2020/context-2020-tokens.pdf
+++ b/Master/texmf-dist/doc/context/presentations/context/2020/context-2020-tokens.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/context/presentations/context/2020/context-2020-tokens.tex b/Master/texmf-dist/doc/context/presentations/context/2020/context-2020-tokens.tex
index b987e2d107a..d648efb56d8 100644
--- a/Master/texmf-dist/doc/context/presentations/context/2020/context-2020-tokens.tex
+++ b/Master/texmf-dist/doc/context/presentations/context/2020/context-2020-tokens.tex
@@ -40,6 +40,8 @@
\stopitemize
+\stoptitle
+
\starttitle[title=Some implementation details]
\startitemize
@@ -127,7 +129,7 @@ Token memory:
\eTABLE
\stoplinecorrection
-\stoptable
+\stoptitle
\starttitle[title=The hash table (simplified)]
@@ -170,9 +172,9 @@ Equivalents (registers direct, macros indirect i.e.\ token lists):
\starttitle[title=Other data management]
\startitemize
-\startitem Grouping is handles by a nesting stack. \stopitem
+\startitem Grouping is handled by a nesting stack. \stopitem
\startitem Nested conditionals (\type {\if...}) have their own stack. \stopitem
-\startitem The values before assignments are saved ion the save stack. \stopitem
+\startitem The values before assignments are saved on the save stack. \stopitem
\startitem Also other local changes (housekeeping) ends up in the save stack. \stopitem
\startitem Token lists and macro aliases have references pointers (reuse). \stopitem
\startitem Attributes, being linked node lists, have their own management. \stopitem
@@ -190,7 +192,7 @@ Equivalents (registers direct, macros indirect i.e.\ token lists):
\stoptitle
-\starttitle[title=Example 1: in the input]
+\starttitle[title=Example 2: in the input]
\startbuffer
\luatokentable{a \the\scratchcounter b \the\parindent \hbox to 10pt{x}}
@@ -200,7 +202,7 @@ Equivalents (registers direct, macros indirect i.e.\ token lists):
\stoptitle
-\starttitle[title=Example 2: user registers]
+\starttitle[title=Example 3: user registers]
\startbuffer
\scratchtoks{foo \framed{\red 123}456}
@@ -212,7 +214,7 @@ Equivalents (registers direct, macros indirect i.e.\ token lists):
\stoptitle
-\starttitle[title=Example 3: internal variables]
+\starttitle[title=Example 4: internal variables]
\startbuffer
\luatokentable\everypar
@@ -222,7 +224,7 @@ Equivalents (registers direct, macros indirect i.e.\ token lists):
\stoptitle
-\starttitle[title=Example 4: macro definitions]
+\starttitle[title=Example 5: macro definitions]
\startbuffer
\protected\def\whatever#1[#2](#3)\relax{oeps #1 and #2 & #3 done ## error}
@@ -234,7 +236,7 @@ Equivalents (registers direct, macros indirect i.e.\ token lists):
\stoptitle
-\starttitle[title=Example 5: commands]
+\starttitle[title=Example 6: commands]
\startbuffer
\luatokentable\startitemize
@@ -244,7 +246,7 @@ Equivalents (registers direct, macros indirect i.e.\ token lists):
\stoptitle
-\starttitle[title=Example 6: commands]
+\starttitle[title=Example 7: commands]
\startbuffer
\luatokentable\doifelse
@@ -254,7 +256,7 @@ Equivalents (registers direct, macros indirect i.e.\ token lists):
\stoptitle
-\starttitle[title=Example 7: nothing]
+\starttitle[title=Example 8: nothing]
\startbuffer
\luatokentable\relax
@@ -264,7 +266,7 @@ Equivalents (registers direct, macros indirect i.e.\ token lists):
\stoptitle
-\starttitle[title=Example 8: Hashes]
+\starttitle[title=Example 9: hashes]
\startbuffer
\edef\foo#1#2{(#1)(\letterhash)(#2)} \luatokentable\foo
@@ -274,7 +276,7 @@ Equivalents (registers direct, macros indirect i.e.\ token lists):
\stoptitle
-\starttitle[title=Example 9: Nesting]
+\starttitle[title=Example 10: nesting]
\startbuffer
\def\foo#1{\def\foo##1{(#1)(##1)}} \luatokentable\foo
diff --git a/Master/texmf-dist/doc/context/presentations/context/2021/context-2021-compactfonts.pdf b/Master/texmf-dist/doc/context/presentations/context/2021/context-2021-compactfonts.pdf
new file mode 100644
index 00000000000..fb3f448ba00
--- /dev/null
+++ b/Master/texmf-dist/doc/context/presentations/context/2021/context-2021-compactfonts.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/context/presentations/context/2021/context-2021-compactfonts.tex b/Master/texmf-dist/doc/context/presentations/context/2021/context-2021-compactfonts.tex
new file mode 100644
index 00000000000..7d2d3e4828b
--- /dev/null
+++ b/Master/texmf-dist/doc/context/presentations/context/2021/context-2021-compactfonts.tex
@@ -0,0 +1,609 @@
+% language=us
+
+\usemodule[present-boring,abbreviations-logos]
+
+
+\definehighlight[nb][style=bold,color=middlegray,define=no]
+
+\definecolor[maincolor][g=.3]
+
+\startdocument
+ [title={COMPACT FONTS},
+ banner={a different approach to scaling},
+ location={context\enspace {\bf 2021}\enspace meeting}]
+
+\starttitle[title=How \TEX\ uses fonts]
+
+\startitemize
+ \startitem
+ In a \TEX\ engine there is a 1-to-1 mapping from characters in the input
+ to a slot in a font.
+ \stopitem
+ \startitem
+ Combinations of characters can be mapped onto one shape: ligatures.
+ \stopitem
+ \startitem
+ Hyphenation is (also) controlled by the input encoding of a font which
+ imposes some limitations.
+ \stopitem
+ \startitem
+ In the typeset result characters (glyphs) can be (re)positioned relatively: kerns.
+ \stopitem
+ \startitem
+ This all happens in a very interwoven way (e.g. inside the par builder).
+ \stopitem
+\stopitemize
+
+\stoptitle
+
+\starttitle[title=How traditional \TEX\ sees fonts]
+
+\startitemize
+ \startitem
+ A font is just a (binary) blob of data with information where characters
+ have a width, height, depth and italic correction.
+ \stopitem
+ \startitem
+ The engine only needs the dimensions and when the same font is used with a
+ different scale a copy with scaled dimensions is used.
+ \stopitem
+ \startitem
+ There can be recipes for ligatures and (more complex) so called math extensible
+ shapes (like arrows, wide accents, fences and radicals)
+ \stopitem
+ \startitem
+ There are pairwise specification for kerning.
+ \stopitem
+ \startitem
+ A handful of font parameters is provided in order to control for instance spacing.
+ \stopitem
+ \startitem
+ Virtual fonts are just normal fonts but they have recipes for the backend to
+ construct shapes: \TEX\ uses the normal metric file, the backend also the virtual
+ specification file.
+ \stopitem
+\stopitemize
+
+\blank[2*big]
+
+An example of a definition and usage:
+
+\starttyping
+\font\cs somename [somescale] test {\cs test} test
+\stoptyping
+
+\stoptitle
+
+\starttitle[title=\UNICODE\ engines]
+
+\startitemize
+ \startitem
+ There are no fundamental differences between a traditional engine and an
+ \UNICODE\ aware one with respect to what \TEX\ needs from fonts:
+ dimensions.
+ \stopitem
+ \startitem
+ There can be more than 256 characters in a font.
+ \stopitem
+ \startitem
+ Some mechanisms have to be present for applying font features (like ligaturing and
+ kerning).
+ \stopitem
+ \startitem
+ In \LUATEX\ hyphenation, ligaturing and kerning are clearly separate steps.
+ \stopitem
+ \startitem
+ In \LUATEX\ callbacks can do lots of things with fonts and characters.
+ \stopitem
+ \startitem
+ Math fonts are handled differently and there is more info that comes from the font.
+ \stopitem
+ \startitem
+ In \LUATEX\ features like expansion are implemented differently, i.e.\ no
+ copies of fonts are made and applied expansion travels with the glyphs.
+ \stopitem
+\stopitemize
+
+\stoptitle
+
+\starttitle[title=Overhead]
+
+\startitemize
+ \startitem
+ In all engines scales copies are used. For traditional \TEX\ a copy is cheap, but a
+ font that supports more of \UNICODE\ cna be quite large.
+ \stopitem
+ \startitem
+ Different feature sets in principle make for a different font (this can be different
+ per macro package).
+ \stopitem
+ \startitem
+ Every math scale needs three font instances: text, script and scriptscript.
+ \stopitem
+ \startitem
+ In \CONTEXT\ lots of sharing takes place and a lot of low level
+ optimizations happens (memory, performance). We always made sure (already
+ in \MKII) that the font system was not the bottleneck.
+ \stopitem
+ \startitem
+ In most cases font definitions are dynamic, and we delay initialization
+ as much as possible.
+ \stopitem
+ \startitem
+ In \MKIV\ font features can be dynamic which saves a lot of memory at the
+ cost of some extra processing overhead.
+ \stopitem
+\stopitemize
+
+\stoptitle
+
+\starttitle[title=Design sizes]
+
+\startitemize
+ \startitem
+ A macro package's font handling is complicated by design sizes. The low level
+ code can look complex too.
+ \stopitem
+ \startitem
+ There are hardly any fonts that come in design sizes (basically only Computer
+ Modern) so we need to support that.
+ \stopitem
+ \startitem
+ Design sizes make sense for math fonts where very small characters and
+ symbols are used in scripts.
+ \stopitem
+ \startitem
+ In \OPENTYPE\ fonts smaller math design sizes are part of the font (that
+ then gets loaded three times with different \type {ssty} settings).
+ \stopitem
+\stopitemize
+
+\startlinecorrection
+\dontleavehmode\scale[frame=on,height=5ex]{$\textstyle 2$}\quad
+\dontleavehmode\scale[frame=on,height=5ex]{$\scriptstyle 2$}\quad
+\dontleavehmode\scale[frame=on,height=5ex]{$\scriptscriptstyle 2$}\quad\quad
+\dontleavehmode\scale[frame=on,height=2ex]{$\textstyle 2$}\quad
+\dontleavehmode\scale[frame=on,height=2ex]{$\scriptstyle 2$}\quad
+\dontleavehmode\scale[frame=on,height=2ex]{$\scriptscriptstyle 2$}\quad\quad
+\dontleavehmode\scale[frame=on,width=4em]{\colored[r=.6,a=1,t=.5]{$\textstyle 2$}}\hskip-4em
+\dontleavehmode\scale[frame=on,width=4em]{\colored[g=.6,a=1,t=.5]{$\scriptstyle 2$}}\hskip-4em
+\dontleavehmode\scale[frame=on,width=4em]{\colored[b=.6,a=1,t=.5]{$\scriptscriptstyle 2$}}\quad\quad
+\dontleavehmode{$\textstyle 2$}\quad
+\dontleavehmode{$\scriptstyle 2$}\quad
+\dontleavehmode{$\scriptscriptstyle 2$}\quad
+\stoplinecorrection
+
+\stoptitle
+
+\starttitle[title=The system]
+
+\startitemize
+ \startitem
+ Each bodyfont size (often a few are defined) has regular, bold, italic,
+ bold italic, slanted, bold slanted, etc. There can be unscaled instances
+ (design size) or scaled ones.
+ \stopitem
+ \startitem
+ Within a bodyfont size we have size variants: smaller {\tx x} and {\tx xx},
+ larger {\tfa a}, {\tfb b}, {\tfc c} and {\tfd d}.
+ \stopitem
+ \startitem
+ In \MKII\ we inherit smallcap and oldstyle setups but in \MKIV\ one can either
+ do that dynamic or define an additional bodyfont instance.
+ \stopitem
+ \startitem
+ A document can use a mix of fonts mixed setup, so there is a namespace
+ used per family.
+ \stopitem
+ \startitem
+ In \OPENTYPE\ symbols are more naturally part of a font, as are emoji and
+ colored shapes.
+ \stopitem
+ \startitem
+ Lack of variants can result in artificially slanted of boldened fonts (more
+ advanced in \MKIV). Variable fonts are not special, but demand some work
+ when loading and embedding.
+ \stopitem
+ \startitem
+ Runtime virtual fonts are part of \MKIV\ as are fallback shapes.
+ \stopitem
+ \startitem
+ Languages and scripts can introduce an extra dimension to operate on.
+ \stopitem
+ \startitem
+ Math is greatly simplified by the fact that families are part of a font.
+ \stopitem
+ \startitem
+ Bold math fonts are provided by the boldening feature.
+ \stopitem
+\stopitemize
+
+\stoptitle
+
+\starttitle[title={Practice}]
+
+\startitemize
+ \startitem
+ Due to optimizations the actual number of loaded instances is normally
+ small but there are exceptions.
+ \stopitem
+ \startitem
+ The \LUAMETATEX\ manual has 158 instances most of which are math (six per
+ used bodyfont for math plus a regular: Lucida, Pagella, Latin Modern,
+ Dejavu, Cambria).
+ \stopitem
+ \startitem
+ The final \PDF\ file has 21 embedded fonts (subsets).
+ \stopitem
+ \startitem
+ The fact that different sizes each have an instance and that for math
+ we need three per size plus one for r2l, while the only difference
+ is scale, makes one think of other solutions.
+ \stopitem
+ \startitem
+ Using duplicates of huge \CJK\ fonts makes it even more noticeable.
+ \stopitem
+\stopitemize
+
+But there is a way out!
+
+\stoptitle
+
+\starttitle[title=Glyph scaling]
+
+We can scale glyphs in three ways:
+
+\startbuffer
+\definedfont[lmroman10-regular*default]%
+test {\glyphxscale 2500 test} test
+test {\glyphyscale 2500 test} test
+test {\glyphscale 2500 test} test
+\stopbuffer
+
+\typebuffer {\getbuffer}
+
+We do need to honor grouping:
+
+\startbuffer
+\definedfont[lmroman10-regular*default]%
+e{\glyphxscale 2500 ff}icient
+ef{\glyphxscale 2500 f}icient
+ef{\glyphxscale 2500 fi}cient
+e{\glyphxscale 2500 ffi}cient
+\stopbuffer
+
+\typebuffer {\getbuffer}
+
+These scales can also be part of a font definition so we can do with less
+instances.
+
+\stoptitle
+
+\starttitle[title=Implications]
+
+\startitemize
+ \startitem
+ The text processing part of the engine has to scale on the fly (e.g.\
+ when dimensions are needed in paragraph building and (box) packing.
+ \stopitem
+ \startitem
+ Font processing (features) already distinguishes per instance but now also
+ has to differentiate by (upto three) scales (we use the same font id
+ for scaled instances).
+ \stopitem
+ \startitem
+ The math machinery has to check for smaller sizes and also scale
+ dimensions on the fly.
+ \stopitem
+ \startitem
+ For math that means two times scaling: the main scale (like glyph scale) plus
+ the relative scaling of script and scriptscript.
+ \stopitem
+ \startitem
+ When they are used font dimensions and math parameters are to be scaled as are
+ rules in some math extensibles.
+ \stopitem
+ \startitem
+ This all has to be done efficiently so that there is no significant drop in
+ performance.
+ \stopitem
+ \startitem
+ But quite a bit less memory is used and loading time has become less too.
+ \stopitem
+\stopitemize
+
+Some day this will become default (which means a sentimental process of dropping
+ancient code):
+
+\starttyping
+\enableexperiments[fonts.compact]
+\stoptyping
+
+\stoptitle
+
+\starttitle[title=Details]
+
+The tricks shown on this page and following pages have been in place and tested
+for a while now. Because \TEX\ uses integers a scale value of 1000 means 1.000,
+as in other mechanisms:
+
+\startbuffer
+\definedfont[lmroman10-regular*default]%
+test {\glyphscale 2500 test} test
+\stopbuffer
+
+\typebuffer {\getbuffer}
+
+% \glyphtextscale
+% \glyphscriptscale
+% \glyphscriptscriptscale
+
+\page
+
+The font definition mechanism supports horizontal and vertical scaling:
+
+\startbuffer
+\definefont[FooA][Serif*default @ 12pt 1800 500]
+\definefont[FooB][Serif*default @ 12pt 0.85 0.4]
+\definefont[FooC][Serif*default @ 12pt]
+
+There is also a new command:
+
+\definetweakedfont[runwider] [xscale=1.5]
+\definetweakedfont[runtaller][yscale=2.5,xscale=.8,yoffset=-.2ex]
+
+{\FooA test test \runwider test test \runtaller test test}\par
+{\FooB test test \runwider test test \runtaller test test}\par
+{\FooC test test \runwider test test \runtaller test test}\par
+\stopbuffer
+
+\typebuffer
+
+\getbuffer
+
+\page
+
+Tweaking also works in math:
+
+\startbuffer
+\definetweakedfont[squeezed][xscale=0.9]
+\definetweakedfont[squoozed][xscale=0.7]
+
+\startlines
+$a = b^2 + \sqrt{c}$
+{\squeezed $a = b^2 + \sqrt{c}$}
+{\squoozed $a = b^2 + \sqrt{c}$}
+{$\squoozed a = b^2 + \sqrt{c}$}
+{$\scriptstyle a = b^2 + \sqrt{c}$}
+\stoplines
+\stopbuffer
+
+\typebuffer
+
+\getbuffer
+
+\page
+
+\startbuffer
+\startcombination[3*1]
+ {\bTABLE
+ \bTR \bTD foo \eTD \bTD[style=\squeezed] $x = 1$ \eTD \eTR
+ \bTR \bTD oof \eTD \bTD[style=\squeezed] $x = 2$ \eTD \eTR
+ \eTABLE} {local}
+ {\bTABLE[style=\squeezed]
+ \bTR \bTD $x = 1$ \eTD \bTD $x = 3$ \eTD \eTR
+ \bTR \bTD $x = 2$ \eTD \bTD $x = 4$ \eTD \eTR
+ \eTABLE} {global}
+ {\bTABLE[style=\squeezed\squeezed\squeezed\squeezed]
+ \bTR \bTD $x = 1$ \eTD \bTD $x = 3$ \eTD \eTR
+ \bTR \bTD $x = 2$ \eTD \bTD $x = 4$ \eTD \eTR
+ \eTABLE} {multiple}
+\stopcombination
+\stopbuffer
+
+\typebuffer
+
+\startlinecorrection
+\getbuffer
+\stoplinecorrection
+
+\page
+
+Tweaking can be combined with styles:
+
+\startbuffer
+\definetweakedfont[MyLargerFontA][scale=2000,style=bold]
+test {\MyLargerFontA test} test
+\stopbuffer
+
+\typebuffer
+
+\getbuffer
+
+\page
+
+We can use negative scale values:
+
+\startbuffer
+\bTABLE[align=middle]
+ \bTR
+ \bTD a{\glyphxscale 1000 \glyphyscale 1000 bc}d \eTD
+ \bTD a{\glyphxscale 1000 \glyphyscale -1000 bc}d \eTD
+ \bTD a{\glyphxscale -1000 \glyphyscale -1000 bc}d \eTD
+ \bTD a{\glyphxscale -1000 \glyphyscale 1000 bc}d \eTD
+ \eTR
+ \bTR
+ \bTD \tttf +1000 +1000 \eTD
+ \bTD \tttf +1000 -1000 \eTD
+ \bTD \tttf -1000 -1000 \eTD
+ \bTD \tttf -1000 +1000 \eTD
+ \eTR
+\eTABLE
+\stopbuffer
+
+\typebuffer
+
+\startlinecorrection
+\getbuffer
+\stoplinecorrection
+
+\page
+
+There are more glyph properties:
+
+\startbuffer
+\ruledhbox{
+ \ruledhbox{\glyph yoffset 1ex options 0 123} % left curly brace
+ \ruledhbox{\glyph xoffset .5em yoffset 1ex options "C0 123}
+ \ruledhbox{oeps{\glyphyoffset 1ex \glyphxscale 800
+ \glyphyscale\glyphxscale oeps}oeps}
+}
+\stopbuffer
+
+\typebuffer \scale[width=\textwidth]{\getbuffer}
+
+\page
+
+Glyph scales are internal counter values, like any other:
+
+\startbuffer
+\samplefile{jojomayer}
+{\glyphyoffset .8ex
+ \glyphxscale 700 \glyphyscale\glyphxscale
+ \samplefile{jojomayer}}
+{\glyphyscale\numexpr3*\glyphxscale/2\relax
+ \samplefile{jojomayer}}
+{\glyphyoffset -.2ex
+ \glyphxscale 500 \glyphyscale\glyphxscale
+ \samplefile{jojomayer}}
+\samplefile{jojomayer}
+\stopbuffer
+
+\typebuffer
+
+\getbuffer
+
+\page
+
+There is a helper for real (float) scales:
+
+\startbuffer
+1200 : \the\numericscale1200
+1.20 : \the\numericscale1.200
+\stopbuffer
+
+\typebuffer
+
+These lines produce the same integer:
+
+\startlines\tttf
+\getbuffer
+\stoplines
+
+\page
+
+You can do this but it's not always predictable (depends on outer scales too):
+
+\startbuffer[definition]
+\def\UnKernedTeX
+ {T%
+ {\glyph xoffset -.2ex yoffset -.4ex `E}%
+ {\glyph xoffset -.4ex options "60 `X}}
+\stopbuffer
+
+\startbuffer[example]
+We use \UnKernedTeX\ and {\bf \UnKernedTeX} and {\bs \UnKernedTeX}:
+the slanted version could use some more left shifting of the E.
+\stopbuffer
+
+\typebuffer[definition,example]
+
+\startnarrower
+ \getbuffer[definition,example]
+\stopnarrower
+
+Marks and cursive features can interfere, so this is an alternative:
+
+\startbuffer[definition]
+\def\UnKernedTeX
+ {T\glyph left .2ex raise -.4ex `E\glyph left .2ex `X\relax}
+\stopbuffer
+
+\typebuffer[definition]
+
+\startnarrower
+ \getbuffer[definition,example]
+\stopnarrower
+
+\page
+
+Yet another glyph option:
+
+\starttyping
+\multiply\glyphscale by 2 <{\darkgray \glyph `M}>
+\multiply\glyphscale by 2 <{\darkgray \glyph raise 3pt `M}>
+\multiply\glyphscale by 2 <{\darkgray \glyph raise -3pt `M}>
+\multiply\glyphscale by 2 <{\darkgray \glyph left 3pt `M}>
+\multiply\glyphscale by 2 <{\darkgray \glyph right 2pt `M}>
+\multiply\glyphscale by 2 <{\darkgray \glyph left 3pt right 2pt `M}>
+\multiply\glyphscale by 2 <{\darkgray \glyph left -3pt `M}>
+\multiply\glyphscale by 2 <{\darkgray \glyph right -2pt `M}>
+\multiply\glyphscale by 2 <{\darkgray \glyph left -3pt right -2pt `M}>
+\stoptyping
+
+\startlinecorrection
+\bTABLE[align=middle,width=.33\textwidth]
+ \bTR
+ \bTD \showglyphs \multiply\glyphscale by 2 <{\darkgray \glyph `M}>\eTD
+ \bTD \showglyphs \multiply\glyphscale by 2 <{\darkgray \glyph raise 3pt `M}>\eTD
+ \bTD \showglyphs \multiply\glyphscale by 2 <{\darkgray \glyph raise -3pt `M}>\eTD
+ \eTR
+ \bTR[frame=off]
+ \bTD \tttf \eTD
+ \bTD \tttf raise 3pt \eTD
+ \bTD \tttf raise -3pt \eTD
+ \eTR
+ \bTR
+ \bTD \showglyphs \multiply\glyphscale by 2 <{\darkgray \glyph left 3pt `M}>\eTD
+ \bTD \showglyphs \multiply\glyphscale by 2 <{\darkgray \glyph right 2pt `M}>\eTD
+ \bTD \showglyphs \multiply\glyphscale by 2 <{\darkgray \glyph left 3pt right 2pt `M}>\eTD
+ \eTR
+ \bTR[frame=off]
+ \bTD \tttf left 3pt \eTD
+ \bTD \tttf right 2pt\eTD
+ \bTD \tttf left 3pt right 2pt\eTD
+ \eTR
+ \bTR
+ \bTD \showglyphs \multiply\glyphscale by 2 <{\darkgray \glyph left -3pt `M}>\eTD
+ \bTD \showglyphs \multiply\glyphscale by 2 <{\darkgray \glyph right -2pt `M}>\eTD
+ \bTD \showglyphs \multiply\glyphscale by 2 <{\darkgray \glyph left -3pt right -2pt `M}>\eTD
+ \eTR
+ \bTR[frame=off]
+ \bTD \tttf left -3pt \eTD
+ \bTD \tttf right -2pt \eTD
+ \bTD \tttf left -3pt right -2pt \eTD
+ \eTR
+\eTABLE
+\stoplinecorrection
+
+\page
+
+A larger example:
+
+\startbuffer
+\glyphscale 4000
+\vl\glyph `M\vl\quad
+\vl\glyph raise .2em `M\vl\quad
+\vl\glyph left .3em `M\vl\quad
+\vl\glyph right .2em`M\vl\quad
+\vl\glyph left -.2em right -.2em`M\vl\quad
+\vl\glyph raise -.2em right .4em`M\vl
+\stopbuffer
+
+\typebuffer
+
+{\getbuffer}
+
+\stoptitle
+
+\stopdocument
diff --git a/Master/texmf-dist/doc/context/presentations/context/2021/context-2021-localcontrol.pdf b/Master/texmf-dist/doc/context/presentations/context/2021/context-2021-localcontrol.pdf
new file mode 100644
index 00000000000..f9f96aa412f
--- /dev/null
+++ b/Master/texmf-dist/doc/context/presentations/context/2021/context-2021-localcontrol.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/context/presentations/context/2021/context-2021-localcontrol.tex b/Master/texmf-dist/doc/context/presentations/context/2021/context-2021-localcontrol.tex
new file mode 100644
index 00000000000..72c1114be9f
--- /dev/null
+++ b/Master/texmf-dist/doc/context/presentations/context/2021/context-2021-localcontrol.tex
@@ -0,0 +1,369 @@
+% language=us
+
+% TAKE FROM LOWLEVEL-EXPANSION.TEX
+
+\usemodule[system-tokens]
+
+\usemodule[present-boring,abbreviations-logos]
+
+\definehighlight[nb][style=bold,color=middlegray,define=no]
+
+\startdocument
+ [title={PROGRAMMING},
+ banner={local control},
+ location={context\enspace {\bf 2021}\enspace meeting}]
+
+\starttitle[title=Expansion]
+
+\TEX\ can be in several so called input reading modes:
+
+Users mostly see it reading from the source file(s). Characters are picked up and
+interpreted. Depending on what token it becomes some action takes place.
+
+\starttyping
+1 \setbox0\hbox to 10pt{2} \count0=3 \the\count0 \multiply\count0 by 4
+\stoptyping
+
+\startitemize
+
+\startitem
+ The \type {1} gets typeset because characters like that are seen as text.
+\stopitem
+
+\startitem
+ The \type {\setbox} primitive triggers picking up a register number, then
+ goes on scanning for a box specification and that itself will typeset a
+ sequence of whatever until the group ends.
+\stopitem
+
+\startitem
+ The \type {count} primitive triggers scanning for a register number (or
+ reference) and then scans for a number; the equal sign is optional.
+\stopitem
+
+\startitem
+ The \type {the} primitive injects some value into the current input stream
+ (it does so by entering a new input level).
+\stopitem
+
+\startitem
+ The \type {multiply} primitive picks up a register specification and
+ multiplies that by the next scanned number. The \type {by} is optional.
+\stopitem
+
+\startitem
+ Printing from \LUA\ and scanning tokens with e.g.\ \type {\scantokens} is like
+ reading (pseudo) files.
+\stopitem
+
+\stopitemize
+
+\stoptitle
+
+\starttitle[title=Expansion]
+
+\startbuffer[def]
+\def\TestA {1 \setbox0\hbox{2} \count0=3 \the\count0}
+\stopbuffer
+
+\startbuffer[edef]
+\edef\TestB{1 \setbox0\hbox{2} \count0=3 \the\count0}
+\stopbuffer
+
+\typebuffer[def]
+\typebuffer[edef]
+
+\getbuffer[def]
+\getbuffer[edef]
+
+\blank[2*big]
+
+\startcolumns[n=2] \switchtobodyfont[8pt]
+\luatokentable\TestA
+\column
+\luatokentable\TestB
+\stopcolumns
+
+\stoptitle
+
+\starttitle[title=Local control]
+
+\startbuffer[edef]
+\edef\TestB{1 \setbox0\hbox{2} \count0=3 \the\count0}
+\stopbuffer
+
+\startbuffer[ldef]
+\edef\TestC{1 \setbox0\hbox{2} \localcontrolled{\count0=3} \the\count0}
+\stopbuffer
+
+\typebuffer[edef]
+\typebuffer[ldef]
+
+\getbuffer[edef]
+\getbuffer[ldef]
+
+\blank[2*big]
+
+\startcolumns[n=2] \switchtobodyfont[8pt]
+\luatokentable\TestB
+\column
+\luatokentable\TestC
+\stopcolumns
+
+\stoptitle
+
+\starttitle[title=Side effects]
+
+\startbuffer[edef]
+\edef\TestB{1 \setbox0\hbox{2} \count0=3 \the\count0}
+\stopbuffer
+
+\startbuffer[ldef]
+\edef\TestD{\localcontrolled{1 \setbox0\hbox{2} \count0=3 \the\count0}}
+\stopbuffer
+
+\typebuffer[edef]
+\typebuffer[ldef]
+
+\getbuffer[edef]\getbuffer[ldef]\quad{\darkgray\leftarrow\space Watch how the results end up here!}
+
+\blank[2*big]
+
+\startcolumns[n=2] \switchtobodyfont[8pt]
+\luatokentable\TestB
+\column
+\luatokentable\TestD
+\stopcolumns
+
+\stoptitle
+
+\starttitle[title=Usage]
+
+\startbuffer[def]
+\def\WidthOf#1%
+ {\beginlocalcontrol
+ \setbox0\hbox{#1}%
+ \endlocalcontrol
+ \wd0 }
+\stopbuffer
+
+\startbuffer[use]
+\scratchdimen\WidthOf{The Rite Of Spring}
+
+\the\scratchdimen
+\stopbuffer
+
+\typebuffer[def]
+\typebuffer[use]
+
+\getbuffer[def]\getbuffer[use]
+
+\stoptitle
+
+\starttitle[title=Not always pretty]
+
+\startbuffer[def]
+\def\WidthOf#1%
+ {\dimexpr
+ \beginlocalcontrol
+ \begingroup
+ \setbox0\hbox{#1}%
+ \expandafter
+ \endgroup
+ \expandafter
+ \endlocalcontrol
+ \the\wd0
+ \relax}
+\stopbuffer
+
+\startbuffer[use]
+\scratchdimen\WidthOf{The Rite Of Spring}
+
+\the\scratchdimen
+\stopbuffer
+
+\typebuffer[def]
+\typebuffer[use]
+
+\getbuffer[def]\getbuffer[use]
+
+\stoptitle
+
+\starttitle[title=The \LUA\ end]
+
+Right from the start the way to get something into \TEX\ from \LUA\ has been the
+print functions. But we can also go local (immediate). There are several methods:
+
+\startitemize
+\startitem via a set token register \stopitem
+\startitem via a defined macro \stopitem
+\startitem via a string \stopitem
+\stopitemize
+
+Among the things to keep in mind are catcodes, scope and expansion (especially in
+when the result itself ends up in macros).
+
+\stoptitle
+
+\starttitle[title=Via a token register]
+
+% runlocal : macro|toks expand group
+
+\startbuffer[set]
+\toks0={\setbox0\hbox{The Rite Of Spring (Igor Stravinsky)}}
+\toks2={\setbox0\hbox{The Rite Of Spring (Joe Parrish)}}
+\stopbuffer
+
+\typebuffer[set]
+
+\startbuffer[run]
+\startluacode
+tex.runlocal(0) context("[1: %p]",tex.box[0].width)
+tex.runlocal(2) context("[2: %p]",tex.box[0].width)
+\stopluacode
+\stopbuffer
+
+\typebuffer[run]
+
+\start \getbuffer[set,run] \stop
+
+\stoptitle
+
+\starttitle[title=Via a token macro]
+
+\startbuffer[set]
+\def\TestA{\setbox0\hbox{The Rite Of Spring (Igor Stravinsky)}}
+\def\TestB{\setbox0\hbox{The Rite Of Spring (Joe Parrish)}}
+\stopbuffer
+
+\typebuffer[set]
+
+\startbuffer[run]
+\startluacode
+tex.runlocal("TestA") context("[3: %p]",tex.box[0].width)
+tex.runlocal("TestB") context("[4: %p]",tex.box[0].width)
+\stopluacode
+\stopbuffer
+
+\typebuffer[run]
+
+\start \getbuffer[set,run] \stop
+
+\stoptitle
+
+\starttitle[title=Via a string]
+
+\startbuffer[run]
+\startluacode
+tex.runstring([[\setbox0\hbox{The Rite Of Spring (Igor Stravinsky)}]])
+
+context("[5: %p]",tex.box[0].width)
+
+tex.runstring([[\setbox0\hbox{The Rite Of Spring (Joe Parrish)}]])
+
+context("[6: %p]",tex.box[0].width)
+\stopluacode
+\stopbuffer
+
+\typebuffer[run]
+
+\start \getbuffer[run] \stop
+
+\blank[2*big]
+
+A bit more high level:
+
+\starttyping
+context.runstring([[\setbox0\hbox{(Here \bf 1.2345)}]])
+context.runstring([[\setbox0\hbox{(Here \bf %.3f)}]],1.2345)
+\stoptyping
+
+\stoptitle
+
+\starttitle[title=Locked in \LUA]
+
+\startbuffer[run]
+\startluacode
+token.setmacro("TestX",[[\setbox0\hbox{The Rite Of Spring (Igor)}]])
+tex.runlocal("TestX")
+context("[7: %p]",tex.box[0].width)
+\stopluacode
+\stopbuffer
+
+\typebuffer[run]
+
+\start \getbuffer[run] \stop
+
+\startbuffer[run]
+\startluacode
+tex.scantoks(0,tex.ctxcatcodes,[[\setbox0\hbox{The Rite Of Spring (Joe)}]])
+tex.runlocal(0)
+context("[8: %p]",tex.box[0].width)
+\stopluacode
+\stopbuffer
+
+\typebuffer[run]
+
+\start \getbuffer[run] \stop
+
+\stoptitle
+
+\starttitle[title=Order matters]
+
+A lot this relates to pushing stuff into the input which is stacked. Compare:
+
+\startbuffer[run]
+\startluacode
+context("[HERE 1]")
+context("[HERE 2]")
+\stopluacode
+\stopbuffer
+
+\typebuffer[run]
+
+\start \getbuffer[run] \stop
+
+with this:
+
+\startbuffer[run]
+\startluacode
+tex.pushlocal() context("[HERE 1]") tex.poplocal()
+tex.pushlocal() context("[HERE 2]") tex.poplocal()
+\stopluacode
+\stopbuffer
+
+\typebuffer[run]
+
+\start \getbuffer[run] \stop
+
+% \startluacode
+% tex.runlocal(function() context("[Here 1]") end)
+% context("[Here 12]")
+% tex.runlocal(function() context("[Here 2]") end)
+% \stopluacode
+
+% tex.pushlocal % swaps order
+% tex.poplocal
+% tex.quitlocal
+
+% token.expandmacro
+
+% str : serialized
+% true : wrap next {}
+% table : {serialzed} {serialzed} {serialzed}
+% token : inject
+% number: catcode table
+
+% tex.expandasvalue:
+% (kind, like expand_macro)
+
+% tex.runstring:
+% [catcode] string expand grouped
+
+% tex.runlocal
+% function|number(register)|string(macro)|userdata(token) / expand / grouped
+
+% mplib.expandtex
+% mpx, kind, macro, arguments
+
+\stopdocument
diff --git a/Master/texmf-dist/doc/context/presentations/context/2021/context-2021-luametafun.pdf b/Master/texmf-dist/doc/context/presentations/context/2021/context-2021-luametafun.pdf
new file mode 100644
index 00000000000..25c7b95a4bf
--- /dev/null
+++ b/Master/texmf-dist/doc/context/presentations/context/2021/context-2021-luametafun.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/context/presentations/context/2021/context-2021-luametafun.tex b/Master/texmf-dist/doc/context/presentations/context/2021/context-2021-luametafun.tex
new file mode 100644
index 00000000000..333c6868216
--- /dev/null
+++ b/Master/texmf-dist/doc/context/presentations/context/2021/context-2021-luametafun.tex
@@ -0,0 +1,362 @@
+% language=us
+
+\usemodule[present-boring,abbreviations-logos]
+
+\setuptolerance[verytolerant,stretch]
+
+\startdocument
+ [title={LUAMETAFUN},
+ banner={the new interfaces},
+ location={context\enspace {\bf 2021}\enspace meeting}]
+
+\starttitle[title=Three subsystems]
+
+\startitemize
+
+\startitem
+ The core of the engine in still \TEX. It all starts there.
+\stopitem
+
+\startitem
+ The \TEX\ internals are opened up via \LUA. We can call out to \LUA\ from
+ \TEX\ and to some extend from \LUA\ to \TEX. Quite often we push back
+ something via the input channels.
+\stopitem
+
+\startitem
+ The \METAPOST\ library is accessed from \LUA. So from within \TEX\ there is
+ always \LUA\ in between. Results go back via \LUA. The library can also call
+ out to \LUA\ and from there to \TEX.
+\stopitem
+
+\startitem
+ This means that all three major components of \LUAMETATEX\ can talk to each
+ other and use each others capabilities.
+\stopitem
+
+\startitem
+ With \LUA\ in the center, we also have access to other mechanism, for instance
+ fonts, graphics and libraries.
+\stopitem
+
+\startitem
+ In \CONTEXT\ the \LUA\ language also permits using \XML, \JSON, \CSV, \SQL\
+ databases and other input that can be dealt with programmatically.
+\stopitem
+
+\startitem
+ All has been reasonably optimized for efficiency and performance.
+\stopitem
+
+\stopitemize
+
+\stoptitle
+
+\starttitle[title=The (\LUATEX) library]
+
+\startitemize
+
+\startitem
+ Turning \METAPOST\ into a library has been a subproject of the \LUATEX\ project. The
+ semi|-|official team (Taco, Jacko, Hans, Luigi) got John Hobbies blessing.
+\stopitem
+
+\startitem
+ This was a rather massive (and impressive) operation by Taco because multiple
+ number models were to be supported and the internals had to be made such that
+ different backends were possible. All with remaining perfect (DEK) compatibility.
+\stopitem
+
+\startitem
+ The \METAPOST\ library serves both the stand alone program and \LUATEX.
+\stopitem
+
+\startitem
+ That means the \POSTSCRIPT\ backend is built in plus some basic (\TYPEONE)
+ font handling. We support \PDF\ output via the \METAPOST\ \LUA\ backend (in
+ \MKII\ that is done by parsing the \POSTSCRIPT\ and specials).
+\stopitem
+
+\startitem
+ In addition there is \PNG\ and \SVG\ output. It helps that \METAPOST\ output is
+ rather simple.
+\stopitem
+
+\startitem
+ The \LUATEX\ engine uses the \LUA\ backend which represents the result in \LUA\ tables
+ resembling the \METAPOST\ internal representation.
+\stopitem
+
+\startitem
+ The library supports scaled and double (internal) but also binary and decimal
+ number models that use (linked in) libraries.
+\stopitem
+
+% this would force a page
+%
+% \startitem
+% The library is quite stable and Taco transferred maintenance to Luigi.
+% \stopitem
+
+\stopitemize
+
+\stoptitle
+
+\starttitle[title=The (\LUAMETATEX) library]
+
+\startitemize
+
+\startitem
+ We don't need the \POSTSCRIPT\ backend (which only does \TYPEONE\ anyway).
+\stopitem
+
+\startitem
+ We also have no use for \SVG\ and \PNG\ output.
+\stopitem
+
+\startitem
+ The binary number model has no advantages over the decimal one but brings
+ quite some dependency with it (library code).
+\stopitem
+
+\startitem
+ The \TYPEONE\ font support is not used in \CONTEXT\ because we handle text
+ differently.
+\stopitem
+
+\startitem
+ All this means that we can do with a smaller (simplified) \METAPOST\ library.
+\stopitem
+
+\startitem
+ The codebase has been overhauled. We still have \type {.w} files (\CWEB) but
+ use a \LUA\ script to convert that to \CCODE\ which means that we have better
+ control over how it comes out.
+\stopitem
+
+\startitem
+ As with \LUATEX\ the file \IO, message handling etc.\ now largely goes via \LUA;
+ it is more integrated.
+\stopitem
+
+\startitem
+ The same is true for scanning interfaces and return values (injectors). That also
+ made for more symbolic coding.
+\stopitem
+
+\startitem
+ Memory management (allocation) is under engine control (as with \TEX\ and \LUA);
+ we use a common high performance allocator library.
+\stopitem
+
+\stopitemize
+
+\stoptitle
+
+\starttitle[title=The (\LUAMETATEX) library]
+
+\startitemize
+
+\startitem
+ Some already present mechanism have been extended, for instance clips have
+ pre- and postscripts.
+\stopitem
+
+\startitem
+ A grouping wrapper has been added (handy for some graphic trickery supported in the
+ backend.)
+\stopitem
+
+\startitem
+ The \type {runscript} primitive supports symbolic references to functions (of course to
+ be provided at the \LUA\ end).
+\stopitem
+
+\startitem
+ The \type {runscript} return values can be more native, in addition to the already
+ present (default) \type {scantokens} support.
+\stopitem
+
+\startitem
+ Internals are extended with booleans and strings.
+\stopitem
+
+\startitem
+ Output (paths, clips etc) can be stacked in a different order.
+\stopitem
+
+\startitem
+ There are additional statistics available.
+\stopitem
+
+\startitem
+ In some places performance could be improved.
+\stopitem
+
+\startitem
+ In the meantime it can be considered a major upgrade and (for various
+ reasons) backporting to \LUATEX\ makes no sense. And yes, all errors are
+ mine.
+\stopitem
+
+\stopitemize
+
+\starttitle[title=The \LUA fication]
+
+ {\em See Taco's presentation where he gives some examples.}
+
+\stoptitle
+
+\starttitle[title=Callbacks]
+
+We need to hook in some functions: \blank[2*big]
+
+\starttabulate[|T|T|T|p|]
+ \HL
+ \NC \NC find_file \NC (name,mode,kind) \NC locate a file (usually within the \TDS\ setup) \NC \NR
+ \NC f \NC open_file \NC (name,mode,kind) \NC open given file \NC \NR
+ \NC \NC close_file \NC (handle) \NC close opened file \NC \NR
+ \NC s \NC read_file \NC (handle,size) \NC read from file \NC \NR
+ \NC \NC write_file \NC (handle,str) \NC write to file \NC \NR
+ \HL
+ \NC s \NC run_script \NC (code,size,index) \NC run the given string as \LUA\ script \NC \NR
+ \NC s \NC make_text \NC (str,size,mode) \NC process btex/etex \NC \NR
+ \HL
+ \NC \NC run_internal \NC (action,index,kind,name) \NC act on internal definition \NC \NR
+ \HL
+ \NC n \NC run_overload \NC (property,name,mode) \NC process overload check \NC \NR
+ \HL
+ \NC \NC run_logger \NC (target,str,size) \NC process log message \NC \NR
+ \NC \NC run_error \NC (message,help,interaction) \NC handle error (message) \NC \NR
+ \NC \NC run_warning \NC (message) \NC handle warning \NC \NR
+ \HL
+\stoptabulate
+
+% check_overload shipout_backend
+
+\stoptitle
+
+\starttitle[title=Two calling methods]
+
+The runner can be called as:
+
+\starttyping
+runscript("mp.MyFunction()")
+\stoptyping
+
+which implies at the \LUA\ end:
+
+\starttyping
+function mp.MyFunction()
+ ...
+end
+\stoptyping
+
+Here the callback function is responsible for loading the string and executing it.
+
+Alternatively one can say:
+
+\starttyping
+runscript <number>
+\stoptyping
+
+The number can be intercepted at the \LUA\ end to do some associated action.
+
+\stoptitle
+
+\starttitle[title=Variables]
+
+We can do:
+
+\starttyping
+lua.mp.MyFunction("foo",123,true)
+\stoptyping
+
+which in the end is equivalent to:
+
+\starttyping
+runscript("mp.MyFunction('foo',123,true)")
+\stoptyping
+
+Alternatively one can pick up values by scanning: like \type {scannext}, \type
+{scanexpression}, \type {scantoken}, \type {scansymbol}, \type {scannumeric},
+\type {scaninteger}, \type {scanboolean}, \type {scanstring}, \type {scanpair},
+\type {scancolor}, \type {scancmykcolor}, \type {scantransform}, \type
+{scanpath}, \type {scanpen}, etc.
+
+\stoptitle
+
+\starttitle[title=Return values]
+
+The runner can return:
+
+\startitemize
+
+\startitem
+ a string that gets fed into the \type {scantokens} primitive
+\stopitem
+
+\startitem
+ a numeric or boolean that gets injected as native \METAPOST\ object
+\stopitem
+
+\startitem
+ a table that gets concatenated and fed into the \type {scantokens} primitive
+\stopitem
+
+\startitem
+ \type {true} and a second argument that gets converted into a native \METAPOST\ object
+\stopitem
+
+\startitem
+ in the last case the number of table elements determines the object
+\stopitem
+
+\stopitemize
+
+Instead of returning a value one can inject: \type {injectnumeric}, \type
+{injectinteger}, \type {injectboolean}, \type {injectstring}, \type {injectpair},
+\type {injectcolor}, \type {injectcmykcolor}, \type {injecttransform}, \type
+{injectpath}, \type {injectwhatever}, etc.\ and these accept one or more values
+and|/|or tables.
+
+These mechanisms might evolve a bit over time. Lots of examples can be found in
+the \type {mlib-*.lmt} files.
+
+\stoptitle
+
+\starttitle[title=Parameters]
+
+\startitemize
+ \startitem
+ The new interfaces permit us to program quite robust parameter driven
+ interfaces that (sort of) match the way we do things at the \TEX\ end.
+ \stopitem
+ \startitem
+ The distribution has several examples of usage and more will be added.
+ \stopitem
+ \startitem
+ Macros that use the new mechanisms can be recognized by the \type {lmt_}
+ prefix.
+ \stopitem
+\stopitemize
+
+\starttyping
+lmt_mytrick [
+ somestring = "test",
+ somenumeric = 123,
+ someboolean = true,
+ somecolor = (1, 0, 1),
+ somepath = fullsquare scaled 10cm,
+ somelist = { (0, 0), (1, 3), (8, 9) },
+ sometable = [
+ somenumeric = 321,
+ ],
+] ;
+\stoptyping
+
+{\em Show the pattern of defining these at the \LUA\ end and in \METAPOST\ files.}
+
+\stoptitle
+
+\stopdocument
diff --git a/Master/texmf-dist/doc/context/presentations/context/2021/context-2021-math.pdf b/Master/texmf-dist/doc/context/presentations/context/2021/context-2021-math.pdf
new file mode 100644
index 00000000000..dd343899b96
--- /dev/null
+++ b/Master/texmf-dist/doc/context/presentations/context/2021/context-2021-math.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/context/presentations/context/2021/context-2021-math.tex b/Master/texmf-dist/doc/context/presentations/context/2021/context-2021-math.tex
new file mode 100644
index 00000000000..fce4ca4d51e
--- /dev/null
+++ b/Master/texmf-dist/doc/context/presentations/context/2021/context-2021-math.tex
@@ -0,0 +1,236 @@
+% language=us
+
+\usemodule[present-boring,abbreviations-logos]
+
+\definecolor[maincolor] [r=.4]
+\definecolor[extracolor][s=.1]
+
+\startdocument
+ [title={MATH},
+ banner={complete control},
+ location={context\enspace {\bf 2021}\enspace meeting}]
+
+\starttitle[title=The benchmark]
+
+\startitemize
+
+\startitem
+ Traditional \TEX\ has set the benchmark for typesetting math.
+\stopitem
+
+\startitem
+ It uses three categories of fonts: alphabet, symbol, extensible.
+\stopitem
+
+\startitem
+ Limitations in fonts have lead to some curious handling of dimensions.
+\stopitem
+
+\startitem
+ The fact that there is \type {\over} makes for multipass scanning and
+ processing.
+\stopitem
+
+\startitem
+ The last family counts (when entering the second pass) so one has to use very
+ controlled font switching.
+\stopitem
+
+\startitem
+ Some features (limits, integrals, primes) rely on special macros and parsing.
+\stopitem
+
+\startitem
+ One can end up in tricky font switching. Also, quite some fonts are loaded in
+ order to set up the machinery.
+\stopitem
+
+\stopitemize
+
+\stoptitle
+
+\starttitle[title=Todays reality]
+
+\startitemize
+
+\startitem
+ We now use \OPENTYPE\ math fonts. In fact, in \MKIV\ we always used only one
+ font instance (unless we mix font families).
+\stopitem
+
+\startitem
+ We operate in the \UNICODE\ domain, so in the end there was no need to bump the
+ number of families in \LUATEX.
+\stopitem
+
+\startitem
+ In \CONTEXT\ we use only a few font families: regular, regular r2l, bold, bold r2l.
+\stopitem
+
+\startitem
+ All the tricky stuff is done with the help of \LUA. This already started very
+ early in the \LUATEX\ project and has not changed.
+\stopitem
+
+\startitem
+ But we still run into issues because the available fonts are inconsistent,
+ incompatible, have issues and that is unlikely to change.
+\stopitem
+
+\startitem
+ We have a virtual font system in place that was used during the transition (when no
+ fonts were available).
+\stopitem
+
+\startitem
+ In \CONTEXT\ there are various ways to deal with shortcomings in or extensions to fonts.
+\stopitem
+
+\startitem
+ At some point we need to make up our minds, accept the issues with fonts, and
+ just fix things runtime.
+\stopitem
+
+\stopitemize
+
+\stoptitle
+
+\starttitle[title=The engine]
+
+\startitemize
+
+\startitem
+ In \LUATEX\ we started with a hybrid approach but eventually ended up with
+ more split code paths.
+\stopitem
+
+\startitem
+ In \LUAMETATEX\ nearly all aspects of the engine had made configurable and are under
+ user control.
+\stopitem
+
+\startitem
+ This permits experiments where we can apply old methods onto new fonts.
+\stopitem
+
+\stopitemize
+
+\stoptitle
+
+\starttitle[title=The tricky things]
+
+\startitemize
+
+\startitem
+ Spacing in traditional math is a combination of widths and italic correction:
+ we need to add them and sometimes afterwards subtract the italic correction.
+ In \OPENTYPE\ math we don't lie about dimensions and apply italic correction
+ selectively (as we have staircase kerns).
+\stopitem
+
+\startitem
+ Special symbols like primes are quite inconsistent wrt dimensions and positioning
+ and we need to catch that. We also need robust ways to collapse them to the proper
+ \UNICODE\ symbol.
+\stopitem
+
+\startitem
+ Larger variants (these \type {\bigg} things) needs some attention too.
+\stopitem
+
+\startitem
+ We need to map characters onto the right shaped (alphabets) because hardly
+ anyone will enter the \UNICODE\ math characters directly.
+\stopitem
+
+\startitem
+ We might want to fix scripts, italics, kern pairs etc.
+\stopitem
+
+\stopitemize
+
+\stoptitle
+
+\starttitle[title=Implementation]
+
+Among the new features (introduced over a period of time) are:
+
+\startitemize
+
+\startitem
+ All kind of inter|-|class spacing parameters (in addition to what \LUATEX\
+ already provides).
+\stopitem
+
+\startitem
+ Dozens of \OPENTYPE\ font related spacing parameters (more that traditional
+ \TEX).
+\stopitem
+
+\startitem
+ Opened up additional font (and taste) related parameters (hard coded in
+ traditional \TEX).
+\stopitem
+
+\startitem
+ Opened up style related parameters (hard coded in traditional \TEX).
+\stopitem
+
+\startitem
+ Control codes that make the engine follow a different (the traditional) code
+ path (which can come in handy when testing or writing manuals).
+\stopitem
+
+\startitem
+ The ability to simplify the result a bit wrt characters (the engine loves to
+ box a lot).
+\stopitem
+
+\startitem
+ Efficient font, style and parameter scaling by reusing fonts and thereby
+ limiting the number of instances.
+\stopitem
+
+\startitem
+ More options to special (constructed) symbols.
+\stopitem
+
+\startitem
+ Let math related nodes carry around more control properties and states.
+\stopitem
+
+\startitem
+ Support of local changes to math parameters.
+\stopitem
+
+\stopitemize
+
+\stoptitle
+
+\stopdocument
+
+% mml
+% vf chars for extensibles
+
+% noads.handlers.showtree
+% noads.handlers.unscript
+% noads.handlers.unstack
+% noads.handlers.variants
+% noads.handlers.relocate
+% noads.handlers.families
+% noads.handlers.render
+% noads.handlers.collapse
+% noads.handlers.fixscripts
+% noads.handlers.domains
+% noads.handlers.autofences
+% noads.handlers.resize
+% noads.handlers.respace
+% noads.handlers.alternates
+% noads.handlers.tags
+% noads.handlers.italics
+% noads.handlers.kernpairs
+% noads.handlers.classes
+
+% builders.kernel.mlisttohlist
+% noads.handlers.makeup
+% noads.handlers.align
diff --git a/Master/texmf-dist/doc/context/presentations/context/2021/context-2021-overloadprotection.pdf b/Master/texmf-dist/doc/context/presentations/context/2021/context-2021-overloadprotection.pdf
new file mode 100644
index 00000000000..c6335f32dc7
--- /dev/null
+++ b/Master/texmf-dist/doc/context/presentations/context/2021/context-2021-overloadprotection.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/context/presentations/context/2021/context-2021-overloadprotection.tex b/Master/texmf-dist/doc/context/presentations/context/2021/context-2021-overloadprotection.tex
new file mode 100644
index 00000000000..5143e855afc
--- /dev/null
+++ b/Master/texmf-dist/doc/context/presentations/context/2021/context-2021-overloadprotection.tex
@@ -0,0 +1,298 @@
+% language=us
+
+\usemodule[present-boring,abbreviations-logos]
+
+
+\definehighlight[nb][style=bold,color=middlegray,define=no]
+
+\setuptolerance[verytolerant,stretch]
+
+\definecolor[maincolor][r=.3,b=.3]
+
+\startdocument
+ [title={OVERLOAD PROTECTION},
+ banner={the downside of macros},
+ location={context\enspace {\bf 2021}\enspace meeting}]
+
+% TEX MP
+
+\starttitle[title=Primitives]
+
+A \TEX\ engine comes with a whole set of primitive operations for:
+
+\startitemize[packed]
+ \startitem
+ accessing internal variables
+ \stopitem
+ \startitem
+ defining macros
+ \stopitem
+ \startitem
+ controlling expansion
+ \stopitem
+ \startitem
+ constructing boxes
+ \stopitem
+ \startitem
+ finalizing pages
+ \stopitem
+ \startitem
+ defining characters (text and math)
+ \stopitem
+ \startitem
+ inserting kerns, glue and penalties
+ \stopitem
+ \startitem
+ defining fonts
+ \stopitem
+ \startitem
+ dealing with languages (hyphenation)
+ \stopitem
+ \startitem
+ testing properties
+ \stopitem
+ \startitem
+ manipulating tokens
+ \stopitem
+ \startitem
+ managing inserts
+ \stopitem
+ \startitem
+ handling marks
+ \stopitem
+ \startitem
+ grouping
+ \stopitem
+ \startitem
+ mathematics
+ \stopitem
+ \startitem
+ tracing
+ \stopitem
+\stopitemize
+
+\stoptitle
+
+\starttitle[title=Macros]
+
+\startitemize
+ \startitem
+ Macros are commands defined by the user and/or a macro package.
+ \stopitem
+ \startitem
+ They can overload a primitive which then can confuse the whole machinery.
+ \stopitem
+ \startitem
+ A macro package can alias primitives for instance \type {\relax} can be
+ replaced by \type {\foo_relax} after \typ {\let \foo_relax \relax}.
+ \stopitem
+ \startitem
+ That only when (at definition time) the \type {_} is a letter. By using such
+ a character some protection against overload is provided.
+ \stopitem
+ \startitem
+ In \CONTEXT\ we often use(d) aliases like \type {\normalrelax} but of course
+ these can also be overloaded.
+ \stopitem
+ \startitem
+ We only overload a very few primitives, for instance \type {\language}.
+ \stopitem
+ \startitem
+ Users who overload primitives are \quote {on their own} and \quote {without
+ support}.
+ \stopitem
+ \startitem
+ An easy way to protect yourself is using \type {\CamelCase} names.
+ \stopitem
+\stopitemize
+
+\stoptitle
+
+\starttitle[title=Overload protection]
+
+\startitemize
+ \startitem
+ The \LUAMETATEX\ engine has overload protection built in for the \TEX\ engine
+ as well as provides means to do that for \METAPOST.
+ \stopitem
+ \startitem
+ In \LMTX\ all commands have been tagged accordingly (which was quite some work).
+ \stopitem
+ \startitem
+ Processing \type {s-system-macros.mkxl} gives an overview.
+ \stopitem
+ \startitem
+ Overload protection is off by default but can be turned on:
+
+\starttyping
+\enabledirectives[overloadmode=warning]
+\enabledirectives[overloadmode=error]
+\stoptyping
+
+ \stopitem
+ \startitem
+ I myself always run with the error variant and make sure that the manuals obey
+ the rules.
+ \stopitem
+ \startitem
+ Modules and/or styles (and in a few cases the core code) can cheat and use:
+
+\starttyping
+\pushoverloadmode
+ ........................
+ ........................
+\popoverloadmode
+\stoptyping
+
+ \stopitem
+\stopitemize
+
+\stoptitle
+
+\starttitle[title=Details]
+
+\startitemize
+ \startitem
+ Traditional \TEX\ has a few so called prefixes: \type {\global}, \type {\outer},
+ \type {\long}, and type \type {\immediate}.
+ \stopitem
+ \startitem
+ The \ETEX\ engine adds \type {\protected} (because we already had that in
+ \CONTEXT\ we use what we (also already) had: \type {\unexpanded}).
+ \stopitem
+ \startitem
+ In \LUATEX\ we can force macros to be always long, something that we do
+ in \MKIV\ (as in \MKII).
+ \stopitem
+ \startitem
+ In \LUAMETATEX\ the \type {\outer} and \type {\long} prefixes have been
+ dropped (they are ignored).
+ \stopitem
+ \startitem
+ In \LUAMETATEX\ the \type {\protected} prefix acts like in other engines
+ but protection is implemented more naturally.
+ \stopitem
+ \startitem
+ In addition \LUAMETATEX\ has new prefixes: \type {\frozen}, \type
+ {\permanent}, \type {\immutable}, \type {\mutable}, \type {\noaligned},
+ \type {\instance}, \type {\untraced}, \type {\tolerant}, \type
+ {\overloaded}, \type {\aliased}, \type {\immediate} and an experimental
+ \type {\semiprotected},
+ \stopitem
+ \startitem
+ Some prefixes end up as properties of macros, some influence scanning (for instance
+ in alignments and when calling \LUA\ functions). There is no noticeable runtime
+ overhead.
+ \stopitem
+ \startitem
+ The \type {\meaningfull} primitive is like \type {\meaning} but also reports
+ properties set by prefixes; there is also \type {\meaningless}.
+ \stopitem
+\stopitemize
+
+\stoptitle
+
+\starttitle[title=Prefixes]
+
+Regular definitions:
+
+\startitemize
+ \startitem
+ \type {\global}: defines a macro or sets a register value out of scope.
+ \stopitem
+ \startitem
+ \type {\outer}: is used to issue a warning when a macro defined as such was
+ used nested (just ignored in \LUAMETATEX).
+ \stopitem
+ \startitem
+ \type {\long}: triggers a warning when an argument of a macro contains a
+ \type {\par} equivalent (just ignored in \LUAMETATEX).
+ \stopitem
+ \startitem
+ \type {\protected}: makes a macro unexpandable (being itself) in an \type
+ {\edef} equivalent situation (where it can get out of hands).
+ \stopitem
+ \startitem
+ \type {\semiprotected}: is like \type {\protected} but the property is
+ ignored when \type {\semiexpanded} is applied.
+ \stopitem
+\stopitemize
+
+Special case:
+
+\startitemize
+ \startitem
+ \type {\immediate}: tells a backend primitive to come into action
+ immediately instead of creating a delayed action (via a whatsit node). In
+ \LUAMETATEX\ we have no built|-|in backend so there is signals a \LUA\
+ interface function this property.
+ \stopitem
+\stopitemize
+
+\page
+
+Scanning related:
+
+\startitemize
+ \startitem
+ \type {\noaligned}: tags a macro as valid peek ahead macro when scanning
+ alignments; normally that only makes sense for \type {\protected} macros.
+ This permits cleaner macros in for instance table mechanisms (no
+ unexpected expansion side effects).
+ \stopitem
+ \startitem
+ \type {\untraced}: this flag makes a macro report itself as primitive in
+ traces which is sometimes nicer that presenting a user with some
+ confusing meaning.
+ \stopitem
+ \startitem
+ \type {\tolerant}: a prefix that makes the macro argument parser accept
+ all kind of new argument parsing options and continue when delimited
+ arguments fail. This makes macros with optional arguments produce less
+ noise when they are traced but more important, it makes for cleaner low
+ level interfaces.
+ \stopitem
+\stopitemize
+
+
+\page
+
+Overload protection (primitives are protected against overloads by default):
+
+\startitemize
+ \startitem
+ \type {\aliased}: create a reference (using \type {\let}) that also inherits the
+ properties.
+ \stopitem
+ \startitem
+ \type {\permanent}: sets a flag that makes a macro (or definition) immune for
+ redefinition.
+ \stopitem
+ \startitem
+ \type {\frozen}: prevents overloading but one can bypass that with some
+ more effort.
+ \stopitem
+ \startitem
+ \type {\immutable}: makes a (normally variable definition) fixed, for instance
+ constants.
+ \stopitem
+ \startitem
+ \type {\mutable}: a flag showing that this macro or definition can be used for
+ anything (so the macro package also has to assume that).
+ \stopitem
+ \startitem
+ \type {\instance}: just a flag that can be used to signal that a macro (or definition)
+ is an instance of a more general concept.
+ \stopitem
+ \startitem
+ \type {\overloaded}: bypass a frozen flag (property).
+ \stopitem
+\stopitemize
+
+\blank[2*big]
+
+{\em Show some examples in the source code and editor.}
+
+\stoptitle
+
+\stopdocument
diff --git a/Master/texmf-dist/doc/context/presentations/context/2021/context-2021-paragraphs.pdf b/Master/texmf-dist/doc/context/presentations/context/2021/context-2021-paragraphs.pdf
new file mode 100644
index 00000000000..9b32a6576ff
--- /dev/null
+++ b/Master/texmf-dist/doc/context/presentations/context/2021/context-2021-paragraphs.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/context/presentations/context/2021/context-2021-paragraphs.tex b/Master/texmf-dist/doc/context/presentations/context/2021/context-2021-paragraphs.tex
new file mode 100644
index 00000000000..7a4e566d849
--- /dev/null
+++ b/Master/texmf-dist/doc/context/presentations/context/2021/context-2021-paragraphs.tex
@@ -0,0 +1,162 @@
+% language=us
+
+\usemodule[present-boring,abbreviations-logos]
+
+\definecolor[maincolor] [r=.4,g=.4]
+\definecolor[extracolor][s=.1]
+
+\startdocument
+ [title={PARAGRAPHS},
+ banner={a bit of an upgrade},
+ location={context\enspace {\bf 2021}\enspace meeting}]
+
+\starttitle[title=Note]
+
+\startitemize
+
+\startitem
+ Some of the following already is present for a while and has been discussed
+ at previous meetings.
+\stopitem
+
+\startitem
+ But \unknown\ occasionally some minor tweak gets added so consider this to be
+ an update.
+\stopitem
+
+\stopitemize
+
+\starttitle[title=Spacing]
+
+\startitemize
+
+\startitem
+ Spaces in \TEX\ become glue nodes (with optional stretch and shrink).
+\stopitem
+
+\startitem
+ In traditional \TEX\ these glue nodes are ref counted copies of the current
+ spacing related variables.
+\stopitem
+
+\startitem
+ In \LUATEX\ we make real copies so that when we mess with the node list
+ changes to glue don't affect other instances.
+\stopitem
+
+\stopitemize
+
+\starttitle[title=Parameters]
+
+\startitemize
+
+\startitem
+ In traditional \TEX\ the paragraphs bound properties that are in effect
+ when \type {\par} happens are used when breaking into lines.
+\stopitem
+
+\startitem
+ In \LUAMETATEX\ the paragraphs bound properties are stored with the
+ paragraph and can be frozen when they are set.
+\stopitem
+
+\startitem
+ This gives a more predictable (and robust) way of manipulating a
+ paragraph.
+\stopitem
+
+\startitem
+ We can for instance get rid of grouping side effects that interfere with
+ \type {\everypar}.
+\stopitem
+
+\startitem
+ Currently three dozen parameters are tracked but they are grouped in
+ categories.
+\stopitem
+
+\blank[2*big] {\em (show code and examples)}
+
+\stopitemize
+
+\stoptitle
+
+\starttitle[title=Wrapping]
+
+\startitemize
+
+\startitem
+ Doing something in front of a paragraph is taken care of by good old
+ \type {\everypar}.
+\stopitem
+
+\startitem
+ In \LUAMETATEX\ we also have \type {\everybeforepar} but so far in \CONTEXT\
+ we haven't used that.
+\stopitem
+
+\startitem
+ Adding something to the end of a paragraph can be tricky so we have
+ a wrapper mechanism: \type {\wrapuppar}.
+\stopitem
+
+\startitem
+ The \type {\wrapuppar} primitive is similar to \type {\atendofgroup} in the
+ sense that it accumulates tokens (so no \type {\endofpar}).
+\stopitem
+
+\startitem
+ Normally these primitives are not used directly but managed by a more general
+ system of handling paragraphs.
+\stopitem
+
+\stopitemize
+
+\blank[2*big] {\em (show code and examples)}
+
+\stoptitle
+
+\starttitle[title=Normalizing]
+
+\startitemize
+
+\startitem
+ In order to see consistent paragraphs at the \LUA\ end in \LUAMETATEX\
+ we can normalize the lines that come from the paragraph builder.
+\stopitem
+
+\startitem
+ Normalization results in:
+
+ \startitemize
+ \startitem
+ the first line having: indent skip
+ \stopitem
+ \startitem
+ each line having: left hang, left skip, right skip, right hang
+ \stopitem
+ \startitem
+ the last line having: left parfill skip, right parfill skip
+ \stopitem
+ \stopitemize
+\stopitem
+
+\startitem
+ It is controlled by \type {\normalizelinemode} which has additional flags for
+ swapping hanging indentation and par shapes, breaking after dir nodes,
+ removing margin kerns and clipping the line width.
+\stopitem
+
+\startitem
+ The clipping options avoids the side effects of \TEX\ using shifts which has
+ the side effect of unreal dimensions. This is one of the tricks|/|properties
+ of the traditional engine that is perfectly fine until we open up things.
+\stopitem
+
+\stopitemize
+
+\blank[2*big] {\em (show code and examples)}
+
+\stoptitle
+
+\stopdocument
diff --git a/Master/texmf-dist/doc/context/presentations/context/2021/context-2021-programming.pdf b/Master/texmf-dist/doc/context/presentations/context/2021/context-2021-programming.pdf
new file mode 100644
index 00000000000..86f61bed9c9
--- /dev/null
+++ b/Master/texmf-dist/doc/context/presentations/context/2021/context-2021-programming.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/context/presentations/context/2021/context-2021-programming.tex b/Master/texmf-dist/doc/context/presentations/context/2021/context-2021-programming.tex
new file mode 100644
index 00000000000..907a9ebfa04
--- /dev/null
+++ b/Master/texmf-dist/doc/context/presentations/context/2021/context-2021-programming.tex
@@ -0,0 +1,325 @@
+% language=us
+
+\usemodule[present-boring,abbreviations-logos]
+
+\definehighlight[nb][style=bold,color=middlegray,define=no]
+
+\startdocument
+ [title={PROGRAMMING},
+ banner={the way \CONTEXT\ is set up},
+ location={context\enspace {\bf 2021}\enspace meeting}]
+
+\starttitle[title=Levels]
+
+When you look at \CONTEXT\ bottom|--|up (engine|--|interface) you will notice: \blank[2*big]
+
+\startnarrower
+
+\startitemize[n]
+
+\startitem
+ \highlight[nb]{primitives:} this is what the engine comes with
+\stopitem
+\startitem
+ \highlight[nb]{infrastructure:} basic management of data structures
+\stopitem
+\startitem
+ \highlight[nb]{helpers:} macros that hide complexity
+\stopitem
+\startitem
+ \highlight[nb]{subsystems:} collections of macros that implement functionality
+\stopitem
+\startitem
+ \highlight[nb]{mechanisms:} these combine various subsystems
+\stopitem
+\startitem
+ \highlight[nb]{modules:} extra functionality (uses 1--5)
+\stopitem
+\startitem
+ \highlight[nb]{styles:} handling sources and layout (uses 4--6)
+\stopitem
+
+\stopitemize
+
+\stopnarrower
+
+\blank[2*big] Users normally see \CONTEXT\ top|--|down (usage|--|hacking).
+
+\stoptitle
+
+% % %
+
+\starttitle[title=Styles]
+
+\startitemize
+
+\startitem
+ These are prebuilt solutions for common as well as rare situations.
+\stopitem
+
+\startitem
+ The system comes with some styles: the \type {s-*} files.
+\stopitem
+
+\startitem
+ Right from the start the idea was that you get some reasonable default.
+\stopitem
+
+\startitem
+ And if you want more you stepwise define your style as you go.
+\stopitem
+
+\startitem
+ It really is part of the game: exploration.
+\stopitem
+
+\startitem
+ Solving your problem is a nice challenge.
+\stopitem
+
+\startitem
+ If you want a completely predefined setup, shop somewhere else.
+\stopitem
+
+\stopitemize
+
+\stoptitle
+
+% % %
+
+\starttitle[title=Modules]
+
+\startitemize
+
+\startitem
+ A lot of functionality is built in.
+\stopitem
+
+\startitem
+ This helps to keep the system consistent.
+\stopitem
+
+\startitem
+ We could cheat and ship thousands of few|--|liner styles but don't do that.
+\stopitem
+
+\startitem
+ There are a few mechanisms that don't really fit into the core, so these are
+ implemented as modules that do fit into the interface: the \type {m-*} and
+ \type {x-*} files.
+\stopitem
+
+\startitem
+ Users can build and share their solutions which has resulted in some
+ third party modules: the \type {t-*} files.
+\stopitem
+
+\startitem
+ For (a few, often old) private files I use \type {p-*} name scheme.
+\stopitem
+
+\stopitemize
+
+\stoptitle
+
+% % %
+
+\starttitle[title=Mechanisms]
+
+\startitemize
+
+\startitem
+ These are combinations of subsystems but often they cannot really be distinguished.
+\stopitem
+
+\startitem
+ Examples are notes, that combine notations, lists, references, descriptions etc.
+\stopitem
+
+\stopitemize
+
+\stoptitle
+
+% % %
+
+\starttitle[title=Subsystems]
+
+\startitemize
+
+\startitem
+ This is what users see and can configure
+\stopitem
+
+\startitem
+ Most are (conceptually) rather old but evolved over time. There are no
+ fundamental differences between \MKIV\ and \LMTX, but the later is hopefully
+ a bit cleaner.
+\stopitem
+
+\startitem
+ Examples are fonts, languages, color, structure (sectioning, lists,
+ constructions, itemgroups, references), spacing, graphics, bibliographies,
+ positioning, numbering and layout.
+\stopitem
+
+\startitem
+ More hidden are the backend, export and \XML\ interfaces.
+\stopitem
+
+\startitem
+ Some have subsystems themselves, like widgets that relate to a specific
+ backend.
+\stopitem
+
+\startitem
+ There are often dependencies between subsystems which makes that it's not really a
+ hierarchy. A more strict separation would demand much more overhead.
+\stopitem
+
+\stopitemize
+
+\stoptitle
+
+% % %
+
+\starttitle[title=Helpers]
+
+\startitemize
+
+\startitem
+ These provide basic programming help.
+\stopitem
+
+\startitem
+ Examples are macros for comparing things, loops, list processing,
+ argument handling.
+\stopitem
+
+\startitem
+ But more abstract box manipulations also fits in here.
+\stopitem
+
+\startitem
+ Some subsystems, like \XML\ and bibliographies provide more specific low
+ level helpers.
+\stopitem
+
+\stopitemize
+
+\stoptitle
+
+% % %
+
+\starttitle[title=Infrastructure]
+
+\startitemize
+
+\startitem
+ The engine provides counters, dimension and other registers that need
+ to be managed in order to avoid clashes in usage.
+\stopitem
+
+\startitem
+ Many of the helpers, subsystems and mechanisms fall back on common rather
+ low level functions (\LUA) and macros (using primitives).
+\stopitem
+
+\stopitemize
+
+\stoptitle
+
+% % %
+
+\starttitle[title=Primitives]
+
+\startitemize
+
+\startitem
+ This is what the engine provides: the built|-|in commands and features.
+\stopitem
+
+\startitem
+ In addition to the visible primitives there are \LUA\ interfaces and these
+ permit adding extra primitives.
+\stopitem
+
+\startitem
+ In \LUAMETATEX\ we have the core \TEX\ set but a few were dropped because we
+ don't have a backend and a different \IO\ subsystem (so they have to be
+ emulated).
+\stopitem
+
+\startitem
+ We also have some of the \ETEX\ primitives and very few of the \PDFTEX\ ones
+ but I now consider for instance expansion and protrusion extensions to be
+ kind of \ETEX.
+\stopitem
+
+\startitem
+ There are additional \LUATEX\ primitives but some were dropped, again because
+ of the backend, so we emulate some, and also because some were experimental.
+\stopitem
+
+\startitem
+ There are quite some new primitives and existing mechanisms have been extended,
+ cleaned up and (hopefully) improved.
+\stopitem
+
+\stopitemize
+
+% % %
+
+\starttitle[title=The shift]
+
+\startitemize
+
+\startitem
+ There have always been complaints about \TEX\ as a language (what makes me
+ wonder why those who complain use it.)
+\stopitem
+
+\startitem
+ Although there are some extensions to the language in \ETEX, follow|-|ups have
+ not really succeeded in this area.
+\stopitem
+
+\startitem
+ At some point I decided that code in the categories 1|--|4 cold benefit from
+ extensions.
+\stopitem
+
+\startitem
+ That also meant that we use less of the low helpers. It makes the code look a
+ bit more \TEX.
+\stopitem
+
+\startitem
+ It also means less clutter, in code as well in tracing. Often the code
+ becomes simpler too.
+\stopitem
+
+\startitem
+ The idea is that \TEX\ becomes a bit more a programming language.
+\stopitem
+
+\startitem
+ Of course it takes away the \quotation {Watch me, I can do real dirty \TEX\
+ hacking!} brawling.
+\stopitem
+
+\startitem
+ It also can take away some of the complaints.
+\stopitem
+
+\startitem
+ And it definitely adds some fun.
+\stopitem
+
+\stopitemize
+
+{\em During the week we show some of the implementation (in Visual Studio) and
+examples of applications. We also write a small extension (the {\tttf dk} unit)}
+
+\stoptitle
+
+\stopdocument
diff --git a/Master/texmf-dist/doc/context/scripts/mkii/ctxtools.html b/Master/texmf-dist/doc/context/scripts/mkii/ctxtools.html
deleted file mode 100644
index 06acff7e043..00000000000
--- a/Master/texmf-dist/doc/context/scripts/mkii/ctxtools.html
+++ /dev/null
@@ -1,64 +0,0 @@
-<?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>CtxTools 1.3.5</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">CtxTools 1.3.5 </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>--touchcontextfile</th><td></td><td>update context version</td></tr>
- <tr><th>--contextversion</th><td></td><td>report context version</td></tr>
- <tr><th>--jeditinterface</th><td></td><td>generate jedit syntax files [--pipe]</td></tr>
- <tr><th>--bbeditinterface</th><td></td><td>generate bbedit syntax files [--pipe]</td></tr>
- <tr><th>--sciteinterface</th><td></td><td>generate scite syntax files [--pipe]</td></tr>
- <tr><th>--rawinterface</th><td></td><td>generate raw syntax files [--pipe]</td></tr>
- <tr><th>--translateinterface</th><td></td><td>generate interface files (xml) [nl de ..]</td></tr>
- <tr><th>--purgefiles</th><td></td><td>remove temporary files [--all --recurse] [basename]</td></tr>
- <tr><th>--documentation generate documentation [--type</th><td>]</td><td>[filename]</td></tr>
- <tr><th>--filterpages'</th><td></td><td>) # no help, hidden temporary feature</td></tr>
- <tr><th>--dpxmapfiles</th><td></td><td>convert pdftex mapfiles to dvipdfmx [--force] [texmfroot]</td></tr>
- <tr><th>--listentities</th><td></td><td>create doctype entity definition from enco-uc.tex</td></tr>
- <tr><th>--brandfiles</th><td></td><td>add context copyright notice [--force]</td></tr>
- <tr><th>--platformize</th><td></td><td>replace line-endings [--recurse --force] [pattern]</td></tr>
- <tr><th>--dependencies analyze depedencies within context [--save --compact --filter</th><td>[macros|filenames] ]</td><td>[filename]</td></tr>
- <tr><th>--updatecontext</th><td></td><td>download latest version and remake formats [--proxy]</td></tr>
- <tr><th>--disarmutfbom</th><td></td><td>remove utf bom [--force]</td></tr>
- </table>
-<br/>
- </div>
- </div>
- </body>
-</html>
diff --git a/Master/texmf-dist/doc/context/scripts/mkii/ctxtools.man b/Master/texmf-dist/doc/context/scripts/mkii/ctxtools.man
deleted file mode 100644
index 3bb84f99026..00000000000
--- a/Master/texmf-dist/doc/context/scripts/mkii/ctxtools.man
+++ /dev/null
@@ -1,75 +0,0 @@
-.TH "ctxtools" "1" "01-01-2021" "version 1.3.5" "CtxTools"
-.SH NAME
- ctxtools - CtxTools
-.SH SYNOPSIS
-.B ctxtools [
-.I OPTIONS ...
-.B ] [
-.I FILENAMES
-.B ]
-.SH DESCRIPTION
-.B CtxTools
-.SH OPTIONS
-.TP
-.B --touchcontextfile
-update context version
-.TP
-.B --contextversion
-report context version
-.TP
-.B --jeditinterface
-generate jedit syntax files [--pipe]
-.TP
-.B --bbeditinterface
-generate bbedit syntax files [--pipe]
-.TP
-.B --sciteinterface
-generate scite syntax files [--pipe]
-.TP
-.B --rawinterface
-generate raw syntax files [--pipe]
-.TP
-.B --translateinterface
-generate interface files (xml) [nl de ..]
-.TP
-.B --purgefiles
-remove temporary files [--all --recurse] [basename]
-.TP
-.B --documentation generate documentation [--type=]
-[filename]
-.TP
-.B --filterpages'
-) # no help, hidden temporary feature
-.TP
-.B --dpxmapfiles
-convert pdftex mapfiles to dvipdfmx [--force] [texmfroot]
-.TP
-.B --listentities
-create doctype entity definition from enco-uc.tex
-.TP
-.B --brandfiles
-add context copyright notice [--force]
-.TP
-.B --platformize
-replace line-endings [--recurse --force] [pattern]
-.TP
-.B --dependencies analyze depedencies within context [--save --compact --filter=[macros|filenames] ]
-[filename]
-.TP
-.B --updatecontext
-download latest version and remake formats [--proxy]
-.TP
-.B --disarmutfbom
-remove utf bom [--force]
-.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/mkii/ctxtools.xml b/Master/texmf-dist/doc/context/scripts/mkii/ctxtools.xml
deleted file mode 100644
index 8f51cd93a0d..00000000000
--- a/Master/texmf-dist/doc/context/scripts/mkii/ctxtools.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0"?>
-<application>
- <metadata>
- <entry name="name">ctxtools</entry>
- <entry name="detail">CtxTools</entry>
- <entry name="version">1.3.5</entry>
- </metadata>
- <flags>
- <category name="basic">
- <subcategory>
- <flag name="touchcontextfile"><short>update context version</short></flag>
- <flag name="contextversion"><short>report context version</short></flag>
- <flag name="jeditinterface"><short>generate jedit syntax files [<ref name="pipe]"/></short></flag>
- <flag name="bbeditinterface"><short>generate bbedit syntax files [<ref name="pipe]"/></short></flag>
- <flag name="sciteinterface"><short>generate scite syntax files [<ref name="pipe]"/></short></flag>
- <flag name="rawinterface"><short>generate raw syntax files [<ref name="pipe]"/></short></flag>
- <flag name="translateinterface"><short>generate interface files (xml) [nl de ..]</short></flag>
- <flag name="purgefiles"><short>remove temporary files [<ref name="all"/> <ref name="recurse]"/> [basename]</short></flag>
- <flag name="documentation generate documentation [--type" value="]"><short>[filename]</short></flag>
- <flag name="filterpages'"><short>) # no help, hidden temporary feature</short></flag>
- <flag name="dpxmapfiles"><short>convert pdftex mapfiles to dvipdfmx [<ref name="force]"/> [texmfroot]</short></flag>
- <flag name="listentities"><short>create doctype entity definition from enco-uc.tex</short></flag>
- <flag name="brandfiles"><short>add context copyright notice [<ref name="force]"/></short></flag>
- <flag name="platformize"><short>replace line-endings [<ref name="recurse"/> <ref name="force]"/> [pattern]</short></flag>
- <flag name="dependencies analyze depedencies within context [--save --compact --filter" value="[macros|filenames] ]"><short>[filename]</short></flag>
- <flag name="updatecontext"><short>download latest version and remake formats [<ref name="proxy]"/></short></flag>
- <flag name="disarmutfbom"><short>remove utf bom [<ref name="force]"/></short></flag>
- </subcategory>
- </category>
- </flags>
-</application>
diff --git a/Master/texmf-dist/doc/context/scripts/mkii/imgtopdf.html b/Master/texmf-dist/doc/context/scripts/mkii/imgtopdf.html
deleted file mode 100644
index acf64598168..00000000000
--- a/Master/texmf-dist/doc/context/scripts/mkii/imgtopdf.html
+++ /dev/null
@@ -1,55 +0,0 @@
-<?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>ImgToPdf 1.1.2</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">ImgToPdf 1.1.2 </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>convert image into pdf</td></tr>
- <tr><th>--compression</th><td></td><td>level of compression in percent</td></tr>
- <tr><th>--depth</th><td></td><td>image depth in bits</td></tr>
- <tr><th>--colorspace</th><td></td><td> colorspace (rgb,cmyk,gray)</td></tr>
- <tr><th>--quality</th><td></td><td>quality in percent</td></tr>
- <tr><th>--inputpath</th><td></td><td>path where files are looked for</td></tr>
- <tr><th>--outputpath</th><td></td><td>path where files end up</td></tr>
- <tr><th>--auto</th><td></td><td>determine settings automatically</td></tr>
- </table>
-<br/>
- </div>
- </div>
- </body>
-</html>
diff --git a/Master/texmf-dist/doc/context/scripts/mkii/imgtopdf.man b/Master/texmf-dist/doc/context/scripts/mkii/imgtopdf.man
deleted file mode 100644
index 8a78ea5aaca..00000000000
--- a/Master/texmf-dist/doc/context/scripts/mkii/imgtopdf.man
+++ /dev/null
@@ -1,48 +0,0 @@
-.TH "imgtopdf" "1" "01-01-2021" "version 1.1.2" "ImgToPdf"
-.SH NAME
- imgtopdf - ImgToPdf
-.SH SYNOPSIS
-.B imgtopdf [
-.I OPTIONS ...
-.B ] [
-.I FILENAMES
-.B ]
-.SH DESCRIPTION
-.B ImgToPdf
-.SH OPTIONS
-.TP
-.B --convert
-convert image into pdf
-.TP
-.B --compression
-level of compression in percent
-.TP
-.B --depth
-image depth in bits
-.TP
-.B --colorspace
- colorspace (rgb,cmyk,gray)
-.TP
-.B --quality
-quality in percent
-.TP
-.B --inputpath
-path where files are looked for
-.TP
-.B --outputpath
-path where files end up
-.TP
-.B --auto
-determine settings automatically
-.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/mkii/imgtopdf.xml b/Master/texmf-dist/doc/context/scripts/mkii/imgtopdf.xml
deleted file mode 100644
index b516852c3d2..00000000000
--- a/Master/texmf-dist/doc/context/scripts/mkii/imgtopdf.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0"?>
-<application>
- <metadata>
- <entry name="name">imgtopdf</entry>
- <entry name="detail">ImgToPdf</entry>
- <entry name="version">1.1.2</entry>
- </metadata>
- <flags>
- <category name="basic">
- <subcategory>
- <flag name="convert"><short>convert image into pdf</short></flag>
- <flag name="compression"><short>level of compression in percent</short></flag>
- <flag name="depth"><short>image depth in bits</short></flag>
- <flag name="colorspace"><short> colorspace (rgb,cmyk,gray)</short></flag>
- <flag name="quality"><short>quality in percent</short></flag>
- <flag name="inputpath"><short>path where files are looked for</short></flag>
- <flag name="outputpath"><short>path where files end up</short></flag>
- <flag name="auto"><short>determine settings automatically</short></flag>
- </subcategory>
- </category>
- </flags>
-</application>
diff --git a/Master/texmf-dist/doc/context/scripts/mkii/rlxtools.man b/Master/texmf-dist/doc/context/scripts/mkii/mptopdf.1
index ccbfe325c37..18206589835 100644
--- a/Master/texmf-dist/doc/context/scripts/mkii/rlxtools.man
+++ b/Master/texmf-dist/doc/context/scripts/mkii/mptopdf.1
@@ -1,21 +1,24 @@
-.TH "rlxtools" "1" "01-01-2021" "version 1.0.1" "RlxTools"
+.TH "mptopdf" "1" "01-01-2023" "version 1.4.1" "convert MetaPost figures to PDF"
.SH NAME
- rlxtools - RlxTools
+ mptopdf - convert MetaPost figures to PDF
.SH SYNOPSIS
-.B rlxtools [
+.B mptopdf [
.I OPTIONS ...
.B ] [
.I FILENAMES
.B ]
.SH DESCRIPTION
-.B RlxTools
+.B convert MetaPost figures to PDF
.SH OPTIONS
.TP
-.B --manipulate
-[--test] manipulatorfile resourselog
+.B --metafun
+use the metafun format to process the file (default is mpost)
.TP
-.B --identify
-[--collect] filename
+.B --texexec
+use texexec (context) to process text snippets
+.TP
+.B --latex
+use latex to process text snippets
.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/mkii/mptopdf.html b/Master/texmf-dist/doc/context/scripts/mkii/mptopdf.html
deleted file mode 100644
index 9781a51f395..00000000000
--- a/Master/texmf-dist/doc/context/scripts/mkii/mptopdf.html
+++ /dev/null
@@ -1,50 +0,0 @@
-<?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>MPtoPDF 1.4.1</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">MPtoPDF 1.4.1 </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>--metafun</th><td></td><td>use the metafun format to process the file (default is mpost)</td></tr>
- <tr><th>--texexec</th><td></td><td>use texexec (context) to process text snippets</td></tr>
- <tr><th>--latex</th><td></td><td>use latex to process text snippets</td></tr>
- </table>
-<br/>
- </div>
- </div>
- </body>
-</html>
diff --git a/Master/texmf-dist/doc/context/scripts/mkii/mptopdf.man1.pdf b/Master/texmf-dist/doc/context/scripts/mkii/mptopdf.man1.pdf
new file mode 100644
index 00000000000..0dff2ae85d3
--- /dev/null
+++ b/Master/texmf-dist/doc/context/scripts/mkii/mptopdf.man1.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/context/scripts/mkii/mptopdf.xml b/Master/texmf-dist/doc/context/scripts/mkii/mptopdf.xml
deleted file mode 100644
index 28e67bcb3c4..00000000000
--- a/Master/texmf-dist/doc/context/scripts/mkii/mptopdf.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0"?>
-<application>
- <metadata>
- <entry name="name">mptopdf</entry>
- <entry name="detail">convert MetaPost figures to PDF</entry>
- <entry name="version">1.4.1</entry>
- </metadata>
- <flags>
- <category name="basic">
- <subcategory>
- <flag name="metafun"><short>use the metafun format to process the file (default is mpost)</short></flag>
- <flag name="texexec"><short>use texexec (context) to process text snippets</short></flag>
- <flag name="latex"><short>use latex to process text snippets</short></flag>
- </subcategory>
- </category>
- </flags>
-</application>
diff --git a/Master/texmf-dist/doc/context/scripts/mkii/pdftools.html b/Master/texmf-dist/doc/context/scripts/mkii/pdftools.html
deleted file mode 100644
index 7c147425852..00000000000
--- a/Master/texmf-dist/doc/context/scripts/mkii/pdftools.html
+++ /dev/null
@@ -1,55 +0,0 @@
-<?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>PDFTools 1.2.1</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">PDFTools 1.2.1 </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>--spotimage filename --colorspec</th><td></td><td>--colorname= [--retain --invert --subpath=]</td></tr>
- <tr><th>--colorimage filename --colorspec</th><td></td><td>[--retain --invert --colorname= ]</td></tr>
- <tr><th>--convertimage</th><td></td><td>filename [--retain --subpath]</td></tr>
- <tr><th>--downsampleimage</th><td></td><td>filename [--retain --subpath --lowres --normal]</td></tr>
- <tr><th>--info</th><td></td><td>filename</td></tr>
- <tr><th>--countpages</th><td></td><td>[--pattern --threshold]</td></tr>
- <tr><th>--checkembedded</th><td></td><td>[--pattern]</td></tr>
- <tr><th>--analyzefile</th><td></td><td>filename</td></tr>
- </table>
-<br/>
- </div>
- </div>
- </body>
-</html>
diff --git a/Master/texmf-dist/doc/context/scripts/mkii/pdftools.man b/Master/texmf-dist/doc/context/scripts/mkii/pdftools.man
deleted file mode 100644
index 477403320de..00000000000
--- a/Master/texmf-dist/doc/context/scripts/mkii/pdftools.man
+++ /dev/null
@@ -1,48 +0,0 @@
-.TH "pdftools" "1" "01-01-2021" "version 1.2.1" "PDFTools"
-.SH NAME
- pdftools - PDFTools
-.SH SYNOPSIS
-.B pdftools [
-.I OPTIONS ...
-.B ] [
-.I FILENAMES
-.B ]
-.SH DESCRIPTION
-.B PDFTools
-.SH OPTIONS
-.TP
-.B --spotimage filename --colorspec
---colorname= [--retain --invert --subpath=]
-.TP
-.B --colorimage filename --colorspec
-[--retain --invert --colorname= ]
-.TP
-.B --convertimage
-filename [--retain --subpath]
-.TP
-.B --downsampleimage
-filename [--retain --subpath --lowres --normal]
-.TP
-.B --info
-filename
-.TP
-.B --countpages
-[--pattern --threshold]
-.TP
-.B --checkembedded
-[--pattern]
-.TP
-.B --analyzefile
-filename
-.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/mkii/pdftools.xml b/Master/texmf-dist/doc/context/scripts/mkii/pdftools.xml
deleted file mode 100644
index 292ef4f88f2..00000000000
--- a/Master/texmf-dist/doc/context/scripts/mkii/pdftools.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0"?>
-<application>
- <metadata>
- <entry name="name">pdftools</entry>
- <entry name="detail">PDFTools</entry>
- <entry name="version">1.2.1</entry>
- </metadata>
- <flags>
- <category name="basic">
- <subcategory>
- <flag name="spotimage filename --colorspec" value=""><short><ref name="colorname="/> [<ref name="retain"/> <ref name="invert"/> <ref name="subpath=]"/></short></flag>
- <flag name="colorimage filename --colorspec" value=""><short>[<ref name="retain"/> <ref name="invert"/> <ref name="colorname="/> ]</short></flag>
- <flag name="convertimage"><short>filename [<ref name="retain"/> <ref name="subpath]"/></short></flag>
- <flag name="downsampleimage"><short>filename [<ref name="retain"/> <ref name="subpath"/> <ref name="lowres"/> <ref name="normal]"/></short></flag>
- <flag name="info"><short>filename</short></flag>
- <flag name="countpages"><short>[<ref name="pattern"/> <ref name="threshold]"/></short></flag>
- <flag name="checkembedded"><short>[<ref name="pattern]"/></short></flag>
- <flag name="analyzefile"><short>filename</short></flag>
- </subcategory>
- </category>
- </flags>
-</application>
diff --git a/Master/texmf-dist/doc/context/scripts/mkii/pstopdf.man b/Master/texmf-dist/doc/context/scripts/mkii/pstopdf.man
deleted file mode 100644
index 4e83555e5b8..00000000000
--- a/Master/texmf-dist/doc/context/scripts/mkii/pstopdf.man
+++ /dev/null
@@ -1,30 +0,0 @@
-.TH "pstopdf" "1" "01-01-2021" "version 2.0.1" "PStoPDF"
-.SH NAME
- pstopdf - PStoPDF
-.SH SYNOPSIS
-.B pstopdf [
-.I OPTIONS ...
-.B ] [
-.I FILENAMES
-.B ]
-.SH DESCRIPTION
-.B PStoPDF
-.SH OPTIONS
-.TP
-.B --request
-handles exa request file
-.TP
-.B --watch
-watch folders for conversions (untested)
-.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/mkii/pstopdf.xml b/Master/texmf-dist/doc/context/scripts/mkii/pstopdf.xml
deleted file mode 100644
index d7a7de0ae87..00000000000
--- a/Master/texmf-dist/doc/context/scripts/mkii/pstopdf.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0"?>
-<application>
- <metadata>
- <entry name="name">pstopdf</entry>
- <entry name="detail">PStoPDF</entry>
- <entry name="version">2.0.1</entry>
- </metadata>
- <flags>
- <category name="basic">
- <subcategory>
- <flag name="request"><short>handles exa request file</short></flag>
- <flag name="watch"><short>watch folders for conversions (untested)</short></flag>
- </subcategory>
- </category>
- </flags>
-</application>
diff --git a/Master/texmf-dist/doc/context/scripts/mkii/rlxtools.html b/Master/texmf-dist/doc/context/scripts/mkii/rlxtools.html
deleted file mode 100644
index 6af4c595402..00000000000
--- a/Master/texmf-dist/doc/context/scripts/mkii/rlxtools.html
+++ /dev/null
@@ -1,49 +0,0 @@
-<?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>RlxTools 1.0.1</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">RlxTools 1.0.1 </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>--manipulate</th><td></td><td>[--test] manipulatorfile resourselog</td></tr>
- <tr><th>--identify</th><td></td><td>[--collect] filename</td></tr>
- </table>
-<br/>
- </div>
- </div>
- </body>
-</html>
diff --git a/Master/texmf-dist/doc/context/scripts/mkii/rlxtools.xml b/Master/texmf-dist/doc/context/scripts/mkii/rlxtools.xml
deleted file mode 100644
index 8a221eccf63..00000000000
--- a/Master/texmf-dist/doc/context/scripts/mkii/rlxtools.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0"?>
-<application>
- <metadata>
- <entry name="name">rlxtools</entry>
- <entry name="detail">RlxTools</entry>
- <entry name="version">1.0.1</entry>
- </metadata>
- <flags>
- <category name="basic">
- <subcategory>
- <flag name="manipulate"><short>[<ref name="test]"/> manipulatorfile resourselog</short></flag>
- <flag name="identify"><short>[<ref name="collect]"/> filename</short></flag>
- </subcategory>
- </category>
- </flags>
-</application>
diff --git a/Master/texmf-dist/doc/context/scripts/mkii/texexec.html b/Master/texmf-dist/doc/context/scripts/mkii/texexec.html
deleted file mode 100644
index 5f775068cc8..00000000000
--- a/Master/texmf-dist/doc/context/scripts/mkii/texexec.html
+++ /dev/null
@@ -1,63 +0,0 @@
-<?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>TeXExec 6.2.1</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">TeXExec 6.2.1 </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>--make</th><td></td><td>make formats</td></tr>
- <tr><th>--check</th><td></td><td>check versions</td></tr>
- <tr><th>--process</th><td></td><td>process file</td></tr>
- <tr><th>--mptex</th><td></td><td>process mp file</td></tr>
- <tr><th>--mpxtex</th><td></td><td>process mpx file</td></tr>
- <tr><th>--mpgraphic</th><td></td><td>process mp file to stand-alone graphics</td></tr>
- <tr><th>--mpstatic</th><td></td><td>process mp/ctx file to stand-alone graphics</td></tr>
- <tr><th>--listing</th><td></td><td>list of file content</td></tr>
- <tr><th>--figures</th><td></td><td>generate overview of figures</td></tr>
- <tr><th>--modules</th><td></td><td>generate module documentation</td></tr>
- <tr><th>--pdfarrange</th><td></td><td>impose pages (booklets)</td></tr>
- <tr><th>--pdfselect</th><td></td><td>select pages from file(s)</td></tr>
- <tr><th>--pdfcopy</th><td></td><td>copy pages from file(s)</td></tr>
- <tr><th>--pdftrim</th><td></td><td>trim pages from file(s)</td></tr>
- <tr><th>--pdfcombine</th><td></td><td>combine multiple pages</td></tr>
- <tr><th>--pdfsplit</th><td></td><td>split file in pages</td></tr>
- </table>
-<br/>
- </div>
- </div>
- </body>
-</html>
diff --git a/Master/texmf-dist/doc/context/scripts/mkii/texexec.man b/Master/texmf-dist/doc/context/scripts/mkii/texexec.man
deleted file mode 100644
index e2935cc1778..00000000000
--- a/Master/texmf-dist/doc/context/scripts/mkii/texexec.man
+++ /dev/null
@@ -1,72 +0,0 @@
-.TH "texexec" "1" "01-01-2021" "version 6.2.1" "TeXExec"
-.SH NAME
- texexec - TeXExec
-.SH SYNOPSIS
-.B texexec [
-.I OPTIONS ...
-.B ] [
-.I FILENAMES
-.B ]
-.SH DESCRIPTION
-.B TeXExec
-.SH OPTIONS
-.TP
-.B --make
-make formats
-.TP
-.B --check
-check versions
-.TP
-.B --process
-process file
-.TP
-.B --mptex
-process mp file
-.TP
-.B --mpxtex
-process mpx file
-.TP
-.B --mpgraphic
-process mp file to stand-alone graphics
-.TP
-.B --mpstatic
-process mp/ctx file to stand-alone graphics
-.TP
-.B --listing
-list of file content
-.TP
-.B --figures
-generate overview of figures
-.TP
-.B --modules
-generate module documentation
-.TP
-.B --pdfarrange
-impose pages (booklets)
-.TP
-.B --pdfselect
-select pages from file(s)
-.TP
-.B --pdfcopy
-copy pages from file(s)
-.TP
-.B --pdftrim
-trim pages from file(s)
-.TP
-.B --pdfcombine
-combine multiple pages
-.TP
-.B --pdfsplit
-split file in pages
-.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/mkii/texexec.xml b/Master/texmf-dist/doc/context/scripts/mkii/texexec.xml
deleted file mode 100644
index 8f85a4f2502..00000000000
--- a/Master/texmf-dist/doc/context/scripts/mkii/texexec.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0"?>
-<application>
- <metadata>
- <entry name="name">texexec</entry>
- <entry name="detail">TeXExec</entry>
- <entry name="version">6.2.1</entry>
- </metadata>
- <flags>
- <category name="basic">
- <subcategory>
- <flag name="make"><short>make formats</short></flag>
- <flag name="check"><short>check versions</short></flag>
- <flag name="process"><short>process file</short></flag>
- <flag name="mptex"><short>process mp file</short></flag>
- <flag name="mpxtex"><short>process mpx file</short></flag>
- <flag name="mpgraphic"><short>process mp file to stand-alone graphics</short></flag>
- <flag name="mpstatic"><short>process mp/ctx file to stand-alone graphics</short></flag>
- <flag name="listing"><short>list of file content</short></flag>
- <flag name="figures"><short>generate overview of figures</short></flag>
- <flag name="modules"><short>generate module documentation</short></flag>
- <flag name="pdfarrange"><short>impose pages (booklets)</short></flag>
- <flag name="pdfselect"><short>select pages from file(s)</short></flag>
- <flag name="pdfcopy"><short>copy pages from file(s)</short></flag>
- <flag name="pdftrim"><short>trim pages from file(s)</short></flag>
- <flag name="pdfcombine"><short>combine multiple pages</short></flag>
- <flag name="pdfsplit"><short>split file in pages</short></flag>
- </subcategory>
- </category>
- </flags>
-</application>
diff --git a/Master/texmf-dist/doc/context/scripts/mkii/texmfstart.html b/Master/texmf-dist/doc/context/scripts/mkii/texmfstart.html
deleted file mode 100644
index fc3dbb68530..00000000000
--- a/Master/texmf-dist/doc/context/scripts/mkii/texmfstart.html
+++ /dev/null
@@ -1,102 +0,0 @@
-<?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>texmfstart 7.0.0</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">texmfstart 7.0.0 </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>--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) (=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>
- <tr><th>--internal</th><td></td><td>run script using built in libraries (same as --ctxlua)</td></tr>
- <tr><th>--locate</th><td></td><td>locate given filename in database (default) or system (--first --all --detail)</td></tr>
- <tr><th/><td/><td/></tr>
- <tr><th>--tree</th><td>pathtotree</td><td>use given texmf tree (default file: setuptex.tmf)</td></tr>
- <tr><th>--path</th><td>runpath</td><td>go to given path before execution</td></tr>
- <tr><th>--ifchanged</th><td>filename</td><td>only execute when given file has changed (md checksum)</td></tr>
- <tr><th>--iftouched</th><td>old,new</td><td>only execute when given file has changed (time stamp)</td></tr>
- <tr><th/><td/><td/></tr>
- <tr><th>--makestubs</th><td></td><td>create stubs for (context related) scripts</td></tr>
- <tr><th>--removestubs</th><td></td><td>remove stubs (context related) scripts</td></tr>
- <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>
- <tr><th>--progname</th><td>str</td><td>format or backend</td></tr>
- <tr><th>--systeminfo</th><td>str</td><td>show current operating system, processor, etc</td></tr>
- <tr><th/><td/><td/></tr>
- <tr><th>--edit</th><td></td><td>launch editor with found file</td></tr>
- <tr><th>--launch</th><td></td><td>launch files like manuals, assumes os support (--all,--list)</td></tr>
- <tr><th/><td/><td/></tr>
- <tr><th>--timedrun</th><td></td><td>run a script and time its run</td></tr>
- <tr><th>--autogenerate</th><td></td><td>regenerate databases if needed (handy when used to run context in an editor)</td></tr>
- <tr><th/><td/><td/></tr>
- <tr><th>--usekpse</th><td></td><td>use kpse as fallback (when no mkiv and cache installed, often slower)</td></tr>
- <tr><th>--forcekpse</th><td></td><td>force using kpse (handy when no mkiv and cache installed but less functionality)</td></tr>
- <tr><th/><td/><td/></tr>
- <tr><th>--prefixes</th><td></td><td>show supported prefixes</td></tr>
- <tr><th/><td/><td/></tr>
- <tr><th>--generate</th><td></td><td>generate file database</td></tr>
- <tr><th/><td/><td/></tr>
- <tr><th>--variables</th><td></td><td>show configuration variables</td></tr>
- <tr><th>--configurations</th><td></td><td>show configuration order</td></tr>
- <tr><th/><td/><td/></tr>
- <tr><th>--directives</th><td></td><td>show (known) directives</td></tr>
- <tr><th>--trackers</th><td></td><td>show (known) trackers</td></tr>
- <tr><th>--experiments</th><td></td><td>show (known) experiments</td></tr>
- <tr><th/><td/><td/></tr>
- <tr><th>--expand-braces</th><td></td><td>expand complex variable</td></tr>
- <tr><th>--resolve-path</th><td></td><td>expand variable (completely resolve paths)</td></tr>
- <tr><th>--expand-path</th><td></td><td>expand variable (resolve paths)</td></tr>
- <tr><th>--expand-var</th><td></td><td>expand variable (resolve references)</td></tr>
- <tr><th>--show-path</th><td></td><td>show path expansion of ...</td></tr>
- <tr><th>--var-value</th><td></td><td>report value of variable</td></tr>
- <tr><th>--find-file</th><td></td><td>report file location</td></tr>
- <tr><th>--find-path</th><td></td><td>report path of file</td></tr>
- <tr><th/><td/><td/></tr>
- <tr><th>--pattern</th><td>string</td><td>filter variables</td></tr>
- </table>
-<br/>
- </div>
- </div>
- </body>
-</html>
diff --git a/Master/texmf-dist/doc/context/scripts/mkii/texmfstart.man b/Master/texmf-dist/doc/context/scripts/mkii/texmfstart.man
deleted file mode 100644
index 6ed2acf8a17..00000000000
--- a/Master/texmf-dist/doc/context/scripts/mkii/texmfstart.man
+++ /dev/null
@@ -1,153 +0,0 @@
-.TH "mtxrun" "1" "01-01-2021" "version 1.33" "ConTeXt TDS Runner Tool"
-.SH NAME
- mtxrun - ConTeXt TDS Runner Tool
-.SH SYNOPSIS
-.B mtxrun [
-.I OPTIONS ...
-.B ] [
-.I FILENAMES
-.B ]
-.SH DESCRIPTION
-.B ConTeXt TDS Runner Tool
-.SH OPTIONS
-.TP
-.B --script
-run an mtx script (lua prefered method) (--noquotes), no script gives list
-.TP
-.B --evaluate
-run code passed on the commandline (between quotes) (=loop) (exit|quit aborts)
-.TP
-.B --execute
-run a script or program (texmfstart method) (--noquotes)
-.TP
-.B --resolve
-resolve prefixed arguments
-.TP
-.B --ctxlua
-run internally (using preloaded libs)
-.TP
-.B --internal
-run script using built in libraries (same as --ctxlua)
-.TP
-.B --locate
-locate given filename in database (default) or system (--first --all --detail)
-.TP
-.B --tree=pathtotree
-use given texmf tree (default file: setuptex.tmf)
-.TP
-.B --path=runpath
-go to given path before execution
-.TP
-.B --ifchanged=filename
-only execute when given file has changed (md checksum)
-.TP
-.B --iftouched=old,new
-only execute when given file has changed (time stamp)
-.TP
-.B --makestubs
-create stubs for (context related) scripts
-.TP
-.B --removestubs
-remove stubs (context related) scripts
-.TP
-.B --stubpath=binpath
-paths where stubs wil be written
-.TP
-.B --windows
-create windows (mswin) stubs
-.TP
-.B --unix
-create unix (linux) stubs
-.TP
-.B --addbinarypath
-prepend the (found) binarypath to runners
-.TP
-.B --verbose
-give a bit more info
-.TP
-.B --trackers=list
-enable given trackers
-.TP
-.B --progname=str
-format or backend
-.TP
-.B --systeminfo=str
-show current operating system, processor, etc
-.TP
-.B --edit
-launch editor with found file
-.TP
-.B --launch
-launch files like manuals, assumes os support (--all,--list)
-.TP
-.B --timedrun
-run a script and time its run
-.TP
-.B --autogenerate
-regenerate databases if needed (handy when used to run context in an editor)
-.TP
-.B --usekpse
-use kpse as fallback (when no mkiv and cache installed, often slower)
-.TP
-.B --forcekpse
-force using kpse (handy when no mkiv and cache installed but less functionality)
-.TP
-.B --prefixes
-show supported prefixes
-.TP
-.B --generate
-generate file database
-.TP
-.B --variables
-show configuration variables
-.TP
-.B --configurations
-show configuration order
-.TP
-.B --directives
-show (known) directives
-.TP
-.B --trackers
-show (known) trackers
-.TP
-.B --experiments
-show (known) experiments
-.TP
-.B --expand-braces
-expand complex variable
-.TP
-.B --resolve-path
-expand variable (completely resolve paths)
-.TP
-.B --expand-path
-expand variable (resolve paths)
-.TP
-.B --expand-var
-expand variable (resolve references)
-.TP
-.B --show-path
-show path expansion of ...
-.TP
-.B --var-value
-report value of variable
-.TP
-.B --find-file
-report file location
-.TP
-.B --find-path
-report path of file
-.TP
-.B --pattern=string
-filter variables
-.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/mkii/texmfstart.xml b/Master/texmf-dist/doc/context/scripts/mkii/texmfstart.xml
deleted file mode 100644
index 5e5958e16fd..00000000000
--- a/Master/texmf-dist/doc/context/scripts/mkii/texmfstart.xml
+++ /dev/null
@@ -1,80 +0,0 @@
-<?xml version="1.0"?><application>
- <metadata>
- <entry name="name">mtxrun</entry>
- <entry name="detail">ConTeXt TDS Runner Tool</entry>
- <entry name="version">1.33</entry>
- </metadata>
- <flags>
- <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) (=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>
- <flag name="internal"><short>run script using built in libraries (same as <ref name="ctxlua"/>)</short></flag>
- <flag name="locate"><short>locate given filename in database (default) or system (<ref name="first"/> <ref name="all"/> <ref name="detail"/>)</short></flag>
- </subcategory>
- <subcategory>
- <flag name="tree" value="pathtotree"><short>use given texmf tree (default file: setuptex.tmf)</short></flag>
- <flag name="path" value="runpath"><short>go to given path before execution</short></flag>
- <flag name="ifchanged" value="filename"><short>only execute when given file has changed (md checksum)</short></flag>
- <flag name="iftouched" value="old,new"><short>only execute when given file has changed (time stamp)</short></flag>
- </subcategory>
- <subcategory>
- <flag name="makestubs"><short>create stubs for (context related) scripts</short></flag>
- <flag name="removestubs"><short>remove stubs (context related) scripts</short></flag>
- <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>
- <flag name="trackers" value="list"><short>enable given trackers</short></flag>
- <flag name="progname" value="str"><short>format or backend</short></flag>
- <flag name="systeminfo" value="str"><short>show current operating system, processor, etc</short></flag>
- </subcategory>
- <subcategory>
- <flag name="edit"><short>launch editor with found file</short></flag>
- <flag name="launch"><short>launch files like manuals, assumes os support (<ref name="all"/>,<ref name="list"/>)</short></flag>
- </subcategory>
- <subcategory>
- <flag name="timedrun"><short>run a script and time its run</short></flag>
- <flag name="autogenerate"><short>regenerate databases if needed (handy when used to run context in an editor)</short></flag>
- </subcategory>
- <subcategory>
- <flag name="usekpse"><short>use kpse as fallback (when no mkiv and cache installed, often slower)</short></flag>
- <flag name="forcekpse"><short>force using kpse (handy when no mkiv and cache installed but less functionality)</short></flag>
- </subcategory>
- <subcategory>
- <flag name="prefixes"><short>show supported prefixes</short></flag>
- </subcategory>
- <subcategory>
- <flag name="generate"><short>generate file database</short></flag>
- </subcategory>
- <subcategory>
- <flag name="variables"><short>show configuration variables</short></flag>
- <flag name="configurations"><short>show configuration order</short></flag>
- </subcategory>
- <subcategory>
- <flag name="directives"><short>show (known) directives</short></flag>
- <flag name="trackers"><short>show (known) trackers</short></flag>
- <flag name="experiments"><short>show (known) experiments</short></flag>
- </subcategory>
- <subcategory>
- <flag name="expand-braces"><short>expand complex variable</short></flag>
- <flag name="resolve-path"><short>expand variable (completely resolve paths)</short></flag>
- <flag name="expand-path"><short>expand variable (resolve paths)</short></flag>
- <flag name="expand-var"><short>expand variable (resolve references)</short></flag>
- <flag name="show-path"><short>show path expansion of ...</short></flag>
- <flag name="var-value"><short>report value of variable</short></flag>
- <flag name="find-file"><short>report file location</short></flag>
- <flag name="find-path"><short>report path of file</short></flag>
- </subcategory>
- <subcategory>
- <flag name="pattern" value="string"><short>filter variables</short></flag>
- </subcategory>
- </category>
- </flags>
-</application> \ No newline at end of file
diff --git a/Master/texmf-dist/doc/context/scripts/mkii/textools.html b/Master/texmf-dist/doc/context/scripts/mkii/textools.html
deleted file mode 100644
index 9bd9ac5c9e9..00000000000
--- a/Master/texmf-dist/doc/context/scripts/mkii/textools.html
+++ /dev/null
@@ -1,63 +0,0 @@
-<?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>TeXTools 1.3.1</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">TeXTools 1.3.1 </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>--removemapnames</th><td></td><td>[pattern] [--recurse]</td></tr>
- <tr><th>--restoremapnames</th><td></td><td>[pattern] [--recurse]</td></tr>
- <tr><th>--hidemapnames</th><td></td><td>[pattern] [--recurse]</td></tr>
- <tr><th>--videmapnames</th><td></td><td>[pattern] [--recurse]</td></tr>
- <tr><th>--findfile</th><td></td><td>filename [--recurse]</td></tr>
- <tr><th>--unzipfiles</th><td></td><td>[pattern] [--recurse]</td></tr>
- <tr><th>--fixafmfiles</th><td></td><td>[pattern] [--recurse]</td></tr>
- <tr><th>--mactodos</th><td></td><td>[pattern] [--recurse]</td></tr>
- <tr><th>--fixtexmftrees</th><td></td><td>[texmfroot] [--force]</td></tr>
- <tr><th>--replacefile</th><td></td><td>filename [--force]</td></tr>
- <tr><th>--updatetree</th><td></td><td>fromroot toroot [--force --nocheck --merge --delete]</td></tr>
- <tr><th>--downcasefilenames</th><td></td><td>[--recurse] [--force]</td></tr>
- <tr><th>--stripformfeeds</th><td></td><td>[--recurse] [--force]</td></tr>
- <tr><th>--showfont</th><td></td><td>filename</td></tr>
- <tr><th>--encmake</th><td></td><td>afmfile encodingname</td></tr>
- <tr><th>--tpmmake</th><td></td><td>tpm file (run in texmf root)</td></tr>
- </table>
-<br/>
- </div>
- </div>
- </body>
-</html>
diff --git a/Master/texmf-dist/doc/context/scripts/mkii/textools.man b/Master/texmf-dist/doc/context/scripts/mkii/textools.man
deleted file mode 100644
index 832dfb21ff9..00000000000
--- a/Master/texmf-dist/doc/context/scripts/mkii/textools.man
+++ /dev/null
@@ -1,72 +0,0 @@
-.TH "textools" "1" "01-01-2021" "version 1.3.1" "TeXTools"
-.SH NAME
- textools - TeXTools
-.SH SYNOPSIS
-.B textools [
-.I OPTIONS ...
-.B ] [
-.I FILENAMES
-.B ]
-.SH DESCRIPTION
-.B TeXTools
-.SH OPTIONS
-.TP
-.B --removemapnames
-[pattern] [--recurse]
-.TP
-.B --restoremapnames
-[pattern] [--recurse]
-.TP
-.B --hidemapnames
-[pattern] [--recurse]
-.TP
-.B --videmapnames
-[pattern] [--recurse]
-.TP
-.B --findfile
-filename [--recurse]
-.TP
-.B --unzipfiles
-[pattern] [--recurse]
-.TP
-.B --fixafmfiles
-[pattern] [--recurse]
-.TP
-.B --mactodos
-[pattern] [--recurse]
-.TP
-.B --fixtexmftrees
-[texmfroot] [--force]
-.TP
-.B --replacefile
-filename [--force]
-.TP
-.B --updatetree
-fromroot toroot [--force --nocheck --merge --delete]
-.TP
-.B --downcasefilenames
-[--recurse] [--force]
-.TP
-.B --stripformfeeds
-[--recurse] [--force]
-.TP
-.B --showfont
-filename
-.TP
-.B --encmake
-afmfile encodingname
-.TP
-.B --tpmmake
-tpm file (run in texmf root)
-.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/mkii/textools.xml b/Master/texmf-dist/doc/context/scripts/mkii/textools.xml
deleted file mode 100644
index 963c4a3a4d9..00000000000
--- a/Master/texmf-dist/doc/context/scripts/mkii/textools.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0"?>
-<application>
- <metadata>
- <entry name="name">textools</entry>
- <entry name="detail">TeXTools</entry>
- <entry name="version">1.3.1</entry>
- </metadata>
- <flags>
- <category name="basic">
- <subcategory>
- <flag name="removemapnames"><short>[pattern] [<ref name="recurse]"/></short></flag>
- <flag name="restoremapnames"><short>[pattern] [<ref name="recurse]"/></short></flag>
- <flag name="hidemapnames"><short>[pattern] [<ref name="recurse]"/></short></flag>
- <flag name="videmapnames"><short>[pattern] [<ref name="recurse]"/></short></flag>
- <flag name="findfile"><short>filename [<ref name="recurse]"/></short></flag>
- <flag name="unzipfiles"><short>[pattern] [<ref name="recurse]"/></short></flag>
- <flag name="fixafmfiles"><short>[pattern] [<ref name="recurse]"/></short></flag>
- <flag name="mactodos"><short>[pattern] [<ref name="recurse]"/></short></flag>
- <flag name="fixtexmftrees"><short>[texmfroot] [<ref name="force]"/></short></flag>
- <flag name="replacefile"><short>filename [<ref name="force]"/></short></flag>
- <flag name="updatetree"><short>fromroot toroot [<ref name="force"/> <ref name="nocheck"/> <ref name="merge"/> <ref name="delete]"/></short></flag>
- <flag name="downcasefilenames"><short>[<ref name="recurse]"/> [<ref name="force]"/></short></flag>
- <flag name="stripformfeeds"><short>[<ref name="recurse]"/> [<ref name="force]"/></short></flag>
- <flag name="showfont"><short>filename</short></flag>
- <flag name="encmake"><short>afmfile encodingname</short></flag>
- <flag name="tpmmake"><short>tpm file (run in texmf root)</short></flag>
- </subcategory>
- </category>
- </flags>
-</application>
diff --git a/Master/texmf-dist/doc/context/scripts/mkii/texutil.html b/Master/texmf-dist/doc/context/scripts/mkii/texutil.html
deleted file mode 100644
index 4dd23fa3aee..00000000000
--- a/Master/texmf-dist/doc/context/scripts/mkii/texutil.html
+++ /dev/null
@@ -1,54 +0,0 @@
-<?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>TeXUtil 9.1.0</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">TeXUtil 9.1.0 </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>--references</th><td></td><td>convert tui file into tuo file</td></tr>
- <tr><th>--figures</th><td></td><td>generate figure dimensions file</td></tr>
- <tr><th>--logfile</th><td></td><td>filter essential log messages</td></tr>
- <tr><th>--purgefiles</th><td></td><td>remove most temporary files</td></tr>
- <tr><th>--purgeallfiles</th><td></td><td>remove all temporary files</td></tr>
- <tr><th>--documentation</th><td></td><td>generate documentation file from source</td></tr>
- <tr><th>--analyzefile</th><td></td><td>analyze pdf file</td></tr>
- </table>
-<br/>
- </div>
- </div>
- </body>
-</html>
diff --git a/Master/texmf-dist/doc/context/scripts/mkii/texutil.man b/Master/texmf-dist/doc/context/scripts/mkii/texutil.man
deleted file mode 100644
index d2f2adb41ab..00000000000
--- a/Master/texmf-dist/doc/context/scripts/mkii/texutil.man
+++ /dev/null
@@ -1,45 +0,0 @@
-.TH "texutil" "1" "01-01-2021" "version 9.1.0" "TeXUtil"
-.SH NAME
- texutil - TeXUtil
-.SH SYNOPSIS
-.B texutil [
-.I OPTIONS ...
-.B ] [
-.I FILENAMES
-.B ]
-.SH DESCRIPTION
-.B TeXUtil
-.SH OPTIONS
-.TP
-.B --references
-convert tui file into tuo file
-.TP
-.B --figures
-generate figure dimensions file
-.TP
-.B --logfile
-filter essential log messages
-.TP
-.B --purgefiles
-remove most temporary files
-.TP
-.B --purgeallfiles
-remove all temporary files
-.TP
-.B --documentation
-generate documentation file from source
-.TP
-.B --analyzefile
-analyze pdf file
-.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/mkii/texutil.xml b/Master/texmf-dist/doc/context/scripts/mkii/texutil.xml
deleted file mode 100644
index fde9abd586a..00000000000
--- a/Master/texmf-dist/doc/context/scripts/mkii/texutil.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0"?>
-<application>
- <metadata>
- <entry name="name">texutil</entry>
- <entry name="detail">TeXUtil</entry>
- <entry name="version">9.1.0</entry>
- </metadata>
- <flags>
- <category name="basic">
- <subcategory>
- <flag name="references"><short>convert tui file into tuo file</short></flag>
- <flag name="figures"><short>generate figure dimensions file</short></flag>
- <flag name="logfile"><short>filter essential log messages</short></flag>
- <flag name="purgefiles"><short>remove most temporary files</short></flag>
- <flag name="purgeallfiles"><short>remove all temporary files</short></flag>
- <flag name="documentation"><short>generate documentation file from source</short></flag>
- <flag name="analyzefile"><short>analyze pdf file</short></flag>
- </subcategory>
- </category>
- </flags>
-</application> \ No newline at end of file
diff --git a/Master/texmf-dist/doc/context/scripts/mkii/tmftools.html b/Master/texmf-dist/doc/context/scripts/mkii/tmftools.html
deleted file mode 100644
index 17a18289686..00000000000
--- a/Master/texmf-dist/doc/context/scripts/mkii/tmftools.html
+++ /dev/null
@@ -1,50 +0,0 @@
-<?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>TMFTools 1.2.1</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">TMFTools 1.2.1 </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>--analyze</th><td></td><td>[--strict --sort --rootpath --treepath --delete --force] [pattern]</td></tr>
- <tr><th/><td/><td/></tr>
- <tr><th>--serve</th><td></td><td>act as kpse server</td></tr>
- </table>
-<br/>
- </div>
- </div>
- </body>
-</html>
diff --git a/Master/texmf-dist/doc/context/scripts/mkii/tmftools.xml b/Master/texmf-dist/doc/context/scripts/mkii/tmftools.xml
deleted file mode 100644
index c52aa30673d..00000000000
--- a/Master/texmf-dist/doc/context/scripts/mkii/tmftools.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xml version="1.0"?>
-<application>
- <metadata>
- <entry name="name">tmftools</entry>
- <entry name="detail">TMFTools</entry>
- <entry name="version">1.1.0</entry>
- </metadata>
- <flags>
- <category name="basic">
- <subcategory>
- <flag name="analyze"><short>[<ref name="strict"/> <ref name="sort"/> <ref name="rootpath"/> <ref name="treepath"/> <ref name="delete"/> <ref name="force"/>] [pattern]</short></flag>
- </subcategory>
- <subcategory>
- <flag name="serve"><short>act as kpse server</short></flag>
- </subcategory>
- </category>
- </flags>
-</application>
diff --git a/Master/texmf-dist/doc/context/scripts/mkii/xmltools.html b/Master/texmf-dist/doc/context/scripts/mkii/xmltools.html
deleted file mode 100644
index d6733ae7a18..00000000000
--- a/Master/texmf-dist/doc/context/scripts/mkii/xmltools.html
+++ /dev/null
@@ -1,54 +0,0 @@
-<?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>XMLTools 1.2.1</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">XMLTools 1.2.1 </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>--dir</th><td></td><td>generate directory listing</td></tr>
- <tr><th>--mmlpages</th><td></td><td>generate graphic from mathml</td></tr>
- <tr><th>--analyze</th><td></td><td>report entities and elements [--utf --process]</td></tr>
- <tr><th>--cleanup</th><td></td><td>cleanup xml file [--force]</td></tr>
- <tr><th>--enhance</th><td></td><td>enhance xml file (partial)</td></tr>
- <tr><th>--filter</th><td></td><td>filter elements from xml file [--element]</td></tr>
- <tr><th>--dir</th><td></td><td>generate ddirectory listing</td></tr>
- </table>
-<br/>
- </div>
- </div>
- </body>
-</html>
diff --git a/Master/texmf-dist/doc/context/scripts/mkii/xmltools.man b/Master/texmf-dist/doc/context/scripts/mkii/xmltools.man
deleted file mode 100644
index fd6143769a3..00000000000
--- a/Master/texmf-dist/doc/context/scripts/mkii/xmltools.man
+++ /dev/null
@@ -1,45 +0,0 @@
-.TH "xmltools" "1" "01-01-2021" "version 1.2.2" "XMLTools"
-.SH NAME
- xmltools - XMLTools
-.SH SYNOPSIS
-.B xmltools [
-.I OPTIONS ...
-.B ] [
-.I FILENAMES
-.B ]
-.SH DESCRIPTION
-.B XMLTools
-.SH OPTIONS
-.TP
-.B --dir
-generate directory listing
-.TP
-.B --mmlpages
-generate graphic from mathml
-.TP
-.B --analyze
-report entities and elements [--utf --process]
-.TP
-.B --cleanup
-cleanup xml file [--force]
-.TP
-.B --enhance
-enhance xml file (partial)
-.TP
-.B --filter
-filter elements from xml file [--element]
-.TP
-.B --dir
-generate ddirectory listing
-.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/mkii/xmltools.xml b/Master/texmf-dist/doc/context/scripts/mkii/xmltools.xml
deleted file mode 100644
index 4b784c4e721..00000000000
--- a/Master/texmf-dist/doc/context/scripts/mkii/xmltools.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0"?>
-<application>
- <metadata>
- <entry name="name">xmltools</entry>
- <entry name="detail">XMLTools</entry>
- <entry name="version">1.2.2</entry>
- </metadata>
- <flags>
- <category name="basic">
- <subcategory>
- <flag name="dir"><short>generate directory listing</short></flag>
- <flag name="mmlpages"><short>generate graphic from mathml</short></flag>
- <flag name="analyze"><short>report entities and elements [<ref name="utf"/> <ref name="process"/>]</short></flag>
- <flag name="cleanup"><short>cleanup xml file [<ref name="force"/>]</short></flag>
- <flag name="enhance"><short>enhance xml file (partial)</short></flag>
- <flag name="filter"><short>filter elements from xml file [<ref name="element"/>]</short></flag>
- <flag name="dir"><short>generate ddirectory listing</short></flag>
- </subcategory>
- </category>
- </flags>
-</application>
diff --git a/Master/texmf-dist/doc/context/scripts/mkiv/context.html b/Master/texmf-dist/doc/context/scripts/mkiv/context.html
index 682b8621fa6..035e3a7db88 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/context.html
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/context.html
@@ -89,7 +89,7 @@
<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>--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>
@@ -108,12 +108,17 @@
<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>
+ <tr><th>--keeppdf</th><td></td><td>keep previous pdf files (jobname-pdf-keep.tmp)</td></tr>
<tr><th>--keeplog</th><td></td><td>keep previous log files (jobname-log-[run].tmp)</td></tr>
<tr><th>--lmtx</th><td></td><td>force lmtx mode (when available)</td></tr>
<tr><th>--overloadmode=error|warning|0--6|255</th><td></td><td>enable csname overload checking</td></tr>
<tr><th/><td/><td/></tr>
<tr><th>--extra=name</th><td></td><td>process extra (mtx-context-... in distribution)</td></tr>
<tr><th>--extras</th><td></td><td>show extras</td></tr>
+ <tr><th/><td/><td/></tr>
+ <tr><th>--ownerpassword</th><td></td><td>encrypt the (pdf) file using this master password</td></tr>
+ <tr><th>--userpassword</th><td></td><td>use an additional password for opening the document</td></tr>
+ <tr><th>--permissions</th><td></td><td>list of: print, modify, extract, add, fillin, assemble, quality</td></tr>
<tr><th colspan="3">special</th></tr>
<tr><th/><td/><td/></tr>
<tr><th>--pdftex</th><td></td><td>process file with texexec using pdftex</td></tr>
diff --git a/Master/texmf-dist/doc/context/scripts/mkiv/context.man b/Master/texmf-dist/doc/context/scripts/mkiv/context.man
index 7d9e949bb16..9a36d403c2b 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/context.man
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/context.man
@@ -1,4 +1,4 @@
-.TH "mtx-context" "1" "01-01-2021" "version 1.04" "ConTeXt Process Management"
+.TH "mtx-context" "1" "01-01-2023" "version 1.04" "ConTeXt Process Management"
.SH NAME
mtx-context - ConTeXt Process Management
.SH SYNOPSIS
@@ -129,7 +129,7 @@ run without stopping
never initializes synctex (for production runs)
.TP
.B --synctex
-run with synctex enabled (better use \setupsynctex[state=start]
+run with synctex enabled (better use \setupsynctex[state=start])
.TP
.B --nodates
omit runtime dates in pdf file (optional value: a number (this 1970 offset time) or string "YYYY-MM-DD HH:MM")
@@ -171,6 +171,9 @@ generate timing and statistics overview
.B --keeptuc
keep previous tuc files (jobname-tuc-[run].tmp)
.TP
+.B --keeppdf
+keep previous pdf files (jobname-pdf-keep.tmp)
+.TP
.B --keeplog
keep previous log files (jobname-log-[run].tmp)
.TP
@@ -185,6 +188,15 @@ process extra (mtx-context-... in distribution)
.TP
.B --extras
show extras
+.TP
+.B --ownerpassword
+encrypt the (pdf) file using this master password
+.TP
+.B --userpassword
+use an additional password for opening the document
+.TP
+.B --permissions
+list of: print, modify, extract, add, fillin, assemble, quality
.SH OPTIONS: SPECIAL
.TP
.B --pdftex
diff --git a/Master/texmf-dist/doc/context/scripts/mkiv/context.xml b/Master/texmf-dist/doc/context/scripts/mkiv/context.xml
index 98a75244b12..bf341c21a9f 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/context.xml
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/context.xml
@@ -148,7 +148,7 @@
<short>never initializes synctex (for production runs)</short>
</flag>
<flag name="synctex">
- <short>run with synctex enabled (better use \setupsynctex[state=start]</short>
+ <short>run with synctex enabled (better use \setupsynctex[state=start])</short>
</flag>
</subcategory>
<subcategory>
@@ -202,6 +202,9 @@
<flag name="keeptuc">
<short>keep previous tuc files (jobname-tuc-[run].tmp)</short>
</flag>
+ <flag name="keeppdf">
+ <short>keep previous pdf files (jobname-pdf-keep.tmp)</short>
+ </flag>
<flag name="keeplog">
<short>keep previous log files (jobname-log-[run].tmp)</short>
</flag>
@@ -220,6 +223,17 @@
<short>show extras</short>
</flag>
</subcategory>
+ <subcategory>
+ <flag name="ownerpassword">
+ <short>encrypt the (pdf) file using this master password</short>
+ </flag>
+ <flag name="userpassword">
+ <short>use an additional password for opening the document</short>
+ </flag>
+ <flag name="permissions">
+ <short>list of: print, modify, extract, add, fillin, assemble, quality</short>
+ </flag>
+ </subcategory>
</category>
<category name="special">
<subcategory>
diff --git a/Master/texmf-dist/doc/context/scripts/mkiv/luatools.man b/Master/texmf-dist/doc/context/scripts/mkiv/luatools.man
index 94bbd9fcab9..58de54abfa2 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/luatools.man
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/luatools.man
@@ -1,4 +1,4 @@
-.TH "luatools" "1" "01-01-2021" "version 1.35" "ConTeXt TDS Management Tool (aka luatools)"
+.TH "luatools" "1" "01-01-2023" "version 1.35" "ConTeXt TDS Management Tool (aka luatools)"
.SH NAME
luatools - ConTeXt TDS Management Tool (aka luatools)
.SH SYNOPSIS
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 621a1a4ab19..851c17a7ac4 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-babel.man
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-babel.man
@@ -1,4 +1,4 @@
-.TH "mtx-babel" "1" "01-01-2021" "version 1.20" "Babel Input To UTF Conversion"
+.TH "mtx-babel" "1" "01-01-2023" "version 1.20" "Babel Input To UTF Conversion"
.SH NAME
mtx-babel - Babel Input To UTF Conversion
.SH SYNOPSIS
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 3bfc0878434..4a5133c13cf 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-base.man
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-base.man
@@ -1,4 +1,4 @@
-.TH "mtx-base" "1" "01-01-2021" "version 1.35" "ConTeXt TDS Management Tool (aka luatools)"
+.TH "mtx-base" "1" "01-01-2023" "version 1.35" "ConTeXt TDS Management Tool (aka luatools)"
.SH NAME
mtx-base - ConTeXt TDS Management Tool (aka luatools)
.SH SYNOPSIS
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 c44df3bbf3e..79aeb0ff73a 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-bibtex.man
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-bibtex.man
@@ -1,4 +1,4 @@
-.TH "mtx-bibtex" "1" "01-01-2021" "version 1.00" "bibtex helpers"
+.TH "mtx-bibtex" "1" "01-01-2023" "version 1.00" "bibtex helpers"
.SH NAME
mtx-bibtex - bibtex helpers
.SH SYNOPSIS
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 60d9450c194..ab1b1293c26 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-cache.man
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-cache.man
@@ -1,4 +1,4 @@
-.TH "mtx-cache" "1" "01-01-2021" "version 1.01" "ConTeXt & MetaTeX Cache Management"
+.TH "mtx-cache" "1" "01-01-2023" "version 1.01" "ConTeXt & MetaTeX Cache Management"
.SH NAME
mtx-cache - ConTeXt & MetaTeX Cache Management
.SH SYNOPSIS
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 407b3258d0b..059d419e252 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-chars.man
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-chars.man
@@ -1,4 +1,4 @@
-.TH "mtx-chars" "1" "01-01-2021" "version 0.10" "MkII Character Table Generators"
+.TH "mtx-chars" "1" "01-01-2023" "version 0.10" "MkII Character Table Generators"
.SH NAME
mtx-chars - MkII Character Table Generators
.SH SYNOPSIS
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 46f1e06f609..d41ba5c45cb 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-check.man
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-check.man
@@ -1,4 +1,4 @@
-.TH "mtx-check" "1" "01-01-2021" "version 0.10" "Basic ConTeXt Syntax Checking"
+.TH "mtx-check" "1" "01-01-2023" "version 0.10" "Basic ConTeXt Syntax Checking"
.SH NAME
mtx-check - Basic ConTeXt Syntax Checking
.SH SYNOPSIS
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 601572f9130..e072c8eda54 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-colors.man
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-colors.man
@@ -1,4 +1,4 @@
-.TH "mtx-colors" "1" "01-01-2021" "version 0.10" "ConTeXt Color Management"
+.TH "mtx-colors" "1" "01-01-2023" "version 0.10" "ConTeXt Color Management"
.SH NAME
mtx-colors - ConTeXt Color Management
.SH SYNOPSIS
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 682b8621fa6..035e3a7db88 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-context.html
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-context.html
@@ -89,7 +89,7 @@
<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>--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>
@@ -108,12 +108,17 @@
<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>
+ <tr><th>--keeppdf</th><td></td><td>keep previous pdf files (jobname-pdf-keep.tmp)</td></tr>
<tr><th>--keeplog</th><td></td><td>keep previous log files (jobname-log-[run].tmp)</td></tr>
<tr><th>--lmtx</th><td></td><td>force lmtx mode (when available)</td></tr>
<tr><th>--overloadmode=error|warning|0--6|255</th><td></td><td>enable csname overload checking</td></tr>
<tr><th/><td/><td/></tr>
<tr><th>--extra=name</th><td></td><td>process extra (mtx-context-... in distribution)</td></tr>
<tr><th>--extras</th><td></td><td>show extras</td></tr>
+ <tr><th/><td/><td/></tr>
+ <tr><th>--ownerpassword</th><td></td><td>encrypt the (pdf) file using this master password</td></tr>
+ <tr><th>--userpassword</th><td></td><td>use an additional password for opening the document</td></tr>
+ <tr><th>--permissions</th><td></td><td>list of: print, modify, extract, add, fillin, assemble, quality</td></tr>
<tr><th colspan="3">special</th></tr>
<tr><th/><td/><td/></tr>
<tr><th>--pdftex</th><td></td><td>process file with texexec using pdftex</td></tr>
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 7d9e949bb16..9a36d403c2b 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-context.man
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-context.man
@@ -1,4 +1,4 @@
-.TH "mtx-context" "1" "01-01-2021" "version 1.04" "ConTeXt Process Management"
+.TH "mtx-context" "1" "01-01-2023" "version 1.04" "ConTeXt Process Management"
.SH NAME
mtx-context - ConTeXt Process Management
.SH SYNOPSIS
@@ -129,7 +129,7 @@ run without stopping
never initializes synctex (for production runs)
.TP
.B --synctex
-run with synctex enabled (better use \setupsynctex[state=start]
+run with synctex enabled (better use \setupsynctex[state=start])
.TP
.B --nodates
omit runtime dates in pdf file (optional value: a number (this 1970 offset time) or string "YYYY-MM-DD HH:MM")
@@ -171,6 +171,9 @@ generate timing and statistics overview
.B --keeptuc
keep previous tuc files (jobname-tuc-[run].tmp)
.TP
+.B --keeppdf
+keep previous pdf files (jobname-pdf-keep.tmp)
+.TP
.B --keeplog
keep previous log files (jobname-log-[run].tmp)
.TP
@@ -185,6 +188,15 @@ process extra (mtx-context-... in distribution)
.TP
.B --extras
show extras
+.TP
+.B --ownerpassword
+encrypt the (pdf) file using this master password
+.TP
+.B --userpassword
+use an additional password for opening the document
+.TP
+.B --permissions
+list of: print, modify, extract, add, fillin, assemble, quality
.SH OPTIONS: SPECIAL
.TP
.B --pdftex
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 98a75244b12..bf341c21a9f 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-context.xml
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-context.xml
@@ -148,7 +148,7 @@
<short>never initializes synctex (for production runs)</short>
</flag>
<flag name="synctex">
- <short>run with synctex enabled (better use \setupsynctex[state=start]</short>
+ <short>run with synctex enabled (better use \setupsynctex[state=start])</short>
</flag>
</subcategory>
<subcategory>
@@ -202,6 +202,9 @@
<flag name="keeptuc">
<short>keep previous tuc files (jobname-tuc-[run].tmp)</short>
</flag>
+ <flag name="keeppdf">
+ <short>keep previous pdf files (jobname-pdf-keep.tmp)</short>
+ </flag>
<flag name="keeplog">
<short>keep previous log files (jobname-log-[run].tmp)</short>
</flag>
@@ -220,6 +223,17 @@
<short>show extras</short>
</flag>
</subcategory>
+ <subcategory>
+ <flag name="ownerpassword">
+ <short>encrypt the (pdf) file using this master password</short>
+ </flag>
+ <flag name="userpassword">
+ <short>use an additional password for opening the document</short>
+ </flag>
+ <flag name="permissions">
+ <short>list of: print, modify, extract, add, fillin, assemble, quality</short>
+ </flag>
+ </subcategory>
</category>
<category name="special">
<subcategory>
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 f5a46acd855..6719dc72c9a 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-dvi.man
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-dvi.man
@@ -1,4 +1,4 @@
-.TH "mtx-dvi" "1" "01-01-2021" "version 0.01" "ConTeXt DVI Helpers"
+.TH "mtx-dvi" "1" "01-01-2023" "version 0.01" "ConTeXt DVI Helpers"
.SH NAME
mtx-dvi - ConTeXt DVI Helpers
.SH SYNOPSIS
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 8c96f2a908b..3b53984c7b8 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-epub.man
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-epub.man
@@ -1,4 +1,4 @@
-.TH "mtx-epub" "1" "01-01-2021" "version 1.10" "ConTeXt EPUB Helpers"
+.TH "mtx-epub" "1" "01-01-2023" "version 1.10" "ConTeXt EPUB Helpers"
.SH NAME
mtx-epub - ConTeXt EPUB Helpers
.SH SYNOPSIS
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 c68a3072a1f..c415c5425a0 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-evohome.man
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-evohome.man
@@ -1,4 +1,4 @@
-.TH "mtx-evohome" "1" "01-01-2021" "version 1.00" "Evohome Fetcher"
+.TH "mtx-evohome" "1" "01-01-2023" "version 1.00" "Evohome Fetcher"
.SH NAME
mtx-evohome - Evohome Fetcher
.SH SYNOPSIS
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 1f0e99a2685..12ac2cd3b74 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-fcd.man
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-fcd.man
@@ -1,4 +1,4 @@
-.TH "mtx-fcd" "1" "01-01-2021" "version 1.00" "Fast Directory Change"
+.TH "mtx-fcd" "1" "01-01-2023" "version 1.00" "Fast Directory Change"
.SH NAME
mtx-fcd - Fast Directory Change
.SH SYNOPSIS
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 531a76fdb16..f6981986548 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-flac.man
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-flac.man
@@ -1,4 +1,4 @@
-.TH "mtx-flac" "1" "01-01-2021" "version 0.10" "ConTeXt Flac Helpers"
+.TH "mtx-flac" "1" "01-01-2023" "version 0.10" "ConTeXt Flac Helpers"
.SH NAME
mtx-flac - ConTeXt Flac Helpers
.SH SYNOPSIS
diff --git a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-fonts.html b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-fonts.html
index b175139c847..f3b7cfbf531 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-fonts.html
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-fonts.html
@@ -61,6 +61,8 @@
<br/>
<h1>Examples</h1>
<tt>mtxrun --script font --list somename (== --pattern=*somename*)</tt>
+<br/><br/><tt>mtxrun --script font --list --file filename</tt>
+<br/><tt>mtxrun --script font --list --name --pattern=*somefile*</tt>
<br/><br/><tt>mtxrun --script font --list --name somename</tt>
<br/><tt>mtxrun --script font --list --name --pattern=*somename*</tt>
<br/><br/><tt>mtxrun --script font --list --spec somename</tt>
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 44bdffa6451..16cd7f068f0 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-fonts.man
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-fonts.man
@@ -1,4 +1,4 @@
-.TH "mtx-fonts" "1" "01-01-2021" "version 1.00" "ConTeXt Font Database Management"
+.TH "mtx-fonts" "1" "01-01-2023" "version 1.00" "ConTeXt Font Database Management"
.SH NAME
mtx-fonts - ConTeXt Font Database Management
.SH SYNOPSIS
diff --git a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-fonts.xml b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-fonts.xml
index d001f4f9ae1..acb595a252a 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-fonts.xml
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-fonts.xml
@@ -39,6 +39,10 @@
<example><command>mtxrun --script font --list somename (== --pattern=*somename*)</command></example>
</subcategory>
<subcategory>
+ <example><command>mtxrun --script font --list --file filename</command></example>
+ <example><command>mtxrun --script font --list --name --pattern=*somefile*</command></example>
+ </subcategory>
+ <subcategory>
<example><command>mtxrun --script font --list --name somename</command></example>
<example><command>mtxrun --script font --list --name --pattern=*somename*</command></example>
</subcategory>
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 088ae186fe7..5114ec7e21e 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-grep.man
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-grep.man
@@ -1,4 +1,4 @@
-.TH "mtx-grep" "1" "01-01-2021" "version 0.10" "Simple Grepper"
+.TH "mtx-grep" "1" "01-01-2023" "version 0.10" "Simple Grepper"
.SH NAME
mtx-grep - Simple Grepper
.SH SYNOPSIS
diff --git a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-interface.html b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-interface.html
index a23a19b7d1b..3ce0a31b6fa 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-interface.html
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-interface.html
@@ -47,6 +47,7 @@
<tr><th>--bbedit</th><td></td><td>generate bbedit interface files</td></tr>
<tr><th>--jedit</th><td></td><td>generate jedit interface files</td></tr>
<tr><th>--textpad</th><td></td><td>generate textpad interface files</td></tr>
+ <tr><th>--vim</th><td></td><td>generate vim interface files</td></tr>
<tr><th>--text</th><td></td><td>create text files for commands and environments</td></tr>
<tr><th>--raw</th><td></td><td>report commands to the console</td></tr>
<tr><th>--check</th><td></td><td>generate check file</td></tr>
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 dfe416e78d7..f8aa9020642 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-interface.man
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-interface.man
@@ -1,4 +1,4 @@
-.TH "mtx-interface" "1" "01-01-2021" "version 0.13" "ConTeXt Interface Related Goodies"
+.TH "mtx-interface" "1" "01-01-2023" "version 0.13" "ConTeXt Interface Related Goodies"
.SH NAME
mtx-interface - ConTeXt Interface Related Goodies
.SH SYNOPSIS
@@ -29,6 +29,9 @@ generate jedit interface files
.B --textpad
generate textpad interface files
.TP
+.B --vim
+generate vim interface files
+.TP
.B --text
create text files for commands and environments
.TP
diff --git a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-interface.xml b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-interface.xml
index 6ffd3af736d..d1742ca68ca 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-interface.xml
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-interface.xml
@@ -18,6 +18,7 @@
<flag name="bbedit"><short>generate bbedit interface files</short></flag>
<flag name="jedit"><short>generate jedit interface files</short></flag>
<flag name="textpad"><short>generate textpad interface files</short></flag>
+ <flag name="vim"><short>generate vim interface files</short></flag>
<flag name="text"><short>create text files for commands and environments</short></flag>
<flag name="raw"><short>report commands to the console</short></flag>
<flag name="check"><short>generate check file</short></flag>
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 997f3873334..265a203e421 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-metapost.man
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-metapost.man
@@ -1,4 +1,4 @@
-.TH "mtx-metapost" "1" "01-01-2021" "version 0.10" "MetaPost to PDF processor"
+.TH "mtx-metapost" "1" "01-01-2023" "version 0.10" "MetaPost to PDF processor"
.SH NAME
mtx-metapost - MetaPost to PDF processor
.SH SYNOPSIS
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 6f2bfebcd7f..11629fedef9 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-modules.man
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-modules.man
@@ -1,4 +1,4 @@
-.TH "mtx-modules" "1" "01-01-2021" "version 1.00" "ConTeXt Module Documentation Generators"
+.TH "mtx-modules" "1" "01-01-2023" "version 1.00" "ConTeXt Module Documentation Generators"
.SH NAME
mtx-modules - ConTeXt Module Documentation Generators
.SH SYNOPSIS
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 92c1782635d..33ce616ed1e 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-package.man
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-package.man
@@ -1,4 +1,4 @@
-.TH "mtx-package" "1" "01-01-2021" "version 0.10" "Distribution Related Goodies"
+.TH "mtx-package" "1" "01-01-2023" "version 0.10" "Distribution Related Goodies"
.SH NAME
mtx-package - Distribution Related Goodies
.SH SYNOPSIS
diff --git a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-patterns.man b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-patterns.man
index d87f5887fdb..771c86f0a9c 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-patterns.man
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-patterns.man
@@ -1,4 +1,4 @@
-.TH "mtx-patterns" "1" "01-01-2021" "version 0.20" "ConTeXt Pattern File Management"
+.TH "mtx-patterns" "1" "01-01-2023" "version 0.20" "ConTeXt Pattern File Management"
.SH NAME
mtx-patterns - ConTeXt Pattern File Management
.SH SYNOPSIS
diff --git a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-pdf.html b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-pdf.html
index e724148ca8e..2932b942c53 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-pdf.html
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-pdf.html
@@ -43,6 +43,7 @@
<tr><th>--metadata</th><td></td><td>show metadata xml blob</td></tr>
<tr><th>--pretty</th><td></td><td>replace newlines in metadata</td></tr>
<tr><th>--fonts</th><td></td><td>show used fonts (--detail)</td></tr>
+ <tr><th>--object</th><td></td><td>show object"/></td></tr>
<tr><th/><td/><td/></tr>
</table>
<br/>
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 1535c8af80f..54fdb6d14f4 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-pdf.man
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-pdf.man
@@ -1,4 +1,4 @@
-.TH "mtx-pdf" "1" "01-01-2021" "version 0.10" "ConTeXt PDF Helpers"
+.TH "mtx-pdf" "1" "01-01-2023" "version 0.10" "ConTeXt PDF Helpers"
.SH NAME
mtx-pdf - ConTeXt PDF Helpers
.SH SYNOPSIS
@@ -22,6 +22,9 @@ replace newlines in metadata
.TP
.B --fonts
show used fonts (--detail)
+.TP
+.B --object
+show object"/>
.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-pdf.xml b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-pdf.xml
index 9b3d8f8fec3..08b04d85e0c 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-pdf.xml
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-pdf.xml
@@ -12,11 +12,13 @@
<flag name="metadata"><short>show metadata xml blob</short></flag>
<flag name="pretty"><short>replace newlines in metadata</short></flag>
<flag name="fonts"><short>show used fonts (<ref name="detail)"/></short></flag>
+ <flag name="object"><short>show object"/></short></flag>
</subcategory>
<subcategory>
<example><command>mtxrun --script pdf --info foo.pdf</command></example>
<example><command>mtxrun --script pdf --metadata foo.pdf</command></example>
<example><command>mtxrun --script pdf --metadata --pretty foo.pdf</command></example>
+ <example><command>mtxrun --script pdf --stream=4 foo.pdf</command></example>
</subcategory>
</category>
</flags>
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 9874cf6c63d..c1af287c71c 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-plain.man
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-plain.man
@@ -1,4 +1,4 @@
-.TH "mtx-plain" "1" "01-01-2021" "version 1.00" "Plain TeX Runner"
+.TH "mtx-plain" "1" "01-01-2023" "version 1.00" "Plain TeX Runner"
.SH NAME
mtx-plain - Plain TeX Runner
.SH SYNOPSIS
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 a04a23d6ec0..13067b503fd 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-profile.man
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-profile.man
@@ -1,4 +1,4 @@
-.TH "mtx-profile" "1" "01-01-2021" "version 1.00" "ConTeXt MkIV LuaTeX Profiler"
+.TH "mtx-profile" "1" "01-01-2023" "version 1.00" "ConTeXt MkIV LuaTeX Profiler"
.SH NAME
mtx-profile - ConTeXt MkIV LuaTeX Profiler
.SH SYNOPSIS
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 510775ba6ce..b9e5002354c 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-rsync.man
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-rsync.man
@@ -1,4 +1,4 @@
-.TH "mtx-rsync" "1" "01-01-2021" "version 0.10" "Rsync Helpers"
+.TH "mtx-rsync" "1" "01-01-2023" "version 0.10" "Rsync Helpers"
.SH NAME
mtx-rsync - Rsync Helpers
.SH SYNOPSIS
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 fbe640f6e10..3de8ea5876a 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-scite.man
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-scite.man
@@ -1,4 +1,4 @@
-.TH "mtx-scite" "1" "01-01-2021" "version 1.00" "Scite Helper Script"
+.TH "mtx-scite" "1" "01-01-2023" "version 1.00" "Scite Helper Script"
.SH NAME
mtx-scite - Scite Helper Script
.SH SYNOPSIS
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 ea9e8fee950..5fa9da9cafa 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-server.man
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-server.man
@@ -1,4 +1,4 @@
-.TH "mtx-server" "1" "01-01-2021" "version 0.10" "Simple Webserver For Helpers"
+.TH "mtx-server" "1" "01-01-2023" "version 0.10" "Simple Webserver For Helpers"
.SH NAME
mtx-server - Simple Webserver For Helpers
.SH SYNOPSIS
diff --git a/Master/texmf-dist/doc/context/scripts/mkii/pstopdf.html b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-spell.html
index 4470e61766e..5590ffd1a13 100644
--- a/Master/texmf-dist/doc/context/scripts/mkii/pstopdf.html
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-spell.html
@@ -14,7 +14,7 @@
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head>
- <title>PStoPDF 2.0.1</title>
+ <title>ConTeXt Word Filtering 0.10</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">PStoPDF 2.0.1 </div>
+ <div id="top-two">ConTeXt Word Filtering 0.10 </div>
</div>
</div>
<div id="bottom"> <div id="bottom-one">
@@ -39,11 +39,15 @@
<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>--request</th><td></td><td>handles exa request file</td></tr>
- <tr><th>--watch</th><td></td><td>watch folders for conversions (untested)</td></tr>
+ <tr><th>--expand</th><td></td><td>expand hunspell dics and aff files</td></tr>
+ <tr><th>--dictionary</th><td></td><td>word file (.dics)</td></tr>
+ <tr><th>--specification</th><td></td><td>affix specification file (.aff)</td></tr>
+ <tr><th>--result</th><td></td><td>destination file</td></tr>
</table>
<br/>
- </div>
+<h1>Examples</h1>
+<tt>mtxrun --script spell --expand --dictionary="en_US.dic" --specification="en_US.txt" --result="data-us.txt"</tt>
+<br/><br/> </div>
</div>
</body>
</html>
diff --git a/Master/texmf-dist/doc/context/scripts/mkii/tmftools.man b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-spell.man
index d51933e7353..578fde17dc2 100644
--- a/Master/texmf-dist/doc/context/scripts/mkii/tmftools.man
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-spell.man
@@ -1,21 +1,27 @@
-.TH "tmftools" "1" "01-01-2021" "version 1.1.0" "TMFTools"
+.TH "mtx-spell" "1" "01-01-2023" "version 0.10" "ConTeXt Word Filtering"
.SH NAME
- tmftools - TMFTools
+ mtx-spell - ConTeXt Word Filtering
.SH SYNOPSIS
-.B tmftools [
+.B mtxrun --script spell [
.I OPTIONS ...
.B ] [
.I FILENAMES
.B ]
.SH DESCRIPTION
-.B TMFTools
+.B ConTeXt Word Filtering
.SH OPTIONS
.TP
-.B --analyze
-[--strict --sort --rootpath --treepath --delete --force] [pattern]
+.B --expand
+expand hunspell dics and aff files
.TP
-.B --serve
-act as kpse server
+.B --dictionary
+word file (.dics)
+.TP
+.B --specification
+affix specification file (.aff)
+.TP
+.B --result
+destination file
.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-spell.xml b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-spell.xml
new file mode 100644
index 00000000000..9fc3fe859b7
--- /dev/null
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-spell.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0"?>
+<application>
+ <metadata>
+ <entry name="name">mtx-spell</entry>
+ <entry name="detail">ConTeXt Word Filtering</entry>
+ <entry name="version">0.10</entry>
+ </metadata>
+ <flags>
+ <category name="basic">
+ <subcategory>
+ <flag name="expand"><short>expand hunspell dics and aff files</short></flag>
+ <flag name="dictionary"><short>word file (.dics)</short></flag>
+ <flag name="specification"><short>affix specification file (.aff)</short></flag>
+ <flag name="result"><short>destination file</short></flag>
+ </subcategory>
+ </category>
+ </flags>
+ <examples>
+ <category>
+ <title>Examples</title>
+ <subcategory>
+ <example><command>mtxrun --script spell --expand --dictionary="en_US.dic" --specification="en_US.txt" --result="data-us.txt"</command></example>
+ </subcategory>
+ </category>
+ </examples>
+</application>
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 64fbece5ab9..0416a11b65d 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-texworks.man
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-texworks.man
@@ -1,4 +1,4 @@
-.TH "mtx-texworks" "1" "01-01-2021" "version 1.00" "TeXworks Startup Script"
+.TH "mtx-texworks" "1" "01-01-2023" "version 1.00" "TeXworks Startup Script"
.SH NAME
mtx-texworks - TeXworks Startup Script
.SH SYNOPSIS
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 852fd8ce8e8..31b2671c99b 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-timing.man
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-timing.man
@@ -1,4 +1,4 @@
-.TH "mtx-timing" "1" "01-01-2021" "version 0.10" "ConTeXt Timing Tools"
+.TH "mtx-timing" "1" "01-01-2023" "version 0.10" "ConTeXt Timing Tools"
.SH NAME
mtx-timing - ConTeXt Timing Tools
.SH SYNOPSIS
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 e2a74d420e2..10751133d80 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-tools.man
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-tools.man
@@ -1,4 +1,4 @@
-.TH "mtx-tools" "1" "01-01-2021" "version 1.01" "Some File Related Goodies"
+.TH "mtx-tools" "1" "01-01-2023" "version 1.01" "Some File Related Goodies"
.SH NAME
mtx-tools - Some File Related Goodies
.SH SYNOPSIS
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 605d634898f..651a4c07627 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-unicode.man
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-unicode.man
@@ -1,4 +1,4 @@
-.TH "mtx-unicode" "1" "01-01-2021" "version 1.02" "Checker for char-dat.lua"
+.TH "mtx-unicode" "1" "01-01-2023" "version 1.02" "Checker for char-dat.lua"
.SH NAME
mtx-unicode - Checker for char-dat.lua
.SH SYNOPSIS
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 98b17733485..59725ff8376 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-unzip.man
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-unzip.man
@@ -1,4 +1,4 @@
-.TH "mtx-unzip" "1" "01-01-2021" "version 0.10" "Simple Unzipper"
+.TH "mtx-unzip" "1" "01-01-2023" "version 0.10" "Simple Unzipper"
.SH NAME
mtx-unzip - Simple Unzipper
.SH SYNOPSIS
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 ccff02f91f4..83079fb4013 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-update.man
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-update.man
@@ -1,4 +1,4 @@
-.TH "mtx-update" "1" "01-01-2021" "version 1.03" "ConTeXt Minimals Updater"
+.TH "mtx-update" "1" "01-01-2023" "version 1.03" "ConTeXt Minimals Updater"
.SH NAME
mtx-update - ConTeXt Minimals Updater
.SH SYNOPSIS
diff --git a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-vscode.html b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-vscode.html
index 32a6d5e74c5..7dccefd49ae 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-vscode.html
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-vscode.html
@@ -40,13 +40,16 @@
<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>--program</th><td></td><td>use the given binary (e.g. codium, default: code)</td></tr>
<tr><th>--start</th><td></td><td>start vscode with extension context</td></tr>
+ <tr><th>--lsfile</th><td></td><td>generate language server file (work in progress)</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/><tt>mtxrun --script vscode --program=codium --start</tt>
<br/><br/> </div>
</div>
</body>
diff --git a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-vscode.man b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-vscode.man
index 7ac13328f9f..df9c4f9baaa 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-vscode.man
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-vscode.man
@@ -1,4 +1,4 @@
-.TH "mtx-vscode" "1" "01-01-2021" "version 1.00" "vscode extension generator"
+.TH "mtx-vscode" "1" "01-01-2023" "version 1.00" "vscode extension generator"
.SH NAME
mtx-vscode - vscode extension generator
.SH SYNOPSIS
@@ -14,8 +14,14 @@
.B --generate
generate extension in sync with current version
.TP
+.B --program
+use the given binary (e.g. codium, default: code)
+.TP
.B --start
start vscode with extension context
+.TP
+.B --lsfile
+generate language server file (work in progress)
.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-vscode.xml b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-vscode.xml
index c4cf3167e4f..c9f1e62b177 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-vscode.xml
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-vscode.xml
@@ -9,7 +9,9 @@
<category name="basic">
<subcategory>
<flag name="generate"><short>generate extension in sync with current version</short></flag>
+ <flag name="program"><short>use the given binary (e.g. codium, default: code)</short></flag>
<flag name="start"><short>start vscode with extension context</short></flag>
+ <flag name="lsfile"><short>generate language server file (work in progress)</short></flag>
</subcategory>
</category>
</flags>
@@ -20,6 +22,7 @@
<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>
+ <example><command>mtxrun --script vscode --program=codium --start</command></example>
</subcategory>
</category>
</examples>
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 bfa525b4b86..8ca17920e66 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-watch.man
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-watch.man
@@ -1,4 +1,4 @@
-.TH "mtx-watch" "1" "01-01-2021" "version 1.00" "ConTeXt Request Watchdog"
+.TH "mtx-watch" "1" "01-01-2023" "version 1.00" "ConTeXt Request Watchdog"
.SH NAME
mtx-watch - ConTeXt Request Watchdog
.SH SYNOPSIS
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 e88c2d0e18c..0f53b233ba4 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtx-youless.man
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtx-youless.man
@@ -1,4 +1,4 @@
-.TH "mtx-youless" "1" "01-01-2021" "version 1.100" "youless Fetcher"
+.TH "mtx-youless" "1" "01-01-2023" "version 1.100" "youless Fetcher"
.SH NAME
mtx-youless - youless Fetcher
.SH SYNOPSIS
diff --git a/Master/texmf-dist/doc/context/scripts/mkiv/mtxrun.man b/Master/texmf-dist/doc/context/scripts/mkiv/mtxrun.man
index 6ed2acf8a17..644ceefd1e2 100644
--- a/Master/texmf-dist/doc/context/scripts/mkiv/mtxrun.man
+++ b/Master/texmf-dist/doc/context/scripts/mkiv/mtxrun.man
@@ -1,4 +1,4 @@
-.TH "mtxrun" "1" "01-01-2021" "version 1.33" "ConTeXt TDS Runner Tool"
+.TH "mtxrun" "1" "01-01-2023" "version 1.33" "ConTeXt TDS Runner Tool"
.SH NAME
mtxrun - ConTeXt TDS Runner Tool
.SH SYNOPSIS
diff --git a/Master/texmf-dist/doc/context/sources/general/magazines/mag-0000-mkiv.tex b/Master/texmf-dist/doc/context/sources/general/magazines/mag-0000-mkiv.tex
index c24d4c4adb4..a993f8c87b7 100644
--- a/Master/texmf-dist/doc/context/sources/general/magazines/mag-0000-mkiv.tex
+++ b/Master/texmf-dist/doc/context/sources/general/magazines/mag-0000-mkiv.tex
@@ -1,7 +1,7 @@
-% language=uk
+% language=us
% author : Hans Hagen
-% copyright : PRAGMA ADE & ConTeXt Development Team
+% copyright : ConTeXt Development Team
% license : Creative Commons Attribution ShareAlike 4.0 International
% reference : pragma-ade.nl | contextgarden.net | texlive (related) distributions
% origin : the ConTeXt distribution
diff --git a/Master/texmf-dist/doc/context/sources/general/magazines/mag-0002-mkiv.tex b/Master/texmf-dist/doc/context/sources/general/magazines/mag-0002-mkiv.tex
index cbc49ac8287..d0d7251ec9b 100644
--- a/Master/texmf-dist/doc/context/sources/general/magazines/mag-0002-mkiv.tex
+++ b/Master/texmf-dist/doc/context/sources/general/magazines/mag-0002-mkiv.tex
@@ -1,7 +1,7 @@
-% language=uk
+% language=us
% author : Hans Hagen
-% copyright : PRAGMA ADE & ConTeXt Development Team
+% copyright : ConTeXt Development Team
% license : Creative Commons Attribution ShareAlike 4.0 International
% reference : pragma-ade.nl | contextgarden.net | texlive (related) distributions
% origin : the ConTeXt distribution
diff --git a/Master/texmf-dist/doc/context/sources/general/magazines/mag-0006-mkiv.tex b/Master/texmf-dist/doc/context/sources/general/magazines/mag-0006-mkiv.tex
index 8baa5e003b7..ed337ec4b5f 100644
--- a/Master/texmf-dist/doc/context/sources/general/magazines/mag-0006-mkiv.tex
+++ b/Master/texmf-dist/doc/context/sources/general/magazines/mag-0006-mkiv.tex
@@ -1,7 +1,7 @@
-% language=uk
+% language=us
% author : Hans Hagen
-% copyright : PRAGMA ADE & ConTeXt Development Team
+% copyright : ConTeXt Development Team
% license : Creative Commons Attribution ShareAlike 4.0 International
% reference : pragma-ade.nl | contextgarden.net | texlive (related) distributions
% origin : the ConTeXt distribution
diff --git a/Master/texmf-dist/doc/context/sources/general/magazines/mag-0007-mkiv.tex b/Master/texmf-dist/doc/context/sources/general/magazines/mag-0007-mkiv.tex
index 885d3cb14ab..c81db20e729 100644
--- a/Master/texmf-dist/doc/context/sources/general/magazines/mag-0007-mkiv.tex
+++ b/Master/texmf-dist/doc/context/sources/general/magazines/mag-0007-mkiv.tex
@@ -1,7 +1,7 @@
-% language=uk
+% language=us
% author : Hans Hagen
-% copyright : PRAGMA ADE & ConTeXt Development Team
+% copyright : ConTeXt Development Team
% license : Creative Commons Attribution ShareAlike 4.0 International
% reference : pragma-ade.nl | contextgarden.net | texlive (related) distributions
% origin : the ConTeXt distribution
diff --git a/Master/texmf-dist/doc/context/sources/general/magazines/mag-0010-mkiv.tex b/Master/texmf-dist/doc/context/sources/general/magazines/mag-0010-mkiv.tex
index 65c20180c68..d978bd9f519 100644
--- a/Master/texmf-dist/doc/context/sources/general/magazines/mag-0010-mkiv.tex
+++ b/Master/texmf-dist/doc/context/sources/general/magazines/mag-0010-mkiv.tex
@@ -1,7 +1,7 @@
-% language=uk
+% language=us
% author : Hans Hagen
-% copyright : PRAGMA ADE & ConTeXt Development Team
+% copyright : ConTeXt Development Team
% license : Creative Commons Attribution ShareAlike 4.0 International
% reference : pragma-ade.nl | contextgarden.net | texlive (related) distributions
% origin : the ConTeXt distribution
diff --git a/Master/texmf-dist/doc/context/sources/general/magazines/mag-1101-mkiv.tex b/Master/texmf-dist/doc/context/sources/general/magazines/mag-1101-mkiv.tex
index f56dbfe3915..92677e6e300 100644
--- a/Master/texmf-dist/doc/context/sources/general/magazines/mag-1101-mkiv.tex
+++ b/Master/texmf-dist/doc/context/sources/general/magazines/mag-1101-mkiv.tex
@@ -1,7 +1,7 @@
-% language=uk
+% language=us
% author : Hans Hagen
-% copyright : PRAGMA ADE & ConTeXt Development Team
+% copyright : ConTeXt Development Team
% license : Creative Commons Attribution ShareAlike 4.0 International
% reference : pragma-ade.nl | contextgarden.net | texlive (related) distributions
% origin : the ConTeXt distribution
diff --git a/Master/texmf-dist/doc/context/sources/general/magazines/mag-1102-mkiv.tex b/Master/texmf-dist/doc/context/sources/general/magazines/mag-1102-mkiv.tex
index ad9dcc5f9bf..31c12530531 100644
--- a/Master/texmf-dist/doc/context/sources/general/magazines/mag-1102-mkiv.tex
+++ b/Master/texmf-dist/doc/context/sources/general/magazines/mag-1102-mkiv.tex
@@ -1,7 +1,7 @@
-% language=uk
+% language=us
% author : Hans Hagen
-% copyright : PRAGMA ADE & ConTeXt Development Team
+% copyright : ConTeXt Development Team
% license : Creative Commons Attribution ShareAlike 4.0 International
% reference : pragma-ade.nl | contextgarden.net | texlive (related) distributions
% origin : the ConTeXt distribution
diff --git a/Master/texmf-dist/doc/context/sources/general/magazines/mag-1103-mkiv.tex b/Master/texmf-dist/doc/context/sources/general/magazines/mag-1103-mkiv.tex
index 90a5f084870..6ebaf791840 100644
--- a/Master/texmf-dist/doc/context/sources/general/magazines/mag-1103-mkiv.tex
+++ b/Master/texmf-dist/doc/context/sources/general/magazines/mag-1103-mkiv.tex
@@ -1,7 +1,7 @@
-% language=uk
+% language=us
% author : Hans Hagen
-% copyright : PRAGMA ADE & ConTeXt Development Team
+% copyright : ConTeXt Development Team
% license : Creative Commons Attribution ShareAlike 4.0 International
% reference : pragma-ade.nl | contextgarden.net | texlive (related) distributions
% origin : the ConTeXt distribution
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
index ef46b6fe113..70b27d8501b 100644
--- 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
@@ -1,5 +1,5 @@
% author : Hans Hagen
-% copyright : PRAGMA ADE & ConTeXt Development Team
+% copyright : ConTeXt Development Team
% license : Creative Commons Attribution ShareAlike 4.0 International
% reference : pragma-ade.nl | contextgarden.net | texlive (related) distributions
% origin : the ConTeXt distribution
diff --git a/Master/texmf-dist/doc/context/sources/general/magazines/mag-1105-mkiv.tex b/Master/texmf-dist/doc/context/sources/general/magazines/mag-1105-mkiv.tex
index b068f517b38..1daca6763f3 100644
--- a/Master/texmf-dist/doc/context/sources/general/magazines/mag-1105-mkiv.tex
+++ b/Master/texmf-dist/doc/context/sources/general/magazines/mag-1105-mkiv.tex
@@ -1,5 +1,5 @@
% author : Hans Hagen
-% copyright : PRAGMA ADE & ConTeXt Development Team
+% copyright : ConTeXt Development Team
% license : Creative Commons Attribution ShareAlike 4.0 International
% reference : pragma-ade.nl | contextgarden.net | texlive (related) distributions
% origin : the ConTeXt distribution
@@ -192,3 +192,25 @@ The result is:
\stoplinecorrection
\stopdocument
+
+% \protected\def\guessbestwidth#1#2#3%
+% {\beginlocalcontrol
+% \begingroup
+% \hsize#1\relax
+% \setbox\scratchboxone\hbox\bgroup#3\egroup
+% \doloop {%
+% \setbox\scratchboxtwo\vbox\bgroup\unhcopy\scratchboxone\egroup
+% \scratchcounter\boxlines\scratchboxtwo
+% \ifdim\boxlinenw\scratchboxtwo\scratchcounter<\boxlinewd\scratchboxtwo\scratchcounter
+% \advance\hsize-#2\relax
+% \else
+% \exitloop
+% \fi
+% }%
+% \normalexpanded{\endgroup\endlocalcontrol\dimexpr\the\hsize\relax}}
+%
+% \hsize \guessbestwidth{10cm}{1mm}{\input{ward}}
+%
+% \input{ward}
+%
+% \the\guessbestwidth{10cm}{1mm}{\input{ward}}
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/about/about-calls.tex b/Master/texmf-dist/doc/context/sources/general/manuals/about/about-calls.tex
index 83bf89aad75..b4274f02d73 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/about/about-calls.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/about/about-calls.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
\startcomponent about-calls
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/about/about-contents.tex b/Master/texmf-dist/doc/context/sources/general/manuals/about/about-contents.tex
index 0b8cdad97b0..15c31e8e21f 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/about/about-contents.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/about/about-contents.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
\startcomponent about-contents
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/about/about-expanding.tex b/Master/texmf-dist/doc/context/sources/general/manuals/about/about-expanding.tex
index 6f643ffad1d..9d122928b5e 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/about/about-expanding.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/about/about-expanding.tex
@@ -1,4 +1,4 @@
-% engine=luatex macros=mkvi language=uk
+% engine=luatex macros=mkvi language=us
\startcomponent about-exploring
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/about/about-hashing.tex b/Master/texmf-dist/doc/context/sources/general/manuals/about/about-hashing.tex
index 3a9a74c61e5..adc15daafa6 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/about/about-hashing.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/about/about-hashing.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
\startcomponent about-hashing
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/about/about-hz.tex b/Master/texmf-dist/doc/context/sources/general/manuals/about/about-hz.tex
index 5f3d6c6b4ac..ed6222a992b 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/about/about-hz.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/about/about-hz.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
\startcomponent about-hz
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/about/about-introduction.tex b/Master/texmf-dist/doc/context/sources/general/manuals/about/about-introduction.tex
index 92b386a756b..89a134818f4 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/about/about-introduction.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/about/about-introduction.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
\startcomponent about-introduction
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/about/about-jitting.tex b/Master/texmf-dist/doc/context/sources/general/manuals/about/about-jitting.tex
index 4a8bc763a2e..e4dbc63968f 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/about/about-jitting.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/about/about-jitting.tex
@@ -1,4 +1,4 @@
-% language=uk engine=luajittex
+% language=us engine=luajittex
\startluacode
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/about/about-luafunctions.tex b/Master/texmf-dist/doc/context/sources/general/manuals/about/about-luafunctions.tex
index 810de10fdf5..7710b674392 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/about/about-luafunctions.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/about/about-luafunctions.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
\startcomponent about-properties
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/about/about-mathstackers.tex b/Master/texmf-dist/doc/context/sources/general/manuals/about/about-mathstackers.tex
index 07fadf102ae..ad2723902ec 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/about/about-mathstackers.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/about/about-mathstackers.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
\startcomponent about-mathstackers
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/about/about-mathstyles.tex b/Master/texmf-dist/doc/context/sources/general/manuals/about/about-mathstyles.tex
index 205e985610b..130ca140b92 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/about/about-mathstyles.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/about/about-mathstyles.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
\startcomponent about-speed
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/about/about-metafun.tex b/Master/texmf-dist/doc/context/sources/general/manuals/about/about-metafun.tex
index bc298e9954d..073307cc1f2 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/about/about-metafun.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/about/about-metafun.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
\startcomponent about-metafun
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/about/about-mobility.tex b/Master/texmf-dist/doc/context/sources/general/manuals/about/about-mobility.tex
index c844ea2f78b..834231e31b3 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/about/about-mobility.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/about/about-mobility.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
\startcomponent about-mobility
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/about/about-nodes.tex b/Master/texmf-dist/doc/context/sources/general/manuals/about/about-nodes.tex
index f365f1fc4ef..5107fc979dd 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/about/about-nodes.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/about/about-nodes.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
\usemodule[nodechart]
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/about/about-nuts.tex b/Master/texmf-dist/doc/context/sources/general/manuals/about/about-nuts.tex
index 9ca1ba34574..5e3165f2c1d 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/about/about-nuts.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/about/about-nuts.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
\startcomponent about-calls
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/about/about-properties.tex b/Master/texmf-dist/doc/context/sources/general/manuals/about/about-properties.tex
index 07bb2924ceb..6fcce1bd2a2 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/about/about-properties.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/about/about-properties.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
\startcomponent about-properties
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/about/about-speed.tex b/Master/texmf-dist/doc/context/sources/general/manuals/about/about-speed.tex
index 4b4a376e831..6d67eb03837 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/about/about-speed.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/about/about-speed.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
\startcomponent about-speed
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/about/about-threequarters.tex b/Master/texmf-dist/doc/context/sources/general/manuals/about/about-threequarters.tex
index fe6f4a95b90..83a2b7ee0d1 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/about/about-threequarters.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/about/about-threequarters.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
\startcomponent about-calls
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/about/about.tex b/Master/texmf-dist/doc/context/sources/general/manuals/about/about.tex
index 65e5fde2c6f..b23f1d5df8f 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/about/about.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/about/about.tex
@@ -1,5 +1,5 @@
% author : Hans Hagen
-% copyright : PRAGMA ADE & ConTeXt Development Team
+% copyright : ConTeXt Development Team
% license : Creative Commons Attribution ShareAlike 4.0 International
% reference : pragma-ade.nl | contextgarden.net | texlive (related) distributions
% origin : the ConTeXt distribution
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
index 21c318dff37..fd83341978c 100644
--- 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
@@ -1,4 +1,4 @@
-% language=us
+% language=us runpath=texruns:manuals/bidi
\startcomponent bidi-contents
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
index bfedd8f4745..e4b7944fc79 100644
--- 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
@@ -1,4 +1,4 @@
-% language=us
+% language=us runpath=texruns:manuals/bidi
\startcomponent bidi-fonts
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
index 5ea0f98798a..d20b5f69b50 100644
--- 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
@@ -1,4 +1,4 @@
-% language=us
+% language=us runpath=texruns:manuals/bidi
\startcomponent bidi-introduction
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
index beb93b6049a..2c542dd1eab 100644
--- 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
@@ -1,4 +1,4 @@
-% language=us
+% language=us runpath=texruns:manuals/bidi
\startcomponent bidi-lua
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
index 851d6d8b4ef..8faf7d913f1 100644
--- 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
@@ -1,4 +1,4 @@
-% language=us
+% language=us runpath=texruns:manuals/bidi
\startcomponent bidi-mixed
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
index c328d6a1a65..ded26ba54cb 100644
--- 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
@@ -1,4 +1,4 @@
-% language=us
+% language=us runpath=texruns:manuals/bidi
\startcomponent bidi-numbering
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
index 1ce4e3b799c..f61d940b7b1 100644
--- 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
@@ -1,3 +1,5 @@
+% language=us runpath=texruns:manuals/bidi
+
\startenvironment bidi-style
\usemodule[abr-04]
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
index a80851aea89..21d90991635 100644
--- 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
@@ -1,3 +1,5 @@
+% language=us runpath=texruns:manuals/bidi
+
\startcomponent bidi-titlepage
\environment bidi-style
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
index 824d7a033f8..900eac5a675 100644
--- 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
@@ -1,4 +1,4 @@
-% language=us
+% language=us runpath=texruns:manuals/bidi
\startcomponent bidi-vertical
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 c6fedacdfa4..7062731fab9 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,6 +1,8 @@
-% 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.
+% language=us runpath=texruns:manuals/bidi
+
+% 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. Future versions might include Idris' long due bidi onthology.
\environment bidi-style
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/canbedone/canbedone-periods.tex b/Master/texmf-dist/doc/context/sources/general/manuals/canbedone/canbedone-periods.tex
new file mode 100644
index 00000000000..3ddb4545c30
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/canbedone/canbedone-periods.tex
@@ -0,0 +1,157 @@
+% language=us runpath=texruns:manuals/canbedone
+
+\environment canbedone-style
+
+% \showframe
+
+\startdocument
+ [title=periods,
+ color=middlered]
+
+\startsectionlevel[title=Introduction]
+
+When the \TEX\ program showed up there were not many fonts that could be used so
+it came with its own fonts and because the number of slots in the encoding was
+limited (first to 127, later to 255) there was no space characters. It was not
+needed anyway because the engine uses a model of glue between words. So, instead
+of fixed spacing, \TEX\ uses flexible spacing. In addition to what is normally
+considered a word space, spacing is also determined by the so called space factor
+of characters preceding spaces. But, especially after abbreviations with periods
+you might want something different depending on the usage of the period. Here we
+discuss how that can be done.
+
+\stopsectionlevel
+
+\startsectionlevel[title=Font related spacing]
+
+Spacing is controlled by the amount specified in the font in the so called
+font dimensions. In \CONTEXT\ these can be accessed via macros:
+
+\starttabulate[||c|c|c|c|]
+\BC \NC \tf normal space
+ \NC \bf bold space
+ \NC \it italic space
+ \NC \bi bolditalic space \NC \NR
+\NC \tex{interwordspace} \NC {\tf \expandafter}\the\interwordspace
+ \NC {\bf \expandafter}\the\interwordspace
+ \NC {\it \expandafter}\the\interwordspace
+ \NC {\bi \expandafter}\the\interwordspace \NC \NR
+\NC \tex{interwordstretch} \NC {\tf \expandafter}\the\interwordstretch
+ \NC {\bf \expandafter}\the\interwordstretch
+ \NC {\it \expandafter}\the\interwordstretch
+ \NC {\bi \expandafter}\the\interwordstretch \NC \NR
+\NC \tex{interwordshrink} \NC {\tf \expandafter}\the\interwordshrink
+ \NC {\it \expandafter}\the\interwordshrink
+ \NC {\bi \expandafter}\the\interwordshrink
+ \NC {\bf \expandafter}\the\interwordshrink \NC \NR
+\stoptabulate
+
+The differences in the three components are subtle but often of no concern to the
+user. Stretch and shrink kicks in when we align the left and right edge,
+otherwise they are basically ignored. These spacing properties are very specific
+for \TEX\ fonts, they don't come with for instance \OPENTYPE\ fonts. There we
+derive the stretch and shrink from the regular font space (\UNICODE\ slot U+00020
+or \ASCII\ value 32).
+
+A user can tweak the interword spacing with \type {\spaceskip} and \type
+{\xspaceskip} which works together with the \type {\spacefactor} and (character
+specific)\type {\sfcode} values. And as it is somewhat hard to explain the
+details involved I just refer to Chapter~25 (Spacing) of \TEX\ by Topic.
+
+\stopsectionlevel
+
+\startsectionlevel[title=Spacing after periods]
+
+For this manual it's only important to know that the space factors influence the
+spacing after uppercase letters and punctuation and the later aspect is what this
+is about.
+
+\startbuffer[a]
+\frenchspacing This is a t.e.s.t. for periods. Does it work?
+\vskip-.8\lineheight
+\nonfrenchspacing \blue This is a t.e.s.t. for periods. Does it work?
+\stopbuffer
+
+\startbuffer[b]
+\frenchspacing This is a t.e.s.t.\ for periods. Does it work?
+\vskip-.8\lineheight
+\nonfrenchspacing \green This is a t.e.s.t.\ for periods. Does it work?
+\stopbuffer
+
+\startbuffer[c]
+\frenchspacing This is a t.e.s.t\fsp. for periods. Does it work?
+\vskip-.8\lineheight
+\nonfrenchspacing \red This is a t.e.s.t\fsp. for periods. Does it work?
+\stopbuffer
+
+\startbuffer[d]
+\setperiodkerning[zerospaceperiods]
+\frenchspacing This is a t.e.s.t. for periods. Does it work?
+\vskip-.8\lineheight
+\nonfrenchspacing \red This is a t.e.s.t. for periods. Does it work?
+\stopbuffer
+
+\typebuffer[a] \start \forgetall \resetperiodkerning \getbuffer[a] \stop
+
+You will notice that the spacing after \type {t.e.s.t.} is as flexible as
+the space after \type {periods.} but what if you don't want that? There are
+several ways to influence the following space:
+
+\typebuffer[b] \start \forgetall \resetperiodkerning \getbuffer[b] \stop
+
+The \type {\fsp} macro looks ahead and adapts the space factor:
+
+\typebuffer[c] \start \forgetall \resetperiodkerning \getbuffer[c] \stop
+
+\stopsectionlevel
+
+\startsectionlevel[title=Automation]
+
+Where the manual (explicit) making sure we get spacing right is quite
+robust and predictable a user might be willing to delegate the task to
+\CONTEXT, and here is the trick:
+
+\typebuffer[d] \start \forgetall \resetperiodkerning \getbuffer[d] \stop
+
+This features has been present from mid 2017 but I admit that till now I never
+used it. Reasons are that it makes no sense to adapt existing documents and when
+a text is for instance meant for a user group journal too, you cannot expect this
+automatic feature to be present in the macro package used for typesetting it. But
+maybe it's time to change that policy. I also admit that I seldom have this
+situation, probably the only few cases are abbreviations like \type {e.g.} (for
+example) and \type {c.q.} (casu quo).
+
+There are a few predefined period kerning variants and you can define more if you
+want:
+
+\starttyping
+\defineperiodkerning [zerospaceperiods] [factor=0]
+\defineperiodkerning [smallspaceperiods] [factor=.25]
+\defineperiodkerning [halfspaceperiods] [factor=.5]
+\stoptyping
+
+\startbuffer[e]
+\setperiodkerning[zerospaceperiods]
+\frenchspacing How about c.q. and e.g. within a sentence?
+\vskip-.8\lineheight
+\nonfrenchspacing \red How about c.q. and e.g. within a sentence?
+\stopbuffer
+
+\typebuffer[e] \start \forgetall \getbuffer[e] \stop
+
+Of course one needs to keep an eye on the results because one never knows if the
+heuristics are flawed. And if needed it can be improved.
+
+\stopsectionlevel
+
+\startsectionlevel[title=Todo]
+
+{\em more spacing related features}
+
+% optionalspace
+% autoinsertspace
+% ~
+
+\stopsectionlevel
+
+\stopdocument
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/canbedone/canbedone-style.tex b/Master/texmf-dist/doc/context/sources/general/manuals/canbedone/canbedone-style.tex
new file mode 100644
index 00000000000..bbcb6b46aaa
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/canbedone/canbedone-style.tex
@@ -0,0 +1,142 @@
+% language=us runpath=texruns:manuals/canbedone
+
+% I started this series in June 2023 when I found for the n\high{th} time that we
+% already had a feature that users requested in the mailing list, but that I had
+% completely forgotten about it being around for about 6 years.
+
+\startenvironment canbedone-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]
+
+\setuplist
+ [chapter]
+ [style=bold]
+
+\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("!") ;
+ p := p
+ rotatedaround(llcorner p, 30) % different from lowlevel
+ xysized (.1PaperWidth-2d,.1PaperHeight-2d)
+ shifted (.1PaperWidth- d,.1PaperHeight -d)
+ shifted (d,-2d) % different from lowlevel
+ ;
+
+ 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 .4resolvedcolor("middlegray") ; % different from lowlevel
+
+ draw textext.d("\strut it can be done")
+ xsized (.8PaperWidth)
+ shifted center topboundary Page
+ shifted -(0,.2PaperHeight)
+ withcolor "white" ;
+ % draw textext.d("\strut YES")
+ 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
+
+\definesectionlevels
+ [default]
+ [%{chapter,title},
+ {section,subject},
+ {subsection,subsubject},
+ {subsubsection,subsubsubject},
+ {subsubsubsection,subsubsubject},
+ {subsubsubsubsection,subsubsubject}]
+
+\startsetups document:start
+
+ \startMPpage
+ StartPage;
+ \includeMPgraphic{titlepage} ;
+ StopPage;
+ \stopMPpage
+
+ \page
+
+ \startsubjectlevel[title=Contents]
+ \placelist[chapter,section] [criterium=previous]
+ \stopsubjectlevel
+
+\stopsetups
+
+\startsetups document:stop
+
+\testpage[6]
+
+%startsubjectlevel[title=Colofon]
+\startsectionlevel[title=Colofon,number=no,saveinlist=no]
+
+ \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
+
+\stopsectionlevel
+%stopsubjectlevel
+
+\stopsetups
+
+\stopenvironment
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/canbedone/canbedone.tex b/Master/texmf-dist/doc/context/sources/general/manuals/canbedone/canbedone.tex
new file mode 100644
index 00000000000..6a2442f6370
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/canbedone/canbedone.tex
@@ -0,0 +1,29 @@
+% language=us runpath=texruns:manuals/canbedone
+
+\environment canbedone-style
+
+%D This is a bit if a cheat. The can be done manuals are independent but I want an
+%D overview document on the website. Therefore we use sectionlevels in the documents
+%D that we we then overload here (we push the chapter level in front).
+%D
+%D This style is mostly the same as the low level style.
+
+\starttext
+
+ \definesectionlevels
+ [default]
+ [{chapter,title},
+ {section,subject},
+ {subsection,subsubject},
+ {subsubsection,subsubsubject},
+ {subsubsubsection,subsubsubject},
+ {subsubsubsubsection,subsubsubject}]
+
+ \startdocument[title=canbedone,color=middlegray]
+ \stopdocument
+
+ \startsectionlevel[title=Periods] \component [canbedone-periods] \stopsectionlevel
+
+\stoptext
+
+
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/charts/charts-mkiv.tex b/Master/texmf-dist/doc/context/sources/general/manuals/charts/charts-mkiv.tex
index 2081b872b1e..11bd61b1292 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/charts/charts-mkiv.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/charts/charts-mkiv.tex
@@ -1,5 +1,7 @@
+% language=us runpath=texruns:manuals/charts
+
% author : Hans Hagen
-% copyright : PRAGMA ADE & ConTeXt Development Team
+% copyright : ConTeXt Development Team
% license : Creative Commons Attribution ShareAlike 4.0 International
% reference : pragma-ade.nl | contextgarden.net | texlive (related) distributions
% origin : the ConTeXt distribution
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/cld/cld-abitoflua.tex b/Master/texmf-dist/doc/context/sources/general/manuals/cld/cld-abitoflua.tex
index e6150792968..54fc507baf4 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/cld/cld-abitoflua.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/cld/cld-abitoflua.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us runpath=texruns:manuals/cld
\startcomponent cld-abitoflua
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/cld/cld-afewdetails.tex b/Master/texmf-dist/doc/context/sources/general/manuals/cld/cld-afewdetails.tex
index 6c0cf3afa46..9c3221e7528 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/cld/cld-afewdetails.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/cld/cld-afewdetails.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us runpath=texruns:manuals/cld
\startcomponent cld-afewdetails
@@ -342,7 +342,7 @@ The \LUA\ code like similar to the code presented before:
\startluacode
local setcolor = nodes.tracers.colors.setlist
local getmarker = nodes.markers.get
-local hlist_code = nodes.codes.hlist
+local hlist_code = nodes.nodecodes.hlist
local traverse_id = node.traverse_id
function userdata.processmystuff(head)
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/cld/cld-backendcode.tex b/Master/texmf-dist/doc/context/sources/general/manuals/cld/cld-backendcode.tex
index 9c1284baaee..4305d7114db 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/cld/cld-backendcode.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/cld/cld-backendcode.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us runpath=texruns:manuals/cld
\startcomponent cld-backendcode
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/cld/cld-callbacks.tex b/Master/texmf-dist/doc/context/sources/general/manuals/cld/cld-callbacks.tex
index c449af864e7..3178caa4bbb 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/cld/cld-callbacks.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/cld/cld-callbacks.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us runpath=texruns:manuals/cld
\startcomponent cld-callbacks
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/cld/cld-contents.tex b/Master/texmf-dist/doc/context/sources/general/manuals/cld/cld-contents.tex
index 132da7dff9b..009c0e66ed4 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/cld/cld-contents.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/cld/cld-contents.tex
@@ -1,3 +1,5 @@
+% language=us runpath=texruns:manuals/cld
+
\startcomponent cld-contents
\environment cld-environment
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/cld/cld-ctxfunctions.tex b/Master/texmf-dist/doc/context/sources/general/manuals/cld/cld-ctxfunctions.tex
index 11600b8476d..a08277ae969 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/cld/cld-ctxfunctions.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/cld/cld-ctxfunctions.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us runpath=texruns:manuals/cld
\startcomponent cld-ctxfunctions
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/cld/cld-environment.tex b/Master/texmf-dist/doc/context/sources/general/manuals/cld/cld-environment.tex
index 1355110bdbd..f0d73677b66 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/cld/cld-environment.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/cld/cld-environment.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us runpath=texruns:manuals/cld
\startenvironment cld-environment
@@ -221,4 +221,27 @@
[chapter,section]
[interaction=all]
+% a hack:
+
+\startluacode
+ function document.checkcldresource(filename)
+ if environment.arguments.runpath then
+ -- We're running elsewhere so we can have started fresh.
+ local cldname = file.replacesuffix(filename,"cld")
+ local pdfname = file.replacesuffix(filename,"pdf")
+ if not lfs.isfile(pdfname) then
+ -- We don't have the titlepage yet but need to fetch
+ -- the template from the real path.
+ local path = environment.arguments.path
+ if lfs.isdir(path) then
+ os.execute('context --global --path="' .. path .. '" ' .. cldname)
+ else
+ -- bad news
+ end
+ end
+ end
+ end
+\stopluacode
+
+
\stopenvironment
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/cld/cld-files.tex b/Master/texmf-dist/doc/context/sources/general/manuals/cld/cld-files.tex
index 38a7322b111..c2abf1bdf4a 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/cld/cld-files.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/cld/cld-files.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us runpath=texruns:manuals/cld
\startcomponent cld-macros
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/cld/cld-gettingstarted.tex b/Master/texmf-dist/doc/context/sources/general/manuals/cld/cld-gettingstarted.tex
index 5c7e1c26376..5b1911897e3 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/cld/cld-gettingstarted.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/cld/cld-gettingstarted.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us runpath=texruns:manuals/cld
\startcomponent cld-gettingstarted
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/cld/cld-goodies.tex b/Master/texmf-dist/doc/context/sources/general/manuals/cld/cld-goodies.tex
index d5b4b5c9cfa..a902fa0e554 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/cld/cld-goodies.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/cld/cld-goodies.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us runpath=texruns:manuals/cld
\startcomponent cld-macros
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/cld/cld-graphics.tex b/Master/texmf-dist/doc/context/sources/general/manuals/cld/cld-graphics.tex
index 93ab80c2c44..f734a4a038d 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/cld/cld-graphics.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/cld/cld-graphics.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us runpath=texruns:manuals/cld
\startcomponent cld-graphics
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/cld/cld-introduction.tex b/Master/texmf-dist/doc/context/sources/general/manuals/cld/cld-introduction.tex
index a1a74cde459..47c2789a700 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/cld/cld-introduction.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/cld/cld-introduction.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us runpath=texruns:manuals/cld
\startcomponent cld-introduction
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/cld/cld-logging.tex b/Master/texmf-dist/doc/context/sources/general/manuals/cld/cld-logging.tex
index cbb904a6949..46d622f8bd4 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/cld/cld-logging.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/cld/cld-logging.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us runpath=texruns:manuals/cld
% maybe this will become a section instead
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/cld/cld-luafunctions.tex b/Master/texmf-dist/doc/context/sources/general/manuals/cld/cld-luafunctions.tex
index c48b852fb93..c6443f08855 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/cld/cld-luafunctions.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/cld/cld-luafunctions.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us runpath=texruns:manuals/cld
% table.unnest : only used in special cases
% table.derive : set metatable if unset
@@ -68,7 +68,7 @@ You can use \type {insert} and \type {remove} for adding or replacing entries in
an indexed table.
\starttyping
-table.insert(t,value,position)
+table.insert(t,position,value)
value = table.remove(t,position)
\stoptyping
@@ -310,7 +310,7 @@ local merged = table.imerged (one, two, ...)
\startsummary[title={copy fastcopy}]
When copying a table we need to make a real and deep copy. The \type {copy}
-function is an adapted version from the \LUA\ wiki. The \type {fastopy} is faster
+function is an adapted version from the \LUA\ wiki. The \type {fastcopy} is faster
because it does not check for circular references and does not share tables when
possible. In practice using the fast variant is okay.
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/cld/cld-macros.tex b/Master/texmf-dist/doc/context/sources/general/manuals/cld/cld-macros.tex
index 7b6f578e754..de6b2a8d3fd 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/cld/cld-macros.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/cld/cld-macros.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us runpath=texruns:manuals/cld
\startcomponent cld-macros
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/cld/cld-mkiv.tex b/Master/texmf-dist/doc/context/sources/general/manuals/cld/cld-mkiv.tex
index 9267732fa3a..44796edec6a 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/cld/cld-mkiv.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/cld/cld-mkiv.tex
@@ -1,7 +1,7 @@
-% language=uk
+% language=us runpath=texruns:manuals/cld
% author : Hans Hagen
-% copyright : PRAGMA ADE & ConTeXt Development Team
+% copyright : ConTeXt Development Team
% license : Creative Commons Attribution ShareAlike 4.0 International
% reference : pragma-ade.nl | contextgarden.net | texlive (related) distributions
% origin : the ConTeXt distribution
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/cld/cld-moreonfunctions.tex b/Master/texmf-dist/doc/context/sources/general/manuals/cld/cld-moreonfunctions.tex
index da3d6fe4653..b8f97938df4 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/cld/cld-moreonfunctions.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/cld/cld-moreonfunctions.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us runpath=texruns:manuals/cld
\startcomponent cld-moreonfunctions
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/cld/cld-nicetoknow.tex b/Master/texmf-dist/doc/context/sources/general/manuals/cld/cld-nicetoknow.tex
index fcc0aa26bf5..950e394c7c0 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/cld/cld-nicetoknow.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/cld/cld-nicetoknow.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us runpath=texruns:manuals/cld
\startcomponent cld-nicetoknow
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/cld/cld-scanners.tex b/Master/texmf-dist/doc/context/sources/general/manuals/cld/cld-scanners.tex
index 3bf5f658d45..9fa816777a6 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/cld/cld-scanners.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/cld/cld-scanners.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us runpath=texruns:manuals/cld
\startcomponent cld-ctxscanners
@@ -41,6 +41,7 @@ Of course in practice the \type {actions} will be more complex.
interfaces.implement {
name = "MyMacroA",
public = true,
+ permanent = false,
arguments = "string",
actions = function(s)
context("(%s)",s)
@@ -84,14 +85,19 @@ The meaning of \type {\temp} is:
We can also define the macro to be protected (\type {\unexpanded}) in \CONTEXT\
speak). We can overload existing scanners but unless we specify the \type
-{overload} option, we get a warning on the console.
+{overload} option, we get a warning on the console. However, in \LMTX\ there is
+catch. Implementers by default define macros as permanent unless one explicitly
+disables this so this is why in the previous definition we have done so. The
+overload flag below only makes sense in special cases, when for instance format
+file is made. (Of course overload protection only kicks in when it has been
+enabled.)
\startbuffer[definition]
\startluacode
interfaces.implement {
name = "MyMacroA",
public = true,
--- overload = true,
+ -- overload = true,
protected = true,
arguments = "string",
actions = function(s)
@@ -407,14 +413,14 @@ that doesn't expand. Take this:
\typebuffer[definition] \getbuffer[definition]
-Now take this input:
+Now take this input: % we use \C* because \c is already defined
\startbuffer[usage]
-\def\a{A} \def\b{B} \def\c{C}
+\def\Ca{A} \def\Cb{B} \def\Cc{C}
\MyMacroH{a}{b}{c}
-\MyMacroH{a\a}{b\b}{c\c}
-\MyMacroH\a\b\c\relax
-\MyMacroH\a xx\relax
+\MyMacroH{a\Ca}{b\Cb}{c\Cc}
+\MyMacroH\Ca\Cb\Cc\relax
+\MyMacroH\Ca xx\relax
\stopbuffer
\typebuffer[usage]
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/cld/cld-somemoreexamples.tex b/Master/texmf-dist/doc/context/sources/general/manuals/cld/cld-somemoreexamples.tex
index a282be4e93e..69aeaa7aaf6 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/cld/cld-somemoreexamples.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/cld/cld-somemoreexamples.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us runpath=texruns:manuals/cld
\startcomponent cld-somemoreexamples
@@ -332,6 +332,8 @@ context.starttext()
context.stoptext()
\stoptyping
+\ctxlua{document.checkcldresource("cld-005.cld")}
+
\placefigure
[here]
[fig:lorien]
@@ -627,7 +629,7 @@ example:
\startbuffer
\defineframed
- [colored]
+ [coloredframed]
[foregroundcolor=red,
foregroundstyle=\underbar,
offset=.1ex,
@@ -637,7 +639,7 @@ example:
\typebuffer \getbuffer
\startbuffer
-\processisolatedwords {\input ward \relax} \colored
+\processisolatedwords {\input ward \relax} \coloredframed
\stopbuffer
\typebuffer \blank \getbuffer \blank
@@ -661,7 +663,7 @@ local function process(data)
else
context.space()
end
- context.colored(words[i])
+ context.coloredframed(words[i])
end
end
@@ -693,7 +695,7 @@ local function apply(s)
done = true
context.dontleavehmode()
end
- context.colored(s)
+ context.coloredframed(s)
end
local splitter = lpeg.P(reset)
@@ -709,7 +711,7 @@ next one is comaprable:
\starttyping
local function apply(s)
- context.colored("%s ",s)
+ context.coloredframed("%s ",s)
end
local splitter lpeg.splitter(lpeg.patterns.spacer,apply)
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/cld/cld-specialcommands.tex b/Master/texmf-dist/doc/context/sources/general/manuals/cld/cld-specialcommands.tex
index 510c820f9e5..158bf427247 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/cld/cld-specialcommands.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/cld/cld-specialcommands.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us runpath=texruns:manuals/cld
\startcomponent cld-specialcommands
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/cld/cld-summary.tex b/Master/texmf-dist/doc/context/sources/general/manuals/cld/cld-summary.tex
index 2b62597fa3f..087bf74babd 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/cld/cld-summary.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/cld/cld-summary.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us runpath=texruns:manuals/cld
\startcomponent cld-summary
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/cld/cld-titlepage.tex b/Master/texmf-dist/doc/context/sources/general/manuals/cld/cld-titlepage.tex
index 926a989529e..da315d6de16 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/cld/cld-titlepage.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/cld/cld-titlepage.tex
@@ -1,12 +1,22 @@
+% language=us runpath=texruns:manuals/cld
+
\startcomponent cld-titlepage
\environment cld-environment
-% \cldprocessfile{cld-mkiv-titlepage.cld}
+\iffalse
+
+ \cldprocessfile{cld-mkiv-titlepage.cld} % kind of slow each time
+
+\else
+
+ \ctxlua{document.checkcldresource("cld-mkiv-titlepage.cld")}
+
+ \startTEXpage
+ \externalfigure[cld-mkiv-titlepage.pdf]%
+ \stopTEXpage
-\startTEXpage
- \externalfigure[cld-mkiv-titlepage.pdf]%
-\stopTEXpage % faster during writing
+\fi
\startstandardmakeup[doublesided=no,page=no]
\stopstandardmakeup
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/cld/cld-variables.tex b/Master/texmf-dist/doc/context/sources/general/manuals/cld/cld-variables.tex
index c9afbd44c0b..b6301cb836a 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/cld/cld-variables.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/cld/cld-variables.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us runpath=texruns:manuals/cld
\startcomponent cld-variables
@@ -156,8 +156,9 @@ variables. However, there are also primitives that deal with these data values:
\startbuffer[usage]
\setdatavalue{my-data}{12345}%
-\letdatacode \MyData 67890
-\thedatavalue{my-data} \the\MyData
+\integerdef \MyDataI 67890
+\dimensiondef \MyDataD 12345pt
+\thedatavalue{my-data}, \the\MyDataI, \the\MyDataD.
\stopbuffer
\typebuffer[usage]
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/cld/cld-verbatim.tex b/Master/texmf-dist/doc/context/sources/general/manuals/cld/cld-verbatim.tex
index 2007f7d733d..10cb3611dd1 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/cld/cld-verbatim.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/cld/cld-verbatim.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us runpath=texruns:manuals/cld
\startcomponent cld-verbatim
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 3832501c5d2..deffa00c089 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
@@ -1,4 +1,4 @@
-% language=uk
+% language=us runpath=texruns:manuals/colors
\startcomponent colors-basics
@@ -897,7 +897,7 @@ are easier to deal with and therefore in \MKIV\ we have a trick to make sure the
outer color gets applied to the box:
\startbuffer[enable]
-\enabledirectives
+\enabledirectives % only mkiv
[attributes.inheritance]
\stopbuffer
@@ -908,7 +908,7 @@ default {\bf \darkyellow yellow {\attributedbox0} yellow} default
\typebuffer
So, we get: \start\inlinebuffer[box]\inlinebuffer[enable]\space\inlinebuffer
-\stop, but only after we have enabled this mechanisms explicitly:
+\stop. In \MKIV\ you need to enable inheritance first with:
\typebuffer[enable]
@@ -938,6 +938,12 @@ because contrary to \MKII\ colors don't interfere (no extra nodes). We could hav
flushed the framed content using \type {\attributedbox}, but we don't want to
enable inheritance by default because it comes with some overhead.
+{\em The \type {\attributedbox} command is considered obsolete. In \LMTX\ there
+is a \type {\recolorbox} command that recolors a box. Because these commands are
+probably never needed it made more sense to move the burden to a specific command
+than to add additional overhead to the whole color mechanism. My experience is
+that unboxing and copying is very rare in \CONTEXT.}
+
\stopsection
\startsection[title=Color intents]
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/colors/colors-environment.tex b/Master/texmf-dist/doc/context/sources/general/manuals/colors/colors-environment.tex
index 99f625854ca..972bd622859 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/colors/colors-environment.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/colors/colors-environment.tex
@@ -1,3 +1,5 @@
+% language=us runpath=texruns:manuals/colors
+
\startenvironment colors-environment
\environment manuals-explaining-environment
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/colors/colors-graphics.tex b/Master/texmf-dist/doc/context/sources/general/manuals/colors/colors-graphics.tex
index 4c8fb5270fc..c438a4630cc 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/colors/colors-graphics.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/colors/colors-graphics.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us runpath=texruns:manuals/colors
\startcomponent colors-basics
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/colors/colors-introduction.tex b/Master/texmf-dist/doc/context/sources/general/manuals/colors/colors-introduction.tex
index ba1db99158e..16544cb0611 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/colors/colors-introduction.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/colors/colors-introduction.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us runpath=texruns:manuals/colors
\startcomponent colors-introduction
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/colors/colors-metafun.tex b/Master/texmf-dist/doc/context/sources/general/manuals/colors/colors-metafun.tex
index 82514659bf0..1ccba003290 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/colors/colors-metafun.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/colors/colors-metafun.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us runpath=texruns:manuals/colors
\startcomponent colors-basics
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/colors/colors-mkiv.tex b/Master/texmf-dist/doc/context/sources/general/manuals/colors/colors-mkiv.tex
index a39ff0f37f4..e0d73a893d3 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/colors/colors-mkiv.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/colors/colors-mkiv.tex
@@ -1,5 +1,7 @@
+% language=us runpath=texruns:manuals/colors
+
% author : Hans Hagen
-% copyright : PRAGMA ADE & ConTeXt Development Team
+% copyright : ConTeXt Development Team
% license : Creative Commons Attribution ShareAlike 4.0 International
% reference : pragma-ade.nl | contextgarden.net | texlive (related) distributions
% origin : the ConTeXt distribution
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-000.tex b/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-000.tex
index 4f254e2ae66..fb0806afd33 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-000.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-000.tex
@@ -1,7 +1,3 @@
-% content=tex
-%
-% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa
-
\usemodule[visual]
\usemodule[simulate]
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-001.tex b/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-001.tex
index 689f4e04499..1c575de2613 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-001.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-001.tex
@@ -1,7 +1,3 @@
-% content=tex
-%
-% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa
-
\environment columnsets-000
\definecolumnset[example][n=2]
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-002.tex b/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-002.tex
index a67dd3161e5..6d0f97e838d 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-002.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-002.tex
@@ -1,7 +1,3 @@
-% content=tex
-%
-% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa
-
\environment columnsets-000
\definecolumnset[example][nleft=3,nright=2,width=5cm]
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-003.tex b/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-003.tex
index eed0286f8a9..a66475aa9db 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-003.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-003.tex
@@ -1,7 +1,3 @@
-% content=tex
-%
-% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa
-
\environment columnsets-000
\definecolumnset[example][n=2,page=left]
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-004.tex b/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-004.tex
index a58ddf62194..3cd217a3da8 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-004.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-004.tex
@@ -1,13 +1,7 @@
-% content=tex
-%
-% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa
-
\environment columnsets-000
\definecolumnset[example][n=3,page=left]
-\definecolor[fakerulecolor]
-
\definecolumnsetspan[wide] [n=2,background=contrast,color=white]
\definecolumnsetspan[wider][n=4,background=contrast,color=white]
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-005.tex b/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-005.tex
index f1d970d9ea6..c86db83de1a 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-005.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-005.tex
@@ -1,7 +1,3 @@
-% content=tex
-%
-% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa
-
\environment columnsets-000
\definecolumnset[example][n=3,page=left]
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-006.tex b/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-006.tex
index 0336199708d..dd7bac088b7 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-006.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-006.tex
@@ -1,7 +1,3 @@
-% content=tex
-%
-% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa
-
\environment columnsets-000
\definecolumnset[example][n=3,page=left]
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-007.tex b/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-007.tex
index 137a414d96f..b977689cc06 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-007.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-007.tex
@@ -1,7 +1,3 @@
-% content=tex
-%
-% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa
-
\environment columnsets-000
\definecolumnset[example][n=3,page=left]
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-101.tex b/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-101.tex
index f9c7b59cb47..29084e30383 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-101.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-101.tex
@@ -1,7 +1,3 @@
-% content=tex
-%
-% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa
-
\environment columnsets-000
\definecolumnset[example][n=4,page=left]
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-102.tex b/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-102.tex
index 3cf4dcd0eae..6a1dce5b653 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-102.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-102.tex
@@ -1,7 +1,3 @@
-% content=tex
-%
-% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa
-
\environment columnsets-000
\definecolumnset[example][n=4,page=left]
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-103.tex b/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-103.tex
index f1d4dbedc57..d5c195cd1f2 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-103.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-103.tex
@@ -1,7 +1,3 @@
-% content=tex
-%
-% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa
-
\environment columnsets-000
\definecolumnset[example][n=4,page=left]
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-201.tex b/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-201.tex
index 37b26c391db..16208200b05 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-201.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-201.tex
@@ -1,7 +1,3 @@
-% content=tex
-%
-% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa
-
\environment columnsets-000
\definecolumnset[example][n=4,page=left]
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-202.tex b/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-202.tex
index 1721d9cbc88..908201a1f09 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-202.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-202.tex
@@ -1,7 +1,3 @@
-% content=tex
-%
-% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa
-
\environment columnsets-000
\definecolumnset[example][n=4,page=left]
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-203.tex b/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-203.tex
index 6c15578bce9..618e28c6111 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-203.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-203.tex
@@ -1,7 +1,3 @@
-% content=tex
-%
-% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa
-
\environment columnsets-000
\definecolumnset[example][n=4,page=left]
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-204.tex b/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-204.tex
index d390f468e96..5b0376f8f89 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-204.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-204.tex
@@ -1,8 +1,4 @@
-% content=tex
-%
-% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa
-
-\usemodule[oldfun]
+\usemodule[oldfun] % really ?
\environment columnsets-000
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-205.tex b/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-205.tex
index b5370977010..7d77d53083e 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-205.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-205.tex
@@ -1,12 +1,12 @@
-% content=tex
-%
-% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa
-
-\usemodule[oldfun]
+\usemodule[oldfun] % really ?
\environment columnsets-000
-\unprotected \def\SpreadGapText#1#2{{\def\+{\blackrule[\c!width=#1]}#2}}
+\unprotect
+
+\def\SpreadGapText#1#2{{\def\+{\blackrule[\c!width=#1]}#2}}
+
+\protect
\definecolumnset[example][n=4,page=left]
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-206.tex b/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-206.tex
index 8b9f524b1da..8fe4ae05eb4 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-206.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-206.tex
@@ -1,7 +1,3 @@
-% content=tex
-%
-% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa
-
\environment columnsets-000
\definecolumnset[example][n=4,page=left]
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-301.tex b/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-301.tex
index 4d21f2b0216..c200675fd1d 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-301.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-301.tex
@@ -1,7 +1,3 @@
-% content=tex
-%
-% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa
-
\environment columnsets-000
\definecolumnset[example][n=4]
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-401.tex b/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-401.tex
index ee91e608cec..ce4e61961bb 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-401.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-401.tex
@@ -1,7 +1,3 @@
-% content=tex
-%
-% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa
-
\environment columnsets-000
\definecolumnset[example][n=4,page=left]
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-402.tex b/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-402.tex
index 00db6017cf1..8219514335e 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-402.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-402.tex
@@ -1,7 +1,3 @@
-% content=tex
-%
-% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa
-
\environment columnsets-000
\definecolumnset[example][n=4,page=left]
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-403.tex b/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-403.tex
index c9bc2e648cf..e1372383abe 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-403.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-403.tex
@@ -1,7 +1,3 @@
-% content=tex
-%
-% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa
-
\environment columnsets-000
\definecolumnset[example][n=4,page=left]
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-404.tex b/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-404.tex
index 05a25acfea1..50968a362d2 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-404.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-404.tex
@@ -1,7 +1,3 @@
-% content=tex
-%
-% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa
-
\environment columnsets-000
\definecolumnset[example][n=3,page=left]
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-405.tex b/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-405.tex
index fa20ef34c6c..54c20465329 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-405.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-405.tex
@@ -1,7 +1,3 @@
-% content=tex
-%
-% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa
-
\environment columnsets-000
\definecolumnset[example][n=4,page=left]
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-601.tex b/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-601.tex
index b139210f424..c846fe5cc0c 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-601.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-601.tex
@@ -1,7 +1,3 @@
-% content=tex
-%
-% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa
-
\environment columnsets-000
\definecolumnset[example][n=4,page=left,direction=reverse]
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-701.tex b/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-701.tex
index b2c50cfafea..21ea5c892ac 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-701.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-701.tex
@@ -1,7 +1,3 @@
-% content=tex
-%
-% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa
-
\environment columnsets-000
\definecolumnset[example][n=4,page=left]
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-702.tex b/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-702.tex
index 5b9a879c114..7e0185ba19a 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-702.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-702.tex
@@ -1,7 +1,3 @@
-content=tex
-%
-% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa
-
\environment columnsets-000
\definecolumnset[example][n=4,page=left]
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-703.tex b/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-703.tex
index 549b49f611a..c1389a3c227 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-703.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-703.tex
@@ -1,7 +1,3 @@
-% content=tex
-%
-% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa
-
\environment columnsets-000
\definecolumnset[example][n=4,page=left]
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-704.tex b/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-704.tex
index 7fa6cb313a9..6dcc26b2be8 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-704.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-704.tex
@@ -1,7 +1,3 @@
-% content=tex
-%
-% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa
-
\environment columnsets-000
\startuseMPgraphic{mpos:par:columns}
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-801.tex b/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-801.tex
index 1a84f99ab32..6cde08ebb7d 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-801.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-801.tex
@@ -1,7 +1,3 @@
-% content=tex
-%
-% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa
-
\environment columnsets-000
\definecolumnset [example-1] [n=2]
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-802.tex b/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-802.tex
index a126d001260..9e712c4a591 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-802.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-802.tex
@@ -1,7 +1,3 @@
-% content=tex
-%
-% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa
-
\environment columnsets-000
\definecolumnset [example-1] [n=2,balance=yes]
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-803.tex b/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-803.tex
index 58a278bb144..f0ac4d0a717 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-803.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-803.tex
@@ -1,7 +1,3 @@
-% content=tex
-%
-% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa
-
\environment columnsets-000
\definecolumnset [example-1] [n=2,balance=yes]
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-804.tex b/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-804.tex
index c2b7a6b1e8d..4b17b7bcea6 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-804.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-804.tex
@@ -1,7 +1,3 @@
-% content=tex
-%
-% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa
-
\environment columnsets-000
\definecolumnset [example-1] [n=2,balance=yes]
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-805.tex b/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-805.tex
index fc80e7e9c86..884e8eb6d02 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-805.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-805.tex
@@ -1,7 +1,3 @@
-% content=tex
-%
-% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa
-
\environment columnsets-000
\definecolumnset [example-1] [n=2,balance=yes]
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-806.tex b/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-806.tex
index 0322a336f68..1a516371695 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-806.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-806.tex
@@ -1,7 +1,3 @@
-% content=tex
-%
-% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa
-
\environment columnsets-000
\definecolumnset [example-1] [n=2,balance=yes]
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-901.tex b/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-901.tex
index 300458bf5ba..89214e86804 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-901.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-901.tex
@@ -1,7 +1,3 @@
-% content=tex
-%
-% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa
-
\environment columnsets-000
\definecolumnset[example][n=2,page=left,distance=1cm]
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-902.tex b/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-902.tex
index fda2969af62..8a9fc6fe510 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-902.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-902.tex
@@ -1,7 +1,3 @@
-% content=tex
-%
-% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa
-
\environment columnsets-000
\definecolumnset[example][n=3,page=left,distance=1cm]
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-903.tex b/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-903.tex
index 68cd31ae205..1c32216b16a 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-903.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets-903.tex
@@ -1,7 +1,3 @@
-% content=tex
-%
-% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa
-
\environment columnsets-000
\definecolumnset[example][n=3,page=left,distance=1cm]
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets.tex b/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets.tex
index 6df706d901b..29ca876afc4 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/columnsets/columnsets.tex
@@ -1,5 +1,5 @@
% author : Hans Hagen
-% copyright : PRAGMA ADE & ConTeXt Development Team
+% copyright : ConTeXt Development Team
% license : Creative Commons Attribution ShareAlike 4.0 International
% reference : pragma-ade.nl | contextgarden.net | texlive (related) distributions
% origin : the ConTeXt distribution
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/details/back-0.tex b/Master/texmf-dist/doc/context/sources/general/manuals/details/back-0.tex
index 137884919fc..3ef7d45653b 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/details/back-0.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/details/back-0.tex
@@ -1,7 +1,3 @@
-% content=tex
-%
-% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa
-
\startenvironment back-0
\usemodule[simulate]
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/details/details-backpage.tex b/Master/texmf-dist/doc/context/sources/general/manuals/details/details-backpage.tex
index 85e4d38cea3..223802ac1b1 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/details/details-backpage.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/details/details-backpage.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
\environment details-environment
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/details/details-captiontrickery.tex b/Master/texmf-dist/doc/context/sources/general/manuals/details/details-captiontrickery.tex
index ccd163e2022..b15f3f56a8b 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/details/details-captiontrickery.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/details/details-captiontrickery.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
\environment details-environment
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/details/details-colofon.tex b/Master/texmf-dist/doc/context/sources/general/manuals/details/details-colofon.tex
index 1ceda44e766..9525370f00e 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/details/details-colofon.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/details/details-colofon.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
\environment details-environment
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/details/details-contents.tex b/Master/texmf-dist/doc/context/sources/general/manuals/details/details-contents.tex
index 737f080a001..df66e7812ff 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/details/details-contents.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/details/details-contents.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
\environment details-environment
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/details/details-environment.tex b/Master/texmf-dist/doc/context/sources/general/manuals/details/details-environment.tex
index 003ea6905da..0cdb3f3a912 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/details/details-environment.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/details/details-environment.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
% this a rather old style and made for mkii, currently the only adaption to mkiv is
% with respect to fonts
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/details/details-finetuningfloats.tex b/Master/texmf-dist/doc/context/sources/general/manuals/details/details-finetuningfloats.tex
index 71e0772d19c..9d25956fcce 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/details/details-finetuningfloats.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/details/details-finetuningfloats.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
% todo: \setlayeranchored[text-1]{HELLO WORLD}
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/details/details-floatingaround.tex b/Master/texmf-dist/doc/context/sources/general/manuals/details/details-floatingaround.tex
index 91d85309863..5b887cefa08 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/details/details-floatingaround.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/details/details-floatingaround.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
\environment details-environment
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/details/details-frontpage.tex b/Master/texmf-dist/doc/context/sources/general/manuals/details/details-frontpage.tex
index 0c7df22f533..c44c118bab2 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/details/details-frontpage.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/details/details-frontpage.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
\environment details-environment
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/details/details-gridtrickery.tex b/Master/texmf-dist/doc/context/sources/general/manuals/details/details-gridtrickery.tex
index f37c7bd4bbb..f8fb98fc0df 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/details/details-gridtrickery.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/details/details-gridtrickery.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
\environment details-environment
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/details/details-index.tex b/Master/texmf-dist/doc/context/sources/general/manuals/details/details-index.tex
index 9b6940f0b07..d3ae36b368a 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/details/details-index.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/details/details-index.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
\environment details-environment
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/details/details-introduction.tex b/Master/texmf-dist/doc/context/sources/general/manuals/details/details-introduction.tex
index 8e64ba4eda3..e1dbaa6fa33 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/details/details-introduction.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/details/details-introduction.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
\startcomponent details-introduction
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/details/details-ornaments.tex b/Master/texmf-dist/doc/context/sources/general/manuals/details/details-ornaments.tex
index 35d23c8b401..367db8d3184 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/details/details-ornaments.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/details/details-ornaments.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
\environment details-environment
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/details/details-pseudocolumns.tex b/Master/texmf-dist/doc/context/sources/general/manuals/details/details-pseudocolumns.tex
index f30ffaeab1b..5d477800186 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/details/details-pseudocolumns.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/details/details-pseudocolumns.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
\environment details-environment
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/details/details-snappingheads.tex b/Master/texmf-dist/doc/context/sources/general/manuals/details/details-snappingheads.tex
index 26f4dfbc4bf..2b6160f7dc1 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/details/details-snappingheads.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/details/details-snappingheads.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
\environment details-environment
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/details/details-textbackgrounds.tex b/Master/texmf-dist/doc/context/sources/general/manuals/details/details-textbackgrounds.tex
index 0f3962fffeb..0cb8fa3067a 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/details/details-textbackgrounds.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/details/details-textbackgrounds.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
\environment details-environment
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/details/details-tuningformulas.tex b/Master/texmf-dist/doc/context/sources/general/manuals/details/details-tuningformulas.tex
index b363207691f..198f3a0407e 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/details/details-tuningformulas.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/details/details-tuningformulas.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
\environment details-environment
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/details/details.tex b/Master/texmf-dist/doc/context/sources/general/manuals/details/details.tex
index 6319721e510..a561989893d 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/details/details.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/details/details.tex
@@ -1,7 +1,7 @@
% interface=english modes=screen
% author : Hans Hagen
-% copyright : PRAGMA ADE & ConTeXt Development Team
+% copyright : ConTeXt Development Team
% license : Creative Commons Attribution ShareAlike 4.0 International
% reference : pragma-ade.nl | contextgarden.net | texlive (related) distributions
% origin : the ConTeXt distribution
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/details/detcow.tex b/Master/texmf-dist/doc/context/sources/general/manuals/details/detcow.tex
index c3698e3355e..b940467235d 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/details/detcow.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/details/detcow.tex
@@ -1,7 +1,3 @@
-% content=tex
-%
-% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa
-
\setupcolors[state=start]
\starttext
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/epub/epub-mkiv-demo.tex b/Master/texmf-dist/doc/context/sources/general/manuals/epub/epub-mkiv-demo.tex
index b4b979874bb..6cba257911e 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/epub/epub-mkiv-demo.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/epub/epub-mkiv-demo.tex
@@ -1,4 +1,3 @@
-
% \usemodule[luacalls]
\usemodule[mathml]
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/epub/epub-mkiv.tex b/Master/texmf-dist/doc/context/sources/general/manuals/epub/epub-mkiv.tex
index 2eea58b9e28..45418500cb4 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/epub/epub-mkiv.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/epub/epub-mkiv.tex
@@ -1,7 +1,7 @@
-% language=uk
+% language=us
% author : Hans Hagen
-% copyright : PRAGMA ADE & ConTeXt Development Team
+% copyright : ConTeXt Development Team
% license : Creative Commons Attribution ShareAlike 4.0 International
% reference : pragma-ade.nl | contextgarden.net | texlive (related) distributions
% origin : the ConTeXt distribution
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/evenmore/evenmore-bitwise.tex b/Master/texmf-dist/doc/context/sources/general/manuals/evenmore/evenmore-bitwise.tex
new file mode 100644
index 00000000000..030229413de
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/evenmore/evenmore-bitwise.tex
@@ -0,0 +1,194 @@
+% language=us runpath=texruns:manuals/evenmore
+
+\environment evenmore-style
+
+\startcomponent evenmore-bitwise
+
+\startchapter[title={Bitwise operations}]
+
+Occasionally we use a bit set to pass (or store) options and one way of doing
+that is to add up some constants. However, what you would like to do is to set a
+specific bit. Of course one can write macros for that but performance wise one
+can wonder if there are other ways. One solution is to extend the engine but that
+has its own pitfalls. For instance, I played with additions to \type {\numexpr}
+and although they worked okay and brought now performance degradation, I decided
+to remove that experiment. One problem is that we have no real 32 bit cardinals
+(unsigned integers) in \TEX\ and the engine makes sure that we never exceed the
+minima and maxima. Another problem is that in expressions we then need either
+verbose \type {and}, \type {or}, \type {xor}, \type {not} and other verbose
+operators, if only because the usual symbols can have catcodes that are
+unsuitable.
+
+So in the end I decided to come up with a set of primitive like commands that
+do the job. It is no problem to have a set of dedicated verbose commands and we
+can extend the repertoire if needed. So this is what we have now:
+
+\starttabulate[||i2c||]
+\NC command \NC operator equivalent \NC optional \NC \NR
+\NC \type {\bitwiseset a} \NC \type {a} \NC \NC \NR
+\NC \type {\bitwisenot a} \NC \type {~a} \NC \NC \NR
+\NC \type {\bitwisenil a b} \NC \type {a & (~ b)} \NC \type {with} \NC \NR
+\NC \type {\bitwiseand a b} \NC \type {a & b} \NC \type {with} \NC \NR
+\NC \type {\bitwiseor a b} \NC \type {a | b} \NC \type {with} \NC \NR
+\NC \type {\bitwisexor a b} \NC \type {a ~ b} \NC \type {with} \NC \NR
+\NC \type {\bitwiseshift a b} \NC \type {a >> b} \NC \type {by} \NC \NR
+\NC \type {\bitwiseshift a -b} \NC \type {a << b} \NC \type {by} \NC \NR
+\NC \type {\ifbitwiseand a b} \NC \type {(a & b) ~= 0} \NC \NC \NR
+\stoptabulate
+
+Here a some examples:
+
+\startbuffer
+\scratchcounter = \bitwiseand "01 "02 \uchexnumbers{\scratchcounter} \quad
+\scratchcounter = \bitwiseand "01 with "02 \uchexnumbers{\scratchcounter} \quad
+\scratchcounter = \bitwiseand "03 "02 \uchexnumbers{\scratchcounter} \qquad
+\scratchcounter = \bitwiseor "01 "02 \uchexnumbers{\scratchcounter} \quad
+\scratchcounter = \bitwiseor "01 with "02 \uchexnumbers{\scratchcounter} \quad
+\scratchcounter = \bitwiseor "03 "02 \uchexnumbers{\scratchcounter} \qquad
+\scratchcounter = \bitwisexor "01 "02 \uchexnumbers{\scratchcounter} \quad
+\scratchcounter = \bitwisexor "01 with "02 \uchexnumbers{\scratchcounter} \quad
+\scratchcounter = \bitwisexor "03 "02 \uchexnumbers{\scratchcounter}
+\stopbuffer
+
+\typebuffer
+
+This gives the nine values:
+
+{\tt\getbuffer}
+
+Because they are numeric operations you can chain them, as in:
+
+\starttyping
+\scratchcounter = \bitwisenil \bitwisenil "0F "02 "01 \relax
+\scratchcounter = \bitwisenil \bitwisenil "0F with "02 with "01 \relax
+\stoptyping
+
+We try as good as possible to support all bits in the range from zero upto \type
+{0xFFFFFFFF};
+
+\startbuffer
+\scratchcounter \bitwiseset "FFFFFFFF
+
+\ifbitwiseand \scratchcounter "80000000 YES \else NOP \fi
+\ifbitwiseand \scratchcounter "F0000000 YES \else NOP \fi
+\ifbitwiseand \scratchcounter "10000000 YES \else NOP \fi
+
+\scratchcounter \bitwisenot \scratchcounter
+
+\ifbitwiseand \scratchcounter "80000000 YES \else NOP \fi
+\ifbitwiseand \scratchcounter "F0000000 YES \else NOP \fi
+\ifbitwiseand \scratchcounter "10000000 YES \else NOP \fi
+\stopbuffer
+
+\typebuffer
+
+and we get:
+
+\startpacked \tt \getbuffer \stoppacked
+
+Of course you can just use normal counters and \TEX\ integers but using the bit
+commands have the advantage that they do some checking and can do real \type {or}
+etc operations. Here is some food for thought:
+
+\startbuffer
+\scratchcounter \bitwiseand "01 "02
+\scratchcounter \numexpr "01+"02\relax
+
+\ifcase \bitwiseand \scratchcounterone \plusone \else \fi
+\ifbitwiseand \scratchcounterone \plusone \else \fi
+\ifnum \scratchcounterone=\plusone \else \fi
+\stopbuffer
+
+\typebuffer
+
+and we get:
+
+\startpacked \tt \getbuffer \stoppacked
+
+You can also go real binary, but we only provide a combined setter|/|getter for
+that, but you can mix that one with the other commands:
+
+\startbuffer
+\scratchcounterone = \bitwise 1101
+\scratchcountertwo = \bitwise 11011101110111011101110111011101
+\scratchcounterthree = \bitwiseor \bitwise 0001 \bitwise 1100
+
+{0x\uchexnumber{\scratchcounterone} \bitwise\scratchcounterone }\par
+{0x\uchexnumber{\scratchcountertwo} \bitwise\scratchcountertwo }\par
+{0x\uchexnumber{\scratchcounterthree} \bitwise\scratchcounterthree}\par
+\stopbuffer
+
+\typebuffer
+
+We get bits back:
+
+\startpacked \tt \getbuffer \stoppacked
+
+The above commands are typical for the things we can do with \LUAMETATEX\ and
+\LMTX\ and are unlikely to become available in \MKIV.
+
+There is a special command for (re)setting a bit in a register:
+
+\startbuffer
+ \scratchcounter 0
+\bitwiseflip \scratchcounter 1 [\the\scratchcounter]
+\bitwiseflip \scratchcounter 4 [\the\scratchcounter]
+\bitwiseflip \scratchcounter 8 [\the\scratchcounter]
+\bitwiseflip \scratchcounter -5 [\the\scratchcounter]
+\stopbuffer
+
+\typebuffer
+
+This gives: \inlinebuffer. Of course a global assignment works too:
+
+\startbuffer
+ \global \globalscratchcounter 0
+{\global \bitwiseflip \globalscratchcounter 2 } [\the\globalscratchcounter]
+{\global \bitwiseflip \globalscratchcounter 4 } [\the\globalscratchcounter]
+{\global \bitwiseflip \globalscratchcounter 8 } [\the\globalscratchcounter]
+{\global \bitwiseflip \globalscratchcounter -6 } [\the\globalscratchcounter]
+\stopbuffer
+
+\typebuffer
+
+Here we get: \inlinebuffer. A side effect of it being an number makes that
+this is also valid:
+
+\starttyping
+\scratchcounterone\bitwiseflip \scratchcountertwo -16
+\stoptyping
+
+\stopchapter
+
+\stopcomponent
+
+% (\scratchcounterone \bitwiseset "F \uchexnumber{\scratchcounterone})\par
+% (\scratchcounterone \bitwiseset "FF \uchexnumber{\scratchcounterone})\par
+% (\scratchcounterone \bitwiseset "FFF \uchexnumber{\scratchcounterone})\par
+% (\scratchcounterone \bitwiseset "FFFF \uchexnumber{\scratchcounterone})\par
+% (\scratchcounterone \bitwiseset "FFFFF \uchexnumber{\scratchcounterone})\par
+% (\scratchcounterone \bitwiseset "FFFFFF \uchexnumber{\scratchcounterone})\par
+% (\scratchcounterone \bitwiseset "FFFFFFF \uchexnumber{\scratchcounterone})\par
+% (\scratchcounterone \bitwiseset "FFFFFFFF \uchexnumber{\scratchcounterone})\par
+%
+% (\scratchcounterone \bitwiseset "0000FFFF
+% \scratchcounterone \bitwiseshift \scratchcounterone -16
+% \uchexnumber{\scratchcounterone})\par
+%
+% \scratchcounterone \bitwiseset "FFFFFFFF
+% \scratchcountertwo \bitwiseset "FFFFFFFE
+%
+% \the\scratchcounterone : \uchexnumber{\scratchcounterone}\par
+% \the\scratchcountertwo : \uchexnumber{\scratchcountertwo}\par
+
+% I need to check this on the garden run as it looks like that server is some 50%
+% faster than my (in terms of computers) old laptop.
+
+% \testfeatureonce{10000}{\scratchcounter \bitwiseand "01 "02 } \elapsedtime\par
+% \testfeatureonce{10000}{\scratchcounter \numexpr "01+"02\relax} \elapsedtime\par
+% \testfeatureonce{10000}{\ifcase\bitwiseand \scratchcounterone \plusone \else \fi} \elapsedtime\par
+% \testfeatureonce{10000}{\ifbitwiseand \scratchcounterone \plusone \else \fi} \elapsedtime\par
+% %testfeatureonce{10000}{\ifnum \scratchcounterone=\plusone \else \fi} \elapsedtime\par
+%
+% \testfeatureonce{100000}{\scratchcounter = \bitwise 1101 } \elapsedtime\par
+% \testfeatureonce{100000}{\scratchcounter = \bitwise 11011101110111011101110111011101 } \elapsedtime\par
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
index d20b45eee6c..6d617ad5f18 100644
--- 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
@@ -1,3 +1,5 @@
+% language=us runpath=texruns:manuals/evenmore
+
\startcomponent evenmore-contents
\environment evenmore-style
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
index 6c67f07d634..3ef5b3402a0 100644
--- 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
@@ -1,4 +1,4 @@
-% language=us
+% language=us runpath=texruns:manuals/evenmore
\environment evenmore-style
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/evenmore/evenmore-expressions.tex b/Master/texmf-dist/doc/context/sources/general/manuals/evenmore/evenmore-expressions.tex
new file mode 100644
index 00000000000..37bb5a5bdde
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/evenmore/evenmore-expressions.tex
@@ -0,0 +1,336 @@
+% language=us runpath=texruns:manuals/evenmore
+
+% This one accidentally ended up in the older history document followingup,
+% btu it's now moved here.
+
+\startcomponent evenmore-expressions
+
+\environment evenmore-style
+
+\startchapter[title={Expressions}]
+
+\startsection[title={Introduction}]
+
+Do we need bitwise expressions? Actually the answer is \quotation {no, although
+not until recently}. In \CONTEXT\ \MKII\ and \MKIV\ we just use integer addition
+because we only need to enable things but in \LMTX\ we want to control de
+detailed modes that some mechanisms in the engine provides and in order to not
+have tons of parameters these use bit sets. We manipulate these with the bitwise
+macros that actually are efficient \LUA\ function calls. But, as with some other
+extensions in \LUAMETATEX, one way to prevent tracing clutter is to have a few
+handy primitives. So let's see what we got.
+
+{\em I haven't checked all operators and combinations yet!}
+
+\stopsection
+
+\startsection[title={Exploration}]
+
+Already early in the \LUAMETATEX\ development (2019) the expression parser was
+extended with an integer division operator \type {:} that we actually use in
+\LMTX, and soon after that I added basic bitwise operators but these were never
+activated but kept as comment because I didn't want to impact the scanner (even
+if we can afford to loose some performance because the scanner has been
+optimized). But in the process of cleaning up \quote {todo} comments in the
+source code I eventually arrived at expressions again.
+
+The colon already makes the scanner incompatible because \type {\numexpr 1+2:}
+expects a number (which means that we cannot port back) and more operators only
+make that less likely. In \CONTEXT\ I nearly always use \type {\relax} as
+terminator unless we're sure that lookahead is no issue. \footnote {In the \ETEX\
+expression parser, the normal \type {/} rounds the result. Both the \type {*} and
+\type {/} operator have a dedicated code path that assures no loss of accuracy.
+The \type {:} operator just divides like \LUA's \type {//} which is an integer
+division operator. There are subtle differences between the division variants
+which can be noticeable when you go round trip. That is actually the main reason
+why this was one of the first things added to \LUAMETATEX\ as I wanted to get rid
+of some few scaled point rounding issues. The \ETEX\ expression parser is
+somewhat complicated because it can deal with a mix of integers, dimensions and
+even glue, but always brings the result back to its main operating model. Because
+we adopted some of these \ETEX\ rather early in \CONTEXT\ lookahead pitfalls are
+taken care of already.}
+
+When going over the code in 2021, mostly because I wanted to get rid of some
+commented experiments, I decided that the extension should not go into the
+normal scanner but that a dedicated, simple and integer only scanner made more
+sense, so during a rainy summer weekend I started playing with that. It eventually
+became a bit more than initially intended, although the amount of code is rather
+minimal. The performance was about twice that of the already available bitwise
+macros but operator precedence was not provided (apart from the multiplication
+and division operators). The final implementation was different, not that much
+faster on simple bitwise operations but could do more complex things in one go.
+Performance was not a real reason to provide this anyway because we're talking
+microseconds, it's more about less code and better readability.
+
+The initial primitive command was \type {\bitexpr} and it supported nesting with
+parenthesis as the other expressions do. Because there are many operators, also
+verbose ones, the non|-|optional \type {\relax} token finishes parsing. But
+soon we moved on to two dedicated primitives.
+
+\stopsection
+
+\startsection[title={Operators}]
+
+The set of operators that we have to support is the following. Most have
+alternatives so that we can get around catcode issues.
+
+\starttabulate[||cT|cT|]
+\BC add \NC + \NC \NC \NR
+\BC subtract \NC - \NC \NC \NR
+\BC multiply \NC * \NC \NC \NR
+\BC divide \NC / : \NC \NC \NR
+\BC mod \NC \letterpercent \NC mod \NC \NR
+\BC band \NC & \NC band \NC \NR
+\BC bxor \NC ^ \NC bxor \NC \NR
+\BC bor \NC \letterbar \space v \NC bor \NC \NR
+\BC and \NC && \NC and \NC \NR
+\BC or \NC \letterbar\letterbar \NC or \NC \NR
+\BC setbit \NC <undecided> \NC bset \NC \NR
+\BC resetbit \NC <undecided> \NC breset \NC \NR
+\BC left \NC << \NC \NC \NR
+\BC right \NC >> \NC \NC \NR
+\BC less \NC < \NC \NC \NR
+\BC lessequal \NC <= \NC \NC \NR
+\BC equal \NC = == \NC \NC \NR
+\BC moreequal \NC >= \NC \NC \NR
+\BC more \NC > \NC \NC \NR
+\BC unequal \NC <> != \lettertilde = \NC \NC \NR
+\BC not \NC ! \lettertilde \NC not \NC \NR
+\stoptabulate
+
+I considered using \type {++} and type {--} as the \type {bset} and \type
+{bunset} shortcuts but that leads to issues because in \TEX\ \type {-+-++--10} is
+a valid number and one never knows what sequence (without spaces) gets fed into
+an expression.
+
+Originally I'd added some \UNICODE\ characters but for some reason support of
+logical operators is suboptimal so I removed that feature. Because these special
+characters are multi|-|byte \UTF\ sequences they are not that much better than
+verbose words anyway.
+
+% 0x00AC ! ¬ lua: not
+% 0x00D7 * ×
+% 0x00F7 / ÷
+% 0x2227 && ∧ c: and lua: and
+% 0x2228 || ∨ c: or lua: or
+% 0x2229 & ∩ c: bitand lua: band
+% 0x222A | ∪ c: bitor lua: bor
+% ^ c: bitxor lua: bxor
+% 0x2260 != ≠
+% 0x2261 == ≡
+% 0x2264 <= ≤
+% 0x2265 >= ≥
+% 0x22BB xor ⊻
+% 0x22BC nand ⊼
+% 0x22BD nor ⊽
+% 0x22C0 and ⋀ n-arry logical and
+% 0x22C1 or ⋁ n-arry logical or
+% 0x2AA1 << ⪡
+% 0x2AA2 >> ⪢
+
+\stopsection
+
+\startsection[title={Integers and dimensions}]
+
+When I was playing a bit with this feature, I wondered if we could mix in some
+dimensions. It was actually not that hard to add this: only explicit (verbose)
+dimensions had to be intercepted because dimen registers and such are seen as
+integers by the integer scanner. Once we're able do handle that, a next step was
+to make sure that \typ {2 * 10pt} was permitted, something that the \ETEX\ \type
+{\dimexpr} primitives can't handle. So, a variant of the dimen parser has to be
+used that makes the unit optional: \type {\dimexpression} and \type
+{\numexpression} were born.
+
+The resulting parsers worked quite well but were about twice as slow as the
+normal expression scanners but that is no surprise because they do more. For
+instance we are case insensitive and need to handle letter and other (and in a
+few cases alignment and superscript) catcodes too. However, with a slightly tuned
+integer parser, also possible because the sentinel \type {\relax} makes parsing
+more predictable, and a dedicated unit scanner, in the end both the integer and
+dimension parser were performing well. It's not like we run them millions of
+times in a document.
+
+\startbuffer
+\scratchcounter = \numexpression
+ "00000 bor "00001 bor "00020 bor "00400 bor "08000 bor "F0000
+\relax
+\stopbuffer
+
+Here is an example that results in {0x\inlinebuffer\uchexnumber\scratchcounter}:
+
+\typebuffer
+
+\startbuffer
+\scratchcounter = \numexpression
+ "FFFFF bxor "10101
+\relax
+\stopbuffer
+
+And this gives {0x\inlinebuffer\uchexnumber\scratchcounter}:
+
+\typebuffer
+
+We can give numerous example but you get the picture. In the above table you can
+see that some operators have equivalents. The reason for this is that a macro
+package can change catcodes and some characters have special meanings. So, the
+scanner is rather tolerant.
+
+\startbuffer
+\scratchcounterone = 10
+\scratchcountertwo = 20
+\ifcase \numexpression
+ (\scratchcounterone > 5) && (\scratchcountertwo > 5)
+\relax yes\else nop\fi
+%
+\space
+%
+\scratchcounterone = 2
+\scratchcountertwo = 4
+\ifcase \numexpression
+ (\scratchcounterone > 5) and (\scratchcountertwo > 5)
+\relax nop\else yes\fi
+\stopbuffer
+
+And this gives \quote {\tttf \inlinebuffer}:
+
+\typebuffer
+
+The normal expansion rules apply, so one can use macros and other symbolic
+numbers. The only difference in handling dimensions is that we don't support
+\type {true} units but these are obsolete in \LUAMETATEX\ anyway.
+
+In the end I decided to also add an extra conditional so that we can say:
+
+\starttyping
+\ifexpression (\scratchcounterone > 5) and (\scratchcountertwo > 5)\relax
+ nop
+\else
+ yes
+\fi
+\stoptyping
+
+which looks more natural. Actually, this is an nowadays alias because we have two
+variants:
+
+\starttyping
+\ifnumexpression ... \relax ... \else ... \fi
+\ifdimexpression ... \relax ... \else ... \fi
+\stoptyping
+
+where the later is equivalent to
+
+\starttyping
+\ifboolean\dimexpression ... \relax ... \else ... \fi
+\stoptyping
+
+\stopsection
+
+\startsection[title={Tracing}]
+
+When \type {\tracingexpressions} is set to one or higher the intermediate \quote
+{reverse polish notation} stack that is used for the calculation is shown, for
+instance:
+
+\starttyping
+4:8: {numexpression rpn: 2 5 > 4 5 > and}
+\stoptyping
+
+When you want the output on your console, you need to say:
+
+\starttyping
+\tracingexpressions 1
+\tracingonline 1
+\stoptyping
+
+The fact that we process the expression in two phases makes it possible to provide this
+kind of tracing.
+
+\stopsection
+
+\startsection[title={Performance}]
+
+The following table shows the results of 100.000 evaluations (per line) so you'll
+notice that there is a difference. But keep in mind that the new variant can so
+more, so it might pay off when we have cases that otherwise demand multiple
+traditional expressions.
+
+\starttabulate[|l|c|]
+\NC \type {\dimexpr 4pt*2 + 6pt\relax} \EQ \iftrialtypesetting\else\testfeatureonce{100000}{\scratchdimen \dimexpr 4pt*2 + 6pt\relax} \elapsedtime\fi \NC \NR
+\NC \type {\dimexpression 4pt*2 + 6pt\relax} \EQ \iftrialtypesetting\else\testfeatureonce{100000}{\scratchdimen \dimexpression 4pt*2 + 6pt\relax} \elapsedtime\fi \NC \NR
+\NC \type {\dimexpression 2*4pt + 6pt\relax} \EQ \iftrialtypesetting\else\testfeatureonce{100000}{\scratchdimen \dimexpression 4pt*2 + 6pt\relax} \elapsedtime\fi \NC \NR
+\TB
+\NC \type {\numexpr 4 * 2 + 6\relax} \EQ \iftrialtypesetting\else\testfeatureonce{100000}{\scratchcounter\numexpr 4 * 2 + 6\relax} \elapsedtime\fi \NC \NR
+\NC \type {\numexpression 2 * 4 + 6\relax} \EQ \iftrialtypesetting\else\testfeatureonce{100000}{\scratchcounter\numexpression 2 * 4 + 6\relax} \elapsedtime\fi \NC \NR
+\TB
+\NC \type {\numexpr 4*2+6\relax} \EQ \iftrialtypesetting\else\testfeatureonce{100000}{\scratchcounter\numexpr 4*2+6\relax} \elapsedtime\fi \NC \NR
+\NC \type {\numexpression 2*4+6\relax} \EQ \iftrialtypesetting\else\testfeatureonce{100000}{\scratchcounter\numexpression 2*4+6\relax} \elapsedtime\fi \NC \NR
+\TB
+\NC \type {\numexpr (1+2)*(3+4)\relax} \EQ \iftrialtypesetting\else\testfeatureonce{100000}{\scratchcounter\numexpr (1+2)*(3+4)\relax} \elapsedtime\fi \NC \NR
+\NC \type {\numexpression (1+2)*(3+4)\relax} \EQ \iftrialtypesetting\else\testfeatureonce{100000}{\scratchcounter\numexpression (1+2)*(3+4)\relax} \elapsedtime\fi \NC \NR
+\TB
+\NC \type {\numexpr (1 + 2) * (3 + 4) \relax} \EQ \iftrialtypesetting\else\testfeatureonce{100000}{\scratchcounter\numexpr (1 + 2) * (3 + 4) \relax} \elapsedtime\fi \NC \NR
+\NC \type {\numexpression (1 + 2) * (3 + 4) \relax} \EQ \iftrialtypesetting\else\testfeatureonce{100000}{\scratchcounter\numexpression (1 + 2) * (3 + 4) \relax} \elapsedtime\fi \NC \NR
+\stoptabulate
+
+As usual I'll probably find some way to improve performance a bit but that might
+than also concern the traditional one. When we compare them, the new numeric
+scanner suffers from more options while the new dimension parser gain on the
+units. Also, keep in mind than the \LUAMETATEX\ normal parsers are already
+somewhat faster than the ones in \LUATEX. The numbers above are calculated when
+this document is rendered, so they may change over time and per run. The two
+engines compare as follows (mid 2021):
+
+\starttabulate[|l|c|c|]
+\NC \BC \LUATEX \BC \LUAMETATEX \NC \NR
+\NC \type {\dimexpr 4pt*2 + 6pt\relax} \NC 0.073 \NC 0.045 \NC \NR
+\NC \type {\numexpr 4 * 2 + 6\relax} \NC 0.034 \NC 0.028 \NC \NR
+\NC \type {\numexpr 4*2+6\relax} \NC 0.035 \NC 0.032 \NC \NR
+\NC \type {\numexpr (1+2)*(3+4)\relax} \NC 0.050 \NC 0.047 \NC \NR
+\NC \type {\numexpr (1 + 2) * (3 + 4) \relax} \NC 0.052 \NC 0.048 \NC \NR
+\stoptabulate
+
+Of course tests like these are dubious because often \CPU\ cache will keep the
+current code accessible, but who knows.
+
+It will probably take a while before I will use this in the source code because
+first I need to make sure that all works as expected and while doing that I might
+adapt some of this. But the basic framework is there.
+
+\stopsection
+
+% \start
+% \nologbuffering
+% \scratchdimen 100pt
+% \scratchdimenone 65.536pt
+% \scratchdimentwo 65.536bp
+
+% \tracingonline1
+% \tracingexpressions1
+% \scratchcounter\bitexpr \scratchdimen / 2 \relax\the\scratchcounter\par
+
+% \scratchcounter\numexpression \scratchdimen / 2sp \relax \the\scratchcounter\par
+% \scratchcounter\numexpression \scratchdimen / 1pt \relax \the\scratchcounter\par
+% \scratchcounter\numexpression \scratchdimenone / 65.536pt \relax \the\scratchcounter\par
+% \scratchcounter\numexpression \scratchdimentwo / 2 \relax \the\scratchcounter\par
+
+% \scratchcounter\numexpression \scratchcounterone / 4 \relax \the\scratchcounter\par
+% \scratchdimen \dimexpression \scratchcounterone / 4 \relax \the\scratchdimen\par
+
+% \scratchdimen \dimexpression 2 * 4pt \relax \the\scratchdimen\par
+
+% \tracingexpressions0
+% \tracingonline0
+
+% \startTEXpage
+% \tracingonline1
+% \tracingexpressions1
+% \the\dimexpr -10pt\relax\quad
+% \the\dimexpr 10pt\relax\quad
+% \the\dimexpr 10.12 pt\relax\quad
+% \the\dimexpression -10pt\relax\quad
+% \the\dimexpression 10pt\relax\quad
+% \stopTEXpage
+
+\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
index fea3f7ac5ac..c25f425f14e 100644
--- 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
@@ -1,4 +1,4 @@
-% language=us
+% language=us runpath=texruns:manuals/evenmore
\environment evenmore-style
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/evenmore/evenmore-formats.tex b/Master/texmf-dist/doc/context/sources/general/manuals/evenmore/evenmore-formats.tex
new file mode 100644
index 00000000000..7ec95a7d440
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/evenmore/evenmore-formats.tex
@@ -0,0 +1,362 @@
+% language=us runpath=texruns:manuals/evenmore
+
+% This one accidentally ended up in the older history document followingup,
+% btu it's now moved here.
+
+\environment evenmore-style
+
+\startcomponent evenmore-format
+
+\startchapter[title={The format file}]
+
+It is interesting when someone compares macro package and used parameters like
+the size of a format file, the output of \type {\tracingall}, or startup time to
+make some point. The point I want to make here is that unless you know exactly
+what goes on in a run that involves a real document, which can itself involve
+multiple runs, such a comparison is rather pointless. For sure I do benchmark but
+I can only draw conclusions of what I (can) know (about). Yes, benchmarking your
+own work makes sense but doing that in comparisons to what you consider
+comparable variants assumes knowledge of more than your own work and objectives.
+
+
+For instance, when you load few fonts, typeset one page and don't do anything
+that demands any processing or multiple runs, you basically don't measure
+anything. More interesting are the differences between 10 or 500 pages, a few
+font calls or tens of thousands, no color of extensive usage of color and other
+properties, interfacing, including inheritance of document constructs, etc. And
+even then, when comparing macro packages, it is kind of tricky to deduce much
+from what you observe. You really need to know what is going on inside and also
+how that relates to for instance adaptive font scaling. You can have a fast start
+up but if a users needs one tikz picture, loading that package alone will make
+you forget the initial startup time. You always pay a price for advanced features
+and integration! And we didn't even talk about the operating system caching
+files, running on a network share, sharing processors among virtual machines,
+etc.
+
+Pointless comparing is also true for looking at the log file when enabling \type
+{\tracingall}. When a macro package loads stuff at startup you can be sure that
+the log file is larger. When a font or language is loaded the first time, or
+maybe when math is set up there can be plenty of lines dumped. Advanced analysis
+of conditions and trial runs come at a price too. And eventually, when a box is
+shown the configured depth and breadth really matter, and it might also be that
+the engine provides much more (verbose) detail. So, a comparison is again
+pointless. It can also backfire. Over the decades of developing \CONTEXT\ I have
+heard people working on systems make claims like \quotation {We prefer not to
+\unknown} or \quotation {It is better to it this way \unknown} or (often about
+operating system) \quotation {It is bad that \unknown} just to see years later
+the same being done in the presumed better alternative. I can have a good laugh
+about that: do this and don't do that backfiring.
+
+That brings us to the format file. When you make a \CONTEXT\ format with the
+English user interface, with interfacing being a feature that itself introduces
+overhead, the \LUATEX\ engine will show this at the end:
+
+\starttyping
+Beginning to dump on file cont-en.fmt
+ (format=cont-en 2021.6.9)
+48605 strings using 784307 bytes
+1050637 memory locations dumped; current usage is 414&523763
+44974 multiletter control sequences
+\font\nullfont=nullfont
+0 preloaded fonts
+\stoptyping
+
+The file itself is quite large: 11,129,903 bytes. However, it is actually much
+larger because the format file is compressed! The real size is 19.399.216. Not
+taking that into account when comparing the size of format files is kind of bad
+because compression directly relates to what resources a format use and how
+usage is distributed over the available memory blobs. The \LUATEX\ engine does
+some optimizations and saves the data sparse but the more holes you create, the
+worse it gets. For instance, the large character vectors are compartmentalized in
+order to handle \UNICODE\ efficiently so the used memory relates to what you
+define: do you set up all catcodes or just a subset. Maybe you delay some
+initialization to after the format is loaded, in which case a smaller format file
+gets compensated by more memory usage and initializaton time afterwards. Maybe
+your temporary macros create holes in the token array. The memory that is
+configured in the configuration files also matter. Some memory blobs are saved at
+their configured size, others dismiss the top part that is not used when saving
+the format but allocate the lot when the format is loaded. That means that memory
+usage in for instance \LUATEX\ can be much larger than a format file suggests.
+Keep in mind that a format file is basically a memory dump.
+
+Now, how does \LUAMETATEX\ compare to \LUATEX. Again we will look at the size of
+the format file, but you need to keep in mind that for various reasons the \LMTX\
+macros are somewhat more efficient than the \MKIV\ ones, in the meantime some new
+mechanism were added, which adds more \TEX\ and \LUA\ code, but I still expect
+(at least for now) a smaller format file. However when we create the format we
+see this (reformatted):
+
+\starttyping
+Dumping format 'cont-en.fmt 2021.6.9' in file 'cont-en.fmt':
+tokenlist compacted from 489733 to 488204 entries,
+1437 potentially aliased lua call/value entries,
+max string length 69, 16 fingerprint
++ 16 engine + 28 preamble
++ 836326 stringpool
++ 10655 nodes + 3905660 tokens
++ 705300 equivalents
++ 23072 math codes + 493024 text codes
++ 38132 primitives + 497352 hashtable
++ 4 fonts + 10272 math + 1008 language + 180 insert
++ 10305643 bytecodes
++ 12 housekeeping = 16826700 total.
+\stoptyping
+
+This looks quite different from the \LUATEX\ output. Here we report more detail:
+for each blob we mention the number of bytes used. The final result is a file
+that takes 16.826.700 bytes. That number should be compared with the 19.399.216
+for \LUATEX. So, we need less indeed. But, when we compress the \LUAMETATEX\
+format we get this: 5,913,932 which is much less than the 11,129,903 compressed
+size that the \LUATEX\ engine makes of it. One reason for using level 3 zip
+compression compression in \LUATEX\ is that (definitely when we started) it loads
+faster. It adds to creating the dump but doesn't really influence loading,
+although that depends a bit on the compiler used. It is not easy to see from
+these numbers what goes on, but when you consider the fact that we mostly store
+32 bit numbers it will also be clear that many can be zero or have two or three
+zero bytes. There's a lot of repetition involved!
+
+So let's look at some of these numbers. The mentioning of token list compaction
+relates to getting rid of holes in memory. Each token takes 8 bytes, 4 for the
+token identifier, internally called a cmd and chr, and 4 for a value like an
+integer or dimension value, or a glue pointer, or a pointer to a next token, etc.
+In our case compaction doesn't save that much.
+
+The mentioning of potentially aliased \LUA\ call|/|value entries is more a warning.
+Because the \LUA\ engine starts fresh each run, you cannot store its \quote
+{pointers} and because hashes are randomized this means that you need to delay
+initialization to startup time, definitely for function tokens.
+
+Strings in \TEX\ can be pretty long but in practice they aren't. In \CONTEXT\ the
+maximum string length is 69. This makes it possible to use one byte for
+registering the string length instead of four which saves quite a bit. Of course
+one large string will spoil this game.
+
+The fingerprint, engine, preamble and later housekeeping bytes can be neglected
+but the string pool not. These are the bytes that make up the strings. The bytes
+are stored in format but when loaded become dynamically allocated. The \LUATEX\
+engine and its successor don't really have a pool.
+
+Now comes a confusing number. There are not tens of thousands of nodes allocated.
+A node is just a pointer into a large array so actually node references are just
+indices. Their size varies from 2 slots to 25; the largest are par nodes, while
+shape nodes are allocated dynamically. So what gets reported are the number of
+bytes that nodes take. each node slot takes 8 bytes, so a glyph node of 12
+bytes takes 96 bytes, while a glue spec node (think skip registers) takes 5 slots
+or 40 bytes. These are amounts of memory that were not realistic when \TEX\ was
+written. For the record: in \LUATEX\ glue spec nodes are not shared, so we have
+many more.
+
+The majority of \TEX\ related dump data is for tokens, and here we need 3905660
+which means 488K tokens (each reported value also includes some overhead). The
+memory used for the table of equivalents makes for some 88K of them. This table
+relates to macros (their names and content). Keep in mind that (math) character
+references are also macros.
+
+The next sections that get loaded are math and text codes. These are the
+mentioned compartimized character properties. The number of math codes is not
+that large (because we delay much of math) but the text codes are plenty, think
+of lc, uc, sf, hj, catcodes, etc. Compared to \LUATEX\ we have more categories
+but use less space because we have an more granular storage model. Optimizing
+that bit really payed off, also because we have more vectors.
+
+The way primitives and macro names get resolved is pretty much the same in all
+engines but by using the fact that we operate in 32 bit I could actually get rid
+of some parallel tables that handle saving and restore. Some optimizations relate
+to the fact that the register ranges are part of the game so basically we have
+some holes in there when they are not used. I guess this is why \ETEX\ uses a
+sparse model for the registers above 255. What also saved a lot is that we don't
+need to store font names, because these are available in another way; even in
+\LUATEX\ that takes a large, basically useless, chunk. The memory that a macro
+without parameters consumes is 8 bytes smaller and in \CONTEXT\ we have lots of
+these.
+We don't really store fonts, so that section is small, but we do store the math
+parameters, and there is not much we can save there. We also have more such
+parameters in \LUAMETATEX\ so there we might actually use more storage. The
+information related to languages is also minimal because patterns and exceptions
+are loaded at runtime. A new category (compared to \LUATEX) is inserts because in
+\LUAMETATEX\ we can use an alternative (not register based) variant. As you can
+see from the 180 bytes used, indeed \CONTEXT\ is using that variant.
+
+That leaves a large block of more than 10 million bytes that relates to \LUA\
+byte code. A large part of that is the huge \LUA\ character table that \CONTEXT\
+uses. The implementation of font handling also takes quite a bit and we're not
+even talking of all the auxiliary \LUA\ modules, \XML\ processing, etc. When
+\CONTEXT\ would load that on demand, which is nearly always, the format file
+would be much smaller but one would pay for it later. Loading the (some 600)
+\LUA\ byte code chunks takes of course some time as does initialization but not
+much.
+
+All that said, the reason why we have a large format file can be understood well
+if one considers what goes in there. The \CONTEXT\ format files for \PDFTEX\ and
+\XETEX\ are 3.3 and 4.7 MB each which is smaller but not that much when you
+consider the fact that there is no \LUA\ code stored and that there are less
+character tables and an \ETEX\ register model used. But a format file is not the
+whole story. Runtime memory usage also comes at a price.
+
+The current memory settings of \CONTEXT\ are as follows; these values get
+reported when a format has been generated and can be queried at runtime an any
+moment:
+
+\starttabulate[|l|r|r|r|r|]
+\BC \BC max \BC min \BC set \BC stp \BC \NR
+\HL
+\BC string \NC 2097152 \NC 150000 \NC 500000 \NC 100000 \NC \NR
+\BC pool \NC 100000000 \NC 10000000 \NC 20000000 \NC 1000000 \NC \NR
+\BC hash \NC 2097152 \NC 150000 \NC 250000 \NC 100000 \NC \NR
+\BC lookup \NC 2097152 \NC 150000 \NC 250000 \NC 100000 \NC \NR
+\BC node \NC 50000000 \NC 1000000 \NC 5000000 \NC 500000 \NC \NR
+\BC token \NC 10000000 \NC 1000000 \NC 10000000 \NC 250000 \NC \NR
+\BC buffer \NC 100000000 \NC 1000000 \NC 10000000 \NC 1000000 \NC \NR
+\BC input \NC 100000 \NC 10000 \NC 100000 \NC 10000 \NC \NR
+\BC file \NC 2000 \NC 500 \NC 2000 \NC 250 \NC \NR
+\BC nest \NC 10000 \NC 1000 \NC 10000 \NC 1000 \NC \NR
+\BC parameter \NC 100000 \NC 20000 \NC 100000 \NC 10000 \NC \NR
+\BC save \NC 500000 \NC 100000 \NC 500000 \NC 10000 \NC \NR
+\BC font \NC 100000 \NC 250 \NC 250 \NC 250 \NC \NR
+\BC language \NC 10000 \NC 250 \NC 250 \NC 250 \NC \NR
+\BC mark \NC 10000 \NC 50 \NC 50 \NC 50 \NC \NR
+\BC insert \NC 500 \NC 10 \NC 10 \NC 10 \NC \NR
+\stoptabulate
+
+The maxima is what can be used at most. Apart from the magic number 2097152 all
+these maxima can be bumped at compile time but if you need more, you might wonder
+of your approach to rendering makes sense. The minima are what always gets
+allocated, and again these are hard coded defaults. The size can be configured
+and is normally the same as the minima but we use larger values in \CONTEXT. The
+step is how much an initial memory blob will grow when more is needed than is
+currently available. The last four entries show that we don't start out with many
+fonts (especially when we use the \CONTEXT\ compact font model not that many are
+needed) and because \CONTEXT\ implements marks in a different way we actually
+don't need them. We do use the new insert properties storage model and for now
+the set sizes are enough for what we need.
+
+In practice a \LUAMETATEX\ run uses less memory than a \LUATEX\ one, not only
+because memory allocation is more dynamic, but also because of other
+optimizations. When the compact font model is used (something \CONTEXT) even less
+memory is needed. Even this claim should be made with care. Whenever I discuss
+the use of resources one needs to limit the conclusions to \CONTEXT. I can't
+speak for other macro packages simply because I don't know the internals and the
+design decisions made and their impact on the statistics. As a teaser I show the
+impact of some definitions:
+
+\starttyping
+\chardef \MyFooA1234
+\Umathchardef\MyFooB"1 "0 "1234
+\Umathcode 1 2 3 4
+\def \MyFooC{ABC}
+\def \MyFooD#1{A#1C}
+\def \MyFooE{\directlua{print("some lua")}}
+\stoptyping
+
+The stringpool grows because we store the names (here they are of equal length).
+Only symbolic definitions bump the hashtable and equivalents. And with
+definitions that have text inside the number of bytes taken by tokens grows fast
+because every character in that linked list takes 8 bytes, 4 for the character
+with its catcode state and 4 for the link to the next token.
+
+\starttabulate[|l||||||]
+\BC \BC stringpool \BC tokens \BC equivalents \BC hashtable \BC total \NC \NR
+\HL
+\NC \NC 836408 \NC 3906124 \NC 705316 \NC 497396 \NC 16828987 \NC \NR
+\NC \type {\chardef} \NC 836415 \NC 3906116 \NC 705324 \NC 497408 \NC 16829006 \NC \NR
+\NC \type {\Umathchardef} \NC 836422 \NC 3906116 \NC 705324 \NC 497420 \NC 16829025 \NC \NR
+\NC \type {\Umathcode} \NC 836422 \NC 3906124 \NC 705324 \NC 497420 \NC 16829033 \NC \NR
+\NC \type {\def} (no arg) \NC 836429 \NC 3906148 \NC 705332 \NC 497428 \NC 16829080 \NC \NR
+\NC \type {\def} (arg) \NC 836436 \NC 3906196 \NC 705340 \NC 497440 \NC 16829155 \NC \NR
+\NC \type {\def} (text) \NC 836443 \NC 3906372 \NC 705348 \NC 497452 \NC 16829358 \NC \NR
+\stoptabulate
+
+So, every time a user wants some feature (some extra checking, a warning, color
+or font support for some element) that results in a trivial extension to the
+core, it can bump the size fo the format file more than you think. Of course when
+it leads to some overhaul sharing code can actually make the format shrink too. I
+hope it is clear now that there really is not much to deduce from the bare
+numbers. Just try to imagine what:
+
+\starttyping
+\definefilesynonym
+ [type-imp-newcomputermodern-book.mkiv]
+ [type-imp-newcomputermodern.mkiv]
+\stoptyping
+
+adds to the format. Convenience has a price.
+
+\stopchapter
+
+\stopcomponent
+
+% Some bonus content:
+
+When processing thousand paragraphs \type {tufte.tex}, staying below 4 seconds
+(just over 60 pages per second) all|-|in that looks ok. But it doesn't say that
+much. Outputting 1000 pages in 2 seconds tells a bit about the overhead on a page
+but again in practice things work out differently. So what do we need to
+consider?
+
+\startitemize
+
+\startitem
+ Check what macros and resources are preloaded and what gets always loaded at
+ runtime.
+\stopitem
+
+\startitem
+ After a first run it's likely that the operating system has resources in its
+ cache so start measuring after a few runs.
+\stopitem
+
+\startitem
+ Best run a test many times and and take the average runtime.
+\stopitem
+
+\startitem
+ Simple macro performance tests can be faster than in real usage because the
+ related bytes are in \CPU\ cache memory. So one can only use that to test a
+ specific improvement (or hit due to added functionality).
+\stopitem
+
+\startitem
+ The size of the used \TEX\ tree can matter. The file databases need to be
+ loaded and consulted.
+\stopitem
+
+\startitem
+ The binary matters: is it optimized, does it load libraries, is it 64 bit or not.
+\stopitem
+
+\startitem
+ Local and|/|or global font definitions can hit performance and when a style
+ does many redundant switches it might hit performance. Of course that only is
+ the case when font switching is adaptive.
+\stopitem
+
+\startitem
+ The granularity of subsystems impacts performance: advanced color support,
+ inheritance used in mechanisms, abstraction combined with extensive
+ support for features, it all matters.
+\stopitem
+
+\startitem
+ The more features one enables the more it will impact performance as does
+ preprocessing the input (normalizing, bidi checking, etc).
+\stopitem
+
+\startitem
+ It matters how the page (and layout) dimensions are defined. Although
+ language doesn't really play a role (apart from possible hyphenation)
+ specific scripts might.
+\stopitem
+
+\stopitemize
+
+These are just a few points, but it might be clear that I don't take comparisons
+too serious simply because it's real runs that matter. As long as we're in the
+runtime comfort zone we're okay. You can run tests within the domain of a macro
+package but comparing macro package makes not that much sense. It can even
+backfire, especially when claims were made about what should be or not be in a
+kernel (while later violating that) or relying on old stories (or rumors) about a
+variant macro package being slow. (The same is true when comparing one's favorite
+operating system.) Yes, the \CONTEXT\ format file is huge and performance less
+than for instance plain \TEX. If that is a problem and not a virtue then make
+sure your own alternative will never end up like that. And just don't come to
+conclusions about a system that you don't really know.
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/evenmore/evenmore-hyphenation.tex b/Master/texmf-dist/doc/context/sources/general/manuals/evenmore/evenmore-hyphenation.tex
new file mode 100644
index 00000000000..50113ed2720
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/evenmore/evenmore-hyphenation.tex
@@ -0,0 +1,426 @@
+% language=us runpath=texruns:manuals/evenmore
+
+\environment evenmore-style
+
+\startcomponent evenmore-hyphenation
+
+\usebodyfont[pagella]
+
+\startchapter[title=Hyphenation]
+
+\startsection[title={Introduction}]
+
+Hyphenation is driven by the character codes. In a traditional \TEX\ such a code
+accesses a glyph in a font, which is why the font encoding mattered, but in
+\LUATEX\ we use \UNICODE\ and when hyphenation is applied. \footnote {In
+\CONTEXT\ \MKII\ we also use \UTF\ patterns, which made it possible to ship
+patterns that didn't depend on a font encoding. Mojca and Arthur made \UTF\ the
+default when the (upgraded) hyphenation pattern project started.} Later, the
+character codes are adapted by the font handler where they become glyphs. There
+are moments when you don't want to hyphenate and a cheap trick is to switch to a
+language that has no hyphenation patterns. But, in a system like \CONTEXT\ that
+doesn't work well because we have lots of language bound properties. Therefore in
+\MKIV\ we set the left- and right hyphen minima to extreme values, something that
+blocks hyphenation quite well. But this is not a pretty solution at all. Even
+worse is that when we have situations where discretionaries (\type
+{\discretionary}), automatic (\type{-}) or explicit (\type {\-}) are used these
+still kick in.
+
+For that reason in \LMTX\ we have a mode variable that controls hyphenation. In
+\LUATEX\ we have primitives like \type {\compoundhyphenmode}, \type
+{\hyphenationbounds} and \type {\hyphenpenaltymode} that controlled how
+hyphenation and discretionary injection is handled but when in \LUAMETATEX\ the
+more generic \type {\hyphenationmode} parameter was introduced the precursors
+were all merged into this one. One can argue that this is a form of regression
+but there are good reasons, most noticeably the fact that we keep these
+properties with glyph nodes so that we have better control over them in grouped
+situations where as some operations happen when the paragraph as whole get
+treated local overloads are lost. \footnote {Of course it also is a wink to those
+who complain that we add primitives to an otherwise leaner variant of \LUATEX,
+but let us not elaborate on that misunderstanding.} It anyway means that in
+\LMTX\ we have to set different parameters but that is no big deal because users
+are supposed to use the more high level interfaces; instead of setting parameters
+to values one flips bits in \type {\hyphenationmode}, which in the end makes more
+sense and also permits extensions later without adding much overhead.
+
+Currently this mode parameter controls the following options:
+
+\starttabulate[|Tr|||]
+\NC \uchexnumber{\normalhyphenationcode} \NC \type{\normalhyphenationcode} \NC honour the (normal) \type{\discretionary} primitive \NC \NR
+\NC \uchexnumber{\automatichyphenationcode} \NC \type{\automatichyphenationcode} \NC turn \type {-} into (automatic) discretionaries \NC \NR
+\NC \uchexnumber{\explicithyphenationcode} \NC \type{\explicithyphenationcode} \NC turn \type {\-} into (explicit) discretionaries \NC \NR
+\NC \uchexnumber{\syllablehyphenationcode} \NC \type{\syllablehyphenationcode} \NC hyphenate (syllable) according to language \NC \NR
+\NC \uchexnumber{\uppercasehyphenationcode} \NC \type{\uppercasehyphenationcode} \NC hyphenate uppercase characters too \NC \NR
+\NC \uchexnumber{\compoundhyphenationcode} \NC \type{\compoundhyphenationcode} \NC permit break at an explicit hyphen (border cases) \NC \NR
+\NC \uchexnumber{\strictstarthyphenationcode} \NC \type{\strictstarthyphenationcode} \NC traditional \TEX\ compatibility wrt the start of a word \NC \NR
+\NC \uchexnumber{\strictendhyphenationcode} \NC \type{\strictendhyphenationcode} \NC traditional \TEX\ compatibility wrt the end of a word \NC \NR
+\NC \uchexnumber{\automaticpenaltyhyphenationcode} \NC \type{\automaticpenaltyhyphenationcode} \NC use \type {\automatichyphenpenalty} \NC \NR
+\NC \uchexnumber{\explicitpenaltyhyphenationcode} \NC \type{\explicitpenaltyhyphenationcode} \NC use \type {\explicithyphenpenalty} \NC \NR
+\NC \uchexnumber{\permitgluehyphenationcode} \NC \type{\permitgluehyphenationcode} \NC turn glue in discretionaries into kerns \NC \NR
+\stoptabulate
+
+The default \CONTEXT\ setup is:
+
+\starttyping
+\hyphenationmode \numexpr
+ \normalhyphenationcode
+ + \automatichyphenationcode
+ + \explicithyphenationcode
+ + \syllablehyphenationcode
+ + \uppercasehyphenationcode
+ + \compoundhyphenationcode
+ % \strictstarthyphenationcode
+ % \strictendhyphenationcode
+ + \automaticpenaltyhyphenationcode
+ + \explicitpenaltyhyphenationcode
+ + \permitgluehyphenationcode
+\relax
+\stoptyping
+
+When a discretionary node is created (triggered by \type {\discretionary}) the
+current value is used. Injected glyph nodes on the other hand will store the
+current value and use that when it is needed for hyphenating the list.
+
+\stopsection
+
+\startsection[title={Controlling hyphenation}]
+
+We start with an example that has some Dutch words:
+
+\startbuffer[sample]
+NEDERLANDS\par Nederlands\par nederlands\par
+\CONTEXT \par test\-test\par test-test \par
+\stopbuffer
+
+\typebuffer[sample]
+
+\startbuffer[result]
+\startlinecorrection
+\dontleavehmode \dorecurse{\boxlines\scratchboxone} {%
+ \setbox\scratchbox\boxline\scratchboxone#1%
+ \ruledhpack{\strut\unhbox\scratchbox}%
+ \kern.25\emwidth
+}
+\stoplinecorrection
+\stopbuffer
+
+When we typeset this with a \type {\hsize} of 2mm we get:
+
+\setbox\scratchboxone\vbox{\dontcomplain \nl \hsize 2mm \getbuffer[sample]}
+
+\getbuffer[result]
+
+But when we block hyphenation with \type {\nohyhens} we see:
+
+\setbox\scratchboxone\vbox{\dontcomplain \nl \hsize 2mm \nohyphens \getbuffer[sample]}
+
+\getbuffer[result]
+
+The \MKIV\ behavior can be emulated by setting the mode as follows
+
+\startbuffer[demo]
+\bitwiseflip \hyphenationmode \syllablehyphenationcode
+\stopbuffer
+
+\setbox\scratchboxone\vbox{\dontcomplain \nl \hsize 2mm \getbuffer[demo] \getbuffer[sample]}
+
+\getbuffer[result]
+
+This time the three non|-|syllable variants get hyphenated and that is not what
+we want. In this case there is a \type {\discretionary} in the definition of the
+macro that generates \CONTEXT\ and, apart from the fact that we might not even
+want to hyphenate logos, we have to block it when we apply \type {\nohyphens}.
+
+This mode setting are directly applied to the three non|-|syllable variants but
+delayed in the syllable discretionaries because hyphenation happens later so the
+state becomes a property of glyph nodes. Doing the same for the other
+discretionaries would demand an adaption of various pieces of the engine code and
+plugged in user (\LUA) code also has to consider it which makes no sense.
+
+\startbuffer[sample]
+\nohyphens nederlands {\dohyphens nederlands} nederlands\par
+\stopbuffer
+
+\typebuffer[sample]
+
+\setbox\scratchboxone\vbox{\dontcomplain \nl \hsize 2mm \getbuffer[sample]}
+\getbuffer[result]
+
+Compare this with:
+
+\startbuffer[sample]
+nederlands {\nohyphens nederlands} nederlands\par
+\stopbuffer
+
+\typebuffer[sample]
+
+\setbox\scratchboxone\vbox{\dontcomplain \nl \hsize 2mm \getbuffer[sample]}
+\getbuffer[result]
+
+\stopsection
+
+\startsection[title={Compound hyphenation}]
+
+Yet another discretionary related issue is with compound words, that is: cases
+where \type {\discretionary} commands sit between words. There are of course
+tricks to deal with it like adding a huge penalty combined with a zero skip. This
+is okay in a traditional \TEX\ engine but in an opened up one you might not want
+this. Just to mention one aspect: when processing \OPENTYPE\ fonts you actually
+need to look into discretionaries in order to deal with glyphs that interact. And
+you don't want to deal with penalties and skips unless they have an explicit
+meaning. We show the four possibilities:
+
+\startbuffer[sample]
+nederlands\discretionary {!}{!}{!}nederlands\blank
+\stopbuffer
+
+\typebuffer[sample]
+
+\setbox\scratchboxone\vbox{\dontcomplain \nl \hsize 2mm \getbuffer[sample]}
+\getbuffer[result]
+
+\startbuffer[sample]
+nederlands\discretionary options 1 {!}{!}{!}nederlands\blank
+\stopbuffer
+
+\typebuffer[sample]
+
+\setbox\scratchboxone\vbox{\dontcomplain \nl \hsize 2mm \getbuffer[sample]}
+\getbuffer[result]
+
+\startbuffer[sample]
+nederlands\discretionary options 2 {!}{!}{!}nederlands\blank
+\stopbuffer
+
+\typebuffer[sample]
+
+\setbox\scratchboxone\vbox{\dontcomplain \nl \hsize 2mm \getbuffer[sample]}
+\getbuffer[result]
+
+\startbuffer[sample]
+nederlands\discretionary options 3 {!}{!}{!}nederlands\blank
+\stopbuffer
+
+\typebuffer[sample]
+
+\setbox\scratchboxone\vbox{\dontcomplain \nl \hsize 2mm \getbuffer[sample]}
+\getbuffer[result]
+
+Here is an example of such an interference. Of course in practice this happens
+seldom and certainly not with ligatures. Some fonts have kerning between certain
+glyphs and for instance dashes and there it could matter.
+
+\startbuffer
+ef%
+\penalty \plustenthousand
+\hskip \zeropoint
+\discretionary{-}{f}{f}%
+\penalty \plustenthousand
+\hskip \zeropoint
+e
+ef\discretionary options 3 {-}{f}{f}e
+\stopbuffer
+
+\typebuffer
+
+As you can see, we only get the ligature when we set the options. In the process
+of processing \OPENTYPE\ features it can be that one actually looses a
+discretionary, although we try to prevent this when possible.
+
+\startlinecorrection
+\scale[height=2cm]{\setupbodyfont[pagella]\showglyphs\getbuffer}
+\stoplinecorrection
+
+But, as said, the fact that we don't need the penalties and glue helps at the
+\LUA\ end: the cleaner the node list, the better.
+
+\stopsection
+
+\startsection[title={Tracing}]
+
+The already present tracker command has been extended so handle the options:
+
+\startbuffer[sample0]
+\enabletrackers[discretionaries]
+\stopbuffer
+\startbuffer[sample1]
+test\discretionary {]} {[} {[]}test
+\stopbuffer
+\startbuffer[sample2]
+testing\discretionary {]} {[} {[]}testing
+\stopbuffer
+\startbuffer[sample3]
+testing\discretionary options 3 {]} {[} {[]}testing
+\stopbuffer
+
+\typebuffer[sample0,sample1,sample2,sample3]
+
+\setbox\scratchboxone\vbox{\dontcomplain \getbuffer[sample0,sample1]} \getbuffer[result]
+\setbox\scratchboxone\vbox{\dontcomplain \hsize 2mm \getbuffer[sample0,sample2]} \getbuffer[result]
+\setbox\scratchboxone\vbox{\dontcomplain \hsize 2mm \getbuffer[sample0,sample3]} \getbuffer[result]
+
+\stopsection
+
+\startsection[title={Glue in discretionaries}]
+
+In the case you cannot predict what goes into a discretionary you can get run into
+an error message with respect to unsupported glue in a disc node. The mode value
+\number\permitgluehyphenationcode\space makes glue acceptable and turn into
+kern, as demonstrated here;
+
+\startbuffer
+{\hsize 1mm \darkblue \discretionary{potential conspiracy}{prophets}{influencers}\par}
+\stopbuffer
+
+\typebuffer
+
+The line break occurs but the space in the pre part is of course frozen:
+
+{\getbuffer}
+
+As usual \TEX\ users will come up with applications.
+
+\stopsection
+
+\startsection[title={Penalties}]
+
+By default the par builder will use the value of \type {\hyphenpenalty} that gets
+stored in the discretionary node. However, when the \type {\discretionary} is
+followed by a \type {penalty} keyword and a number, that one will.
+
+\stopsection
+
+\startsection[title=Exceptions]
+
+At some point a user on the \CONTEXT\ mailing list wondered how to deal with a case
+like this:
+
+\startbuffer[example]
+\switchtobodyfont[pagella]\mainlanguage[de]auffasse
+\stopbuffer
+
+\typebuffer[example]
+
+\startlinecorrection
+\scale[height=2cm]{\inlinebuffer[example]}
+\stoplinecorrection
+
+\startbuffer
+\startexceptions[de]
+au{f-}{-f}{ff}(f\zwnj f)asse
+\stopexceptions
+\stopbuffer
+
+In \LUAMETATEX\ you can block the unwanted ligature using this trick:
+
+\typebuffer \getbuffer
+
+\startlinecorrection
+\scale[height=2cm]{\inlinebuffer[example]}
+\stoplinecorrection
+
+The exception mechanism in \LUATEX\ and therefore \LUAMETATEX\ works as follows.
+When we have this exception:
+
+\starttyping
+au{f-}{-f}{ff}asse
+\stoptyping
+
+the engine will register that exception under \type {auffasse}, that is: the
+replacement part determines the word. When it runs into that word, it will create
+a so called discretionary node with a pre, post and replace part. However, it
+only uses the \type {ff} for a lookup and keeps the original two glyphs: these
+become the replacement text. However, in \LUAMETATEX\ you can add an alternative
+replacement:
+
+\startbuffer
+\startexceptions[de]
+au{f-}{-f}{ff}(st)asse
+\stopexceptions
+\stopbuffer
+
+\typebuffer \getbuffer
+
+This time the replacement text becomes \type {xx}. So we get \type {austasse} and
+it is that sequence that is seen by the font handler when it applies its tricks.
+On some fonts however
+
+\startbuffer[example]
+\switchtobodyfont[pagella]\mainlanguage[de]auffasse
+\stopbuffer
+
+\startlinecorrection
+\scale[height=2cm]{\showglyphs\showfontkerns\inlinebuffer[example]}
+\stoplinecorrection
+
+But in the Pagella font that we use here, a kern is added between the \type {s} and
+the \type {t}. If you don't want that you can say this:
+
+\startbuffer
+\startexceptions[de]
+au{f-}{-f}{ff}(s\zwnj t)asse
+\stopexceptions
+\stopbuffer
+
+\typebuffer \getbuffer
+
+\startlinecorrection
+\scale[height=2cm]{\showglyphs\showfontkerns\inlinebuffer[example]}
+\stoplinecorrection
+
+A \type {zwj} will block a ligature (some fonts have an \type {st} ligature) and a
+\type {zwnj} blocks a ligatures as well as kerns.
+
+You can actually abuse this mechanism for trickery like this:
+
+\startbuffer
+\startexceptions[nl]
+wis-kun-d{e-}{o}{eo}(e-o)n-der-wijs
+\stopexceptions
+\stopbuffer
+
+\typebuffer \getbuffer
+
+The Dutch word \type {wiskundeonderwijs} is found as exception and comes out like
+this:
+
+\startbuffer[example]
+\switchtobodyfont[pagella]\mainlanguage[nl]wiskundeonderwijs
+\stopbuffer
+
+\startlinecorrection
+\scale[height=1cm]{\showglyphs\showfontkerns\inlinebuffer[example]}
+\stoplinecorrection
+
+Watch the hyphen that makes the compound word more visible! The other hyphens in
+the exception are proper hyphenation points and when a break happens there a
+hyphen is automatically added. The \type {\nokerning} and \type {\noligaturing}
+macros can be used grouped:
+
+\startbuffer[example]
+{every}\quad
+{\nokerning every}\quad
+{\noligaturing every}\quad
+{e{\nokerning v}ery}\quad
+{e{\glyphoptions\noleftkernglyphoptioncode v}ery}\quad
+{e{\glyphoptions\norightkernglyphoptioncode v}ery}\quad
+\stopbuffer
+
+\typebuffer[example]
+
+There are several low level control options. In addition to those shown here we
+have a pair for ligatures: \typ {\noleftligatureglyphoptioncode} and \typ
+{\norightligatureglyphoptioncode}.
+
+\startlinecorrection[blank]
+\scale[width=\textwidth]{\showglyphs\showfontkerns\inlinebuffer[example]}
+\stoplinecorrection
+
+There are alternative mechanism, like a blocker that implements a font feature
+and a replacement mechanism, but these are not discussed here.
+
+\stopsection
+
+\stopchapter
+
+\stopcomponent
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/evenmore/evenmore-inserts.tex b/Master/texmf-dist/doc/context/sources/general/manuals/evenmore/evenmore-inserts.tex
new file mode 100644
index 00000000000..75c79e88866
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/evenmore/evenmore-inserts.tex
@@ -0,0 +1,198 @@
+% language=us runpath=texruns:manuals/evenmore
+
+\environment evenmore-style
+
+\startcomponent evenmore-inserts
+
+\startchapter[title=Inserts]
+
+{\em As in other chapters, this is mostly a wrapup of some developments and nota
+manual. What is described here might actually evolve. Normally \CONTEXT\ users
+will not notice these details, but it might help them to get an idea of what
+complications we're dealing with.}
+
+\startsection[title=Notes]
+
+Quite some \TEX\ users love footnotes. These typographical elements have two
+properties:
+
+\startitemize[n]
+\startitem
+ A blob of text, often placed at the bottom of a page or at the end of a
+ section, chapter or document. A note can be a short one|-|liner but also
+ a paragraph of text.
+\stopitem
+\startitem
+ A symbol in the running text that serves as reference to that blob. It can be
+ a number of just some unique symbol.
+\stopitem
+\stopitemize
+
+When such a note is placed at the bottom of a page, the page builder needs to
+take its dimensions into account when calculating an optimal page break. It might
+even have to split a note over pages. Preferably the reference and note are on
+the same page. In order to achieve this there is a special mechanism that deals
+with this: inserts. In this chapter we only discuss them in the perspective of
+notes but they can also be used for, for instance, top or bottom figures, tables,
+etc.
+
+\stopsection
+
+\startsection[title=Global and local]
+
+Normally notes are placed in the text flow. We call these global inserts. When
+they are attached to a specific typographical element we tend to call them local
+and there is a good reason for that. For instance, when used in a table, one
+might want to keep them with that table when it is moved to a place where it
+fits. When notes are packaged {\em with} the table they are flushed on demand and
+not handled by the page builder. Actually they don't use inserts then. One
+problem with global notes is that the \TEX\ engine has some limitations with
+respect to inserts. In traditional \TEX, the following example will only result
+in note \quote {a} being placed. The other two are buried too deeply.
+
+\startbuffer[insert]
+test \footnote {a} \hbox {test \footnote{b} \hbox {test \footnote {c}} test} test
+\stopbuffer
+
+\typebuffer[insert]
+
+There are a few places where \TEX\ will bubble up the notes: when it constructs
+lines during a breaking a paragraph into lines, and when constructing alignment
+cells. In all other cases they are simply discarded.
+
+In \CONTEXT\ \MKII\ there is a mechanism that can postpone such notes. Normally a
+user will not use boxes directly so when some mechanism is used that does box
+its content, \CONTEXT\ can collect the notes and flush them in a spot that
+exposes them. This works reasonable well be it that we loose some of the
+synchronization with the page builder: flushing can happen after a page break.
+
+Already early in the \CONTEXT\ \MKIV\ development a more advanced mechanism was
+introduced, using \LUA\ callbacks: auto migration. There (optionally) inserts are
+bubbled up to a level where they are visible but even that has its limitations. Users
+explicitly need to enable automigration in \MKIV.
+
+In \CONTEXT\ \LMTX\ we do it a bit different because the \LUAMETATEX\ engine has
+a feature that helps. More about that next.
+
+\stopsection
+
+\startsection[title=Pre and post migration]
+
+There is another mechanism that moves material from the spot: adjusts. Here is an
+example (watch the interline spacing):
+
+\startbuffer[adjust]
+\strut test \vadjust pre {\red \strut before} test \vadjust {\red \strut after}
+\stopbuffer
+
+\typebuffer[adjust]
+
+This gives:
+
+\blank {\bf\showstruts \getbuffer[adjust]} \blank
+
+The \type {pre} variant was introduced in \PDFTEX\ at a time that I actually has
+use for it (think of marginal notes) but in \MKIV\ we don't use this adjust
+mechanism.
+
+Inserts on the other hand always end up \quote {post} where they are injected.
+Some day I might think about what good there is in injecting them \quote {pre}
+where they are injected. It might become an option.
+
+\blank {\bf \showboxes \getbuffer[insert]} \blank
+
+In this already shown example the footnotes (that are implemented using inserts)
+result indeed in text showing up at the bottom of the page, even when they are
+wrapped in boxes. The reason is that we have enabled a mechanism that
+automatically bubble them up:
+
+\starttyping
+\automigrationmode = 3 % \numexpr 1 + 2 \relax
+\stoptyping
+
+Here bit~1 controls migration in lists and bit~2 controls migration in the main
+vertical list (the page flow). In \CONTEXT\ \LMTX\ we enable both.
+
+\startbuffer
+h: \setbox0\hbox{box \footnote{h: box}}\setbox2\hbox{\box 0}\box2\quad
+h: \setbox0\hbox{copy \footnote{h: copy}}\setbox2\hbox{\copy 0}\box2\quad
+h: \setbox0\hbox{unbox \footnote{h: unhbox}}\setbox2\hbox{\unhbox 0}\box2\quad
+h: \setbox0\hbox{uncopy \footnote{h: unhcopy}}\setbox2\hbox{\unhcopy0}\box2\quad
+v: \setbox0\hbox{box \footnote{v: box}}\setbox2\vbox{\box 0}\box2\quad
+v: \setbox0\hbox{copy \footnote{v: copy}}\setbox2\vbox{\copy 0}\box2\quad
+v: \setbox0\hbox{unbox \footnote{v: unhbox}}\setbox2\vbox{\unhbox 0}\box2\quad
+v: \setbox0\hbox{uncopy \footnote{v: unhcopy}}\setbox2\vbox{\unhcopy0}\box2\quad
+\stopbuffer
+
+\typebuffer
+
+This is a kind of torture test:
+
+\blank \hbox{\bf \getbuffer} \blank
+
+It might look kind of trivial to accomplish this but it actually took some
+experimenting to get it right. It also must be noted that because in \LUATEX\ and
+even more in \LUAMETATEX\ the nodes that store a box are much larger than in
+traditional \TEX\ and that the price for adding some additional overhead for
+dealing with pre- and post material had not that much impact on the performance
+of \LUAMETATEX.
+
+On the one hand we need to make sure that the inserts are kept with the box but
+on the other hand they should really migrate when the boxed material gets boxed
+itself. This has to be combined with unboxing and copying. It has to work in
+regular boxes but also in the main vertical list (the page flow).
+
+\stopsection
+
+\startsection[title=Playground]
+
+You can play a bit with this mechanism by getting and setting the pre and post
+material than relates to a box.
+
+\startbuffer
+\setbox0\ruledhbox{\strut content \footnote {footnote}}
+
+[flush pre\prelistbox 0] % \prelistcopy 0
+[flush post\postlistbox 0] % \postlistcopy 0
+[set pre\setprelistbox 0\ruledhbox{\strut before}]
+[set post\setpostlistbox0\ruledhbox{\strut after}]
+
+\blank \box0 \blank
+\stopbuffer
+
+\typebuffer
+
+\getbuffer
+
+Of course there can be side effects but so far this mechanism works reasonable
+well, given what it has to deal with.
+
+\stopsection
+
+\startsection[title=Marks]
+
+The low level marks mechanism can use the same pre and post mechanisms but I
+didn't test that yet. We have a different approach to marks but eventually might
+revert to using the build in mechanism, be it in adapted form.
+
+\stopsection
+
+% \startsection[title=Maybe]
+%
+% Inserts are implemented in a bit special way. A class of inserts needs a box,
+% dimen, count and skip register. So, the macro package has to allocate these
+% en|-|block. This puts some constraints on the register allocation macros. On the
+% agenda is to investigate if a dedicated compound register makes sense. However,
+% this means that the interfaces change, but because a \CONTEXT\ user doesn't use
+% the low level inserts directly this is not really a problem. Adapting the
+% implementation can have the side effect of using a different insert chaining
+% which can give a better interface to \LUA\ because the current interface is not
+% really useable.
+%
+% \stopsection
+
+\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
index d5bfbdad760..b66c8a5e427 100644
--- 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
@@ -1,4 +1,4 @@
-% language=us
+% language=us runpath=texruns:manuals/evenmore
\startcomponent evenmore-introduction
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/evenmore/evenmore-keywords.tex b/Master/texmf-dist/doc/context/sources/general/manuals/evenmore/evenmore-keywords.tex
index 1ffacf0ab51..ddf3e0f0d2b 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/evenmore/evenmore-keywords.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/evenmore/evenmore-keywords.tex
@@ -1,4 +1,4 @@
-% language=us
+% language=us runpath=texruns:manuals/evenmore
% Talking of keywords: Jacob Collier, Count The People is definitely an example
% of showing keywords and no way that the fonts used there are done by tex:
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
index 5cca165bb35..9e003ea2a6b 100644
--- 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
@@ -1,4 +1,4 @@
-% language=us
+% language=us runpath=texruns:manuals/evenmore
\startcomponent evenmore-libraries
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
index 64ceaa353c0..80e065c48c9 100644
--- 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
@@ -1,4 +1,4 @@
-% language=us
+% language=us runpath=texruns:manuals/evenmore
% \enabletrackers[nodes.directions]
@@ -102,8 +102,8 @@ The decision making is influenced by quite some factors, like:
\starttexdefinition Sample #1#2
\OldNormalizeLineMode\normalizelinemode
- \bitwiseflip \normalizelinemode \normalizelinemodecode
- \bitwiseflip \normalizelinemode \indentskipmodecode
+ \bitwiseflip \normalizelinemode \normalizelinenormalizecode
+ \bitwiseflip \normalizelinemode \parindentskipnormalizecode
\startsubsubject[title={#1}]
\typebuffer[#2]
\startlinecorrection
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/evenmore/evenmore-numbers.tex b/Master/texmf-dist/doc/context/sources/general/manuals/evenmore/evenmore-numbers.tex
index 9b8e10a5601..7bbdbdeecb1 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/evenmore/evenmore-numbers.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/evenmore/evenmore-numbers.tex
@@ -1,4 +1,4 @@
-% language=us
+% language=us runpath=texruns:manuals/evenmore
\startcomponent evenmore-numbers
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/evenmore/evenmore-offloading.tex b/Master/texmf-dist/doc/context/sources/general/manuals/evenmore/evenmore-offloading.tex
new file mode 100644
index 00000000000..6a7de5a0641
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/evenmore/evenmore-offloading.tex
@@ -0,0 +1,127 @@
+% language=us runpath=texruns:manuals/evenmore
+
+% \showusage
+
+% This chapter was started when I updated some of the dynamic memory management
+% code. The musical timestamp is the discovery (via Sputs & Ghostnote drumming
+% sessions) of DOMI & JS BECK (also see: keyscape, nord) and after that Louis
+% Cole (Live 2019). So much talent around ...
+
+\environment evenmore-style
+
+\startcomponent evenmore-offloading
+
+\startchapter[title={Offloading}]
+
+The \LUAMETATEX\ source code started from \LUATEX\ with the idea to make a lean
+and mean variant. In the process the whole code base has been overhauled. Because
+we develop and maintain \CONTEXT\ in parallel all kind of experiments can be
+conducted. \footnote {To my best knowledge macro packages like \LATEX\ have
+decided to use the (mostly stable) \LUATEX\ in combination with a built in font
+renderer. The wish for stability from developers of other macro packages was one
+of the reasons for starting the \LUAMETATEX\ project: \LUATEX\ could no longer
+evolve without folks complaining. So, \LUAMETATEX, at least in the short run, is
+no reasonable option for other macro packages, unless policies have changed.}
+
+Already early in the process the decision was made to remove the backend code. I
+already had a working \LUATEX\ & \MKIV\ setup with an independent backend so that
+was an easy step. Later I removed that code from \MKIV\ because a dualistic model
+made for a messy \CONTEXT\ code base, and for \LUATEX\ I like to stick to the
+reference implementation. Of course one can wonder if we still have \TEX\ when
+there is no backend but you need to keep in mind that \TEX\ always needs some
+kind of backend program. If \DVI\ was still a used format (with \CONTEXT) I could
+write a \DVI\ backend without much effort, but \PDF\ is kind of the standard now.
+The relevant primitives can easily be defined in \LUA.
+
+What more defines \TEX ? Of course the macro language, but in addition to that we
+have the handling of fonts, hyphenation and building various lists, those that
+eventually make it into paragraphs and pages. The \ETEX, \PDFTEX\ and \OMEGA\
+engines have added bits and pieces and of course \LUATEX\ added its share.
+
+In \LUAMETATEX\ the macro part has been extended. Very few things were dropped,
+most noticeably \type {\long} and \type {\outer} are no longer effective but
+that made for a better \type {\protected} and gave room for \type {\frozen}.
+
+The handling of fonts is mostly delegated to callbacks but we do have the
+original transformation mechanism available. However, loading fonts is now up to
+\LUA. If that is done right, there is no difference with \TEX. One can argue that
+when a missing piece in the binary is complemented by a \LUA\ solution that gets
+plugged in we just are like \TEX. After all, nowhere is said that the engine has
+to be written in one language and in the \CWEB\ setup of \TEXLIVE\ we already mix
+languages anyway.
+
+The language part is also upgraded and because handling hyphenation has been
+extended we're, as with fonts, going beyond what traditional \TEX\ offers. The
+code for hyphenating is slightly different because we permit runtime loading and
+extension, compound and weighted patterns, etc.
+
+Another deviation is the handling of input and output. Although currently the log
+file still happens at the engine end, all the reading and writing from files is
+delegated to \LUA. This means that primitives like \type {\openin} and \type
+{\write} have to be implemented in \LUA, which is not that hard. It makes a lot
+of sense because everything already was driven by callbacks so delegating more to
+\LUA\ in the end gave a simpler input handler. For the user (or macro package) it
+makes no difference.
+
+So, assuming that the primitives not present in the engine are provided by \LUA\
+driven counterparts, we can speak of \TEX. So how about \ETEX ? We kept the macro
+language extensions, but dropped some others, like the direction related code.
+Also the querying of internal codes has been adapted to \LUATEX's internals.
+Expressions have been extended a bit. The \type {\scantokens} primitive now uses
+the same machinery as the \LUA|-|\TEX\ pipe, which made for less code and adds to
+consistency. From the \PDFTEX\ engine we only kept a few things, like protrusion
+and expansion. From \OMEGA\ only the concept of localpar and part of the
+directional model was kept, but because it's the backend that deals with
+directions there is not much there. We also dropped some \LUATEX\ features, for
+instance first class image handling only stays as concept (a special kind of
+rule) but again it is the backend that really needs to deal with it.
+
+So, in the end we end up, as intended, with a simpler code base indeed. Of course
+there is also stuff that is not in a traditional \TEX\ or \LUATEX. In addition to
+\LUA\ some libraries are present, but we avoid dependencies on large third party
+bodies of code. The continuous updating in \LUATEX\ told me that this dependency
+is a bad thing of we want the program to compile in decades from now (as
+libraries come and go and often also politics are involved). There is a small
+canonical set of what we provide and although one can use extra libraries it
+takes some effort. The internals of \LUAMETATEX\ are hidden.
+
+Just for the record. Because I want to keep as working engine and adapt \CONTEXT\
+in parallel, the process is rather time consuming. Every optimization, removal of
+unused code, addition of a feature, etc.\ takes multiple runs of the test suite,
+checking with \CONTEXT, generating binaries, updating the distribution, and so
+on. When we don't use something in \CONTEXT\ it goes on the todo stack, which
+means that testing is delayed to when I wrap up in documentation, which only
+happens when I think it's stable. For instance: when \type {\openin} and friends
+were delegated to \LUA, the \type {\ifeof} primitive was kept around with a
+temporary callback, so that \type {tikz} kept working. We don't use those read
+channels in \CONTEXT\ so that was a compromise. A while later the if test was
+also delegated and the temporary callback removed. There is no way I could do
+this kind of stepwise development were it now within the \CONTEXT\ community
+where users are willing to accept this.
+
+Another example of something that took some time is checking all memory
+allocation code, adding safeguards, make it more dynamic, making sure we have
+more statistics. It needs some experimenting and the \CONTEXT\ tracking code had
+to be extended. The main motivation for this is that there are some users out
+there (most noticeably Massimiliano who is involved in typesetting some scholar
+encyclopedia work) who run really huge jobs and we can run out of memory or even
+crash then. \footnote {I'm not that worried about an occasional bug, because the
+number is small compared to what got added, changed and improved, but of course
+there are always folks who ignore that fact and stress bug(let)s. But, as said,
+the \CONTEXT\ users are a patient lot.} Tracing shows that although \TEX\
+allocates its share of memory, in these thousand plus page documents in small
+print the regular few dozen megabytes can grow to hundreds, most noticeably taken
+up by fonts. Tracing also gives some insight in how fast token and node memory
+grows. Of course in this case \LUA\ takes way more memory, something between 1.5
+and 2~GB. Again this is due to the large amount of font instances and also is a
+side effect of massive \XML\ processing (keep in mind that the whole tree is in
+memory) and the fact that there are plenty of optimizations wrt typesetting
+implemented and multiple large registers are added. It's this kind of
+(regression) tests that help in stepwise improving \LUAMETATEX. \footnote {In the
+process one sometimes find ways to safe memory. For instance, marks used
+preallocated arrays that took 1280 KB memory while of course in practice no one
+needs that many mark registers. By making that more dynamic we saved a lot.}
+
+\stopchapter
+
+\stopcomponent
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/evenmore/evenmore-paragraphs.tex b/Master/texmf-dist/doc/context/sources/general/manuals/evenmore/evenmore-paragraphs.tex
new file mode 100644
index 00000000000..c8958a48752
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/evenmore/evenmore-paragraphs.tex
@@ -0,0 +1,397 @@
+% language=us runpath=texruns:manuals/evenmore
+
+% End of July 2020 I decided to look into some of the backlog items and paragraphs
+% are on them, as are inserts and so. The usual musical time stamp is buying the
+% excellent Prince Live at the Aladdin Las Vegas DVD which I ran between the
+% moments that I had enough of coding. Some tracks, like Family Name, fit perfectly
+% in mid 2020.
+
+% https://www.youtube.com/watch?v=f8FAJXPBdOg
+
+\environment evenmore-style
+
+\startcomponent evenmore-paragraphs
+
+\enableexperiments[paragraphs.freeze]
+
+\startchapter[title=Paragraphs]
+
+{\em This is mostly a wrapup of some developments, and definitely not a tutorial.
+What is described here is experimental and successive version of \CONTEXT\ \LMTX\
+will explore their potential. As long a users stay away from the low level
+primitives we can try to guarantee consistent behavior (and catch side effect or
+deal with known issues).}
+
+\startsection[title=Freezing]
+
+A well known property of paragraphs is that when the moment is there to split
+into lines, the current state of variables drives it. There are a lot of quite
+some variables involved. The most significant one is the \type {\hsize}. Take
+this:
+
+\startbuffer
+\bgroup
+ {\bf Ward:}
+ \hsize .25\textwidth
+ {\bf Ward:} \samplefile{ward}
+ \hsize .75\textwidth % last value
+\egroup
+\stopbuffer
+
+\typebuffer
+
+This gives:
+
+{\forgetparagraphfreezing \getbuffer}
+
+But wait, why do we get the full text width here? The reason is that by the time
+the paragraph ends, after the \type {\egroup}, the \type {\hsize} is set back to
+what it was before the group started.
+
+\startbuffer
+\bgroup
+ \hsize .25\textwidth
+ {\bf Ward:} \samplefile{ward}
+ \hsize .75\textwidth % last value
+ \par
+\egroup
+\stopbuffer
+
+\typebuffer
+
+This gives:
+
+{\forgetparagraphfreezing \getbuffer}
+
+The last \type {\hsize} specified is used. That is not really a problem, but the
+fact that we need to explicitly end a paragraph before the group ends actually
+is, and in a moment we will see an example where that matters a lot. First a
+general solution to this problem is discussed. In the next example, we do group,
+but inside that group we take a snapshot of the \type {\hsize}:
+
+\startbuffer
+\bgroup
+ \hsize .80\textwidth
+ \dontleavehmode
+ \snapshotpar "000001
+ {\bf Ward:} \samplefile{ward}
+\egroup
+\stopbuffer
+
+\typebuffer
+
+This time we get:
+
+{\forgetparagraphfreezing \getbuffer}
+
+The magic number used in the snapshot relates to the \type {\hsize}.
+
+\startcolumns[n=2]
+\starttabulate[|T||]
+\NC 0x\uchexnumbers{\hsizefrozenparcode } \NC hsize \NC \NR
+\NC 0x\uchexnumbers{\skipfrozenparcode } \NC leftskip rightskip \NC \NR
+\NC 0x\uchexnumbers{\hangfrozenparcode } \NC hangindent hangafter \NC \NR
+\NC 0x\uchexnumbers{\indentfrozenparcode } \NC parindent \NC \NR
+\NC 0x\uchexnumbers{\parfillfrozenparcode } \NC parfillskip parfillleftskip \NC \NR
+\NC 0x\uchexnumbers{\adjustfrozenparcode } \NC adjustspacing adjustspacingstep adjustspacingshrink adjustspacingstretch \NC \NR
+\NC 0x\uchexnumbers{\protrudefrozenparcode } \NC protrudechars \NC \NR
+\NC 0x\uchexnumbers{\tolerancefrozenparcode } \NC pretolerance tolerance \NC \NR
+\NC 0x\uchexnumbers{\stretchfrozenparcode } \NC emergencystretch \NC \NR
+\NC 0x\uchexnumbers{\loosenessfrozenparcode } \NC looseness \NC \NR
+\NC 0x\uchexnumbers{\lastlinefrozenparcode } \NC lastlinefit \NC \NR
+\NC 0x\uchexnumbers{\linepenaltyfrozenparcode } \NC linepenalty interlinepenalty interlinepenalties \NC \NR
+\NC 0x\uchexnumbers{\clubpenaltyfrozenparcode } \NC clubpenalty clubpenalties \NC \NR
+\NC 0x\uchexnumbers{\widowpenaltyfrozenparcode } \NC widowpenalty widowpenalties displaywidowpenalty displaywidowpenalties \NC \NR
+\NC 0x\uchexnumbers{\brokenpenaltyfrozenparcode} \NC brokenpenalty \NC \NR
+\NC 0x\uchexnumbers{\demeritsfrozenparcode } \NC adjdemerits doublehyphendemerits finalhyphendemerits \NC \NR
+\NC 0x\uchexnumbers{\shapefrozenparcode } \NC parshape \NC \NR
+\NC 0x\uchexnumbers{\linefrozenparcode } \NC baselineskip lineskip lineskiplimit \NC \NR
+\NC \NC \NC \NR
+\NC 0xFFFFFFF \BC all of them \NC \NR
+\stoptabulate
+\stopcolumns
+
+In practice you will set them all on one go, so:
+
+\starttyping
+\snapshotpar "FFFFFFF
+\stoptyping
+
+How often do we need such a feature? Actually more often than one thinks,
+especially when we have an unpredictable situation. For instance, when you
+typeset from an \XML\ source you often don't know what you get, and you can have
+cases that end up like this:
+
+\startbuffer
+\placefigure[left,none]{}{} {Ward: \bf \dorecurse{3}{\samplefile{ward}} } \par
+\placefigure[left,none]{}{} {\bf Ward:} \dorecurse{3}{\samplefile{ward}} \par
+\stopbuffer
+
+\typebuffer
+
+This might render as:
+
+{\forgetparagraphfreezing \getbuffer} \forgetsidefloats % needed due to interference
+
+The placement of such a figure is hooked into \type {\everypar} and uses hanging
+indentation. Like \type {\hsize}, \type {\hangafter} and \type {\hangindent} can
+be forgotten before the paragraph ends. In \MKII\ and \MKIV\ the recommended
+solution is to always start a paragraph explicitly, with a strut, forced
+indentation of preferably:
+
+\startbuffer
+\dontleavehmode {Ward: \bf \dorecurse{3}{\samplefile{ward} } } \par
+\dontleavehmode {\bf Ward:} \dorecurse{3}{\samplefile{ward} } \par
+\stopbuffer
+
+\typebuffer
+
+In an \XML\ mapping we can hide it but in a regular \TEX\ source this is not
+pretty. With little effort we can do the snapping automatically, so that we get:
+
+\placefigure[left,none]{}{} {Ward: \bf \dorecurse{3}{\samplefile{ward} } } \par
+\placefigure[left,none]{}{} {\bf Ward:} \dorecurse{3}{\samplefile{ward} } \par
+
+and this is what \CONTEXT\ \LMTX\ will do once we're sure that the snapshot
+feature behaves well and has no side effects. There is of course some overhead
+involved in taking snapshots, keeping track of the values and accessing them
+later, but it is rewarding.
+
+In addition to the numeric \type {\snapshotpar} primitive there is also another
+way to take s snapshot. As with the numeric variant, it only takes a snapshot when
+in horizontal mode: there has to be a so called local par node at the head of the
+current list. The next code shows some how to play with some of what \CONTEXT\
+offers:
+
+\starttyping
+\setuplayout[alternative=doublesided]
+
+\starttext
+
+\startbuffer
+ \dorecurse{8}{
+ \interlinepenalties 1 \maxcard
+ CASE 1: \samplefile{tufte} \par
+ } \page
+
+ \dorecurse{8}{
+ CASE 2: \samplefile{tufte}
+ \interlinepenalties 1 \maxcard \par
+ } \page
+
+ \dorecurse{8}{
+ CASE 3: \samplefile{tufte}
+ \interlinepenalties 1 \maxcard \freezeparagraphproperties \par
+ } \page
+
+ \dorecurse{8}{
+ CASE 4: \samplefile{tufte}
+ \frozen \interlinepenalties 1 \maxcard \par
+ } \page
+
+ \dorecurse{8}{
+ CASE 5: \samplefile{tufte}
+ \frozen \interlinepenalty \maxcard \par
+ } \page
+\stopbuffer
+
+\typebuffer \page \getbuffer
+
+\stoptext
+\stoptyping
+
+When you process this you will notice that the \type {\frozen} prefix also
+snapshots the parameter that gets set. Now, there is a pitfall here: some for
+these settings are persistent, i.e. they are not reset after a paragraph has been
+typeset. For instance, \type {\tolerance} is a general setting, but \type
+{\hangindent} is a one shot setting: it's value gets reset after the paragraph
+has been dealt with.
+
+Here is another test one can run to see what happens:
+
+\starttyping
+\dontleavehmode
+\defrostparagraphproperties
+\writestatus{state}{after start \uchexnumbers{\the\snapshotpar}}%
+\writestatus{state}{before set hangindent \uchexnumbers{\the\snapshotpar}}%
+\frozen\hangindent10pt
+\writestatus{state}{after set hangindent \uchexnumbers{\the\snapshotpar}}%
+\writestatus{state}{before set looseness \uchexnumbers{\the\snapshotpar}}%
+\frozen\looseness 1
+\writestatus{state}{after set looseness \uchexnumbers{\the\snapshotpar}}%
+\writestatus{state}{before set hangafter \uchexnumbers{\the\snapshotpar}}%
+\frozen\hangafter 2
+\writestatus{state}{after set hangafter \uchexnumbers{\the\snapshotpar}}%
+\begingroup
+\writestatus{state}{before set rightskip \uchexnumbers{\the\snapshotpar}}%
+\frozen\rightskip2cm
+\writestatus{state}{after set rightskip \uchexnumbers{\the\snapshotpar}}%
+\endgroup
+\writestatus{state}{before reset hangindent \uchexnumbers{\the\snapshotpar}}%
+\snapshotpar-\frozenhangindentcode
+\writestatus{state}{after reset hangindent \uchexnumbers{\the\snapshotpar}}%
+\writestatus{state}{before reset hangafter \uchexnumbers{\the\snapshotpar}}%
+\snapshotpar-\frozenhangaftercode
+\writestatus{state}{after reset hangafter \uchexnumbers{\the\snapshotpar}}%
+... content ...
+\stoptyping
+
+You can group an assignment and then take a snapshot. That way the change doesn't
+affect following paragraphs, unless of course to did a global assignment. In
+\CONTEXT\ we have a bunch of constants that can be used instead of the hard to
+remember bit positions. The \type {\frozen} prefix can also be used with for
+instance a \type {\advance} operation. Of course it only has effect for those
+(internal) parameters that relate to a paragraph.
+
+Keep in mind that what is show here will evolve: in \CONTEXT\ \LMTX\ we will
+snapshot by default and the core macros are aware of this fact. Although the way
+\CONTEXT\ is set up makes it relatively easy to make this paradigm shift users
+should anyway be aware of this change when they do their own low level tweaking,
+but in that case they probably already are aware of possible interferences.
+
+\stopsection
+
+\startsection[title=Wrapping up]
+
+Another new (low level) feature is wrapping up a paragraph. Traditional \TEX\
+comes with the powerful \type {\everypar} and in \LUAMETATEX\ we now have \type
+{\wrapuppar}. This primitive collects tokens that will be expanded just before
+the paragraph ends. Here is an example:
+
+\startbuffer
+\dontleavehmode
+\wrapuppar{\hfill {\bf ONE}}%
+\wrapuppar{\crlf\strut\hfill {\bf TWO}\hfill\strut}%
+\wrapuppar{\crlf\strut {\bf THREE}\hfill\strut {\bf FOUR}}%
+\samplefile{ward}
+
+\samplefile{ward}
+\stopbuffer
+
+\typebuffer
+
+We can only wrapup when we are in a paragraph although one can of course use the
+\type {\wrapuppar} command inside an \type {\everypar} if needed.
+
+\getbuffer
+
+An more useful example is the following. We leave it to the reader to check it
+out:
+
+\starttyping
+\dorecurse{10}{
+ \bgroup
+ \advance\hsize by -#1cm\relax
+ \dontleavehmode
+ \wrapuppar{\strut\nobreak\hfill\nobreak QED}%
+ \samplefile{ward}
+ \egroup
+ \par
+}
+\stoptyping
+
+\stopsection
+
+\startsection[title=Insertions]
+
+The concept of inserts is kind of complicated. They are nodes in a list that make
+separate streams. An application of inserts are footnotes. In the text flow a
+symbol is typeset (like a raised number) and the note itself becomes an insert.
+When a paragraph is broken into lines, these inserts end up in to be boxed line,
+but when the line is actually wrapped in a box, these inserts are collected and
+injected after the line. The page builder will then take their dimensions into
+account when it comes to breaking pages. Depending on how strict the rules are
+the inserts will end up on the same page, move, of be broken into lines.
+
+This all works well as long as the inserts are not burried into boxes: they then
+are invisible to the mechanism described before. Take the following example:
+
+\starttyping
+\dontleavehmode
+l\hbox{h\footnote{h1} test}
+l\hbox{h\footnote{h2}} test
+l\hbox{h\footnote{h3}} test
+l\footnote{l4} test
+l\footnote{l5} test
+l\hbox{h\footnote{h6} test}
+l\hbox{\hbox{\hbox{h\footnote{h7} test}}}
+l\footnote{l8} test
+\par
+\stoptyping
+
+% \starttabulate
+% \NC test \NC test \footnote{before} \samplefile{tufte} \footnote{after}\NC \NR
+% ...
+% \NC test \NC test \footnote{before} \samplefile{tufte} \footnote{after}\NC \NR
+% \stoptabulate
+
+In the engines used with \MKII\ only a few footnotes actually show up. In \MKIV\
+the situation is slightly better because there we use some trickery to migrate
+these notes to the outer level. But even there it's not perfect because the order
+changes. We can actually fix that (and do so) but it comes at a performance penalty
+so this is why in \MKIV\ dealing with this is optional.
+
+\start
+ \def\Hi#1{\high{\tx#1}}
+ \dontleavehmode
+ \hbox{lh\H1 test lh\H2 test lh\H3 test l\H4 test l\H5 test lh\H6 test lh\H7 test l\H8 test}
+
+ \starttabulate[|||||||||||]
+ \NC \MKII \NC \PDFTEX\ & \XETEX \NC \Hi4 l4 \NC \Hi5 l5 \NC \Hi8 l8 \NC \NC \NC \NC \NC \NC \NR
+ \NC \MKIV \footnote{In older versions.} \NC \LUATEX \NC \Hi1 h1 \NC \Hi2 h2 \NC \Hi3 h3 \NC \Hi6 h6 \NC \Hi7 h7 \NC \Hi4 l4 \NC \Hi5 l5 \NC \Hi8 l8 \NC \NR
+ \NC \LMTX \NC \LUAMETATEX \NC \Hi1 h1 \NC \Hi2 h2 \NC \Hi3 h3 \NC \Hi4 l4 \NC \Hi5 l5 \NC \Hi6 h6 \NC \Hi7 h7 \NC \Hi8 l8 \NC \NR
+ \stoptabulate
+\stop
+
+However, when you look at the results of \LMTX\ you will notice that the
+situation is better. This is because we have some code to \LUAMETATEX\ that can
+better deal with some cases. Combined with some \LUA\ magic (as in \MKIV) we get
+the right order at hardly any runtime overhead. It must be noted that the
+original \TEX\ engine for good reason works as it does because there the actual
+typesetting (read: resolving glyphs, hyphenation, applying ligatures and kerns,
+etc.) is interwoven with the main scanning|/|expanding loops in order to be
+efficient on the machines of those times. In \LUATEX\ we have these stages
+separated but the code dealing with inserts is the same, if only because we have
+to be compatible. In \LUAMETATEX\ we have again a bit simpler code because we use
+the fact that lists are double linked, which also makes it possible to add some
+magic code dealing with nested inserts without obscuring the code. It comes of
+course at a bit performance hit and the nodes related to lists also because
+larger but they are already much larger than in other engines, so we don't care
+too much about that. It is anyway a mechanism that need to be enabled explicitly.
+
+\stopsection
+
+\stopchapter
+
+\stopcomponent
+
+% \starttext
+
+% \def\TestA {\registerparwrapper {A} {[\ignorespaces}{\removeunwantedspaces]\showparwrapperstate{A}}}
+% \def\TestB#1{\registerparwrapper {B#1}{(\ignorespaces}{\removeunwantedspaces)\showparwrapperstate{B#1}}}
+% \def\TestC {\registerparwrapper {C} {<\ignorespaces}{\removeunwantedspaces>\showparwrapperstate{C}\forgetparwrapper}}
+% \def\TestR {\registerparwrapperreverse{R} {<\ignorespaces}{\removeunwantedspaces>\showparwrapperstate{R}}}
+
+% \start
+% \TestA
+% \dorecurse{3}{1.#1 before \ruledvbox{\hsize2em\raggedcenter\TestB1 !\par} after\par} \blank
+% \dorecurse{3}{2.#1 before \ruledvbox{\hsize3em\raggedcenter !\par} after\par} \blank
+% \dorecurse{3}{3.#1 before \ruledvbox{\hsize4em\raggedcenter\TestB2 !} after\par} \blank
+% \forgetparwrapper
+% \dorecurse{3}{4.#1 before \ruledvbox{\hsize5em\raggedcenter\TestB3 !} after\par} \blank
+% \TestC
+% \dorecurse{3}{5.#1 before \ruledvbox{\hsize2em\raggedcenter\TestA !} after\par} \blank
+% \stop
+
+
+% \start
+% \TestA
+% \dorecurse{3}{6.#1 before after\par} \blank
+% \TestB4
+% \dorecurse{3}{7.#1 before after\par} \blank
+% \TestB5
+% \TestR
+% \dorecurse{3}{8.#1 before after\par} \blank
+% \stop
+
+% \stoptext
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/evenmore/evenmore-parameters.tex b/Master/texmf-dist/doc/context/sources/general/manuals/evenmore/evenmore-parameters.tex
index b07378fae96..c20b7bb2a86 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/evenmore/evenmore-parameters.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/evenmore/evenmore-parameters.tex
@@ -1,4 +1,4 @@
-% language=us
+% language=us runpath=texruns:manuals/evenmore
% This feature was done mid May 2020 with Alien Chatter (I really need to find the
% original cd's) in the background.
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/evenmore/evenmore-parsing.tex b/Master/texmf-dist/doc/context/sources/general/manuals/evenmore/evenmore-parsing.tex
index d0cc29db11f..caed4584647 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/evenmore/evenmore-parsing.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/evenmore/evenmore-parsing.tex
@@ -1,4 +1,4 @@
-% language=us
+% language=us runpath=texruns:manuals/evenmore
\environment evenmore-style
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
index 197e8682699..7a2dd9bf7b6 100644
--- 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
@@ -1,4 +1,4 @@
-% language=us
+% language=us runpath=texruns:manuals/evenmore
\environment evenmore-style
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
index 07168e57c6a..0a01679b118 100644
--- 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
@@ -1,3 +1,5 @@
+% language=us runpath=texruns:manuals/evenmore
+
% \enablelmtx
% \nopdfcompression
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
index d75f9b68396..0c0c503ad6a 100644
--- 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
@@ -1,4 +1,4 @@
-% language=us
+% language=us runpath=texruns:manuals/evenmore
\environment evenmore-style
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
index 57418800c4a..44ca10512d0 100644
--- 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
@@ -1,3 +1,5 @@
+% language=us runpath=texruns:manuals/evenmore
+
\startcomponent evenmore-titlepage
\environment evenmore-style
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/evenmore/evenmore-tokens.tex b/Master/texmf-dist/doc/context/sources/general/manuals/evenmore/evenmore-tokens.tex
index 8c1e3ccb047..c30959488fe 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/evenmore/evenmore-tokens.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/evenmore/evenmore-tokens.tex
@@ -1,4 +1,4 @@
-% language=us
+% language=us runpath=texruns:manuals/evenmore
% TODO: copy_node_list : return tail
% TODO: grabnested
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
index 10d3e49f2f7..0c208839dc3 100644
--- 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
@@ -1,4 +1,4 @@
-% language=us
+% language=us runpath=texruns:manuals/evenmore
\startcomponent evenmore-whattex
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
index b351e8c681a..f8037b6828d 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/evenmore/evenmore.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/evenmore/evenmore.tex
@@ -1,3 +1,5 @@
+% language=us runpath=texruns:manuals/evenmore
+
\environment evenmore-style
\dontcomplain
@@ -25,19 +27,13 @@
\component evenmore-parsing
\component evenmore-tokens
\component evenmore-keywords
-
- \startchapter[title=Paragraphs] {\em This chapter is not yet public.} \stopchapter
- \startchapter[title=Hyphenation] {\em This chapter is not yet public.} \stopchapter
- \startchapter[title=Bitwise] {\em This chapter is not yet public.} \stopchapter
- \startchapter[title=Offloading] {\em This chapter is not yet public.} \stopchapter
- \startchapter[title=Inserts] {\em This chapter is not yet public.} \stopchapter
-
- % \component evenmore-paragraphs
- % \component evenmore-hyphenation
- % \component evenmore-bitwise
- % \component evenmore-offloading
- % \component evenmore-inserts
-
+ \component evenmore-paragraphs
+ \component evenmore-hyphenation
+ \component evenmore-bitwise
+ \component evenmore-offloading
+ \component evenmore-inserts
+ \component evenmore-formats
+ \component evenmore-expressions
\stopbodymatter
\stopdocument
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
index cf74c0cade9..77e32442ea8 100644
--- 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
@@ -1,4 +1,4 @@
-% language=us
+% language=us runpath=texruns:manuals/followingup
\startcomponent followingup-bitmaps
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
index 7dcb3b3b1fa..d66098f7452 100644
--- 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
@@ -1,4 +1,4 @@
-% language=us
+% language=us runpath=texruns:manuals/followingup
% Youtube: TheLucs play with Jacob Collier // Don't stop til you get enough
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
index 9e4b10662ba..9811422308a 100644
--- 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
@@ -1,4 +1,4 @@
-% language=us
+% language=us runpath=texruns:manuals/followingup
\startcomponent followingup-compilation
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
index 3fbfc701a5b..a415ab32233 100644
--- 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
@@ -1,3 +1,5 @@
+% language=us runpath=texruns:manuals/followingup
+
\startcomponent followingup-contents
\environment followingup-style
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
index 244baff90de..81aa16b7455 100644
--- 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
@@ -1,4 +1,4 @@
-% language=us
+% language=us runpath=texruns:manuals/followingup
\startcomponent followingup-directions
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
index 730f4cc1b84..654de242152 100644
--- 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
@@ -1,4 +1,4 @@
-% language=us
+% language=us runpath=texruns:manuals/followingup
\startcomponent followingup-evolution
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
index d77ef302c9b..7db239b2bb5 100644
--- 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
@@ -1,4 +1,4 @@
-% language=us
+% language=us runpath=texruns:manuals/followingup
\startcomponent followingup-feedback
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/followingup/followingup-fonts.tex b/Master/texmf-dist/doc/context/sources/general/manuals/followingup/followingup-fonts.tex
index 502370d7db1..728f9c0fa88 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/followingup/followingup-fonts.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/followingup/followingup-fonts.tex
@@ -1,4 +1,4 @@
-% language=us
+% language=us runpath=texruns:manuals/followingup
\startcomponent followingup-fonts
@@ -230,7 +230,7 @@ In order to deal with this kind of scaling, we now operate not only on the font
(id) and dynamic feature axes, but also on the scales, of which we have three
variants: glyph scale, glyph xscale and glyph yscale. There is actually also a
state dimension but we omit that for now (think of flagging glyphs as initial or
-final). This brings the number of axis to six. It is important to stress that in
+final). This brings the number of axes to six. It is important to stress that in
these examples the same font instance is used!
Just for the record: several approaches to switching fonts are possible but for
@@ -332,9 +332,9 @@ manual we get these stats:
\stoptyping
So, we win on all fronts when we use this glyph scaling mechanism. The magic
-primitive that deals with this is named \type {\glyphscale}; it accepts a
-number, where \type {1200} and \type {1.2} both mean scaling to 20\percent\ more
-than normal. But it's best not to use this primitive directly.
+primitive that deals with this is named \type {\glyphscale}; it accepts a number,
+where \type {1200} means scaling to 20\percent\ more than normal. But it's best
+not to use this primitive directly.
A specific scaled font can be defined using the \type {\definefont} command. In
\LMTX\ a regular scaler can be followed by two scale factors. The next example
@@ -614,7 +614,6 @@ dimensions of a glyph.
{\getbuffer}
-
\stopsection
\startsection[title={Implementation}]
@@ -653,51 +652,6 @@ enable, or not.
\stopcomponent
-% sample file
-
-\setuplayout[topspace=1cm,header=1cm] \setuplayout[middle]
-
-\setupbodyfont[pagella,10pt]
-
-\setupalign[verytolerant,stretch]
-
-\setupwhitespace[big]
-
-\starttext
-
-\startbuffer
-\definetweakedfont[bfe][xscale=2000,yscale=6000,style=bf]
-
-\setuphead[chapter][style=\bfe]
-
-\dostepwiserecurse {10} {2020} {10} {
- \title{Here we go #1!}
- \start
- \glyphxscale#1\relax
- \glyphyscale#1\relax
- \setupinterlinespace
- \samplefile{ward}%
- \start
- \bf
- \samplefile{ward}%
- \glyphxscale\numexpr(#1*2)/3\relax
- \glyphyscale#1\relax
- \samplefile{ward}%
- \par
- \stop
- \def\TEST{y = \sqrt{x^2 + 1}^3}%
- \dontleavehmode
- \ruledhbox{\glyphxscale #1 \glyphyscale #1 $\left{\TEST\right}$}
- \ruledhbox{\glyphxscale #1 \glyphyscale \numexpr#1*3\relax $\left{\TEST\right}$}
- \ruledhbox{\glyphxscale \numexpr#1/2\relax \glyphyscale \numexpr#1*2\relax $\left{\TEST\right}$}
- \par
- \stop
- \page
-}
-\stopbuffer
-
-\getbuffer
-
% As often there is a musical timestamp to this text: discovering Julia Hofer
% (bass, came there via checking out (of course) Leland Sklar, and now i have to
% watch a bunch of Victor Wooten videos too) and Neon Vine's (play and combine
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
index c4a5920bdf4..0d23b81dd74 100644
--- 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
@@ -1,4 +1,4 @@
-% language=us
+% language=us runpath=texruns:manuals/followingup
\startcomponent followingup-introduction
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
index e82df3c04ef..79652686216 100644
--- 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
@@ -1,4 +1,4 @@
-% language=us
+% language=us runpath=texruns:manuals/followingup
\startcomponent followingup-logging
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
index f0f3350a3e0..5ff821a3b29 100644
--- 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
@@ -1,4 +1,4 @@
-% language=us
+% language=us runpath=texruns:manuals/followingup
\startcomponent followingup-lua
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/followingup/followingup-memory.tex b/Master/texmf-dist/doc/context/sources/general/manuals/followingup/followingup-memory.tex
new file mode 100644
index 00000000000..f4f5adb4cb1
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/followingup/followingup-memory.tex
@@ -0,0 +1,136 @@
+% language=us runpath=texruns:manuals/followingup
+
+\startcomponent followingup-memory
+
+\environment followingup-style
+
+\startchapter[title={Memory}]
+
+\startsection[title={Introduction}]
+
+\stopsection
+
+\startsection[title={\LUA}]
+
+When you initialize \LUA\ a proper memory allocator has to be provided. The
+allocator gets an old size and new size passed. When both are zero the allocator
+can \type {free} the blob, when the new size exceeds the old size the blob has to
+be \type {realloc}'s, and otherwise an initial \type {malloc} happens. When used
+with \CONTEXT, \LUAMETATEX\ will do lots of calls to the allocator and often an
+initial allocation is followed by a reallocation, for instance because tables
+start out small but immediately grows a while after.
+
+It is for this reason that early 2021 I decided to look into alternative
+allocators. I can of course code one myself, but where a \LUATEX\ run is a one
+time event, often with growing memory usage due to all kind of accumulating
+resources, using the engine as stand alone interpreter needs a more sophisticated
+approach than just keeping a bunch of bucket pools alive: when the script engine
+runs for months or even years memory should be returned to the operating system
+occasionally. We don't want the same side effects that \HTML\ browsers have:
+during the day you need to restart them occasionally because they use up quite a
+bit of your computers memory (often for no real reason, so it probably has to do
+with keeping memory in store instead of returning it and|/|or it can be a side
+effect of a scattered pool \unknown\ who knows).
+
+Instead of reinventing that wheel I ended up with testing Daan Leijen's \type
+{mimalloc} implementation: a not bloated, not too low level, reasonable sized
+library. Some simple experiments learned that it does make a difference in
+performance. The experiment was done with the native \MICROSOFT\ compiler (msvc).
+One reason for that is that till that moment I preferred the cross compiled
+\MINGW\ versions (for cross compiling I use the \LINUX\ subsystem that comes with
+\MSWINDOWS). Although native binaries compile faster and are smaller, the cross
+compiled ones perform somewhat better (often some 5\%). Interesting is that
+making the format file is always much faster with a native binary, probably
+because the console output is supported better. When the alternative memory
+allocator is plugged into \LUA\ suddenly the native version outperforms the cross
+compiled one (also by some 5\%). The overall gain on a native binary for
+compiling the \LUAMETATEX\ manual is between~5 and~10\% which was reason enough
+to continue this experiment. As a first step the native compiled version will
+default to it, later other platforms might follow.
+
+\stopsection
+
+\startsection[title={\TEX}]
+
+Memory allocation in \TEX\ has always been done by the engine itself. At startup
+a couple of big chunks are allocated and from that smaller blobs are taken. The
+largest chunks are for nodes, tokens and the table of equivalents (including the
+hash where control sequences are mapped onto registers and macros (lists of
+tokens). Smaller chunks are used for nesting states, after group restoration
+stacks, in- and output levels, etc. In modern engines the sizes of the chunks can
+be configured, some only at format generation time. In \LUAMETATEX\ we are more
+dynamic and after an initial (minimal) chunk allocation, when needed more memory
+will be allocated on demand, in steps, until a configured size is reached. That
+size has an upper limit (which if needed can be enlarged at compilation time). A
+side effect is that we (need to) do some more checking.
+
+Node memory is special in the sense that nodes are basically offsets in a large
+array where each node has a number of slots after that offset. This is rather
+efficient in terms of performance and memory. New nodes (of any size) are taken
+from the node chunk and never returned. When freed they are appended to a list
+per size and that list serves as pool before new nodes get taken from the chunk.
+Variable size chunks are done differently, if only because we use them plenty in
+\CONTEXT\ and they can lead to (excessive and) fragmented memory usage otherwise.
+
+Tokens all have the same size so here there is only one list of free tokens.
+Because tokens and (most) nodes make it into linked lists those lists of free
+nodes and tokens are rather natural. And it's also fast. It all means that \TEX\
+itself does hardly any real memory allocation: only a few dozen large chunks. An
+exception is the string pool, where contrary to traditional \TEX\ engines, the
+\LUATEX\ (and \LUAMETATEX) engines allocate strings using \type {malloc}. Those
+strings (used for control sequences) are never freed. In other cases where
+strings are used, like in for instance \type {\csname} construction, temporary
+strings are used. The same is true for some file related operations. None of
+these are real demanding in terms of excessive allocation and freeing. Also, in
+places that matter \LUAMETATEX\ is already quite optimized so using a different
+allocator gives no gain here.
+
+Technically we could allocate nodes by using \type {malloc} but there are a few
+places in the engine that makes this hard. It can be done but then we need to
+make some conceptual changes (with regards to the way inserts are dealt with) and
+the question is if we gain much by breaking away from tradition. I guess there it
+will actually hurt performance if we change this. Another variant is where we
+allocate nodes of the same size from different pools but this doesn't bring us
+any gain either. A stringer argument is that changing the current (and historic)
+memory management of nodes will complicate the code.
+
+A bit of an exception is the flow of information between \LUA\ and \TEX. There we
+do quite some allocation but it depends on how much a macro package demands of
+that.
+
+\stopsection
+
+\startsection[title={\METAPOST}]
+
+When the \METAPOST\ library was written, Taco changed the memory allocation to be
+more dynamic. One reason for this is that the number models (scaled, double,
+decimal, binary) have their own demands. For some objects (like numbers) the
+implementation uses a pool so it sits between the way \TEX\ works and \LUA\ when
+the standard allocator is used. This means that although quite some allocation
+is demanded, often the pool can serve the requests. (We might use a few more
+pools in the future.)
+
+In \LUAMETATEX\ the memory related code has been reorganized a little so that
+(again as experiment) the \type {mimalloc} manager can be used. The performance
+gain is not as impressive as with \LUA, but we'll see how that evolves when more
+demand poses more stress.
+
+\stopsection
+
+\startsection[title={The verdict}]
+
+In \LUAMETATEX\ version 2.09.4 and later the native \MSWINDOWS\ binaries now use
+the alternative \type {mimalloc} allocator. The gain is most noticeable for \LUA\
+and a little for \TEX\ and \METAPOST. The test suite with 2550 files runs in 1200
+seconds which is quite an improvement over the \MINGW\ cross compiled binary that
+needs 1350 seconds. We do occasionally test a binary compiled with \CLANG\ but
+that one is much slower than both others (compilation also takes much more time)
+but that might improve over time. Because of these results, it is likely that
+I'll also check out the other platforms, once the \MSWINDOWS\ binaries have
+proven to be stable (those are the once I use 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
index 22e8e8356dc..442118d8c11 100644
--- 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
@@ -1,6 +1,4 @@
-% language=us
-
-\registerctxluafile{mlib-scn}{}
+% language=us runpath=texruns:manuals/followingup
\startcomponent followingup-mp
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
index 40eb1971d9c..667b111d403 100644
--- 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
@@ -1,4 +1,4 @@
-% language=us
+% language=us runpath=texruns:manuals/followingup
\startcomponent followingup-performance
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
index f357c0ae536..56f7f621bad 100644
--- 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
@@ -1,4 +1,4 @@
-% language=us
+% language=us runpath=texruns:manuals/followingup
\startcomponent followingup-rejected
@@ -81,3 +81,17 @@ back.}
\stopchapter
\stopcomponent
+
+% very limited use case and not easy in nested definitions (which is where is
+% would have been used
+%
+% } else if (cur_cmd == begin_local_cmd && cur_chr == local_control_now_code) {
+%
+%\def\foo#1#2%
+% {test #1
+% test #2
+% test
+% \localcontrolnow{\scratchcounter\catcode\hashasciicode \catcode\hashasciicode\othercatcode}
+% #
+% \localcontrolnow{\catcode\hashasciicode\scratchcounter}
+% test}
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
index b99185b77e1..1123e3928f2 100644
--- 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
@@ -1,4 +1,4 @@
-% language=us
+% language=us runpath=texruns:manuals/followingup
\startcomponent followingup-retrospect
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
index 69af6376c4e..c90e8645b3d 100644
--- 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
@@ -1,4 +1,4 @@
-% language=us
+% language=us runpath=texruns:manuals/followingup
% 2,777,600 / 11,561,471 cont-en.fmt
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
index 69d02adc726..996fe1d686b 100644
--- 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
@@ -1,4 +1,4 @@
-% language=us
+% language=us runpath=texruns:manuals/followingup
\startcomponent followingup-stubs
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
index 51519f1374f..651890a24cf 100644
--- 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
@@ -1,3 +1,5 @@
+% language=us runpath=texruns:manuals/followingup
+
% \enablelmtx
% \nopdfcompression
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
index 5524baf5358..4e4fcf69f10 100644
--- 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
@@ -1,4 +1,4 @@
-% language=us
+% language=us runpath=texruns:manuals/followingup
\startcomponent followingup-tex
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
index 0f46ee9ca27..adca20aa90a 100644
--- 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
@@ -1,3 +1,5 @@
+% language=us runpath=texruns:manuals/followingup
+
\startcomponent followingup-titlepage
\environment followingup-style
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
index 64c8175734b..b70c5335476 100644
--- 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
@@ -1,4 +1,4 @@
-% language=us
+% language=us runpath=texruns:manuals/followingup
\startcomponent followingup-whatsits
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
index 7d7d17851c2..069cfa4ebea 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/followingup/followingup.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/followingup/followingup.tex
@@ -1,7 +1,11 @@
+% language=us runpath=texruns:manuals/followingup
+
\environment followingup-style
\dontcomplain
+% \enableexperiments[fonts.compact]
+
\startdocument
\component followingup-titlepage
@@ -29,6 +33,7 @@
\component followingup-tex
\component followingup-retrospect
\component followingup-fonts
+ \component followingup-memory
\stopbodymatter
\stopdocument
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/fonts/fonts-appendix.tex b/Master/texmf-dist/doc/context/sources/general/manuals/fonts/fonts-appendix.tex
index 2eab26a9371..fab0907b9fb 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/fonts/fonts-appendix.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/fonts/fonts-appendix.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us runpath=texruns:manuals/fonts
\startcomponent fonts-appendix
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/fonts/fonts-environment.tex b/Master/texmf-dist/doc/context/sources/general/manuals/fonts/fonts-environment.tex
index c884d97e5d3..4ec877efde6 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/fonts/fonts-environment.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/fonts/fonts-environment.tex
@@ -1,3 +1,5 @@
+% language=us runpath=texruns:manuals/fonts
+
\startenvironment fonts-environment
% we need to do this beforehand
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/fonts/fonts-extensions.tex b/Master/texmf-dist/doc/context/sources/general/manuals/fonts/fonts-extensions.tex
index afe6fd82386..f28a21d0253 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/fonts/fonts-extensions.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/fonts/fonts-extensions.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us runpath=texruns:manuals/fonts
\startcomponent fonts-extensions
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/fonts/fonts-features.tex b/Master/texmf-dist/doc/context/sources/general/manuals/fonts/fonts-features.tex
index bf9f39385df..e9677fe8450 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/fonts/fonts-features.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/fonts/fonts-features.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us runpath=texruns:manuals/fonts
\startcomponent fonts-features
@@ -883,7 +883,7 @@ results might differ a bit.
\stopcombination
\stopplacefigure
- \definefont[emoji][file:emojionecolor-svginot.ttf*default,svg]
+ \definefont[Emoji][file:emojionecolor-svginot.ttf*default,svg]
\def\FourFaces{\char128104\zwj\char128105\zwj\char128102\zwj\char128102\relax}
@@ -892,67 +892,67 @@ results might differ a bit.
\def\Boy {\char"1F466\relax}
\def\Girl {\char"1F467\relax}
- How do we know what faces add up to the ligature {\emoji\Man \zwj \Woman \zwj
+ How do we know what faces add up to the ligature {\Emoji\Man \zwj \Woman \zwj
\Girl \zwj \Boy} and how are we supposed to know that there should {\darkgray
\type {zwj}} in between? When we input four faces separated by zero width
joiners, we get a four face symbol instead. The reason for having the joiners in
between is probably to avoid unexpected ligatures. The sequence \type {man},
\type {woman}, \type {boy}, \type {boy} gives \type {family}:
%
- {\emoji\Man} + {\darkgray \type {zwj}}
- {\emoji\Woman} + {\darkgray \type {zwj}}
- {\emoji\Boy} + {\darkgray \type {zwj}}
- {\emoji\Boy} = {\emoji\Man \zwj \Woman \zwj \Boy \zwj \Boy},
+ {\Emoji\Man} + {\darkgray \type {zwj}}
+ {\Emoji\Woman} + {\darkgray \type {zwj}}
+ {\Emoji\Boy} + {\darkgray \type {zwj}}
+ {\Emoji\Boy} = {\Emoji\Man \zwj \Woman \zwj \Boy \zwj \Boy},
%
but two girls also work:
%
- {\emoji\Man} + {\darkgray \type {zwj}}
- {\emoji\Woman} + {\darkgray \type {zwj}}
- {\emoji\Girl} + {\darkgray \type {zwj}}
- {\emoji\Girl} = {\emoji\Man \zwj \Woman \zwj \Girl \zwj \Girl},
+ {\Emoji\Man} + {\darkgray \type {zwj}}
+ {\Emoji\Woman} + {\darkgray \type {zwj}}
+ {\Emoji\Girl} + {\darkgray \type {zwj}}
+ {\Emoji\Girl} = {\Emoji\Man \zwj \Woman \zwj \Girl \zwj \Girl},
%
so does a mixture of kids:
%
- {\emoji\Man} + {\darkgray \type {zwj}}
- {\emoji\Woman} + {\darkgray \type {zwj}}
- {\emoji\Girl} + {\darkgray \type {zwj}}
- {\emoji\Boy} = {\emoji\Man \zwj \Woman \zwj \Girl \zwj \Boy},
+ {\Emoji\Man} + {\darkgray \type {zwj}}
+ {\Emoji\Woman} + {\darkgray \type {zwj}}
+ {\Emoji\Girl} + {\darkgray \type {zwj}}
+ {\Emoji\Boy} = {\Emoji\Man \zwj \Woman \zwj \Girl \zwj \Boy},
%
although (at least currently):
%
- {\emoji\Man} + {\darkgray \type {zwj}}
- {\emoji\Woman} + {\darkgray \type {zwj}}
- {\emoji\Boy} + {\darkgray \type {zwj}}
- {\emoji\Girl} = {\emoji\Man \zwj \Woman \zwj \Boy \zwj \Girl},
+ {\Emoji\Man} + {\darkgray \type {zwj}}
+ {\Emoji\Woman} + {\darkgray \type {zwj}}
+ {\Emoji\Boy} + {\darkgray \type {zwj}}
+ {\Emoji\Girl} = {\Emoji\Man \zwj \Woman \zwj \Boy \zwj \Girl},
%
- gives twin boys. Of course the real family emoj is {\emoji\char"1F46A}.
+ gives twin boys. Of course the real family emoj is {\Emoji\char"1F46A}.
In our times for sure many combinations are possible, so:
%
- {\emoji\Man} + {\darkgray \type {zwj}}
- {\emoji\Man} + {\darkgray \type {zwj}}
- {\emoji\Girl} + {\darkgray \type {zwj}}
- {\emoji\Girl} = {\emoji\Man \zwj \Man \zwj \Girl \zwj \Girl},
+ {\Emoji\Man} + {\darkgray \type {zwj}}
+ {\Emoji\Man} + {\darkgray \type {zwj}}
+ {\Emoji\Girl} + {\darkgray \type {zwj}}
+ {\Emoji\Girl} = {\Emoji\Man \zwj \Man \zwj \Girl \zwj \Girl},
%
indeed gives a family, but I wonder at what point cultural bias will creep into
font design. One can even wonder how clothing and haircut will demand frequent
- font updates: {\emoji\char"1F46B}, {\emoji\char"1F46C}, {\emoji\char"1F46D}.
+ font updates: {\Emoji\char"1F46B}, {\Emoji\char"1F46C}, {\Emoji\char"1F46D}.
In the math alphabets we have a couple of annoying holes because some characters
were already present in \UNICODE. The bad thing here is that we now always have
to deal with these exceptions. But not so with emojis because here eventually all
variants will show up. Where a character \type {A} in red or blue uses the same
- code point, a white telephone {\emoji\char"1F57E} and black telephone
- {\emoji\char"1F57F} have their own. And because obsolete scripts are already
+ code point, a white telephone {\Emoji\char"1F57E} and black telephone
+ {\Emoji\char"1F57F} have their own. And because obsolete scripts are already
supported in \UNICODE\ and more get added, we can expect old artifacts also
- showing up at some time. Soon the joystick {\emoji\char"1F579} will be an unknown
+ showing up at some time. Soon the joystick {\Emoji\char"1F579} will be an unknown
item to most of us, while the \MICROSOFT\ hololens migth get its slot.
\startplacefigure[title={Will all animals come in stages of development?}]
\startcombination [3*1]
- {\scale[width=.3\textwidth]{\emoji\char"1F423}} {\type{U+1F423}: hatching chick}
- {\scale[width=.3\textwidth]{\emoji\char"1F424}} {\type{U+1F424}: baby chick}
- {\scale[width=.3\textwidth]{\emoji\char"1F425}} {\type{U+1F425}: front-facing baby chick}
+ {\scale[width=.3\textwidth]{\Emoji\char"1F423}} {\type{U+1F423}: hatching chick}
+ {\scale[width=.3\textwidth]{\Emoji\char"1F424}} {\type{U+1F424}: baby chick}
+ {\scale[width=.3\textwidth]{\Emoji\char"1F425}} {\type{U+1F425}: front-facing baby chick}
\stopcombination
\stopplacefigure
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/fonts/fonts-formats.tex b/Master/texmf-dist/doc/context/sources/general/manuals/fonts/fonts-formats.tex
index 9ad6bc9bda0..7028b17afc3 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/fonts/fonts-formats.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/fonts/fonts-formats.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us runpath=texruns:manuals/fonts
\startcomponent fonts-formats
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/fonts/fonts-hooks.tex b/Master/texmf-dist/doc/context/sources/general/manuals/fonts/fonts-hooks.tex
index 7ee5dc198b8..b85b801c00f 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/fonts/fonts-hooks.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/fonts/fonts-hooks.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us runpath=texruns:manuals/fonts
\startcomponent fonts-hooks
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/fonts/fonts-introduction.tex b/Master/texmf-dist/doc/context/sources/general/manuals/fonts/fonts-introduction.tex
index 0ca91ee9fee..d0e844d1f0c 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/fonts/fonts-introduction.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/fonts/fonts-introduction.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us runpath=texruns:manuals/fonts
\startcomponent fonts-introduction
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/fonts/fonts-lookups.tex b/Master/texmf-dist/doc/context/sources/general/manuals/fonts/fonts-lookups.tex
index e9448b88456..642cb1a5fbf 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/fonts/fonts-lookups.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/fonts/fonts-lookups.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us runpath=texruns:manuals/fonts
\startcomponent fonts-lookups
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/fonts/fonts-math.tex b/Master/texmf-dist/doc/context/sources/general/manuals/fonts/fonts-math.tex
index 76620493755..745a5e9cb6a 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/fonts/fonts-math.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/fonts/fonts-math.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us runpath=texruns:manuals/fonts
% todo:
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/fonts/fonts-methods.tex b/Master/texmf-dist/doc/context/sources/general/manuals/fonts/fonts-methods.tex
index eac86d69487..9acbf26b9bb 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/fonts/fonts-methods.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/fonts/fonts-methods.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us runpath=texruns:manuals/fonts
\startcomponent fonts-methods
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/fonts/fonts-mkiv.tex b/Master/texmf-dist/doc/context/sources/general/manuals/fonts/fonts-mkiv.tex
index fa53492f084..79d9535741f 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/fonts/fonts-mkiv.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/fonts/fonts-mkiv.tex
@@ -1,7 +1,7 @@
-% language=uk
+% language=us runpath=texruns:manuals/fonts
% author : Hans Hagen
-% copyright : PRAGMA ADE & ConTeXt Development Team
+% copyright : ConTeXt Development Team
% license : Creative Commons Attribution ShareAlike 4.0 International
% reference : pragma-ade.nl | contextgarden.net | texlive (related) distributions
% origin : the ConTeXt distribution
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/fonts/fonts-modes.tex b/Master/texmf-dist/doc/context/sources/general/manuals/fonts/fonts-modes.tex
index 95cb957328f..25394273640 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/fonts/fonts-modes.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/fonts/fonts-modes.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us runpath=texruns:manuals/fonts
\definefontfeature
[otftracker-husayni]
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/fonts/fonts-scripts.tex b/Master/texmf-dist/doc/context/sources/general/manuals/fonts/fonts-scripts.tex
index aed4f0a5c9d..78293393fd6 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/fonts/fonts-scripts.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/fonts/fonts-scripts.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us runpath=texruns:manuals/fonts
\startcomponent fonts-scripts
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/fonts/fonts-tricks.tex b/Master/texmf-dist/doc/context/sources/general/manuals/fonts/fonts-tricks.tex
index 65b210e2c48..70cf4c95ca4 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/fonts/fonts-tricks.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/fonts/fonts-tricks.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us runpath=texruns:manuals/fonts
\startcomponent fonts-tricks
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/graphics/graphics.tex b/Master/texmf-dist/doc/context/sources/general/manuals/graphics/graphics.tex
index 7c1000c4e15..97785c1700b 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/graphics/graphics.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/graphics/graphics.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us runpath=texruns:manuals/graphics
\usemodule[article-basic]
\usemodule[abbreviations-smallcaps]
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-backend.tex b/Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-backend.tex
index 4b60551515e..2feb712c0a4 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-backend.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-backend.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
\startcomponent hybrid-backends
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-bidi.tex b/Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-bidi.tex
index c291d11eb34..14d014c1f62 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-bidi.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-bidi.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
\startcomponent hybrid-inserts
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-callbacks.tex b/Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-callbacks.tex
index 00b3c0f3f60..550cdbbb856 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-callbacks.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-callbacks.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
\startcomponent hybrid-callbacks
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-characters.tex b/Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-characters.tex
index 4800e1500b0..2a9322c5b4f 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-characters.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-characters.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
\startcomponent hybrid-characters
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-codebase.tex b/Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-codebase.tex
index cfbc82a9723..b835f6f4137 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-codebase.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-codebase.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
\startcomponent hybrid-lexing
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-contents.tex b/Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-contents.tex
index 2b94cd48229..e023c348654 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-contents.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-contents.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
\startcomponent hybrid-contents
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-ebooks.tex b/Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-ebooks.tex
index b7bc5185fd4..a48e2509f60 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-ebooks.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-ebooks.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
\startcomponent hybrid-ebooks
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-export.tex b/Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-export.tex
index 6a1fb37343d..743bb5017ea 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-export.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-export.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
\startluacode
job.files.context(dir.glob("exported-*.tex"),"--directives=structures.export.lessstate")
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-fontnames.tex b/Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-fontnames.tex
index bc39ba9b4f3..f1643d97e11 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-fontnames.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-fontnames.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
\startcomponent hybrid-fontnames
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-glocal.tex b/Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-glocal.tex
index a67146a5b1b..5dfcf61152b 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-glocal.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-glocal.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
\startcomponent hybrid-glocal
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-goodies.tex b/Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-goodies.tex
index f6a2317f0b7..8b4a4a667aa 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-goodies.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-goodies.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
\usetypescriptfile[type-husayni]
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-inserts.tex b/Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-inserts.tex
index d483f1305d2..a10bceda4a3 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-inserts.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-inserts.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
\startcomponent hybrid-inserts
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-intermezzo.tex b/Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-intermezzo.tex
index cad7b3dbe13..9c636a93d8f 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-intermezzo.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-intermezzo.tex
@@ -1,4 +1,4 @@
-% engine=luatex language=uk
+% language=us
\startcomponent hybrid-intermezzo
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-introduction.tex b/Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-introduction.tex
index c4054458288..d02588e8fe0 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-introduction.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-introduction.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
\startcomponent hybrid-languages
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-italics.tex b/Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-italics.tex
index 65eeccde329..7d0b94b2009 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-italics.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-italics.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
% \enabletrackers[typesetters.italics]
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-jit.tex b/Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-jit.tex
index d769ccf8072..ef6d72c5e2d 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-jit.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-jit.tex
@@ -1,4 +1,4 @@
-% language=uk engine=luatex
+% language=us
\startcomponent hybrid-backends
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-languages.tex b/Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-languages.tex
index 403b1188f20..c9dffc6f94c 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-languages.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-languages.tex
@@ -1,4 +1,4 @@
-% engine=luatex language=uk
+% language=us
\startcomponent hybrid-languages
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-math.tex b/Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-math.tex
index de10a1b9c85..331ec939d28 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-math.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-math.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
\startcomponent hybrid-math
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-mathml.tex b/Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-mathml.tex
index 3510f5321e6..4e89134ab95 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-mathml.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-mathml.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
% \enabletrackers[structures.export]
% \setupbackend[export=yes]
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-merge.tex b/Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-merge.tex
index 2e5b96ed868..7d3ad932d7b 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-merge.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-merge.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
\startcomponent hybrid-merge
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-mkvi.tex b/Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-mkvi.tex
index 5cb43838f85..5196b670b2b 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-mkvi.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-mkvi.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
\startcomponent hybrid-mkvi
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-optimize.tex b/Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-optimize.tex
index 00772ee4bad..eaa56085b97 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-optimize.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-optimize.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
\startcomponent hybrid-optimize
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-parbuilder.tex b/Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-parbuilder.tex
index cceac6d55e0..ba8e5ae21ea 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-parbuilder.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-parbuilder.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
\startcomponent hybrid-parbuilder
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-partests.tex b/Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-partests.tex
index 4466ba38996..6fdc621c4e0 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-partests.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-partests.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
% green -> more
% yellow -> less
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-tags.tex b/Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-tags.tex
index 447e3d26f65..7b884b8ca11 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-tags.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-tags.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
\startcomponent hybrid-tags
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-titlepage.tex b/Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-titlepage.tex
index 3f9dfdc47de..c78d00fc6d2 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-titlepage.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-titlepage.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
\startcomponent hybrid-titlepage
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-weird.tex b/Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-weird.tex
index 48529f76d1e..5152ca86e3b 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-weird.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid-weird.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
\startcomponent hybrid-backends
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid.tex b/Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid.tex
index e15d7c31c15..d75929cbfb6 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/hybrid/hybrid.tex
@@ -1,5 +1,5 @@
% author : Hans Hagen
-% copyright : PRAGMA ADE & ConTeXt Development Team
+% copyright : ConTeXt Development Team
% license : Creative Commons Attribution ShareAlike 4.0 International
% reference : pragma-ade.nl | contextgarden.net | texlive (related) distributions
% origin : the ConTeXt distribution
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/interaction/interaction-actions.tex b/Master/texmf-dist/doc/context/sources/general/manuals/interaction/interaction-actions.tex
index a5caf2c0bdf..76168deb589 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/interaction/interaction-actions.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/interaction/interaction-actions.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
\environment interaction-style
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/interaction/interaction-annotations.tex b/Master/texmf-dist/doc/context/sources/general/manuals/interaction/interaction-annotations.tex
index e61a0953d3d..52998f7c860 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/interaction/interaction-annotations.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/interaction/interaction-annotations.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
\environment interaction-style
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/interaction/interaction-attachments.tex b/Master/texmf-dist/doc/context/sources/general/manuals/interaction/interaction-attachments.tex
index 6ae9b63103c..140a8ed4778 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/interaction/interaction-attachments.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/interaction/interaction-attachments.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
% Written while intermittently watching those always positive "Walk off the Earth"
% videos to keep me in the mood. They make what's normally not my kind of music
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/interaction/interaction-bookmarks.tex b/Master/texmf-dist/doc/context/sources/general/manuals/interaction/interaction-bookmarks.tex
index 04dd3f89d05..3e9c609e74b 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/interaction/interaction-bookmarks.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/interaction/interaction-bookmarks.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
\environment interaction-style
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/interaction/interaction-buttons.tex b/Master/texmf-dist/doc/context/sources/general/manuals/interaction/interaction-buttons.tex
index d083a61a774..1a8e698cf8c 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/interaction/interaction-buttons.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/interaction/interaction-buttons.tex
@@ -89,7 +89,7 @@ An overlay button adapts its size to the current overlay so you don't need to
worry about passing dimensions.
It is possible to define more complex buttons, like roll|-|over buttons or
-buttons that change appearance when you clock on them. These are more resource
+buttons that change appearance when you click on them. These are more resource
hungry and also depend on the viewer. These will discussed in the chapter about
widgets.
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/interaction/interaction-contents.tex b/Master/texmf-dist/doc/context/sources/general/manuals/interaction/interaction-contents.tex
index 0b59c1cbb00..9decc4ec8d9 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/interaction/interaction-contents.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/interaction/interaction-contents.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
\environment interaction-style
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/interaction/interaction-enabling.tex b/Master/texmf-dist/doc/context/sources/general/manuals/interaction/interaction-enabling.tex
index 8e31ccbe6f7..1d841db7588 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/interaction/interaction-enabling.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/interaction/interaction-enabling.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
\environment interaction-style
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/interaction/interaction-hyperlinks.tex b/Master/texmf-dist/doc/context/sources/general/manuals/interaction/interaction-hyperlinks.tex
index f204d502e18..7bac5d28d0c 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/interaction/interaction-hyperlinks.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/interaction/interaction-hyperlinks.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
\environment interaction-style
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/interaction/interaction-importing.tex b/Master/texmf-dist/doc/context/sources/general/manuals/interaction/interaction-importing.tex
index 8c36128f6b5..3f78acf92af 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/interaction/interaction-importing.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/interaction/interaction-importing.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
\environment interaction-style
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/interaction/interaction-introduction.tex b/Master/texmf-dist/doc/context/sources/general/manuals/interaction/interaction-introduction.tex
index a6f44b05b1c..f1625d07789 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/interaction/interaction-introduction.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/interaction/interaction-introduction.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
\environment interaction-style
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/interaction/interaction-javascript.tex b/Master/texmf-dist/doc/context/sources/general/manuals/interaction/interaction-javascript.tex
index 64e78446493..068e6f62cc1 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/interaction/interaction-javascript.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/interaction/interaction-javascript.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
\environment interaction-style
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/interaction/interaction-structure.tex b/Master/texmf-dist/doc/context/sources/general/manuals/interaction/interaction-structure.tex
index 793139d6c0d..9d3bbf9fd95 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/interaction/interaction-structure.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/interaction/interaction-structure.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
\environment interaction-style
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/interaction/interaction-tagging.tex b/Master/texmf-dist/doc/context/sources/general/manuals/interaction/interaction-tagging.tex
index d38c922f2b9..59c7036de0c 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/interaction/interaction-tagging.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/interaction/interaction-tagging.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
\environment interaction-style
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/interaction/interaction-titlepage.tex b/Master/texmf-dist/doc/context/sources/general/manuals/interaction/interaction-titlepage.tex
index 43b29baf961..99f6b8fd839 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/interaction/interaction-titlepage.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/interaction/interaction-titlepage.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
\environment interaction-style
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/interaction/interaction-transitions.tex b/Master/texmf-dist/doc/context/sources/general/manuals/interaction/interaction-transitions.tex
index 0cde2804076..1fd6701636b 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/interaction/interaction-transitions.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/interaction/interaction-transitions.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
\environment interaction-style
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/languages/languages-appendix.tex b/Master/texmf-dist/doc/context/sources/general/manuals/languages/languages-appendix.tex
index d8f33e44ac3..f475368948d 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/languages/languages-appendix.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/languages/languages-appendix.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us runpath=texruns:manuals/languages
\startcomponent languages-appendix
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/languages/languages-basics.tex b/Master/texmf-dist/doc/context/sources/general/manuals/languages/languages-basics.tex
index 84089709686..f99dcb5f004 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/languages/languages-basics.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/languages/languages-basics.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us runpath=texruns:manuals/languages
\startcomponent languages-basics
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/languages/languages-environment.tex b/Master/texmf-dist/doc/context/sources/general/manuals/languages/languages-environment.tex
index 2669fe0c524..31eac81ccd3 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/languages/languages-environment.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/languages/languages-environment.tex
@@ -1,3 +1,5 @@
+% language=us runpath=texruns:manuals/languages
+
\startenvironment languages-environment
\environment manuals-explaining-environment
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/languages/languages-goodies.tex b/Master/texmf-dist/doc/context/sources/general/manuals/languages/languages-goodies.tex
index 32de54db3fa..b7f79935c65 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/languages/languages-goodies.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/languages/languages-goodies.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
\startcomponent languages-goodies
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/languages/languages-hyphenation.tex b/Master/texmf-dist/doc/context/sources/general/manuals/languages/languages-hyphenation.tex
index 96271d1aa5d..ac456502e74 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/languages/languages-hyphenation.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/languages/languages-hyphenation.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us runpath=texruns:manuals/languages
\startcomponent languages-hyphenation
@@ -871,6 +871,56 @@ discretionaries.
\stopsection
+\startsection[title=Neat tricks]
+
+The following two examples are for users to test. The first one shows all hyphenation
+points in a paragraph:
+
+\starttyping
+\bgroup
+ \setupalign[flushright]
+ \hyphenpenalty-100000
+ \input tufte
+ \par % force hyphenation
+\egroup
+\stoptyping
+
+The second one shows the cases where a hyphenated word ends a page:
+
+\starttyping
+\bgroup
+ \page
+ \interlinepenalty10000
+ \brokenpenalty-10000
+ \input tufte
+ \page
+\egroup
+\stoptyping
+
+A less space consuming variant of that one is:
+
+\starttyping
+\bgroup
+ \setbox\scratchboxone\vbox \bgroup
+ \interlinepenalty10000
+ \brokenpenalty-10000
+ \input tufte
+ \egroup
+ \doloop {
+ \ifvoid\scratchboxone
+ \hrule
+ \exitloop
+ \else
+ \setbox\scratchboxtwo\vsplit\scratchboxone to 1pt
+ \hrule
+ \unvbox\scratchboxtwo
+ \fi
+ }
+\egroup
+\stoptyping
+
+\stopsection
+
\stopchapter
\stopcomponent
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/languages/languages-introduction.tex b/Master/texmf-dist/doc/context/sources/general/manuals/languages/languages-introduction.tex
index 25bbb1a90e5..354f638ac1a 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/languages/languages-introduction.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/languages/languages-introduction.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us runpath=texruns:manuals/languages
\startcomponent languages-introduction
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/languages/languages-labels.tex b/Master/texmf-dist/doc/context/sources/general/manuals/languages/languages-labels.tex
index 6c806ab1c64..58b01852dcf 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/languages/languages-labels.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/languages/languages-labels.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us runpath=texruns:manuals/languages
\startcomponent languages-labels
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/languages/languages-mkiv.tex b/Master/texmf-dist/doc/context/sources/general/manuals/languages/languages-mkiv.tex
index a65c6d532e2..b6c5c19ff45 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/languages/languages-mkiv.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/languages/languages-mkiv.tex
@@ -1,7 +1,7 @@
-% language=uk
+% language=us runpath=texruns:manuals/languages
% author : Hans Hagen
-% copyright : PRAGMA ADE & ConTeXt Development Team
+% copyright : ConTeXt Development Team
% license : Creative Commons Attribution ShareAlike 4.0 International
% reference : pragma-ade.nl | contextgarden.net | texlive (related) distributions
% origin : the ConTeXt distribution
@@ -56,6 +56,7 @@
\component languages-typesetting
\component languages-goodies
\component languages-sorting
+ \component languages-options
\stopbodymatter
\startappendices
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/languages/languages-numbering.tex b/Master/texmf-dist/doc/context/sources/general/manuals/languages/languages-numbering.tex
index 9752b62710a..bb048240053 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/languages/languages-numbering.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/languages/languages-numbering.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
\startcomponent languages-numbering
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/languages/languages-options.tex b/Master/texmf-dist/doc/context/sources/general/manuals/languages/languages-options.tex
new file mode 100644
index 00000000000..96d3353f309
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/languages/languages-options.tex
@@ -0,0 +1,424 @@
+% language=us
+
+\startcomponent languages-options
+
+\environment languages-environment
+
+\startchapter[title=Options][color=darkblue]
+
+\startsection[title=Introduction]
+
+Hyphenation of words is controlled by so called patterns. They take a word and
+try to match parts with a pattern that describes where a hyphen can be injected.
+Preferred and discouraged injection points accumulate to a score that in the end
+determine where so called discretionary nodes gets injected in the list of
+glyphs that make a word. The patterns are language specific.
+
+This mechanism is agnostic when it comes to the characters involved: they are
+just numbers. However, when in a next step font features like ligature building
+and kerning are applied we also have to deal with language specific properties
+(and meanings). Often a ligature at the boundary of a composed word can make
+reading confusing and has to be avoided. Some of that can be controlled by the
+font when it implements language specific features but because that approach is
+not based on a dictionary it is more about playing safe and prevention than about
+quality.
+
+In the next sections a mechanism is discussed that also uses patterns. This time
+it is about controlling fonts as well as how hyphenation patterns are applied.
+This process kicks in before hyphenation is applied but it definitely has to be
+seen as part of that same process. It is integrated in hyphenation machinery and
+acts as preprocessor with the possibility to feedback and move forward. The
+implementation is such that when it's not used there is no performance penalty.
+\footnote {There are by now plenty of alternative approaches to these problems
+but after some discussion about the pro's and cons of each this new mechanism was
+made. I admit that the fun factor played a role. It is also one of the things we
+can do in \LUAMETATEX\ without worrying about a possible negative impact on
+\LUATEX\ users other than \CONTEXT .}
+
+There are several predefined operations that are characterized by keywords and
+shortcuts and collected in an option list that is part of a language goodie file.
+Examples can be found in the distribution in files with the suffix \type {llg}
+(\LUA\ language goodie). The framework of such a file is:
+
+\starttyping
+return {
+ name = "whatever",
+ version = "1.00",
+ comment = "Goodies for experiments and demo.",
+ author = "Hans Hagen",
+ copyright = "ConTeXt development team",
+ options = {
+ { ... },
+ ........
+ { ... },
+ }
+}
+\stoptyping
+
+These options will eventually result in patterns that are bound to words,
+think of:
+
+\starttabulate[|T||||]
+\NC effe \NC \type {foo|bar} \NC \type {..|..} \NC inhibit ligature \NC \NR
+\NC foobar \NC \type {foo=bar} \NC \type {...=...} \NC inhibit kerning \NC \NR
+\NC somemore \NC \type {some+more} \NC \type {....+....} \NC compound word \NC \NR
+\stoptabulate
+
+The whole repertoire is:
+
+\starttabulate[||T|]
+\NC \type {a|b} \NC a:norightligature, b:noleftligature \NC \NR
+\NC \type {a=b} \NC a:norightkern, b:noleftkern \NC \NR
+\NC \type {a<b} \NC b:noleftkern \NC \NR
+\NC \type {a>b} \NC a:norightkern \NC \NR
+\NC \type {a+b} \NC a:compound:b \NC \NR
+\stoptabulate
+
+Later we will see how some can be combined. An option can be defined using entries
+in a subtable:
+
+\starttabulate[|T|||]
+\NC patterns \NC hash \NC \type {[snippet] = "replacement pattern"} \NC \NR
+\NC words \NC string \NC string of words, separated by whitespace \NC \NR
+\NC prefixes \NC string \NC snippets that combine with words (at the start) \NC \NR
+\NC suffixes \NC string \NC snippets that combine with words (at the end) \NC \NR
+\NC matches \NC array or number \NC a number or table indicating which match matters \NC \NR
+\NC actions \NC hash \NC \type {[character] = "action(s)"} \NC \NR
+\NC characters \NC string \NC permitted characters (additional hjcodes) \NC \NR
+\NC return \NC integer \NC what to do next \NC \NR
+\stoptabulate
+
+The default return value is~2 but there are some more:
+
+\starttabulate[|T||]
+\NC 0 \NC go to the next (valid) word \NC \NR
+\NC 1 \NC restart \NC \NR
+\NC 2 \NC exceptions and after that patterns \NC \NR
+\NC 3 \NC patterns \NC \NR
+\stoptabulate
+
+There are some safeguards built in that force a restart. For instance when a word
+is replaced a restart is enforces unless we skip the word. A restart will not
+permit a second replacement (after all we need to avoid endless loops).
+
+In a multi|-|line word list, lines that start with a comment trigger: \LUA's
+double dash or the usual \TEX\ percent sign.
+
+\stopsection
+
+\startsection[title=Inhibiting]
+
+The next definition replaces \type {ff} by \type {f|f} in the words given and
+eventually block a ligature.
+
+\starttyping
+{
+ patterns = {
+ ff = "f|f",
+ },
+ words = [[
+ effe
+ ]],
+}
+\stoptyping
+
+Some fonts provide the \type {ij} ligature or do some special kerning between
+these characters (something Dutch). Because it depends on the font logic if a
+dedicated replacement or kerning is used this is an example where we do this:
+
+\starttyping
+{
+ patterns = {
+ ij = "i|j",
+ },
+ actions = {
+ ["|"] = "nokern noligature",
+ },
+ words = [[
+ ijverig
+ -- fijn -- to ligature fi or ij, that's the question
+ ]],
+}
+\stoptyping
+
+A more extensive definition is the following. Here we explicitly define that only
+the first match in a word get treated. Here we not only block ligatures but also
+kerns.
+
+\starttyping
+{
+ patterns = {
+ ff = "f|f",
+ },
+ matches = { 1 },
+ actions = {
+ ["|"] = "noligature nokern"
+ },
+ words = [[
+ effe
+ effeffe
+ ]],
+}
+\stoptyping
+
+You can also omit the pattern when you inject specifiers yourself:
+
+\starttyping
+{
+ actions = {
+ ["|"] = "noligature nokern"
+ },
+ words = [[
+ ef|fe
+ ef|fef|fe
+ ]],
+}
+\stoptyping
+
+You can also use different shortcuts:
+
+\starttyping
+{
+ actions = {
+ ["1"] = "noligature"
+ ["2"] = "nokern"
+ },
+ words = [[
+ ef1fe
+ ef1fef2fe
+ ]],
+}
+\stoptyping
+
+Although I cannot come up with a nice example, there can be reasons for
+inhibiting kerns. Here we inhibit kerns left of the upcoming character:
+
+\starttyping
+{
+ patterns = {
+ fo = "f<o",
+ rm = "r<m",
+ },
+ words = [[
+ information
+ ]],
+}
+\stoptyping
+
+And here we inhibit kerns left of the previous and upcoming character:
+
+\starttyping
+{
+ patterns = {
+ th = "t=h",
+ },
+ words = [[
+ thrive
+ ]],
+}
+\stoptyping
+
+Just look in the files in the distribution for realistic examples, like
+
+\starttyping
+{
+ patterns = {
+ fi = "f|i",
+ },
+ words = [[
+ deafish dwarfish elfish oafish selfish
+ ]],
+ suffixes = [[
+ ness ly
+ ]]
+}
+\stoptyping
+
+where we block ligatures in 15 words. There's also a \type {prefixes} key.
+
+\stopsection
+
+\startsection[title=Replacements]
+
+Replacements are probably not used that much but here is one for German. Not
+only is the uppercase variant of ß seldom used, many fonts don't provide it
+so we can best replace it:
+
+\starttyping
+{
+ characters = "ẞ", -- uppercase ß, not visible in all verbatim fonts
+ patterns = {
+ ["ẞ"] = "SS", -- key is uppercase ß
+ },
+}
+\stoptyping
+
+Here we define that character as valid, something that normally is done with the
+patterns but patterns don't have them. If we do not specify it here, the
+hyphenator will skip this word. For the record: this can also be done with a font
+feature that decomposes the character.
+
+\stopsection
+
+\startsection[title=Compound words]
+
+You might want to suppress ligatures and maybe even kerning when compound words
+are involved.
+
+\starttyping
+{
+ patterns = {
+ ff = "f+f",
+ },
+ words = [[
+ aaaaffaaaa
+ bbffbb
+ ]],
+}
+\stoptyping
+
+Again you can also say:
+
+\starttyping
+{
+ words = [[
+ aaaaf|faaaa
+ bbf|fbb
+ ]],
+}
+\stoptyping
+
+But patterns make sense when you have a large list (that might come from some
+other source than yourself).
+
+The next specification will turn two times three \type {bla}'s into a compound
+word but also make sure that we have at least 4 characters left and right of a
+potential break.
+
+\starttyping
+ {
+ left = 4,
+ right = 4,
+ words = [[
+ blablabla+blablabla
+ ]],
+ }
+\stoptyping
+
+\stopsection
+
+\startsection[title=Performance]
+
+Although these mechanisms introduce overhead, the performance hit in \LMTX\ is
+not that large. This is because the number of words in a document is limited and
+\LUA\ is fast enough.
+
+\stopsection
+
+\startsection[title=Plugins]
+
+{\em This interface is preliminary but for the record I put an example here
+anyway.}
+
+\starttyping
+local n = 0
+function document.myhack(original)
+ n = n + 1
+ print(n,original)
+ return original
+end
+
+languages.installhandler("de","document.myhack")
+\stoptyping
+
+One can manipulate a text as in:
+
+\starttyping
+function document.myhack(original)
+ local t = utf.split(original)
+ local t = table.reverse(t)
+ local f = t[#t]
+ local l = t[1]
+ if characters.upper(f) == f then
+ t[1] = characters.upper()
+ t[#t] = characters.lower(f)
+ end
+ local original = table.concat(t)
+ return original
+end
+
+languages.installhandler("en","document.myhack")
+\stoptyping
+
+The text will fed again into the hyphenator and treated in the normal way. There
+are some safeguards against the text being processed twice.
+
+\stopsection
+
+\startsection[title=Tracing]
+
+You can also embed definitions in the source file:
+
+\starttyping
+\startlanguageoptions[de]
+ Zapf|innovation
+\stoplanguageoptions
+\stoptyping
+
+\stopsection
+
+\startsection[title=Exceptions]
+
+When you set exceptions in a goodie file, it will use the plugin mechanism to
+check for them. This is a bit more efficient than using the internal checkerm
+which actually also goes via a\LUA\ hash.
+
+\starttyping
+{
+ exceptions = [[
+ a-very{-}{-}{w}eird{1}{2}{3}(w)ord
+ ]],
+}
+\stoptyping
+
+Watch out: when you specify a discretionary replacement three braced valued are
+passed: the pre, post and replace text. The replace text is used in the lookup,
+unless you add a string between parentheses, which then will be used instead. A
+digit between bracket will apply a penalty according to the following logic (in
+the engine): A zero digit results in \type {\hyphenpenalty}, otherwise the
+digits~1 upto~9 will be used as multiplier for \type {\exceptionpenalty} when
+that value is larger than 100000, otherwise \type {\exceptionpenalty} is used.
+
+\stopsection
+
+\startsection[title=Tracing]
+
+The following tracker can be used:
+
+\starttyping
+\enabletrackers[languages.goodies]
+\stoptyping
+
+In addition the style \type {languages-goodies} implements some tracing options.
+You can just run that one to see what it does.
+
+The engine itself has also a tracing option: \type {\tracinghyphenation}. When
+set to zero nothing is shown, when set to one redundant patterns will be
+reported. A value of two reports what words get fed into the hyphenator and if
+they got hyphenated. A value of three gives more detail: when a word gets
+hyphenated the relevant (resulting) part of the node list is shown. You need to
+set \type {\tracingonline} to a value larger than zero to get this reported to
+the console. Expects lots of extra output to the console for large documents but
+it can be revealing.
+
+\stopsection
+
+\stopchapter
+
+\stopcomponent
+
+%D Musical timestamp: end Match 2021: running into Joe Parrish's amazing
+%D interpretation of Stravinsky's "Rite of Spring" on guitars.
+%D
+%D Also on YT: The Rite of Spring by London Symphony Orchestra (conducted
+%D by Simon Rattle).
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/languages/languages-sorting.tex b/Master/texmf-dist/doc/context/sources/general/manuals/languages/languages-sorting.tex
index 956866e5d81..9e9bde8b6fe 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/languages/languages-sorting.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/languages/languages-sorting.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us runpath=texruns:manuals/languages
\startcomponent languages-sorting
@@ -292,8 +292,6 @@ which gives:
\getbuffer
-\stoptext
-
\stopsection
\stopchapter
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
index 7a8bcd535a8..f896d1fcb37 100644
--- 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
@@ -1,7 +1,7 @@
-% language=us
+% language=us runpath=texruns:manuals/libraries
% author : Hans Hagen
-% copyright : PRAGMA ADE & ConTeXt Development Team
+% copyright : ConTeXt Development Team
% license : Creative Commons Attribution ShareAlike 4.0 International
% reference : pragma-ade.nl | contextgarden.net | texlive (related) distributions
% origin : the ConTeXt distribution
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 07caca83c06..ecbbaff0b9d 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
@@ -1,7 +1,7 @@
-% language=uk
+% language=us runpath=texruns:manuals/libraries
% author : Hans Hagen
-% copyright : PRAGMA ADE & ConTeXt Development Team
+% copyright : ConTeXt Development Team
% license : Creative Commons Attribution ShareAlike 4.0 International
% reference : pragma-ade.nl | contextgarden.net | texlive (related) distributions
% origin : the ConTeXt distribution
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/lowlevel/lowlevel-alignments.tex b/Master/texmf-dist/doc/context/sources/general/manuals/lowlevel/lowlevel-alignments.tex
new file mode 100644
index 00000000000..a70e222ea77
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/lowlevel/lowlevel-alignments.tex
@@ -0,0 +1,830 @@
+% language=us runpath=texruns:manuals/lowlevel
+
+\startcomponent lowlevel-alignments
+
+\environment lowlevel-style
+
+\startdocument
+ [title=alignments,
+ color=middlegreen]
+
+\startsectionlevel[title=Introduction]
+
+\TEX\ has a couple of subsystems and alignments is one of them. This mechanism is
+used to construct tables or alike. Because alignments use low level primitives to
+set up and construct a table, and because such a setup can be rather extensive, in
+most cases users will rely on macros that hide this.
+
+\startbuffer
+\halign {
+ \alignmark\hss \aligntab
+ \hss\alignmark\hss \aligntab
+ \hss\alignmark \cr
+ 1.1 \aligntab 2,2 \aligntab 3=3 \cr
+ 11.11 \aligntab 22,22 \aligntab 33=33 \cr
+ 111.111 \aligntab 222,222 \aligntab 333=333 \cr
+}
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+That one doesn't look too complex and comes out as:
+
+\blank\getbuffer\blank
+
+This is how the previous code comes out when we use one of the \CONTEXT\ table
+mechanism.
+
+\startbuffer
+\starttabulate[|l|c|r|]
+ \NC 1.1 \NC 2,2 \NC 3=3 \NC \NR
+ \NC 11.11 \NC 22,22 \NC 33=33 \NC \NR
+ \NC 111.111 \NC 222,222 \NC 333=333 \NC \NR
+\stoptabulate
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+\blank\getbuffer\blank
+
+That one looks a bit different with respect to spaces, so let's go back to the
+low level variant:
+
+\startbuffer
+\halign {
+ \alignmark\hss \aligntab
+ \hss\alignmark\hss \aligntab
+ \hss\alignmark \cr
+ 1.1\aligntab 2,2\aligntab 3=3\cr
+ 11.11\aligntab 22,22\aligntab 33=33\cr
+ 111.111\aligntab 222,222\aligntab 333=333\cr
+}
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+Here we don't have spaces in the content part and therefore also no spaces in the
+result:
+
+\blank\getbuffer\blank
+
+You can automate dealing with unwanted spacing:
+
+\startbuffer
+\halign {
+ \ignorespaces\alignmark\unskip\hss \aligntab
+ \hss\ignorespaces\alignmark\unskip\hss \aligntab
+ \hss\ignorespaces\alignmark\unskip \cr
+ 1.1 \aligntab 2,2 \aligntab 3=3 \cr
+ 11.11 \aligntab 22,22 \aligntab 33=33 \cr
+ 111.111 \aligntab 222,222 \aligntab 333=333 \cr
+}
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+We get:
+
+\blank\getbuffer\blank
+
+By moving the space skipping and cleanup to the so called preamble we don't need
+to deal with it in the content part. We can also deal with inter|-|column spacing
+there:
+
+\startbuffer
+\halign {
+ \ignorespaces\alignmark\unskip\hss \tabskip 1em \aligntab
+ \hss\ignorespaces\alignmark\unskip\hss \tabskip 1em \aligntab
+ \hss\ignorespaces\alignmark\unskip \tabskip 0pt \cr
+ 1.1 \aligntab 2,2 \aligntab 3=3 \cr
+ 11.11 \aligntab 22,22 \aligntab 33=33 \cr
+ 111.111 \aligntab 222,222 \aligntab 333=333 \cr
+}
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+\blank\getbuffer\blank
+
+If for the moment we forget about spanning columns (\type {\span}) and locally
+ignoring preamble entries (\type {\omit}) these basic commands are not that
+complex to deal with. Here we use \type {\alignmark} but that is just a primitive
+that we use instead of \type {#} while \type {\aligntab} is the same as \type
+{&}, but using the characters instead also assumes that they have the catcode
+that relates to a parameter and alignment tab (and in \CONTEXT\ that is not the
+case). The \TEX book has plenty alignment examples so if you really want to learn
+about them, consult that must|-|have|-|book.
+
+\stopsectionlevel
+
+\startsectionlevel[title=Between the lines]
+
+The individual rows of a horizontal alignment are treated as lines. This means that,
+as we see in the previous section, the interline spacing is okay. However, that also
+means that when we mix the lines with rules, the normal \TEX\ habits kick in. Take
+this:
+
+\startbuffer
+\halign {
+ \ignorespaces\alignmark\unskip\hss \tabskip 1em \aligntab
+ \hss\ignorespaces\alignmark\unskip\hss \tabskip 1em \aligntab
+ \hss\ignorespaces\alignmark\unskip \tabskip 0pt \cr
+ \noalign{\hrule}
+ 1.1 \aligntab 2,2 \aligntab 3=3 \cr
+ \noalign{\hrule}
+ 11.11 \aligntab 22,22 \aligntab 33=33 \cr
+ \noalign{\hrule}
+ 111.111 \aligntab 222,222 \aligntab 333=333 \cr
+ \noalign{\hrule}
+}
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+The result doesn't look pretty and actually, when you see documents produced by
+\TEX\ using alignments you should not be surprised to notice rather ugly spacing.
+The user (or the macropackage) should deal with that explicitly, and this is not
+always the case.
+
+\startlinecorrection
+\getbuffer
+\stoplinecorrection
+
+The solution is often easy:
+
+\startbuffer
+\halign {
+ \ignorespaces\strut\alignmark\unskip\hss \tabskip 1em \aligntab
+ \hss\ignorespaces\strut\alignmark\unskip\hss \tabskip 1em \aligntab
+ \hss\ignorespaces\strut\alignmark\unskip \tabskip 0pt \cr
+ \noalign{\hrule}
+ 1.1 \aligntab 2,2 \aligntab 3=3 \cr
+ \noalign{\hrule}
+ 11.11 \aligntab 22,22 \aligntab 33=33 \cr
+ \noalign{\hrule}
+ 111.111 \aligntab 222,222 \aligntab 333=333 \cr
+ \noalign{\hrule}
+}
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+\startlinecorrection
+\getbuffer
+\stoplinecorrection
+
+The user will not notice it but alignments put some pressure on the general \TEX\
+scanner. Actually, the scanner is either scanning an alignment or it expects
+regular text (including math). When you look at the previous example you see
+\type {\noalign}. When the preamble is read, \TEX\ will pick up rows till it
+finds the final brace. Each row is added to a temporary list and the \type
+{\noalign} will enter a mode where other stuff gets added to that list. It all
+involves subtle look ahead but with minimal overhead. When the whole alignment is
+collected a final pass over that list will package the cells and rows (lines) in
+the appropriate way using information collected (like the maximum width of a cell
+and width of the current cell. It will also deal with spanning cells then.
+
+So let's summarize what happens:
+
+\startitemize[n,packed]
+\startitem
+ scan the preamble that defines the cells (where the last one is repeated
+ when needed)
+\stopitem
+\startitem
+ check for \type {\cr}, \type {\noalign} or a right brace; when a row is
+ entered scan for cells in parallel the preamble so that cell specifications
+ can be applied (then start again)
+\stopitem
+\startitem
+ package the preamble based on information with regards to the cells in
+ a column
+\stopitem
+\startitem
+ apply the preamble packaging information to the columns and also deal with
+ pending cell spans
+\stopitem
+\startitem
+ flush the result to the current list, unless packages in a box a \type
+ {\halign} is seen as paragraph and rows as lines (such a table can split)
+\stopitem
+\stopitemize
+
+The second (repeated) step is complicated by the fact that the scanner has to
+look ahead for a \type {\noalign}, \type {\cr}, \type {\omit} or \type {\span}
+and when doing that it has to expand what comes. This can give side effects and
+often results in obscure error messages. When for instance an \type {\if} is seen
+and expanded, the wrong branch can be entered. And when you use protected macros
+embedded alignment commands are not seen at all; of course they still need to
+produce valid operations in the current context.
+
+All these side effects are to be handled in a macro package when it wraps
+alignments in a high level interface and \CONTEXT\ does that for you. But because
+the code doesn't always look pretty then, in \LUAMETATEX\ the alignment mechanism
+has been extended a bit over time.
+
+Nesting \type {\noalign} is normally not permitted (but one can redefine this
+primitive such that a macro package nevertheless handles it). The first extension
+permits nested usage of \type {\noalign}. This has resulted of a little
+reorganization of the code. A next extension showed up when overload protection
+was introduced and extra prefixes were added. We can signal the scanner that a
+macro is actually a \type {\noalign} variant: \footnote {One can argue for using
+the name \type {\peekaligned} because in the meantime other alignment primitives
+also can use this property.}
+
+\starttyping[option=TEX]
+\noaligned\protected\def\InBetween{\noalign{...}}
+\stoptyping
+
+Here the \type {\InBetween} macro will get the same treatment as \type {\noalign}
+and it will not trigger an error. This extension resulted in a second bit of
+reorganization (think of internal command codes and such) but still the original
+processing of alignments was there.
+
+A third overhaul of the code actually did lead to some adaptations in the way
+alignments are constructed so let's move on to that.
+
+\stopsectionlevel
+
+\startsectionlevel[title={Pre-, inter- and post-tab skips}]
+
+The basic structure of a preamble and row is actually not that complex: it is
+a mix of tab skip glue and cells (that are just boxes):
+
+\startbuffer
+\tabskip 10pt
+\halign {
+ \strut\alignmark\tabskip 12pt\aligntab
+ \strut\alignmark\tabskip 14pt\aligntab
+ \strut\alignmark\tabskip 16pt\cr
+ \noalign{\hrule}
+ cell 1.1\aligntab cell 1.2\aligntab cell 1.3\cr
+ \noalign{\hrule}
+ cell 2.1\aligntab cell 2.2\aligntab cell 2.3\cr
+ \noalign{\hrule}
+}
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+The tab skips are set in advance and apply to the next cell (or after the last
+one).
+
+\startbuffer[blownup-1]
+\startlinecorrection
+{\showmakeup[glue]\scale[width=\textwidth]{\vbox{\getbuffer}}}
+\stoplinecorrection
+\stopbuffer
+
+\getbuffer[blownup-1]
+
+% \normalizelinemode \zerocount % \discardzerotabskipsnormalizecode
+
+In the \CONTEXT\ table mechanisms the value of \type {\tabskip} is zero
+in most cases. As in:
+
+\startbuffer
+\tabskip 0pt
+\halign {
+ \strut\alignmark\aligntab
+ \strut\alignmark\aligntab
+ \strut\alignmark\cr
+ \noalign{\hrule}
+ cell 1.1\aligntab cell 1.2\aligntab cell 1.3\cr
+ \noalign{\hrule}
+ cell 2.1\aligntab cell 2.2\aligntab cell 2.3\cr
+ \noalign{\hrule}
+}
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+When these ships are zero, they still show up in the end:
+
+\getbuffer[blownup-1]
+
+Normally, in order to achieve certain effects there will be more align entries in
+the preamble than cells in the table, for instance because you want vertical
+lines between cells. When these are not used, you can get quite a bit of empty
+boxes and zero skips. Now, of course this is seldom a problem, but when you have
+a test document where you want to show font properties in a table and that font
+supports a script with some ten thousand glyphs, you can imagine that it
+accumulates and in \LUATEX\ (and \LUAMETATEX) nodes are larger so it is one of
+these cases where in \CONTEXT\ we get messages on the console that node memory is
+bumped. \footnote {I suppose it was a coincidence that a few weeks after these
+features came available a user consulted the mailing list about a few thousand
+page table that made the engine run out of memory, something that could be cured
+by enabling these new features.}
+
+After playing a bit with stripping zero tab skips I found that the code would not
+really benefit from such a feature: lots of extra tests made it quite ugly. As a
+result a first alternative was to just strip zero skips before an alignment got
+flushed. At least we're then a bit leaner in the processes that come after it.
+This feature is now available as one of the normalizer bits.
+
+But, as we moved on, a more natural approach was to keep the skips in the
+preamble, because that is where a guaranteed alternating skip|/|box is assumed.
+It also makes that the original documentation is still valid. However, in the
+rows construction we can be lean. This is driven by a keyword to \type {\halign}:
+
+\startbuffer
+\tabskip 0pt
+\halign noskips {
+ \strut\alignmark\aligntab
+ \strut\alignmark\aligntab
+ \strut\alignmark\cr
+ \noalign{\hrule}
+ cell 1.1\aligntab cell 1.2\aligntab cell 1.3\cr
+ \noalign{\hrule}
+ cell 2.1\aligntab cell 2.2\aligntab cell 2.3\cr
+ \noalign{\hrule}
+}
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+No zero tab skips show up here:
+
+\getbuffer[blownup-1]
+
+When playing with all this the \LUAMETATEX\ engine also got a tracing option for
+alignments. We already had one that showed some of the \type{\noalign} side
+effects, but showing the preamble was not yet there. This is what \typ
+{\tracingalignments = 2} results in:
+
+% {\tracingalignments2 \setbox0\vbox{\getbuffer}}
+
+\starttyping[option=TEX]
+<preamble>
+\glue[ignored][...] 0.0pt
+\alignrecord
+..{\strut }
+..<content>
+..{\endtemplate }
+\glue[ignored][...] 0.0pt
+\alignrecord
+..{\strut }
+..<content>
+..{\endtemplate }
+\glue[ignored][...] 0.0pt
+\alignrecord
+..{\strut }
+..<content>
+..{\endtemplate }
+\glue[ignored][...] 0.0pt
+\stoptyping
+
+The \type {ignored} subtype is (currently) only used for these alignment tab
+skips and it triggers a check later on when the rows are constructed. The \type
+{<content>} is what get injected in the cell (represented by \type {\alignmark}).
+The pseudo primitives are internal and not public.
+
+\stopsectionlevel
+
+\startsectionlevel[title={Cell widths}]
+
+Imagine this:
+
+\startbuffer
+\halign {
+ x\hbox to 3cm{\strut \alignmark\hss}\aligntab
+ x\hbox to 3cm{\strut\hss\alignmark\hss}\aligntab
+ x\hbox to 3cm{\strut\hss\alignmark }\cr
+ cell 1.1\aligntab cell 1.2\aligntab cell 1.3\cr
+ cell 2.1\aligntab cell 2.2\aligntab cell 2.3\cr
+}
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+which renders as:
+
+\startbuffer[blownup-2]
+\startlinecorrection
+{\showboxes\scale[width=\textwidth]{\vbox{\getbuffer}}}
+\stoplinecorrection
+\stopbuffer
+
+{\showboxes\getbuffer[blownup-2]}
+
+A reason to have boxes here is that it enforces a cell width but that is done at
+the cost of an extra wrapper. In \LUAMETATEX\ the \type {hlist} nodes are rather
+large because we have more options than in original \TEX, for instance offsets
+and orientation. In a table with 10K rows of 4 cells yet get 40K extra \type
+{hlist} nodes allocated. Now, one can argue that we have plenty of memory but
+being lazy is not really a sign of proper programming.
+
+\startbuffer
+\halign {
+ x\tabsize 3cm\strut \alignmark\hss\aligntab
+ x\tabsize 3cm\strut\hss\alignmark\aligntab
+ x\tabsize 3cm\strut\hss\alignmark\hss\cr
+ cell 1.1\aligntab cell 1.2\aligntab cell 1.3\cr
+ cell 2.1\aligntab cell 2.2\aligntab cell 2.3\cr
+}
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+If you look carefully you will see that this time we don't have the embedded
+boxes:
+
+{\showboxes\getbuffer[blownup-2]}
+
+So, both the sparse skip and new \type {\tabsize} feature help to make these
+extreme tables (spanning hundreds of pages) not consume irrelevant memory and
+also make that later on we don't have to consult useless nodes.
+
+\stopsectionlevel
+
+\startsectionlevel[title=Plugins]
+
+Yet another \LUAMETATEX\ extension is a callback that kicks in between the
+preamble preroll and finalizing the alignment. Initially as test and
+demonstration a basic character alignment feature was written but that works so
+well that in some places it can replace (or compliment) the already existing
+features in the \CONTEXT\ table mechanisms.
+
+\startbuffer
+\starttabulate[|lG{.}|cG{,}|rG{=}|cG{x}|]
+\NC 1.1 \NC 2,2 \NC 3=3 \NC a 0xFF \NC \NR
+\NC 11.11 \NC 22,22 \NC 33=33 \NC b 0xFFF \NC \NR
+\NC 111.111 \NC 222,222 \NC 333=333 \NC c 0xFFFF \NC \NR
+\stoptabulate
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+The tabulate mechanism in \CONTEXT\ is rather old and stable and it is the
+preferred way to deal with tabular content in the text flow. However, adding the
+\type {G} specifier (as variant of the \type {g} one) could be done without
+interference or drop in performance. This new \type {G} specifier tells the
+tabulate mechanism that in that column the given character is used to vertically
+align the content that has this character.
+
+\blank\getbuffer\blank
+
+Let's make clear that this is {\em not} an engine feature but a \CONTEXT\ one. It
+is however made easy by this callback mechanism. We can of course use this feature
+with the low level alignment primitives, assuming that you tell the machinery that
+the plugin is to be kicked in.
+
+\startbuffer
+\halign noskips \alignmentcharactertrigger \bgroup
+ \tabskip2em
+ \setalignmentcharacter.\ignorespaces\alignmark\unskip\hss \aligntab
+ \hss\setalignmentcharacter,\ignorespaces\alignmark\unskip\hss \aligntab
+ \hss\setalignmentcharacter=\ignorespaces\alignmark\unskip \aligntab
+ \hss \ignorespaces\alignmark\unskip\hss \cr
+ 1.1 \aligntab 2,2 \aligntab 3=3 \aligntab \setalignmentcharacter{.}\relax 4.4\cr
+ 11.11 \aligntab 22,22 \aligntab 33=33 \aligntab \setalignmentcharacter{,}\relax 44,44\cr
+ 111.111 \aligntab 222,222 \aligntab 333=333 \aligntab \setalignmentcharacter{!}\relax 444!444\cr
+ x \aligntab x \aligntab x \aligntab \setalignmentcharacter{/}\relax /\cr
+ .1 \aligntab ,2 \aligntab =3 \aligntab \setalignmentcharacter{?}\relax ?4\cr
+ .111 \aligntab ,222 \aligntab =333 \aligntab \setalignmentcharacter{=}\relax 44=444\cr
+\egroup
+\stopbuffer
+
+{\switchtobodyfont[8pt] \typebuffer[option=TEX]}
+
+This rather verbose setup renders as:
+
+\blank\getbuffer\blank
+
+Using a high level interface makes sense but local control over such alignment too, so
+here follow some more examples. Here we use different alignment characters:
+
+\startbuffer
+\starttabulate[|lG{.}|cG{,}|rG{=}|cG{x}|]
+\NC 1.1 \NC 2,2 \NC 3=3 \NC a 0xFF \NC \NR
+\NC 11.11 \NC 22,22 \NC 33=33 \NC b 0xFFF \NC \NR
+\NC 111.111 \NC 222,222 \NC 333=333 \NC c 0xFFFF \NC \NR
+\stoptabulate
+\stopbuffer
+
+\typebuffer[option=TEX] \getbuffer
+
+In this example we specify the characters in the cells. We still need to add a
+specifier in the preamble definition because that will trigger the plugin.
+
+\startbuffer
+\starttabulate[|lG{}|rG{}|]
+\NC left \NC right \NC\NR
+\NC \showglyphs \setalignmentcharacter{.}1.1 \NC \setalignmentcharacter{.}1.1 \NC\NR
+\NC \showglyphs \setalignmentcharacter{,}11,11 \NC \setalignmentcharacter{,}11,11 \NC\NR
+\NC \showglyphs \setalignmentcharacter{=}111=111 \NC \setalignmentcharacter{=}111=111 \NC\NR
+\stoptabulate
+\stopbuffer
+
+{\switchtobodyfont[8pt] \typebuffer[option=TEX]} \getbuffer
+
+You can mix these approaches:
+
+\startbuffer
+\starttabulate[|lG{.}|rG{}|]
+\NC left \NC right \NC\NR
+\NC 1.1 \NC \setalignmentcharacter{.}1.1 \NC\NR
+\NC 11.11 \NC \setalignmentcharacter{.}11.11 \NC\NR
+\NC 111.111 \NC \setalignmentcharacter{.}111.111 \NC\NR
+\stoptabulate
+\stopbuffer
+
+\typebuffer[option=TEX] \getbuffer
+
+Here the already present alignment feature, that at some point in tabulate might
+use this new feature, is meant for numbers, but here we can go wild with words,
+although of course you need to keep in mind that we deal with typeset text, so
+there may be no match.
+
+\startbuffer
+\starttabulate[|lG{.}|rG{.}|]
+\NC foo.bar \NC foo.bar \NC \NR
+\NC oo.ba \NC oo.ba \NC \NR
+\NC o.b \NC o.b \NC \NR
+\stoptabulate
+\stopbuffer
+
+\typebuffer[option=TEX] \getbuffer
+
+This feature will only be used in know situations and those seldom involve advanced
+typesetting. However, the following does work: \footnote {Should this be an option
+instead?}
+
+\startbuffer
+\starttabulate[|cG{d}|]
+\NC \smallcaps abcdefgh \NC \NR
+\NC xdy \NC \NR
+\NC \sl xdy \NC \NR
+\NC \tttf xdy \NC \NR
+\NC \tfd d \NC \NR
+\stoptabulate
+\stopbuffer
+
+\typebuffer[option=TEX] \getbuffer
+
+As always with such mechanisms, the question is \quotation {Where to stop?} But it
+makes for nice demos and as long as little code is needed it doesn't hurt.
+
+\stopsectionlevel
+
+\startsectionlevel[title=Pitfalls and tricks]
+
+The next example mixes bidirectional typesetting. It might look weird at first
+sight but the result conforms to what we discussed in previous paragraphs.
+
+\startbuffer
+\starttabulate[|lG{.}|lG{}|]
+\NC \righttoleft 1.1 \NC \righttoleft \setalignmentcharacter{.}1.1 \NC\NR
+\NC 1.1 \NC \setalignmentcharacter{.}1.1 \NC\NR
+\NC \righttoleft 1.11 \NC \righttoleft \setalignmentcharacter{.}1.11 \NC\NR
+\NC 1.11 \NC \setalignmentcharacter{.}1.11 \NC\NR
+\NC \righttoleft 1.111 \NC \righttoleft \setalignmentcharacter{.}1.111 \NC\NR
+\NC 1.111 \NC \setalignmentcharacter{.}1.111 \NC\NR
+\stoptabulate
+\stopbuffer
+
+{\switchtobodyfont[8pt] \typebuffer[option=TEX]} \getbuffer
+
+In case of doubt, look at this:
+
+\startbuffer
+\starttabulate[|lG{.}|lG{}|lG{.}|lG{}|]
+\NC \righttoleft 1.1 \NC \righttoleft \setalignmentcharacter{.}1.1 \NC
+ 1.1 \NC \setalignmentcharacter{.}1.1 \NC\NR
+\NC \righttoleft 1.11 \NC \righttoleft \setalignmentcharacter{.}1.11 \NC
+ 1.11 \NC \setalignmentcharacter{.}1.11 \NC\NR
+\NC \righttoleft 1.111 \NC \righttoleft \setalignmentcharacter{.}1.111 \NC
+ 1.111 \NC \setalignmentcharacter{.}1.111 \NC\NR
+\stoptabulate
+\stopbuffer
+
+{\switchtobodyfont[8pt] \typebuffer[option=TEX]} \getbuffer
+
+The next example shows the effect of \type {\omit} and \type {\span}. The first one
+makes that in this cell the preamble template is ignored.
+
+\startbuffer
+\halign \bgroup
+ \tabsize 2cm\relax [\alignmark]\hss \aligntab
+ \tabsize 2cm\relax \hss[\alignmark]\hss \aligntab
+ \tabsize 2cm\relax \hss[\alignmark]\cr
+ 1\aligntab 2\aligntab 3\cr
+ \omit 1\aligntab \omit 2\aligntab \omit 3\cr
+ 1\aligntab 2\span 3\cr
+ 1\span 2\aligntab 3\cr
+ 1\span 2\span 3\cr
+ 1\span \omit 2\span \omit 3\cr
+ \omit 1\span \omit 2\span \omit 3\cr
+\egroup
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+Spans are applied at the end so you see a mix of templates applied.
+
+{\showboxes\getbuffer[blownup-2]}
+
+When you define an alignment inside a macro, you need to duplicate the \type {\alignmark}
+signals. This is similar to embedded macro definitions. But in \LUAMETATEX\ we can get
+around that by using \type {\aligncontent}. Keep in mind that when the preamble is scanned there
+is no doesn't expand with the exception of the token after \type {\span}.
+
+\startbuffer
+\halign \bgroup
+ \tabsize 2cm\relax \aligncontent\hss \aligntab
+ \tabsize 2cm\relax \hss\aligncontent\hss \aligntab
+ \tabsize 2cm\relax \hss\aligncontent\cr
+ 1\aligntab 2\aligntab 3\cr
+ A\aligntab B\aligntab C\cr
+\egroup
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+\blank\getbuffer\blank
+
+In this example we still have to be verbose in the way we align but we can do this:
+
+\startbuffer
+\halign \bgroup
+ \tabsize 2cm\relax \aligncontentleft \aligntab
+ \tabsize 2cm\relax \aligncontentmiddle\aligntab
+ \tabsize 2cm\relax \aligncontentright \cr
+ 1\aligntab 2\aligntab 3\cr
+ A\aligntab B\aligntab C\cr
+\egroup
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+Where the helpers are defined as:
+
+\starttyping[option=TEX]
+\noaligned\protected\def\aligncontentleft
+ {\ignorespaces\aligncontent\unskip\hss}
+
+\noaligned\protected\def\aligncontentmiddle
+ {\hss\ignorespaces\aligncontent\unskip\hss}
+
+\noaligned\protected\def\aligncontentright
+ {\hss\ignorespaces\aligncontent\unskip}
+\stoptyping
+
+The preamble scanner see such macros as candidates for a single level expansion
+so it will inject the meaning and see the \type {\aligncontent} eventually.
+
+\blank\getbuffer\blank
+
+The same effect could be achieved by using the \type {\span} prefix:
+
+\starttyping[option=TEX]
+\def\aligncontentleft{\ignorespaces\aligncontent\unskip\hss}
+
+\halign { ... \span\aligncontentleft ...}
+\stoptyping
+
+One of the reasons for not directly using the low level \type {\halign} command is
+that it's a lot of work but by providing a set of helpers like here might change
+that a bit. Keep in mind that much of the above is not new in the sense that we
+could not achieve the same already, it's just a bit programmer friendly.
+
+\stopsectionlevel
+
+\startsectionlevel[title=Rows]
+
+Alignment support is what the documented source calls \quote {interwoven}. When
+the engine scans for input it processing text, math or alignment content. While
+doing alignments it collects rows, and inside these cells but also deals with
+material that ends up in between. In \LUAMETATEX\ I tried to isolate the bits and
+pieces as good as possible but it remains \ complicated (for all good reasons).
+Cells as well as rows are finalized after the whole alignment has been collected
+and processed. In the end cells and rows are boxes but till we're done they are
+in an \quote {unset} state.
+
+Scanning starts with interpreting the preamble, and then grabbing rows. There is
+some nasty lookahead involved for \type {\noalign}, \type {\span}, \type {\omit},
+\type {\cr} and \type {\crcr} and that is not code one wants to tweak too much
+(although we did in \LUAMETATEX). This means for instance that adding \quote
+{let's start a row here} primitive is sort of tricky (but it might happen some
+day) which in turn means that it is not really possible to set row properties. As
+an experiment we can set some properties now by hijacking \type {\noalign} and
+storing them on the alignment stack (indeed: at the cost of some extra overhead
+and memory). This permits the following:
+
+% \theorientation{down} "002
+
+\startbuffer
+\halign {
+ \hss
+ \ignorespaces \alignmark \removeunwantedspaces
+ \hss
+ \quad \aligntab \quad
+ \hss
+ \ignorespaces \alignmark \removeunwantedspaces
+ \hss
+ \cr
+ \noalign xoffset 40pt {}
+ {\darkred cell one} \aligntab {\darkgray cell one} \cr
+ \noalign orientation "002 {}
+ {\darkgreen cell one} \aligntab {\darkblue cell one} \cr
+ \noalign xoffset 40pt {}
+ {\darkred cell two} \aligntab {\darkgray cell two} \cr
+ \noalign orientation "002 {}
+ {\darkgreen cell two} \aligntab {\darkblue cell two} \cr
+ \noalign xoffset 40pt {}
+ {\darkred cell three} \aligntab {\darkgray cell three} \cr
+ \noalign orientation "002 {}
+ {\darkgreen cell three} \aligntab {\darkblue cell three} \cr
+ \noalign xoffset 40pt {}
+ {\darkred cell four} \aligntab {\darkgray cell four} \cr
+ \noalign orientation "002 {}
+ {\darkgreen cell four} \aligntab {\darkblue cell four} \cr
+}
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+\startlinecorrection
+\showmakeup[line]
+\ruledvbox{\getbuffer}
+\stoplinecorrection
+
+The supported keywords are similar to those for boxes: \type {source}, \type
+{target}, \type {anchor}, \type {orientation}, \type {shift}, \type {xoffset},
+\type {yoffset}, \type {xmove} and \type {ymove}. The dimensions can be prefixed
+by \type {add} and \type {reset} wipes all. Here is another example:
+
+\startbuffer
+\halign {
+ \hss
+ \ignorespaces \alignmark \removeunwantedspaces
+ \hss
+ \quad \aligntab \quad
+ \hss
+ \ignorespaces \alignmark \removeunwantedspaces
+ \hss
+ \cr
+ \noalign xmove 40pt {}
+ {\darkred cell one} \aligntab {\darkgray cell one} \cr
+ {\darkgreen cell one} \aligntab {\darkblue cell one} \cr
+ \noalign xmove 20pt {}
+ {\darkred cell two} \aligntab {\darkgray cell two} \cr
+ {\darkgreen cell two} \aligntab {\darkblue cell two} \cr
+ \noalign xmove 40pt {}
+ {\darkred cell three} \aligntab {\darkgray cell three} \cr
+ {\darkgreen cell three} \aligntab {\darkblue cell three} \cr
+ \noalign xmove 20pt {}
+ {\darkred cell four} \aligntab {\darkgray cell four} \cr
+ {\darkgreen cell four} \aligntab {\darkblue cell four} \cr
+}
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+\startlinecorrection
+\showmakeup[line]
+\ruledvbox{\getbuffer}
+\stoplinecorrection
+
+Some more features might be added in the future as is it an interesting
+playground. It is to be seen how this ends up in \CONTEXT\ high level interfaces
+like tabulate.
+
+\stopsectionlevel
+
+\startsectionlevel[title=Remark]
+
+It can be that the way alignments are interfaced with respect to attributes is a bit
+different between \LUATEX\ and \LUAMETATEX\ but because the former is frozen (in
+order not to interfere with current usage patterns) this is something that we will
+deal with deep down in \CONTEXT\ \LMTX.
+
+In principle we can have hooks into the rows for pre and post material but it
+doesn't really pay of as grouping will still interfere. So for now I decided not
+to add these.
+
+\stopsectionlevel
+
+\stopdocument
+
+% \hbox \bgroup
+% \vbox \bgroup \halign \bgroup
+% \hss\aligncontent\hss\aligntab
+% \hss\aligncontent\hss\cr
+% aaaa\aligntab bbbb\cr
+% aaa\aligntab bbb\cr
+% aa\aligntab bb\cr
+% a\aligntab b\cr
+% \omit\span \hss ccc\hss\cr
+% \egroup \egroup
+% \quad
+% \vbox \bgroup \halign noskips \bgroup
+% \hss\aligncontent\hss\aligntab
+% \hss\aligncontent\hss\cr
+% aaaa\aligntab bbbb\cr
+% aaa\aligntab bbb\cr
+% aa\aligntab bb\cr
+% a\aligntab b\cr
+% \omit\span \hss ccc\hss\cr
+% \egroup \egroup
+% \egroup
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
index 9a097b8780c..e2e34bd20a8 100644
--- 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
@@ -1,4 +1,4 @@
-% language=us
+% language=us runpath=texruns:manuals/lowlevel
% \hfil \hss
% spread
@@ -9,7 +9,7 @@
[title=boxes,
color=middlered]
-\startsection[title=Introduction]
+\startsectionlevel[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
@@ -23,9 +23,9 @@ 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).
-\stopsection
+\stopsectionlevel
-\startsection[title=Boxes]
+\startsectionlevel[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
@@ -66,11 +66,9 @@ 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.
-\stopsection
+\stopsectionlevel
-\stopsection
-
-\startsection[title={\TEX\ primitives}]
+\startsectionlevel[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
@@ -143,7 +141,28 @@ available space. So, here we force the text to the right or left.
{\dontcomplain\showboxes\getbuffer}
\stoplinecorrection
-We have three kind of boxes: \type {\hbox}, \type {\vbox} and \type {\vtop}:
+Instead of \type {\raise} you can also provide the shift (up or down) with a
+keyword:
+
+\startbuffer
+\ruledhbox\bgroup
+ x\raise 5pt\ruledhbox {1}x
+ x\raise-10pt\ruledhbox {2}x
+ x\raise -5pt\ruledhbox shift -20pt{3}x
+ x\ruledhbox shift -10pt{4}x
+\egroup
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+\startlinecorrection
+{\dontcomplain\showboxes\getbuffer}
+\stoplinecorrection
+
+
+We have three kind of boxes: \type {\hbox}, \type {\vbox} and \type {\vtop}.
+Actually we have a fourth type \type {\dbox} but that is a variant on \type
+{\vbox} to which we come back later.
\startbuffer
\hbox{\strut height and depth\strut}
@@ -218,9 +237,9 @@ we use copy because it serves the examples.
\box \scratchbox
\stoptyping
-\stopsection
+\stopsectionlevel
-\startsection[title={\ETEX\ primitives}]
+\startsectionlevel[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
@@ -229,9 +248,9 @@ 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
+\stopsectionlevel
-\startsection[title={\LUATEX\ primitives}]
+\startsectionlevel[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:
@@ -289,9 +308,9 @@ but because in \LUAMETATEX\ there are only two. Because this model has been upgr
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
+\stopsectionlevel
-\startsection[title={\LUAMETATEX\ primitives}]
+\startsectionlevel[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
@@ -691,6 +710,202 @@ test\quad
\ruledhbox{\getbuffer}
\stoplinecorrection
-\stopsection
+Where a \type {\vtop} has the baseline at the top, a \type {\vbox} has it at the
+bottom. In \LUAMETATEX\ we also have a \type {\dbox}, which is a \type {\vbox} with
+that behaves like a \type {\vtop} when it's appended to a vertical list: the height of
+the first box or rule determines the (base)line correction that gets applied. The following
+example demonstrates this:
+
+\startlinecorrection
+\startcombination [nx=3,ny=1,location=top]
+ {\vbox \bgroup \hsize .3\textwidth
+ \small\small \setupalign[tolerant,stretch] \dontcomplain
+ xxxxxxxxxxxxxxxx\par
+ \ruledvbox{\samplefile{tufte}}\par
+ xxxxxxxxxxxxxxxx\par
+ \egroup} {\type {\vbox}}
+ {\vbox \bgroup \hsize .3\textwidth
+ \small\small \setupalign[tolerant,stretch] \dontcomplain
+ xxxxxxxxxxxxxxxx\par
+ \ruledvtop{\samplefile{tufte}}\par
+ xxxxxxxxxxxxxxxx\par
+ \egroup} {\type {\vtop}}
+ {\vbox \bgroup \hsize .3\textwidth
+ \small\small \setupalign[tolerant,stretch] \dontcomplain
+ xxxxxxxxxxxxxxxx\par
+ \ruleddbox{\samplefile{tufte} }\par
+ xxxxxxxxxxxxxxxx\par
+ \egroup} {\type {\dbox}}
+\stopcombination
+\stoplinecorrection
+
+The \type {d} stands for \quote {dual} because we (sort of) have two baselines. The
+regular height and depth are those of a \type {\vbox}.
+
+\stopsectionlevel
+
+\startsectionlevel[title=Splitting]
+
+When you feed \TEX\ a paragraph of text it will accumulate the content in a
+list of nodes. When the paragraphs is finished by \type {\par} or an empty line
+it will be fed into the par builder that will try to break the lines as good
+as possible. Normally that paragraph will be added to the page and at some point
+there can be breaks between lines in order not to overflow the page. When you
+collect the paragraph in a box you can use \type {\vsplit} to emulate this.
+
+\startbuffer[sample]
+\setbox\scratchbox\vbox{\samplefile{tufte}}
+
+\startlinecorrection
+\ruledhbox{\vsplit\scratchbox to 2\lineheight}
+\stoplinecorrection
+\stopbuffer
+
+\typebuffer[sample][option=TEX] \getbuffer[sample]
+
+The split off box is given the specified height, but in \LUAMETATEX\ you can also
+get the natural dimensions:
+
+\startbuffer[sample]
+\setbox\scratchbox\vbox{\samplefile{tufte}}
+
+\startlinecorrection
+\ruledhbox{\vsplit\scratchbox upto 2\lineheight}
+\stoplinecorrection
+\stopbuffer
+
+\typebuffer[sample][option=TEX] \getbuffer[sample]
+
+We can force a resulting box type by using \type {\vsplit}, \type {\tsplit} and
+\type {\dsplit} (here we use the visualized variants):
+
+\startbuffer[sample]
+\setbox\scratchbox\vbox{\samplefile{tufte}}
+
+\startlinecorrection
+\ruledtsplit \scratchbox upto 2\lineheight
+\stoplinecorrection
+\stopbuffer
+
+\typebuffer[sample][option=TEX] \getbuffer[sample]
+
+\startbuffer[sample]
+\setbox\scratchbox\vbox{\samplefile{tufte}}
+
+\startlinecorrection
+\ruledvsplit \scratchbox upto 2\lineheight
+\stoplinecorrection
+\stopbuffer
+
+\typebuffer[sample][option=TEX] \getbuffer[sample]
+
+\startbuffer[sample]
+\setbox\scratchbox\vbox{\samplefile{tufte}}
+
+\startlinecorrection
+\ruleddsplit \scratchbox upto 2\lineheight
+\stoplinecorrection
+\stopbuffer
+
+\typebuffer[sample][option=TEX] \getbuffer[sample]
+
+The engine provides vertical splitters but \CONTEXT\ itself also has
+a horizontal one. \footnote {At some point I might turn that one into
+a native engine primitive.}
+
+\startbuffer
+\starttexdefinition Test #1#2#3
+ \par
+ \dontleavehmode
+ \strut
+ \llap{{\infofont #2}\quad}
+ \blackrule[width=#2,color=darkblue]
+ \par
+ \setbox\scratchbox\hbox{\samplefile{#1}}
+ \hsplit\scratchbox
+ to #2
+ depth \strutdp
+ height \strutht
+ shrinkcriterium #3 % badness
+ \par
+\stoptexdefinition
+
+\dostepwiserecurse {100} {120} {2} {
+ \Test{tufte}{#1mm}{1000}
+ \Test{tufte}{#1mm}{-100}
+}
+\stopbuffer
+
+\typebuffer[option=TEX] \startpacked \getbuffer \stoppacked
+
+A split off box gets packed at its natural size and a badness as well as
+overshoot amount is calculated. When the overshoot is positive and the the
+badness is larger than the stretch criterium, the box gets repacked to the
+natural size. The same happens when the overshoot is negative and the badness
+exceeds the shrink criterium. When the overshoot is zero (basically we have a
+fit) but the badness still exceeds the stretch or shrink we also repack. Indeed
+this is a bit fuzzy, but so is badness.
+
+\startbuffer
+\starttexdefinition Test #1#2#3
+ \par
+ \dontleavehmode
+ \strut
+ \llap{{\infofont #2}\quad}
+ \blackrule[width=#2,color=darkblue]
+ \par
+ \setbox\scratchbox\hbox{\samplefile{#1}}
+ \doloop {
+ \ifvoid\scratchbox
+ \exitloop
+ \else
+ \hsplit\scratchbox
+ to #2
+ depth \strutdp
+ height \strutht
+ #3
+ \par
+ \allowbreak
+ \fi
+ }
+\stoptexdefinition
+
+\Test{tufte}{100mm}{shrinkcriterium 1000}
+\Test{tufte}{100mm}{shrinkcriterium 0}
+\Test{tufte}{100mm}{}
+\stopbuffer
+
+\typebuffer[option=TEX] \getbuffer
+
+Watch how the last line get stretched when we set the criterium to zero. I'm sure
+that users will find reasons to abuse this effect.
+
+\stopsectionlevel
\stopdocument
+
+% todo:
+
+% \setbox0\hbox{\strut this is just a\footnote{oeps} test}
+% \setbox2\hbox{\strut this is just a\footnote{oeps} test}
+%
+% \setprelistbox 0\hbox{\strut \quad before: \prelistbox0}
+% \setpostlistbox0\hbox{\strut \quad after: \postlistbox0}
+%
+% \setprelistbox 2\hbox{\strut \quad before}
+% \setpostlistbox2\hbox{\strut \quad after}
+%
+% test \par \box0 \par \box2 \par test
+
+
+\setbox0\vbox
+{
+ \setbox \scratchbox \hbox{XXX}
+ \boxvadjust\scratchbox pre {BBB}
+ \boxvadjust\scratchbox post {AAA}
+% \dontleavehmode % needed
+ \box\scratchbox
+% \unhbox\scratchbox
+}
+
+111111\par \box0 \par 222222\par
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/lowlevel/lowlevel-characters.tex b/Master/texmf-dist/doc/context/sources/general/manuals/lowlevel/lowlevel-characters.tex
index ee3ab404442..777182b844d 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/lowlevel/lowlevel-characters.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/lowlevel/lowlevel-characters.tex
@@ -1,4 +1,4 @@
-% language=us
+% language=us runpath=texruns:manuals/lowlevel
\environment lowlevel-style
@@ -6,15 +6,15 @@
[title=characters,
color=middlered]
-\startsection[title=Introduction]
+\startsectionlevel[title=Introduction]
This explanation is part of the low level manuals because in practice users will
not have to deal with these matters in \MKIV\ and even less in \LMTX. You can
skip to the last section for commands.
-\stopsection
+\stopsectionlevel
-\startsection[title=History]
+\startsectionlevel[title=History]
If we travel back in time to when \TEX\ was written we end up in eight bit
character universe. In fact, the first versions assumed seven bits, but for
@@ -79,9 +79,9 @@ depending on the (local) language, referencing the relevant font. It permits
users to enter the text in their preferred input encoding and also get the words
properly hyphenated. But we can leave these \MKII\ details behind.
-\stopsection
+\stopsectionlevel
-\startsection[title=The heritage]
+\startsectionlevel[title=The heritage]
In \MKIV\ we got rid of input and font encodings, although one can still load
files in a specific code page. \footnote {I'm not sure if users ever depend on an
@@ -112,9 +112,9 @@ format file. \footnote {In \MKII\ we have an abstract front|-|end with respect t
encodings and also an abstract backend with respect to supported drivers but both
approaches no longer make sense today.}
-\stopsection
+\stopsectionlevel
-\startsection[title=The \LMTX\ approach]
+\startsectionlevel[title=The \LMTX\ approach]
In the process of tagging all (public) macros in \LMTX\ (which happened in
2020|-|2021) I wondered if we should keep these one character macros, the
@@ -220,19 +220,7 @@ We get this list:
Some combinations are special for \CONTEXT\ because \UNICODE\ doesn't specify
decomposition for all composed characters.
-\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
+\stopsectionlevel
\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
index 9be2fb4ec6f..288521bdd36 100644
--- 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
@@ -1,4 +1,4 @@
-% language=us
+% language=us runpath=texruns:manuals/lowlevel
\environment lowlevel-style
@@ -8,9 +8,9 @@
\pushoverloadmode
-\startsection[title=Preamble]
+\startsectionlevel[title=Preamble]
-\startsubsection[title=Introduction]
+\startsectionlevel[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
@@ -53,9 +53,9 @@ 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
+\stopsectionlevel
-\startsubsection[title={Number and dimensions}]
+\startsectionlevel[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:
@@ -289,13 +289,13 @@ assuming that the fraction is within the maximum permitted) so these numbers the
are the same. Anyway, this is not different in other programming languages and
just something you need to be aware of.
-\stopsubsection
+\stopsectionlevel
-\stopsection
+\stopsectionlevel
-\startsection[title={\TEX\ primitives}]
+\startsectionlevel[title={\TEX\ primitives}]
-\startsubsection[title={\tex{if}}]
+\startsectionlevel[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
@@ -330,9 +330,9 @@ We get: \inlinebuffer .
% protected macros
-\stopsubsection
+\stopsectionlevel
-\startsubsection[title={\tex{ifcat}}]
+\startsectionlevel[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
@@ -377,9 +377,9 @@ You can use \type {\noexpand} to prevent expansion:
We get: \inlinebuffer, so who still thinks that \TEX\ is easy to understand for a
novice user?
-\stopsubsection
+\stopsectionlevel
-\startsubsection[title={\tex{ifnum}}]
+\startsectionlevel[title={\tex{ifnum}}]
This condition compares its argument with another one, separated by an \type {<},
\type {=} or \type {>} character.
@@ -410,9 +410,9 @@ case the dimension is in scaled points.
Of course this equal treatment of a dimension and number is only true when the
dimension is a register or box property.
-\stopsubsection
+\stopsectionlevel
-\startsection[title={\tex{ifdim}}]
+\startsectionlevel[title={\tex{ifdim}}]
This condition compares one dimension with another one, separated by an \type {<},
\type {=} or \type {>} sign.
@@ -430,9 +430,9 @@ This condition compares one dimension with another one, separated by an \type {<
While when comparing numbers a dimension is a valid quantity but here you cannot
mix them: something with a unit is expected.
-\stopsubsection
+\stopsectionlevel
-\startsubsection[title={\tex{ifodd}}]
+\startsectionlevel[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.
@@ -454,9 +454,9 @@ too, which is then interpreted as representing scaled points. Here we get:
\getbuffer
\stoplines
-\stopsubsection
+\stopsectionlevel
-\startsubsection[title={\tex{ifvmode}}]
+\startsectionlevel[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:
@@ -470,9 +470,9 @@ in vertical mode. Here is an example:
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
+\stopsectionlevel
-\startsubsection[title={\tex{ifhmode}}]
+\startsectionlevel[title={\tex{ifhmode}}]
As with \type {\ifvmode} this one has no argument and just tells if we're in
vertical mode.
@@ -494,9 +494,9 @@ content (or command) is done more than once:
\ruledhbox{\inlinebuffer}
\stoplinecorrection
-\stopsubsection
+\stopsectionlevel
-\startsubsection[title={\tex{ifmmode}}]
+\startsectionlevel[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:
@@ -507,9 +507,9 @@ here is an example of using this test:
Of course in reality macros that do such things are more advanced than this one.
-\stopsubsection
+\stopsectionlevel
-\startsubsection[title={\tex{ifinner}}]
+\startsectionlevel[title={\tex{ifinner}}]
\startbuffer
\def\ShowMode
@@ -549,9 +549,9 @@ 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
+\stopsectionlevel
-\startsubsection[title={\tex{ifvoid}}]
+\startsectionlevel[title={\tex{ifvoid}}]
A box is one of the basic concepts in \TEX. In order to understand this primitive
we present four cases:
@@ -601,15 +601,15 @@ Setting a dimension of a void voix (empty) box doesn't make it less void:
\getbuffer
\stoplines
-\stopsubsection
+\stopsectionlevel
-\startsubsection[title={\tex{ifhbox}}]
+\startsectionlevel[title={\tex{ifhbox}}]
This test takes a box number and gives true when it is an hbox.
-\stopsubsection
+\stopsectionlevel
-\startsubsection[title={\tex{ifvbox}}]
+\startsectionlevel[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
@@ -627,9 +627,9 @@ And in a \type {\vtop} the first line takes control:
but, once wrapped, both internally are just vlists.
-\stopsubsection
+\stopsectionlevel
-\startsubsection[title={\tex{ifx}}]
+\startsectionlevel[title={\tex{ifx}}]
This test is actually used a lot in \CONTEXT: it compares two token(list)s:
@@ -651,29 +651,29 @@ that get compared, like in:
\edef\TempA{...}\edef\TempB{...}\ifx\TempA\TempB ...\else ...\fi
\stoptyping
-\stopsubsection
+\stopsectionlevel
-\startsubsection[title={\tex{ifeof}}]
+\startsectionlevel[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
+\stopsectionlevel
-\startsubsection[title={\tex{iftrue}}]
+\startsectionlevel[title={\tex{iftrue}}]
It does what it says: always true.
-\stopsubsection
+\stopsectionlevel
-\startsubsection[title={\tex{iffalse}}]
+\startsectionlevel[title={\tex{iffalse}}]
It does what it says: always false.
-\stopsubsection
+\stopsectionlevel
-\startsubsection[title={\tex{ifcase}}]
+\startsectionlevel[title={\tex{ifcase}}]
The general layout of an \type {\ifcase} tests is as follows:
@@ -693,13 +693,13 @@ The general layout of an \type {\ifcase} tests is as follows:
As in other places a number is a sequence of signs followed by one of more digits
-\stopsubsection
+\stopsectionlevel
-\stopsection
+\stopsectionlevel
-\startsection[title={\ETEX\ primitives}]
+\startsectionlevel[title={\ETEX\ primitives}]
-\startsubsection[title={\tex{ifdefined}}]
+\startsectionlevel[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
@@ -736,9 +736,9 @@ In order to catch the last problem there is the option to test directly:
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
+\stopsectionlevel
-\startsubsection[title={\tex{ifcsname}}]
+\startsectionlevel[title={\tex{ifcsname}}]
A macro is often defined using a ready made name, as in:
@@ -795,9 +795,9 @@ 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
+\stopsectionlevel
-\startsubsection[title={\tex{iffontchar}}]
+\startsectionlevel[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.
@@ -824,9 +824,9 @@ 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
+\stopsectionlevel
-\startsubsection[title={\tex{unless}}]
+\startsectionlevel[title={\tex{unless}}]
You can negate the results of a test by using the \type {\unless} prefix, so for
instance you can replace:
@@ -847,41 +847,41 @@ by:
\fi
\stoptyping
-\stopsubsection
+\stopsectionlevel
-\stopsection
+\stopsectionlevel
-\startsection[title={\LUATEX\ primitives}]
+\startsectionlevel[title={\LUATEX\ primitives}]
-\startsubsection[title={\tex{ifincsname}}]
+\startsectionlevel[title={\tex{ifincsname}}]
As it had no real practical usage uit might get dropped in \LUAMETATEX, so it
will not be discussed here.
-\stopsubsection
+\stopsectionlevel
-\startsubsection[title={\tex{ifprimitive}}]
+\startsectionlevel[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
+\stopsectionlevel
-\startsubsection[title={\tex{ifabsnum}}]
+\startsectionlevel[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
+\stopsectionlevel
-\startsubsection[title={\tex{ifabsdim}}]
+\startsectionlevel[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
+\stopsectionlevel
-\startsubsection[title={\tex{ifcondition}}]
+\startsectionlevel[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.
@@ -1061,13 +1061,13 @@ permits more complex arguments, like:
Another trick is that we use an integer division (the \type {:}) which is an
operator supported by \LUAMETATEX .
-\stopsubsection
+\stopsectionlevel
-\stopsection
+\stopsectionlevel
-\startsection[title={\LUAMETATEX\ primitives}]
+\startsectionlevel[title={\LUAMETATEX\ primitives}]
-\startsubsection[title={\tex{ifcmpnum}}]
+\startsectionlevel[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:
@@ -1080,9 +1080,9 @@ 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
+\stopsectionlevel
-\startsubsection[title={\tex{ifchknum}}]
+\startsectionlevel[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:
@@ -1097,9 +1097,9 @@ 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
+\stopsectionlevel
-\startsubsection[title={\tex{ifnumval}}]
+\startsectionlevel[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:
@@ -1113,29 +1113,29 @@ 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
+\stopsectionlevel
-\startsubsection[title={\tex{ifcmpdim}}]
+\startsectionlevel[title={\tex{ifcmpdim}}]
This test is like \type {\ifcmpnum} but for dimensions.
-\stopsubsection
+\stopsectionlevel
-\startsubsection[title={\tex{ifchkdim}}]
+\startsectionlevel[title={\tex{ifchkdim}}]
This test is like \type {\ifchknum} but for dimensions. The last checked value is
available as \type {\lastchknum}.
-\stopsubsection
+\stopsectionlevel
-\startsubsection[title={\tex{ifdimval}}]
+\startsectionlevel[title={\tex{ifdimval}}]
This test is like \type {\ifnumval} but for dimensions. The last checked value is
available as \type {\lastchkdim}
-\stopsubsection
+\stopsectionlevel
-\startsubsection[title={\tex{iftok}}]
+\startsectionlevel[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
@@ -1195,49 +1195,49 @@ Case one and four mixed:
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
+\stopsectionlevel
-\startsubsection[title={\tex{ifcstok}}]
+\startsectionlevel[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
+\stopsectionlevel
-\startsubsection[title={\tex{iffrozen}}]
+\startsectionlevel[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
+\stopsectionlevel
-\startsubsection[title={\tex{ifprotected}}]
+\startsectionlevel[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
+\stopsectionlevel
-\startsubsection[title={\tex{ifusercmd}}]
+\startsectionlevel[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
+\stopsectionlevel
-\startsubsection[title={\tex{ifarguments}}]
+\startsectionlevel[title={\tex{ifarguments}}]
This conditional can be used to check how many arguments were matched. It only
makes sense when used with macros defined with the \type {\tolerant} prefix
and|/|or when the sentinel \type {\ignorearguments} after the arguments is used.
More details can be found in the lowlevel macros manual.
-\stopsubsection
+\stopsectionlevel
-\startsubsection[title={\tex{orelse}}]
+\startsectionlevel[title={\tex{orelse}}]
This it not really a test primitive but it does act that way. Say that we have this:
@@ -1297,13 +1297,13 @@ This permits:
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
+\stopsectionlevel
-\stopsection
+\stopsectionlevel
-\startsection[title={For the brave}]
+\startsectionlevel[title={For the brave}]
-\startsubsection[title={Full expansion}]
+\startsectionlevel[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
@@ -1361,9 +1361,9 @@ 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
+\stopsectionlevel
-\startsubsection[title={User defined if's}]
+\startsectionlevel[title={User defined if's}]
There is a \type {\newif} macro that defines three other macros:
@@ -1411,11 +1411,11 @@ 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
+\stopsectionlevel
-\stopsection
+\stopsectionlevel
-\startsection[title=Relaxing]
+\startsectionlevel[title=Relaxing]
When \TEX\ scans for a number or dimension it has to check tokens one by one. On
the case of a number, the scanning stops when there is no digit, in the case of a
@@ -1532,19 +1532,7 @@ it acts as relax, but otherwise it just is ignored and disappears.
\typebuffer[c] \getbuffer[c,b]
-\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
+\stopsectionlevel
\popoverloadmode
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
index 15faa802dc4..6e913491411 100644
--- 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
@@ -1,4 +1,9 @@
-% language=us
+% language=us runpath=texruns:manuals/lowlevel
+
+% This is work in progress and after an initial draft got extended because of the
+% 2021 meeting. It will hopefully improve over time.
+
+\usemodule[system-tokens]
\environment lowlevel-style
@@ -6,24 +11,26 @@
[title=expansion,
color=middleyellow]
-\startsection[title=Preamble]
-
-% \startsubsection[title=Introduction]
-% \stopsubsection
+\startsectionlevel[title=Preamble]
This short manual demonstrates a couple of properties of the macro language. It
-is not the in|-|depth philosophical expose about macro languages, tokens,
+is not an in|-|depth philosophical expose about macro languages, tokens,
expansion and such that some \TEX ies like. I prefer to stick to the practical
-aspects.
+aspects. Occasionally it will be technical but you can just skip those paragraphs
+(or later return to them) when you can't follow the explanation. It's often not
+that relevant. I won't talk in terms of mouth, stomach and gut the way the \TEX
+book does and although there is no way to avoid the word \quote {token} I will do
+my best to not complicate matters by too much token speak. Examples show best
+what we mean.
-\stopsection
+\stopsectionlevel
-\startsection[title={\TEX\ primitives}]
+\startsectionlevel[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.
+list of primitives and|/|or macro calls. All can be mixed with characters that
+are to be typeset somehow.
\starttyping[option=TEX]
\def\MyMacro{b}
@@ -38,8 +45,79 @@ 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.
+Before we move on to more examples and differences between engines, it is good to
+stress that \type {\MyMacro} is not a primitive command: we made our command
+here. The \type {b} actually can be seen as a sort of primitive because in this
+macro it gets stored as so called token with a primitive property. That primitive
+property can later on be used to determine what to do. More explicit examples of
+primitives are \type {\hbox}, \type {\advance} and \type {\relax}. It will be
+clear that \CONTEXT\ extends the repertoire of primitive commands with a lot of
+macro commands. When we typeset a source using module \type {m-scite} the
+primitives come out dark blue.
+
+The amount of primitives differs per engine. It all starts with \TEX\ as written
+by Don Knuth. Later \ETEX\ added some more primitives and these became official
+extensions adopted by other variants of \TEX. The \PDFTEX\ engine added quite
+some and as follow up on that \LUATEX\ added more but didn't add all of \PDFTEX.
+A few new primitives came from \OMEGA\ (\ALEPH). The \LUAMETATEX\ engine drops a
+set of primitives that comes with \LUATEX\ and adds plenty new ones. The nature
+of this engine (no backend and less frontend) makes that we need to implement
+some primitives as macros. But the basic set is what good old \TEX\ comes with.
+
+Internally these so called primitives are grouped in categories that relate to
+their nature. They can be directly expanded (a way of saying that they get
+immediately interpreted) or delayed (maybe stored for later usage). They can
+involve definitions, calculations, setting properties and values or they can
+result in some typesetting. This is what makes \TEX\ confusing to new users: it
+is a macro programming language, an interpreter but at the same time an executor
+of typesetting instructions.
+
+A group of primitives is internally identified as a command (they have a \type
+{cmd} code) and the sub commands are flagged by their \type {chr} code. This
+sounds confusing but just thing of the fact that most of what we input are
+characters and therefore they make up most sub commands. For instance the \quote
+{letter \type {cmd}} is used for characters that are seen as letters that can be
+used in the name of user commands, can be typeset, are valid for hyphenation
+etc.\ The letter related \type {cmd} can have many \type {chr} codes (all of
+\UNICODE). I'd like to remark that the grouping is to a large extend functional,
+so sometimes primitives that you expect to be similar in nature are in different
+groups. This has to do with the fact that \TEX\ needs to be a able to determine
+efficiently if a primitive is operating (or forbidden) in horizontal, vertical
+and|/|or math mode.
+
+There are more than 150 internal \type {cmd} groups. if we forget about the
+mentioned character related ones, some, have only a few sub commands (\type
+{chr}) and others many more (just consider all the \OPENTYPE\ math spacing
+related parameters). A handful of these commands deal with what we call macros:
+user defined combinations of primitives and other macros, consider them little
+programs. The \type {\MyMacro} example above is an example. There are differences
+between engines. In standard \TEX\ there are \type {\outer} and \type {\long}
+commands, and most engines have these. However, in \LUAMETATEX\ the later to be
+discussed \type {\protected} macros have their own specific \quote {call \type
+{cmd}}. Users don't need to bother about this.
+
+So, when from now on we talk about primitives, we mean the built in, hard coded
+commands, and when we talk about macros we mean user commands. Although
+internally there are less \type {cmd} categories than primitives, from the
+perspective of the user they are all unique. Users won't consult the source
+anyway but when they do they are warned. Also, when in \LUAMETATEX\ you use the
+low level interfacing to \TEX\ you have to figure out these subtle aspects
+because there this grouping does matter.
+
+Before we continue I want to make clear that expansion (as discussed in this
+document) can refer to a macro being expanded (read: its meaning gets injected
+into the input, so the engine kind of sidetracks from what is was doing) but also
+to direct consequences of running into a primitive. However, users only need to
+consider expansion in the perspective of macros. If a user has \type {\advance}
+in the input it immediately gets done. But when it's part of a macro definition
+it only is executed when the macro expands. A good check in (traditional) \TEX\
+is to compare what happens in \type {\def} and \type {\edef} which is why we will
+use these two in the upcoming examples. You put something in a macro and then
+check what \type {\meaning} or \type {\show} reports.
+
+Now back to user defined macros. A macro can contain references to macros so in
+practice the input can go several levels up and some applications push back a lot
+so this is why your \TEX\ input stack can be configured to be huge.
\starttyping[option=TEX]
\def\MyMacroA{ and }
@@ -49,11 +127,11 @@ 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
+character token \type {1} 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:
+with property \quote {other} The meaning of \type {\MyMacroA} is five tokens:
a reference to a space token, then three character tokens with property \quote
-{letter}, and finally again a space token.
+{letter}, and finally a space token.
\starttyping[option=TEX]
\def \MyMacroA{ and }
@@ -62,16 +140,16 @@ a reference to a space token, then three character tokens with property \quote
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
+In the second definition an \type {\edef} is used, where the \type {e} indicates
+expansion. This time the meaning gets expanded immediately. So we get effectively the same
+as in:
\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.
+Characters are easy: they just expand to themselves or trigger adding a glyph
+node, but not all primitives expand to their meaning or effect.
\startbuffer
\def\MyMacroA{\scratchcounter = 1 }
@@ -120,7 +198,7 @@ Let's assume that \type {\scratchcounter} is zero to start with and use \type
\meaning\MyMacroC
\stoplines
-So, this time the third macro has basically its meaning frozen, but we can
+So, this time the third macro has its meaning frozen, but we can
prevent this by applying a \type {\noexpand} when we do this:
\startbuffer
@@ -153,7 +231,7 @@ 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
+You can also store tokens in a so-called token register. Here we use a predefined
scratch register:
\startbuffer
@@ -196,12 +274,12 @@ Indeed the macro gets expanded but only one level: \MyShow. Compare this with:
\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
+The trick is to expand in two steps with an intermediate \type {\edef}: \MyShow. Later we will see that other
+engines provide some more expansion tricks. The only way to get some 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:
+The \type {\expandafter} primitive expands the token (which can be a macro) standing after
+the next next one and then injects its meaning into the stream. So:
\starttyping[option=TEX]
\expandafter \MyMacroA \MyMacroB
@@ -238,16 +316,17 @@ The first one gives \inlinebuffer[a], while the second gives \inlinebuffer[b].
% \afterassignment
% \aftergroup
-\stopsection
+\stopsectionlevel
-\startsection[title={\ETEX\ primitives}]
+\startsectionlevel[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.
+primitive. \footnote {In the meantime we no longer have a low level \type
+{\protected} macro so one can use the primitive}.
\startbuffer
\def\MyMacroA{a}
@@ -267,7 +346,7 @@ These macros have the following meanings:
\meaning\MyMacroABC
\stoplines
-In \CONTEXT\ you will use the \type {\unexpanded} prefix instead because that one
+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.
@@ -282,17 +361,17 @@ did something similar in older versions of \CONTEXT. As we were early adopters o
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
+either a lot of more complex \type {\expandafter} usage or the need to use 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,
+but it doesn't expand the first token as this 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.
+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:
@@ -321,7 +400,7 @@ close, with:
\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:
+\type {\string} applied to each token in its argument. Compare this to:
\startbuffer
\normalexpanded {
@@ -360,12 +439,12 @@ letters. The next snippet shows these catcodes:
The result is \quotation {\tt\inlinebuffer}: two characters are marked as \quote
{letter} and two fall in the \quote {other} category.
-\stopsection
+\stopsectionlevel
-\startsection[title={\LUATEX\ primitives}]
+\startsectionlevel[title={\LUATEX\ primitives}]
-This engine adds a little in the expansion arena. First of all it offers a way to
-extend token lists registers
+This engine adds a little to the expansion repertoire. First of all it offers a
+way to extend token lists registers:
\startbuffer
\def\MyMacroA{a}
@@ -400,79 +479,661 @@ 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
+These 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.
+too, but sometimes they're just more convenient to use. In \CONTEXT\ we actually
+do benefit from these.
+
+\stopsectionlevel
-A second extension is \type {\immediateassignment} which instead in tokenizing
-the assignment directive applies it right now.
+\startsectionlevel[title={\LUAMETATEX\ primitives}]
+
+We already saw that macro's can be defined protected which means that
\startbuffer
-\edef\MyMacroA
- {\scratchcounter 123
- \noexpand\the\scratchcounter}
+ \def\TestA{A}
+\protected \def\TestB{B}
+ \edef\TestC{\TestA\TestB}
+\stopbuffer
-\edef\MyMacroB
- {\immediateassignment\scratchcounter 123
- \noexpand\the\scratchcounter}
+\typebuffer[option=TEX] \getbuffer
+
+gives this:
+
+\startlines
+\type{\TestC} : {\tttf \meaningless\TestC}
+\stoplines
+
+One way to get \type {\TestB} expanded it to prefix it with \type {\expand}:
+
+\startbuffer
+ \def\TestA{A}
+\protected \def\TestB{B}
+ \edef\TestC{\TestA\TestB}
+ \edef\TestD{\TestA\expand\TestB}
\stopbuffer
-\typebuffer[option=TEX]
+\typebuffer[option=TEX] \getbuffer
-\getbuffer
+We now get:
-These two macros now have the meaning:
+\startlines
+\type{\TestC} : {\tttf \meaningless\TestC}
+\type{\TestD} : {\tttf \meaningless\TestD}
+\stoplines
-\startlines \tt
-\meaning\MyMacroA
-\meaning\MyMacroB
+There are however cases where one wishes this to happen automatically, but that
+will also make protected macros expand which will create havoc, like switching fonts.
+
+\startbuffer
+ \def\TestA{A}
+\protected \def\TestB{B}
+\semiprotected \def\TestC{C}
+ \edef\TestD{\TestA\TestB\TestC}
+ \edef\TestE{\normalexpanded{\TestA\TestB\TestC}}
+ \edef\TestF{\semiexpanded {\TestA\TestB\TestC}}
+\stopbuffer
+
+\typebuffer[option=TEX] \getbuffer
+
+This time \type {\TestC} looses its protection:
+
+\startlines
+\type{\TestA} : {\tttf \meaningless\TestA}
+\type{\TestB} : {\tttf \meaningless\TestB}
+\type{\TestC} : {\tttf \meaningless\TestC}
+\type{\TestD} : {\tttf \meaningless\TestD}
+\type{\TestE} : {\tttf \meaningless\TestE}
+\type{\TestF} : {\tttf \meaningless\TestF}
\stoplines
-\stopsection
+Actually adding \type {\fullyexpanded} would be trivial but it makes not much
+sense to add the overhead (at least not now). This feature is experimental
+anyway so it might go away when I see no real advantage from it.
+
+When you store something in a macro or token register you always need to keep an
+eye on category codes. A dollar in the input is normally treated as math shift, a
+hash indicates a macro parameter or preamble entry. Characters like \quote {A}
+are letters but \quote {[} and \quote {]} are tagged as \quote {other}. The \TEX\
+scanner acts according to these codes. If you ever find yourself in a situation
+that changing catcodes is no option or cumbersome, you can do this:
-\startsection[title={\LUAMETATEX\ primitives}]
+\starttyping[option=TEX]
+\edef\TestOA{\expandtoken\othercatcode `A}
+\edef\TestLA{\expandtoken\lettercatcode`A}
+\stoptyping
-To be discussed:
+In both cases the meaning is \type {A} but in the first case it's not a letter
+but a character flagged as \quote {other}.
+
+A whole new category of commands has to do with so called local control. When
+\TEX\ scans and interprets the input, a process takes place that is called
+tokenizing: (sequences of) characters get a symbolic representation and travel
+through the system as tokens. Often they immediately get interpreted and are then
+discarded. But when for instance you define a macro they end up as a linked list
+of tokens in the macro body. We already saw that expansion plays a role. In most
+cases, unless \TEX\ is collecting tokens, the main action is dealt with in the so-called
+main loop. Something gets picked up from the input but can also be pushed
+back, for instance because of some lookahead that didn't result in an action.
+Quite some time is spent in pushing and popping from the so-called input stack.
+
+When we are in \LUA, we can pipe back into the engine but all is collected till
+we're back in \TEX\ where the collected result is pushed into the input. Because
+\TEX\ is a mix of programming and action there basically is only that main loop.
+There is no real way to start a sub run in \LUA\ and do all kind of things
+independent of the current one. This makes sense when you consider the mix: it
+would get too confusing.
+
+However, in \LUATEX\ and even better in \LUAMETATEX, we can enter a sort of local
+state and this is called \quote {local control}. When we are in local control a
+new main loop is entered and the current state is temporarily forgotten: we can for
+instance expand where one level up expansion was not done. It sounds complicated
+an indeed it is complicated so examples have to clarify it.
-\starttyping
-\expand
-\expandtoken
-\localcontrol
-\localcontrolled
-\beginlocalcontrol ... \endlocalcontrol
-\immediate
+\starttyping[option=TEX]
+1 \setbox0\hbox to 10pt{2} \count0=3 \the\count0 \multiply\count0 by 4
\stoptyping
-And maybe also here:
+This snippet of code is not that useful but illustrates what we're dealing with:
+
+\startitemize
+
+\startitem
+ The \type {1} gets typeset. So, characters like that are seen as text.
+\stopitem
+
+\startitem
+ The \type {\setbox} primitive triggers picking up a register number, then
+ goes on scanning for a box specification and that itself will typeset a
+ sequence of whatever until the group ends.
+\stopitem
+
+\startitem
+ The \type {count} primitive triggers scanning for a register number (or
+ reference) and then scans for a number; the equal sign is optional.
+\stopitem
+
+\startitem
+ The \type {the} primitive injects some value into the current input stream
+ and it does so by entering a new input level.
+\stopitem
+
+\startitem
+ The \type {multiply} primitive picks up a register specification and
+ multiplies that by the next scanned number. The \type {by} is optional.
+\stopitem
+
+\stopitemize
+
+We now look at this snippet again but with an expansion context:
+
+\startbuffer[def]
+\def \TestA{1 \setbox0\hbox{2} \count0=3 \the\count0}
+\stopbuffer
+
+\startbuffer[edef]
+\edef\TestB{1 \setbox0\hbox{2} \count0=3 \the\count0}
+\stopbuffer
+
+\typebuffer[def] [option=TEX]
+\typebuffer[edef][option=TEX]
+
+\getbuffer[def]
+\getbuffer[edef]
+
+These two macros have a slightly different body. Make sure you see the
+difference before reading on.
+
+\luatokentable\TestA
+
+\luatokentable\TestB
+
+We now introduce a new primitive \type {\localcontrolled}:
+
+\startbuffer[edef]
+\edef\TestB{1 \setbox0\hbox{2} \count0=3 \the\count0}
+\stopbuffer
+
+\startbuffer[ldef]
+\edef\TestC{1 \setbox0\hbox{2} \localcontrolled{\count0=3} \the\count0}
+\stopbuffer
+
+\typebuffer[edef][option=TEX]
+\typebuffer[ldef][option=TEX]
+
+\getbuffer[edef]
+\getbuffer[ldef]
+
+Again, watch the subtle differences:
+
+\luatokentable\TestB
+
+\luatokentable\TestC
+
+Another example:
+
+\startbuffer[edef]
+\edef\TestB{1 \setbox0\hbox{2} \count0=3 \the\count0}
+\stopbuffer
+
+\startbuffer[ldef]
+\edef\TestD{\localcontrolled{1 \setbox0\hbox{2} \count0=3 \the\count0}}
+\stopbuffer
+
+\typebuffer[edef][option=TEX]
+\typebuffer[ldef][option=TEX]
+
+\getbuffer[edef]\getbuffer[ldef]\quad{\darkgray\leftarrow\space Watch how the results end up here!}
+
+\luatokentable\TestB
+
+\luatokentable\TestD
+
+We can use this mechanism to define so called fully expandable macros:
+
+\startbuffer[def]
+\def\WidthOf#1%
+ {\beginlocalcontrol
+ \setbox0\hbox{#1}%
+ \endlocalcontrol
+ \wd0 }
+\stopbuffer
+
+\startbuffer[use]
+\scratchdimen\WidthOf{The Rite Of Spring}
+
+\the\scratchdimen
+\stopbuffer
+
+\typebuffer[def][option=TEX]
+\typebuffer[use][option=TEX]
+
+\getbuffer[def]\getbuffer[use]
+
+When you want to add some grouping, it quickly can become less pretty:
+
+\startbuffer[def]
+\def\WidthOf#1%
+ {\dimexpr
+ \beginlocalcontrol
+ \begingroup
+ \setbox0\hbox{#1}%
+ \expandafter
+ \endgroup
+ \expandafter
+ \endlocalcontrol
+ \the\wd0
+ \relax}
+\stopbuffer
+
+\startbuffer[use]
+\scratchdimen\WidthOf{The Rite Of Spring}
+
+\the\scratchdimen
+\stopbuffer
+
+\typebuffer[def][option=TEX]
+\typebuffer[use][option=TEX]
+
+\getbuffer[def]\getbuffer[use]
+
+A single token alternative is available too and its usage is like this:
+
+\startbuffer
+ \def\TestA{\scratchcounter=100 }
+\edef\TestB{\localcontrol\TestA \the\scratchcounter}
+\edef\TestC{\localcontrolled{\TestA} \the\scratchcounter}
+\stopbuffer
+
+\typebuffer[option=TEX] \getbuffer
+
+The content of \type {\TestB} is \quote {\tttf\meaningless\TestB} and of course
+the \type {\TestC} macro gives \quote {\tttf\meaningless\TestC}.
+
+We now move to the \LUA\ end. Right from the start the way to get something into
+\TEX\ from \LUA\ has been the print functions. But we can also go local
+(immediate). There are several methods:
+
+\startitemize[packed]
+\startitem via a set token register \stopitem
+\startitem via a defined macro \stopitem
+\startitem via a string \stopitem
+\stopitemize
+
+Among the things to keep in mind are catcodes, scope and expansion (especially in
+when the result itself ends up in macros). We start with an example where we go via
+a token register:
+
+\startbuffer[set]
+\toks0={\setbox0\hbox{The Rite Of Spring}}
+\toks2={\setbox0\hbox{The Rite Of Spring!}}
+\stopbuffer
+
+\typebuffer[set][option=TEX]
+
+\startbuffer[run]
+\startluacode
+tex.runlocal(0) context("[1: %p]",tex.box[0].width)
+tex.runlocal(2) context("[2: %p]",tex.box[0].width)
+\stopluacode
+\stopbuffer
+
+\typebuffer[run][option=TEX]
+
+\start \getbuffer[set,run] \stop
+
+We can also use a macro:
+
+\startbuffer[set]
+\def\TestA{\setbox0\hbox{The Rite Of Spring}}
+\def\TestB{\setbox0\hbox{The Rite Of Spring!}}
+\stopbuffer
+
+\typebuffer[set][option=TEX]
-\starttyping
-\tokenized : a bonus
-\scantokens : original etex, now using the lua method
+\startbuffer[run]
+\startluacode
+tex.runlocal("TestA") context("[3: %p]",tex.box[0].width)
+tex.runlocal("TestB") context("[4: %p]",tex.box[0].width)
+\stopluacode
+\stopbuffer
+
+\typebuffer[run][option=TEX]
+
+\start \getbuffer[set,run] \stop
+
+A third variant is more direct and uses a (\LUA) string:
+
+\startbuffer[run]
+\startluacode
+tex.runstring([[\setbox0\hbox{The Rite Of Spring}]])
+
+context("[5: %p]",tex.box[0].width)
+
+tex.runstring([[\setbox0\hbox{The Rite Of Spring!}]])
+
+context("[6: %p]",tex.box[0].width)
+\stopluacode
+\stopbuffer
+
+\typebuffer[run][option=TEX]
+
+\start \getbuffer[run] \stop
+
+A bit more high level:
+
+\starttyping[option=LUA]
+context.runstring([[\setbox0\hbox{(Here \bf 1.2345)}]])
+context.runstring([[\setbox0\hbox{(Here \bf %.3f)}]],1.2345)
\stoptyping
-% \aftergroups
-% \aftergrouped
+Before we had \type {runstring} this was the way to do it when staying in \LUA\
+was needed:
+
+\startbuffer[run]
+\startluacode
+token.setmacro("TestX",[[\setbox0\hbox{The Rite Of Spring}]])
+tex.runlocal("TestX")
+context("[7: %p]",tex.box[0].width)
+\stopluacode
+\stopbuffer
+
+\typebuffer[run][option=TEX]
+
+\start \getbuffer[run] \stop
+
+\startbuffer[run]
+\startluacode
+tex.scantoks(0,tex.ctxcatcodes,[[\setbox0\hbox{The Rite Of Spring!}]])
+tex.runlocal(0)
+context("[8: %p]",tex.box[0].width)
+\stopluacode
+\stopbuffer
+
+\typebuffer[run][option=TEX]
+
+\start \getbuffer[run] \stop
+
+The order of flushing matters because as soon as something is not stored in a
+token list or macro body, \TEX\ will typeset it. And as said, a lot of this relates
+to pushing stuff into the input which is stacked. Compare:
+
+\startbuffer[run]
+\startluacode
+context("[HERE 1]")
+context("[HERE 2]")
+\stopluacode
+\stopbuffer
+
+\typebuffer[run][option=TEX]
+
+\start \getbuffer[run] \stop
+
+with this:
+
+\startbuffer[run]
+\startluacode
+tex.pushlocal() context("[HERE 1]") tex.poplocal()
+tex.pushlocal() context("[HERE 2]") tex.poplocal()
+\stopluacode
+\stopbuffer
+
+\typebuffer[run][option=TEX]
+
+\start \getbuffer[run] \stop
+
+You can expand a macro at the \LUA\ end with \type {token.expandmacro} which has
+a peculiar interface. The first argument has to be a string (the name of a macro)
+or a userdata (a valid macro token). This macro can be fed with parameters by
+passing more arguments:
+
+\starttabulate[|||]
+\NC string \NC serialized to tokens \NC \NR
+\NC true \NC wrap the next string in curly braces \NC \NR
+\NC table \NC each entry will become an argument wrapped in braces \NC \NR
+\NC token \NC inject the token directly \NC \NR
+\NC number \NC change control to the given catcode table \NC \NR
+\stoptabulate
+
+There are more scanner related primitives, like the \ETEX\ primitive
+\type {\detokenize}:
+
+\startbuffer[run]
+[\detokenize {test \relax}]
+\stopbuffer
+
+\typebuffer[run][option=TEX]
+
+This gives: {\tttf \getbuffer[run]}. In \LUAMETATEX\ we also have complementary
+primitive(s):
+
+\startbuffer[run]
+[\tokenized catcodetable \vrbcatcodes {test {\bf test} test}]
+[\tokenized {test {\bf test} test}]
+[\retokenized \vrbcatcodes {test {\bf test} test}]
+\stopbuffer
+
+\typebuffer[run][option=TEX]
+
+The \type {\tokenized} takes an optional keyword and the examples above give: {\tttf
+\getbuffer[run]}. The \LUATEX\ primitive \type {\scantextokens} which is a
+variant of \ETEX's \type {\scantokens} operates under the current catcode regime
+(the last one honors \type {\everyeof}). The difference with \type {\tokenized}
+is that this one first serializes the given token list (just like \type
+{\detokenize}). \footnote {The \type {\scan*tokens} primitives now share the same
+helpers as \LUA, but they should behave the same as in \LUATEX.}
+
+With \type {\retokenized} the catcode table index is mandatory (it saves a bit of
+scanning and is easier on intermixed \type {\expandafter} usage. There
+often are several ways to accomplish the same:
+
+\startbuffer[run]
+\def\MyTitle{test {\bf test} test}
+\detokenize \expandafter{\MyTitle}: 0.46\crlf
+\meaningless \MyTitle : 0.47\crlf
+\retokenized \notcatcodes{\MyTitle}: 0.87\crlf
+\tokenized catcodetable \notcatcodes{\MyTitle}: 0.93\crlf
+\stopbuffer
+
+\typebuffer[run][option=TEX]
+
+\getbuffer[run]
+
+Here the numbers show the relative performance of these methods. The \type
+{\detokenize} and \type {\meaningless} win because they already know that a
+verbose serialization is needed. The last two first serialize and then
+reinterpret the resulting token list using the given catcode regime. The last one
+is slowest because it has to scan the keyword.
+
+There is however a pitfall here:
+
+\startbuffer[run]
+\def\MyText {test}
+\def\MyTitle{test \MyText\space test}
+\detokenize \expandafter{\MyTitle}\crlf
+\meaningless \MyTitle \crlf
+\retokenized \notcatcodes{\MyTitle}\crlf
+\tokenized catcodetable \notcatcodes{\MyTitle}\crlf
+\stopbuffer
-And:
+\typebuffer[run][option=TEX]
-\starttyping
- \def\foo{foo}
-\protected\def\oof{oof}
+The outcome is different now because we have an expandable embedded macro call.
+The fact that we expand in the last two primitives is also the reason why they are
+\quote {slower}.
-\csname foo\endcsname
-\csname oof\endcsname
-\csname \foo\endcsname
-% \csname \oof\endcsname % error in luametatex
+\getbuffer[run]
-\ifcsname foo\endcsname yes\else nop\fi
-\ifcsname oof\endcsname yes\else nop\fi
-\ifcsname \foo\endcsname yes\else nop\fi
-\ifcsname \oof\endcsname yes\else nop\fi % nop in luametatex
+To complete this picture, we show a variant than combines much of what has been
+introduced in this section:
+
+\startbuffer[run]
+\semiprotected\def\MyTextA {test}
+\def\MyTextB {test}
+\def\MyTitle{test \MyTextA\space \MyTextB\space test}
+\detokenize \expandafter{\MyTitle}\crlf
+\meaningless \MyTitle \crlf
+\retokenized \notcatcodes{\MyTitle}\crlf
+\retokenized \notcatcodes{\semiexpanded{\MyTitle}}\crlf
+\tokenized catcodetable \notcatcodes{\MyTitle}\crlf
+\tokenized catcodetable \notcatcodes{\semiexpanded{\MyTitle}}
+\stopbuffer
+
+\typebuffer[run][option=TEX]
+
+This time compare the last four lines:
+
+\getbuffer[run]
+
+Of course the question remains to what extend we need this and eventually will
+apply in \CONTEXT. The \type {\detokenize} is used already. History shows that
+eventually there is a use for everything and given the way \LUAMETATEX\ is
+structured it was not that hard to provide the alternatives without sacrificing
+performance or bloating the source.
+
+% tex.quitlocal
+%
+% tex.expandmacro : string|userdata + [string|true|table|userdata|number]*
+% tex.expandasvalue : kind + string|userdata + [string|true|table|userdata|number]*
+% tex.runstring : [catcode] + string + expand + grouped
+% tex.runlocal : function|number(register)|string(macro)|userdata(token) + expand + grouped
+% mplib.expandtex : mpx + kind + string|userdata + [string|true|table|userdata|number]*
+
+\stopsectionlevel
+
+\startsectionlevel[title=Dirty tricks]
+
+When I was updating this manual Hans vd Meer and I had some discussions about
+expansion and tokenization related issues when combining of \XML\ processing with
+\TEX\ macros where he did some manipulations in \LUA. In these mixed cases you
+can run into catcode related problems because in \XML\ you want for instance a
+\type {#} to be a hash mark (other character) and not an parameter identifier.
+Normally this is handled well in \CONTEXT\ but of course there are complex cases
+where you need to adapt.
+
+Say that you want to compare two strings (officially we should say token lists)
+with mixed catcodes. Let's also assume that you want to use the normal \type
+{\if} construct (which was part of the discussion). We start with defining
+a test set. The reason that we present this example here is that we use
+commands discussed in previous sections:
+
+\startbuffer[run]
+ \def\abc{abc}
+\semiprotected \def\xyz{xyz}
+ \edef\pqr{\expandtoken\notcatcodes`p%
+ \expandtoken\notcatcodes`q%
+ \expandtoken\notcatcodes`r}
+
+1: \ifcondition\similartokens{abc} {def}YES\else NOP\fi (NOP) \quad
+2: \ifcondition\similartokens{abc}{\abc}YES\else NOP\fi (YES)
+
+3: \ifcondition\similartokens{xyz} {pqr}YES\else NOP\fi (NOP) \quad
+4: \ifcondition\similartokens{xyz}{\xyz}YES\else NOP\fi (YES)
+
+5: \ifcondition\similartokens{pqr} {pqr}YES\else NOP\fi (YES) \quad
+6: \ifcondition\similartokens{pqr}{\pqr}YES\else NOP\fi (YES)
+\stopbuffer
+
+\typebuffer[run][option=TEX]
+
+So, we have a mix of expandable and semi expandable macros, and also a mix of
+catcodes. A naive approach would be:
+
+\startbuffer[def]
+\permanent\protected\def\similartokens#1#2%
+ {\iftok{#1}{#2}}
+\stopbuffer
+
+\typebuffer[def][option=TEX]
+
+but that will fail on some cases:
+
+\pushoverloadmode \startpacked \tttf \getbuffer[def,run]\stoppacked \popoverloadmode
+
+So how about:
+
+\startbuffer[def]
+\permanent\protected\def\similartokens#1#2%
+ {\iftok{\detokenize{#1}}{\detokenize{#2}}}
+\stopbuffer
+
+\typebuffer[def][option=TEX]
+
+That one is even worse:
+
+\pushoverloadmode \startpacked \tttf \getbuffer[def,run]\stoppacked \popoverloadmode
+
+We need to expand so we end up with this:
+
+\startbuffer[def]
+\permanent\protected\def\similartokens#1#2%
+ {\normalexpanded{\noexpand\iftok
+ {\noexpand\detokenize{#1}}
+ {\noexpand\detokenize{#2}}}}
+\stopbuffer
+
+\typebuffer[def][option=TEX]
+
+Better:
+
+\pushoverloadmode \startpacked \tttf \getbuffer[def,run]\stoppacked \popoverloadmode
+
+But that will still not deal with the mildly protected macro so in the end we
+have:
+
+\startbuffer[def]
+\permanent\protected\def\similartokens#1#2%
+ {\semiexpanded{\noexpand\iftok
+ {\noexpand\detokenize{#1}}
+ {\noexpand\detokenize{#2}}}}
+\stopbuffer
+
+\typebuffer[def][option=TEX]
+
+Now we're good:
+
+\pushoverloadmode \startpacked \tttf \getbuffer[def,run]\stoppacked \popoverloadmode
+
+Finally we wrap this one in the usual \type {\doifelse...} macro:
+
+\startbuffer[def]
+\permanent\protected\def\doifelsesimilartokens#1#2%
+ {\ifcondition\similartokens{#1}{#2}%
+ \expandafter\firstoftwoarguments
+ \else
+ \expandafter\secondoftwoarguments
+ \fi}
+\stopbuffer
+
+\typebuffer[def][option=TEX]
+
+so that we can do:
+
+\starttyping[option=TEX]
+\doifelsesimilartokens{pqr}{\pqr}{YES}{NOP}
\stoptyping
-\stoptext
+A companion macro of this is \type {\wipetoken} but for that one you need to look
+into the source.
-\stopsection
+\stopsectionlevel
\stopdocument
+% \aftergroups
+% \aftergrouped
+%
+% \starttyping
+% \def\foo{foo}
+% \protected\def\oof{oof}
+%
+% \csname foo\endcsname
+% \csname oof\endcsname
+% \csname \foo\endcsname
+% \begincsname \oof\endcsname % error in luametatex, but in texexpand l 477 we can block an error
+%
+% \ifcsname foo\endcsname yes\else nop\fi
+% \ifcsname oof\endcsname yes\else nop\fi
+% \ifcsname \foo\endcsname yes\else nop\fi
+% \ifcsname \oof\endcsname yes\else nop\fi % nop in luametatex
+% \stoptyping
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/lowlevel/lowlevel-grouping.tex b/Master/texmf-dist/doc/context/sources/general/manuals/lowlevel/lowlevel-grouping.tex
index eadcca6a9fd..12d12f7f4d4 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/lowlevel/lowlevel-grouping.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/lowlevel/lowlevel-grouping.tex
@@ -1,4 +1,4 @@
-% language=us
+% language=us runpath=texruns:manuals/lowlevel
\environment lowlevel-style
@@ -6,15 +6,15 @@
[title=grouping,
color=middlecyan]
-\startsection[title=Introduction]
+\startsectionlevel[title=Introduction]
This is a rather short explanation. I decided to write it after presenting the
other topics at the 2019 \CONTEXT\ meeting where there was a question about
grouping.
-\stopsection
+\stopsectionlevel
-\startsection[title=\PASCAL]
+\startsectionlevel[title=\PASCAL]
In a language like \PASCAL, the language that \TEX\ has been written in, or
\MODULA, its successor, there is no concept of grouping like in \TEX. But we can
@@ -30,9 +30,9 @@ instance an assignment in \METAPOST\ uses \type {:=} too. However, the \type
can have local variables in a procedure or function but the block is just a way
to pack a sequence of statements.
-\stopsection
+\stopsectionlevel
-\startsection[title=\TEX]
+\startsectionlevel[title=\TEX]
In \TEX\ macros (or source code) the following can occur:
@@ -79,9 +79,9 @@ The bottomline is: if you want a value to persist after the group, you need to
explicitly change its value globally. This makes a lot of sense in the perspective
of \TEX.
-\stopsection
+\stopsectionlevel
-\startsection[title=\METAPOST]
+\startsectionlevel[title=\METAPOST]
The \METAPOST\ language also has a concept of grouping but in this case it's more like a
programming language.
@@ -110,9 +110,9 @@ implicit.
So, in \METAPOST\ all assignments are global, unless a variable is explicitly
saved inside a group.
-\stopsection
+\stopsectionlevel
-\startsection[title=\LUA]
+\startsectionlevel[title=\LUA]
In \LUA\ all assignments are global unless a variable is defines local:
@@ -132,9 +132,9 @@ some \METAPOST\ coding or using \type {end} instead of \type {endfor} in
\METAPOST\ which can make the library wait for more without triggering an error.
Proper syntax highlighting in an editor clearly helps.
-\stopsection
+\stopsectionlevel
-\startsection[title=\CCODE]
+\startsectionlevel[title=\CCODE]
The \LUA\ language is a mix between \PASCAL\ (which is one reason why I like it)
and \CCODE.
@@ -151,20 +151,6 @@ for (i=1; i<=10;i++) {
The semicolon is also used in \PASCAL\ but there it is a separator and not a
statement end, while in \METAPOST\ it does end a statement (expression).
-\stopsection
-
-\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
+\stopsectionlevel
\stopdocument
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/lowlevel/lowlevel-inserts.tex b/Master/texmf-dist/doc/context/sources/general/manuals/lowlevel/lowlevel-inserts.tex
new file mode 100644
index 00000000000..ca9d5ae8d31
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/lowlevel/lowlevel-inserts.tex
@@ -0,0 +1,216 @@
+% language=us runpath=texruns:manuals/lowlevel
+
+\environment lowlevel-style
+
+\startdocument
+ [title=inserts,
+ color=middlecyan]
+
+\startsectionlevel[title=Introduction]
+
+This document is a mixed bag. We do discuss inserts but also touch elements of
+the page builder because inserts and regular page content are handled there.
+Examples of mechanisms that use inserts are footnotes. These have an anchor in
+the running text and some content that ends up (normally) at the bottom of the
+page. When considering a page break the engine tries to make sure that the anchor
+(reference) and the content end up on the same page. When there is too much, it
+will distribute (split) the content over pages.
+
+We can discuss page breaks in a (pseudo) scientific way and explore how to
+optimize this process, taking into accounts also inserts that contain images but
+it doesn't make much sense to do that because in practice we can encounter all
+kind of interferences. Theory and practice are too different because a document
+can contain a wild mix of text, figures, formulas, notes, have backgrounds and
+location dependent processing. It get seven more complex when we are dealing with
+columns because \TEX\ doesn't really know that concept.
+
+I will therefore stick to some practical aspects and the main reason for this
+document is that I sort of document engine features and at the same time give an
+impression of what we deal with. I will do that in the perspective of
+\LUAMETATEX, which has a few more options and tracing than other engines.
+
+{\em Currently this document is mostly for myself to keep track of the state of
+inserts and the page builder in \LUAMETATEX\ and \CONTEXT\ \LMTX. The text is not
+yet corrected and can have errors.}
+
+\stopsectionlevel
+
+\startsectionlevel[title=The page builder]
+
+When your document is processed content eventually gets added to the so called
+main vertical list (mvl). Content first get appended to the list of contributions
+and at specific moments it will be handed over to the mvl. This process is called
+page building. There we can encounter the following elements (nodes):
+
+\starttabulate
+\NC \type {glue} \NC a vertical skip \NC \NR
+\NC \type {penalty} \NC a vertical penalty \NC \NR
+\NC \type {kern} \NC a vertical kern \NC \NR
+\NC \type {vlist} \NC a a vertical box \NC \NR
+\NC \type {hlist} \NC a horizontal box (often a line) \NC \NR
+\NC \type {rule} \NC a horizontal rule \NC \NR
+\NC \type {boundary} \NC a boundary node \NC \NR
+\NC \type {whatsit} \NC a node that is used by user code (often some extension) \NC \NR
+\NC \type {mark} \NC a token list (as used for running headers) \NC \NR
+\NC \type {insert} \NC a node list (as used for notes) \NC \NR
+\stoptabulate
+
+The engine itself will not insert anything other than this but \LUA\ code can
+mess up the contribution list and the mvl and that can trigger an error. Handing
+over the contributions is done by the page builder and that one kicks in in
+several places:
+
+\startitemize[packed]
+\startitem
+ When a penalty gets inserted it is part of evaluating if the output routine
+ should be triggered. This triggering can be enforced by values equal or below
+ 10.000 that then can be checked in the set routine.
+\stopitem
+\startitem
+ The builder is {\em not} exercised when a glue or kern is injected so there can
+ be multiple of them before another element triggers the builder.
+\stopitem
+\startitem
+ Adding a box triggers the builder as does the result of an alignment which can
+ be a list of boxes.
+\stopitem
+\startitem
+ When the output routine is finished the builder is executed because the
+ routine can have pushed back content.
+\stopitem
+\startitem
+ When a new paragraph is triggered by the \type {\par} command the builder kicks in
+ but only when the engine was able to enter vertical mode.
+\stopitem
+\startitem
+ When the job is finished the builder will make sure that pending content is handled.
+\stopitem
+\startitem
+ An insert and vadjust {\em can} trigger the builder but only at the nesting level zero
+ which normally is not the case (I need an example).
+\stopitem
+\startitem
+ At the beginning of a paragraph (like text), before display math is entered,
+ and when display math ends the builder is also activated.
+\stopitem
+\stopitemize
+
+At the \TEX\ the builder is triggered automatically in the mentioned cases but at
+the \LUA\ end you can use \type {tex.triggerbuildpage()} to flush the pending
+contributions.
+
+The properties that relate to the page look like counter and dimension registers
+but they are not. These variables are global and managed differently.
+
+\starttabulate
+\NC \type {\pagegoal} \NC the available space \NC \NR
+\NC \type {\pagetotal} \NC the accumulated space \NC \NR
+\NC \type {\pagestretch} \NC the possible zero order stretch \NC \NR
+\NC \type {\pagefilstretch} \NC the possible one order stretch \NC \NR
+\NC \type {\pagefillstretch} \NC the possible second order stretch \NC \NR
+\NC \type {\pagefilllstretch} \NC the possible third order stretch \NC \NR
+\NC \type {\pageshrink} \NC the possible shrink \NC \NR
+\NC \type {\pagedepth} \NC the current page depth \NC \NR
+\NC \type {\pagevsize} \NC the initial page goal \NC \NR
+\stoptabulate
+
+When the first content is added to an empty page the \type {\pagegoal} gets the
+value of \type {\vsize} and gets frozen but the value is diminished by the space
+needed by left over inserts. These inserts are managed via a separate list so
+they don't interfere with the page that itself of course can have additional
+inserts. The \type {\pagevsize} is just a (\LUAMETATEX) status variable that hold
+the initial \type {\pagegoal} but it might play a role in future extensions.
+
+Another variable is \type {\deadcycles} that registers the number of times the
+output routine is called without returning result.
+
+\stopsectionlevel
+
+\startsectionlevel[title=Inserts]
+
+We now come to inserts. In traditional \TEX\ an insert is a data structure that
+runs on top of registers: a box, count, dimension and skip. An insert is accessed
+by a number so for instance insert 123 will use the four registers of that
+number. Because \TEX\ only offers a command alias mechanism for registers (like
+\type {\countdef}) a macro package will implement some allocator management
+subsystem (like \type {\newcount}). A \type {\newinsert} has to be defined in a
+way that the four registers are not clashing with other allocators. When you
+start with \TEX\ seeing code that deals with in (in plain \TEX) can be puzzling
+but it follows from the way \TEX\ is set up. But inserts are probably not what
+you start exploring right away away.
+
+In \LUAMETATEX\ you can set \type {\insertmode} to 1 and that is what we do in
+\CONTEXT. In that mode inserts are taken from a pool instead of registers. A side
+effect is that like the page properties the insert properties are global too but
+that is normally no problem and can be managed well by a macro package (that
+probably would assign register the values globally too). The insert pool will
+grow dynamically on demand so one can just start at 1; in \CONTEXT\ \MKIV\ we use
+the range 127 upto 255 in order to avoid a clash with registers. In \LMTX\ we start
+at 1 because there are no clashes.
+
+A consequence of this approach is that we use dedicated commands to set the insert
+properties:
+
+\starttabulate[|l|l|p|]
+\NC \type {\insertdistance} \NC glue \NC the space before the first instance (on a page) \NC \NR
+\NC \type {\insertmultiplier} \NC count \NC a factor that is used to calculate the height used \NC \NR
+\NC \type {\insertlimit} \NC dimen \NC the maximum amount of space on a page to be taken \NC \NR
+\NC \type {\insertpenalty} \NC count \NC the floating penalty (used when set) \NC \NR
+\NC \type {\insertmaxdepth} \NC dimen \NC the maximum split depth (used when set) \NC \NR
+\NC \type {\insertstorage} \NC count \NC signals that the insert has to be stored for later \NC \NR
+\NC \type {\insertheight} \NC dimen \NC the accumulated height of the inserts so far \NC \NR
+\NC \type {\insertdepth} \NC dimen \NC the current depth of the inserts so far \NC \NR
+\NC \type {\insertwidth} \NC dimen \NC the width of the inserts \NC \NR
+\stoptabulate
+
+These commands take a number and an integer, dimension or glue specification.
+They can be set and queried but setting the dimensions can have side effects. The
+accumulated height of the inserts is available in \type {\insertheights} (which
+can be set too). The \type {\floatingpenalty} variable determines the penalty
+applied when a split is needed.
+
+In the output routine the original \TEX\ variable \type {\insertpenalties} is a
+counter that keeps the number of insertions that didn't fit on the page while
+otherwise if has the accumulated penalties of the split insertions. When \type
+{\holdinginserts} is non zero the inserts in the list are not collected for
+output, which permits the list to be fed back for reprocessing.
+
+The \LUAMETATEX\ specific storage mode \type {\insertstoring} variable is
+explained in the next section.
+
+\stopsectionlevel
+
+\startsectionlevel[title=Storing]
+
+This feature is kind of special and still experimental. When \type
+{\insertstoring} is set 1, all inserts that have their storage flag set will be
+saved. Think of a multi column setup where inserts have to end up in the last
+column. If there are three columns, the first two will store inserts. Then when
+the last column is dealt with \type {\insertstoring} can be set to 2 and that
+will signal the builder that we will inject the inserts. In both cases, the value
+of this register will be set to zero so that it doesn't influence further
+processing.
+
+\stopsectionlevel
+
+\startsectionlevel[title=Synchronizing]
+
+The page builder can triggered by (for instance) a penalty but you can also use
+\type {\pageboundary}. This will trigger the page builder but not leave anything
+behind. (This is experimental.)
+
+\stopsectionlevel
+
+\startsectionlevel[title=Migration]
+
+{\em Todo, nothing new there, so no hurry.}
+
+\stopsectionlevel
+
+\startsectionlevel[title=Callbacks]
+
+{\em Todo, nothing new there, so no hurry.}
+
+\stopsectionlevel
+
+\stopdocument
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/lowlevel/lowlevel-localboxes.tex b/Master/texmf-dist/doc/context/sources/general/manuals/lowlevel/lowlevel-localboxes.tex
new file mode 100644
index 00000000000..a0ca159755e
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/lowlevel/lowlevel-localboxes.tex
@@ -0,0 +1,408 @@
+% language=us runpath=texruns:manuals/lowlevel
+
+% \unprotect \pushoverloadmode
+% \popoverloadmode \protect
+
+\environment lowlevel-style
+
+\startdocument
+ [title=localboxes,
+ color=middlered]
+
+\startsectionlevel[title=Introduction]
+
+The \LUATEX\ engine inherited a few features from other engines and adding local
+boxes to paragraphs is one of them. This concept comes from \OMEGA\ but over time
+it has been made a bit more robust, also by using native par nodes instead of
+whatsit nodes that are used to support \TEX's extensions. In another low level
+manual we discuss paragraph properties and these local boxes are also part of
+that so you might want to catch up on that. Local boxes are stored in an initial
+par node with an adequate subtype but users wont' notice this (unless they mess
+around in \LUA). The inline par nodes have a different subtype and are injected
+with the \typ {\localinterlinepenalty}, \typ {\localbrokenpenalty}, \typ
+{\localleftbox}, \typ {\localrightbox} and \LUAMETATEX\ specific \typ
+{\localmiddlebox} primitives. WHen these primitives are used in vertical mode
+they just set registers.
+
+The original (\OMEGA) idea was that local boxes are used for repetitive
+punctuation (like quotes) at the left and|/|or right end of the lines that make
+up a paragraph. That means that when these primitives inject nodes they actually
+introduce states so that a stretch of text can be marked.
+
+When this mechanism was cleaned up in \LUAMETATEX\ I decided to investigate if
+other usage made sense. After all, it is a feature that introduces some extra
+code and it then pays of to use it when possible. Among the extensions are a
+callback that is triggered when the left and right boxes get added and
+experiments with that showed some potential but in order to retain performance as
+well as limit extensive node memory usage (par nodes are large) a system of
+indices was added. All this will be illustrated below. Warning: the mechanism in
+\LUAMETATEX\ is not compatible with \LUATEX.
+
+{\em This is a preliminary, uncorrected manual.}
+
+\stopsectionlevel
+
+\startsectionlevel[title=The basics]
+
+This mechanism uses a mix of setting (pseudo horizontal) box registers that get
+associated with (positions in a) paragraph. When the lines resulting from
+breaking the list gets packaged into an horizontal (line) box, the local left and
+right boxes get prepended and appended to the textual part (inside the left,
+right and parfills kips and left or right hanging margins). When assigning the
+current local boxes to the paragraph node(s) references to the pseudo registers
+are used and the packaging actually copies them. This mix of referencing and
+copying is somewhat tricky but the engine does it best to hide this for the user.
+
+This mechanism is rather useless when not wrapped into some high level mechanism
+because by default setting these boxes wipes the existing value. In \LUAMETATEX\
+you can actually access the boxes so prepending and appending is possible but
+experiments showed that this could come with a huge performance hit when the
+lists are not cleaned up during a run. This is why we have introduced indices:
+when you assign local boxes using the index option that specific index will be
+replaced and therefore we have a more sparse solution. So, contrary to \LUATEX,
+in \LUAMETATEX\ the local box registers have a linked lists of local boxes tagged
+by index. Unless you manipulate in \LUA, this is hidden from the user. One can
+access the boxes from the \TEX\ the but there can be no confusion with \LUATEX\
+here because there we don't have access. This is why usage as in \LUATEX\ will
+also work in \LUAMETATEX.
+
+This mechanism obeys grouping as is demonstrated in the next three examples. The
+first example is:
+
+\startbuffer[example-1]
+\start
+ \dorecurse{10}{test #1.1 }
+ \localleftbox{\blackrule[width=2em,color=darkred] }
+ \dorecurse{20}{test #1.2 }
+ \removeunwantedspaces
+ \localrightbox{ \blackrule[width=3em,color=darkblue]}
+ \dorecurse{20}{test #1.3 }
+\stop
+ \dorecurse{20}{test #1.4 }
+ % par ends here
+\stopbuffer
+
+\typebuffer[example-1][option=TEX]
+
+The next example differs in a subtle way: watch the \type {keep} keyword,
+it makes the setting retain after the group ends.
+
+\startbuffer[example-2]
+\start
+ \start
+ \dorecurse{10}{test #1.1 }
+ \localleftbox keep {\blackrule[width=2em,color=darkred] }
+ \dorecurse{20}{test #1.2 }
+ \removeunwantedspaces
+ \localrightbox { \blackrule[width=3em,color=darkblue]}
+ \dorecurse{20}{test #1.3 }
+ \stop
+ \dorecurse{20}{test #1.4 }
+\stop
+% par ends here
+\stopbuffer
+
+\typebuffer[example-2][option=TEX]
+
+The third example has two times \type {keep}. This option is \LUAMETATEX\
+specific.
+
+\startbuffer[example-3]
+\start
+ \start
+ \dorecurse{10}{test #1.1 }
+ \localleftbox keep {\blackrule[width=2em,color=darkred] }
+ \dorecurse{20}{test #1.2 }
+ \removeunwantedspaces
+ \localrightbox keep { \blackrule[width=3em,color=darkblue]}
+ \dorecurse{20}{test #1.3 }
+ \stop
+ \dorecurse{20}{test #1.4 }
+\stop
+% par ends here
+\stopbuffer
+
+\typebuffer[example-3][option=TEX]
+
+\startplacefigure % [location=page]
+ \startcombination[nx=1,ny=3]
+ {\vbox{\hsize\textwidth\getbuffer[example-1]}} {\bf Example 1}
+ {\vbox{\hsize\textwidth\getbuffer[example-2]}} {\bf Example 2}
+ {\vbox{\hsize\textwidth\getbuffer[example-3]}} {\bf Example 3}
+ \stopcombination
+\stopplacefigure
+
+One (nasty) side effect is that when you set these boxes ungrouped they are
+applied to whatever follows, which is why resetting them is built in the relevant
+parts of \CONTEXT. The next examples are typeset grouped an demonstrate the use
+of indices:
+
+\startbuffer
+\dorecurse{20}{before #1 }
+\localleftbox{\bf \darkred L 1 }%
+\localleftbox{\bf \darkred L 2 }%
+\dorecurse{20}{after #1 }
+\stopbuffer
+
+\typebuffer[option=TEX] \start \getbuffer \par \stop
+
+Indices can be set for both sides:
+
+\startbuffer
+\dorecurse{5}{\localrightbox index #1{ \bf \darkgreen R #1}}%
+\dorecurse{20}{before #1 }
+\dorecurse{5}{\localleftbox index #1{\bf \darkred L #1 }}%
+\dorecurse{20}{after #1 }
+\stopbuffer
+
+\typebuffer[option=TEX] \start \getbuffer \par \stop
+
+We can instruct this mechanism to hook the local box into the main
+par node by using the \type {par} keyword. Keep in mind that these
+local boxes only come into play when the lines are broken, so till
+then changing them is possible.
+
+\startbuffer
+\dorecurse{3}{\localrightbox index #1{ \bf \darkgreen R #1}}%
+\dorecurse{20}{before #1 }
+\dorecurse{2}{\localleftbox par index #1{\bf \darkred L #1 }}%
+\dorecurse{20}{after #1 }
+\stopbuffer
+
+\typebuffer[option=TEX] \start \getbuffer \par \stop
+
+\stopsectionlevel
+
+\startsectionlevel[title=The interface]
+
+{\em The interface described here is experimental.}
+
+Because it is hard to foresee if this mechanism will be used at all the \CONTEXT\
+interface is somewhat low level: one can build functionality on top of it. In the
+previous section we saw examples of local boxes being part of the text but one
+reason for extending the interface was to see if we can also use this engine
+feature for efficiently placing marginal content.
+
+\startbuffer[definition]
+\definelocalboxes
+ [lefttext]
+ [location=lefttext,width=3em,color=darkblue]
+\definelocalboxes
+ [lefttextx]
+ [location=lefttext,width=3em,color=darkblue]
+
+\definelocalboxes
+ [righttext]
+ [location=righttext,width=3em,color=darkyellow]
+\definelocalboxes
+ [righttextx]
+ [location=righttext,width=3em,color=darkyellow]
+\stopbuffer
+
+\typebuffer[definition][option=TEX]
+
+\getbuffer[definition]
+
+The order of definition matters! Here the \type {x} variants have a larger index
+number. There can (currently) be at most 256 indices. The defined local boxes
+are triggered with \type {\localbox}:
+
+\startbuffer[example]
+\startnarrower
+\dorecurse{20}{before #1 }%
+\localbox[lefttext]{[L] }%
+\localbox[lefttextx]{[LL] }%
+\localbox[righttext]{ [RR]}%
+\localbox[righttextx]{ [R]}%
+\dorecurse{20}{ after #1}%
+\stopnarrower
+\stopbuffer
+
+\typebuffer[example][option=TEX]
+
+Watch how we obey the margins:
+
+\getbuffer[example]
+
+Here these local boxes have dimensions. The predefined margin variants are
+virtual. Here we set up the style and color:
+
+\startbuffer[definition]
+\setuplocalboxes
+ [leftmargin]
+ [style=\bs,
+ color=darkgreen]
+\setuplocalboxes
+ [rightmargin]
+ [style=\bs,
+ color=darkred]
+\stopbuffer
+
+\typebuffer[definition][option=TEX]
+
+\startbuffer[example]
+\dorecurse{2}{
+ \dorecurse{10}{some text #1.##1 }%
+ KEY#1.1%
+ \localmargintext[leftmargin]{L #1.1}%
+ \localmargintext[rightmargin]{R #1.1}%
+ \dorecurse{10}{some text #1.##1 }%
+ KEY#1.2%
+ \localmargintext[leftmargin]{L #1.2}%
+ \localmargintext[rightmargin]{R #1.2}%
+ \dorecurse{10}{some text #1.##1 }%
+ \blank
+}
+\stopbuffer
+
+\typebuffer[example][option=TEX]
+
+You can also use \type {leftedge} and \type {rightedge} but using them here would
+put them outside the page.
+
+{\getbuffer[definition,example]}
+
+In previous examples you can see that setting something at the left will lag behind
+so deep down we use another trick here: \type {\localmiddlebox}. When these boxes
+get placed a callback can be triggered and in \CONTEXT\ we use that to move these
+middle boxes to the margins.
+
+Next we implement line numbers. Watch out: this will not replace the existing
+mechanisms, it's just an alternative as we have alternative table mechanisms. We
+have a repertoire of helpers for constructing the result:
+
+\startbuffer[definition]
+\definelocalboxes
+ [linenumberleft]
+ [command=\LeftNumber,
+ location=middle,
+ distance=\leftmargindistance,
+ width=3em,
+ style=\bs,
+ color=darkred]
+
+\definelocalboxes
+ [linenumberright] % [linenumberleft]
+ [command=\RightNumber,
+ location=middle,
+ distance=\rightmargindistance,
+ width=3em,
+ style=\bf,
+ color=darkgreen]
+
+\definecounter[MyLineNumberL]
+\definecounter[MyLineNumberR]
+
+\setupcounter
+ [MyLineNumberL]
+ [numberconversion=characters]
+
+\setupcounter
+ [MyLineNumberR]
+ [numberconversion=romannumerals]
+
+\def\LineNumberL
+ {\incrementcounter[MyLineNumberL]%
+ \convertedcounter[MyLineNumberL]}
+
+\def\LineNumberR
+ {\incrementcounter[MyLineNumberR]%
+ \convertedcounter[MyLineNumberR]}
+
+\protected\def\LeftNumber
+ {\setbox\localboxcontentbox\hbox
+ to \localboxesparameter{width}
+ {(\LineNumberL\hss\strut)}%
+ \localmarginlefttext\zeropoint}
+
+\protected\def\RightNumber
+ {\setbox\localboxcontentbox\hbox
+ to \localboxesparameter{width}
+ {(\strut\hss\LineNumberR)}%
+ \localmarginrighttext\zeropoint}
+\stopbuffer
+
+\typebuffer[definition][option=TEX]
+
+\startbuffer[example]
+\localbox[linenumberleft]{}%
+\localbox[linenumberright]{}%
+\dorecurse{2}{
+ \samplefile{tufte}
+ \par
+}
+\resetlocalbox[linenumberleft]%
+\resetlocalbox[linenumberright]%
+\stopbuffer
+
+\typebuffer[example][option=TEX]
+
+We use our tufte example to illustrate the usage:
+
+\getbuffer[definition]
+
+{\getbuffer[example]}
+
+For convenience we support ranges like this (we've reset the line number counters
+here):
+
+\resetcounter[MyLineNumberL]
+\resetcounter[MyLineNumberR]
+
+\startbuffer[example]
+\startlocalboxrange[linenumberleft]%
+\startlocalboxrange[linenumberright]%
+\dorecurse{2}{
+ \samplefile{tufte}
+ \par
+}
+\stoplocalboxrange
+\stoplocalboxrange
+\stopbuffer
+
+\typebuffer[example][option=TEX]
+
+{\getbuffer[example]}
+
+\stopsectionlevel
+
+\startsectionlevel[title=The helpers]
+
+For the moment we have these helpers:
+
+\starttabulate[|l|;|]
+\NC \type {\localboxindex} \NC integer \NC \NR
+\NC \type {\localboxlinenumber} \NC integer \NC \NR
+\NC
+\NC \type {\localboxlinewidth} \NC dimension \NC \NR
+\NC \type {\localboxlocalwidth} \NC dimension \NC \NR
+\NC \type {\localboxprogress} \NC dimension \NC \NR
+\NC \type {\localboxleftoffset} \NC dimension \NC \NR
+\NC \type {\localboxrightoffset} \NC dimension \NC \NR
+\NC
+\NC \type {\localboxleftskip} \NC dimension \NC \NR
+\NC \type {\localboxrightskip} \NC dimension \NC \NR
+\NC \type {\localboxlefthang} \NC dimension \NC \NR
+\NC \type {\localboxrighthang} \NC dimension \NC \NR
+\NC
+\NC \type {\localboxindent} \NC dimension \NC \NR
+\NC \type {\localboxparfillleftskip} \NC dimension \NC \NR
+\NC \type {\localboxparfillrightskip} \NC dimension \NC \NR
+\NC \type {\localboxovershoot} \NC dimension \NC \NR
+\NC
+\stoptabulate
+
+The progress and offsets are accumulated values of the normalized indent, hangs,
+skips etc. The line number is the position in the paragraph. In the callback we
+set the box register \type {\localboxcontentbox} and use it after the command has
+been applied. In the line number example you can see how we set its final
+content, so these boxes are sort of dynamic. Normally in the middle case no
+content is passed and in the par builder a middle is not taken into account when
+calculating the line width.
+
+\stopsectionlevel
+
+\stopdocument
+
+
+% implement { name = "localboxmarkonce",
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/lowlevel/lowlevel-loops.tex b/Master/texmf-dist/doc/context/sources/general/manuals/lowlevel/lowlevel-loops.tex
new file mode 100644
index 00000000000..30a3ef64cfb
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/lowlevel/lowlevel-loops.tex
@@ -0,0 +1,327 @@
+% language=us runpath=texruns:manuals/lowlevel
+
+\environment lowlevel-style
+
+\startdocument
+ [title=loops,
+ color=middleyellow]
+
+\startsectionlevel[title=Introduction]
+
+I have hesitated long before I finally decided to implement native loops in
+\LUAMETATEX. Among the reasons against such a feature is that one can define
+macros that do loops (preferably using tail recursion). When you don't need an
+expandable loop, counters can be used, otherwise there are dirty and obscure
+tricks that can be of help. This is often the area where tex programmers can show
+off but the fact remains that we're using side effects of the expansion machinery
+and specific primitives like \type {\romannumeral} magic. In \LUAMETATEX\ it is
+actually possible to use the local control mechanism to hide loop counter advance
+and checking but that comes with at a performance hit. And, no matter what tricks
+one used, tracing becomes pretty much cluttered.
+
+In the next sections we describe the new native loop primitives in \LUAMETATEX\ as
+well as the more traditional \CONTEXT\ loop helpers.
+
+\stopsectionlevel
+
+\startsectionlevel[title=Primitives]
+
+Because \METAPOST, which is also a macro language, has native loops, it makes
+sense to also have native loops in \TEX\ and in \LUAMETATEX\ it was not that hard
+to add it. One variant uses the local control mechanism which is reflected in its
+name and two others collect expanded bodies. In the local loop content gets
+injected as we go, so this one doesn't work well in for instance an \type
+{\edef}. The macro takes the usual three loop numbers as well as a token list:
+
+\starttyping[option=TEX]
+\localcontrolledloop 1 100000 1 {%
+ % body
+}
+\stoptyping
+
+Here is an example of usage:
+
+\startbuffer
+\localcontrolledloop 1 5 1 {%
+ [\number\currentloopiterator]
+ \localcontrolledloop 1 10 1 {%
+ (\number\currentloopiterator)
+ }%
+ [\number\currentloopiterator]
+ \par
+}
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+The \type {\currentloopiterator} is a numeric token so you need to explicitly
+serialize it with \type {\number} or \type {\the} if you want it to be typeset:
+
+\startpacked \getbuffer \stoppacked
+
+Here is another example. This time we also show the current nesting:
+
+\startbuffer
+\localcontrolledloop 1 100 1 {%
+ \ifnum\currentloopiterator>6\relax
+ \quitloop
+ \else
+ [\number\currentloopnesting:\number\currentloopiterator]
+ \localcontrolledloop 1 8 1 {%
+ (\number\currentloopnesting:\number\currentloopiterator)
+ }\par
+ \fi
+}
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+Watch the \type {\quitloop}: it will end the loop at the {\em next} iteration so
+any content after it will show up. Normally this one will be issued in a
+condition and we want to end that properly.
+
+\startpacked \getbuffer \stoppacked
+
+The three loop variants all perform differently:
+
+\startbuffer
+l:\testfeatureonce {1000} {\localcontrolledloop 1 2000 1 {\relax}} %
+ \elapsedtime
+e:\testfeatureonce {1000} {\expandedloop 1 2000 1 {\relax}} %
+ \elapsedtime
+u:\testfeatureonce {1000} {\unexpandedloop 1 2000 1 {\relax}} %
+ \elapsedtime
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+An unexpanded loop is (of course) the fastest because it only collects and then
+feeds back the lot. In an expanded loop each cycle does an expansion of the body
+and collects the result which is then injected afterwards, and the controlled
+loop just expands the body each iteration.
+
+\startlines\tttf \getbuffer \stoplines
+
+The different behavior is best illustrated with the following example:
+
+\startbuffer[definition]
+\edef\TestA{\localcontrolledloop 1 5 1 {A}} % out of order
+\edef\TestB{\expandedloop 1 5 1 {B}}
+\edef\TestC{\unexpandedloop 1 5 1 {C\relax}}
+\stopbuffer
+
+\typebuffer[definition][option=TEX]
+
+We can show the effective definition:
+
+\startbuffer[example]
+\meaningasis\TestA
+\meaningasis\TestB
+\meaningasis\TestC
+
+A: \TestA
+B: \TestB
+C: \TestC
+\stopbuffer
+
+\typebuffer[example][option=TEX]
+
+Watch how the first test pushes the content in the main input stream:
+
+\startlines\tttf \getbuffer[definition,example]\stoplines
+
+Here are some examples that show what gets expanded and what not:
+
+\startbuffer
+\edef\whatever
+ {\expandedloop 1 10 1
+ {(\number\currentloopiterator)
+ \scratchcounter=\number\currentloopiterator\relax}}
+
+\meaningasis\whatever
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+\startpacked \veryraggedright \tt\tfx \getbuffer \stoppacked
+
+A local control encapsulation hides the assignment:
+
+\startbuffer
+\edef\whatever
+ {\expandedloop 1 10 1
+ {(\number\currentloopiterator)
+ \beginlocalcontrol
+ \scratchcounter=\number\currentloopiterator\relax
+ \endlocalcontrol}}
+
+\meaningasis\whatever
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+\blank \start \veryraggedright \tt\tfx \getbuffer \stop \blank
+
+Here we see the assignment being retained but with changing values:
+
+\startbuffer
+\edef\whatever
+ {\unexpandedloop 1 10 1
+ {\scratchcounter=1\relax}}
+
+\meaningasis\whatever
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+\blank \start \veryraggedright \tt\tfx \getbuffer \stop \blank
+
+We get no expansion at all:
+
+\startbuffer
+\edef\whatever
+ {\unexpandedloop 1 10 1
+ {\scratchcounter=\the\currentloopiterator\relax}}
+
+\meaningasis\whatever
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+\blank \start \veryraggedright \tt\tfx \getbuffer \stop \blank
+
+And here we have a mix:
+
+\startbuffer
+\edef\whatever
+ {\expandedloop 1 10 1
+ {\scratchcounter=\the\currentloopiterator\relax}}
+
+\meaningasis\whatever
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+\blank \start \veryraggedright \tt\tfx \getbuffer \stop \blank
+
+There is one feature worth noting. When you feed three numbers in a row, like here,
+there is a danger of them being seen as one:
+
+\starttyping
+\expandedloop
+ \number\dimexpr1pt
+ \number\dimexpr2pt
+ \number\dimexpr1pt
+ {}
+\stoptyping
+
+This gives an error because a too large number is seen. Therefore, these loops
+permit leading equal signs, as in assignments (we could support keywords but
+it doesn't make much sense):
+
+\starttyping
+\expandedloop =\number\dimexpr1pt =\number\dimexpr2pt =\number\dimexpr1pt{}
+\stoptyping
+
+\stopsectionlevel
+
+\startsectionlevel[title=Wrappers]
+
+We always had loop helpers in \CONTEXT\ and the question is: \quotation {What we
+will gain when we replace the definitions with ones using the above?}. The answer
+is: \quotation {We have little performance but not as much as one expects!}. This
+has to do with the fact that we support \type {#1} as iterator and \type {#2} as
+(verbose) nesting values and that comes with some overhead. It is also the reason
+why these loop macros are protected (unexpandable). However, using the primitives
+might look somewhat more natural in low level \TEX\ code.
+
+Also, replacing their definitions can have side effects because the primitives are
+(and will be) still experimental so it's typically a patch that I will run on my
+machine for a while.
+
+Here is an example of two loops. The inner state variables have one hash, the outer
+one extra:
+
+\startbuffer
+\dorecurse{2}{
+ \dostepwiserecurse{1}{10}{2}{
+ (#1:#2) [##1:##2]
+ }\par
+}
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+We get this:
+
+\startpacked \getbuffer \stoppacked
+
+We can also use two state macro but here we would have to store the outer ones:
+
+\startbuffer
+\dorecurse {2} {
+ /\recursedepth:\recurselevel/
+ \dostepwiserecurse {1} {10} {2} {
+ <\recursedepth:\recurselevel>
+ }\par
+}
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+That gives us:
+
+\startpacked \getbuffer \stoppacked
+
+An endless loop works as follows:
+
+\startbuffer
+\doloop {
+ ...
+ \ifsomeconditionismet
+ ...
+ \exitloop
+ \else
+ ...
+ \fi
+ % \exitloopnow
+ ...
+}
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+Because of the way we quit there will not be a new implementation in terms of
+the loop primitives. You need to make sure that you don't leave in the middle
+of an ongoing condition. The second exit is immediate.
+
+We also have a (simple) expanded variant:
+
+\startbuffer
+\edef\TestX{\doexpandedrecurse{10}{!}} \meaningasis\TestX
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+This helper can be implemented in terms of the loop primitives which makes them a
+bit faster, but these are not critical:
+
+\startpacked \getbuffer \stoppacked
+
+A variant that supports \type {#1} is the following:
+
+\startbuffer
+\edef\TestX{\doexpandedrecursed{10}{#1}} \meaningasis\TestX
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+So:
+
+\startpacked \getbuffer \stoppacked
+
+% private: \dofastloopcs{#1}\cs with % \fastloopindex and \fastloopfinal
+
+\stopsectionlevel
+
+\stopdocument
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/lowlevel/lowlevel-macros.tex b/Master/texmf-dist/doc/context/sources/general/manuals/lowlevel/lowlevel-macros.tex
index ef527732be3..83e43818f08 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/lowlevel/lowlevel-macros.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/lowlevel/lowlevel-macros.tex
@@ -1,4 +1,4 @@
-% language=us
+% language=us runpath=texruns:manuals/lowlevel
% Extending the macro argument parser happened stepwise and at each step a bit of
% \CONTEXT\ code was adapted for testing. At the beginning of October the 20201010
@@ -14,7 +14,6 @@
% \permanent\tolerant\protected\def\xx[#1]#*#;[#2]#:#3% loops .. todo
-
\usemodule[system-tokens]
\environment lowlevel-style
@@ -23,7 +22,7 @@
[title=macros,
color=middleorange]
-\startsection[title=Preamble]
+\startsectionlevel[title=Preamble]
This chapter overlaps with other chapters but brings together some extensions to
the macro definition and expansion parts. As these mechanisms were stepwise
@@ -34,9 +33,9 @@ have \TEX\ act like before. We keep the charm of the macro language but these
additions make for easier definitions, but (at least initially) none that could
not be done before using more code.
-\stopsection
+\stopsectionlevel
-\startsection[title=Definitions]
+\startsectionlevel[title=Definitions]
A macro definition normally looks like like this: \footnote {The \type
{\dontleavehmode} command make the examples stay on one line.}
@@ -540,12 +539,33 @@ a use for \type {#<} and \type {#>}. A summary of all this is given here:
\NC * \NC ignore spaces \NC \NR
\NC : \NC pick up scanning here \NC \NR
\NC ; \NC quit scanning \NC \NR
+\ML
+\NC . \NC ignore pars and spaces \NC \NR
+\NC , \NC push back space when quit \NC \NR
\LL
\stoptabulate
-\stopsection
+The last two have not been discussed and were added later. The period
+directive gobbles space and par tokens and discards them in the
+process. The comma directive is like \type {*} but it pushes back a space
+when the matching quits.
+
+\startbuffer
+\tolerant\def\FooA[#1]#*[#2]{(#1/#2)} % remove spaces
+\tolerant\def\FooB[#1]#,[#2]{(#1/#2)} % push back space
+
+/\FooA/ /\FooA / /\FooA[1]/ /\FooA[!] / /\FooA[1] [2]/ /\FooA[1] [2] /\par
+/\FooB/ /\FooB / /\FooB[1]/ /\FooB[!] / /\FooB[1] [2]/ /\FooB[1] [2] /\par
+\stopbuffer
+
+\typebuffer[example][option=TEX] \startpacked \getbuffer[example] \stoppacked
+
+Gobbling spaces versus pushing back is an interface design decision because it
+has to do with consistency.
-\startsection[title=Runaway arguments]
+\stopsectionlevel
+
+\startsectionlevel[title=Runaway arguments]
There is a particular troublesome case left: a runaway argument. The solution is
not pretty but it's the only way: we need to tell the parser that it can quit.
@@ -591,9 +611,9 @@ offset by some inefficient styling. Of course another gain of loosing some
indirectness is that error messages point to the macro that the user called for
and not to some follow up.
-\stopsection
+\stopsectionlevel
-\startsection[title=Introspection]
+\startsectionlevel[title=Introspection]
A macro has a meaning. You can serialize that meaning as follows:
@@ -639,7 +659,9 @@ macro is a special version of the online variant:
That one is always available and shows a similar list on the console. Again, users
normally don't want to know such details.
-\startsection[title=nesting]
+\stopsectionlevel
+
+\startsectionlevel[title=nesting]
You can nest macros, as in:
@@ -738,9 +760,9 @@ sure I do know why I dislike some languages for it). The \TEX\ system is not the
only one where dollars, percent signs, ampersands and hashes have special
meaning.
-\stopsection
+\stopsectionlevel
-\startsection[title=Prefixes]
+\startsectionlevel[title=Prefixes]
Traditional \TEX\ has three prefixes that can be used with macros: \type {\global},
\type {\outer} and \type {\long}. The last two are no|-|op's in \LUAMETATEX\ and
@@ -812,10 +834,10 @@ these can easily be fixed. So, it will be used but it will take a while to adapt
the code base.
One problem with frozen macros is that they don't play nice with for instance
-\type {\futurelet}. Also, there are places in \CONTEXT\ where we actually do
+\typ {\futurelet}. Also, there are places in \CONTEXT\ where we actually do
redefine some core macro that we also want to protect from redefinition by a
-user. One can of course \type {\unletfrozen} such a command first but as a bonus
-we have a prefix \type {\overloaded} that can be used as prefix. So, one can easily
+user. One can of course \typ {\unletfrozen} such a command first but as a bonus
+we have a prefix \typ {\overloaded} that can be used as prefix. So, one can easily
redefine a frozen macro but it takes a little effort. After all, this feature is
mainly meant to protect a user for side effects of definitions, and not as final
blocker. \footnote {As usual adding features like this takes some experimenting
@@ -824,7 +846,7 @@ The fact that we can apply such features in large macro package like \CONTEXT\
helps figuring out the needs and best approaches.}
A frozen macro can still be overloaded, so what if we want to prevent that? For
-this we have the \type {\permanent} prefix. Internally we also create primitives
+this we have the \typ {\permanent} prefix. Internally we also create primitives
but we don't have a prefix for that. But we do have one for a very special case
which we demonstrate with an example:
@@ -881,24 +903,110 @@ The level of checking is controlled with the \type {\overloadmode} but I'm still
not sure about how many levels we need there. A zero value disables checking,
the values 1 and 3 give warnings and the values 2 and 4 trigger an error.
-\stopsection
+\stopsectionlevel
-\stopdocument
+\startsectionlevel[title=Arguments]
+
+The number of arguments that a macro takes is traditionally limited to nine (or
+ten if one takes the trailing \type {#} into account). That this is enough for
+most cases is demonstrated by the fact that \CONTEXT\ has only a handful of
+macros that use \type {#9}. The reason for this limitation is in part a side
+effect of the way the macro preamble and arguments are parsed. However, because
+in \LUAMETATEX\ we use a different implementation, it was not that hard to permit
+a few more arguments, which is why we support upto 15 arguments, as in:
+
+\starttyping[option=TEX]
+\def\foo#1#2#3#4#5#6#7#8#9#A#B#C#D#E#F{...}
+\stoptyping
+
+We can support the whole alphabet without much trouble but somehow sticking to
+the hexadecimal numbers makes sense. It is unlikely that the core of \CONTEXT\
+will use this option but sometimes at the user level it can be handy. The penalty
+in terms of performance can be neglected.
+
+\starttyping[option=TEX]
+\tolerant\def\foo#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=%
+ {(#1)(#2)(#3)(#4)(#5)(#6)(#7)(#8)(#9)(#A)(#B)(#C)(#D)(#E)(#F)}
+
+\foo{1}{2}
+\stoptyping
+
+In the previous example we have 15 optional arguments where braces are mandate
+(otherwise we the scanner happily scoops up what follows which for sure gives some
+error).
+
+\stopsectionlevel
-freezing pitfalls:
+\startsectionlevel[title=Constants]
-- \futurelet : \overloaded needed
-- \let : \overloaded sometimes needed
+The \LUAMETATEX\ engine has lots of efficiency tricks in the macro parsing and
+expansion code that makes it not only fast but also let is use less memory.
+However, every time that the body of a macro is to be injected the expansion
+machinery kicks in. This often means that a copy is made (pushed in the input and
+used afterwards). There are however cases where the body is just a list of
+character tokens (with category letter or other) and no expansion run over the
+list is needed.
-primitive protection:
+It is tempting to introduce a string data type that just stores strings and
+although that might happen at some point it has the disadvantage that one need to
+tokenize that string in order to be able to use it, which then defeats the gain.
+An alternative has been found in constant macros, that is: a macro without
+parameters and a body that is considered to be expanded and never freed by
+redefinition. There are two variants:
-\newif\iffoo \footrue \foofalse : problem when we make iftrue and iffalse
-permanent ... they inherit, so we can't let them, we need a not permanent
-alias which is again tricky ... something native?
+\starttyping[option=TEX]
+\cdef \foo {whatever}
+\cdefcsname foo\endcsname{whatever}
+\stoptyping
+
+These are actually just equivalents to
+
+\starttyping[option=TEX]
+\edef \foo {whatever}
+\edefcsname foo\endcsname{whatever}
+\stoptyping
-immutable : still \count000 but we can consider blocking that, for instance
-by \def\count{some error}
+just to make sure that the body gets expanded at definition time but they are
+also marked as being constant which in some cases might give some gain, for
+instance when used in csname construction. The gain is less then one expects
+although there are a few cases in \CONTEXT\ where extreme usage of parameters
+benefits from it. Users are unlikely to use these two primitives.
-\defcsname
-\edefcsname
-\letcsname
+Another example of a constant usage is this:
+
+\starttyping[option=TEX]
+\lettonothing\foo
+\stoptyping
+
+which gives \type {\foo} an empty body. That one is used in the core, if only because
+it gives a bit smaller code. Performance is no that different from
+
+\starttyping[option=TEX]
+\let\foo\empty
+\stoptyping
+
+but it saves one token (8 bytes) when used in a macro. The assignment itself is
+not that different because \type {\foo} is made an alias to \type {\empty} which
+in turn only needs incrementing a reference counter.
+
+\stopsectionlevel
+
+\stopdocument
+
+% freezing pitfalls:
+%
+% - \futurelet : \overloaded needed
+% - \let : \overloaded sometimes needed
+%
+% primitive protection:
+%
+% \newif\iffoo \footrue \foofalse : problem when we make iftrue and iffalse
+% permanent ... they inherit, so we can't let them, we need a not permanent
+% alias which is again tricky ... something native?
+%
+% immutable : still \count000 but we can consider blocking that, for instance
+% by \def\count{some error}
+%
+% \defcsname
+% \edefcsname
+% \letcsname
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/lowlevel/lowlevel-marks.tex b/Master/texmf-dist/doc/context/sources/general/manuals/lowlevel/lowlevel-marks.tex
new file mode 100644
index 00000000000..0ea92f150ce
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/lowlevel/lowlevel-marks.tex
@@ -0,0 +1,511 @@
+% language=us runpath=texruns:manuals/lowlevel
+
+\environment lowlevel-style
+
+\startdocument
+ [title=marks,
+ color=middlemagenta]
+
+\startsectionlevel[title=Introduction]
+
+Marks are one of the subsystems of \TEX, as are for instance alignments and math
+as well as inserts which they share some properties with. Both inserts and marks
+put signals in the list that later on get intercepted and can be used to access
+stored information. In the case of inserts this is typeset materials, like
+footnotes, and in the case of marks it's token lists. Inserts are taken into
+account when breaking pages, and marks show up when a page has been broken and is
+presented to the output routine. Marks are used for running headers but other
+applications are possible.
+
+In \MKII\ marks are used to keep track of colors, transparencies and more
+properties that work across page boundaries. It permits picking up at the top of
+a page from where one left at the bottom of the preceding one. When \MKII\ was
+written there was only one mark so on top of that a multiple mark mechanism was
+implemented that filtered specific marks from a collection. Later, \ETEX\
+provided mark classes so that mechanism could be simplified. Although it is not
+that hard to do, this extension to \TEX\ didn't add any further features, so we
+can assume that there was no real demand for that. \footnote {This is probably
+true for most \LUATEX\ and \LUAMETATEX\ extensions, maybe example usage create
+retrospective demand. But one reason for picking up on engine development is that
+in the \CONTEXT\ perspective we actually had some demands.}
+
+But, marks have some nasty limitations, so from the \CONTEXT\ perspective there
+always was something to wish for. When you hide marks in boxes they will not be
+seen (the same is true for inserts). You cannot really reset them either. Okay,
+you can set them to nothing, but even then already present marks are still there.
+The \LUATEX\ engine has a \type {\clearmarks} primitive but that works global. In
+\LUAMETATEX\ a proper mark flusher is available. That engine also can work around
+the deeply nested disappearing marks. In addition, the current state of a mark
+can be queried and we have some tracing facilities.
+
+In \MKIV\ the engine's marks were not used at all and an alternative mechanism
+was written using \LUA. It actually is one of the older \MKIV\ features. It
+doesn't have the side effects that native marks have but it comes at the price of
+more overhead, although that is bearable.
+
+In this document we discuss marks but assume that \LUAMETATEX\ is used with
+\CONTEXT\ \LMTX. There we experiment with using the native marks, complemented by
+a few \LUA\ mechanisms, but it is to be seen if that will be either a replacement
+or an alternative.
+
+\stopsectionlevel
+
+\startsectionlevel[title=The basics]
+
+Although the original \TEX\ primitives are there, the plural \ETEX\ mark commands
+are to be used. Marks, signals with token lists, are set with:
+
+\starttyping[option=TEX]
+\marks0{This is mark 0} % equivalent to: \mark{This is mark 0}
+\marks4{This is mark 4}
+\stoptyping
+
+When a page has been split off, you can (normally this only makes sense in the
+output routine) access marks with:
+
+\starttyping[option=TEX]
+\topmarks 4
+\firstmarks4
+\botmarks 4
+\stoptyping
+
+A \quote {top} mark is the last one on the previous page(s), the \quote {first}
+and \quote {bottom} refer to the current page. A mark is a so called node,
+something that ends up in the current list and the token list is stored with it.
+The accessors are just commands and they fetch the token list from a separately
+managed storage. When you set or access a mark that has not yet been used, the
+storage is bumped to the right size, so it doesn't make sense to use e.g. \type
+{\marks 999} when there are no 998 ones too: it not only takes memory, it also
+makes \TEX\ run over all these mark stores when synchronization happens. The best
+way to make sure that you are sparse is:
+
+\starttyping[option=TEX]
+\newmarks\MyMark
+\stoptyping
+
+Currently the first 16 marks are skipped so this makes \type {\MyMark} become
+mark 17. The reason is that we want to make sure that users who experiment with
+marks have some scratch marks available and don't overload system defined ones.
+Future versions of \CONTEXT\ might become more restrictive.
+
+Marks can be cleared with:
+
+\starttyping[option=TEX]
+\clearmarks 4
+\stoptyping
+
+which clears the storage that keeps the top, first and bot marks. This happens
+immediately. You can delay this by putting a signal in the list:
+
+\starttyping[option=TEX]
+\flushmarks 4
+\stoptyping
+
+This (\LUAMETATEX) feature makes it for instance easy to reset marks that keep
+track of section (and lower) titles when a new chapter starts. Of course it still
+means that one has to implement some mechanism that deals with this but \CONTEXT\
+always had that.
+
+The current, latest assigned, value of a mark is available too:
+
+\starttyping[option=TEX]
+\currentmarks 4
+\stoptyping
+
+Using this value in for instance headers and footers makes no sense because the
+last node set can be on a following page.
+
+\stopsectionlevel
+
+\startsectionlevel[title=Migration]
+
+In the introduction we mentioned that \LUAMETATEX\ has migration built in. In
+\MKIV\ we have this as option too, but there it is delegated to \LUA. It permits
+deeply nested inserts (notes) and marks (but we don't use native marks in \MKIV).
+
+Migrated marks end up in the postmigrated sublist of a box. In other lowlevel
+manuals we discuss these pre- and postmigrated sublists. As example we use this
+definition:
+
+\startbuffer
+\setbox0\vbox\bgroup
+test \marks 4 {mark 4.1}\par
+test \marks 4 {mark 4.1}\par
+test \marks 4 {mark 4.1}\par
+\egroup
+\stopbuffer
+
+\typebuffer[option=TEX]
+
+% {\automigrationmode"FF \getbuffer\showbox0}
+% {\automigrationmode"00 \getbuffer\showbox0}
+
+When we turn migration on (officially the second bit):
+
+\starttyping[option=TEX]
+\automigrationmode"FF \showbox0
+\stoptyping
+
+we get this:
+
+\start \switchtobodyfont[5pt]
+\starttyping[option=TEX]
+> \box0=
+2:4: \vbox[normal][...], width 483.69687, height 63.43475, depth 0.15576, direction l2r
+2:4: .\list
+2:4: ..\hbox[line][...], width 483.69687, height 7.48193, depth 0.15576, glue 459.20468fil, direction l2r
+2:4: ...\list
+2:4: ....\glue[left hang][...] 0.0pt
+2:4: ....\glue[left][...] 0.0pt
+2:4: ....\glue[parfillleft][...] 0.0pt
+2:4: ....\par[newgraf][...], hangafter 1, hsize 483.69687, pretolerance 100, tolerance 200, adjdemerits 10000, linepenalty 10, doublehyphendemerits 10000, finalhyphendemerits 5000, clubpenalty 2000, widowpenalty 2000, brokenpenalty 100, parfillskip 0.0pt plus 1.0fil, hyphenationmode 499519
+2:4: ....\glue[indent][...] 0.0pt
+2:4: ....\glyph[32768][...], language (n=1,l=2,r=3), hyphenationmode "79F3F, options "80, font <8: DejaVuSerif @ 11.0pt>, glyph U+000074 t
+2:4: ....\glyph[32768][...], language (n=1,l=2,r=3), hyphenationmode "79F3F, options "80, font <8: DejaVuSerif @ 11.0pt>, glyph U+000065 e
+2:4: ....\glyph[32768][...], language (n=1,l=2,r=3), hyphenationmode "79F3F, options "80, font <8: DejaVuSerif @ 11.0pt>, glyph U+000073 s
+2:4: ....\glyph[32768][...], language (n=1,l=2,r=3), hyphenationmode "79F3F, options "80, font <8: DejaVuSerif @ 11.0pt>, glyph U+000074 t
+2:4: ....\glue[space][...] 3.49658pt plus 1.74829pt minus 1.16553pt, font 8
+2:4: ....\penalty[line][...] 10000
+2:4: ....\glue[parfill][...] 0.0pt plus 1.0fil
+2:4: ....\glue[right][...] 0.0pt
+2:4: ....\glue[right hang][...] 0.0pt
+2:4: ..\glue[par][...] 11.98988pt plus 3.99663pt minus 3.99663pt
+2:4: ..\glue[baseline][...] 8.34883pt
+2:4: ..\hbox[line][...], width 483.69687, height 7.48193, depth 0.15576, glue 459.20468fil, direction l2r
+2:4: ...\list
+2:4: ....\glue[left hang][...] 0.0pt
+2:4: ....\glue[left][...] 0.0pt
+2:4: ....\glue[parfillleft][...] 0.0pt
+2:4: ....\par[newgraf][...], hangafter 1, hsize 483.69687, pretolerance 100, tolerance 200, adjdemerits 10000, linepenalty 10, doublehyphendemerits 10000, finalhyphendemerits 5000, clubpenalty 2000, widowpenalty 2000, brokenpenalty 100, parfillskip 0.0pt plus 1.0fil, hyphenationmode 499519
+2:4: ....\glue[indent][...] 0.0pt
+2:4: ....\glyph[32768][...], language (n=1,l=2,r=3), hyphenationmode "79F3F, options "80, font <8: DejaVuSerif @ 11.0pt>, glyph U+000074 t
+2:4: ....\glyph[32768][...], language (n=1,l=2,r=3), hyphenationmode "79F3F, options "80, font <8: DejaVuSerif @ 11.0pt>, glyph U+000065 e
+2:4: ....\glyph[32768][...], language (n=1,l=2,r=3), hyphenationmode "79F3F, options "80, font <8: DejaVuSerif @ 11.0pt>, glyph U+000073 s
+2:4: ....\glyph[32768][...], language (n=1,l=2,r=3), hyphenationmode "79F3F, options "80, font <8: DejaVuSerif @ 11.0pt>, glyph U+000074 t
+2:4: ....\glue[space][...] 3.49658pt plus 1.74829pt minus 1.16553pt, font 8
+2:4: ....\penalty[line][...] 10000
+2:4: ....\glue[parfill][...] 0.0pt plus 1.0fil
+2:4: ....\glue[right][...] 0.0pt
+2:4: ....\glue[right hang][...] 0.0pt
+2:4: ..\glue[par][...] 11.98988pt plus 3.99663pt minus 3.99663pt
+2:4: ..\glue[baseline][...] 8.34883pt
+2:4: ..\hbox[line][...], width 483.69687, height 7.48193, depth 0.15576, glue 459.20468fil, direction l2r
+2:4: ...\list
+2:4: ....\glue[left hang][...] 0.0pt
+2:4: ....\glue[left][...] 0.0pt
+2:4: ....\glue[parfillleft][...] 0.0pt
+2:4: ....\par[newgraf][...], hangafter 1, hsize 483.69687, pretolerance 100, tolerance 200, adjdemerits 10000, linepenalty 10, doublehyphendemerits 10000, finalhyphendemerits 5000, clubpenalty 2000, widowpenalty 2000, brokenpenalty 100, parfillskip 0.0pt plus 1.0fil, hyphenationmode 499519
+2:4: ....\glue[indent][...] 0.0pt
+2:4: ....\glyph[32768][...], language (n=1,l=2,r=3), hyphenationmode "79F3F, options "80, font <8: DejaVuSerif @ 11.0pt>, glyph U+000074 t
+2:4: ....\glyph[32768][...], language (n=1,l=2,r=3), hyphenationmode "79F3F, options "80, font <8: DejaVuSerif @ 11.0pt>, glyph U+000065 e
+2:4: ....\glyph[32768][...], language (n=1,l=2,r=3), hyphenationmode "79F3F, options "80, font <8: DejaVuSerif @ 11.0pt>, glyph U+000073 s
+2:4: ....\glyph[32768][...], language (n=1,l=2,r=3), hyphenationmode "79F3F, options "80, font <8: DejaVuSerif @ 11.0pt>, glyph U+000074 t
+2:4: ....\glue[space][...] 3.49658pt plus 1.74829pt minus 1.16553pt, font 8
+2:4: ....\penalty[line][...] 10000
+2:4: ....\glue[parfill][...] 0.0pt plus 1.0fil
+2:4: ....\glue[right][...] 0.0pt
+2:4: ....\glue[right hang][...] 0.0pt
+2:4: .\postmigrated
+2:4: ..\mark[4][...]
+2:4: ..{mark 4.1}
+2:4: ..\mark[4][...]
+2:4: ..{mark 4.1}
+2:4: ..\mark[4][...]
+2:4: ..{mark 4.1}
+\stoptyping
+\stop
+
+When we don't migrate, enforced with:
+
+\starttyping[option=TEX]
+\automigrationmode"00 \showbox0
+\stoptyping
+
+the result is:
+
+\start \switchtobodyfont[5pt]
+\starttyping[option=TEX]
+> \box0=
+2:4: \vbox[normal][...], width 483.69687, height 63.43475, depth 0.15576, direction l2r
+2:4: .\list
+2:4: ..\hbox[line][...], width 483.69687, height 7.48193, depth 0.15576, glue 459.20468fil, direction l2r
+2:4: ...\list
+2:4: ....\glue[left hang][...] 0.0pt
+2:4: ....\glue[left][...] 0.0pt
+2:4: ....\glue[parfillleft][...] 0.0pt
+2:4: ....\par[newgraf][...], hangafter 1, hsize 483.69687, pretolerance 100, tolerance 200, adjdemerits 10000, linepenalty 10, doublehyphendemerits 10000, finalhyphendemerits 5000, clubpenalty 2000, widowpenalty 2000, brokenpenalty 100, parfillskip 0.0pt plus 1.0fil, hyphenationmode 499519
+2:4: ....\glue[indent][...] 0.0pt
+2:4: ....\glyph[32768][...], language (n=1,l=2,r=3), hyphenationmode "79F3F, options "80, font <8: DejaVuSerif @ 11.0pt>, glyph U+000074 t
+2:4: ....\glyph[32768][...], language (n=1,l=2,r=3), hyphenationmode "79F3F, options "80, font <8: DejaVuSerif @ 11.0pt>, glyph U+000065 e
+2:4: ....\glyph[32768][...], language (n=1,l=2,r=3), hyphenationmode "79F3F, options "80, font <8: DejaVuSerif @ 11.0pt>, glyph U+000073 s
+2:4: ....\glyph[32768][...], language (n=1,l=2,r=3), hyphenationmode "79F3F, options "80, font <8: DejaVuSerif @ 11.0pt>, glyph U+000074 t
+2:4: ....\glue[space][...] 3.49658pt plus 1.74829pt minus 1.16553pt, font 8
+2:4: ....\penalty[line][...] 10000
+2:4: ....\glue[parfill][...] 0.0pt plus 1.0fil
+2:4: ....\glue[right][...] 0.0pt
+2:4: ....\glue[right hang][...] 0.0pt
+2:4: ..\mark[4][...]
+2:4: ..{mark 4.1}
+2:4: ..\glue[par][...] 11.98988pt plus 3.99663pt minus 3.99663pt
+2:4: ..\glue[baseline][...] 8.34883pt
+2:4: ..\hbox[line][...], width 483.69687, height 7.48193, depth 0.15576, glue 459.20468fil, direction l2r
+2:4: ...\list
+2:4: ....\glue[left hang][...] 0.0pt
+2:4: ....\glue[left][...] 0.0pt
+2:4: ....\glue[parfillleft][...] 0.0pt
+2:4: ....\par[newgraf][...], hangafter 1, hsize 483.69687, pretolerance 100, tolerance 200, adjdemerits 10000, linepenalty 10, doublehyphendemerits 10000, finalhyphendemerits 5000, clubpenalty 2000, widowpenalty 2000, brokenpenalty 100, parfillskip 0.0pt plus 1.0fil, hyphenationmode 499519
+2:4: ....\glue[indent][...] 0.0pt
+2:4: ....\glyph[32768][...], language (n=1,l=2,r=3), hyphenationmode "79F3F, options "80, font <8: DejaVuSerif @ 11.0pt>, glyph U+000074 t
+2:4: ....\glyph[32768][...], language (n=1,l=2,r=3), hyphenationmode "79F3F, options "80, font <8: DejaVuSerif @ 11.0pt>, glyph U+000065 e
+2:4: ....\glyph[32768][...], language (n=1,l=2,r=3), hyphenationmode "79F3F, options "80, font <8: DejaVuSerif @ 11.0pt>, glyph U+000073 s
+2:4: ....\glyph[32768][...], language (n=1,l=2,r=3), hyphenationmode "79F3F, options "80, font <8: DejaVuSerif @ 11.0pt>, glyph U+000074 t
+2:4: ....\glue[space][...] 3.49658pt plus 1.74829pt minus 1.16553pt, font 8
+2:4: ....\penalty[line][...] 10000
+2:4: ....\glue[parfill][...] 0.0pt plus 1.0fil
+2:4: ....\glue[right][...] 0.0pt
+2:4: ....\glue[right hang][...] 0.0pt
+2:4: ..\mark[4][...]
+2:4: ..{mark 4.1}
+2:4: ..\glue[par][...] 11.98988pt plus 3.99663pt minus 3.99663pt
+2:4: ..\glue[baseline][...] 8.34883pt
+2:4: ..\hbox[line][...], width 483.69687, height 7.48193, depth 0.15576, glue 459.20468fil, direction l2r
+2:4: ...\list
+2:4: ....\glue[left hang][...] 0.0pt
+2:4: ....\glue[left][...] 0.0pt
+2:4: ....\glue[parfillleft][...] 0.0pt
+2:4: ....\par[newgraf][...], hangafter 1, hsize 483.69687, pretolerance 100, tolerance 200, adjdemerits 10000, linepenalty 10, doublehyphendemerits 10000, finalhyphendemerits 5000, clubpenalty 2000, widowpenalty 2000, brokenpenalty 100, parfillskip 0.0pt plus 1.0fil, hyphenationmode 499519
+2:4: ....\glue[indent][...] 0.0pt
+2:4: ....\glyph[32768][...], language (n=1,l=2,r=3), hyphenationmode "79F3F, options "80, font <8: DejaVuSerif @ 11.0pt>, glyph U+000074 t
+2:4: ....\glyph[32768][...], language (n=1,l=2,r=3), hyphenationmode "79F3F, options "80, font <8: DejaVuSerif @ 11.0pt>, glyph U+000065 e
+2:4: ....\glyph[32768][...], language (n=1,l=2,r=3), hyphenationmode "79F3F, options "80, font <8: DejaVuSerif @ 11.0pt>, glyph U+000073 s
+2:4: ....\glyph[32768][...], language (n=1,l=2,r=3), hyphenationmode "79F3F, options "80, font <8: DejaVuSerif @ 11.0pt>, glyph U+000074 t
+2:4: ....\glue[space][...] 3.49658pt plus 1.74829pt minus 1.16553pt, font 8
+2:4: ....\penalty[line][...] 10000
+2:4: ....\glue[parfill][...] 0.0pt plus 1.0fil
+2:4: ....\glue[right][...] 0.0pt
+2:4: ....\glue[right hang][...] 0.0pt
+2:4: ..\mark[4][...]
+2:4: ..{mark 4.1}
+\stoptyping
+\stop
+
+When you say \type {\showmakeup} or in this case \type {\showmakeup[mark]} the marks
+are visualized:
+
+\startlinecorrection
+ \startcombination
+ {\framed{\automigrationmode"FF \showmakeup[mark]\hsize2cm \getbuffer\box0}} {enabled}
+ {\framed{\automigrationmode"00 \showmakeup[mark]\hsize2cm \getbuffer\box0}} {disabled}
+ \stopcombination
+\stoplinecorrection
+
+Here \type {sm} means \quote {set mark} while \type {rm} would indicate a \quote
+{reset mark}. Of course migrated marks don't show up because these are bound to
+the box and thereby have become a a specific box property as can be seen in the
+above trace.
+
+\stopsectionlevel
+
+\startsectionlevel[title=Tracing]
+
+The \LUAMETATEX\ engine has a dedicated tracing option for marks. The fact that
+the traditional engine doesn't have this can be seen as indication that this is
+seldom needed.
+
+\starttyping[option=TEX]
+\tracingmarks1
+\tracingonline2
+\stoptyping
+
+When tracing is set to 1 we get a list of marks for the just split of page:
+
+\starttyping
+2:7: <mark class 51, top := bot>
+2:7: ..{sample 9.1}
+2:7: <mark class 51: first := mark>
+2:7: ..{sample 10.1}
+2:7: <mark class 51: bot := mark>
+2:7: ..{sample 10.1}
+2:7: <mark class 51, page state>
+2:7: ..top {sample 9.1}
+2:7: ..first {sample 10.1}
+2:7: ..bot {sample 10.1}
+\stoptyping
+
+When tracing is set to 2 you also get details we get a list of marks of the analysis:
+
+\starttyping
+1:9: <mark class 51, top := bot>
+1:9: ..{sample 5.1}
+1:9: <mark class 51: first := mark>
+1:9: ..{sample 6.1}
+1:9: <mark class 51: bot := mark>
+1:9: ..{sample 6.1}
+1:9: <mark class 51: bot := mark>
+1:9: ..{sample 7.1}
+1:9: <mark class 51: bot := mark>
+1:9: ..{sample 8.1}
+1:9: <mark class 51: bot := mark>
+1:9: ..{sample 9.1}
+1:9: <mark class 51, page state>
+1:9: ..top {sample 5.1}
+1:9: ..first {sample 6.1}
+1:9: ..bot {sample 9.1}
+\stoptyping
+
+\stopsectionlevel
+
+\startsectionlevel[title=High level commands]
+
+I think that not that many users define their own marks. They are useful for
+showing section related titles in headers and footers but the implementation of
+that is hidden. The native mark references are \type {top}, \type {first} and
+\type {bottom} but in the \CONTEXT\ interface we use different keywords.
+
+\starttabulate[|||||]
+\FL
+\BC \CONTEXT \BC \TEX \BC column \BC page \NC \NR
+\ML
+\NC \type {previous} \NC top \NC last before sync \NC last on previous page \NC \NR
+%NC \type {next} \NC \NC first after sync \NC \NC \NR
+\NC \type {top} \NC first \NC first in sync \NC first on page \NC \NR
+\NC \type {bottom} \NC bot \NC last in sync \NC last on page \NC \NR
+\NC \type {first} \NC top \NC first not top in sync \NC first on page \NC \NR
+\NC \type {last} \NC bot \NC last not bottom in sync \NC last on page \NC \NR
+\ML
+\NC \type {default} \NS[2][c] the same as \type {first} \NC \NR
+\NC \type {current} \NS[2][c] the last set value \NC \NR
+\LL
+\stoptabulate
+
+In order to separate marks in \CONTEXT\ from those in \TEX, the term \quote
+{marking} is used. In \MKIV\ the regular marks mechanism is of course there but,
+as mentioned, not used. By using a different namespace we could make the
+transition from \MKII\ to \MKIV\ (the same is true for some more mechanisms).
+
+A marking is defined with
+
+\starttyping[option=TEX]
+\definemarking[MyMark]
+\stoptyping
+
+A defined marking can be set with two equivalent commands:
+
+\starttyping[option=TEX]
+\setmarking[MyMark]{content}
+\marking [MyMark]{content}
+\stoptyping
+
+The content is not typeset but stored as token list. In the sectioning mechanism
+that uses markings we don't even store titles, we store a reference to a title.
+In order to use that (deep down) we hook in a filter command. By default that command
+does nothing:
+
+\starttyping[option=TEX]
+\setupmarking[MyMark][filtercommand=\firstofoneargument]
+\stoptyping
+
+The token list does {\em not} get expanded by default, unless you set it up:
+
+\starttyping[option=TEX]
+\setupmarking[MyMark][expansion=yes]
+\stoptyping
+
+The current state of a marking can be cleared with:
+
+\starttyping[option=TEX]
+\clearmarking[MyMark]
+\stoptyping
+
+but because that en is not synchronized the real deal is:
+
+\starttyping[option=TEX]
+\resetmarking[MyMark]
+\stoptyping
+
+Be aware that it introduces a node in the list. You can test if a marking is
+defined with (as usual) a test macro. Contrary to (most) other test macros this
+one is fully expandable:
+
+\starttyping[option=TEX]
+\doifelsemarking {MyMark} {
+ defined
+} {
+ undefined
+}
+\stoptyping
+
+Because there can be a chain involved, we can relate markings. Think of sections
+below chapters and subsections below sections:
+
+\starttyping[option=TEX]
+\relatemarking[MyMark][YourMark]
+\stoptyping
+
+When a marking is set its relatives are also reset, so setting \type {YourMark}
+will reset \type {MyMark}. It is this kind of features that made for marks being
+wrapped into high level commands very early in the \CONTEXT\ development (and one
+can even argue that this is why a package like \CONTEXT\ exists in the first
+place).
+
+The rest of the (relatively small) repertoire of commands has to do with fetching
+markings. The general command is \type {\getmarking} that takes two or three
+arguments:
+
+\starttyping[option=TEX]
+\getmarking[MyMarking][first]
+\getmarking[MyMarking][page][first]
+\getmarking[MyMarking][page][first]
+\getmarking[MyMarking][column:1][first]
+\stoptyping
+
+There are (normally) three marks that can be fetched so we have three commands
+that do just that:
+
+\starttyping[option=TEX]
+\fetchonemark [MyMarking][which one]
+\fetchtwomarks[MyMarking]
+\fetchallmarks[MyMarking]
+\stoptyping
+
+You can setup a \type {separator} key which by default is:
+
+\starttyping[option=TEX]
+\setupmarking[MyMarking][separator=\space\emdash\space]
+\stoptyping
+
+Injection is enabled by default due to this default:
+
+\starttyping[option=TEX]
+\setupmarking[MyMarking][state=start]
+\stoptyping
+
+The following three variants are (what is called) fully expandable:
+
+\starttyping[option=TEX]
+\fetchonemarking [MyMarking][which one]
+\fetchtwomarkings[MyMarking]
+\fetchallmarkings[MyMarking]
+\stoptyping
+
+% \resetsynchronizemarking[#1]%
+% \synchronizemarking[#1][#2][#3]% (#3: options (no longer used))
+
+\stopsectionlevel
+
+\startsectionlevel[title=Pitfalls]
+
+The main pitfall is that a (re)setting a mark will inject a node which in
+vertical mode can interfere with spacing. In for instance section commands we
+wrap them with the title so there it should work out okay.
+
+\stopsectionlevel
+
+\stopdocument
+
+% Musical timestamp: videos showing up on YT with Nandi Bushell performing with
+% Dave Grohl (e.g. https://www.youtube.com/watch?v=_AVkGj41RuA) ... the highlight
+% of a nice and emotional thread of exchange between a young and capable energetic
+% drummer challenging an experienced musician. During the pandemic one could
+% witness quite some interesting musical experiments and Nandi and Yoyoka are some
+% inspiring discoveries.
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/lowlevel/lowlevel-paragraphs.tex b/Master/texmf-dist/doc/context/sources/general/manuals/lowlevel/lowlevel-paragraphs.tex
index 3098333f013..6543c079591 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/lowlevel/lowlevel-paragraphs.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/lowlevel/lowlevel-paragraphs.tex
@@ -1,4 +1,4 @@
-% language=us
+% language=us runpath=texruns:manuals/lowlevel
\environment lowlevel-style
@@ -6,7 +6,7 @@
[title=paragraphs,
color=middlecyan]
-\startsection[title=Introduction]
+\startsectionlevel[title=Introduction]
This manual is mostly discussing a few low level wrappers around low level \TEX\
features. Its writing is triggered by an update to the \METAFUN\ and \LUAMETAFUN\
@@ -29,9 +29,9 @@ they get enabled by default. \footnote {For this we have \type
them, make sure they don't interfere; they are not part of the updates, contrary
to \type {cont-new.mkxl}.}
-\stopsection
+\stopsectionlevel
-\startsection[title=Paragraphs]
+\startsectionlevel[title=Paragraphs]
Before we demonstrate some trickery, let's see what a paragraph is. Normally a
document source is formatted like this:
@@ -200,9 +200,9 @@ program it using macros: pickup a token, check and push it back when it's not a
par equivalent token. The primitive is is just nicer (and easier on the log when
tracing is enabled).
-\stopsection
+\stopsectionlevel
-\startsection[title=Properties]
+\startsectionlevel[title=Properties]
A paragraph is just a collection of lines that result from one input line that
got broken. This process of breaking into lines is influenced by quite some
@@ -218,46 +218,45 @@ longer interferes with the line break algorithm. The magic primitive is \type
{\snapshotpar} which takes a number made from categories mentioned below:
\starttabulate[|l|l|r|]
-\BC variable \BC category \BC code \NC \NR
-\NC \type {\hsize} \NC hsize \NC 0x\uchexnumbers\frozenhsizecode \NC \NR
-\NC \type {\leftskip} \NC skip \NC 0x\uchexnumbers\frozenskipcode \NC \NR
-\NC \type {\rightskip} \NC skip \NC 0x\uchexnumbers\frozenskipcode \NC \NR
-\NC \type {\hangindent} \NC hang \NC 0x\uchexnumbers\frozenhangcode \NC \NR
-\NC \type {\hangafter} \NC hang \NC 0x\uchexnumbers\frozenhangcode \NC \NR
-\NC \type {\parindent} \NC indent \NC 0x\uchexnumbers\frozenindentcode \NC \NR
-\NC \type {\parfillleftskip} \NC par fill \NC 0x\uchexnumbers\frozenparfillcode \NC \NR
-\NC \type {\parfillrightskip} \NC par fill \NC 0x\uchexnumbers\frozenparfillcode \NC \NR
-\NC \type {\adjustspacing} \NC adjust \NC 0x\uchexnumbers\frozenadjustcode \NC \NR
-\NC \type {\adjustspacingstep} \NC adjust \NC 0x\uchexnumbers\frozenadjustcode \NC \NR
-\NC \type {\adjustspacingshrink} \NC adjust \NC 0x\uchexnumbers\frozenadjustcode \NC \NR
-\NC \type {\adjustspacingstretch} \NC adjust \NC 0x\uchexnumbers\frozenadjustcode \NC \NR
-\NC \type {\protrudechars} \NC protrude \NC 0x\uchexnumbers\frozenprotrudecode \NC \NR
-\NC \type {\pretolerance} \NC tolerance \NC 0x\uchexnumbers\frozentolerancecode \NC \NR
-\NC \type {\tolerance} \NC tolerance \NC 0x\uchexnumbers\frozentolerancecode \NC \NR
-\NC \type {\emergencystretch} \NC stretch \NC 0x\uchexnumbers\frozenstretchcode \NC \NR
-\NC \type {\looseness} \NC looseness \NC 0x\uchexnumbers\frozenloosenesscode \NC \NR
-\NC \type {\lastlinefit} \NC last line \NC 0x\uchexnumbers\frozenlastlinecode \NC \NR
-\NC \type {\linepenalty} \NC line penalty \NC 0x\uchexnumbers\frozenlinepenaltycode \NC \NR
-\NC \type {\interlinepenalty} \NC line penalty \NC 0x\uchexnumbers\frozenlinepenaltycode \NC \NR
-\NC \type {\interlinepenalties} \NC line penalty \NC 0x\uchexnumbers\frozenlinepenaltycode \NC \NR
-\NC \type {\clubpenalty} \NC club penalty \NC 0x\uchexnumbers\frozenclubpenaltycode \NC \NR
-\NC \type {\clubpenalties} \NC club penalty \NC 0x\uchexnumbers\frozenclubpenaltycode \NC \NR
-\NC \type {\widowpenalty} \NC widow penalty \NC 0x\uchexnumbers\frozenwidowpenaltycode \NC \NR
-\NC \type {\widowpenalties} \NC widow penalty \NC 0x\uchexnumbers\frozenwidowpenaltycode \NC \NR
-\NC \type {\displaywidowpenalty} \NC display penalty \NC 0x\uchexnumbers\frozendisplaypenaltycode \NC \NR
-\NC \type {\displaywidowpenalties} \NC display penalty \NC 0x\uchexnumbers\frozendisplaypenaltycode \NC \NR
-\NC \type {\brokenpenalty} \NC broken penalty \NC 0x\uchexnumbers\frozenbrokenpenaltycode \NC \NR
-\NC \type {\adjdemerits} \NC demerits \NC 0x\uchexnumbers\frozendemeritscode \NC \NR
-\NC \type {\doublehyphendemerits} \NC demerits \NC 0x\uchexnumbers\frozendemeritscode \NC \NR
-\NC \type {\finalhyphendemerits} \NC demerits \NC 0x\uchexnumbers\frozendemeritscode \NC \NR
-\NC \type {\parshape} \NC shape \NC 0x\uchexnumbers\frozenshapecode \NC \NR
-\NC \type {\baselineskip} \NC line \NC 0x\uchexnumbers\frozenlinecode \NC \NR
-\NC \type {\lineskip} \NC line \NC 0x\uchexnumbers\frozenlinecode \NC \NR
-\NC \type {\lineskiplimit} \NC line \NC 0x\uchexnumbers\frozenlinecode \NC \NR
-\NC \type {\hyphenationmode} \NC hyphenation \NC 0x\uchexnumbers\frozenhyphenationcode \NC \NR
+\BC variable \BC category \BC code \NC \NR
+\NC \type {\hsize} \NC hsize \NC 0x\uchexnumbers\hsizefrozenparcode \NC \NR
+\NC \type {\leftskip} \NC skip \NC 0x\uchexnumbers\skipfrozenparcode \NC \NR
+\NC \type {\rightskip} \NC skip \NC 0x\uchexnumbers\skipfrozenparcode \NC \NR
+\NC \type {\hangindent} \NC hang \NC 0x\uchexnumbers\hangfrozenparcode \NC \NR
+\NC \type {\hangafter} \NC hang \NC 0x\uchexnumbers\hangfrozenparcode \NC \NR
+\NC \type {\parindent} \NC indent \NC 0x\uchexnumbers\indentfrozenparcode \NC \NR
+\NC \type {\parfillleftskip} \NC par fill \NC 0x\uchexnumbers\parfillfrozenparcode \NC \NR
+\NC \type {\parfillrightskip} \NC par fill \NC 0x\uchexnumbers\parfillfrozenparcode \NC \NR
+\NC \type {\adjustspacing} \NC adjust \NC 0x\uchexnumbers\adjustfrozenparcode \NC \NR
+\NC \type {\adjustspacingstep} \NC adjust \NC 0x\uchexnumbers\adjustfrozenparcode \NC \NR
+\NC \type {\adjustspacingshrink} \NC adjust \NC 0x\uchexnumbers\adjustfrozenparcode \NC \NR
+\NC \type {\adjustspacingstretch} \NC adjust \NC 0x\uchexnumbers\adjustfrozenparcode \NC \NR
+\NC \type {\protrudechars} \NC protrude \NC 0x\uchexnumbers\protrudefrozenparcode \NC \NR
+\NC \type {\pretolerance} \NC tolerance \NC 0x\uchexnumbers\tolerancefrozenparcode \NC \NR
+\NC \type {\tolerance} \NC tolerance \NC 0x\uchexnumbers\tolerancefrozenparcode \NC \NR
+\NC \type {\emergencystretch} \NC stretch \NC 0x\uchexnumbers\stretchfrozenparcode \NC \NR
+\NC \type {\looseness} \NC looseness \NC 0x\uchexnumbers\loosenessfrozenparcode \NC \NR
+\NC \type {\lastlinefit} \NC last line \NC 0x\uchexnumbers\lastlinefrozenparcode \NC \NR
+\NC \type {\linepenalty} \NC line penalty \NC 0x\uchexnumbers\linepenaltyfrozenparcode \NC \NR
+\NC \type {\interlinepenalty} \NC line penalty \NC 0x\uchexnumbers\linepenaltyfrozenparcode \NC \NR
+\NC \type {\interlinepenalties} \NC line penalty \NC 0x\uchexnumbers\linepenaltyfrozenparcode \NC \NR
+\NC \type {\clubpenalty} \NC club penalty \NC 0x\uchexnumbers\clubpenaltyfrozenparcode \NC \NR
+\NC \type {\clubpenalties} \NC club penalty \NC 0x\uchexnumbers\clubpenaltyfrozenparcode \NC \NR
+\NC \type {\widowpenalty} \NC widow penalty \NC 0x\uchexnumbers\widowpenaltyfrozenparcode \NC \NR
+\NC \type {\widowpenalties} \NC widow penalty \NC 0x\uchexnumbers\widowpenaltyfrozenparcode \NC \NR
+\NC \type {\displaywidowpenalty} \NC display penalty \NC 0x\uchexnumbers\displaypenaltyfrozenparcode \NC \NR
+\NC \type {\displaywidowpenalties} \NC display penalty \NC 0x\uchexnumbers\displaypenaltyfrozenparcode \NC \NR
+\NC \type {\brokenpenalty} \NC broken penalty \NC 0x\uchexnumbers\brokenpenaltyfrozenparcode \NC \NR
+\NC \type {\adjdemerits} \NC demerits \NC 0x\uchexnumbers\demeritsfrozenparcode \NC \NR
+\NC \type {\doublehyphendemerits} \NC demerits \NC 0x\uchexnumbers\demeritsfrozenparcode \NC \NR
+\NC \type {\finalhyphendemerits} \NC demerits \NC 0x\uchexnumbers\demeritsfrozenparcode \NC \NR
+\NC \type {\parshape} \NC shape \NC 0x\uchexnumbers\shapefrozenparcode \NC \NR
+\NC \type {\baselineskip} \NC line \NC 0x\uchexnumbers\linefrozenparcode \NC \NR
+\NC \type {\lineskip} \NC line \NC 0x\uchexnumbers\linefrozenparcode \NC \NR
+\NC \type {\lineskiplimit} \NC line \NC 0x\uchexnumbers\linefrozenparcode \NC \NR
+\NC \type {\hyphenationmode} \NC hyphenation \NC 0x\uchexnumbers\hyphenationfrozenparcode \NC \NR
\stoptabulate
-
As you can see here, there are more paragraph related parameters than in for
instance \PDFTEX\ and \LUATEX\ and these are (to be) explained in the
\LUAMETATEX\ manual. You can imagine that keeping this around with the paragraph
@@ -319,9 +318,9 @@ this new mechanism has been active for a while. Actually, when you now change a
parameter inside the paragraph its new value will not be applied (unless you
prefix it with \type {\frozen} or snapshot it) but no one did that anyway.
-\stopsection
+\stopsectionlevel
-\startsection[title=Wrapping up]
+\startsectionlevel[title=Wrapping up]
In \CONTEXT\ \LMTX\ we have a mechanism to exercise macros (or content) before a
paragraph ends. This is implemented using the \type {\wrapuppar} primitive. The
@@ -343,9 +342,23 @@ question is: where do we apply it in old mechanisms and where not.
% $$x = \vcenter{vcenter : \wrapuppar{1}test\par x\wrapuppar{2}test}$$\blank
% x\vadjust{vadjust : \wrapuppar{1}test\par x\wrapuppar{2}test}x\blank
-\stopsection
+% \starttext
+% \starttabulate[|||]
+% \NC test \NC test \NC \NR
+% \NC test \NC \hbox{\hbox{\hbox{\vadjust pre {\kern-12pt}}}}test \NC \NR
+% \NC test \NC \hbox{\hbox{\hbox{\vadjust {\kern-12pt}}}}test \NC \NR
+% \NC test \NC test \NC \NR
+% \stoptabulate
+% \starttabulate[||p|]
+% \NC test \NC test \NC \NR
+% \NC test \NC \hbox{\vadjust{\kern-22pt}}test \NC \NR
+% \NC test \NC test \NC \NR
+% \stoptabulate
+% \stoptext
+
+\stopsectionlevel
-\startsection[title=Hanging]
+\startsectionlevel[title=Hanging]
There are two mechanisms for getting a specific paragraph shape: rectangular
hanging and arbitrary shapes. Both mechanisms work top|-|down. The first
@@ -377,9 +390,9 @@ uses at the same time).
\stopcombination
\stopplacefigure
-\stopsection
+\stopsectionlevel
-\startsection[title=Shapes]
+\startsectionlevel[title=Shapes]
In \CONTEXT\ we don't use \type {\parshape} a lot. It is used in for instance
side floats but even there not in all cases. It's more meant for special
@@ -907,10 +920,72 @@ keyword in the next code. The result is shown in \in {figure} [fig:shape:skips].
\stopcombination
\stopplacefigure
-\stopsection
+The shape mechanism has a few more tricks but these are really meant for usage
+in specific situations, where one knows what one deals with. The following
+examples are visualized in \in {figure} [fig:flow].
+
+\startbuffer[jano]
+\useMPlibrary[dum]
+\usemodule[article-basics]
+
+\startbuffer
+ \externalfigure[dummy][width=6cm]
+\stopbuffer
+
+\startshapedparagraph[text=\getbuffer]
+ \dorecurse{3}{\samplefile{ward}\par}
+\stopshapedparagraph
+
+\page
+
+\startshapedparagraph[text=\getbuffer,distance=1em]
+ \dorecurse{3}{\samplefile{ward}\par}
+\stopshapedparagraph
+
+\page
+
+\startshapedparagraph[text=\getbuffer,distance=1em,
+ hoffset=-2em]
+ \dorecurse{3}{\samplefile{ward}\par}
+\stopshapedparagraph
+
+\page
+
+\startshapedparagraph[text=\getbuffer,distance=1em,
+ voffset=-2ex,hoffset=-2em]
+ \dorecurse{3}{\samplefile{ward}\par}
+\stopshapedparagraph
+
+\page
+
+\startshapedparagraph[text=\getbuffer,distance=1em,
+ voffset=-2ex,hoffset=-2em,lines=1]
+ \dorecurse{3}{\samplefile{ward}\par}
+\stopshapedparagraph
+
+\page
+
+\startshapedparagraph[width=4cm,lines=4]
+ \dorecurse{3}{\samplefile{ward}\par}
+\stopshapedparagraph
+\stopbuffer
+
+\typebuffer[jano]
+
+\startplacefigure[title={Flow around something},reference=fig:flow]
+ \startcombination[nx=3,ny=2]
+ {\typesetbuffer[jano][page=1,frame=on,width=\measure{combination}]}{}
+ {\typesetbuffer[jano][page=2,frame=on,width=\measure{combination}]}{}
+ {\typesetbuffer[jano][page=3,frame=on,width=\measure{combination}]}{}
+ {\typesetbuffer[jano][page=4,frame=on,width=\measure{combination}]}{}
+ {\typesetbuffer[jano][page=5,frame=on,width=\measure{combination}]}{}
+ {\typesetbuffer[jano][page=6,frame=on,width=\measure{combination}]}{}
+ \stopcombination
+\stopplacefigure
+
+\stopsectionlevel
-% \startsection[title=Linebreaks]
-\startsection[title=Modes]
+\startsectionlevel[title=Modes]
% \ruledvbox{1\ifhmode\writestatus{!}{HMODE 1}\fi} % hsize
% \ruledvbox{\hbox{\strut 2}\ifhmode\writestatus{!}{HMODE 2}\fi} % fit
@@ -921,22 +996,402 @@ keyword in the next code. The result is shown in \in {figure} [fig:shape:skips].
{\em todo: some of the side effects of so called modes}
-\stopsection
+\stopsectionlevel
+
+\startsectionlevel[title=Leaders]
+
+Leaders are a basic feature that users probably never run into directly. They
+repeat content till it fits the specified width which can be stretched out. The
+content is typeset once and it is the backend that does the real work of
+repetition.
+
+\startbuffer
+\strut\leaders \hbox{!}\hfill\strut
+\strut\xleaders\hbox{!}\hfill\strut
+\strut\cleaders\hbox{!}\hfill\strut
+\strut\gleaders\hbox{!}\hfill\strut
+\stopbuffer
+
+\typebuffer
+
+Here \type {\leaders} starts at the left edge and are repeats the box as long as
+it fits, \type {\xleaders} spreads till the edges and \type {\cleaders} centers
+the lot. The \type {\gleaders} primitive (which is not in orginal \TEX) takes the
+outer box as reference and further behaves like \type {\cleaders}.
+
+\startlines \showmakeup[line] \getbuffer \stoplines
+
+The leader primitives take box or rule but in \LUAMETATEX\ a glyph can also be
+specified, which saves wrapping in a box.
+
+\startbuffer
+\ruledvbox \bgroup \hsize 10cm
+ \strut\cleaders\hbox{!}\hfill\strut
+\egroup
+
+\ruledvbox \bgroup \hsize 10cm
+ \strut\cleaders\hrule\hfill\strut
+\egroup
+
+\ruledvbox \bgroup \hsize 10cm
+ \strut\cleaders\glyph`!\hfill\strut
+\egroup
+\stopbuffer
+
+\typebuffer
+
+\getbuffer
+
+The \LUAMETATEX\ engine also introduced \type {\uleaders}
+
+\definecolor[tred] [r=.6,a=1,t=.5]
+\definecolor[tgreen][g=.6,a=1,t=.5]
+\definecolor[tblue] [b=.6,a=1,t=.5]
+
+\startbuffer[one]
+ x xx xxx xxxx
+ \ruledhbox{L\hss R}\space
+ x xx xxx xxxx
+\stopbuffer
+
+\startbuffer[two]
+ x xx xxx xxxx
+ \uleaders\backgroundhbox[gray]{L\hss R}\hskip\zeropoint plus 100pt\relax\space
+ x xx xxx xxxx
+\stopbuffer
+
+\startbuffer[three]
+ x xx xxx xxxx
+ \uleaders\ruledhbox{L\hss R}\hskip\zeropoint plus 100pt\relax\space
+ x xx xxx xxxx
+\stopbuffer
+
+We show three boxes, a regular one first (red):
+
+\typebuffer[one]
+
+The second one (blue) is also a box but one that stretches upto 100pt and is in a
+later stage, when the paragraph has been built, is repackaged to the effective
+width. The third example (green) leaves out the background.
+
+\startlinecorrection
+\startoverlay
+ {\vbox{\color[tgreen]{\small\dorecurse {20} {\getbuffer[three]}}}}
+ {\vbox{\color[tblue] {\small\dorecurse {20} {\getbuffer [two]}}}}
+ {\vbox{\color[tred] {\small\dorecurse {20} {\getbuffer [one]}}}}
+\stopoverlay
+\stoplinecorrection
+
+In \CONTEXT\ we have wrapped this feature in the adaptive box mechanism, so here
+a few a few examples:
+
+\setupexternalfigures[location={default,local,global}]
+
+\startbuffer
+\startsetups adaptive:test:a
+ \setbox\usedadaptivebox\vbox to \usedadaptivetotal \bgroup
+ \externalfigure
+ [cow.pdf]
+ [width=\framedmaxwidth,
+ frame=on,
+ height=\usedadaptivetotal]%
+ \egroup
+\stopsetups
+
+\startsetups adaptive:test:b
+ \setbox\usedadaptivebox\vbox to \usedadaptivetotal \bgroup
+ \externalfigure
+ [cow.pdf]
+ [width=\usedadaptivewidth,
+ frame=on,
+ height=\usedadaptivetotal]%
+ \egroup
+\stopsetups
+\stopbuffer
+
+\typebuffer \getbuffer
+
+We use this as follows (see \in {figure} [fig:adaptive] for the result):
+
+\startbuffer
+\framed[height=18cm,align=middle,adaptive=yes,top=,bottom=] {%
+ \begstrut \samplefile{tufte} \endstrut
+ \par
+ \adaptivevbox
+ [strut=yes,setups=adaptive:test:a]
+ {\showstruts\strut\hsize5cm\hss}%
+ \par
+ \adaptivevbox
+ [strut=yes,setups=adaptive:test:b]
+ {\showstruts\strut\hsize5cm\hss}%
+ \par
+ \begstrut \samplefile{tufte} \endstrut
+}
+\stopbuffer
+
+\typebuffer
+
+\startplacefigure[reference=fig:adaptive]
+ \getbuffer
+\stopplacefigure
+
+Here is one that you can test yourself:
+
+\starttyping
+\startsetups adaptive:test
+ \setbox\usedadaptivebox\vbox to \usedadaptivetotal \bgroup
+ \externalfigure
+ [cow.pdf]
+ [width=\usedadaptivewidth,
+ height=\usedadaptivetotal]%
+ \egroup
+\stopsetups
+
+\ruledvbox to \textheight {
+ \par \begstrut \samplefile{tufte} \endstrut \par
+ \adaptivevbox[strut=yes,setups=adaptive:test]{\hsize\textwidth\hss}
+ \par \begstrut \samplefile{tufte} \endstrut
+}
+\stoptyping
+
+The next example comes from the test suite (where it runs over many pages in
+order to illustrate the idea):
+
+\startbuffer
+\startMPdefinitions
+ def TickTock =
+ interim linecap := squared;
+ save p ; path p ;
+ p := fullsquare xysized(AdaptiveWidth,.9(AdaptiveHeight+AdaptiveDepth)) ;
+ fill p withcolor AdaptiveColor ;
+ draw bottomboundary (p enlarged (-AdaptiveThickness) )
+ withdashes (3*AdaptiveThickness)
+ withpen pencircle scaled AdaptiveThickness
+ withcolor white ;
+ enddef ;
+\stopMPdefinitions
+
+\startsetups adaptive:test
+ \setbox\usedadaptivebox\hbox
+ to \usedadaptivewidth
+ yoffset -.9\usedadaptivedepth
+ \bgroup
+ \hss
+ \startMPcode
+ TickTock ;
+ \stopMPcode
+ \hss
+ \egroup
+\stopsetups
+
+\definecolor[adaptive:tick][.25(blue,green)]
+\definecolor[adaptive:tock][.75(blue,green)]
+
+\defineadaptive
+ [tick]
+ [setups=adaptive:test,
+ color=adaptive:tick,
+ foregroundcolor=white,
+ foregroundstyle=\infofont,
+ strut=yes]
+
+\defineadaptive
+ [tock]
+ [tick]
+ [color=adaptive:tock]
+
+\dostepwiserecurse{8}{12}{1}{%
+ \dostepwiserecurse{5}{15}{1}{%
+ this~#1.##1 is~#1.##1 test~#1.##1
+ \ifodd##1\relax
+ \adaptivebox[tick]{\hss tick #1.##1\hss}
+ \else
+ \adaptivebox[tock]{\hss tock #1.##1\hss}
+ \fi
+ }
+}
+\stopbuffer
+
+\typebuffer \getbuffer
+
+In the next example the graphics adapt to the available space:
+
+\startbuffer
+\startsetups adaptive:test
+ \setbox\usedadaptivebox\hbox
+ to \usedadaptivewidth
+ yoffset -\usedadaptivedepth
+ \bgroup
+ \externalfigure
+ [cow.pdf]
+ [width=\usedadaptivewidth,
+ height=\dimexpr\usedadaptivetotal\relax]%
+ \egroup
+\stopsetups
+
+\dostepwiserecurse{1}{50}{1}{%
+ this~#1 is~#1 test~#1
+ {\adaptivebox[strut=yes,setups=adaptive:test]{}}
+}
+\stopbuffer
+
+\typebuffer \getbuffer
+
+\stopsectionlevel
+
+\startsectionlevel[title=Prevdepth]
+
+The depth of a box is normally positive but rules can have a negative depth in
+order to get a rule above the baseline. When \TEX\ was written the assumption was
+that a negative depth of more than 1000 point made no sense at all. The last
+depth on a vertical list is registered in the \type {\prevdepth} variable. This
+is basically a reference into the current list. In order to illustrate some
+interesting side effects of setting this \type {\prevdepth} and especially when
+we set it to -1000pt. In order to illustrate this this special value can be set
+to a different value in \LUAMETATEX. However, as dealing with the property is
+somewhat special in the engine you should not set it unless you know that the
+macro package is ware of it.
+
+\startbuffer
+line 1\par line 2 \par \nointerlineskip line 3 \par
+\stopbuffer
+
+\typebuffer
+
+Assuming that we haven't set any inter paragraph spacing this gives:
+
+\startlinecorrection
+\ruledvbox{\setupwhitespace[none]\showmakeup[line]\getbuffer}
+\stoplinecorrection
+
+Here \type {\nointerlineskip} is (normally) defined as:
+
+\starttyping
+\prevdepth-1000pt
+\stoptyping
+
+although in \CONTEXT\ we use \type {\ignoredepthcriterium} instead of the hard
+coded dimension. We now give a more extensive example:
+
+\startbuffer[definition-1]
+\def\PrevTest#1%
+ {\setbox0\ruledhbox{\strut$\tf#1$}%
+ \dp0=#1
+ \vbox\bgroup\hsize4em
+ FIRST\par
+ \unhbox0\par
+ LAST\par
+ \egroup}
+\stopbuffer
+
+\startbuffer[definition-2]
+\def\PrevTest#1%
+ {\setbox0\ruledhbox{\strut$\tf#1$}%
+ \dp0=#1
+ \vbox\bgroup
+ \ruledhbox{FIRST}\par
+ \box0\par
+ \ruledhbox{LAST}\par
+ \egroup}
+\stopbuffer
+
+\startbuffer[example]
+\ruledhbox \bgroup
+ \PrevTest{-10.0pt}\quad
+ \PrevTest{-20.0pt}\quad
+ \PrevTest{-49.9pt}\quad
+ \PrevTest{-50.0pt}\quad
+ \PrevTest{-50.1pt}\quad
+ \PrevTest{-60.0pt}\quad
+ \PrevTest{-80.0pt}%
+\egroup
+\stopbuffer
+
+In this example we set \type {\ignoredepthcriterium} to $\tf-50.0pt$ instead of the
+normal $\tf -1000pt$. The helper is defined as:
+
+\typebuffer[option=TEX][definitions-1]
+
+or
+
+\typebuffer[option=TEX][definitions-2]
+
+The result of the following example is shown in \in {figures} [fig:prevdepth-1]
+\in {and} [fig:prevdepth-2]. The first case is what we normally have in text and
+we haven't set \type {prevdepth} explicitly between lines so \TEX\ will just look
+at the depth of the lines. In the second case the depth is ignored when less than
+the criterium which is why, when we set the depth of the box to a negative value
+we get somewhat interesting skips.
+
+\startplacefigure[reference=fig:prevdepth-1]
+ \showmakeup[line]
+ \ignoredepthcriterium-50pt
+ \setupwhitespace[none]
+ \getbuffer[definition-1,example]
+\stopplacefigure
+
+\startplacefigure[reference=fig:prevdepth-2]
+ \showmakeup[line]
+ \ignoredepthcriterium-50pt
+ \setupwhitespace[none]
+ \getbuffer[definition-2,example]
+ \blank[5*line]
+\stopplacefigure
+
+I'm sure one can use this effect otherwise than intended but I doubt is any user
+is willing to do this but the fact that we can lower the criterium makes for nice
+experiments. Just for the record, in \in {figure} [fig:prevdepth-3] you see what
+we get with positive values:
+
+\startbuffer[example]
+\ruledhbox \bgroup
+ \PrevTest{10.0pt}\quad
+ \PrevTest{20.0pt}\quad
+ \PrevTest{49.9pt}\quad
+ \PrevTest{50.0pt}\quad
+ \PrevTest{50.1pt}\quad
+ \PrevTest{60.0pt}\quad
+ \PrevTest{80.0pt}%
+\egroup
+\stopbuffer
+
+\startplacefigure[reference=fig:prevdepth-3]
+ \showmakeup[line]
+ \ignoredepthcriterium50pt
+ \setupwhitespace[none]
+ \getbuffer[definition-2,example]
+\stopplacefigure
+
+Watch the interline skip kicking in when we make the depth larger than in
+\type {\ignoredepthcriterium} being $\tf 50pt$.
-\startsection[title=Normalization]
+\stopsectionlevel
+
+\startsectionlevel[title=Normalization]
{\em todo: users don't need to bother about this but it might be interesting anyway}
-\stopsection
+\stopsectionlevel
-\stopdocument
+\startsectionlevel[title=Dirty tricks]
-\everyhbox \everyvbox : useless unless one resets
-\parattr
-\snapshotpar
-\wrapuppar
+{\em todo: explain example for combining paragraphs}
-% \parfillleftskip
+% test\wrapuppar{\crlf\ignorepars}
+%
+% test
+%
+% test\wrapuppar{\ignorepars}
+%
+% test
+%
+% test\wrapuppar{\removeunwantedspaces\ignorepars}
+%
+% test
+
+\stopsectionlevel
+
+\stopdocument
% I rewarded myself after writing a section by watching the video "Final Thing On
% My Mind", The Pineapple This, Live, 2020, the usual perfect GH performance,
@@ -946,3 +1401,107 @@ keyword in the next code. The result is shown in \in {figure} [fig:shape:skips].
% Gavin Harrison: Soundcheck, Drummerworld Jan 27, 2021 ... I wish I could make
% something called a check into pefect solo. Okay, another section and I'll check
% out the latest Simon Phillips and other favourite dummer uploads.
+
+% todo:
+
+% \everyhbox \everyvbox : useless unless one resets
+% \parattr
+% \snapshotpar
+% \wrapuppar
+
+% \normalizelinemode0
+% x\ruledhbox{\parindent 1cm\indent x \indent x}
+% \normalizelinemode \parindentskipnormalizecode
+% x\ruledhbox{\parindent 1cm\indent x \indent x}
+
+% \starttext
+% \tracingoutput1 \tracingonline1
+% \pretolerance9000 test \pretolerance 8000 test \par
+% \pretolerance9000 test \pretolerance 7000 \updateparagraphproperties test \par
+% \pretolerance9000 test \pretolerance 6000 \snapshotpar\tolerancefrozenparcode test \par
+% \pretolerance9000 test {\pretolerance5000 \snapshotpar\ntolerancefrozenparcode}test \par
+% \stoptext
+
+% \par[newgraf][16=1,17=1], .... pretolerance 9000, ....
+% \par[newgraf][16=1,17=1], .... pretolerance 7000, ....
+% \par[newgraf][16=1,17=1], .... pretolerance 6000, ....
+
+% \parfillleftskip
+
+% todo:
+
+% \starttext
+%
+% \showframe
+%
+% % this is the current default behaviour; we have a topskip with quite some stretch
+% % and that stretch is taken into account when tex calculates the badness; watch
+% % the next page
+%
+% \dorecurse{4}{
+% \bgroup
+% \shapingpenaltiesmode\zerocount
+% \showmakeup[penalty]
+% \placefigure[left]{}{}
+% \input tufte \par
+% \egroup
+% }
+%
+% \page EMPTY \page
+%
+% % the ntop is new and when >= 0 it is a multiplier for the number of lines
+% % stretch, here we have one line; watch the next page
+%
+% \dorecurse{4}{
+% \bgroup
+% \shapingpenaltiesmode\zerocount
+% \setupinterlinespace[ntop=1]
+% \showmakeup[penalty]
+% \placefigure[left]{}{}
+% \input tufte \par
+% \egroup
+% }
+%
+% \page EMPTY \page
+%
+% % these shaping parameters will discourage a linebreak within a shape;
+% % the placement macro checked available space but that doesn't mean that
+% % there can be no linebreak
+%
+% \dorecurse{4}{
+% \bgroup
+% \showmakeup[penalty]
+% \shapingpenalty\plushundred
+% \shapingpenaltiesmode"FF\relax
+% \placefigure[left]{}{}
+% \input tufte \par
+% \egroup
+% }
+%
+% \page EMPTY \page
+%
+% % the next pages show the effect of changed topskip on page breaks with
+% % footnotes
+%
+% \dorecurse{10}{
+% [#1] \input tufte \footnote{\input{tufte}} \par
+% }
+%
+% \page EMPTY \page
+%
+% \setupinterlinespace[ntop=2]
+%
+% \dorecurse{10}{
+% [#1] \input tufte \footnote{\input{tufte}} \par
+% }
+%
+% \page EMPTY \page
+%
+% \setupinterlinespace[ntop=0]
+%
+% \dorecurse{10}{
+% [#1] \input tufte \footnote{\input{tufte}} \par
+% }
+%
+% \stoptext
+
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
index 8ccb0cd3ab6..233a8c1788d 100644
--- 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
@@ -1,4 +1,4 @@
-% language=us
+% language=us runpath=texruns:manuals/lowlevel
\environment lowlevel-style
@@ -6,7 +6,7 @@
[title=registers,
color=darkmagenta]
-\startsection[title=Preamble]
+\startsectionlevel[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
@@ -14,9 +14,9 @@ it, and also manipulate it.
There is hardly any need to use them in \CONTEXT\ so we keep it simple.
-\stopsection
+\stopsectionlevel
-\startsection[title={\TEX\ primitives}]
+\startsectionlevel[title={\TEX\ primitives}]
There are several categories:
@@ -105,9 +105,11 @@ but in a macro package you should not use that one but the higher level \type
Watch the difference:
+\pushoverloadmode
\startlines\tt
\getbuffer[1,2]
\stoplines
+\popoverloadmode
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
@@ -182,9 +184,9 @@ 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
+\stopsectionlevel
-\startsection[title={\ETEX\ primitives}]
+\startsectionlevel[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
@@ -194,9 +196,9 @@ 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
+\stopsectionlevel
-\startsection[title={\LUATEX\ primitives}]
+\startsectionlevel[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
@@ -239,13 +241,46 @@ 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
+\stopsectionlevel
-\startsection[title={\LUAMETATEX\ primitives}]
+\startsectionlevel[title={\LUAMETATEX\ primitives}]
-{\em todo}
+The fact that scanning stops at a non-number or \type {\relax} can be sort of
+unpredictable which is why in \LUAMETATEX\ we also support the following variant:
-\stopsection
+\starttyping[option=TEX]
+\scratchdimen\dimexpr 10pt + 3pt \relax
+\scratchdimen\dimexpr {10pt + 3pt}
+\stoptyping
+
+At the cost of one more token braces can be used as boundaries instead of the
+single \type {\relax} boundary.
+
+An important property of registers is that they can be accessed by a number. This
+has big consequences for the implementation: they are part of the big memory
+store and consume dedicated ranges. If we had only named access \TEX's memory
+layout could be a bit leaner. In principle we could make the number of registers
+smaller because any limit on the amount at some point can be an obstacle. It is
+for that reason that we also have name-only variants:
+
+\starttyping[option=TEX]
+\dimensiondef \MyDimenA 12pt
+\integerdef \MyIntegerA 12
+\gluespecdef \MyGlueA 12pt + 3pt minus 4pt
+\mugluespecdef\MyMuA 12mu + 3mu minus 4mu
+\stoptyping
+
+These are as efficient but not accessible by number but they behave like
+registers which means that you (can) use \type {\the}, \type {\advance}, \type
+{\multiply} and \type {\divide} with them. \footnote {There are also the slightly
+more efficient \type {\advanceby}, \type {\multiplyby} and \type {\divideby} that
+don't check for the \type {by} keyword.} In case you wonder why there is no
+alternative for \type {\toksdef}, there actually are multiple: they are called
+macros.
+
+{\em todo: expressions}
+
+\stopsectionlevel
\stopdocument
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/lowlevel/lowlevel-scope.tex b/Master/texmf-dist/doc/context/sources/general/manuals/lowlevel/lowlevel-scope.tex
index 1313de92332..cfd9f96117f 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/lowlevel/lowlevel-scope.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/lowlevel/lowlevel-scope.tex
@@ -1,4 +1,4 @@
-% language=us
+% language=us runpath=texruns:manuals/lowlevel
% \hfil \hss
% spread
@@ -9,15 +9,15 @@
[title=scope,
color=middleblue]
-\startsection[title=Introduction]
+\startsectionlevel[title=Introduction]
When I visited the file where register allocations are implemented I wondered to
what extend it made sense to limit allocation to global instances only. This
chapter deals with this phenomena.
-\stopsection
+\stopsectionlevel
-\startsection[title=Registers]
+\startsectionlevel[title=Registers]
In \TEX\ definitions can be local or global. Most assignments are local within a
group. Registers and definitions can be assigned global by using the \type
@@ -108,9 +108,9 @@ here the dimension is \the\scratchdimen\par
\typebuffer[option=TEX] \startlines \getbuffer \stoplines
-\stopsection
+\stopsectionlevel
-\startsection[title=Allocation]
+\startsectionlevel[title=Allocation]
The plain \TEX\ format has set some standards and one of them is that registers
are allocated with \type {\new...} commands. So we can say:
@@ -252,9 +252,9 @@ So, again we get:
When used in the body of the macro there is of course a little overhead
involved in the repetitive allocation but normally that can be neglected.
-\stopsection
+\stopsectionlevel
-\startsection[title=Files]
+\startsectionlevel[title=Files]
When adding these new allocators I also wondered about the read and write
allocators. We don't use them in \CONTEXT\ but maybe users like them, so let's
@@ -334,7 +334,7 @@ SOME LINE 3
As you see in these examples, we an locally define a read channel without
getting a message about it already being defined.
-\stopsection
+\stopsectionlevel
\stopdocument
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/lowlevel/lowlevel-security.tex b/Master/texmf-dist/doc/context/sources/general/manuals/lowlevel/lowlevel-security.tex
index 4f705e37caa..bdb3a5b877f 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/lowlevel/lowlevel-security.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/lowlevel/lowlevel-security.tex
@@ -1,4 +1,4 @@
-% language=us
+% language=us runpath=texruns:manuals/lowlevel
% It took some time to get the right balance of using the overload related features
% but at some point it started feeling right. Of course it will never be as
@@ -21,7 +21,7 @@
[title=security,
color=middleorange]
-\startsection[title=Preamble]
+\startsectionlevel[title=Preamble]
Here I will discuss a moderate security subsystem of \LUAMETATEX\ and therefore
\CONTEXT\ \LMTX. This is not about security in the sense of the typesetting
@@ -35,9 +35,9 @@ might take a few years before the security model is finalized and all files are
updated accordingly. There are lots of files and macros involved. In the process
the underlying features in the engine might evolve.
-\stopsection
+\stopsectionlevel
-\startsection[title=Flags]
+\startsectionlevel[title=Flags]
Before we go into the security levels we see what flags can be set. The \TEX\
language has a couple of so called prefixes that can be used when setting values
@@ -205,9 +205,9 @@ really want to avoid that you can set the overload mode to 255 after which it
cannot be set any more. However, it can be useful to set the mode to zero (or
some warning level) when foreign macro packages are used.
-\stopsection
+\stopsectionlevel
-\startsection[title=Complications]
+\startsectionlevel[title=Complications]
One side effect of all this is that all those prefixes can lead to more code. On
the other hand we save some due to the extended macro argument handling features.
@@ -220,9 +220,9 @@ about the same. \footnote {And if you wonder about memory, by compacting the use
(often scattered) token memory before dumping I manages to save some 512K on the
format file, so often the loss and gain are somewhere else.}
-\stopsection
+\stopsectionlevel
-\startsection[title=Introspection]
+\startsectionlevel[title=Introspection]
In case you want to get some details about the properties of a macro, you can
check its meaning. The full variant shows all of them.
@@ -241,7 +241,7 @@ check its meaning. The full variant shows all of them.
\startpacked \getbuffer \stoppacked
-\stopsection
+\stopsectionlevel
% In \CONTEXT:
% c! v! s! ??
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
index ddd9df747ba..9d3bcdbb337 100644
--- 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
@@ -1,4 +1,4 @@
-% language=us
+% language=us runpath=texruns:manuals/lowlevel
% 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
@@ -44,6 +44,10 @@
[style=\bfa,
color=darkgray]
+\setuplist
+ [chapter]
+ [style=bold]
+
\setupfootertexts
[section] % [\documentvariable{title}]
@@ -87,17 +91,48 @@
withcolor "white" ;
\stopuseMPgraphic
+\definesectionlevels
+ [default]
+ [%{chapter,title},
+ {section,subject},
+ {subsection,subsubject},
+ {subsubsection,subsubsubject},
+ {subsubsubsection,subsubsubject},
+ {subsubsubsubsection,subsubsubject}]
+
\startsetups document:start
\startMPpage
+ StartPage;
\includeMPgraphic{titlepage} ;
+ StopPage;
\stopMPpage
\page
- \startsubject[title=Contents]
- \placelist[section][criterium=previous]
- \stopsubject
+ \startsubjectlevel[title=Contents]
+ \placelist[chapter,section] [criterium=previous]
+ \stopsubjectlevel
+
+\stopsetups
+
+\startsetups document:stop
+
+\testpage[6]
+
+%startsubjectlevel[title=Colofon]
+\startsectionlevel[title=Colofon,number=no,saveinlist=no]
+
+ \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
+
+\stopsectionlevel
+%stopsubjectlevel
\stopsetups
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/lowlevel/lowlevel.tex b/Master/texmf-dist/doc/context/sources/general/manuals/lowlevel/lowlevel.tex
new file mode 100644
index 00000000000..2d689883536
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/lowlevel/lowlevel.tex
@@ -0,0 +1,45 @@
+% language=us runpath=texruns:manuals/lowlevel
+
+\environment lowlevel-style
+
+%D This is a bit if a cheat. The low level manuals are independent but I want an
+%D overview document on the website. Therefore we use sectionlevels in the documents
+%D that we we then overload here (we push the chapter level in front).
+
+\starttext
+
+ \definesectionlevels
+ [default]
+ [{chapter,title},
+ {section,subject},
+ {subsection,subsubject},
+ {subsubsection,subsubsubject},
+ {subsubsubsection,subsubsubject},
+ {subsubsubsubsection,subsubsubject}]
+
+ \startdocument[title=lowlevel,color=middlegray]
+ \stopdocument
+
+ % this list is incomplete
+
+ \startsectionlevel[title=Conditionals] \component [lowlevel-conditionals] \stopsectionlevel
+ \startsectionlevel[title=Boxes] \component [lowlevel-boxes] \stopsectionlevel
+ \startsectionlevel[title=Expansion] \component [lowlevel-expansion] \stopsectionlevel
+ \startsectionlevel[title=Registers] \component [lowlevel-registers] \stopsectionlevel
+ \startsectionlevel[title=Macros] \component [lowlevel-macros] \stopsectionlevel
+ \startsectionlevel[title=Grouping] \component [lowlevel-grouping] \stopsectionlevel
+ \startsectionlevel[title=Security] \component [lowlevel-security] \stopsectionlevel
+ \startsectionlevel[title=Characters] \component [lowlevel-characters] \stopsectionlevel
+ \startsectionlevel[title=Scope] \component [lowlevel-scope] \stopsectionlevel
+ \startsectionlevel[title=Paragraphs] \component [lowlevel-paragraphs] \stopsectionlevel
+ \startsectionlevel[title=Alignments] \component [lowlevel-alignments] \stopsectionlevel
+ \startsectionlevel[title=Marks] \component [lowlevel-marks] \stopsectionlevel
+ \startsectionlevel[title=Inserts] \component [lowlevel-inserts] \stopsectionlevel
+ \startsectionlevel[title=Localboxes] \component [lowlevel-localboxes] \stopsectionlevel
+ \startsectionlevel[title=Loops] \component [lowlevel-loops] \stopsectionlevel
+ \startsectionlevel[title=Tokens] \component [lowlevel-tokens] \stopsectionlevel
+ \startsectionlevel[title=Buffers] \component [lowlevel-buffers] \stopsectionlevel
+
+\stoptext
+
+
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/lua/lua-mkiv.tex b/Master/texmf-dist/doc/context/sources/general/manuals/lua/lua-mkiv.tex
index 61d7dddad3c..51e8fbd080d 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/lua/lua-mkiv.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/lua/lua-mkiv.tex
@@ -1,7 +1,7 @@
-% language=uk
+% language=us runpath=texruns:manuals/lua
% author : Hans Hagen
-% copyright : PRAGMA ADE & ConTeXt Development Team
+% copyright : ConTeXt Development Team
% license : Creative Commons Attribution ShareAlike 4.0 International
% reference : pragma-ade.nl | contextgarden.net | texlive (related) distributions
% origin : the ConTeXt distribution
@@ -135,7 +135,7 @@ where it can find them.
\NC author \NC \documentvariable{author}, \documentvariable{affiliation}, \documentvariable{location} \NC \NR
\NC version \NC \currentdate \NC \NR
\NC website \NC \documentvariable{website} \endash\ \documentvariable{support} \NC \NR
-\NC copyright \NC \symbol[cc][cc-by-sa-nc] \NC \NR
+\NC copyright \NC \symbol[cc][cc-by-sa] \NC \NR
\stoptabulate
\stopsubject
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
index a2c4636ed36..cc2856c4cbc 100644
--- 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
@@ -1,4 +1,4 @@
-% language=us
+% language=us runpath=texruns:manuals/luametafun
\environment luametafun-style
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
index f9483039ca7..4ada10f13b8 100644
--- 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
@@ -1,4 +1,4 @@
-% language=us
+% language=us runpath=texruns:manuals/luametafun
\environment luametafun-style
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
index 1bd89d3505f..e3310e431a6 100644
--- 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
@@ -1,4 +1,4 @@
-% language=us
+% language=us runpath=texruns:manuals/luametafun
\environment luametafun-style
@@ -66,7 +66,6 @@ draw lmt_chart_circle [
"fifth", "sixths", "sevenths"
}
] ;
-
\stopMPcode
\stopbuffer
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun-color.tex b/Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun-color.tex
index 17f4a449d36..c1983a4bc05 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun-color.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun-color.tex
@@ -1,4 +1,4 @@
-% language=us
+% language=us runpath=texruns:manuals/luametafun
\environment luametafun-style
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
index 73800ba8bb4..d4d63120691 100644
--- 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
@@ -1,4 +1,4 @@
-% language=us
+% language=us runpath=texruns:manuals/luametafun
\environment luametafun-style
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
index 11eca8b7adc..5425fe9910f 100644
--- 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
@@ -1,4 +1,4 @@
-% language=us
+% language=us runpath=texruns:manuals/luametafun
\environment luametafun-style
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
index 0791315656a..765058e31a7 100644
--- 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
@@ -1,4 +1,4 @@
-% language=us
+% language=us runpath=texruns:manuals/luametafun
\environment luametafun-style
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
index 27ea2fd0014..ef9ed6656e8 100644
--- 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
@@ -1,4 +1,4 @@
-% language=us
+% language=us runpath=texruns:manuals/luametafun
\environment luametafun-style
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
index 79fa97a21de..8592e3140e1 100644
--- 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
@@ -1,4 +1,4 @@
-% language=us
+% language=us runpath=texruns:manuals/luametafun
\environment luametafun-style
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
index 719d8023d28..e1dee194cb7 100644
--- 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
@@ -1,4 +1,4 @@
-% language=us
+% language=us runpath=texruns:manuals/luametafun
\environment luametafun-style
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
index b29ab3cbf47..8c9dbd12478 100644
--- 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
@@ -1,4 +1,4 @@
-% language=us
+% language=us runpath=texruns:manuals/luametafun
\environment luametafun-style
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
index 662ae61a88b..26ee383d331 100644
--- 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
@@ -1,4 +1,4 @@
-% language=us
+% language=us runpath=texruns:manuals/luametafun
\environment luametafun-style
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
index fa0e28510b1..54f14bfe86d 100644
--- 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
@@ -1,4 +1,4 @@
-% language=us
+% language=us runpath=texruns:manuals/luametafun
\environment luametafun-style
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
index 87f6d105fbe..cf91cff2f25 100644
--- 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
@@ -1,3 +1,5 @@
+% language=us runpath=texruns:manuals/luametafun
+
\startbuffer[1]
\startuseMPgraphic{MyPath1}
fill OverlayBox withcolor "darkyellow" ;
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
index 2fdb3125051..e70514dba05 100644
--- 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
@@ -1,8 +1,16 @@
-% language=us
+% language=us runpath=texruns:manuals/luametafun
\environment luametafun-style
\environment luametafun-mesh-examples
+% runtime
+
+\doiffileelse{luatex-mesh-examples.pdf} {
+ % okay
+} {
+ \ctxlua{os.execute("context luatex-mesh-examples.tex")}
+}
+
\startcomponent luametafun-mesh
\startchapter[title={Mesh}]
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
index e2cdb422667..9b5e4cef9d1 100644
--- 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
@@ -1,4 +1,4 @@
-% language=us
+% language=us runpath=texruns:manuals/luametafun
\environment luametafun-style
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
index 3627bbfd04f..9a71d1a9671 100644
--- 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
@@ -1,4 +1,4 @@
-% language=us
+% language=us runpath=texruns:manuals/luametafun
\environment luametafun-style
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun-poisson.tex b/Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun-poisson.tex
index cd4b6ddabd8..f6e9c40e4af 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun-poisson.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun-poisson.tex
@@ -1,4 +1,4 @@
-% language=us
+% language=us runpath=texruns:manuals/luametafun
\environment luametafun-style
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
index a139be95460..6eda02fe5c5 100644
--- 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
@@ -1,4 +1,4 @@
-% language=us
+% language=us runpath=texruns:manuals/luametafun
\environment luametafun-style
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
index 63eb7e3755e..1d2b93dd2b1 100644
--- 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
@@ -1,3 +1,5 @@
+% language=us runpath=texruns:manuals/luametafun
+
\startenvironment luametafun-style
\usemodule[abbreviations-smallcaps]
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
index 0014fa7251d..3073cad676b 100644
--- 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
@@ -1,4 +1,4 @@
-% language=us
+% language=us runpath=texruns:manuals/luametafun
\environment luametafun-style
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
index 069abc6a68b..326daff1054 100644
--- 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
@@ -1,4 +1,4 @@
-% language=us
+% language=us runpath=texruns:manuals/luametafun
\environment luametafun-style
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun-technology.tex b/Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun-technology.tex
index 910a9dd6034..79ad37a2af4 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun-technology.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun-technology.tex
@@ -1,4 +1,4 @@
-% language=us
+% language=us runpath=texruns:manuals/luametafun
\environment luametafun-style
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
index 4f08ee00f8c..202d77aa2bb 100644
--- 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
@@ -1,4 +1,4 @@
-% language=us
+% language=us runpath=texruns:manuals/luametafun
\environment luametafun-style
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
index 4450199e653..d83cafc13b5 100644
--- 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
@@ -1,3 +1,4 @@
+% language=us runpath=texruns:manuals/luametafun
\environment luametafun-style
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
index 6aaf166a5ed..a90e265f15e 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/luametafun/luametafun.tex
@@ -1,3 +1,5 @@
+% language=us runpath=texruns:manuals/luametafun
+
% This file takes a while to process because we render some complex graphics. It
% can be sped up by enabling caching, but for some images that has been disabled.
@@ -34,6 +36,7 @@
\component luametafun-fonts
\component luametafun-color
\component luametafun-groups
+ \component luametafun-extensions
\component luametafun-interface
\stopbodymatter
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex-building.tex b/Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex-building.tex
new file mode 100644
index 00000000000..ca09c53f945
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex-building.tex
@@ -0,0 +1,1337 @@
+% language=us runpath=texruns:manuals/luametatex
+
+\environment luametatex-style
+
+\startcomponent luametatex-building
+
+\startchapter[reference=building,title={Boxes, paragraphs and pages}]
+
+\startsection[title={Introduction}]
+
+\topicindex {building}
+\topicindex {pages}
+\topicindex {paragraphs}
+\topicindex {marks}
+\topicindex {inserts}
+
+There are some enhancements that relate to the way paragraphs and pages are
+built. In this chapter we will cover those. There can be a bit of overlap with
+other chapters. These enhancements are still somewhat experimental.
+
+\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 \prm {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 \prm {linedirection} is just a
+convenience extra which could also have been implemented using node list parsing.
+
+Directions are complicated by the fact that they often need to work over groups
+so a separate grouping related stack is used. A side effect is that there can be
+paragraphs with only a local par node followed by direction synchronization
+nodes. Paragraphs like that are seen as empty paragraphs and therefore ignored.
+Because \prm {noindent} doesn't inject anything but a \prm {indent} injects
+an box, paragraphs with only an indent and directions are handles and paragraphs
+with content. When indentation is normalized a paragraph with an indentation
+skip is seen as content.
+
+\stopsubsection
+
+\startsubsection[title={Normalizing lines}]
+
+The original \TEX\ machinery was never meant to be opened up. As a consequence a
+constructed line can have different layouts. There can be left- and/or right
+skips and hanging indentation or parshape can result in a shift and adapted
+width. In \LUATEX\ glue got subtypes so we can recognize the left-, right and
+parfill skips, but still there is no hundred percent certainty about the shape.
+
+In \LUAMETATEX\ lines can be normalized. This is optional because we want to
+preserve the original (for comparison) and is controlled by \prm
+{normalizelinemode}. That variable actually drives some more. An earlier version
+provided a few more granular options (for instance: does a leftskip comes before
+or after a left hanging indentation) but in the end that was dropped. Because
+this normalization only is seen at the \LUA\ end there is no need to go into much
+detail here.
+
+At this moment a line has this pattern: left parfill, left hang, left skip,
+indentation, content, right hang, right skip, right parfill. Of course the
+indentation and fill skips are not present in every line.
+
+Control over normalization happens via the mentioned mode variable and here is
+what the engine provides right now. We use a bitmap:
+
+\starttabulate[|l|l|]
+\DB value \BC reported \NC \NR
+\TB
+\NC \type{0x0001} \NC normalize line as described above \NC \NR
+\NC \type{0x0002} \NC use a skip for parindent instead of a box \NC \NR
+\NC \type{0x0004} \NC swap hangindent in l2r mode \NC \NR
+\NC \type{0x0008} \NC swap parshape in l2r mode \NC \NR
+\NC \type{0x0010} \NC put breaks after dir in l2r mode \NC \NR
+\NC \type{0x0020} \NC remove margin kerns (\PDFTEX\ left-over) \NC \NR
+\NC \type{0x0040} \NC if needed clip width and use correction kern \NC \NR
+\LL
+\stoptabulate
+
+Setting the bit enables the related normalization. More features might be added
+in future releases.
+
+% Swapping shapes
+%
+% 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
+% \prm {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.
+
+% Controlling glue with \prm {breakafterdirmode}
+%
+% Glue after a dir node is ignored in the linebreak decision but you can bypass that
+% by setting \prm {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=Orientations]
+
+\topicindex {boxes+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: \prm
+{boxdirection}, \prm {boxattribute}, \prm {boxorientation}, \prm {boxxoffset},
+\prm {boxyoffset}, \prm {boxxmove}, \prm {boxymove} and \prm {boxtotal}.
+
+{\em This is still somewhat experimental and will be documented in more detail
+when I've used it more in \CONTEXT\ and the specification is frozen. This might
+take some time (and user input).}
+
+\stopsubsection
+
+\stopsection
+
+\startsection[title={Boxes, rules and leaders}]
+
+\startsubsection[title={\prm {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 {hrule}, \prm {vrule}, \prm {srule}, \prm {nohrule}, \prm {novrule},
+\prm {virtualhrule} and \prm {virtualvrule}}]
+
+\topicindex {rules}
+
+Both rule drawing commands take an optional \type {xoffset} and \type {yoffset}
+parameter. The displacement is virtual and not taken into account when the
+dimensions are calculated. A rule is specified in the usual way:
+
+\obeydepth
+
+\startbuffer
+\blue \vrule
+ height 2ex depth 1ex width 10cm
+\relax
+\stopbuffer
+
+\startlinecorrection
+\getbuffer
+\stoplinecorrection
+
+There is however a catch. The keyword scanners in \LUAMETATEX\ are implemented
+slightly different. When \TEX\ scans a keyword it will (case insensitive) scan
+for a whole keyword. So, it scans for \type {height} and when it doesn't find it
+it will scan for \type {depth} etc. When it does find a keyword in this case it
+expects a dimension next. When that criterium is not met it will issue an error
+message.
+
+In order to avoid look ahead failures like that it is recommended to end the
+specification with \type {\relax}. A glue specification is an other example where
+a \type {\relax} makes sense when look ahead issues are expected and actually
+there in traditional scanning the order of keywords can also matter. In any case,
+when no valid keyword is seen the characters scanned so far are pushed back in
+the input.
+
+The main reason for using an adapted scanner is that we always permit repetition
+(consistency) and accept an arbitrary order. Because we have more keywords to
+process the scanner quits at a partial failure. This prevents some push back and
+also gives an earlier warning. Interesting is that some \CONTEXT\ users ran into
+error messages due to a missing \type {\relax} and found out that their style has
+a potential flaw with respect to look ahead. One can be lucky for years.
+
+Back to rules, there are some extra keywords, two deal with an offset, and four
+provide margins. The margins are a bit special because \type {left} and \type
+{top} are the same as are \type {right} and \type {bottom}. They influence the
+edges and these depend on it being a horizontal or vertical rule.
+
+\obeydepth
+
+\startbuffer
+\blue \vrule
+ height 2.0ex depth 1.0ex width 10cm
+\relax
+\white \vrule
+ height 1.0ex depth 0.5ex width 9cm
+ xoffset -9.5cm yoffset .25ex
+\relax
+\blue \vrule
+ height .5ex depth 0.25ex width 8cm
+ xoffset -18cm yoffset .375ex top 1pt
+\relax
+\stopbuffer
+
+\startlinecorrection
+\getbuffer
+\stoplinecorrection
+
+Two new primitives were introduced: \prm {nohrule} and \prm {novrule}. These can
+be used to reserve space. This is often more efficient than creating an empty box
+with fake dimensions. Of course this assumes that the backend implements them
+being invisible but still taking space.
+
+An \prm {srule} is sort of special. In text mode it is just a convenience (we
+could do without it for ages) but in math mode it comes in handy when we want to
+enforce consistency. \footnote {In \CONTEXT\ there is a lot of focus on
+consistent vertical spacing, something that doesn't naturally comes with \TEX\
+(you have to pay attention!) and therefore for decades now you can find plenty of
+documents with bad spacing of a nature that has seem to have become accepted as
+quality. This probably makes these \prm {srule}'s one of the few primitives that
+actually targets at \CONTEXT.}
+
+As with all rules, the backend will makes rules span the width or height and
+depth of the encapsulating box. An \prm {srule} is just a \prm {vrule} but is set
+up such that it can adapt itself:
+
+\startbuffer
+\hbox to 3cm {x\leaders\hrule\hfil x}
+\hbox{x \vrule width 4cm \relax x}
+\hbox{x \srule width 4cm \relax x}
+\hbox{x \vrule font \font char `( width 4cm \relax x}
+\hbox{x \srule font \font char `( width 4cm \relax x}
+\hbox{$x \srule fam \fam char `( width 4cm \relax x$}
+\hbox{$x \vrule fam \fam char `( width 4cm \relax x$}
+\stopbuffer
+
+\typebuffer
+
+You can hard code the height and depth or get it from a font|/|family|/|character
+combination. This is especially important in math mode where then can adapt to
+(stylistic) circumstances.
+
+\startlines
+\showboxes\getbuffer
+\stoplines
+
+Because this kind of rules has a dedicated subtype you can intercept it in the backend
+if needed. The two virtual variants are special in the way that they are like normal
+rules but take no space. Can you figure out how to get this?
+
+\startlinecorrection[blank]
+\dontleavehmode \hbox{%
+ \hbox{\green before}%
+ {\darkblue \virtualvrule width 40pt height -2pt depth 4pt xoffset -20pt\relax}%
+ \hbox{\red after}%
+}
+\stoplinecorrection
+
+% \vskip5pt
+
+% \ruledvbox{\ruledhbox to 10pt{\green x}
+% \virtualhrule width 10pt height 2pt depth 2pt yoffset -2pt \relax
+% \ruledhbox to 10pt{\red x}}
+
+\stopsubsection
+
+\startsubsection[title={\prm {vsplit}, \prm {tsplit} and \prm {dsplit}}]
+
+\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.
+
+\starttyping
+\vsplit 123 to 10cm % final box has the required height
+\vsplit 123 upto 10cm % final box has its natural height
+\stoptyping
+
+The two alternative primitives return a \prm {vtop} or \prm {dbox} instead of a
+\prm {vbox}. All three accept the \type {attr} keyword as boxes do.
+
+\stopsubsection
+
+\startsubsection[title={\prm {boxxoffset}, \prm {boxyoffset}, \prm {boxxmove}, \prm {boxymove},
+\prm{boxorientation} and \prm{boxgeometry}}]
+
+This repertoire of primitives can be used to do relative positioning. The offsets
+are virtual while the moves adapt the dimensions. The orientation bitset can be
+used to rotate the box over 90, 180 and 270 degrees. It also influences the
+corner, midpoint or baseline.
+
+{\em There is information in the \CONTEXT\ low level manuals and in due time I
+will add a few examples here. This feature needs support in the backend when used
+(as in \CONTEXT) so it might influence performance.}
+
+\stopsubsection
+
+\startsubsection[title={\prm {boxtotal}}]
+
+The \prm {boxtotal} primitive returns the sum of the height and depth and is less
+useful as setter: it just sets the height and depth to half of the given value.
+
+\stopsubsection
+
+\startsubsection[title={\prm {boxshift}}]
+
+In traditional \TEX\ a box has height, depth, width and a shift where the later
+relates to \prm {raise}, \prm {lower}, \prm {moveleft} and \prm {moveright}. This
+primitive can be used to query and set this property.
+
+\startbuffer
+\setbox0\hbox{test test test}
+\setbox2\hbox{test test test} \boxshift2 -10pt
+\ruledhbox{x \raise10pt\box0\ x}
+\ruledhbox{x \box2\ x}
+\stopbuffer
+
+\typebuffer
+
+\stopsubsection
+
+\startsubsection[title={\prm {boxanchor}, \prm {boxanchors}, \prm {boxsource} and \prm {boxtarget}}]
+
+{\em These are experimental.}
+
+\stopsubsection
+
+\startsubsection[title={\prm {boxfreeze}, \prm {boxadapt} and \prm {boxrepack}}]
+
+\topicindex {boxes+postprocessing}
+
+This operation will freeze the glue in the given box, something that normally is
+delayed and delegated to the backend.
+
+\startbuffer
+\setbox 0 \hbox to 5cm {\hss test}
+\setbox 2 \hbox to 5cm {\hss test}
+\boxfreeze 2 0
+\ruledhbox{\unhbox 0}
+\ruledhbox{\unhbox 2}
+\stopbuffer
+
+\typebuffer
+
+The second parameter to \prm {boxfreeze} determines recursion. Here we just
+freeze the outer level:
+
+\getbuffer
+
+Repacking will take the content of an existing box and add or subtract from it:
+
+\startbuffer
+\setbox 0 \hbox {test test test}
+\setbox 2 \hbox {\red test test test} \boxrepack0 +.2em
+\setbox 4 \hbox {\green test test test} \boxrepack0 -.2em
+\ruledhbox{\box0} \vskip-\lineheight
+\ruledhbox{\box0} \vskip-\lineheight
+\ruledhbox{\box0}
+\stopbuffer
+
+\typebuffer
+
+\getbuffer
+
+We can use this primitive to check the natural dimensions:
+
+\startbuffer
+\setbox 0 \hbox spread 10pt {test test test}
+\ruledhbox{\box0} (\the\boxrepack0,\the\wd0)
+\stopbuffer
+
+\typebuffer
+
+\getbuffer
+
+Adapting will recalculate the dimensions with a scale factor for the glue:
+
+\startbuffer
+\setbox 0 \hbox {test test test}
+\setbox 2 \hbox {\red test test test} \boxadapt 0 200
+\setbox 4 \hbox {\blue test test test} \boxadapt 0 -200
+\ruledhbox{\box0} \vskip-\lineheight
+\ruledhbox{\box0} \vskip-\lineheight
+\ruledhbox{\box0}
+\stopbuffer
+
+\typebuffer
+
+\getbuffer
+
+\stopsubsection
+
+\startsubsection[title={\prm {boxvadjust}}]
+
+This primitive binds a \prm {vadjust} to a box and therefore also accepts the
+\type {pre} and \type {post} keywords which means that you can prepend and append
+as the box itself gets flushed.
+
+\stopsubsection
+
+\startsubsection[title={Overshooting dimensions}]
+
+\topicindex {boxes+overfull}
+
+The \prm {overshoot} primitive reports the most recent amount of overshoot when a
+box is packages. It relates to overfull boxes and the then set \prm {badness} of
+1000000.
+
+\startbuffer
+\hbox to 2cm {does it fit} \the\overshoot
+\hbox to 2cm {does it fit in here} \the\overshoot
+\hbox to 2cm {how much does fit in here} \the\overshoot
+\stopbuffer
+
+\typebuffer
+
+This global state variables reports a dimension:
+
+\startlines
+\getbuffer
+\stoplines
+
+\stopsubsection
+
+\startsubsection[title={Images and reused box objects},reference=sec:imagesandforms]
+
+\topicindex {images}
+
+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 (formerly local) par 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 separation 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 \tex {saveboxresource} \NC save the box as an object to be included later \NC \NR
+\NC \tex {saveimageresource} \NC save the image as an object to be included later \NC \NR
+\NC \tex {useboxresource} \NC include the saved box object here (by index) \NC \NR
+\NC \tex {useimageresource} \NC include the saved image object here (by index) \NC \NR
+\NC \tex {lastsavedboxresourceindex} \NC the index of the last saved box object \NC \NR
+\NC \tex {lastsavedimageresourceindex} \NC the index of the last saved image object \NC \NR
+\NC \tex {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 \tex {useimageresource} but
+the original dimensions are not overwritten, so that a \tex {useimageresource}
+without dimensions still provides the image with dimensions defined by \tex
+{saveimageresource}. These optional parameters are not implemented for \tex
+{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={\prm {dbox}}]
+
+This primitive is a variant on \prm {vbox} in the sense that when it gets
+appended to a vertical list the height of the topmost line or rule as well as the
+depth of the box are taken into account when interline space is calculated.
+
+\stopsubsection
+
+
+\startsubsection[title={\prm {hpack}, \prm {vpack}, \prm {tpack} and \prm {dpack}}]
+
+\topicindex {packing}
+
+These three primitives are the equivalents of \prm {hbox}, \prm {vbox}, \prm
+{vtop} and \prm {dbox} 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. Apart from accepting more keywords (and therefore options) the
+normal box behave the same as before.
+
+\stopsubsection
+
+\startsubsection[title={\prm {vcenter}}]
+
+The \prm {vcenter} builder also works in text mode.
+
+\stopsubsection
+
+\startsubsection[title={\prm {unhpack}, \prm {unvpack}}]
+
+\topicindex {unpacking}
+
+These two are somewhat experimental. They ignore the accumulated pre- and
+postmigrated material bound to a box. I needed it for some experiment so the
+functionality might change when I really need it.
+
+\stopsubsection
+
+\startsubsection[title={\prm {gleaders} and \prm {uleaders}},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. The \prm {uleaders} are
+used for flexible boxes and are discussed elsewhere.
+
+\stopsubsection
+
+\stopsection
+
+\startsection[title={Paragraphs}]
+
+\startsubsection[title=Freezing]
+
+In \LUAMETATEX\ we store quite some properties with a paragraph. Where in traditional
+\TEX\ the properties that are set when the paragraph broken into lines are used, here
+we can freeze them.
+
+{\em At some point this section will describe \prm {autoparagraphmode}, \prm
+{everybeforepar}, \prm {snapshotpar}, \prm {wrapuppar}, etc. For the moment the
+manuals that come with \CONTEXT\ have to do.}
+
+\stopsubsection
+
+\startsubsection[title=Penalties]
+
+In addition to the penalties introduced in \ETEX, we also provide \prm
+{orphanpenalty} and \prm {orphanpenalties}. When we're shaping a paragraph
+an additional \prm {shapingpenalty} can be injected. This penalty gets
+injected instead of the usual penalties when the following bits are set in
+\prm {shapingpenaltiesmode}:
+
+\starttabulate[|l|l|p|]
+\DB value \BC ignored \NC \NR
+\TB
+\NC \type {0x01} \NC interlinepenalty \NC \NR
+\NC \type {0x02} \NC widowpenalty \NC \NR
+\NC \type {0x04} \NC clubpenalty \NC \NR
+\NC \type {0x08} \NC brokenpenalty \NC \NR
+\LL
+\stoptabulate
+
+When none of these is set the shaping penalty will be added. That way one can
+prevent a page break inside a shape.
+
+\stopsubsection
+
+\startsubsection[title=Criteria]
+
+The linebreak algorithm uses some heuristics for determining the badness of a
+line. In most cases that works quite well. Of course one can run into a bad
+result when one has a large document of weird (extreme) constraints and it can be
+tempting to mess around with parameters which then of course can lead to bad
+results in other places. A solution is is to locally tweak penalties or looseness
+but one can also just accept the occasional less optimal result (after all there
+are plenty occasions to make a document look bad otherwise so best focus on the
+average first). That said, it is tempting to see if changing the hard codes
+criteria makes a difference. Experiments with this demonstrated the usual: when
+asked what looks best contradictions mix with expectations and being triggered by
+events that one related to \TEX, like successive hyphenated lines.
+
+The \prm {linebreakcriterium} parameter can be set to a value made from four bytes. We're
+not going to explain the magic numbers because they come from and are discussed in original
+\TEX. It is enough to know that we have four criteria:
+
+\starttabulate[|l|l|p|]
+\DB magic \BC bound to \NC bytes \NC \NR
+\TB
+\NC 12 \NC semi tight \NC 0x7F...... \NC \NR
+\NC 12 \NC decent \NC 0x..7F.... \NC \NR
+\NC 12 \NC semi loose \NC 0x....7F.. \NC \NR
+\NC 99 \NC loose \NC 0x......7F \NC \NR
+\LL
+\stoptabulate
+
+These four values can be changed according to the above pattern and are limited
+to the range 1\endash127 which is plenty especially when one keeps in mind that
+the actual useful values sit around the 12 anyway. Values outside the range (and
+therefore an all|-|over zero assignment) makes the defaults kick in.
+
+The original decisions are made in the following way:
+
+\starttyping
+function loose(badness)
+ if badness > loose_criterium then
+ return very_loose_fit
+ elseif badness > decent_criterium then
+ return loose_fit
+ else {
+ return decent_fit
+ end
+end
+
+function tight(badness)
+ if badness > decent_criterium then
+ return tight_fit
+ else {
+ return decent_fit
+ end
+end
+\stoptyping
+
+while in \LUAMETATEX\ we use (again in \LUA speak):
+
+\starttyping
+function loose(badness)
+ if badness > loose then
+ return very_loose_fit
+ elseif badness > semi_loose then
+ return semi_loose_fit
+ elseif badness > decent then
+ return loose_fit
+ else
+ return decent_fit
+ end
+end
+
+function tight(badness)
+ if badness > semi_tight then
+ return semi_tight_fit
+ else if badness > decent then
+ return tight_fit
+ else
+ return decent_fit
+ end
+end
+\stoptyping
+
+So we have a few more steps to play with. But don't be disappointed when it
+doesn't work out as you expect. Don Knuth did a good job on the heuristics and
+after many decades there is no real need to change something. Consider it a
+playground.
+
+The parameter \prm {ignoredepthcriterium} is set to -1000pt at startup and is a
+special signal for \prm {prevdepth}. You can change the value locally for
+educational purposes but best not mess with this standard value in production
+code unless you want special effects.
+
+\stopsubsection
+
+\stopsection
+
+\startsection[title={Inserts}]
+
+Inserts are tightly integrated into the page builder. Depending on penalties and
+available space they end up on the same page as were they got injected or they
+move to following pages, either or not split.
+
+In traditional \TEX\ inserts are controlled by registers. A quadruple of box,
+skip, dimen and count registers with the same number acts as an insert class.
+Details can be found in the \TEX book. A side effect of this is that we only have
+these four properties bound to class, other properties of inserts are driven by
+shared parameters. Another side effect is that register management has to make
+sure that these foursome get \quote {allocates} as set and not clashes with other
+register allocations.
+
+In \LUAMETATEX\ you can set the \prm {insertmode} to a non zero value in which case
+inserts are not using the register pool but have their own (global) resources. For
+now this is mode driven (for compatibility reasons) and once set or when an
+insert has been accessed, this mode is frozen, so this parameter can be set
+very early in the macro package loading process.
+
+
+\starttabulate[|l|l|p|]
+\DB primitive \BC traditional \BC explanation \NC \NR
+\TB
+\NC \prm {insertdistance} \NC skip \NC the space before the first instance (on a page) \NC \NR
+\NC \prm {insertmultiplier} \NC count \NC a factor that is used to calculate the height used \NC \NR
+\NC \prm {insertlimit} \NC dimen \NC the maximum amount of space on a page to be taken \NC \NR
+\NC \prm {insertpenalty} \NC \prm {insertpenalties} \NC the floating penalty (used when set) \NC \NR
+\NC \prm {insertmaxdepth} \NC \prm {maxdepth} \NC the maximum split depth (used when set) \NC \NR
+\NC \prm {insertstorage} \NC \NC signals that the insert has to be stored for later \NC \NR
+\NC \prm {insertheight} \NC \prm {ht} box / index \NC the accumulated height of the inserts so far \NC \NR
+\NC \prm {insertdepth} \NC \prm {dp} box / index \NC the current depth of the inserts so far \NC \NR
+\NC \prm {insertwidth} \NC \prm {wd} box / index \NC the width of the inserts \NC \NR
+\NC \prm {insertbox} \NC box / index \NC the boxed content \NC \NR
+\NC \prm {insertcopy} \NC box / index \NC a copy of the boxed content \NC \NR
+\NC \prm {insertunbox} \NC box / index \NC the unboxed content \NC \NR
+\NC \prm {insertuncopy} \NC box / index \NC a copy of the unboxed content \NC \NR
+\NC \prm {insertuncopy} \NC box / index \NC a copy of the unboxed content \NC \NR
+\NC \prm {insertprogress} \NC box / index \NC the currently accumulated height \NC \NR
+\LL
+\stoptabulate
+
+These primitives takes an insert class number. The \prm {insertpenalties}
+primitives is unchanged, as is the \LUATEX\ \prm {insertheights} one. When \prm
+{insertstoring} is set 1, all inserts that have their storage flag set will be
+saved. Think of a multi column setup where inserts have to end up in the last
+column. If there are three columns, the first two will store inserts. Then when
+the last column is dealt with \prm {insertstoring} can be set to 2 and that will
+signal the builder that we will inject the inserts. In both cases, the value of
+this register will be set to zero so that it doesn't influence further
+processing. You can use \prm {ifinsert} to check if an insert box is void. More
+details about these (probably experimental for a while) features can be found in
+documents that come with \CONTEXT.
+
+A limitation of inserts is that when they are buried too deep, a property they
+share with inserts, they become invisible This can be dealt with by the migration
+feature described in an upcoming section.
+
+The \LUAMETATEX\ engine has some tracing built in that is enabled by setting \prm
+{tracinginserts} to a positive value.
+
+\stopsection
+
+\startsection[title={Marks}]
+
+\topicindex {marks}
+
+Marks are kind of signal nodes in the list that refer to stored token lists. When
+a page has been split off and is handed over to the output routine these signals
+are resolved into first, top and bottom mark references that can (for instance)
+be used for running headers.
+
+In \ETEX\ the standard \TEX\ primitives \prm {mark}, \prm {firstmark}, \prm
+{topmark}, \prm {botmark}, \prm {splitfirstmark} and \prm {splitbotmark} have
+been extended with plural forms that accent a number before the token list. That
+number indicates a mark class.
+
+In addition to the mark fetch commands, we also have access to the last set
+mark in the given class with \prm {currentmarks}:
+
+\startsyntax
+\currentmarks <16-bit number>
+\stopsyntax
+
+A problem with marks is that one cannot really reset them. Mark states are kept
+in the node lists and only periodically the state is snapshot into the global
+state variables. The \LUATEX\ engine can reset these global states with \prm
+{clearmarks} but that's only half a solution. In \LUAMETATEX\ we have \prm
+{flushmarks} which, like \prm {marks}, puts a node in the list that does a reset.
+This permits implementing controlled resets of specific marks at the cost of a
+possible interfering mode, but that can normally be dealt with rather well.
+
+The \prm {clearmarks} 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 (no synchronization node is used).
+
+\startsyntax
+\clearmarks <16-bit number>
+\stopsyntax
+
+The \prm {flushmarks} variant is delayed but puts a (mark) node in the list as
+signal (we could have gone for a keyword to \prm {marks} instead).
+
+\startsyntax
+\flushmarks <16-bit number>
+\stopsyntax
+
+Another problem with marks is that when they are buried too deep, a property they
+share with inserts, they become invisible. This can be dealt with by the
+migration feature described in the next section.
+
+The \LUAMETATEX\ engine has some tracing built in that is enabled by setting \prm
+{tracingmarks} to a positive value. When set to~1 the page builder shows the set
+values, and when set to a higher value details about collecting them are shown.
+
+\stopsection
+
+\startsection[title={Adjusts}]
+
+The \prm {vadjust} primitive injects something in the vertical list after the
+line where it ends up. In \PDFTEX\ the \type {pre} keyword was added so that one
+could force something before a previous line (actually this was something that we
+needed in \CONTEXT\ \MKII). The \LUAMETATEX\ engine also supports the \type {post}
+keyword.
+
+We support a few more keywords: \type {before} will prepend the adjustment to the
+already given one, and \type {after} will append it. The \type {index} keyword
+expects an integer and relates that to the current adjustment. This index is
+passed to an (optional) callback when the adjustment is finally moved to the
+vertical list. That move is actually delayed because like inserts and marks these
+(vertical) adjustments can migrate to the \quote {outer} vertical level.
+
+The main reason for the index having no influence on the order is that this
+primitive already could be used multiple times and order is determined by usage.
+\footnote {Under consideration is to let the callback mess with the flushing
+order.}
+
+The \LUAMETATEX\ engine has some tracing built in that is enabled by setting \prm
+{tracingadjusts} to a positive value. Currently there is not that much tracing
+which is why the value has to be at least 2 in order to be compatible with other
+(detailed) tracers.
+
+\stopsection
+
+\startsection[title={Migration}]
+
+There are a few injected node types that are used to track information: marks,
+inserts and adjusts (see previous sections). Marks are token lists that can be
+used to register states like section numbers and titles they are synchronized in
+the page builder when a page is shipped out. Inserts are node lists that get
+rendered and relate to specific locations and these are flushed with the main
+vertical list which also means that in calculating page breaks they need to be
+taken into account. An Adjust is material that gets injected before or after a
+line. Strictly spoke local boxes also in this repertoire but they are dealt with
+in the par builder.
+
+A new primitive \prm {automigrationmode} can be used to let deeply burried marks
+and inserts bubble up to the outer level.
+
+\starttabulate[|c|p|]
+\DB value \BC explanation \NC \NR
+\TB
+\NC \the\markautomigrationcode \NC migrate marks in the par builder \NC \NR
+\NC \the\insertautomigrationcode \NC migrate inserts in the par builder \NC \NR
+\NC \the\adjustautomigrationcode \NC migrate adjusts in the par builder \NC \NR
+\NC \the\preautomigrationcode \NC migrate prebox material in the page builder \NC \NR
+\NC \the\postautomigrationcode \NC migrate postbox material in the page builder \NC \NR
+\LL
+\stoptabulate
+
+If you want to migrate marks and inserts you need to set all these flags. Migrated
+marks and inserts end up as post|-|box properties and will be handled in the page
+builder as such. At the \LUA\ end you can add pre- and post|-|box material too.
+
+The primitive register \prm {holdingmigrations} is a bitset that can be used to temporarily
+disable migrations. It is a generalization of \prm {holdinginserts}.
+
+\starttabulate[|cT|p|]
+\DB value \BC explanation \NC \NR
+\TB
+\NC 0x01 \NC marks \NC \NR
+\NC 0x02 \NC inserts \NC \NR
+\NC 0x04 \NC adjusts \NC \NR
+\LL
+\stoptabulate
+
+Migrates material is bound to boxes so boxed material gets unboxed it is taken
+into account, but you should be aware of potential side effects. But then, marks,
+inserts and adjusts always demanded care.
+
+\stopsection
+
+\startsection[title={Pages}]
+
+The page builder can be triggered by (for instance) a penalty but you can also
+use \prm {pageboundary}. This will trigger the page builder but not leave
+anything behind.
+
+{\em In due time we will discuss \prm {pagevsize}, \prm {pageextragoal} and \prm
+{lastpageextra} but for now we treat them as very experimental and they will be
+tested in \CONTEXT, also in discussion with users.}
+
+\stopsection
+
+\startsection[title={Paragraphs}]
+
+The numeric primitive \prm {lastparcontext} inspector reports the current context
+in which a paragraph triggering commands happened. The numbers can be queried
+with \type {tex.getparcontextvalues()} and currently are: \showvaluelist
+{tex.getparcontextvalues()}. As with the other \type {\last...} primitives this
+variable is global.
+
+Traditional \TEX\ has the \prm {parfillskip} parameter that determines the way
+the last line is filled. In \LUAMETATEX\ we also have \prm {parfillleftskip}. The
+counterparts for the first line are \prm {parinitleftskip} and \prm
+{parinitrightskip}.
+
+\startbuffer
+\leftskip 2em
+\rightskip \leftskip
+\parfillskip \zeropoint plus 1 fill
+\parfillleftskip \parfillskip
+\parinitleftskip \parfillleftskip
+\parinitrightskip\parfillleftskip
+\input ward
+\stopbuffer
+
+\typebuffer This results in: \par \start \em \getbuffer \par \stop
+
+An additional tracing primitive \prm {tracingfullboxes} reports details about the
+encountered overfull boxes. This can be rather verbose!
+
+Normally \TEX\ will insert an empty hbox when paragraph indentation is requested
+but when the second bit in \prm {normalizelinemode} has been set \LUAMETATEX\
+will in a glue node instead. You can zero the set value with \prm {undent} unless
+of course some more has been inserted already.
+
+\startbuffer
+\parinitleftskip1cm \parindent 1cm \indent test \par
+\parinitleftskip1cm \parindent 1cm \undent test \par
+\parinitleftskip1cm \parindent 1cm \indent \undent test \par
+\parinitleftskip1cm \parindent 1cm \indent \strut \undent test \par
+\stopbuffer
+
+\typebuffer \startpacked \getbuffer \stoppacked
+
+By setting \prm {tracingpenalties} to a positive value penalties related to
+windows, clubs, lines etc.\ get reported to the output channels.
+
+\stopsection
+
+\startsection[title={Local boxes}]
+
+As far as I know the \OMEGA/\ALEPH\ local box mechanism is mostly in those
+engines in order to support repetitive quotes. In \LUATEX\ this mechanism has
+been made more robust and in \LUAMETATEX\ it became more tightly integrated in
+the paragraph properties. In order for it to be more generic and useful, it got
+more features. For instance it is a bit painful to manage with respect to
+grouping (which is a reason why it's not that much used). The most interesting
+property is that the dimensions are taken into account when a paragraph is
+broken into lines.
+
+There are three commands: \prm {localleftbox}, \prm {localrightbox} and the
+\LUAMETATEX\ specific \prm {localmiddlebox} which is basically a right box but
+when we pass these boxes to a callback they can be distinguished (we could have
+used the index but this was a cheap extra signal so we keep it).
+
+These commands take optional keywords. The \type {index} keyword has to be
+followed by an integer. This index determines the order which doesn't introduce a
+significant compatibility issue: local boxes are hardly used and originally had
+only one instance.
+
+The \type {par} keyword forces the box to be added to the current paragraph head.
+This permits setting them when a paragraph has already started. The
+implementation of these boxes is done via so called (local) paragraph nodes and
+there is one at the start of each paragraph.
+
+The \type {local} keyword tells this mechanism not to update the registers that
+keep these boxes. In that case a next paragraph will start fresh. The \type
+{keep} option will do the opposite and retain the box after a group ends.
+
+The commands: \prm {localleftboxbox}, \prm {localrightboxbox} and \prm
+{localmiddleboxbox} return a copy of the current related register content.
+
+\stopsection
+
+\startsection[title={Leaders}]
+
+Leaders are flexible content that are basically just seen as glue and it is up to
+the backend to apply the effective glue to the result as seen in the backend
+(like a rule of box). This means that the frontend doesn't do anything with the
+fact that we have a regular \prm {leaders}, a \prm {gleaders}, \prm {xleaders} or
+\prm {cleaders}. The \prm {uleaders} that has been added in \LUAMETATEX\ is just
+that: an extra leader category. The main difference is that the width of the
+given box is added to the glue. That way we create a stretchable box.
+
+\startbuffer
+\unexpandedloop 1 30 1 {x \hbox{1 2 3} x }
+\unexpandedloop 1 30 1 {x {\uleaders \hbox{1 2 3}\hskip 0pt plus 10pt minus 10pt\relax} x }
+\unexpandedloop 1 30 1 {x {\uleaders \hbox{1 2 3}\hskip 0pt plus \interwordstretch minus \interwordshrink} x }
+\unexpandedloop 1 30 1 {x {\uleaders \hbox{1 2 3}\hskip 0pt plus 2\interwordstretch minus 2\interwordshrink} x }
+\stopbuffer
+
+\typebuffer
+
+Here are some examples:
+
+\startlines
+\getbuffer
+\stoplines
+
+So the flexibility fo the box plays a role in the line break calculations. But in
+the end the backend has to do the work.
+
+\startbuffer[a]
+{\green \hrule width \hsize} \par \vskip2pt
+\vbox to 40pt {
+ {\red\hrule width \hsize} \par \vskip2pt
+ \vbox {
+ \vskip2pt {\blue\hrule width \hsize} \par
+ \vskip 10pt plus 10pt minus 10pt
+ {\blue\hrule width \hsize} \par \vskip2pt
+ }
+ \vskip2pt {\red\hrule width \hsize} \par
+}
+\vskip2pt {\green \hrule width \hsize} \par
+\stopbuffer
+
+\startbuffer[b]
+{\green \hrule width \hsize} \par \vskip2pt
+\vbox to 40pt {
+ {\red\hrule width \hsize} \par \vskip2pt
+ \uleaders\vbox {
+ \vskip2pt {\blue\hrule width \hsize} \par
+ \vskip 10pt plus 10pt minus 10pt
+ {\blue\hrule width \hsize} \par \vskip2pt
+ }\vskip 0pt plus 10pt minus 10pt
+ \vskip2pt {\red\hrule width \hsize} \par
+}
+\vskip2pt {\green \hrule width \hsize} \par
+\stopbuffer
+
+\typebuffer[a]
+
+with
+
+\typebuffer[b]
+
+In the first case we get the this:
+
+\startlinecorrection
+\getbuffer[a]
+\stoplinecorrection
+
+but with \prm {uleaders} we get:
+
+\startlinecorrection
+\normalizeparmode\zerocount
+\getbuffer[b]
+\stoplinecorrection
+
+or this:
+
+\startlinecorrection
+\normalizeparmode"FF
+\getbuffer[b]
+\stoplinecorrection
+
+In the second case we flatten the leaders in the engine by setting the second bit
+in the \prm {normalizeparmode} parameter (\type {0x2}). We actually do the same
+with \prm {normalizelinemode} where bit 10 is set (\type {0x200}). The \type
+{delay} keyword can be passed with a box to prevent flattening. If we don't do
+this in the engine, the backend has to take care of it. In principle this permits
+implementing variants in a macro package. Eventually there will be plenty examples in
+the \CONTEXT\ code base and documentation. Till then, consider this experimental.
+
+\stopsection
+
+\startsection[title=Alignments]
+
+The primitive \prm {alignmark} duplicates the functionality of \type {#} inside
+alignment preambles, while \prm {aligntab} duplicates the functionality of \type
+{&}. The \prm {aligncontent} primitive directly refers to an entry so that one
+does not get repeated.
+
+Alignments can be traced with \prm {tracingalignments}. When set to~1 basics
+usage is shown, for instance of \prm {noalign} but more interesting is~2 or more:
+you then get the preambles reported.
+
+The \prm {halign} (tested) and \prm {valign} (yet untested) primitives accept a
+few keywords in addition to \type {to} and \type {spread}:
+
+\starttabulate[|l|p|]
+\DB keyword \BC explanation \NC \NR
+\TB
+\NC \type {attr} \NC set the given attribute to the given value \NC \NR
+\NC \type {callback} \NC trigger the \type {alignment_filter} callback \NC \NR
+\NC \type {discard} \NC discard zero \prm {tabskip}'s \NC \NR
+\NC \type {noskips} \NC don't even process zero \prm {tabskip}'s \NC \NR
+\NC \type {reverse} \NC reverse the final rows \NC \NR
+\LL
+\stoptabulate
+
+In the preamble the \prm {tabsize} primitive can be used to set the width of a
+column. By doing so one can avoid using a box in the preamble which, combined
+with the sparse tabskip features, is a bit easier on memory when you produce
+tables that span hundreds of pages and have a dozen columns.
+
+The \prm {everytab} complements the \prm {everycr} token register but is sort of
+experimental as it might become more selective and powerful some day.
+
+The two primitives \prm {alignmentcellsource} and \prm {alignmentwrapsource} that
+associate a source id (integer) to the current cell and row (line). Sources and
+targets are experimental and are being explored in \CONTEXT\ so we'll see where
+that ends up in.
+
+{\em todo: callbacks}
+
+\stopsection
+
+\stopchapter
+
+\stopcomponent
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
index d8e98efa291..803b0427b04 100644
--- 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
@@ -1,4 +1,4 @@
-% language=uk
+% language=us runpath=texruns:manuals/luametatex
\environment luametatex-style
@@ -16,18 +16,20 @@
\libindex{known}
{\em The callbacks are a moving target. Don't bother me with questions about
-them.}
+them. Some are new and/or experimental and therefore not yet documented. In
+\CONTEXT\ we can easily adapt interfaces so changes in these have no real effect
+on users. Of course in due time all will be official and documented.}
This library has functions that register, find and list callbacks. Callbacks are
\LUA\ functions that are called in well defined places. There are two kinds 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.
+enabled) replace functionality. In most 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 kern routine. 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:
@@ -74,9 +76,9 @@ if callback.known("foo") then ... end
\stopsection
-\startsection[title={File related callbacks}][library=callback]
+\startsection[title={File related callbacks},reference=iocallback][library=callback]
-\subsection{\cbk {find_format_file} and \cbk {find_log_file}}
+\startsubsection[title={\cbk {find_format_file} and \cbk {find_log_file}}]
\topicindex{callbacks+format file}
\topicindex{callbacks+log file}
@@ -91,7 +93,9 @@ These callbacks are called as:
The \type {askedname} is a format file for reading (the format file for writing
is always opened in the current directory) or a log file for writing.
-\subsection{\cbk {open_data_file}}
+\stopsubsection
+
+\startsubsection[title={\cbk {open_data_file}}]
\topicindex{callbacks+opening files}
@@ -124,12 +128,14 @@ their only argument.
% <boolean> eof =
% function ()
% \stopfunctioncall
-%
-% \stopsection
+
+\stopsubsection
+
+\stopsection
\startsection[title={Data processing callbacks}][library=callback]
-\subsection{\cbk {process_jobname}}
+\startsubsection[title={\cbk {process_jobname}}]
\topicindex{callbacks+jobname}
@@ -148,13 +154,15 @@ 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.
+\stopsubsection
+
\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}}
+\startsubsection[title={\cbk {contribute_filter}}]
\topicindex{callbacks+contributions}
@@ -178,7 +186,9 @@ what list you can give a treat.
\LL
\stoptabulate
-\subsection{\cbk {buildpage_filter}}
+\stopsubsection
+
+\startsubsection[title={\cbk {buildpage_filter}}]
\topicindex{callbacks+building pages}
@@ -211,11 +221,13 @@ state is with respect to the \quote {current page}. The possible values for the
\LL
\stoptabulate
-\subsection{\cbk {build_page_insert}}
+\stopsubsection
+
+\startsubsection[title={\cbk {build_page_insert}}]
\topicindex{callbacks+inserts}
-This callback is called when the pagebuilder adds an insert. There is not much
+This callback is called when the page builder 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.
@@ -242,7 +254,9 @@ prepended spacing. This permits for instance a different top space (when \type
course you can mess with the insert box but you need to make sure that \LUATEX\
is happy afterwards.
-\subsection{\cbk {pre_linebreak_filter}}
+\stopsubsection
+
+\startsubsection[title={\cbk {pre_linebreak_filter}}]
\topicindex{callbacks+linebreaks}
@@ -273,7 +287,7 @@ explained in the next two paragraphs.
\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{local_box} \NC \prm {localleftbox} or \prm {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
@@ -300,7 +314,9 @@ three things:
This callback does not replace any internal code.
-\subsection{\cbk {linebreak_filter}}
+\stopsubsection
+
+\startsubsection[title={\cbk {linebreak_filter}}]
\topicindex{callbacks+linebreaks}
@@ -325,7 +341,9 @@ represent an \prm {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}}
+\stopsubsection
+
+\startsubsection[title={\type {append_to_vlist_filter}}]
\topicindex{callbacks+contributions}
@@ -344,7 +362,9 @@ the box or deal with it yourself. The prevdepth is also optional. Locations are
\type {post_linebreak}. When the third argument returned is \type {true} the
normal prevdepth correction will be applied, based on the first node.
-\subsection{\cbk {post_linebreak_filter}}
+\stopsubsection
+
+\startsubsection[title={\cbk {post_linebreak_filter}}]
\topicindex{callbacks+linebreaks}
@@ -359,7 +379,34 @@ end
This callback does not replace any internal code.
-\subsection{\cbk {hpack_filter}}
+\stopsubsection
+
+\startsubsection[title={\cbk {glyph_run}}]
+
+\topicindex{callbacks+fonts}
+\topicindex{callbacks+hyphenation}
+\topicindex{callbacks+kerning}
+\topicindex{callbacks+ligature building}
+
+When set this callback is triggered when \TEX\ normally handles the ligaturing
+and kerning. In \LUATEX\ you use the \typ {hpack_filter} and \typ
+{per_linebreak_filter} callbacks for that (where each passes different
+arguments). This callback doesn't get triggered when there are no glyphs (in
+\LUATEX\ this optimization is controlled by a a variable).
+
+\startfunctioncall
+function(<node> head, <string> groupcode, <number> direction])
+ return <node> newhead
+end
+\stopfunctioncall
+
+The traditional \TEX\ font processing is bypassed so you need to take care of that
+with the helpers. (For the moment we keep the ligaturing and kerning callbacks but
+they are kind of obsolete.)
+
+\stopsubsection
+
+\startsubsection[title={\cbk {hpack_filter}}]
\topicindex{callbacks+packing}
@@ -368,7 +415,7 @@ 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])
+ <string> packtype [, <number> direction] [, <node> attributelist])
return <node> newhead
end
\stopfunctioncall
@@ -378,12 +425,11 @@ The \type {packtype} is either \type {additional} or \type {exactly}. If \type
\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}}
+\stopsubsection
+
+\startsubsection[title={\cbk {vpack_filter}}]
\topicindex{callbacks+packing}
@@ -396,54 +442,77 @@ that it is called at different moments, there is an extra variable that matches
\startfunctioncall
function(<node> head, <string> groupcode, <number> size, <string> packtype,
- <number> maxdepth [, <string> direction] [, <node> attributelist]))
+ <number> maxdepth [, <number> direction] [, <node> attributelist]))
return <node> newhead
end
\stopfunctioncall
This callback does not replace any internal code.
-\subsection{\type {hpack_quality}}
+\stopsubsection
+
+\startsubsection[title={\cbk {packed_vbox_filter}}]
\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:
+After the \cbk {vpack_filter} callback (see previous section) is triggered the
+box get packed and after that this callback can be configured to kick in.
\startfunctioncall
-function(<string> incident, <number> detail, <node> head, <number> first,
- <number> last)
- return <node> whatever
+function(<node> head, <string> groupcode)
+ return <node> newhead
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).
+This callback does not replace any internal code.
-\subsection{\type {vpack_quality}}
+\stopsubsection
-\topicindex{callbacks+packing}
+\startsubsection[title={\cbk {alignment_filter}}]
-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:
+\topicindex{callbacks+alignments}
+
+This is an experimental callback that when set is called several times during the
+construction of an alignment. The context values are available in \typ
+{tex.getalignmentcontextvalues()}.
\startfunctioncall
-function(<string> incident, <number> detail, <node> head, <number> first,
- <number> last)
+function(<node> head, <string> context, <node> attributes, <node> preamble)
+ -- no return values
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.
+There are no sanity checks so if a user messes up the passed node lists the results
+can be unpredictable and, as with other node related callbacks, crash the engine.
+
+\stopsubsection
+
+\startsubsection[title={\cbk {localbox_filter}}]
-\subsection{\cbk {process_rule}}
+\topicindex{callbacks+local boxes}
+
+Local boxes are a somewhat tricky and error prone feature so use this callback
+with care because the paragraph is easily messed up. A line can have a left,
+right and middle box where the middle one has no width. The callback gets quite
+some parameters passed:
+
+\startfunctioncall
+function(<node> linebox, <node> leftbox, <node> rightbox, <node> middlebox,
+ <number> linenumber,
+ <number> leftskip, <number> rightskip, <number> lefthang, <number> righthang,
+ <number> indentation, <number> parinitleftskip, <number> parinitrightskip,
+ <number> parfillleftskip, <number> parfillrightskip,
+ <number> overshoot)
+ -- no return values
+end
+\stopfunctioncall
+
+This is an experimental callback that will be tested in different \CONTEXT\
+mechanisms before it will be declared stable.
+
+\stopsubsection
+
+\startsubsection[title={\cbk {process_rule}}]
\topicindex{callbacks+rules}
@@ -452,7 +521,9 @@ This is an experimental callback. It can be used with rules of subtype~4
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}}
+\stopsubsection
+
+\startsubsection[title={\type {pre_output_filter}}]
\topicindex{callbacks+output}
@@ -461,90 +532,144 @@ This callback is called when \TEX\ is ready to start boxing the box 255 for \prm
\startfunctioncall
function(<node> head, <string> groupcode, <number> size, <string> packtype,
- <number> maxdepth [, <string> direction])
+ <number> maxdepth [, <number> direction])
return <node> newhead
end
\stopfunctioncall
This callback does not replace any internal code.
-\subsection{\cbk {hyphenate}}
+\stopsubsection
+
+\startsubsection[title={\cbk {hyphenate}}]
\topicindex{callbacks+hyphenation}
+This callback is supposed to insert discretionary nodes in the node list it
+receives.
+
\startfunctioncall
function(<node> head, <node> tail)
+ -- no return values
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}}
+\stopsubsection
+
+\startsubsection[title={\cbk {ligaturing}}]
\topicindex{callbacks+ligature building}
+This callback, which expects no return values, has to apply ligaturing to the
+node list it receives.
+
\startfunctioncall
function(<node> head, <node> tail)
+ -- no return values
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.
+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.
+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.
-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.
+\stopsubsection
-\subsection{\cbk {kerning}}
+\startsubsection[title={\cbk {kerning}}]
\topicindex{callbacks+kerning}
+This callback has to apply kerning between the nodes in the node list it
+receives. See \cbk {ligaturing} for calling conventions.
+
\startfunctioncall
function(<node> head, <node> tail)
+ -- no return values
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.
+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.
+
+\stopsubsection
+
+\startsubsection[title={\cbk {append_line_filter}}]
+
+\topicindex{callbacks+lines}
+
+Every time a line is added this callback is triggered, when set. migrated
+material and adjusts also qualify as such and the detail relates to the adjust
+index.
+
+\startfunctioncall
+function(<node> head, <node> tail, <string> context, <number> detail)
+ return <node> newhead
+end
+\stopfunctioncall
+
+A list of possible context values can be queried with \typ
+{tex.getappendlinecontextvalues()}.
+
+\stopsubsection
+
+\stopsection
-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.
+\startsection[title={Paragraph callbacks}]
-\subsection{\type {insert_par}}
+\startsubsection[title={\type {insert_par}}]
+
+\topicindex{callbacks+paragraphs}
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> par, <string> location)
+ -- no return values
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}}
+\stopsubsection
+
+\startsubsection[title={\cbk {begin_paragraph}}]
+
+\topicindex{callbacks+paragraphs}
+
+{\em todo}
+
+\stopsubsection
+
+\startsubsection[title={\cbk {paragraph_context}}]
+
+\topicindex{callbacks+paragraphs}
+
+{\em todo}
+
+\stopsubsection
+
+\startsection[title={Math related callbacks}]
+
+\startsubsection[title={\cbk {mlist_to_hlist}}]
\topicindex{callbacks+math}
@@ -564,28 +689,61 @@ 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.
+\stopsubsection
+
+\startsubsection[title={\cbk {math_rule}}]
+
+\topicindex{callbacks+math}
+\topicindex{callbacks+ruled}
+
+{\em todo}
+
+\stopsubsection
+
+\startsubsection[title={\cbk {make_extensible}}]
+
+\topicindex{callbacks+math}
+\topicindex{callbacks+fonts}
+
+{\em todo}
+
+\stopsubsection
+
+\startsubsection[title={\cbk {register_extensible}}]
+
+\topicindex{callbacks+math}
+\topicindex{callbacks+fonts}
+
+{\em todo}
+
+\stopsubsection
+
\stopsection
\startsection[title={Information reporting callbacks}][library=callback]
-\subsection{\cbk {pre_dump}}
+\startsubsection[title={\cbk {pre_dump}}]
\topicindex{callbacks+dump}
\startfunctioncall
function()
+ -- no return values
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}}
+\stopsubsection
+
+\startsubsection[title={\cbk {start_run}}]
\topicindex{callbacks+job run}
\startfunctioncall
function()
+ -- no return values
end
\stopfunctioncall
@@ -593,7 +751,9 @@ 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}}
+\stopsubsection
+
+\startsubsection[title={\cbk {stop_run}}]
\topicindex{callbacks+job run}
@@ -606,12 +766,15 @@ 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 {intercept_tex_error}, \cbk {intercept_lua_error}}
+\stopsubsection
+
+\startsubsection[title={\cbk {intercept_tex_error}, \cbk {intercept_lua_error}}]
\topicindex{callbacks+errors}
\startfunctioncall
function()
+ -- no return values
end
\stopfunctioncall
@@ -621,25 +784,31 @@ the normal actions are removed). You may find some of the values in the \type
{status} table useful. The \TEX\ related callback gets two arguments: the current
processing mode and a boolean indicating if there was a runaway.
-\subsection{\cbk {show_error_message} and \cbk {show_warning_message}}
+\stopsubsection
+
+\startsubsection[title={\cbk {show_error_message} and \cbk {show_warning_message}}]
\topicindex{callbacks+errors}
\topicindex{callbacks+warnings}
\startfunctioncall
function()
+ -- no return values
end
\stopfunctioncall
These callback replaces the code that prints the error message. The usual
interaction after the message is not affected.
-\subsection{\cbk {start_file}}
+\stopsubsection
+
+\startsubsection[title={\cbk {start_file}}]
\topicindex{callbacks+files}
\startfunctioncall
function(category,filename)
+ -- no return values
end
\stopfunctioncall
@@ -657,30 +826,37 @@ This callback replaces the code that \LUATEX\ prints when a file is opened like
\LL
\stoptabulate
-\subsection{\cbk {stop_file}}
+\stopsubsection
+
+\startsubsection[title={\cbk {stop_file}}]
\topicindex{callbacks+files}
\startfunctioncall
function(category)
+ -- no return values
end
\stopfunctioncall
This callback replaces the code that \LUATEX\ prints when a file is closed like
the \type {)} for regular files.
-\subsection{\cbk {wrapup_run}}
+\stopsubsection
+
+\startsubsection[title={\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.
+\stopsubsection
+
\stopsection
\startsection[title={Font-related callbacks}][library=callback]
-\subsection{\cbk {define_font}}
+\startsubsection[title={\cbk {define_font}}]
\topicindex{callbacks+fonts}
@@ -719,6 +895,199 @@ font structure.
Setting this callback to \type {false} is pointless as it will prevent font
loading completely but will nevertheless generate errors.
+\stopsubsection
+
+\startsubsection[title={\cbk {missing_character} and \cbk {process_character}}]
+
+\topicindex{callbacks+fonts}
+\topicindex{callbacks+characters}
+
+This callback is triggered when a character node is created and the font doesn't
+have the requested character.
+
+\startfunctioncall
+function(<node> glyph, <number> font, <number> character)
+ -- no return value
+end
+\stopfunctioncall
+
+The \type {process_character} callback is experimental and gets called when a
+glyph node is created and the callback field in a character is set.
+
+\startfunctioncall
+function(<number> font, <number> character)
+ -- no return value
+end
+\stopfunctioncall
+
+\stopsubsection
+
+\stopsection
+
+\startsection[title=Reporting]
+
+\startsubsection[title={\cbk {show_whatsit}}]
+
+\topicindex{callbacks+whatsits}
+
+Because we only have a generic whatsit it is up to the macro package to provide
+details when tracing them.
+
+\startfunctioncall
+function(<node> whatsit, <number> indentation,
+ <number> tracinglevel, <number> currentlevel, <number> inputlevel)
+ -- no return value
+end
+\stopfunctioncall
+
+The indentation tells how many periods are to be typeset if you want to be
+compatible with the rest of tracing. The tracinglevels indicates if the current
+level and\|/or input level are shown cf. \prm {tracinglevels}. Of course one
+is free to show whatever in whatever way suits the whatsit best.
+
+\stopsubsection
+
+\startsubsection[title={\cbk {get_attribute}}]
+
+\topicindex{callbacks+attributes}
+
+Because attributes are abstract pairs of indices and values the reported
+properties makes not much sense and are very macro package (and user) dependent.
+This callback permits more verbose reporting by the engine when tracing is
+enabled.
+
+\startfunctioncall
+function(<number> index, <number> value)
+ return <string>, <string>
+end
+\stopfunctioncall
+
+\stopsubsection
+
+\startsubsection[title={\cbk {get_noad_class}}]
+
+\topicindex{callbacks+classes}
+
+We have built|-|in math classes but there can also be user defined ones. This
+callback can be used to report more meaningful strings instead of numbers when
+tracing.
+
+\startfunctioncall
+function(<number> class)
+ return <string>
+end
+\stopfunctioncall
+
+\stopsubsection
+
+\startsubsection[title={\cbk {trace_memory}}]
+
+When the engine starts all kind of memory is pre|-|allocated> depending on the
+configuration more gets allocated when a category runs out of memory. The
+\LUAMETATEX\ engine is more dynamic than \LUATEX. If this callback is set it will
+get called as follows:
+
+\startfunctioncall
+function(<string> category, <boolean> success)
+ -- no return value
+end
+\stopfunctioncall
+
+The boolean indicates if the allocation has been successful. One can best quit
+the run when this one is \type {false}, if the engine doesn't already do that.
+
+\stopsubsection
+
+\startsubsection[title={\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).
+
+\stopsubsection
+
+\startsubsection[title={\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.
+
+\stopsubsection
+
+\startsubsection[title={\type {show_lua_call}}]
+
+\topicindex{callbacks+lua}
+
+This one can be used to help reporting definitions that relate to \LUA\ calls to
+be more meaningful when tracing.
+
+\startfunctioncall
+function(<string> name, <number> index)
+ return <string>
+end
+\stopfunctioncall
+
+\stopsubsection
+
+\startsubsection[title={\type {handle_overload}}]
+
+\topicindex{callbacks+overload}
+
+This is one of the few callbacks that is aimed at \CONTEXT: it relates to overload
+protection of macros and other variables.
+
+\startfunctioncall
+function(<boolean> error, <number> overload, <string> csname, <number> flags)
+ -- no return values
+end
+\stopfunctioncall
+
+The overload is determined by:
+
+\starttabulate[|c|l|c|c|c|c|c|]
+\DB \BC \BC immutable \BC permanent \BC primitive \BC frozen \BC instance \NC \NR
+\TB
+\NC 1 \NC warning \NC \star \NC \star \NC \star \NC \NC \NC \NR
+\NC 2 \NC error \NC \star \NC \star \NC \star \NC \NC \NC \NR
+\NC 3 \NC warning \NC \star \NC \star \NC \star \NC \star \NC \NC \NR
+\NC 4 \NC error \NC \star \NC \star \NC \star \NC \star \NC \NC \NR
+\NC 5 \NC warning \NC \star \NC \star \NC \star \NC \star \NC \star \NC \NR
+\NC 6 \NC error \NC \star \NC \star \NC \star \NC \star \NC \star \NC \NR
+\LL
+\stoptabulate
+
+This relates to the optional prefixed that can be used when defining and setting
+quantities and is therefore also a bit of a playground. All macros and aliases in
+\CONTEXT\ are classified this way.
+
\stopsection
\stopchapter
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex-codes.tex b/Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex-codes.tex
index 103bb247310..afec26d61f4 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex-codes.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex-codes.tex
@@ -1,3 +1,5 @@
+% language=us runpath=texruns:manuals/luametatex
+
\environment luametatex-style
\startcomponent luametatex-codes
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
index d55b7f15b15..4e776b7d20b 100644
--- 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
@@ -1,3 +1,5 @@
+% language=us runpath=texruns:manuals/luametatex
+
\environment luametatex-style
\startcomponent luametatex-contents
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
deleted file mode 100644
index 5be5463e97e..00000000000
--- a/Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex-differences.tex
+++ /dev/null
@@ -1,292 +0,0 @@
-% 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|]
-\BC fonts \NC \type {\letterspacefont}
- \type {\copyfont}
- \type {\expandglyphsinfont}
- \type {\ignoreligaturesinfont}
- \type {\tagcode}
- \type {\leftghost}
- \type {\rightghost}
- \NC \NR
-\BC backend \NC \type {\dviextension}
- \type {\dvivariable }
- \type {\dvifeedback}
- \type {\pdfextension}
- \type {\pdfvariable }
- \type {\pdffeedback}
- \type {\dviextension}
- \type {\draftmode}
- \type {\outputmode}
- \NC \NR
-\BC dimensions \NC \type {\pageleftoffset}
- \type {\pagerightoffset}
- \type {\pagetopoffset}
- \type {\pagebottomoffset}
- \type {\pageheight}
- \type {\pagewidth}
- \NC \NR
-\BC resources \NC \type {\saveboxresource}
- \type {\useboxresource}
- \type {\lastsavedboxresourceindex}
- \type {\saveimageresource}
- \type {\useimageresource}
- \type {\lastsavedimageresourceindex}
- \type {\lastsavedimageresourcepages}
- \NC \NR
-\BC positioning \NC \type {\savepos}
- \type {\lastxpos}
- \type {\lastypos}
- \NC \NR
-\BC directions \NC \type {\textdir}
- \type {\linedir}
- \type {\mathdir}
- \type {\pardir}
- \type {\pagedir}
- \type {\bodydir}
- \type {\pagedirection}
- \type {\bodydirection}
- \NC \NR
-\BC randomizer \NC \type {\randomseed}
- \type {\setrandomseed}
- \type {\normaldeviate}
- \type {\uniformdeviate}
- \NC \NR
-\BC utilities \NC \type {\synctex}
- \NC \NR
-\BC extensions \NC \type {\latelua}
- \type {\lateluafunction}
- \type {\openout}
- \type {\write}
- \type {\closeout}
- \type {\openin}
- \type {\read}
- \type {\readline}
- \type {\closein}
- \type {\ifeof}
- \NC \NR
-\BC control \NC \type {\suppressfontnotfounderror}
- \type {\suppresslongerror}
- \type {\suppressprimitiveerror}
- \type {\suppressmathparerror}
- \type {\suppressifcsnameerror}
- \type {\suppressoutererror}
- \type {\mathoption}
- \NC \NR
-\BC system \NC \type {\primitive}
- \type {\ifprimitive}
- \type {\formatname}
- \NC \NR
-\BC 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: control
-sequence properties that permit protection against as well as controlled
-overloading of definitions. I don't think that (\CONTEXT) users will notice these
-prefixed being gone. The definition and parsing related \type {\suppress..}
-features are now default and can't be changed so related primitives are gone.
-
-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. A macropackage should
-implement its own backend and related shipout. Talking of backend, the extension
-primitives that relate to backends 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 but we have an up to
-date \PDF\ parsing library on board.
-
-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, as mentioned, only generic whatsit
-nodes that can be used for some management related tasks. For instance you can
-use them to implement user nodes. More extensive status information is provided
-in the overhauled status library.
-
-The margin kern nodes are gone and we now use regular kern nodes for them. As a
-consequence there are two extra subtypes indicating the injected left or right
-kern. The glyph field served no real purpose so there was no reason for a special
-kind of node.
-
-The \KPSE\ library is no longer built|-|in, but one can use an external \KPSE\
-library, assuming that it is present on the system, because the engine has a so
-called optional library interface to it. 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_format_file open_data_file
-\stoptyping
-
-The callbacks related to errors are changed:
-
-\starttyping
-intercept_tex_error intercept_lua_error
-show_error_message show_warning_message
-\stoptyping
-
-There is a hook that gets called when one of the fundamental memory structures
-gets reallocated.
-
-\starttyping
-trace_memory
-\stoptyping
-
-When you use the overload protect mechanisms, a callback can be plugged in to handle
-exceptions:
-
-\starttyping
-handle_overload
-\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:
-
-\startalign[flushleft,nothyphenated]
-\tt \cldcontext{table.concat(table.sortedkeys(callbacks.list), ", ")}
-\stopalign
-
-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. All input goes via \LUA, even the console.
-
-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 years of work 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 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! There are for instance a few
-csname related definers, we have integer and dimension constants, the macro
-argument parser can be brought in tolerant mode, the repertoire of conditionals
-has been extended, some internals can be controlled (think of normalization of
-lines, hyphenation etc.), and macros can be protected against user overload. Not
-all is discussed in detail in this manual but there are introductions in the
-\CONTEXT\ distribution that explain them. But the \TEX\ kernel is of course
-omnipresent.
-
-\startluacode
-
-local luametatex = tex.primitives()
-local luatex = table.load("luatex-primitives.lua")
-
-if not luatex then
- local tex = "\\starttext \\ctxlua {table.save(tex.jobname .. '.lua',tex.primitives())} \\stoptext"
-
- io.savedata("luatex-primitives.tex", tex)
-
- os.execute("context --luatex --once luatex-primitives")
-
- luatex = table.load("luatex-primitives.lua")
-end
-
-
-if luatex and luametatex then
-
- luatex = table.tohash(luatex)
- luametatex = table.tohash(luametatex)
-
- -- context.page()
-
- context("The following primitives are available in \\LUATEX\\ but not in \\LUAMETATEX. ")
- context("Some of these are emulated in \\CONTEXT.")
-
- context.startcolumns { n = 2 }
- for k, v in table.sortedhash(luatex) do
- if not luametatex[k] then
- context.type(k)
- context.crlf()
- end
- end
- context.stopcolumns()
-
-
- -- context.page()
-
- context("The following primitives are available in \\LUAMETATEX\\ only. ")
- context("At some point in time some might be added to \\LUATEX.")
-
- context.startcolumns { n = 2 }
- for k, v in table.sortedhash(luametatex) do
- if not luatex[k] then
- context.type(k)
- context.crlf()
- end
- end
- context.stopcolumns()
-
-end
-
-\stopluacode
-
-\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
index 947b2320a13..13bc3a3e369 100644
--- 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
@@ -1,10 +1,12 @@
-% language=uk
+% language=us runpath=texruns:manuals/luametatex
+
+% todo: move some to elsewhere (e.g. builders / paragraphs
\environment luametatex-style
\startcomponent luametatex-enhancements
-\startchapter[reference=enhancements,title={Basic \TEX\ enhancements}]
+\startchapter[reference=enhancements,title={Enhancements}]
\startsection[title={Introduction}]
@@ -26,8 +28,8 @@ clone (a selection of) primitives with a different prefix, like this:
\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}. When you clone all primitives you can also do this:
+specified by one or more keywords \type {tex}, \type {etex} or \type {luatex}.
+When you clone all primitives you can also do this:
\starttyping
\directlua { tex.enableprimitives('normal',true) }
@@ -50,9 +52,88 @@ purpose apart from the fact that it reveals some history.
\stopsubsection
-\startsubsection[title={Version information}]
+\startsubsection[title={Rationale}]
+
+One can argue that \TEX\ should stay as it is but over decades usage of this
+program has evolved and resulted in large macro packages that often need to rely
+on what the \TEX\ books calls \quote {dirty tricks}. When you look deep down in
+the code of \CONTEXT\ \MKII, \MKIV\ and \MKXL\ (aka \LMTX) you will see plenty of
+differences but quite a bit of the functionality in the most recent versions is
+also available in \MKII. Of course more has been added over time, and some
+mechanisms could be made more efficient and reliable but plenty was possible.
-\startsubsubsection[title={\lpr {luatexbanner}, \lpr {luatexversion} and \lpr {luatexrevision}}]
+So, when you see something done in \CONTEXT\ \LMTX\ using new \LUAMETATEX\
+primitives you can assume that somehow the same is done in \CONTEXT\ \MKIV. We
+don't really need \LUAMETATEX\ instead of \LUATEX. Among the main reasons for
+still going for this new engine are:
+
+\startitemize[packed]
+\startitem
+ some new primitives make for less tracing and tracing has become rather
+ verbose over years (just try \type {tracingall}); examples are the new macro
+ argument handling and some new hooks
+\stopitem
+\startitem
+ some new primitives permits more efficient coding and have a positive impact
+ on performance (this sort of compensates a performance hit due to delegating
+ work to \LUA)
+\stopitem
+\startitem
+ other primitives are there because they make the code look better; good
+ examples are the extensions to conditionals; they remove the necessity for
+ all kind of (somewhat unnatural) middle layers; take local control as example
+\stopitem
+\startitem
+ a few primitives make complex and demanding mechanism a bit easier to grasp
+ and explain; think of alignments, inserts and marks
+\stopitem
+\startitem
+ more access from the \LUA\ end to \TEX\ internals: a few more callbacks, more
+ options, more robust interfaces, etc
+\stopitem
+\startitem
+ some mechanisms are very specific but can be made more generic (and powerful),
+ like inserts, marks, adjusts and local boxes
+\stopitem
+\stopitemize
+
+I realize that new primitives also can make some \TEX\ code look less threatening
+to new users. It removes a bit of hackery and limits the level of guru that comes
+with showing off the mastery of expansion and lookahead. So be it. I wonder if
+those objecting to some of the extensions (with the argument that they are not
+needed, and \CONTEXT\ \MKIV\ is proof of that) can resist using them. I admit
+that it sometimes hurt to throw away good working but cumbersome code that took a
+while to evolve, but I also admit that I favor long distance traveling by bike or
+car over riding horseback.
+
+It took a few years for \LUAMETATEX\ to evolve to what it is now and most
+extensions are not there \quotation {because they were easy} or \quotation {could
+be done}. If that were the case, there would be plenty more. In many aspects it
+has been a balancing act and much also relates to looking at the \CONTEXT\ source
+code (\TEX\ as well as \LUA) and wondering why it looks that way. It is also
+driven by the fact that I want to be able to explain to users why things are done
+in a certain way. In fact, I want users to be able to look at the code and
+understand it (apart from maybe a few real dirty low level helpers that are also
+dirty because of performance reasons). Just take this into account when reading on.
+
+And yes, there are still a few possibilities I want to explore \unknown\ some might
+show up temporarily so don't be surprised. I'm also aware that some new features can
+have bugs or side effects that didn't show up in \CONTEXT, which after all is the
+benchmark and environment in which all this evolves.
+
+Over time, the other \TEX\ engines might have an occasional feature (primitive)
+added and it is very unlikely that \LUAMETATEX\ will follow up on that. First of
+all we have different internals but most of all because plenty of time went into
+considering what got added and what not, apart from the fact that we have
+callbacks. Decades of \TEX\ development never really have lead to an extensive
+wish list so there is no real need why there should be a demand on anything other
+than we offer here. If \TEX\ worked well for ages, it can as well do for more, so
+there is no need to cripple the code base simply in order to be compatible with
+other engines; \LUAMETATEX\ is already quite different anyway.
+
+\stopsubsection
+
+\startsubsection[title={Version information}]
\topicindex{version}
\topicindex{banner}
@@ -70,11 +151,11 @@ There are three primitives to test the version of \LUATEX\ (and \LUAMETATEX):
\DB primitive \BC value
\BC explanation \NC \NR
\TB
-\NC \lpr {luatexbanner} \NC \VersionHack{\luatexbanner}
+\NC \prm {luatexbanner} \NC \VersionHack{\luatexbanner}
\NC the banner reported on the console \NC \NR
-\NC \lpr {luatexversion} \NC \the\luatexversion
+\NC \prm {luatexversion} \NC \the\luatexversion
\NC major and minor number combined \NC \NR
-\NC \lpr {luatexrevision} \NC \the\luatexrevision
+\NC \prm {luatexrevision} \NC \the\luatexrevision
\NC the revision number \NC \NR
\LL
\stoptabulate
@@ -83,7 +164,7 @@ A version is defined as follows:
\startitemize
\startitem
- The major version is the integer result of \lpr {luatexversion} divided by
+ The major version is the integer result of \prm {luatexversion} divided by
100. The primitive is an \quote {internal variable}, so you may need to prefix
its use with \prm {the} or \prm {number} depending on the context.
\stopitem
@@ -91,7 +172,7 @@ A version is defined as follows:
The minor version is a number running from 0 upto 99.
\stopitem
\startitem
- The revision is reported by \lpr {luatexrevision}. Contrary to other engines
+ The revision is reported by \prm {luatexrevision}. Contrary to other engines
in \LUAMETATEX\ is also a number so one needs to prefix it with \prm {the} or
\prm {number}. \footnote {In the past it always was good to prefix the
revision with \prm {number} anyway, just to play safe, although there have
@@ -105,12 +186,39 @@ A version is defined as follows:
\stopitem
\stopitemize
-\stopsubsubsection
+The \LUATEX\ binary has companions like \LUAJITTEX\ and a version that has a font
+rendering library on board. Both introduce dependencies that don't fit into the
+\LUAMETATEX\ agenda: compilation should be easy and future proof and not depend
+on code outside the source tree. It means that for instance the \CONTEXT\ runners
+don't really need to check much more than the basic name. It also means that the
+\type {context} and \type {mtxrun} stubs can be symbolic links to the main
+program that itself is about 3MB, so we can keep the binary footprint small. For
+normal \CONTEXT\ \LMTX\ processing no other binaries are needed because whatever
+support we need is done in \LUA.
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.
+The \type {status} library also provides some information including what we get
+with the three mentioned primitives:
+
+\starttabulate[|l|l|]
+\DB field \BC value \NC \NR
+\TB
+\NC \type {filename} \NC \cldcontext{status.filename} \NC \NR
+\NC \type {banner} \NC \cldcontext{status.banner} \NC \NR
+\NC \type {luatex_engine} \NC \cldcontext{status.luatex_engine} \NC \NR
+\NC \type {luatex_version} \NC \cldcontext{status.luatex_version} \NC \NR
+\NC \type {luatex_revision} \NC \cldcontext{status.luatex_revision} \NC \NR
+\NC \type {luatex_verbose} \NC \cldcontext{status.luatex_verbose} \NC \NR
+\NC \type {copyright} \NC \cldcontext{status.copyright} \NC \NR
+\NC \type {development_id} \NC \cldcontext{status.development_id} \NC \NR
+\NC \type {format_id} \NC \cldcontext{status.format_id} \NC \NR
+\NC \type {used_compiler} \NC \cldcontext{status.used_compiler} \NC \NR
+\LL
+\stoptabulate
+
\stopsubsection
\stopsection
@@ -139,8 +247,8 @@ problem for well|-|behaved input files, but it could create incompatibilities fo
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}.
+\prm {uccode}, \prm {hjcode}, \prm {catcode}, \prm {sfcode}, \prm {efcode}, \prm
+{lpcode}, \prm {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}
@@ -149,10 +257,11 @@ 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.
+% 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. This feature has
+% been dropped.
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. Because we
@@ -161,11 +270,11 @@ live in a \UNICODE\ galaxy that is no real problem.
\stopsubsection
-\startsubsection[title={\lpr {Uchar}}]
+\startsubsection[title={\prm {Uchar}}]
\topicindex{\UNICODE}
-The expandable command \lpr {Uchar} reads a number between~0 and $1{,}114{,}111$
+The expandable command \prm {Uchar} reads a number between~0 and $1{,}114{,}111$
and expands to the associated \UNICODE\ character.
\stopsubsection
@@ -216,16 +325,20 @@ as well as save and restore housekeeping). In \LUATEX\ the number was bumped to
memory footprint reasonable, in \LUAMETATEX\ the number of languages, fonts and
marks is limited. The size of some tables can be limited by configuration
settings, so they can start out small and grow till configured maximum which is
-smaller than the absolute maximum. The following table shows all kind of defaults
-as reported by \typ {status.getconstants()}.
+smaller than the absolute maximum.
-\startluacode
- context.starttabulate { "|T|r|" }
- for k, v in table.sortedhash(status.getconstants()) do
- context.NC() context(k) context.NC() context(v) context.NC() context.NR()
- end
- context.stoptabulate()
-\stopluacode
+% % We show this later on so not here.
+%
+% The following table shows all kind of defaults as reported by \typ
+% {status.getconstants()}.
+%
+% \startluacode
+% context.starttabulate { "|T|r|" }
+% for k, v in table.sortedhash(status.getconstants()) do
+% context.NC() context(k) context.NC() context(v) context.NC() context.NR()
+% end
+% context.stoptabulate()
+% \stopluacode
Because we have additional ways to store integers, dimensions and glue, we might
actually decide to decrease the maximum of the registers: if 64K is not enough,
@@ -413,10 +526,18 @@ mode, but in \LUAMETATEX\ there is no error message and the box the height and
depth are equally divided. Of course in text mode there is no math axis related
offset applied.
-It is possible to change or add to the attributes assigned to a box:
+It is possible to change or add to the attributes assigned to a box with \prm
+{boxattribute}:
+
+\starttyping
+\boxattribute 0 123 456
+\stoptyping
+
+You can set attributes of the current paragraph specification node with \prm
+{parattribute}:
\starttyping
-\boxattr 0 123 456
+\parattribute 123 456
\stoptyping
\stopsubsection
@@ -427,6 +548,9 @@ It is possible to change or add to the attributes assigned to a box:
\startsubsection[title={\prm {directlua}}]
+\topicindex{scripting}
+\topicindex{lua+direct}
+
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
@@ -513,7 +637,7 @@ within the \TEX\ portion of the executable.
\stopsubsection
-\startsubsection[title={\lpr {luaescapestring}}]
+\startsubsection[title={\prm {luaescapestring}}]
\topicindex {escaping}
@@ -539,13 +663,16 @@ in a separate file and load it using \LUA's \type {dofile}:
\stopsubsection
-\startsubsection[title={\lpr {luafunction}, \lpr {luafunctioncall} and \lpr {luadef}}]
+\startsubsection[title={\prm {luafunction}, \prm {luafunctioncall} and \prm {luadef}}]
+
+\topicindex{functions}
+\topicindex{lua+functions}
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
+have some impact. For this reason there is a variant call available: \prm
{luafunction}. This command is used as follows:
\starttyping
@@ -572,7 +699,7 @@ in the following example the number \type {8} gets typeset.
}
\stoptyping
-The \lpr {luafunctioncall} primitive does the same but is unexpandable, for
+The \prm {luafunctioncall} primitive does the same but is unexpandable, for
instance in an \prm {edef}. In addition \LUATEX\ provides a definer:
\starttyping
@@ -590,7 +717,10 @@ normal usage should not give problems.
\stopsubsection
-\startsubsection[title={\lpr {luabytecode} and \lpr {luabytecodecall}}]
+\startsubsection[title={\prm {luabytecode} and \prm {luabytecodecall}}]
+
+\topicindex{lua+bytecode}
+\topicindex{bytecode}
Analogue to the function callers discussed in the previous section we have byte
code callers. Again the call variant is unexpandable.
@@ -639,9 +769,9 @@ contents is stored and retrieved from the format file.
\stopsubsection
-\startsubsection[title={\lpr {catcodetable}}]
+\startsubsection[title={\prm {catcodetable}}]
-The primitive \lpr {catcodetable} switches to a different catcode table. Such a
+The primitive \prm {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.
@@ -651,13 +781,13 @@ has to be zero. Table zero is initialized by \INITEX.
\stopsubsection
-\startsubsection[title={\lpr {initcatcodetable}}]
+\startsubsection[title={\prm {initcatcodetable}}]
\startsyntax
\initcatcodetable <15-bit number>
\stopsyntax
-The primitive \lpr {initcatcodetable} creates a new table with catcodes
+The primitive \prm {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
@@ -680,13 +810,13 @@ initial values are:
\stopsubsection
-\startsubsection[title={\lpr {savecatcodetable}}]
+\startsubsection[title={\prm {savecatcodetable}}]
\startsyntax
\savecatcodetable <15-bit number>
\stopsyntax
-\lpr {savecatcodetable} copies the current set of catcodes to a new table with
+\prm {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. Again, the new table is allocated globally:
it will not go away after the current group has ended. If the supplied number is
@@ -694,15 +824,28 @@ the currently active table, an error is raised.
\stopsubsection
+\startsubsection[title={\prm {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
+
\stopsection
-\startsection[title={Tokens, commands and strings}]
+\startsection[title={Tokens and expansion}]
-\startsubsection[title={\lpr {scantextokens} and \lpr {tokenized}}]
+\startsubsection[title={\prm {scantextokens}, \prm {tokenized} and \prm {retokenized}}]
\topicindex {tokens+scanning}
-The syntax of \lpr {scantextokens} is identical to \prm {scantokens}. This
+The syntax of \prm {scantextokens} is identical to \prm {scantokens}. This
primitive is a slightly adapted version of \ETEX's \prm {scantokens}. The
differences are:
@@ -711,7 +854,7 @@ differences are:
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 {scantextokens} never raises an EOF error, and it does not execute
\prm {everyeof} tokens.
\stopitem
\startitem
@@ -730,13 +873,16 @@ commands we also have this expandable command:
\tokenized catcodetable <number> {...}
\stopsyntax
+The \prm {retokenized} variant differs in that it doesn't check for a keyword and
+just used the current catcode regime.
+
The \ETEX\ command \type {\tracingscantokens} has been dropped in the process as
that was interwoven with the old code.
\stopsubsection
-\startsubsection[title={\lpr {toksapp}, \lpr {tokspre}, \lpr {etoksapp}, \lpr {etokspre},
-\lpr {gtoksapp}, \lpr {gtokspre}, \lpr {xtoksapp}, \lpr {xtokspre}}]
+\startsubsection[title={\prm {toksapp}, \prm {tokspre}, \prm {etoksapp}, \prm {etokspre},
+\prm {gtoksapp}, \prm {gtokspre}, \prm {xtoksapp}, \prm {xtokspre}}]
Instead of:
@@ -755,237 +901,278 @@ expand the passed general text. The \type {g} and \type {x} variants are global.
\stopsubsection
-\startsubsection[title={\prm {csstring}, \lpr {begincsname} and \lpr {lastnamedcs}}]
+\startsubsection[title={\prm {etoks} and \prm {xtoks}}]
-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.
+A mix between the previously discussed append and prepend primitives and simple
+toks register assignments are these two. They act like \prm {toks} but expand
+their content first. The \type {x} variant does a global assignment.
-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
+\stopsubsection
-\starttyping
-\ifcsname foo\endcsname
- \csname foo\endcsname
-\fi
-\stoptyping
+\startsubsection[title={\prm {expanded}, \prm {expandedafter}, \prm {localcontrol}, \prm
+{localcontrolled}, \prm {beginlocalcontrol} and \prm {endlocalcontrol}}]
-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:
+\topicindex {expansion}
+
+The \prm {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}. The \tex {immediateassignment} and \tex {immediateassigned} commands are
+gone because we have the more powerful local control commands. They are a tad
+slower but this mechanism isn't used that much anyway.
\starttyping
-\ifcsname foo\endcsname
- \lastnamedcs
-\fi
+\let\immediateassigned\localcontrolled % sort of what \LUATEX provides
\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.
+Say that we define:
-\stopsubsection
+\startbuffer
+\edef\TestA
+ {\advance\scratchcounter\plusone}
+\edef\TestB
+ {\localcontrol\TestA
+ \the\scratchcounter}
+\edef\TestC
+ {\localcontrolled{\advance\scratchcounter\plusone}%
+ \the\scratchcounter}
+\edef\TestD
+ {\beginlocalcontrol\advance\scratchcounter\plusone\endlocalcontrol
+ \the\scratchcounter}
+\stopbuffer
-\startsubsection[title={\lpr {clearmarks}}]
+\typebuffer \getbuffer
-\topicindex {marks}
+With this example:
-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 (no synchronization node is used).
+\startbuffer
+\scratchcounter 10 \meaningasis\TestA
+\scratchcounter 20 \meaningasis\TestB
+\scratchcounter 30 \meaningasis\TestC
+\scratchcounter 40 \meaningasis\TestD
+\stopbuffer
-\startsyntax
-\clearmarks <16-bit number>
-\stopsyntax
+\typebuffer
-\stopsubsection
+We get this:
-\startsubsection[title={\lpr {alignmark} and \lpr {aligntab}}]
+\startlines
+\tttf \getbuffer
+\stoplines
+
+These local control primitives are a bit tricky and error message can be
+confusing. Future versions might have a bit better recovery but in practice it
+works as expected.
-The primitive \lpr {alignmark} duplicates the functionality of \type {#} inside
-alignment preambles, while \lpr {aligntab} duplicates the functionality of \type
-{&}.
+An \prm {expandedafter} primitive is also provided as an variant on \prm
+{expandafter} that takes a token list instead of a single token.
\stopsubsection
-\startsubsection[title={\lpr {letcharcode}}]
+\startsubsection[title={\prm {semiprotected}, \prm {semiexpanded}, \prm {expand},
+\prm {semiexpand} and \prm {expandactive}}]
-This primitive can be used to assign a meaning to an active character, as in:
+These primitives can best be explained with a few examples. The semi boils down to
+a bit more controlled usage of \prm {protected} macros.
+
+\startbuffer
+ \def\Test {test}
+ \def\TestA{\Test}
+\protected \def\TestB{\Test}
+\semiprotected \def\TestC{\Test}
+ \edef\TestD{\Test}
+ \edef\TestE{\TestA}
+ \edef\TestF{\TestB}
+ \edef\TestG{\TestC}
+ \edef\TestH{\normalexpanded{\TestB\TestC}} % ctx has \expanded defined
+ \edef\TestI{\semiexpanded{\TestB\TestC}}
+ \edef\TestJ{\expand\TestB\expand\TestC}
+ \edef\TestK{\semiexpand\TestB\semiexpand\TestC}
+\stopbuffer
+
+\typebuffer \getbuffer
+
+The effective meanings are given next (we use \prm {meaningasis} for this):
+
+\startlines \tttf
+\meaningasis\Test
+\meaningasis\TestA
+\meaningasis\TestB
+\meaningasis\TestC
+\meaningasis\TestD
+\meaningasis\TestE
+\meaningasis\TestF
+\meaningasis\TestG
+\meaningasis\TestH
+\meaningasis\TestI
+\meaningasis\TestJ
+\meaningasis\TestK
+\stoplines
+
+I admit that is not yet applied much in \CONTEXT\ as we have no real need for it
+and I implemented it more out for nostalgic reasons: the kind of selective
+protect mechanism we have in \MKII.
+
+Assuming that \type {~} is made active:
\starttyping
-\def\foo{bar} \letcharcode123=\foo
+\protected\def~{!}
+
+\edef\xxxx{~}
+\edef\xxxx{\expandactive~}
\stoptyping
-This can be a bit nicer than using the uppercase tricks (using the property of
-\prm {uppercase} that it treats active characters special).
+In both cases the meaning will show \type {~} so it's kind of subtle because in reality
+they have the following internal representation:
+
+\starttyping
+active char 126
+protected call ~
+\stoptyping
\stopsubsection
-\startsubsection[title={\lpr {glet}}]
+\startsubsection[title={Going ahead with \prm {expandafterpars} and \prm {expandafterspaces}}]
-This primitive is similar to:
+\topicindex{expansion+after}
-\starttyping
-\protected\def\glet{\global\let}
-\stoptyping
+Here are again some convenience primitives that simplify coding, remove the need
+to show off with multi|-|step macros and are nicely expandable. They fit in the
+repertoire of additional primitives that make macro code look somewhat easier.
+Here are a few examples:
-but faster (only measurable with millions of calls) and probably more convenient
-(after all we also have \type {\gdef}).
+\startbuffer
+\def\foo{!!} [\expandafterpars \foo \par test]
+\def\foo{!!} [\expandafterspaces\foo test]
+
+\def\foo{!!} \def\oof{\foo} [{\oof} test]
+\def\foo{!!} \def\oof{\expandafterspaces\foo} [{\oof}test]
+\stopbuffer
+
+\typebuffer
+
+These are typically used when building high level interfaces so not many users
+will see them in document sources.
+
+\startlines
+\getbuffer
+\stoplines
\stopsubsection
-\startsubsection[title={\lpr {defcsname}, \lpr {edefcsname}, \lpr {edefcsname} and \lpr {xdefcsname}}]
+\startsubsection[title={\prm {afterassigned}}]
-Although we can implement these primitives easily using macros it makes sense,
-given the popularity of \prm {csname} to have these as primitives. It also saves
-some \prm {expandafter} usage and it looks a bit better in the source.
+\topicindex{assignments+after}
-\starttyping
-\def\gdefcsname foo\endcsname{oof}
-\stoptyping
+This primitive is a multiple token variant of \prm {afterassignment} and it takes
+a token list. It might look better in some cases than multiple single token
+\quote {calls}.
\stopsubsection
-\startsubsection[title={\lpr {expanded}}]
+\startsubsection[title={\prm {detokenized}}]
-\topicindex {expansion}
+\topicindex{serializing}
-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}. The \tex {immediateassignment} and \tex {immediateassigned} commands are
-gone because we have the more powerful local control commands. They are a tad
-slower but this mechanism isn't used that much anyway. Inside an \prm {edef} you
-can use the \type {\immediate} prefix anyway, so if you really want these
-primitives back you can say:
+The \prm {string} primitive serializes what comes next, a control sequence or
+something more primitive string representation or just the (\UTF) character so it
+does look at what it sees next in some detail. This can give confusing results
+when the next token is for instance a new line. The \prm {detokenized} is less
+picky and just serializes the token, so in the next examples an empty lines is
+what we normally expect it to become: a serialized par token.
-\starttyping
-\let\immediateassignment\immediate
-\let\immediateassigned \localcontrolled
-\stoptyping
+\def\oof{s\expandafter\foo\string}
+\def\ofo{d\expandafter\foo\detokenized}
+\def\foo#1{:[#1]}
-\stopsubsection
+\startbuffer
+\oof test
+\ofo test
+\oof \relax
+\ofo \relax
+\oof \par
+\ofo \par
-% \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
+\oof
-\startsubsection[title={\lpr {ignorepars}}]
+\ofo
-This primitive is like \prm {ignorespaces} but also skips paragraph ending
-commands (normally \prm {par} and empty lines).
+done
+\stopbuffer
+
+\typebuffer
+
+We need the empty lines and \quote {done} to make sure we see the effect:
+
+{\tttf \getbuffer}
\stopsubsection
-\startsubsection[title={\lpr {futureexpand}, \lpr {futureexpandis}, \lpr {futureexpandisap}}]
+\startsubsection[title={\prm {expandtoken} and \prm {expandcstoken}}]
-These commands are used as:
+\topicindex{expansion+tokens}
-\starttyping
-\futureexpand\sometoken\whenfound\whennotfound
-\stoptyping
+These two are not really needed but can make code look less weird (and
+impressive) because there are no catcode changes involved. The next example
+illustrates what they do:
-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}.
+\startbuffer
+\edef\foo{\expandtoken 12 123 } \meaning\foo
+\edef\oof{\bgroup \egroup} \meaning\oof
+\edef\oof{\expandcstoken \bgroup\expandcstoken \egroup} \meaning\oof
+\edef\oof{\expandcstoken \foo } \meaning\oof
+\stopbuffer
+
+\typebuffer
+
+So \prm {expandtoken} expects two arguments: a catcode and a character number.
+The \prm {expandcstoken} will only look at control sequences representing a
+character.
+
+\startlines
+\getbuffer
+\stoplines
\stopsubsection
-\startsubsection[title={\lpr {aftergrouped}}]
+\stopsection
+
+\startsection[title=Grouping]
+
+\startsubsection[title={\prm {endsimplegroup}}]
+
+\topicindex{grouping+ending}
+
+This feature might look somewhat weird so just ignore that it is there. It is one
+of these features that might never make it in a engine when discussed in
+committee but it comes in handy in \CONTEXT, so:
+
+\startbuffer
+\def\foo{\beginsimplegroup\bf\let\next}
+
+\foo{test}
+\foo{test\endgroup
+\foo{test\endsimplegroup
+\foo{test\egroup
+\stopbuffer
+
+\typebuffer
+
+These lines typeset as:
+
+\startlines \getbuffer \stoplines
+
+The \prm {beginsimplegroup} primitives signals that any end group command, except
+\prm {endmathgroup} will wrap up the current group. The \prm {endsimplegroup} is
+sort of redundant but fits in anyway.
+
+The also \LUAMETATEX\ specific \prm {beginmathgroup} and \prm {endmathgroup}
+commands are like \prm {begingroup} and \prm {endgroup} but restore the mathstyle
+when it has been changed in the group.
+
+\startsubsection[title={\prm {aftergrouped}}]
+
+\topicindex{grouping+after}
There is a new experimental feature that can inject multiple tokens to after the group
ends. An example demonstrate its use:
@@ -1023,11 +1210,24 @@ This gives:
\stopsubsection
+\startsubsection[title={\prm {atendofgroup} and \prm {atendofgrouped}}]
+
+\topicindex{grouping+ending}
+
+These are variants of \prm {aftergroup} and \prm {aftergrouped} but they happen
+{\em before} the groups is closed. It is one of these primitives that is not
+really needed but that can make code (and tracing) cleaner, which is one of the
+objectives (at least for \CONTEXT).
+
+\stopsubsection
+
\stopsection
\startsection[title=Conditions]
-\startsubsection[title={\lpr{ifabsnum} and \lpr {ifabsdim}}]
+\startsubsection[title={\prm{ifabsnum} and \prm {ifabsdim}}]
+
+\topicindex{conditions}
There are two tests that we took from \PDFTEX:
@@ -1048,8 +1248,41 @@ This gives
\stopsubsection
-\startsubsection[title={\lpr{ifcmpnum}, \lpr {ifcmpdim}, \lpr {ifnumval}, \lpr
-{ifdimval}, \lpr {ifchknum} and \lpr {ifchkdim}}]
+\startsubsection[title={Comparing}]
+
+When comparing (for instance) to numbers the a \type {=}, \type {<} or \type {>}
+is used. In \LUAMETATEX\ you can negate such a comparison by \type {!}, as in
+\type {!=}, \type {!<} or \type {!>}. Multiple \type {!} flip that state.
+
+In addition to these \ASCII\ combinations, we also support some \UNICODE\
+variants. The extra comparison options are:
+
+\starttabulate[|l|c|c|l|]
+\DB character \BC \BC \BC operation \NC \NR
+\TB
+\NC \type {0x2208} \NC $\Uchar"2208$ \NC \NC element of \NC \NR
+\NC \type {0x2209} \NC $\Uchar"2209$ \NC \NC not element of \NC \NR
+\NC \type {0x2260} \NC $\Uchar"2260$ \NC \type {!=} \NC not equal \NC \NR
+\NC \type {0x2264} \NC $\Uchar"2264$ \NC \type {!>} \NC less equal \NC \NR
+\NC \type {0x2265} \NC $\Uchar"2265$ \NC \type {!<} \NC greater equal \NC \NR
+\NC \type {0x2270} \NC $\Uchar"2270$ \NC \NC not less equal \NC \NR
+\NC \type {0x2271} \NC $\Uchar"2271$ \NC \NC not greater equal \NC \NR
+\LL
+\stoptabulate
+
+\stopsubsection
+
+\startsubsection[title={\prm{ifzeronum}, \prm {ifzerodim}}]
+
+\topicindex {conditions+numbers}
+\topicindex {conditions+dimensions}
+
+Their name tells what they test for: zero (point) values.
+
+\stopsubsection
+
+\startsubsection[title={\prm{ifcmpnum}, \prm {ifcmpdim}, \prm {ifnumval}, \prm
+{ifdimval}, \prm {ifchknum} and \prm {ifchkdim}}]
\topicindex {conditions+numbers}
\topicindex {conditions+dimensions}
@@ -1108,12 +1341,17 @@ or more than zero.
\typebuffer \blank {\tt \getbuffer} \blank
-The last checked values are available in \lpr {lastchknum} and \lpr {lastchkdim}.
+The last checked values are available in \prm {lastchknum} and \prm {lastchkdim}.
These don't obey grouping.
+The two primitives \prm {ifchkdimension} and \prm {ifchknumber} are like \prm
+{ifchkdimen} and \prm {ifchknum}but are more rigorous: the short ones quit
+scanning at a match where after the match there can be anything, while the long
+variants don't accept following crap.
+
\stopsubsection
-\startsubsection[title={\lpr {ifmathstyle} and \lpr {ifmathparameter}}]
+\startsubsection[title={\prm {ifmathstyle} and \prm {ifmathparameter}}]
These two are variants on \prm {ifcase} where the first one operates with values
in ranging from zero (display style) to seven (cramped script script style) and
@@ -1124,7 +1362,7 @@ valid style identifier (a primitive identifier or number). The \type
\stopsubsection
-\startsubsection[title={\lpr {ifempty}}]
+\startsubsection[title={\prm {ifempty}}]
This primitive tests for the following token (control sequence) having no
content. Assuming that \type {\empty} is indeed empty, the following two are
@@ -1140,14 +1378,14 @@ lead to less clutter in tracing.
\stopsubsection
-\startsubsection[title={\lpr {ifrelax}}]
+\startsubsection[title={\prm {ifrelax}}]
This primitive complements \type {\ifdefined}, \type {\ifempty} and \type
{\ifcsname} so that we have all reasonable tests directly available.
\stopsubsection
-\startsubsection[title={\lpr {ifboolean}}]
+\startsubsection[title={\prm {ifboolean}}]
This primitive tests for non|-|zero, so the next variants are similar
@@ -1159,7 +1397,7 @@ This primitive tests for non|-|zero, so the next variants are similar
\stopsubsection
-\startsubsection[title={\lpr {iftok} and \lpr {ifcstok}}]
+\startsubsection[title={\prm {iftok} and \prm {ifcstok}}]
\topicindex {conditions+tokens}
\topicindex {tokens}
@@ -1188,14 +1426,50 @@ one might evolve).
\stopsubsection
-\startsubsection[title={\lpr {ifarguments}, \lpr {ifparameters} and \lpr {ifparameter}}]
+\startsubsection[title={\prm {ifhastok}, \prm {ifhastoks}, \prm {ifhasxtoks} and \prm {ifhaschar}}]
+
+\topicindex {conditions+tokens}
+\topicindex {tokens}
+
+The first three test primitives run over a token list in order to encounter a
+single token or a sequence. The \type {x} variants applies expansion.
+
+\startbuffer
+\def\ab {ab}
+\def\abc{abc}
+\ifhastok 1 {12} Y\else N\fi
+\ifhastoks {ab} {abc}Y\else N\fi
+\ifhastoks {ab} {\abc}Y\else N\fi
+\ifhastoks {\ab}{\abc}Y\else N\fi
+\ifhasxtoks{ab} {\abc}Y\else N\fi
+\ifhastok 3 {12} Y\else N\fi
+\ifhastoks {de} {abc}Y\else N\fi
+\stopbuffer
+
+\typebuffer \startpacked[blank] {\tt\nospacing\getbuffer} \stoppacked
+
+The \prm {ifhaschar} primitive differs from \prm {ifhastok} in that it handles
+nested balanced \quote {lists}, as in:
+
+\startbuffer
+\ifhastok a {abc}Y\else N\fi
+\ifhaschar a {abc}Y\else N\fi
+\ifhastok a{{a}bc}Y\else N\fi
+\ifhaschar a{{a}bc}Y\else N\fi
+\stopbuffer
+
+\typebuffer \startpacked[blank] {\tt\nospacing\getbuffer} \stoppacked
+
+\stopsubsection
+
+\startsubsection[title={\prm {ifarguments}, \prm {ifparameters} and \prm {ifparameter}}]
-These are part of the extended macro argument parsing features. The \type
-{\ifarguments} condition is like an \type {\ifcase} where the number is the
+These are part of the extended macro argument parsing features. The \prm
+{ifarguments} condition is like an \prm {ifcase} where the number is the
picked up number of arguments. The number reflects the {\em last} count, so
-successive macro expansions will adapt the value. The \type {\ifparameters}
-counts till the first empty parameter and the \type {\ifparameter} (singular)
-takes a parameter reference (like \type {#2}) and again is an \type {\ifcase}
+successive macro expansions will adapt the value. The \prm {ifparameters}
+counts till the first empty parameter and the \prm {ifparameter} (singular)
+takes a parameter reference (like \type {#2}) and again is an \prm {ifcase}
where zero means a bad reference, one a non|-|empty argument and two an empty
one. A typical usage is:
@@ -1213,9 +1487,10 @@ No expansion of arguments takes place here but you can use a test like this:
\iftok{#2}{}\else two\fi}
\stoptyping
+
\stopsubsection
-\startsubsection[title={\lpr {ifcondition}}]
+\startsubsection[title={\prm {ifcondition}}]
\topicindex {conditions}
@@ -1273,7 +1548,7 @@ we use \type {\unless} to negate the result.
\stopsubsection
-\startsubsection[title={\lpr {orelse} and \lpr {orunless}}]
+\startsubsection[title={\prm {orelse} and \prm {orunless}}]
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
@@ -1339,7 +1614,7 @@ Of course it is only useful at the right level, so you might end up with cases l
\fi
\stoptyping
-The \lpr {orunless} variant negates the next test, just like \prm {unless}. In
+The \prm {orunless} variant negates the next test, just like \prm {unless}. In
some cases these commands look at the next token to see if it is an if|-|test so
a following negation will not work (read: making that work would complicate the
code and hurt efficiency too). Side note: interesting is that in \CONTEXT\ we
@@ -1347,206 +1622,100 @@ hardly use this kind of negation.
\stopsubsection
-\startsubsection[title={\lpr {ifprotected}, \lpr {frozen}, \lpr {iffrozen} and \lpr {ifusercmd}}]
+\startsubsection[title={\prm {ifflags}}]
-These checkers deal with control sequences. You can check if a command is a
+This checker 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.
+predefined set of commands. This is an experimental command. The flag values can
+be queried with \typ {tex.getflagvalues}.
\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 {hrule}, \prm {vrule}, \lpr {nohrule} and \lpr {novrule}}]
-
-\topicindex {rules}
-
-Both rule drawing commands take an optional \type {xoffset} and \type {yoffset}
-parameter. The displacement is virtual and not taken into account when the
-dimensions are calculated.
-
-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. Of course this assumes that the backend implements them
-being invisible but still taking space.
-
-\stopsubsection
-
-\startsubsection[title={\prm {vsplit}}]
-
-\topicindex {splitting}
+\startsection[title={Control and debugging}]
-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.
+\startsubsection[title={Tracing}]
-\stopsubsection
+\topicindex {tracing}
-\startsubsection[title={Images and reused box objects},reference=sec:imagesandforms]
+If \prm {tracingonline} is larger than~2, the node list display will also print
+the node number of the nodes as well as set attributes (these can be made verbose
+by a callback). We have only a generic whatsit but again a callback can be used
+to provide detail. So, when a box is shown in \CONTEXT\ you will see quite a lot
+more than in other engines. Because nodes have more fields, more is shown anyway,
+and for nodes that have sublists (like discretionaries) these are also shown. All
+that could have been delegated to \LUA\ but it felt wrong to not made that a core
+engine feature.
-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.
+The \prm {tracingpenalties} parameter triggers the line break routine to report
+the applied interline penalties to the output.
-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 \prm {tracingcommands} is larger than 3 the mode switch will be not be
+prefixed to the \type {{command}} but get its own \type {[line]}.
-When direction nodes and (formerly local) par 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 separation between front
-and backend cleaned up the code base already quite a bit.
+When \prm {tracinghyphenation} is set to 1 duplicate patterns are reported (in
+\CONTEXT\ we default to that) and higher values will also show details about the
+\LUA\ hyphenation (exception) feedback loop discussed elsewhere.
-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.
+When set to 1 the \prm {tracingmath} variable triggers the reporting of the mode
+(inline or display) an mlist is processed. Other new tracing commands are
+discussed where the mechanisms that they relate to are introduced.
-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.
+The \prm {tracingnodes} variable makes that when a node list is reported the node
+numbers are also shown. This is only useful when you have callbacks that access
+nodes.
\starttabulate[|l|p|]
-\DB command \BC explanation \NC \NR
+\DB value \BC effect \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
+\NC 1 \NC show node numbers in lists \NC \NR
+\NC 2 \NC also show numbers of attribute nodes \NC \NR
+\NC 3 \NC also show glue spec node numbers \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 \prm {hbox}, \prm {vbox} and
-\prm {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. Apart from accepting more keywords (and therefore options) the normal
-box behave the same as before. The \prm {vcenter} builder also works in text
-mode.
-
-\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
+When the \prm {shownodedetails} variable is set to a value larger than zero and a
+node is shown (in a list) then more details will be revealed. This can be rather
+verbose because in \LUAMETATEX\ node carry more properties than in traditional
+\TEX\ and \LUATEX. A value larger than one will also show details of attributes
+that are bound to nodes.
-\startsubsection[title={\prm {boundary}, \prm {noboundary}, \prm {protrusionboundary} and \prm {wordboundary}}]
+The \prm {tracinglevels} variable is a bitset and offers the following features:
-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
+\starttabulate[|l|p|]
+\DB value \BC effect \NC \NR
+\TB
+\NC 1 \NC show group level \NC \NR
+\NC 2 \NC show input level \NC \NR
+\NC 4 \NC show catcode regime \NC \NR
+\LL
+\stoptabulate
-\startsection[title={Control and debugging}]
+So a value of~7 shows them all. In \CONTEXT\ we set this variable to~3 which
+gives a rather verbose log when tracing is on but in the end its'not that bad
+because using some of the newer programming related primitive can save tracing.
-\startsubsection[title={Tracing}]
+The \prm {tracinglists} variable will show some of the (intermediate) lists that
+get processed. It is there mainly for development but might evolve.
-\topicindex {tracing}
+Because in \LUATEX\ the saving and restoring of locally redefined macros and set
+variables is optimized a bit in order to prevent redundant stack usage, there
+will be less tracing visible.
-If \prm {tracingonline} is larger than~2, the node list display will also print
-the node number of the nodes.
+Also, because we have a more extensive macro argument parser, a fast path (and
+less storage demands) for macros with no arguments, and flags that can be set for
+macros the way macros are traced can be different in details (we therefore have
+for instance \prm {meaningfull} (double l's indeed) and \prm {meaningless} as
+variants of \prm {meaning} as well as \prm {meaningasis} for more literal
+alternative).
\stopsubsection
-% \startsubsection[title={\lpr {lastnodetype}, \lpr {lastnodesubtype}, \lpr
-% {currentiftype} and \lpr {internalcodesmode}.}]
+% \startsubsection[title={\prm {lastnodetype}, \prm {lastnodesubtype}, \prm
+% {currentiftype} and \prm {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
@@ -1556,479 +1725,286 @@ the node number of the nodes.
%
% \stopsubsection
-\startsubsection[title={\lpr {lastnodetype}, \lpr {lastnodesubtype}, \lpr
+\startsubsection[title={\prm {lastnodetype}, \prm {lastnodesubtype}, \prm
{currentiftype}}]
-The \ETEX\ command \type {\lastnodetype} returns the node codes as used in the
+The \ETEX\ command \prm {lastnodetype} returns the node codes as used in the
engine. You can query the numbers at the \LUA\ end if you need the actual values.
The parameter \type {\internalcodesmode} is no longer provided as compatibility
switch because \LUATEX\ has more cq. some different nodes and it makes no sense
-to be incompatible with the \LUA\ end of the engine. The same is true for \type
-{\currentiftype}, as we have more conditionals and also use a different order.
-The \type {\lastnodesubtype} is a bonus and again reports the codes used
+to be incompatible with the \LUA\ end of the engine. The same is true for \prm
+{currentiftype}, as we have more conditionals and also use a different order.
+The \prm {lastnodesubtype} is a bonus and again reports the codes used
internally. During development these might occasionally change, but eventually
they will be stable.
\stopsubsection
-\stopsection
+\startsubsection[title={\prm {lastboundary} and \prm {unboundary}}]
-\startsection[title={Files}]
+There are \prm {lastpenalty}, \prm {lastskip}, \prm {lastkern} and \prm {lastbox}
+primitives and \LUAMETATEX\ also offers \prm {lastboundary} which gives the value
+assigned to a user boundary node. This means that we also have a \prm
+{unboundary} to complement the other \tex {un...} primitives.
-\startsubsection[title={File syntax}]
-
-\topicindex {files+names}
-
-\LUAMETATEX\ will accept a braced argument as a file name:
+\stopsubsection
-\starttyping
-\input {plain}
-\openin 0 {plain}
-\stoptyping
+\startsubsection[title=Nodes]
-This allows for embedded spaces, without the need for double quotes. Macro
-expansion takes place inside the argument. Keep in mind that as side effect of
-delegating \IO\ to \LUA\ the \prm {openin} primitive is nor provided by the
-engine and has to be implemented by the macro package. This also means that the
-limit on the number of open files is not enforced by the engine.
+\topicindex {nodes}
-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.
+The \ETEX\ primitive \prm {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 \prm {lastnodesubtype}.
-\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
+Another last one is \prm {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.
\stopsubsection
-\startsubsection[title={Writing to file}]
-
-\topicindex {files+writing}
-
-Writing to a file in \TEX\ has two forms: delayed and immediate. Delayed writing
-means that the to be written text is anchored in the node list and flushed by the
-backend. As all \IO\ is delegated to \LUA, this also means that it has to deal
-with distinction. In \LUATEX\ the number of open files was already bumped to 127,
-but in \LUAMETATEX\ it depends on the macro package. The special meaning of
-channel 18 was already dropped in \LUATEX\ because we have \type {os.execute}.
+\stopsection
-\stopsubsection
+\startsection[title=Scanning]
-\stopsection
+\startsubsection[title=Keywords]
-\startsection[title={Math}]
+\topicindex {keywords}
+\topicindex {scanning+keywords}
-\topicindex {math}
+Some primitives accept one or more keywords and \LUAMETATEX\ adds some more. In
+order to deal with this efficiently the keyword scanner has been optimized, where
+even the context was taken into account. As a result the scanner was quite a bit
+faster. This kind of optimization was a graduate process the eventually ended up
+in what we have now. In traditional \TEX\ (and also \LUATEX) the order of
+keywords is sometimes mixed and sometimes prescribed. In most cases only one
+occurrence is permitted. So, for instance, this is valid in \LUATEX:
-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.
+\starttyping
+\hbox attr 123 456 attr 123 456 spread 10cm { }
+\hrule width 10cm depth 3mm
+\hskip 3pt plus 2pt minus 1pt
+\stoptyping
-\stopsection
+The \type {attr} comes before the \type {spread}, rules can have multiple mixed
+dimension specifiers, and in glue the optional \type {minus} part always comes
+last. The last two commands are famous for look ahead side effects which is why
+macro packages will end them with something not keyword, like \type {\relax},
+when needed.
-\startsection[title={Fonts}]
+In \LUAMETATEX\ the following is okay. Watch the few more keywords in box and
+rule specifications.
-\topicindex {fonts}
+\starttyping
+\hbox reverse to 10cm attr 123 456 orientation 4 xoffset 10pt spread 10cm { }
+\hrule xoffset 10pt width 10cm depth 3mm
+\hskip 3pt minus 1pt plus 2pt
+\stoptyping
-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.
+Here the order is not prescribed and, as demonstrated with the box specifier, for
+instance dimensions (specified by \type {to} or \type {spread} can be overloaded
+by later settings. In case you wonder if that breaks compatibility: in some way
+it does but bad or sloppy keyword usage breaks a run anyway. For instance \type
+{minuscule} results in \type {minus} with no dimension being seen. So, in the end
+the user should not noticed it and when a user does, the macro package already
+had an issue that had to be fixed.
-\stopsection
+\stopsubsection
-\startsection[title=Directions]
+\startsubsection[title={\prm {norelax}}]
-\topicindex {\OMEGA}
-\topicindex {\ALEPH}
-\topicindex {directions}
+\topicindex{relaxing}
-\startsubsection[title={Two directions}]
+There are a few cases where the \TEX\ scanned skips over spaces and \prm {relax} as
+well as quits on a \prm {relax} in which case it gets pushed back. An example is
+given below:
-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.
+\startbuffer
+\edef\TestA{\ifnum1=1\relax Y\else N\fi} \meaningasis\TestA
+\edef\TestB{\ifnum1=1\norelax Y\else N\fi} \meaningasis\TestB
+\stopbuffer
-\stopsubsection
+\typebuffer
-\startsubsection[title={How it works}]
+The second line also contains a sentinel but this time we use \prm {norelax}
+which will not be pushed back. So, this feature is just a trick to get rid of (in
+itself reasonable) side effects.
-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.
+\startlines\getbuffer \stoplines
-This is what happens:
+\stopsubsection
-\starttyping
-\textdirection 1 nur {\textdirection 0 run \textdirection 1 NUR} nur
-\stoptyping
+\startsubsection[title={\prm {ignorepars}}]
-This becomes stepwise:
+This primitive is like \prm {ignorespaces} but also skips paragraph ending
+commands (normally \prm {par} and empty lines).
-\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
+\stopsubsection
-And this:
+\startsubsection[title={\prm {futureexpand}, \prm {futureexpandis}, \prm {futureexpandisap}}]
-\starttyping
-\textdirection 1 nur {nur \textdirection 0 run \textdirection 1 NUR} nur
-\stoptyping
+\topicindex{expansion+future}
-becomes:
+These commands are used as:
-\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
+\futureexpand\sometoken\whenfound\whennotfound
\stoptyping
-\stopnarrower
-Now, in the following examples watch where we put the braces:
+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}.
-\startbuffer
-\textdirection 1 nur {{\textdirection 0 run} {\textdirection 1 NUR}} nur
-\stopbuffer
+\stopsubsection
-\typebuffer
+\stopsection
-This becomes:
+\startsection[title=Macros]
-\startnarrower
-\getbuffer
-\stopnarrower
+\startsubsection[title={\prm {lettonothing} and \prm {glettonothing}}]
-Compare this to:
+This primitive is equivalent to:
-\startbuffer
-\textdirection 1 nur {{\textdirection 0 run }{\textdirection 1 NUR}} nur
-\stopbuffer
+\starttyping
+\protected\def\lettonothing#1{\def#1{}}
+\stoptyping
-\typebuffer
+and although it might feel faster (only measurable with millions of calls) it's
+mostly there because it is easier on tracing (less clutter). An advantage over
+letting to an empty predefined macro is also that in tracing we keep seeing the
+name (relaxing would show the relax equivalent).
-Which renders as:
+\stopsubsection
-\startnarrower
-\getbuffer
-\stopnarrower
+\startsubsection[title={\prm {glet}}]
-So how do we deal with the next?
+This primitive is similar to:
-\startbuffer
-\def\ltr{\textdirection 0\relax}
-\def\rtl{\textdirection 1\relax}
+\starttyping
+\protected\def\glet{\global\let}
+\stoptyping
-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
+but faster (only measurable with millions of calls) and probably more convenient
+(after all we also have \type {\gdef}).
-\typebuffer
+\stopsubsection
-It gets typeset as:
+\startsubsection[title={\prm {defcsname}, \prm {edefcsname}, \prm {gdefcsname} and \prm {xdefcsname}}]
-\startnarrower
-\startlines
-\getbuffer
-\stoplines
-\stopnarrower
+Although we can implement these primitives easily using macros it makes sense,
+given the popularity of \prm {csname} to have these as primitives. It also saves
+some \prm {expandafter} usage and it looks a bit better in the source.
-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:
+\starttyping
+\gdefcsname foo\endcsname{oof}
+\stoptyping
-\startbuffer[def]
-\def\ltr{\linedirection 0\relax}
-\def\rtl{\linedirection 1\relax}
-\stopbuffer
+\stopsubsection
-\typebuffer[def]
+\startsubsection[title={\prm {letcsname} and \prm {gletcsname}}]
-and this time:
+These can also be implemented using macros but again they are natively provided
+by the engine for the same reasons: less code and less tracing clutter.
-\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
+\starttyping
+\gletcsname foo\endcsname \relax
+\stoptyping
-\typebuffer[txt]
+\stopsubsection
-comes out as a properly spaced:
+\startsubsection[title={\prm {csstring}, \prm {begincsname} and \prm {lastnamedcs}}]
-\startnarrower
-\startlines
-\getbuffer[def,txt]
-\stoplines
-\stopnarrower
+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.
-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.
+The \prm {begincsname} primitive is like \prm {csname} but doesn't create
+a relaxed equivalent when there is no such name. It is equivalent to
-\stopsubsection
+\starttyping
+\ifcsname foo\endcsname
+ \csname foo\endcsname
+\fi
+\stoptyping
-\startsubsection[title={Normalizing lines}]
+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 \prm {lastnamedcs}
+is one that should be used with care. The above example could be written as:
-The original \TEX\ machinery was never meant to be opened up. As a consequence a
-constructed line can have different layouts. There can be left- and/or right
-skips and hanging indentation or parshape can result in a shift and adapted
-width. In \LUATEX\ glue got subtypes so we can recognize the left-, right and
-parfill skips, but still there is no hundred percent certainty about the shape.
+\starttyping
+\ifcsname foo\endcsname
+ \lastnamedcs
+\fi
+\stoptyping
-In \LUAMETATEX\ lines can be normalized. This is optional because we want to
-preserve the original (for comparison) and is controlled by \lpr
-{normalizelinemode}. That variable actually drives some more. An earlier version
-provided a few more granular options (for instance: does a leftskip comes before
-or after a left hanging indentation) but in the end that was dropped. Because
-this normalization only is seen at the \LUA\ end there is no need to go into much
-detail here.
+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.
-At this moment a line has this pattern: left parfill, left hang, left skip,
-indentation, content, right hang, right skip, right parfill. Of course the
-indentation and fill skips are not present in every line.
+Active characters are stored in the hash with a special prefix sequence prepended
+to the character: \prm {csactive} or the never used \UTF\ representation of \type
+{U+FFFF}.
-Control over normalization happens via the mentioned mode variable and here is
-what the engine provides right now. We use a bitmap:
+\stopsubsection
-\starttabulate[|l|l|]
-\DB value \BC reported \NC \NR
-\TB
-\NC \type{0x0001} \NC normalize line as described above \NC \NR
-\NC \type{0x0002} \NC use a skip for parindent instead of a box \NC \NR
-\NC \type{0x0004} \NC swap hangindent in l2r mode \NC \NR
-\NC \type{0x0008} \NC swap parshape in l2r mode \NC \NR
-\NC \type{0x0010} \NC put breaks after dir in l2r mode \NC \NR
-\NC \type{0x0020} \NC remove margin kerns (\PDFTEX\ left-over) \NC \NR
-\NC \type{0x0040} \NC if needed clip width and use correction kern \NC \NR
-\LL
-\stoptabulate
+\startsubsection[title={\prm {futuredef} and \prm {futurecsname}}]
-Setting the bit enables the related normalization. More features might be added
-in future releases.
+This is just the definition variant of \prm {futurelet} and a simple example
+shows the difference:
-% Swapping shapes
-%
-% 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.
+\startbuffer
+\def\whatever{[\next:\meaning\next]}
+\futurelet\next\whatever A
+\futuredef\next\whatever B
+\stopbuffer
-% 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=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}.
-
-{\em This is still somewhat experimental and will be documented in more detail
-when I've used it more in \CONTEXT\ and the specification is frozen. This might
-take some time (and user input).}
+\typebuffer
-\stopsubsection
+\getbuffer
-\stopsection
+The next one was more an experiment that then stayed around, just to see what
+surprising abuse of this primitive will happen:
-\startsection[title=Keywords]
+\startbuffer
+\def\whateveryes{[YES]}
+\def\whatevernop{[NOP]}
+\let\whatever\undefined
+\futurecsname\whatevernop whatever\endcsname
+\futurecsname\whatevernop whateveryes\endcsname
+\stopbuffer
-Some primitives accept one or more keywords and \LUAMETATEX\ adds some more. In
-order to deal with this efficiently the keyword scanner has been optimized, where
-even the context was taken into account. As a result the scanner was quite a bit
-faster. This kind of optimization was a graduate process the eventually ended up
-in what we have now. In traditional \TEX\ (and also \LUATEX) the order of
-keywords is sometimes mixed and sometimes prescribed. In most cases only one
-occurrence is permitted. So, for instance, this is valid in \LUATEX:
+\typebuffer
-\starttyping
-\hbox attr 123 456 attr 123 456 spread 10cm { }
-\hrule width 10cm depth 3mm
-\hskip 3pt plus 2pt minus 1pt
-\stoptyping
+When the assembles control sequence is undefined the given one will be expanded,
+a weird one, right? I will probably apply it some day in cases where I want less
+tracing and a more direct expansion of an assembled name.
-The \type {attr} comes before the \type {spread}, rules can have multiple mixed
-dimension specifiers, and in glue the optional \type {minus} part always comes
-last. The last two commands are famous for look ahead side effects which is why
-macro packages will end them with something not keyword, like \type {\relax},
-when needed.
+\getbuffer
-In \LUAMETATEX\ the following is okay. Watch the few more keywords in box and
-rule specifications.
+Here is a usage example:
\starttyping
-\hbox reverse to 10cm attr 123 456 orientation 4 xoffset 10pt spread 10cm { }
-\hrule xoffset 10pt width 10cm depth 3mm
-\hskip 3pt minus 1pt plus 2pt
+\xdef\Whatever{\futurecsname\whatevernop whatever\endcsname}
+\xdef\Whatever{\futurecsname\whateveryes whateveryes\endcsname}
+\xdef\Whatever{\ifcsname whatever\endcsname\lastnamedcs\else\whatevernop\fi}
+\xdef\Whatever{\ifcsname whateveryes\endcsname\lastnamedcs\else\whatevernop\fi}
+\xdef\Whatever{\ifcsname whatever\endcsname\csname whatever\endcsname\else\whatevernop\fi}
+\xdef\Whatever{\ifcsname whateveryes\endcsname\csname whateveryes\endcsname\else\whatevernop\fi}
\stoptyping
-Here the order is not prescribed and, as demonstrated with the box specifier, for
-instance dimensions (specified by \type {to} or \type {spread} can be overloaded
-by later settings. In case you wonder if that breaks compatibility: in some way
-it does but bad or sloppy keyword usage breaks a run anyway. For instance \type
-{minuscule} results in \type {minus} with no dimension being seen. So, in the end
-the user should not noticed it and when a user does, the macro package already
-had an issue that had to be fixed.
-
-\stopsection
-
-\startsection[title=Expressions and \lpr {numericscale}]
-
-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).
+The timings for one million times defining each of these definitions are 0.277,
+0.313, 0.310, 0.359, 0.352 and 0.573 seconds (on a 2018 Dell 7250 Precision
+laptop with mobile E3-1505M v6 processor), so there is a little gain here, but of
+course in practice no one will notice that because not that many such macros are
+defined (or used).
-The \lpr{numericscale} parser is kind of special (and might evolve). For now it
-converts a following number in a scale value as often used in \TEX, where 1000
-means scaling by~1.0. The trick is in the presence of a digit (or comma): 1.234
-becomes 1234 but 1234 stays 1234 and from this you can deduce that 12.34 becomes
-123400. Internally \TEX\ calculates with integers, but this permits the macro
-package to provide an efficient mix.
+\stopsubsection
-\stopsection
+\startsubsection[title=Arguments]
-\startsection[title=Macro arguments]
+\topicindex {macros+arguments}
Again this is experimental and (used and) discussed in document that come with the
\CONTEXT\ distribution. When defining a macro you can do this:
@@ -2038,7 +2014,7 @@ Again this is experimental and (used and) discussed in document that come with t
\stoptyping
Here the first argument between parentheses is mandate. But the magic
-prefix \lpr {tolerant} makes that limitation go away:
+prefix \prm {tolerant} makes that limitation go away:
\starttyping
\tolerant\def\foo(#1)#2{...}
@@ -2066,6 +2042,9 @@ more parsing options:
\NC 0 \NC discard but count the argument \NC \NR
\ML
\NC * \NC ignore spaces \NC \NR
+\NC . \NC ignore pars and spaces \NC \NR
+\NC , \NC push back space when no match \NC \NR
+\ML
\NC : \NC pick up scanning here \NC \NR
\NC ; \NC quit scanning \NC \NR
\LL
@@ -2081,7 +2060,8 @@ what this does:
Of course complex combinations can be confusing because after all \TEX\ is
parsing for (multi|-|token) delimiters and will happily gobble the whole file if
-you are not careful. You can quit scanning if you want:
+you are not careful. You can quit scanning with \prm {ignorearguments} if you
+want:
\starttyping
\mymacro 123\ignorearguments
@@ -2101,14 +2081,71 @@ on performance this has been compensated by some more efficiency in the macro
parser and engine in general and of course you can gain back some by using these
features.
-\stopsection
+\stopsubsection
+
+\startsubsection[title={\prm {parametermark}}]
+
+The meaning of primitive \prm {parametermark} is equivalent to \type {#} in a macro
+definition, just like \prm {alignmark} is in an alignment. It can be used to circumvent
+catcode issues. The normal \quotation {duplicate them when nesting} rules apply.
+
+\startbuffer
+\def\foo\parametermark1%
+ {\def\oof\parametermark\parametermark1%
+ {[\parametermark1:\parametermark\parametermark1]}}
+\stopbuffer
+
+\typebuffer \getbuffer
+
+Here \type {\foo{X}\oof{Y}} gives: \foo{X}\oof{Y}.
+
+\stopsubsection
+
+\startsubsection[title={\prm {lastarguments} and \prm {parametercount}}]
+
+\topicindex{arguments+numberof}
+
+There are two state variables that refer to the number of read arguments. An
+example can show the difference:
+
+\startbuffer
+\tolerant\def\foo[#1]#*[#2]{[\the\lastarguments,\the\parametercount]}
+
+\foo[1][2]
+\foo[1]
+\foo
+
+x: \foo[1][2]
+x: \foo[1]
+x: \foo
+\stopbuffer
+
+\typebuffer
+
+What you get actually depends on the macro package. When for instance \prm
+{everypar} has some value that results in a macro being expanded, the numbers
+reported can refer to the most recent macro because serializing the number can
+result in entering horizontal mode.
+
+\startlines
+\getbuffer
+\stoplines
+
+The \prm {lastarguments} returns the most recent global state variable as with
+any \type {\last...} primitives. Because it actually looks at the parameter stack
+of the currently expanded macro \prm {parametercount} is more reliable but also
+less efficient.
+
+\stopsubsection
+
+\startsubsection[title=Overload protection]
-\startsection[title=Overload protection]
+\topicindex {macros+overloading}
There is an experimental overload protection mechanism that we will test for a
while before declaring it stable. The reason for that is that we need to adapt
the \CONTEXT\ code base in order to test its usefulness. Protection is achieved
-via prefixes. Depending on the value of the \lpr {overloadmode} variable
+via prefixes. Depending on the value of the \prm {overloadmode} variable
warnings or errors will be triggered. Examples of usage can be found in some
documents that come with \CONTEXT, so here we just stick to the basics.
@@ -2120,10 +2157,10 @@ documents that come with \CONTEXT, so here we just stick to the basics.
\aliased \def\foo{...}
\stoptyping
-A \lpr {mutable} macro can always be changed contrary to an \lpr {immutable} one.
-For instance a macro that acts as a variable is normally \lpr {mutable}, while a
+A \prm {mutable} macro can always be changed contrary to an \prm {immutable} one.
+For instance a macro that acts as a variable is normally \prm {mutable}, while a
constant can best be immutable. It makes sense to define a public core macro as
-\lpr {permanent}. Primives start out a \lpr {permanent} ones but with a primitive
+\prm {permanent}. Primives start out a \prm {permanent} ones but with a primitive
property instead.
\startbuffer
@@ -2134,16 +2171,16 @@ property instead.
\typebuffer
-The \lpr {meaningfull} primitive is like \prm {meaning} but report the
-properties too. The \lpr {meaningless} companion reports the body of a macro.
+The \prm {meaningfull} primitive is like \prm {meaning} but report the
+properties too. The \prm {meaningless} companion reports the body of a macro.
Anyway, this typesets:
\startlines \tttf \getbuffer \stoplines
-So, the \lpr {aliased} prefix copies the properties. Keep in mind that a macro
+So, the \prm {aliased} prefix copies the properties. Keep in mind that a macro
package can redefine primitives, but \prm {relax} is an unlikely candidate.
-There is an extra prefix \lpr {noaligned} that flags a macro as being valid
+There is an extra prefix \prm {noaligned} that flags a macro as being valid
for \prm {noalign} compatible usage (which means that the body must contain that
one. The idea is that we then can do this:
@@ -2155,7 +2192,7 @@ that is: we can have protected macros that don't trigger an error in the parser
where there is a look ahead for \prm {noalign} which is why normally protection
doesn't work well. So: we have macro flagged as permanent (overload protection),
being protected (that is, not expandable by default) and a valid equivalent of
-the noalign primitive. Of course we can also apply the \prm {global} and \lpr
+the noalign primitive. Of course we can also apply the \prm {global} and \prm
{tolerant} prefixes here. The complete repertoire of extra prefixes is:
\starttabulate
@@ -2174,14 +2211,16 @@ the noalign primitive. Of course we can also apply the \prm {global} and \lpr
\NC \type {enforced} \NC all is permitted (but only in zero mode or ini mode) \NC \NR
\NC \type {aliased} \NC the macro gets the same flags as the original \NC \NR
\HL
+\NC \type {untraced} \NC the macro gets a different treatment in tracing \NC \NR
+\HL
\stoptabulate
-The not yet discussed \lpr {instance} is just a flag with no special meaning
-which can be used as classifier. The \lpr {frozen} also protects against overload
+The not yet discussed \prm {instance} is just a flag with no special meaning
+which can be used as classifier. The \prm {frozen} also protects against overload
which brings amount of blockers to four.
To what extent the engine will complain when a property is changed in a way that
-violates the flags depends on the parameter \lpr {overloadmode}. When this
+violates the flags depends on the parameter \prm {overloadmode}. When this
parameter is set to zero no checking takes place. More interesting are values
larger than zero. If that is the case, when a control sequence is flagged as
mutable, it is always permitted to change. When it is set to immutable one can
@@ -2199,11 +2238,11 @@ the following overload values are used:
\stoptabulate
The even values (except zero) will abort the run. A value of 255 will freeze this
-parameter. At level five and above the \lpr {instance} flag is also checked but
+parameter. At level five and above the \prm {instance} flag is also checked but
no drastic action takes place. We use this to signal to the user that a specific
instance is redefined (of course the definition macros can check for that too).
-The \lpr {overloaded} prefix can be used to overload a frozen macro. The \lpr
+The \prm {overloaded} prefix can be used to overload a frozen macro. The \prm
{enforced} is more powerful and forces an overload but that prefix is only
effective in ini mode or when it's embedded in the body of a macro or token list
at ini time unless of course at runtime the mode is zero.
@@ -2215,9 +2254,56 @@ modules or macros of unpredictable origin will probably suffer from warnings and
errors when de mode is set to non zero. In \CONTEXT\ we're okay unless of course
users redefine instances but there a warning or error is kind of welcome.
+There is an extra prefix \prm {untraced} that will suppress the meaning when
+tracing so that the macro looks more like a primitive. It is still somewhat
+experimental so what gets displayed might change.
+
+The \prm {letfrozen}, \prm {unletfrozen}, \prm {letprotected} and \prm
+{unletprotected} primitives do as their names advertise. Of course the \prm
+{overloadmode} must be set so that it is permitted.
+
+\stopsubsection
+
+\startsubsection[title={Swapping meaning}]
+
+\topicindex {macros+swapping}
+
+The \prm {swapcsvalues} will swap the values of two control sequences of the same
+type. This is a somewhat tricky features because it can interfere with grouping.
+
+\startbuffer
+\scratchcounterone 1 \scratchcountertwo 2
+(\the\scratchcounterone,\the\scratchcountertwo)
+\swapcsvalues \scratchcounterone \scratchcountertwo
+(\the\scratchcounterone,\the\scratchcountertwo)
+\swapcsvalues \scratchcounterone \scratchcountertwo
+(\the\scratchcounterone,\the\scratchcountertwo)
+
+\scratchcounterone 3 \scratchcountertwo 4
+(\the\scratchcounterone,\the\scratchcountertwo)
+\bgroup
+\swapcsvalues \scratchcounterone \scratchcountertwo
+(\the\scratchcounterone,\the\scratchcountertwo)
+\egroup
+(\the\scratchcounterone,\the\scratchcountertwo)
+\stopbuffer
+
+\typebuffer
+
+We get similar results:
+
+\startlines
+\getbuffer
+\stoplines
+
+\stopsubsection
+
\stopsection
-\startsection[title=Constants]
+\startsection[title=Quantities]
+
+\startsubsection[title={Constants with \prm{integerdef}, \prm {dimensiondef},
+\prm {gluespecdef} and \prm {mugluespecdef}}]
It is rather common to store constant values in a register or character
definition.
@@ -2231,33 +2317,357 @@ definition.
But in \LUAMETATEX\ we also can do this:
\starttyping
-\integerdef\MyConstantC 456
-\dimendef \MyConstantD 456pt
+\integerdef \MyConstantI 456
+\dimensiondef \MyConstantD 456pt
+\gluespecdef \MyConstantG 987pt minus 654pt plus 321pt
+\mugluespecdef \MyConstantG 3mu plus 2mu minus 1mu
\stoptyping
These two are stored as efficient as a register but don't occupy a register slot.
They can be set as above, need \prm {the} for serializations and are seen as
-valid number or dimension when needed.
+valid number or dimension when needed. They do behave like registers so one can
+use for instance \prm {advance} and assign values but keep in mind that an alias
+(made by for instance \prm {let} clones the value and that clone will not follow
+a change in the original. For that, registers can be used because there we use an
+indirect reference.
Experiments with constant strings made the engine source more complex than I
wanted so that features was rejected. Of course we can use the prefixes mentioned
in a previous section.
+\stopsubsection
+
+\startsubsection[title={Getting internal indices with \prm {indexofcharacter} and \prm {indexofregister}}]
+
+When you have defined a register with one of the \tex {...def} primitives but for
+some reasons needs to know the register index you can query that:
+
+\startbuffer
+\the\indexofregister \scratchcounterone,
+\the\indexofregister \scratchcountertwo,
+\the\indexofregister \scratchwidth,
+\the\indexofregister \scratchheight,
+\the\indexofregister \scratchdepth,
+\the\indexofregister \scratchbox
+\stopbuffer
+
+\typebuffer
+
+We lie a little here because in \CONTEXT\ the box index \tex {scratchbox} is
+actually defined as: \normalexpanded {\typ {\meaningasis \scratchbox}} but it
+still is a number so it fits in.
+
+\getbuffer
+
+A similar primitive gives us the (normally \UNICODE) value of a character:
+
+\startbuffer
+\chardef\MyCharA=65
+\the\indexofcharacter A
+\the\indexofcharacter \MyCharA
+\stopbuffer
+
+\typebuffer
+
+The result is equivalent to \type {\number `A} but avoids the back quote:
+\inlinebuffer.
+
+\stopsubsection
+
+\startsubsection[title={Serialization with \prm {todimension}, \prm {toscaled}, \prm {tohexadecimal} and \prm {tointeger}}]
+
+These serializers take a verbose or symbolic quantity:
+
+\starttyping
+\todimension 10pt \todimension \scratchdimen % with unit
+\toscaled 10pt \toscaled \scratchdimen % without unit
+\tointeger 10 \tointeger \scratchcounter
+\tohexadecimal 10 \tohexadecimal \scratchcounter
+\stoptyping
+
+This is particularly handy in cases where you don't know what you deal with, for instance
+when a value is stored in a macro. Using \type {\the} could fail there while:
+
+\starttyping
+\the\dimexpr10pt\relax
+\stoptyping
+
+is often overkill and gives more noise in a trace.
+
+\stopsubsection
+
+\startsubsection[title={Serialization with \prm {thewithoutunit}, \prm {tosparsedimension} and \prm {tosparsescaled}}]
+
+\topicindex {units}
+
+By default \TEX\ lets \type {1pt} come out as \type {1.0pt} which is why we also have
+two sparse variants:
+
+\startbuffer
+\todimension 10pt\quad\tosparsedimension 10pt
+\todimension 1.2pt\quad\tosparsedimension 1.2pt
+\toscaled 10pt\quad\tosparsescaled 10pt
+\toscaled 1.2pt\quad\tosparsescaled 1.2pt
+\stopbuffer
+
+\typebuffer
+
+This time trailing zeros (and a trailing period) will be dropped:
+
+\startlines \getbuffer \stoplines
+
+The \prm {thewithoutunit} primitive is like \prm {the} on a dimension but it
+omits the unit.
+
+\stopsubsection
+
\stopsection
-\startsection[title=Nodes]
+\startsection[title=Expressions]
-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}.
+\startsubsection[title={Rounding and scaling}]
-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.
+\topicindex {expressions+traditional}
+
+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).
+
+The \prm{numericscale} parser is kind of special (and might evolve). For now it
+converts a following number in a scale value as often used in \TEX, where 1000
+means scaling by~1.0. The trick is in the presence of a digit (or comma): 1.234
+becomes 1234 but 1234 stays 1234 and from this you can deduce that 12.34 becomes
+123400. Internally \TEX\ calculates with integers, but this permits the macro
+package to provide an efficient mix.
+
+\stopsubsection
+
+\startsubsection[title={Enhanced expressions}]
+
+\topicindex {expressions+enhanced}
+
+The \ETEX\ expression primitives are handy but have some limitations. Although
+the parsers have been rewritten in \LUAMETATEX\ and somewhat more efficient the
+only extension we have is support for an integer division with \type {:}. After
+experimenting for a while and pondering how to make \prm {dimexpr} and \prm
+{numexpr} more powerful I decided to come up with alternatives in order not to
+introduce incompatibilities.
+
+The \prm {numexpression} and \prm {dimexpression} primitives are equivalent but
+offer more. The first one operates in the integer domain and the second one
+assumes scaled values. Often the second one can act like the first when
+serialized with \prm {number} in front. This is because when \TEX\ sees a
+symbolic reference to an integer or dimension it can treat them as it likes.
+
+The set of operators that we have to support is the following. Most have
+alternatives so that we can get around catcode issues.
+
+\starttabulate[||cT|cT|]
+\DB action \BC symbol \BC keyword \NC \NR
+\TB
+\NC add \NC + \NC \NC \NR
+\NC subtract \NC - \NC \NC \NR
+\NC multiply \NC * \NC \NC \NR
+\NC divide \NC / : \NC \NC \NR
+\NC mod \NC \letterpercent \NC mod \NC \NR
+\NC band \NC & \NC band \NC \NR
+\NC bxor \NC ^ \NC bxor \NC \NR
+\NC bor \NC \letterbar \space v \NC bor \NC \NR
+\NC and \NC && \NC and \NC \NR
+\NC or \NC \letterbar\letterbar \NC or \NC \NR
+\NC setbit \NC <undecided> \NC bset \NC \NR
+\NC resetbit \NC <undecided> \NC breset \NC \NR
+\NC left \NC << \NC \NC \NR
+\NC right \NC >> \NC \NC \NR
+\NC less \NC < \NC \NC \NR
+\NC lessequal \NC <= \NC \NC \NR
+\NC equal \NC = == \NC \NC \NR
+\NC moreequal \NC >= \NC \NC \NR
+\NC more \NC > \NC \NC \NR
+\NC unequal \NC <> != \lettertilde = \NC \NC \NR
+\NC not \NC ! \lettertilde \NC not \NC \NR
+\LL
+\stoptabulate
+
+Here are some things that \prm {numexpr} is not suitable for:
+
+\starttyping
+\scratchcounter = \numexpression
+ "00000 bor "00001 bor "00020 bor "00400 bor "08000 bor "F0000
+\relax
+
+\ifcase \numexpression
+ (\scratchcounterone > 5) && (\scratchcountertwo > 5)
+\relax yes\else nop\fi
+\stoptyping
+
+You can get an idea what the engines sees by setting \prm {tracingexpressions}
+to a value larger than zero. It shows the expression in rpn form.
+
+\starttyping
+\dimexpression 4pt * 2 + 6pt \relax
+\dimexpression 2 * 4pt + 6pt \relax
+\dimexpression 4pt * 2.5 + 6pt \relax
+\dimexpression 2.5 * 4pt + 6pt \relax
+\numexpression 2 * 4 + 6 \relax
+\numexpression (1 + 2) * (3 + 4) \relax
+\stoptyping
+
+The \prm {relax} is mandate simply because there are keywords involved so the
+parser needs to know where to stop scanning. It made no sense to be more clever
+and introduce fuzziness (so there is no room for exposing in|-|depth \TEX\
+insight and expertise here). In case you wonder: the difference in performance
+between the \ETEX\ expression mechanism and the more extended variant will
+normally not be noticed, probably because they both use a different approach and
+because the \ETEX\ variant also has been optimized. \footnote {I might add some
+features in the future.}
+
+The if|-|test shown before can be done using the new primitives \prm
+{ifdimexpression} and \prm {ifnumexpression} which are boolean tests with zero
+being \type {false}.
+
+\stopsubsection
+
+\startsubsection[title={Calculations with \prm {advanceby}, \prm {multiplyby} and
+\prm {divideby}.}]
+
+The \prm {advance}, \prm {multiply} and \prm {divide} primitives accept an
+optional keyword \type {by}. In \CONTEXT\ we never use that feature and as a
+consequence the scanner has to push back a scanned token after checking for the
+\type {b} or \type {B}. These three new primitives avoid that and therefore
+perform better, but that is (as usual with such enhancements) only noticeable in
+demanding scenarios.
+
+The original three plus these new ones also operate on the \quote {constant}
+integers, dimensions etc.
+
+\stopsubsection
+
+\stopsection
+
+\startsection[title=Loops]
+
+\topicindex {loops}
+
+There is actually not that much to tell about the three loop primitives \prm
+{expandedloop}, \prm {unexpandedloop} and \prm {localcontrolledloop}. They are
+used like:
+
+\startbuffer
+\unexpandedloop 1 10 1 {
+ [!]
+}
+\stopbuffer
+
+\typebuffer
+
+This will give 10 snippets.
+
+\getbuffer
+
+So what will the next give?
+
+\startbuffer
+\edef\TestA{\unexpandedloop 1 10 1 {!}}\meaning\TestA
+\edef\TestB{\expandedloop 1 10 1 {!}}\meaning\TestB
+\stopbuffer
+
+\typebuffer
+
+We see no difference in results between the two loops:
+
+\startlines \tt
+\getbuffer
+\stoplines
+
+But the the next variant shows that they do:
+
+\startbuffer
+\edef\TestA{\unexpandedloop 1 10 1 {\the\currentloopiterator}}\meaning\TestA
+\edef\TestB{\expandedloop 1 10 1 {\the\currentloopiterator}}\meaning\TestB
+\stopbuffer
+
+\typebuffer
+
+The unexpanded variants sort of delays:
+
+\startlines \tt
+\getbuffer
+\stoplines
+
+You can nest loops and query the nesting level:
+
+\startbuffer
+\expandedloop 1 10 1 {%
+ \ifodd\currentloopiterator\else
+ [\expandedloop 1 \currentloopiterator 1 {%
+ \the\currentloopnesting
+ }]
+ \fi
+}
+\stopbuffer
+
+\typebuffer
+
+Here we use the two numeric state primitives \prm {currentloopiterator} and \prm
+{currentloopnesting}. This results in:
+
+\getbuffer
+
+The \prm {quitloop} primitive makes it possible to prematurely exit a loop (at
+the next step), although of course in the next case one can just adapt the final
+iterator value instead. Here we step by 2:
+
+\startbuffer
+\expandedloop 1 20 2 {%
+ \ifnum\currentloopiterator>10
+ \quitloop
+ \else
+ [!]
+ \fi
+}
+\stopbuffer
+
+\typebuffer
+
+This results in:
+
+\getbuffer
+
+The \prm {lastloopiterator} primitive keeps the last iterator value and is a global
+one as all \type {\last...} primitives. The loops also work with negative values.
+
+A special case is \prm {localcontrolledloop} which fits into the repertoire of
+local control primitives. In that case the loop body gets expanded in a nested
+main loop which can come in handy in tricky cases where full expansion is mixed
+with for instance assignments but of course users should then be aware of
+out|-|of|-|order side effects when you push back something in the input. Consider
+it a playground.
\stopsection
\stopchapter
\stopcomponent
+
+% \bgroup \unprotect
+% \catcode`<= \lettercatcode
+% \ifnum 1 = 2 n \else y \fi
+% \ifnum 1 > 2 n \else y \fi
+% \ifnum 1 < 2 y \else n \fi
+% \ifnum 1 != 2 y \else n \fi
+% \ifnum 1 !> 2 y \else n \fi
+% \ifnum 1 !< 2 n \else y \fi
+% \ifnum 1 ≠ 2 y \else n \fi
+% \ifnum 1 ≥ 2 n \else y \fi
+% \ifnum 1 ≤ 2 y \else n \fi
+% \ifnum 1 ≱ 2 n \else y \fi
+% \ifnum 1 ≰ 2 y \else n \fi
+% \ifnum 1 ∈ 3 y \else n \fi
+% \ifnum 1 ∉ 3 n \else y \fi
+% \ifdim 10pt ∈ 10.5pt y \else n \fi
+% \ifdim 10pt ∉ 10.5pt n \else y \fi
+% \ifdim 11pt ∈ 10.5pt n \else y \fi
+% \ifdim 11pt ∉ 10.5pt y \else n \fi
+% \protect \egroup
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
index 83fb40df12b..d4bab97b898 100644
--- 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
@@ -1,3 +1,5 @@
+% language=us runpath=texruns:manuals/luametatex
+
\environment luametatex-style
\startcomponent luametatex-firstpage
@@ -16,10 +18,12 @@
\definedfont[Bold*default at 12pt]
\starttabulate[|l|l|]
- \NC copyright \EQ Lua\TeX\ development team \NC \NR
+ \NC copyright \EQ LuaMeta\TeX\ development team \NC \NR
+ \NC \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 \EQ build.contextgarden.net \NC \NR
\NC version \EQ \currentdate \doifsomething{\documentvariable{snapshot}}{(snapshot \documentvariable{snapshot})} \NC \NR
\stoptabulate
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
index 9a09f705c10..b4e6925457f 100644
--- 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
@@ -1,4 +1,4 @@
-% language=uk
+% language=us runpath=texruns:manuals/luametatex
\environment luametatex-style
@@ -8,14 +8,15 @@
\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.
+The traditional \TEX\ ligature and kerning routines are build in but anything
+more (like \OPENTYPE\ rendering) has to be implemented in \LUA. In \CONTEXT\ we
+call the former base mode and the later node mode (we have some more modes). 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
@@ -38,24 +39,36 @@ 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
+\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
+\NC \type {name} \NC string \NC metric (file) name \NC \NR
+\NC \type {original} \NC string \NC the name used in logging and feedback \NC \NR
+\NC \type {designsize} \NC number \NC expected size (default: 655360 == 10pt) \NC \NR
+\NC \type {size} \NC number \NC the required scaling (by default the same as designsize) \NC \NR
+\HL
+\NC \type {characters} \NC table \NC the defined glyphs of this font \NC \NR
+\NC \type {fonts} \NC table \NC locally used fonts \NC \NR
+\NC \type {parameters} \NC hash \NC default: 7 parameters, all zero \NC \NR
+\HL
+\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
+\HL
+\NC \type {textcontrol} \NC bitset \NC this controls various code paths in the text engine \NC \NR
+\NC \type {hyphenchar} \NC number \NC default: \TEX's \prm {hyphenchar} \NC \NR
+\HL
+\NC \type {skewchar} \NC number \NC default: \TEX's \prm {skewchar} \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
+\NC \type {mathcontrol} \NC bitset \NC this controls various code paths in the math engine,
+ like enforcing the traditional code path \NC \NR
+\NC \type {compactmath} \NC boolean \NC experimental: use the smaller chain to locate a character \NC \NR
+\NC \type {textscale} \NC number \NC scale applied to math text \NC \NR
+\NC \type {scriptscale} \NC number \NC scale applied to math script \NC \NR
+\NC \type {scriptscriptscale} \NC number \NC scale applied to math script script \NC \NR
\LL
\stoptabulate
@@ -69,13 +82,13 @@ 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
+\NC \type {slant} \NC 1 \NC \NR
+\NC \type {space} \NC 2 \NC \NR
+\NC \type {spacestretch} \NC 3 \NC \NR
+\NC \type {spaceshrink} \NC 4 \NC \NR
+\NC \type {xheight} \NC 5 \NC \NR
+\NC \type {quad} \NC 6 \NC \NR
+\NC \type {extraspace} \NC 7 \NC \NR
\LL
\stoptabulate
@@ -94,30 +107,99 @@ 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.
+We can group the parameters. All characters have the following base set. It must
+be noted here that \OPENTYPE\ doesn't have a italic property and that the height
+and depth are also not part of the design: one can choose to derive them from the
+bounding box.
+
+\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
+\stoptabulate
+
+Then there are three parameters that are more optional and relate to advanced
+optical paragraph optimization:
+
+\starttabulate[|l|l|pl|]
+\DB key \BC type \BC description \NC\NR
+\TB
+\NC \type {leftprotruding} \NC number \NC left protruding factor (\prm {lpcode}) \NC\NR
+\NC \type {rightprotruding} \NC number \NC right protruding factor (\prm {rpcode}) \NC\NR
+\NC \type {expansion} \NC number \NC expansion factor (\prm {efcode}) \NC\NR
+\stoptabulate
+
+From \TEX\ we inherit the following tables. Ligatures are only used in so call
+base mode, when the engine does the font magic. Kerns are used in text and
+optionally in math: More details follow below.
+
+\starttabulate[|l|l|pl|]
+\DB key \BC type \BC description \NC\NR
+\TB
+\NC \type {ligatures} \NC table \NC ligaturing information \NC\NR
+\NC \type {kerns} \NC table \NC kerning information \NC\NR
+\stoptabulate
+
+The next two fields control the engine and are a variant on \TEX's \TFM\ tag
+property. In a future we might provide a bit more (local) control although
+currently we see no need. Originally the tag and next field were combined into a
+packed integer but in current \LUAMETATEX\ we have a 32 bit tag and the next
+field moved to the math blob as it only is used as variant selector.
+
+\starttabulate[|l|l|pl|]
+\DB key \BC type \BC description \NC\NR
+\TB
+\NC \type {tag} \NC number \NC a bitset, currently not really exposed \NC\NR
+%NC \type {reserved} \NC number \NC note for myself \NC \NR
+\stoptabulate
+
+In a math font characters have many more fields.
+
\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 {smaller} \NC number \NC the next smaller math size character \NC\NR
+\NC \type {mirror} \NC number \NC a right to left alternative \NC\NR
+\NC \type {flataccent} \NC number \NC an accent alternative with less height (\OPENTYPE) \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
+\HL
+\NC \type {topleft} \NC number \NC alternative script kern \NC\NR
+\NC \type {topright} \NC number \NC alternative script kern \NC\NR
+\NC \type {bottomleft} \NC number \NC alternative script kern \NC\NR
+\NC \type {bottomright} \NC number \NC alternative script kern \NC\NR
+\HL
+\NC \type {topmargin} \NC number \NC alternative accent calculation margin \NC\NR
+\NC \type {bottomargin} \NC number \NC alternative accent calculation margin \NC\NR
+\NC \type {leftmargin} \NC number \NC alternative accent calculation margin \NC\NR
+\NC \type {rightmargin} \NC number \NC alternative accent calculation margin \NC\NR
+\HL
+\NC \type {topovershoot} \NC number \NC accent width tolerance \NC\NR
+\NC \type {bottomovershoot} \NC number \NC accent width tolerance \NC\NR
+\HL
+\NC \type {topanchor} \NC number \NC horizontal top accent alignment position \NC\NR
+\NC \type {bottomanchor} \NC number \NC horizontal bottom accent alignment position \NC\NR
+\HL
+\NC \type {innerlocation} \NC string \NC \type {left} or \type {right} \NC\NR
+\NC \type {innerxoffset} \NC number \NC radical degree horizontal position \NC\NR
+\NC \type {inneryoffset} \NC number \NC radical degree vertical position \NC\NR
+\HL
+\NC \type {parts} \NC table \NC constituent parts of an extensible \NC \NR
+\NC \type {partsitalic} \NC number \NC the italic correction applied with the extensible \NC \NR
+\NC \type {partsorientation} \NC number \NC \type {horizontal} or \type {vertical} \NC\NR
+\HL
+\NC \type {mathkerns} \NC table \NC math cut-in specifications \NC\NR
+\HL
+\NC \type {extensible} \NC table \NC stretch a fixed width accent to fit\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.
+Now some more details follow. 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. Of course you will use Latin Modern \OPENTYPE\
+instead but the principles are the same:
\starttyping
[102] = {
@@ -140,23 +222,29 @@ For example, here is the character \quote {f} (decimal 102) in the font \type
}
\stoptyping
-Two very special string indexes can be used also: \type {left_boundary} is a
+Two very special string indexes can be used also: \type {leftboundary} 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
+processing. \type {rightboundary} is similar but not actually used for anything
(yet).
-The values of \type {top_accent}, \type {bot_accent} and \type {mathkern} are
+The values of \type {leftprotrusion} and \type {rightprotrusion} are used only
+when \prm {protrudechars} is non-zero. Whether or not \type {expansion} is used
+depends on the font's global expansion settings, as well as on the value of \prm
+{adjustspacing}.
+
+The values of \type {topanchor}, \type {bottomanchor} 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}.
+this manual for details. The italic corrections are a story in themselves and
+discussed in detail in other manuals. The additional parameters that deal with
+kerns, margins, overshoots, inner anchoring, etc. are engine specific and not
+part of \OPENTYPE. More information can be found in the \CONTEXT\ distribution;
+they relate the upgraded math engine project by Mikael and Hans.
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:
+\type {parts}, the \OPENTYPE\ version. The \type {extensible} table is very
+simple:
\starttabulate[|l|l|p|]
\DB key \BC type \BC description \NC\NR
@@ -168,8 +256,8 @@ very simple:
\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:
+The \type {parts} entru is an 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
@@ -184,15 +272,15 @@ Each of those components is itself a hash of up to five keys:
\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 traditional (text and math) \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 {rightboundary}), 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:
+The traditional (text) \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 {rightboundary}), with the values being yet another
+small hash, with two fields:
\starttabulate[|l|l|p|]
\DB key \BC type \BC description \NC \NR
@@ -229,6 +317,54 @@ 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.
+% The \type {mathcontrol} bitset is mostly there for experimental purposes. Because
+% there is inconsistency in the \OPENTYPE\ math fonts with respect to for instance
+% glyph dimensions, it is possible to force the traditional code path. We just mention
+% the possible flags:
+%
+% \startluacode
+% context.starttabulate { "|||" }
+% context.DB() context("value") context.BC() context("effect") context.NC() context.NR()
+% context.TB()
+% for k, v in table.sortedhash(tex.getmathcontrolvalues()) do
+% context.NC() context("0x%04X",k) context.NC() context(v) context.NC() context.NR()
+% end
+% context.LL()
+% context.stoptabulate()
+% \stopluacode
+
+Compact math is an experimental feature. The smaller field in a character
+definition of a text character can point to a script character that itself can
+point to a scriptscript one. When set the \type {textscale}, \type {scriptscale}
+and \type {scriptscriptscale} is applied to those.
+
+Bidirectional math is also experimental and driven by (in \CONTEXT\ speak) tweaks
+which means that it has to be set up explicitly as it uses a combination of
+fonts. In \CONTEXT\ is also uses specific features of the font subsystems that
+hook into the backend where we have a more advanced virtual font subsystem than
+in \LUATEX. Because this is macro package dependent it will not be discussed
+here.
+
+% The \type {textcontrol} field is used to control some aspects of text processing.
+% More options might be added in the future.
+
+% \startluacode
+% context.starttabulate { "|||" }
+% context.DB() context("value") context.BC() context("effect") context.NC() context.NR()
+% context.TB()
+% for k, v in table.sortedhash(tex.gettextcontrolvalues()) do
+% context.NC() context("0x%04X",k) context.NC() context(v) context.NC() context.NR()
+% end
+% context.LL()
+% context.stoptabulate()
+% \stopluacode
+%
+% In \CONTEXT\ these are interfaced via pseudo features. The math control flags of
+% a font can be overloaded by \prm {mathcontrolmode} on the spot and the set
+% controls of a font can be queried by \prm {fontmathcontrol}. The text control
+% flags in a font always win over the ones set by other parameters, like \prm
+% {hyphenationmode}. They can be queried with \prm {fonttextcontrol}.
+
\stopsection
\startsection[reference=virtualfonts,title={Virtual fonts}]
@@ -300,7 +436,7 @@ ever seen in the engine.
\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
\HL
-\NC \type{special} \NC 1 \NC string \NC output a \prm {special} command \NC \NR
+\NC \type{special} \NC 1 \NC string \NC output a driver directive \NC \NR
\HL
\NC \type{nop} \NC 0 \NC \NC do nothing \NC \NR
\NC \type{slot} \NC 2 \NC 2 numbers \NC a shortcut for the combination of a font and char command\NC \NR
@@ -312,7 +448,7 @@ ever seen in the engine.
\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{image} \NC 1 \NC image \NC depends on the backend \NC \NR
\NC \type{comment} \NC any \NC any \NC the arguments of this command are ignored \NC \NR
\LL
\stoptabulate
@@ -380,6 +516,9 @@ 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.
+{\em For the record: in \CONTEXT\ \LMTX\ we no longer support the \type {pdf}, \type
+{image} and \type {special} keywords.}
+
\stopsection
\startsection[title={Additional \TEX\ commands}]
@@ -399,7 +538,7 @@ expansion takes place inside the argument.
\stopsubsection
-\startsubsection[title={\lpr {fontid} and \lpr {setfontid}}]
+\startsubsection[title={\prm {fontid}, \prm {setfontid} and \prm {mathstylefontid}}]
\startsyntax
\fontid\font
@@ -407,7 +546,7 @@ expansion takes place inside the argument.
This primitive expands into a number. The currently used font id is
\number\fontid\font. Here are some more: \footnote {Contrary to \LUATEX\ this is
-now a number so you need to use \type {\number} or \type {\the}. The same is true
+now a number so you need to use \prm {number} or \prm {the}. The same is true
for some other numbers and dimensions that for some reason ended up in the
serializer that produced a sequence of tokens.}
@@ -427,12 +566,45 @@ 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,
+The primitive \prm {setfontid} can be used to enable a font with the given id,
which of course needs to be a valid one.
+In math mode the font id depends on the style because there we have a family of
+three related fonts. In this document we get the following identifiers:
+
+\starttabulate[|l|c|]
+\NC \type {$ \the \mathstylefontid \scriptscriptstyle \fam$} \NC $\the\mathstylefontid\scriptscriptstyle \fam$ \NC \NR
+\NC \type {$ \the \mathstylefontid \scriptstyle \fam$} \NC $\the\mathstylefontid\scriptstyle \fam$ \NC \NR
+\NC \type {$ \the \mathstylefontid \textstyle \fam$} \NC $\the\mathstylefontid\textstyle \fam$ \NC \NR
+\stoptabulate
+
\stopsubsection
-\startsubsection[title={\lpr {glyphoptions}}]
+\startsubsection[title={\prm {fontspecifiedname} and \prm {fontspecifiedsize}}]
+
+These two primitives provide some details about the given font:
+
+\startbuffer
+{\tf [\fontspecifiedname\font] [\the\fontspecifiedsize\font]}
+{\bf [\fontspecifiedname\font] [\the\fontspecifiedsize\font]}
+{\it [\fontspecifiedname\font] [\the\fontspecifiedsize\font]}
+\stopbuffer
+
+\typebuffer
+
+So for this document we get:
+
+\startlines
+\getbuffer
+\stoplines
+
+Of course this also depends on the macro package because that is responsible for
+implementing font support and because all that is driven by callbacks the
+reported name doesn't even have to resemble a font.
+
+\stopsubsection
+
+\startsubsection[title={\prm {glyphoptions}}]
\topicindex {ligatures+suppress}
\topicindex {kerns+suppress}
@@ -441,9 +613,11 @@ which of course needs to be a valid one.
In \LUATEX\ the \type {\noligs} and \type {\nokerns} primitives suppress these
features but in \LUAMETATEX\ these primitives are gone. They are replace by a more
-generic control primitive \lpr {glyphoptions}. This numerical parameter is a
+generic control primitive \prm {glyphoptions}. This numerical parameter is a
bitset with the following fields:
+% todo: use values
+
\starttabulate[|l|pl|]
\DB value \BC effect \NC\NR
\TB
@@ -463,18 +637,118 @@ glyph, this because the current value of this option is stored with glyphs.
\stopsubsection
-\startsubsection[title={\lpr {glyphxscale}, \lpr {glyphyscale} and \lpr {scaledfontdimen}}]
+\startsubsection[title={\prm {glyphscale}, \prm {glyphxscale}, \prm {glyphyscale} and \prm {scaledfontdimen}}]
-The two scale parameters control the current scaling. They are traditional \TEX\
-integer parameters that operate independent of each other. The scaling is
+The three scale parameters control the current scaling. They are traditional
+\TEX\ integer parameters that operate independent of each other. The scaling is
reflected in the dimensions of glyphs as well as in the related font dimensions,
which means that units like \type {ex} and \type {em} work as expected. If you
-query a font dimensions with \prm {fontdimen} you get the raw value but with \lpr
+query a font dimensions with \prm {fontdimen} you get the raw value but with \prm
{scaledfontdimen} you get the useable value.
\stopsubsection
-\startsubsection[title={\lpr {glyphxoffset}, \lpr {glyphyoffset}}]
+\startsubsection[title={\prm {glyphxscaled}, \prm {glyphyscaled}}]
+
+These two relate to the previous one:
+
+\startbuffer
+{\glyphxscale 1500 \the\glyphxscaled 100pt} and
+{\glyphyscale 750 \the\glyphyscaled 100pt}
+\stopbuffer
+
+\typebuffer
+
+We get: \inlinebuffer.
+
+\stopsubsection
+
+\startsubsection[title={Scaled fontdimensions}]
+
+When you use \prm {glyphscale}, \prm {glyphxscale} and|/|or \prm {glyphyscale} the font
+dimensions
+
+\starttabulate[|l|c|c|c|]
+\DB dimension \BC scale \NC xscale \NC yscale \NC\NR
+\TB
+\NC \prm {scaledemwidth} \NC \star \NC \star \NC \NC\NR
+\NC \prm {scaledexheight} \NC \star \NC \NC \star \NC\NR
+\NC \prm {scaledextraspace} \NC \star \NC \star \NC \NC\NR
+\NC \prm {scaledinterwordshrink} \NC \star \NC \star \NC \NC\NR
+\NC \prm {scaledinterwordspace} \NC \star \NC \star \NC \NC\NR
+\NC \prm {scaledinterwordstretch} \NC \star \NC \star \NC \NC\NR
+\NC \prm {scaledslantperpoint} \NC \star \NC \star \NC \NC\NR
+\LL
+\stoptabulate
+
+The next table shows the effective sized when we scale by 2000. The last two
+columns scale twice: the shared scale and the x or y scale.
+
+\def\ShowThem#1%
+ {\normalexpanded{
+ \BC \small \prm {\csstring\parametermark1}
+ \NC {\localcontrolled{\glyphscale2000 \glyphxscale1000 \glyphyscale 1000} \withoutpt\parametermark1}
+ \NC {\localcontrolled{\glyphscale1000 \glyphxscale2000 \glyphyscale 1000} \withoutpt\parametermark1}
+ \NC {\localcontrolled{\glyphscale1000 \glyphxscale1000 \glyphyscale 2000} \withoutpt\parametermark1}
+ \NC {\localcontrolled{\glyphscale2000 \glyphxscale2000 \glyphyscale 1000} \withoutpt\parametermark1}
+ \NC {\localcontrolled{\glyphscale2000 \glyphxscale1000 \glyphyscale 2000} \withoutpt\parametermark1}
+ \NC \NR}}
+
+\starttabulate[|l|c{.}|c{.}|c{.}|c{.}|c{.}|]
+ \ShowThem\scaledemwidth
+ \ShowThem\scaledexheight
+ \ShowThem\scaledextraspace
+ \ShowThem\scaledinterwordshrink
+ \ShowThem\scaledinterwordspace
+ \ShowThem\scaledinterwordstretch
+ \ShowThem\scaledslantperpoint
+\stoptabulate
+
+\startsubsection[title={\prm {fontspecdef}, \prm {fontspecid}, \prm {fontspecscale}, , \prm {fontspecxscale}, \prm {fontspecyscale}}]
+
+Because we have three scale related primitives \prm {glyphscale}, \prm
+{glyphxscale} and \prm {glyphyscale}, we also have a way to quickly set them all.
+
+\starttyping
+\fontspecdef \MyFontA 2 all 1000
+\fontspecdef \MyFontB \MyFontA xscale 1200
+\stoptyping
+
+The defined control sequence will set the font id (which is 2 in the case of
+\type {\MyFontA}) as well as the scale(s). Possible keywords are \type {scale},
+\type {xscale}, \type {yscale} and \type {all}. By default the values are 1000.
+Instead of an id an already defined specification can be given in which case we
+start from a copy. This mechanism is still somewhat experimental and might
+evolve. The main reason for introducing it is that it gives less tracing.
+
+Say that we have:
+
+\startbuffer
+\fontspecdef\MyFoo\font xscale 1200 \relax
+\stopbuffer
+
+\typebuffer \getbuffer
+
+The four properties of such a specification can then be queried as follows:
+
+\startbuffer
+[\the\fontspecid \MyFoo]
+[\the\fontspecscale \MyFoo]
+[\the\fontspecxscale\MyFoo]
+[\the\fontspecyscale\MyFoo]
+\stopbuffer
+
+\typebuffer \getbuffer
+
+A font specification obeys grouping but is not a register. Like \prm {integerdef}
+and \prm {dimendef} it is just a control sequence with a special meaning.
+
+% \the\fontspecifiedsize\font
+% \fontspecifiedname\font
+
+\stopsubsection
+
+\startsubsection[title={\prm {glyphxoffset}, \prm {glyphyoffset}}]
These two parameters control the horizontal and vertical shift of glyphs with,
when applied to a stretch of them, the horizontal offset probably being the least
@@ -482,7 +756,7 @@ useful.
\stopsubsection
-\startsubsection[title={\lpr {glyph}}]
+\startsubsection[title={\prm {glyph}}]
This command is a variation in \prm {char} that takes keywords:
@@ -517,7 +791,7 @@ Visualized:
\stopsubsection
-\startsubsection[title={\lpr{nospaces}}]
+\startsubsection[title={\prm{nospaces}}]
\topicindex {spaces+suppress}
@@ -527,7 +801,7 @@ 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.}]
+\startplacefigure[reference=fig:nospaces,title={The \prm {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}}
@@ -540,7 +814,7 @@ space.
\stopsubsection
-\startsubsection[title={\lpr{protrusionboundary}}]
+\startsubsection[title={\prm{protrusionboundary}}]
\topicindex {protrusion}
\topicindex {boundaries}
@@ -576,6 +850,18 @@ instance content moved into the margin:
\stopsubsection
+\startsubsection[title={\prm{fontcharta}}]
+
+\topicindex {glyphs + properties}
+
+The \prm {fontcharwd}, \prm {fontcharht}, \prm {fontchardp} and \prm {fontcharic}
+give access to character properties. To this repertoire \LUAMETATEX\ adds the top
+accent accessor \prm {fontcharta} which came in handy for tracing. You pass a
+font reference and character code. Normally only \OPENTYPE\ math fonts have this
+property.
+
+\stopsubsection
+
\stopsection
\startsection[title={The \LUA\ font library}][library=font]
@@ -659,7 +945,7 @@ font.current(<number> i)
\stopsubsection
-\startsubsection[title={Glyph data: \lpr {glyphdata}, \lpr {glyphscript}, \lpr {glyphstate}}]
+\startsubsection[title={Glyph data: \prm {glyphdatafield}, \prm {glyphscriptfield}, \prm {glyphstatefield}}]
These primitives can be used to set an additional glyph properties. Of course
it's very macro package dependant what is done with that. It started with just
@@ -673,6 +959,73 @@ whatever purpose their use in \CONTEXT\ is fixed.
\stopsubsection
+\startsubsection[title={Scaling math fonts with \prm {glyphtextscale} etc}]
+
+More details about fonts in math mode can be found in the chapter about math so
+here we just mention a few primitives. The internal \prm {glyphtextscale}, \prm
+{glyphscriptscale} and \prm {glyphscriptscriptscale} registers can be set to
+enforce additional scaling of math, like this:
+
+\startbuffer
+$ a = b^2 = c^{d^2}$
+$\glyphtextscale 800 a = b^2 = c^{d^2}$
+$\glyphscriptscale 800 a = b^2 = c^{d^2}$
+$\glyphscriptscriptscale 800 a = b^2 = c^{d^2}$
+\stopbuffer
+
+\typebuffer
+
+You can of course set them all in any mix as long as the value is larger than
+zero and doesn't exceed 1000. In \CONTEXT\ we use this for special purposes so
+don't mess with it there. as there can be side unexpected (but otherwise valid)
+side effects.
+
+\startlines
+\getbuffer
+\stoplines
+
+The next few reported values depend on the font setup. A math font can be loaded
+at a certain scale and further scaled on the fly. An open type math font comes with
+recommended script and scriptscript scales and gets passed to the engine scaled. The
+values reported by \prm {mathscale} are {\em additional} scales.
+
+\startbuffer
+$\the\mathscale\textfont \zerocount$
+$\the\mathscale\scriptfont \zerocount$
+$\the\mathscale\scriptscriptfont\zerocount$
+\stopbuffer
+
+\typebuffer
+
+In \CONTEXT\ we use this for some experiments (of which some made it into
+features) but discussing this fall behind this manual. You cannot set these
+values because the engine has to work with consistent settings and messing around
+with fonts during a run only works well if the backend also cooperates. Also the
+values only makes sense in the perspective of the used macro package.
+
+\stopsubsection
+
+\startsubsection[title={Tracing}]
+
+The \prm {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
+
\stopsection
\stopchapter
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
index 2339bd34201..08b7d94bc5d 100644
--- 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
@@ -1,4 +1,4 @@
-% language=uk
+% language=us runpath=texruns:manuals/luametatex
\environment luametatex-style
@@ -6,7 +6,7 @@
\startchapter[title=Introduction]
-Around 2005 we started the \LUATEX\ projects and it took about a decade to reach
+Around 2005 we started the \LUATEX\ project 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
@@ -16,20 +16,20 @@ 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.
+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 follow up on \LUATEX. Just as we have
-\CONTEXT\ \MKII\ for \PDFTEX\ and \XETEX, we have \MKIV\ for \LUATEX. For
+\CONTEXT\ \MKII\ for \PDFTEX\ and \XETEX, we have \MKIV\ for \LUATEX\ so for
\LUAMETATEX\ we have yet another version of \CONTEXT: \LMTX. By freezing \MKII,
and at some point freezing \MKIV, we can move on as we like, but we try to remain
downward compatible where possible, something that the user interface makes
@@ -42,18 +42,31 @@ ported back to \LUATEX, but only when there are good reasons for doing so and
when no compatibility issues are involved.
By now the code of these two related engines differs a lot so in retrospect it
-makes less sense to waste time on backporting anyway. 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 basic algorithms remain the same but
-code got reshuffled and because we expose internals names of variables and such
-are sometimes changed, something that is noticeable in the token and node
-interfaces. Delegating tasks 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. In \LUAMETATEX\ more got delegated, like all
-file related operations. The penalty of moving more responsibility to \LUA\ has
+makes less sense to waste time on porting back. 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 basic algorithms remain the same but code got
+reshuffled and because we expose internal names of variables and such that is
+reflected in the code base (like more granularity in nodes and token commands).
+Delegating tasks 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. In \LUAMETATEX\ more got delegated, like all file
+related operations. The penalty of moving even more responsibility to \LUA\ has
been compensated by (hopefully) harmless optimization of code in the engine and
-some more core functionality.
+some more core functionality. In the process system dependencies have been
+minimalized.
+
+One side effect of opening up is that what normally is hidden gets exposed and
+this is also true for all kind of codes that are used internally to distinguish
+states and properties of commands, tokens, nodes and more. Especially during
+development these can change but the good news is that they can be queried so on
+can write in code independent ways (in \LUATEX\ node id's are an example). That
+also means more interface related commands, so again lean and mean is not
+applicable here, especially because the detailed control over the text, math,
+font and language subsystems also results in additional commands to query their
+state. And, as the \METAPOST\ got extended, that subsystem is on the one hand
+leaner and meaner because backend code was dropped but on the other hand got a
+larger code base due to opening up the scanner and adding a feedback mechanism.
This manual started as an adaptation of the \LUATEX\ manual and therefore looks
similar. Some chapters are removed, others were added and the rest has been (and
@@ -63,18 +76,20 @@ new primitives or functions that show up in \LUAMETATEX\ might show up in
this manual as reference for \LUATEX ! As long as we're experimenting we can
change things at will but as we keep \CONTEXT\ \LMTX\ synchronized users normally
won't notice this. Often you can find examples of usage in \CONTEXT\ related
-documents and the source code so that serves a reference too.
+documents and the source code so that serves a reference too. More detailed
+explanations can be found in documents in the \CONTEXT\ distribution, if only
+because there we can present features in the perspective of useability.
For \CONTEXT\ users the \LUAMETATEX\ engine will become the default. As
mentioned, 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. Memory consumption is also less. The timeline of development is roughly:
-from 2018 upto 2020 engine development, 2019 upto 2021 the stepwise code split
-between \MKIV\ and \LMTX, while in 2020 we will (mostly) freeze \MKIV\ and \LMTX\
-will be the default.
+performance is much be better, due to some changes below the hood of the engine.
+Memory consumption is also less. The timeline of development is roughly: from
+2018 upto 2020 engine development, 2019 upto 2021 the stepwise code split between
+\MKIV\ and \LMTX, while in 2021 and 2022 we will (mostly) freeze \MKIV\ and
+\LMTX\ will be the default.
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
@@ -90,15 +105,16 @@ 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.
+In 2021|--|2022 the math engine was fundamentally overhauled. As a side effect
+some additional features were added. Not all are yet described in the manual:
+some are still experimental and it just takes time and effort to document and the
+priorities are with implementing their usage. Given the long term stability of
+math and them unlikely to be used in other macro packages there is no real urge
+anyway. It is also easier when we have examples of usage. Of course much is
+discussed in \type {ontarget.pdf} and presentations. The same is true for
+additions to \METAPOST: in due time these will be discussed in the \LUAMETAFUN\
+manual (the official \METAPOST\ manual is maintained elsewhere and should not
+discuss features that are not in the \LUATEX\ version).
\blank[big]
@@ -106,45 +122,21 @@ 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
+\starttabulate[||pl|]
+\NC \LUAMETATEX\ Banner \EQ \cldcontext{LUATEXENGINE} %
+ \cldcontext{LUATEXVERSION} / %
+ \cldcontext{LUATEXFUNCTIONALITY}
+ \NC \NR
+\NC \LUAMETATEX\ Version \EQ \currentdate \NC \NR
+\NC \CONTEXT\ Version \EQ LMTX \contextversion \NC \NR
+\NC \LUATEX\ Team \EQ Hans Hagen, Hartmut Henkel, Taco Hoekwater, Luigi Scarso \NC \NR
+\NC \LUAMETATEX\ Team \EQ Hans Hagen, Alan Braslau, Mojca Miklavec and Wolfgang Schuster, Mikael Sundqvist \NC \NR
+\NC resources and info at \EQ www.contextgarden.net\space\vl\space
+ www.pragma-ade.nl\space\vl\space
+ www.luametatex.org\space\vl\space
+ ntg-context@ntg.nl (http://www.ntg.nl/mailman/listinfo/ntg-context) \NC \NR
\stoptabulate
-\vfilll
-
-{\bf remark:} \LUAMETATEX\ development is mostly done by Hans Hagen and in
-adapting the macros to the new features Wolfgang Schuster, who knows the code
-inside||out is a instrumental. In the initial phase Alan Braslau, who love
-playing with the three languages did extensive testing and compiled for several
-platforms. Later Mojca Miklavec make sure all compiles well on the buildbot
-infrastructure. After the first release more users got involved in testing. Many
-thanks for their patience! The development also triggered upgrading of the wiki
-support infrastructure where Taco Hoekwater and Paul Mazaitis have teamed up. So,
-progress all around.
-
-{\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. However, given that in the meantime the
-code bases differs a lot, it is unlikely that much will trickle back. This is no
-real problem as there's not much demand for that anyway.
-
-{\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 2013 laptop this manual compiles at 24.5 pps with \LMTX\
-versus 20.7 pps for the \LUATEX\ manual with \MKIV). After updating some of the
-\CONTEXT\ code to use recently added features by the end of 2020 I could do more
-than 25.5 pps but don't expect spectacular bumps in performance (I need a new
-machine for that to happen). 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
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
index 77c2d93d834..83e19dcc95e 100644
--- 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
@@ -1,4 +1,4 @@
-% language=uk
+% language=us runpath=texruns:manuals/luametatex
\environment luametatex-style
@@ -98,7 +98,7 @@ 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
+The new primitive \prm {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
@@ -130,7 +130,7 @@ 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
+When a \prm {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
@@ -192,7 +192,7 @@ The start and end of a sequence of characters is signalled by a \nod {glue}, \no
{penalty}, \nod {kern} or \nod {boundary} node. But by default also a \nod
{hlist}, \nod {vlist}, \nod {rule}, \nod {dir}, \nod {whatsit}, \nod {insert}, and
\nod {adjust} node indicate a start or end. You can omit the last set from the
-test by setting flags in \lpr {hyphenationmode}:
+test by setting flags in \prm {hyphenationmode}:
\starttabulate[|c|l|]
\DB value \BC behaviour \NC \NR
@@ -316,27 +316,71 @@ a bitset made from the following values, some of which we saw in the previous
examples.
\starttabulate[|l|p|]
-\NC \number \normalhyphenationmodecode \NC honour (normal) \prm{discretionary}'s \NC \NR
-\NC \number \automatichyphenationmodecode \NC turn \type {-} into (automatic) discretionaries \NC \NR
-\NC \number \explicithyphenationmodecode \NC turn \type {\-} into (explicit) discretionaries \NC \NR
-\NC \number \syllablehyphenationmodecode \NC hyphenate (syllable) according to language \NC \NR
-\NC \number \uppercasehyphenationmodecode \NC hyphenate uppercase characters too (replaces \prm {uchyph} \NC \NR
-\NC \number \compoundhyphenationmodecode \NC permit break at an explicit hyphen (border cases) \NC \NR
-\NC \number \strictstarthyphenationmodecode \NC traditional \TEX\ compatibility wrt the start of a word \NC \NR
-\NC \number \strictendhyphenationmodecode \NC traditional \TEX\ compatibility wrt the end of a word \NC \NR
-\NC \number \automaticpenaltyhyphenationmodecode \NC use \lpr {automatichyphenpenalty} \NC \NR
-\NC \number \explicitpenaltyhyphenationmodecode \NC use \lpr {explicithyphenpenalty} \NC \NR
-\NC \number \permitgluehyphenationmodecode \NC turn glue in discretionaries into kerns \NC \NR
-\NC \number \lazyligatureshyphenationmodecode \NC controls how successive explicit discretionaries are handled in base mode \NC \NR
-\NC \number \forcecheckhyphenationmodecode \NC treat all discretionaries equal when breaking lines (in all three passes) \NC \NR
+\NC \number \normalhyphenationcode \NC honour (normal) \prm{discretionary}'s \NC \NR
+\NC \number \automatichyphenationcode \NC turn \type {-} into (automatic) discretionaries \NC \NR
+\NC \number \explicithyphenationcode \NC turn \type {\-} into (explicit) discretionaries \NC \NR
+\NC \number \syllablehyphenationcode \NC hyphenate (syllable) according to language \NC \NR
+\NC \number \uppercasehyphenationcode \NC hyphenate uppercase characters too (replaces \prm {uchyph} \NC \NR
+\NC \number \compoundhyphenationcode \NC permit break at an explicit hyphen (border cases) \NC \NR
+\NC \number \strictstarthyphenationcode \NC traditional \TEX\ compatibility wrt the start of a word \NC \NR
+\NC \number \strictendhyphenationcode \NC traditional \TEX\ compatibility wrt the end of a word \NC \NR
+\NC \number \automaticpenaltyhyphenationcode \NC use \prm {automatichyphenpenalty} \NC \NR
+\NC \number \explicitpenaltyhyphenationcode \NC use \prm {explicithyphenpenalty} \NC \NR
+\NC \number \permitgluehyphenationcode \NC turn glue in discretionaries into kerns \NC \NR
+\NC \number \permitallhyphenationcode \NC okay, let's be even more tolerant in discretionaries \NC \NR
+\NC \number \permitmathreplacehyphenationcode \NC and again we're more permissive \NC \NR
+\NC \number \lazyligatureshyphenationcode \NC controls how successive explicit discretionaries are handled in base mode \NC \NR
+\NC \number \forcecheckhyphenationcode \NC treat all discretionaries equal when breaking lines (in all three passes) \NC \NR
+\NC \number \forcehandlerhyphenationcode \NC kick in the handler (experiment) \NC \NR
+\NC \number \feedbackcompoundhyphenationcode \NC feedback compound snippets \NC \NR
\stoptabulate
+Some of these options are still experimental, simply because not all aspects and
+side effects have been explored. You can find some experimental use cases in
+\CONTEXT.
+
+\stopsection
+
+\startsection[title={Controlling hyphenation}]
+
+\startsubsection[title={\prm {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={The main control loop}]
\topicindex {main loop}
\topicindex {hyphenation}
+\topicindex {hyphenation+tracing}
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
@@ -442,11 +486,23 @@ have been added:
\explicithyphenpenalty
\stoptyping
-The usage of these penalties is controlled by the \lpr {hyphenationmode} flags
-\number\automaticpenaltyhyphenationmodecode\space and
-\number\explicitpenaltyhyphenationmodecode\space and when these are not set \prm
+The usage of these penalties is controlled by the \prm {hyphenationmode} flags
+\number\automaticpenaltyhyphenationcode\space and
+\number\explicitpenaltyhyphenationcode\space and when these are not set \prm
{exhyphenpenalty} is used.
+You can use the \prm {tracinghyphenation} variable to get a bit more information
+about what happens.
+
+\starttabulate[|lT|l|]
+\DB value \BC effect \NC\NR
+\TB
+\NC 1 \NC report redundant pattern (happens by default in \LUATEX) \NC\NR
+\NC 2 \NC report words that reach the hyphenator and got treated \NC\NR
+\NC 3 \NC show the result of a hyphenated word (a node list) \NC\NR
+\LL
+\stoptabulate
+
\stopsection
\startsection[title={Loading patterns and exceptions},reference=patternsexceptions]
@@ -526,7 +582,7 @@ actual explicit hyphen character if needed). For example, this matches the word
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
+have \prm {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
@@ -535,7 +591,7 @@ 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
+is a multiplier for \prm {exceptionpenalty}. Here we have set it to 10000 so
effectively we get 30000 in the example.
\def\ShowSample#1#2%
@@ -612,10 +668,10 @@ of the implementation:
needed.
\stopitem
\startitem
- \LUATEX\ uses the language-specific variables \lpr {prehyphenchar} and \lpr
+ \LUATEX\ uses the language-specific variables \prm {prehyphenchar} and \prm
{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
+ variables \prm {preexhyphenchar} and \prm {postexhyphenchar} for explicit
discretionaries (instead of \TEX82's empty discretionary).
\stopitem
\startitem
@@ -713,7 +769,7 @@ In so called base mode, where \TEX\ does the work, the ligature construction
\type {ff} ligatures and that one followed by an \type {i} can become a \type
{ffi} ligature. The situation can be complicated by hyphenation points between
these characters. When there are several in a ligature collapsing happens. Flag
-{\tttf "\uchexnumbers {\lazyligatureshyphenationmodecode}} in the \lpr
+{\tttf "\uchexnumbers {\lazyligatureshyphenationcode}} in the \prm
{hyphenationmode} variable determines if this happens lazy or greedy, i.e.\ the
first hyphen wins or the last one does. In practice a \CONTEXT\ user won't have
to deal with this because most fonts are processed in node mode.
@@ -750,7 +806,7 @@ ligatures are used. Of course kerning also complicates matters here.
\startsection[title={The \type {language} library}][library=lang]
-\subsection {\type {new} and \type {id}}
+\startsubsection[title={\type {new} and \type {id}}]
\topicindex {languages+library}
@@ -779,7 +835,9 @@ to the internal language with that id number.
The number returned is the internal \prm {language} id number this object refers
to.
-\subsection {\type {hyphenation}}
+\stopsubsection
+
+\startsubsection[title={\type {hyphenation}}]
\libindex {hyphenation}
@@ -793,9 +851,11 @@ language.hyphenation(<language> l, <string> n)
When no string is given (the first example) a string with all exceptions is
returned.
-\subsection {\type {clear_hyphenation} and \type {clean}}
+\stopsubsection
+
+\startsubsection[title={\type {clearhyphenation} and \type {clean}}]
-\libindex {clear_hyphenation}
+\libindex {clearhyphenation}
\libindex {clean}
This either returns the current hyphenation exceptions for this language, or adds
@@ -803,7 +863,7 @@ new ones. The syntax of the string is explained in~\in {section}
[patternsexceptions].
\startfunctioncall
-language.clear_hyphenation(<language> l)
+language.clearhyphenation(<language> l)
\stopfunctioncall
This call clears the exception dictionary (string) for this language.
@@ -818,10 +878,12 @@ 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}}
+\stopsubsection
+
+\startsubsection[title={\type {patterns} and \type {clearpatterns}}]
\libindex {patterns}
-\libindex {clear_patterns}
+\libindex {clearpatterns}
\startfunctioncall
<string> n = language.patterns(<language> l)
@@ -833,12 +895,14 @@ set. The syntax of this string is explained in \in {section}
[patternsexceptions].
\startfunctioncall
-language.clear_patterns(<language> l)
+language.clearpatterns(<language> l)
\stopfunctioncall
This can be used to clear the pattern dictionary for a language.
-\subsection {\type {hyphenationmin}}
+\stopsubsection
+
+\startsubsection[title={\type {hyphenationmin}}]
\libindex {hyphenationmin}
@@ -850,7 +914,9 @@ n = language.hyphenationmin(<language> l)
language.hyphenationmin(<language> l, <number> n)
\stopfunctioncall
-\subsection {\type {[pre|post][ex|]hyphenchar}}
+\stopsubsection
+
+\startsubsection[title={\type {[pre|post][ex|]hyphenchar}}]
\libindex {prehyphenchar}
\libindex {posthyphenchar}
@@ -881,7 +947,9 @@ 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}}
+\stopsubsection
+
+\startsubsection[title={\type {hyphenate}}]
\libindex {hyphenate}
@@ -900,7 +968,9 @@ 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}}
+\stopsubsection
+
+\startsubsection[title={\type {[set|get]hjcode}}]
\libindex {sethjcode}
\libindex {gethjcode}
@@ -915,6 +985,35 @@ language.sethjcode(<language> l, <number> char, <number> usedchar)
When you set a hjcode the current sets get initialized unless the set was already
initialized due to \prm {savinghyphcodes} being larger than zero.
+\subsection{\prm {hccode} and \type {[set|get]hccode}}
+
+A character can be set to non zero to indicate that it should be regarded as
+value visible hyphenation point. These examples show how that works (it si the
+second bit in \prm {hyphenationmode} that does the magic but we set them all
+here):
+
+\startbuffer
+{\hsize 1mm \hccode"2014 \zerocount \hyphenationmode "0000000 xxx\emdash xxx \par}
+{\hsize 1mm \hccode"2014 "2014\relax \hyphenationmode "0000000 xxx\emdash xxx \par}
+
+{\hsize 1mm \hccode"2014 \zerocount \hyphenationmode "FFFFFFF xxx\emdash xxx \par}
+{\hsize 1mm \hccode"2014 "2014\relax \hyphenationmode "FFFFFFF xxx\emdash xxx \par}
+
+{\hyphenationmode "0000000 xxx--xxx---xxx \par}
+{\hyphenationmode "FFFFFFF xxx--xxx---xxx \par}
+\stopbuffer
+
+\typebuffer
+
+Here we assign the code point because who knows what future extensions will
+bring. As with the other codes you can also set them from \LUA. The feature is
+experimental and might evolve when \CONTEXT\ users come up with reasonable
+demands.
+
+\startpacked \getbuffer \stoppacked
+
+\stopsubsection
+
\stopsection
\stopchapter
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
index 407544700f9..298a5d05414 100644
--- 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
@@ -1,4 +1,4 @@
-% language=uk
+% language=us runpath=texruns:manuals/luametatex
\environment luametatex-style
@@ -254,7 +254,7 @@ There is a bunch of functions that take a complex number:
These are accompanied by \type {libcerf} functions:
-\starttabulate[|Tw(12em)|T|T|]
+\starttabulate[|Tw(12em)|T|Tpl|]
\DB name \BC arguments \BC results \NC \NR
\TB
\NC erf \NC (a) \NC The complex error function erf(z) \NC \NR
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
index ed4b269b6fb..cf8d2dca83c 100644
--- 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
@@ -1,4 +1,4 @@
-% language=uk
+% language=us runpath=texruns:manuals/luametatex
\environment luametatex-style
@@ -8,6 +8,24 @@
\startsection[title={Initialization},reference=init]
+\startsubsection[title={A bare bone engine}]
+
+Although the \LUAMETATEX\ engine will start up when you call the program it will
+not do much useful. You can compare it to computer hardware without (high level)
+operating system with a \TEX\ kernel being the bios. It can interpret \TEX\ code
+but for typesetting you need a reasonable setup. You also need to load fonts, and
+for output you need a backend, and both can be implemented in \LUA. If you don't
+like that and want to get up and running immediately, you will be more happy with
+\LUATEX, \PDFTEX\ or \XETEX, combined with your favorite macro package.
+
+If you just want to play around you can install the \CONTEXT\ distribution which
+(including manuals and some fonts) is tiny compared to a full \TEXLIVE\
+installation and can be run alongside it without problems. If there are issues
+you can go to the usual \CONTEXT\ support platforms and seek help where you can
+find the people who made \LUATEX\ and \LUAMETATEX.
+
+\stopsubsection
+
\startsubsection[title={\LUAMETATEX\ as a \LUA\ interpreter}]
\topicindex {initialization}
@@ -15,17 +33,13 @@
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
+like a standalone \LUA\ interpreter. The first method uses the command line
+option \type {--luaonly} followed by a filename. The second is more automatic: if
+the only non|-|option argument (file) on the commandline has the extension \type
+{lmt} or \type {lua}. The \type {luc} extension has been dropped because bytecode
+compiled files are not portable and one can always load indirect. The \type {lmt}
+suffix is more \CONTEXT\ specific and makes it possible to have files for
+\LUATEX\ and \LUAMETATEX\ alongside.
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
@@ -39,8 +53,10 @@ possible below the 3MB which is okay for a script engine.
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
+type {luametatex} will run the \type {mtxrun.lmt} or \type {mtxrun.lua} script
+when present in the same path as the binary itself. As mentioned before first
+checking for (\CONTEXT) \type {lmt} files permits different files for different
+engines in the same path.
\stopsubsection
@@ -67,8 +83,9 @@ are understood by \LUAMETATEX\ itself:
\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.
+\LUA\ anyway. So for instance there are no options to enter a safer mode or
+control executing programs because this can easily be achieved with a startup
+\LUA\ script.
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
@@ -77,7 +94,7 @@ 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.
+with \TEX\ are initialized rather soon so you have these available.
\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
@@ -172,8 +189,8 @@ cast from string to number and vise versa as this can change in future versions.
\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:
+do that, because it makes documents non|-|portable. While \LUAMETATEX\ is running
+if forces the following locale settings:
\starttyping
LC_CTYPE=C
@@ -207,11 +224,52 @@ 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.
+related \LUA\ code. The \type {luafilesystem} module has been replaced by a more
+efficient one that also deals with the \MSWINDOWS\ file and environment
+properties better (\UNICODE\ support in \MSWINDOWS\ dates from before \UTF8
+became dominant so we need to deal with wide \UNICODE16).
+
There are more extensive math libraries and there are libraries that deal with
-encryption and compression. At some point some of these might become so called
-optional libraries (read: the handful that we provide interfaces for but that get
-loaded on demand).
+encryption and compression. There are also some optional libraries that we do
+interface but that are loaded on demand. The interfaces are as minimal as can be
+because we so much in \LUA, which also means that one can tune behaviour to
+usage better.
+
+\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. Keep in mind that as side effect of
+delegating \IO\ to \LUA\ the \tex {openin} primitive is not provided by the
+engine and has to be implemented by the macro package. This also means that the
+limit on the number of open files is not enforced by the engine.
+
+\stopsubsection
+
+\startsubsection[title={Writing to file}]
+
+\topicindex {files+writing}
+
+Writing to a file in \TEX\ has two forms: delayed and immediate. Delayed writing
+means that the to be written text is anchored in the node list and flushed by the
+backend. As all \IO\ is delegated to \LUA, this also means that it has to deal
+with distinction. In \LUATEX\ the number of open files was already bumped to 127,
+but in \LUAMETATEX\ it depends on the macro package. The special meaning of
+channel 18 was already dropped in \LUATEX\ because we have \type {os.execute}.
+
+\stopsubsection
\stopsection
@@ -230,6 +288,243 @@ output file for instance.
\stopsection
+\startsection[reference=internals,title={The internals}]
+
+\topicindex{nodes}
+\topicindex{boxes}
+\topicindex{\LUA}
+
+This is a reference manual and not a tutorial. This means that we discuss changes
+relative to traditional \TEX\ and also present new (or extended) 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 \prm {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 like this, where a \type
+{par} node stores some metadata and is followed by a \type {hlist} flagged as
+indent box:
+
+\starttyping
+[par] <=> [hlist] <=> H <=> i <=> [glue] <=> T <=> h <=> e <=> r <=> e ...
+\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 and nodes can have many properties but that will
+be discussed later. Each node points back to a previous node or next node, given
+that these exist. Sometimes multiple characters are represented by one glyph
+(shape), so one can also get:
+
+\starttyping
+[par] <=> [hlist] <=> H <=> i <=> [glue] <=> Th <=> e <=> r <=> e ...
+\stoptyping
+
+And maybe some characters get positioned relative to each other, so we might
+see:
+
+\starttyping
+[par] <=> [hlist] <=> H <=> [kern] <=> i <=> [glue] <=> Th <=> e <=> r <=> e ...
+\stoptyping
+
+Actually, the above representation is one view, because in \LUAMETATEX\ we can
+choose for this:
+
+\starttyping
+[par] <=> [glue] <=> H <=> [kern] <=> i <=> [glue] <=> Th <=> e <=> r <=> e ...
+\stoptyping
+
+where glue (currently fixed) is used instead of an empty hlist (think of a \type
+{\hbox}). Options like this are available because want a certain view on these
+lists from the \LUA\ end and the result being predicable is part of that.
+
+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.
+
+\starttyping
+\setbox\scratchbox\vbox\bgroup
+ line 1\par line 2
+\egroup
+
+\showbox\scratchbox
+\stoptyping
+
+The above code produces the next log lines that reveal how the engines sees a
+paragraph (wrapped in a \type {\vbox}):
+
+\starttyping[style=small]
+1:4: > \box257=
+1:4: \vbox[normal][16=1,17=1,47=1], width 483.69687, height 27.58083, depth 0.1416, direction l2r
+1:4: .\list
+1:4: ..\hbox[line][16=1,17=1,47=1], width 483.69687, height 7.59766, depth 0.1416, glue 455.40097fil, direction l2r
+1:4: ...\list
+1:4: ....\glue[left hang][16=1,17=1,47=1] 0.0pt
+1:4: ....\glue[left][16=1,17=1,47=1] 0.0pt
+1:4: ....\glue[parfillleft][16=1,17=1,47=1] 0.0pt
+1:4: ....\par[newgraf][16=1,17=1,47=1], hangafter 1, hsize 483.69687, pretolerance 100, tolerance 3000, adjdemerits 10000, linepenalty 10, doublehyphendemerits 10000, finalhyphendemerits 5000, clubpenalty 2000, widowpenalty 2000, brokenpenalty 100, emergencystretch 12.0, parfillskip 0.0pt plus 1.0fil, hyphenationmode 499519
+1:4: ....\glue[indent][16=1,17=1,47=1] 0.0pt
+1:4: ....\glyph[32768][16=1,17=1,47=1], language (n=1,l=2,r=3), hyphenationmode 499519, options 128 , font <30: DejaVuSerif @ 10.0pt>, glyph U+00006C l
+1:4: ....\glyph[32768][16=1,17=1,47=1], language (n=1,l=2,r=3), hyphenationmode 499519, options 128 , font <30: DejaVuSerif @ 10.0pt>, glyph U+000069 i
+1:4: ....\glyph[32768][16=1,17=1,47=1], language (n=1,l=2,r=3), hyphenationmode 499519, options 128 , font <30: DejaVuSerif @ 10.0pt>, glyph U+00006E n
+1:4: ....\glyph[32768][16=1,17=1,47=1], language (n=1,l=2,r=3), hyphenationmode 499519, options 128 , font <30: DejaVuSerif @ 10.0pt>, glyph U+000065 e
+1:4: ....\glue[space][16=1,17=1,47=1] 3.17871pt plus 1.58936pt minus 1.05957pt, font 30
+1:4: ....\glyph[32768][16=1,17=1,47=1], language (n=1,l=2,r=3), hyphenationmode 499519, options 128 , font <30: DejaVuSerif @ 10.0pt>, glyph U+000031 1
+1:4: ....\penalty[line][16=1,17=1,47=1] 10000
+1:4: ....\glue[parfill][16=1,17=1,47=1] 0.0pt plus 1.0fil
+1:4: ....\glue[right][16=1,17=1,47=1] 0.0pt
+1:4: ....\glue[right hang][16=1,17=1,47=1] 0.0pt
+1:4: ..\glue[par][16=1,17=1,47=1] 5.44995pt plus 1.81665pt minus 1.81665pt
+1:4: ..\glue[baseline][16=1,17=1,47=1] 6.79396pt
+1:4: ..\hbox[line][16=1,17=1,47=1], width 483.69687, height 7.59766, depth 0.1416, glue 455.40097fil, direction l2r
+1:4: ...\list
+1:4: ....\glue[left hang][16=1,17=1,47=1] 0.0pt
+1:4: ....\glue[left][16=1,17=1,47=1] 0.0pt
+1:4: ....\glue[parfillleft][16=1,17=1,47=1] 0.0pt
+1:4: ....\par[newgraf][16=1,17=1,47=1], hangafter 1, hsize 483.69687, pretolerance 100, tolerance 3000, adjdemerits 10000, linepenalty 10, doublehyphendemerits 10000, finalhyphendemerits 5000, clubpenalty 2000, widowpenalty 2000, brokenpenalty 100, emergencystretch 12.0, parfillskip 0.0pt plus 1.0fil, hyphenationmode 499519
+1:4: ....\glue[indent][16=1,17=1,47=1] 0.0pt
+1:4: ....\glyph[32768][16=1,17=1,47=1], language (n=1,l=2,r=3), hyphenationmode 499519, options 128 , font <30: DejaVuSerif @ 10.0pt>, glyph U+00006C l
+1:4: ....\glyph[32768][16=1,17=1,47=1], language (n=1,l=2,r=3), hyphenationmode 499519, options 128 , font <30: DejaVuSerif @ 10.0pt>, glyph U+000069 i
+1:4: ....\glyph[32768][16=1,17=1,47=1], language (n=1,l=2,r=3), hyphenationmode 499519, options 128 , font <30: DejaVuSerif @ 10.0pt>, glyph U+00006E n
+1:4: ....\glyph[32768][16=1,17=1,47=1], language (n=1,l=2,r=3), hyphenationmode 499519, options 128 , font <30: DejaVuSerif @ 10.0pt>, glyph U+000065 e
+1:4: ....\glue[space][16=1,17=1,47=1] 3.17871pt plus 1.58936pt minus 1.05957pt, font 30
+1:4: ....\glyph[32768][16=1,17=1,47=1], language (n=1,l=2,r=3), hyphenationmode 499519, options 128 , font <30: DejaVuSerif @ 10.0pt>, glyph U+000032 2
+1:4: ....\penalty[line][16=1,17=1,47=1] 10000
+1:4: ....\glue[parfill][16=1,17=1,47=1] 0.0pt plus 1.0fil
+1:4: ....\glue[right][16=1,17=1,47=1] 0.0pt
+1:4: ....\glue[right hang][16=1,17=1,47=1] 0.0pt
+\stoptyping
+
+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.
+Adding more callbacks makes no sense, also because at some point the performance
+hit gets too large. There are plenty of ways to achieve goals. For that reason:
+take remarks about \LUATEX, features, potential, performance etc.\ with a natural
+grain of salt.
+
+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 support, 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
+what commands relate to them. 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
+
+Whatever we feed into \TEX\ at some point becomes a token which is either
+interpreted directly or stored in a linked list. A token is just a number that
+encodes a specific command (operator) and some value (operand) that further
+specifies what that command is supposed to do. In addition to an interface to
+nodes, there is an interface to tokens, as later chapters will demonstrate.
+
+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 pack(ag)ing it can mean two things. When \TEX\ has consumed
+some tokens that represent text they are added to the current list. When the text
+is put into a so called \prm {hbox} (for instance a line in a paragraph) it
+(normally) first gets hyphenated, next ligatures are build, and finally kerns are
+added. Each of these 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 information is stored in a leading \type {par} node. Then indentation
+is appended and the paragraph ends with some glue. 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.
+
+\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
index 02f5f8c71da..61ec42ec36e 100644
--- 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
@@ -1,4 +1,4 @@
-% language=uk
+% language=us runpath=texruns:manuals/luametatex
\environment luametatex-style
@@ -10,16 +10,269 @@
\topicindex {math}
+Because we started from \LUATEX, by the end of 2021 this chapter started with
+this, even if we already reworked the engine:
+
+\startquotation
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
+respect to math. \footnote {This might no longer be true because we have more
+control options that define default behavior and also have a more extensive
+scaling model. Anyway, it should not look worse, and maybe even a bit better.}
+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.
+You might be surprised that we don't use all these new control features in
+\CONTEXT\ \LMTX\ but who knows what might happen because users drive it. The main
+reason for adding so much is that I decided it made more sense to be complete now
+than gradually add more and more. At some point we should be able to say \quote
+{This is it}. Also, when looking at these features, you need to keep in mind that
+when it comes to math, \LATEX\ is the dominant macro package and it never needed
+these engine features, so most are probably just here for exploration purposes.
+\stopquotation
+
+Although we still process math as \TEX\ does, there have been some fundamental
+changes to the machinery. Most of that is discussed in documents that come with
+\CONTEXT\ and in Mikael Sundqvist math manual. Together we explored some new ways
+to deal with math spacing, penalties, fencing, operators, fractions, atoms and
+other features of the \TEX\ engine. We started from the way \CONTEXT\ used the
+already present functionality combine with sometimes somewhat dirty (but on the
+average working well) tricks.
+
+It will take a while before this chapter is updated. If you find errors or things
+missing, let me know. A lot of pairwise spacing primitives were dropped but also
+quite a bit of new ones introduced to control matters. Much in \LUAMETATEX\ math
+handling is about micro|-|typography and for us the results are quite visible.
+But, as far as we know, there have never been complaints or demands in the
+direction of the features discussed here. Also, \TEX\ math usage outside
+\CONTEXT\ is rather chiselled in stone (already for nearly three decades) so we
+don't expect other macro packages to use the new features anyway.
+
+\stopsection
+
+\startsection[title=Intermezzo]
+
+It is important to understand a bit how \TEX\ handles math. The math engine
+is a large subsystem and basically can be divided in two parts: convert
+sequential input into a list of nodes where math related ones actually are
+sort of intermediate and therefore called noads.
+
+In text mode entering \type {abc} results in three glyph nodes and \type {a b
+c} in three glyph nodes separated by (spacing) glue. Successive glyphs can be
+transformed in the font engine later on, just as hyphenation directive can
+be added. Eventually one (normally) gets a mix of glyphs, font kerns from
+a sequence of glyphs
+
+In math mode \type {abc} results in three simple ordinary noads and \type {a
+b c} is equivalent to that: three noads. But \type {a bc} results in two
+ordinary noads where the second one has a sublist of two ordinary noads.
+Because characters have class properties, \type {( a + b = c )} results in a
+simple open noad, a simple ordinary, a simple binary, a simple ordinary, a
+simple relation, a simple ordinary and simple close noad. The next samples show a
+bit of this; in order to see th effects spacing between ordinary atoms set
+to \type {9mu}.
+
+\startbuffer
+\typebuffer[sample]
+% \tracingmath1\tracingonline1
+\startlinecorrection
+\setmathspacing\mathordinarycode\mathordinarycode\allmathstyles9mu
+\mathgroupingmode\zerocount
+\scale[scale=2000]{\showmakeup[mathglue]\showboxes\mathspacingmode\plusone\getbuffer[sample]}
+\stoplinecorrection
+\blank[2*line]
+\stopbuffer
+
+\startbuffer[sample]
+$a b c$ \quad $a bc$ \quad $abc$
+\stopbuffer
+
+\getbuffer
+
+With \type {\tracingmath 1} we get this logged:
+
+\starttyping
+> \inlinemath=
+\noad[ord][...]
+.\nucleus
+..\mathchar[ord][...], family "0, character "61
+\noad[ord][...]
+.\nucleus
+..\mathchar[ord][...], family "0, character "62
+\noad[ord][...]
+.\nucleus
+..\mathchar[ord][...], family "0, character "63
+
+> \inlinemath=
+\noad[ord][...]
+.\nucleus
+..\mathchar[ord][...], family "0, character "61
+\noad[ord][...]
+.\nucleus
+..\mathchar[ord][...], family "0, character "62
+\noad[ord][...]
+.\nucleus
+..\mathchar[ord][...], family "0, character "63
+
+> \inlinemath=
+\noad[ord][...]
+.\nucleus
+..\mathchar[ord][...], family "0, character "61
+\noad[ord][...]
+.\nucleus
+..\mathchar[ord][...], family "0, character "62
+\noad[ord][...]
+.\nucleus
+..\mathchar[ord][...], family "0, character "63
+\stoptyping
+
+\startbuffer[sample]
+${a} {b} {c}$ \quad ${a} {bc}$ \quad ${abc}$
+\stopbuffer
+
+\getbuffer
+
+If the previous log surprises you, that might be because in \CONTEXT\ we set up the
+engine differently: curly braces don't create ordinary atoms. However, when we
+set \type {\mathgroupingmode 0} we return to what the engine normally does.
+
+\starttyping
+> \inlinemath=
+\noad[ord][...]
+.\nucleus
+..\mathchar[ord][...], family "0, character "61
+\noad[ord][...]
+.\nucleus
+..\mathchar[ord][...], family "0, character "62
+\noad[ord][...]
+.\nucleus
+..\mathchar[ord][...], family "0, character "63
+
+> \inlinemath=
+\noad[ord][...]
+.\nucleus
+..\mathchar[ord][...], family "0, character "61
+\noad[ord][...]
+.\nucleus
+..\submlist[0][...][tracing depth 5 reached]
+
+> \inlinemath=
+\noad[ord][...]
+.\nucleus
+..\submlist[0][...][tracing depth 5 reached]
+\stoptyping
+
+From the first example you can imagine what these sub lists look like: a list of
+ordinary atoms. The final list that is mix of nodes and yet unprocessed noads get
+fed into the math|-|to|-|hlist function and eventually the noads become glyphs,
+boxes, kerns, glue and whatever makes sense. A lot goes on there: think scripts,
+fractions, fences, accents, radicals, spacing, break control.
+
+An example of more tricky scanning is shown here:
+
+\starttyping
+a + 1 \over 2 + b
+a + {1}\over{2} + b
+a + {{1}\over{2}} + b
+\stoptyping
+
+In this case the \type {\over} makes \TEX\ reconsider the last noad, remove if
+from the current list and save it for later, then scan for a following atom a
+single character turned atom or a braced sequence that then is an ordinary noad.
+In the end a fraction noad is made. When that gets processed later specific
+numerator and denominator styles get applied (explicitly entered style nodes of
+course overload this for the content). The fact that this construct is all about
+(implicit) ordinary noads, themselves captured in noads, combined with the wish
+for enforced consistent positioning of numerator and denominator, plus style
+overload, color support and whatever comes to mind means that in practice one
+will use a \type {\frac} macro that provides all that control. \footnote {There
+are now a \prm {Uover} primitives that look ahead and then of course still
+treat curly braces as math lists to be picked up.}
+
+A similar tricky case is this:
+
+\starttyping
+ ( a + ( b - c ) + d )
+\left ( a + \left ( b - c \right ) + d \right )
+\stoptyping
+
+Here the first line creates a list of noads but the second line create a fenced
+structure that is handled as a whole in order to make the fences match. \footnote
+{Actually instead of such a structure there could have been delimiters with
+backlinks but one never knows what happens with these links when processing
+passes are made so that fragility is avoided.} A fence noad will not break across
+lines as it is boxed and that is the reason why macro packages have these \type
+{\bigg} macros: they explicitly force a size using some trickery. In \LUAMETATEX\
+a fence object can actually be unpacked when the class is configured as such. It
+is one of the many extensions we have.
+
+There are some peculiar cases that one can run into but that actually are
+mentioned in the \TEX\ book. Often these reasons for intentional side effects
+become clear when one thinks of the average usage but unless one is willing to
+spend time on the \quote {fine points of math} they can also interfere with
+intentions. The next bits of code are just for the reader to look at. Try to
+predict the outcome. Watch out: in \LMTX\ the outcome is not what one gets by
+default in \LUATEX, \PDFTEX\ or regular \TEX. \footnote {One can set \typ
+{\mathgroupingmode = 0} to get close.}
+
+\starttyping
+$ 1 {\red +} 2$\par
+$ 1 \color[red]{+} 2$\par
+$ 1 \mathbin{\red +} 2$\par
+$ a + - b + {- b} $
+$ a \pm - b - {+ b} $
+$ - b $
+$ {- b} $
+\stoptyping
+
+The message here is that when a user is coding the mindset with respect to
+grouping using curly braces has to be switched to math mode too. And how many
+users really read the relevant chapters of the \TEX\ book a couple of times (as
+much makes only sense after playing with math in \TEX)? Even if one doesn't grasp
+everything it's a worthwhile read. Also consider this: did you really ask for an
+ordinary atom when you uses curly braces where no lists were expected? And what
+would have happened when ordinary related spacing had been set to non|-|zero?
+
+All the above (and plenty more) is why in \CONTEXT\ \LMTX\ we make extensive use
+of some \LUAMETATEX\ features, like: additional atom classes, configurable inter
+atom spacing and penalties, pairwise atom rules that can change classes, class
+based rendering options, more font parameters, configurable style instead of hard
+coded ones in constructs, more granular spacing, etc. That way we get quite
+predictable results but also drop some older (un)expected behavior and side
+effects. It is also why we cannot show many examples in the \LUAMETATEX\ manual:
+it uses \CONTEXT\ and we see no reason to complicate out lives (and spend energy
+on) turning off all the nicely cooperating features (and then for sure forgetting
+one) just for the sake of demos. It also gave us the opportunity to improve
+existing mechanisms and|/|or at least simplify their sometimes complex code.
+
+One last word here about sequences of ordinary atoms: the traditional code path
+feeds ordinary atoms into a ligature and kerning routine and does that when it
+encounters one. However, in \OPENTYPE\ we don't have ligatures not (single) kerns
+so there that doesn't apply. As we're not aware of traditional math fonts with
+ligatures and no one is likely to use these fonts with \LUAMETATEX\ the ligature
+code has been disabled. \footnote {It might show up in a different way if we feel
+the need in which case it's more related to runtime patches to fonts and class
+bases ligature building.} The kerning has been redone a bit so that it permits us
+to fine tune spacing (which in \CONTEXT\ we control with goodie files). The
+mentioned routine can also add italic correction, but that happens selectively
+because it is driven by specifications and circumstances. It is one of the places
+where the approach differs from the original, if only for practical reasons.
+
+\stopsection
+
+\startsection[title={Grouping with \prm {beginmathgroup} and \prm {endmathgroup}}]
+
+These two primitives behave like \prm {begingroup} and \prm {endgroup} but
+restore a style change inside the group. Style changes are actually injecting s
+special style noad which makes them sort of persistent till the next explicit
+change which can be confusing. This additional grouping model compensates for
+that.
+
\stopsection
\startsection[title={Unicode math characters}]
@@ -27,18 +280,19 @@ to the engine.
\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.
+For various reasons we need to encode a math character in a 32 bit number and
+because we often also need to keep track of families and classes the range of
+characters is limited to 20 bits. There are upto 64 classes (which is a lot more
+than in \LUATEX) and 64 families (less than in \LUATEX). The upper limit of
+characters is less that what \UNICODE\ offers but for math we're okay. If needed
+we can provide less families.
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:
+two now allow for the larger character codes argument on the left hand side of
+the equals sign. The number variants of some primitives might be dropped in favor
+of the primitives that read more than one separate value (class, family and
+code), for instance:
\starttyping
\def\overbrace{\Umathaccent 0 1 "23DE }
@@ -67,84 +321,330 @@ The unaltered ones are:
\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:
+% In \LUATEX\ we support the single number primitives *with \type {num} in their
+% name) conforming the \XETEX\ method. For the moment that still works but you need
+% to figure out the number yourself. The split number variants are more future safe
+% with respect to classes and families. We don't document \prm {Umathcharnumdef},
+% \prm {Umathcharnum}, \prm {Umathcodenum} and \prm {Udelcodenum} here any longer.
-% somewhat fuzzy:
+In \LUATEX\ we support the single number primitives *with \type {num} in their
+name) conforming the \XETEX\ method. These primitives have been dropped in
+\LUAMETATEX\ because we use different ranges and properties, so these numbers
+have no (stable) meaning.
-\starttabulate[|l|l|r|c|l|r|]
-\DB primitive \BC min \BC max \BC \kern 2em \BC min \BC max \NC \NR
+\starttabulate[|l|l|c|c|c|]
+\DB primitive \BC \BC class \BC family \BC character \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
+\NC \prm {Umathchardef} \NC csname \NC "40 \NC "40 \NC "FFFFF \NC \NR
+\NC \prm {Umathcode} \NC \NC "40 \NC "40 \NC "FFFFF \NC \NR
+\NC \prm {Udelcode} \NC "FFFFF \NC "40 \NC "40 \NC "FFFFF \NC \NR
+\NC \prm {Umathchar} \NC \NC "40 \NC "40 \NC "FFFFF \NC \NR
+\NC \prm {Umathaccent} \NC \NC "40 \NC "40 \NC "FFFFF \NC \NR
+\NC \prm {Udelimiter} \NC \NC "40 \NC "40 \NC "FFFFF \NC \NR
+\NC \prm {Uradical} \NC \NC "40 \NC "40 \NC "FFFFF \NC \NR
\LL
\stoptabulate
-Specifications typically look like:
+So, there are upto 64 classes of which at this moment about 20 are predefined so,
+taking some future usage by the engine into account,you can assume 32 upto 60 to
+be available for any purpose. The number of families has been reduced from 256 to
+64 which is plenty for daily use in an \OPENTYPE\ setup. If we ever need to
+expand the \UNICODE\ range there will be less families or we just go for a larger
+internal record. The values of begin and end classes and the number of classes
+can be fetched from the \LUA\ status table.
+
+Given the above, specifications typically look like:
\starttyping
-\Umathchardef\xx="1"0"456
-\Umathcode 123="1"0"789
+\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.
+to be dealt with by the font via the \prm {Umathoperatorsize} parameter. Old
+school fonts can still be handled but you need to set up the engine to do that;
+this can be done per font. In principle we assume that \OPENTYPE\ fonts are used,
+which is no big deal because loading fonts is already under \LUA\ control. At
+that moment the distinction between small and large delimiters will be gone. Of
+course an alternative is to support a specific large size but that is unlikely to
+happen.
+
+This means that future versions of \LUAMETATEX\ might drop for instance the large
+family in delimiters, if only because we assume a coherent setup where
+extensibles come from the same font so that we don't need to worry about clashing
+font parameters. This is a condition that we can easily meet in \CONTEXT, which is
+the reference for \LUAMETATEX.
+
+% Constructor related primitives like \prm {Umathaccent} accepts optional keywords
+% to control various details regarding their treatment and rendering. See for
+% instance \in {section} [mathacc] for details. Some keywords are specific, but
+% some are shared between the math nodes (aka noads).
+
+There are more new primitives and most of these will be explained in following
+sections. For instance these are variants of radicals and delimiters all are
+set the same:
+
+\starttabulate[|l|c|c|c|]
+\DB primitive \BC class \BC family \NC character \NC \NR
+\TB
+\NC \prm {Uroot} \NC "40 \NC "40 \NC "FFFFF \NC \NR
+\NC \prm {Uoverdelimiter} \NC "40 \NC "40 \NC "FFFFF \NC \NR
+\NC \prm {Uunderdelimiter} \NC "40 \NC "40 \NC "FFFFF \NC \NR
+\NC \prm {Udelimiterover} \NC "40 \NC "40 \NC "FFFFF \NC \NR
+\NC \prm {Udelimiterunder} \NC "40 \NC "40 \NC "FFFFF \NC \NR
+\LL
+\stoptabulate
-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.
+In addition there are \prm {Uvextensible} and \prm {Uoperator} and extended
+versions of fenced: \prm {Uleft}, \prm {Uright} and \prm {Umiddle}. There is also
+\prm {Uover} and similar primitives that expect the numerator and denominator
+after the primitive. In addition to regular scripts there are prescripts and a
+dedicated prime script. Many of these \type {U} primitives can be controlled by
+options and keywords.
-The \lpr {Umathaccent} command accepts optional keywords to control various
-details regarding math accents. See \in {section} [mathacc] below for details.
+\stopsection
-There are more new primitives and all of these will be explained in following
-sections:
+\startsection[title=Setting up the engine]
-\starttabulate[|l|l|]
-\DB primitive \BC value range (in hex) \NC \NR
+\startsubsection[title={Control}]
+
+\topicindex{math+control}
+
+Rendering math has long been dominated by \TEX\ but that changed when \MICROSOFT\
+came with \OPENTYPE\ math: an implementation as well as a font. Some of that was
+modelled after \TEX\ and some was dictated (we think) by the way word processors
+deal with math. For instance, traditional \TEX\ math has a limited set of glyph
+properties and therefore has a somewhat complex interplay between width and
+italic correction. There are no kerns, contrary to \OPENTYPE\ math fonts that
+provides staircase kerns. Interestingly \TEX\ does have some ligature building
+going on in the engine.
+
+In traditional \TEX\ italic correction gets added to the width and selectively
+removed later (or compensated by some shift and|/|or cheating with the box
+width). When we started with \LUATEX\ we had to gamble quite a bit about how to
+apply parameters and glyph properties which resulted in different code paths,
+heuristics, etc. That worked on the average but fonts are often not perfect and
+when served as an example for another one the bad bits can be inherited. That
+said, over time the descriptions improved and this is what the \OPENTYPE\
+specification has to say about italic correction now \footnote {\type
+{https://docs.microsoft.com/en-us/typography/opentype/spec/math}}:
+
+\startitemize [n]
+ \startitem
+ When a run of slanted characters is followed by a straight character
+ (such as an operator or a delimiter), the italics correction of the last
+ glyph is added to its advance width.
+ \stopitem
+ \startitem
+ When positioning limits on an N-ary operator (e.g., integral sign), the
+ horizontal position of the upper limit is moved to the right by half the
+ italics correction, while the position of the lower limit is moved to the
+ left by the same distance.
+ \stopitem
+ \startitem
+ When positioning superscripts and subscripts, their default horizontal
+ positions are also different by the amount of the italics correction of
+ the preceding glyph.
+ \stopitem
+\stopitemize
+
+The first rule is complicated by the fact that \quote {followed} is vague: in
+\TEX\ the sequence \type {$ a b c def $} results in six separate atoms, separated
+by inter atom spacing. The characters in these atoms are the nucleus and there
+can be a super- and|/|or subscript attached and in \LUAMETATEX\ also a prime,
+superprescript and/or subprescript.
+
+The second rule comes from \TEX\ and one can wonder why the available top accent
+anchor is not used. Maybe because bottom accent anchors are missing? Anyway,
+we're stuck with this now.
+
+The third rule also seems to come from \TEX. Take the \quote {\it f} character:
+in \TEX\ fonts that one has a narrow width and part sticks out (in some even at
+the left edge). That means that when the subscript gets attached it will move
+inwards relative to the real dimensions. Before the superscript an italic
+correction is added so what that correction is non|-|zero the scripts are
+horizontally shifted relative to each other.
+
+Now look at this specification of staircase kerns \footnote {Idem.}:
+
+\startnarrower
+ The \type {MathKernInfo} table provides mathematical kerning values used for
+ kerning of subscript and superscript glyphs relative to a base glyph. Its
+ purpose is to improve spacing in situations such as omega with superscript f
+ or capital V with subscript capital A.
+
+ Mathematical kerning is height dependent; that is, different kerning amounts
+ can be specified for different heights within a glyph’s vertical extent. For
+ any given glyph, different values can be specified for four corner positions,
+ top|-|right, to|-|left, etc., allowing for different kerning adjustments
+ according to whether the glyph occurs as a subscript, a superscript, a base
+ being kerned with a subscript, or a base being kerned with a superscript.
+\stopnarrower
+
+Again we're talking super- and subscripts and should we now look at the italic
+correction or assume that the kerns do the job? This is a mixed bag because
+scripts are not always (single) characters. We have to guess a bit here. After
+years of experimenting we came to the conclusion that it will never be okay so
+that's why we settled on controls and runtime fixes to fonts.
+
+This means that processing math is controlled by \prm {mathfontcontrol}, a
+numeric bitset parameter. The recommended bits are marked with a star but it
+really depends on the macro package to set up the machinery well. Of course one
+can just enable all and see what happens. \footnote {This model was more granular
+and could even be font (and character) specific but that was dropped because
+fonts are too inconsistent and an occasional fit is more robust that a generally
+applied rule.}
+
+\starttabulate[|l|l|c|]
+\DB bit \BC name \NC \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
+\NC \type {0x000001} \NC \type {usefontcontrol} \NC \NR
+\NC \type {0x000002} \NC \type {overrule} \NC \star \NR
+\NC \type {0x000004} \NC \type {underrule} \NC \star \NR
+\NC \type {0x000008} \NC \type {radicalrule} \NC \star \NR
+\NC \type {0x000010} \NC \type {fractionrule} \NC \star \NR
+\NC \type {0x000020} \NC \type {accentskewhalf} \NC \star \NR
+\NC \type {0x000040} \NC \type {accentskewapply} \NC \star \NR
+\NC \type {0x000080} \NC \type {applyordinarykernpair} \NC \star \NR
+\NC \type {0x000100} \NC \type {applyverticalitalickern} \NC \star \NR
+\NC \type {0x000200} \NC \type {applyordinaryitalickern} \NC \star \NR
+\NC \type {0x000400} \NC \type {applycharitalickern} \NC \NR
+\NC \type {0x000800} \NC \type {reboxcharitalickern} \NC \NR
+\NC \type {0x001000} \NC \type {applyboxeditalickern} \NC \star \NR
+\NC \type {0x002000} \NC \type {staircasekern} \NC \star \NR
+\NC \type {0x004000} \NC \type {applytextitalickern} \NC \star \NR
+\NC \type {0x008000} \NC \type {checktextitalickern} \NC \star \NR
+\NC \type {0x010000} \NC \type {checkspaceitalickern} \NC \NR
+\NC \type {0x020000} \NC \type {applyscriptitalickern} \NC \star \NR
+\NC \type {0x040000} \NC \type {analysescriptnucleuschar} \NC \star \NR
+\NC \type {0x080000} \NC \type {analysescriptnucleuslist} \NC \star \NR
+\NC \type {0x100000} \NC \type {analysescriptnucleusbox} \NC \star \NR
\LL
\stoptabulate
+So, to summarize: the reason for this approach is that traditional and \OPENTYPE\
+fonts have different approaches (especially when it comes to dealing with the
+width and italic corrections) and is even more complicated by the fact that the
+fonts are often inconsistent (within and between). In \CONTEXT\ we deal with this
+by runtime fixes to fonts. In any case the Cambria font is taken as reference.
+
+\stopsubsection
+
+\startsubsection[title={Analyzing the script nucleus}]
+
+\topicindex {math+kerning}
+\topicindex {math+scripts}
+
+The three analyze option relate to staircase kerns for which we need to look into the
+nucleus to get to the first character. In principle we only need to look into simple
+characters and lists but we can also look into boxes.There can be interference with
+other kinds spacing as well as italic corrections, which is why it is an option. These three
+are not bound to fonts because we don't know if have a font involved.
+
+% We keep the next text commented for historic reasons. In \CONTEXT\ we clean up
+% fonts in the font goodie files so the examples would not be honest anyway. But it
+% shows a bit where we come from and what alternatives we tried.
+
+% 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 an \prm {hbox} we have some control over this.
+% And, as a bonus we also added control over the normal sublist kerning. The \prm
+% {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 {3} \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 \prm {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
+
+\stopsubsection
+
\stopsection
\startsection[title={Math styles}]
-\subsection{\lpr {mathstyle}}
+\startsubsection[title={\prm {mathstyle}, \prm {mathstackstyle} and \prm {Ustyle}}]
\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
+possible, \LUATEX\ adds the new primitive: \prm {mathstyle}. This is a \quote
{convert command} like e.g. \prm {romannumeral}: its value can only be read,
not set. Beware that contrary to \LUATEX\ this is now a proper number so you need
-to use \type {\number} o r\type {\the} in order to serialize it.
+to use \type {\number} or \type {\the} in order to serialize it.
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
@@ -171,7 +671,7 @@ 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}
+some automatic styles are not yet known also means that the \prm {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
@@ -244,30 +744,98 @@ 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
+This might look wrong but it's just a side effect of \prm {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}}
+So far for the more \LUATEX ish approach. One problem with \prm {mathstyle} is
+that when you got it, and want to act upon it, you need to remap it onto say \prm
+{scriptstyle} which can be done with an eight branched \prm {ifcase}. This is
+why we also have a more efficient alternative that you can use in macros:
+
+\starttyping
+\normalexpand{ ... \Ustyle\the\mathstyle ...}
+\normalexpand{ ... \Ustyle\the\mathstackstyle ...}
+\stoptyping
+
+This new primitive \prm {Ustyle} accepts a numeric value. The \prm
+{mathstackstyle} primitive is just a bonus (it complements \prm {Ustack}).
+
+The styles that the different math components and their subcomponents start out
+with are no longer hard coded but can be set at runtime:
+
+\starttabulate
+\DB primitive name \BC default \NC \NR
+\TB
+\NC \prm {Umathoverlinevariant} \NC cramped \NC \NR
+\NC \prm {Umathunderlinevariant} \NC normal \NC \NR
+\NC \prm {Umathoverdelimitervariant} \NC small \NC \NR
+\NC \prm {Umathunderdelimitervariant} \NC small \NC \NR
+\NC \prm {Umathdelimiterovervariant} \NC normal \NC \NR
+\NC \prm {Umathdelimiterundervariant} \NC normal \NC \NR
+\NC \prm {Umathhextensiblevariant} \NC normal \NC \NR
+\NC \prm {Umathvextensiblevariant} \NC normal \NC \NR
+\NC \prm {Umathfractionvariant} \NC cramped \NC \NR
+\NC \prm {Umathradicalvariant} \NC cramped \NC \NR
+\NC \prm {Umathdegreevariant} \NC doublesuperscript \NC \NR
+\NC \prm {Umathaccentvariant} \NC cramped \NC \NR
+\NC \prm {Umathtopaccentvariant} \NC cramped \NC \NR
+\NC \prm {Umathbottomaccentvariant} \NC cramped \NC \NR
+\NC \prm {Umathoverlayaccentvariant} \NC cramped \NC \NR
+\NC \prm {Umathnumeratorvariant} \NC numerator \NC \NR
+\NC \prm {Umathdenominatorvariant} \NC denominator \NC \NR
+\NC \prm {Umathsuperscriptvariant} \NC superscript \NC \NR
+\NC \prm {Umathsubscriptvariant} \NC subscript \NC \NR
+\NC \prm {Umathprimevariant} \NC superscript \NC \NR
+\NC \prm {Umathstackvariant} \NC numerator \NC \NR
+\LL
+\stoptabulate
+
+These defaults remap styles are as follows:
+
+\starttabulate[|Tl|l|l|]
+\DB default \BC result \BC mapping \NC \NR
+\TB
+\NC cramped \NC cramp the style \NC D' D' T' T' S' S' SS' SS' \NC \NR
+\NC subscript \NC smaller and cramped \NC S' S' S' S' SS' SS' SS' SS' \NC \NR
+\NC small \NC smaller \NC S S S S SS SS SS SS \NC \NR
+\NC superscript \NC smaller \NC S S S S SS SS SS SS \NC \NR
+\NC smaller \NC smaller unless already SS \NC S S' S S' SS SS' SS SS' \NC \NR
+\NC numerator \NC smaller unless already SS \NC S S' S S' SS SS' SS SS' \NC \NR
+\NC denominator \NC smaller, all cramped \NC S' S' S' S' SS' SS' SS' SS' \NC \NR
+\NC doublesuperscript \NC smaller, keep cramped \NC S S' S S' SS SS' SS SS' \NC \NR
+\LL
+\stoptabulate
+
+The main reason for opening this up was that it permits experiments and removed
+hard coded internal values. But as these defaults served well for decades there
+are no real reasons to change them.
+
+\stopsubsection
+
+\startsubsection[title={\prm {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}:
+wrong values for \prm {mathstyle}. To fix this, \LUATEX\ introduces a special
+prefix command: \prm {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.
+The \prm {Ustack} command will scan the next brace and start a new math group
+with the correct (numerator) math style. The \prm {mathstackstyle} primitive
+relates to this feature.
+
+\stopsubsection
-\subsection{The new \type {\cramped...style} commands}
+\startsubsection[title={The new \type {\cramped...style} commands}]
\topicindex {math+styles}
\topicindex {math+spacing}
@@ -285,6 +853,12 @@ with the correct (numerator) math style.
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.
+Because internally the eight styles are represented as numbers some of the new
+primnitives that relate to them also work with numbers and often you can use them
+mixed. The \prm {tomathstyle} prefix converts a symbolic style into a number so
+\typ {\number \tomathstyle \crampedscriptstyle} gives~\number \tomathstyle
+\crampedscriptstyle.
+
In Eijkhouts \quotation {\TEX\ by Topic} the rules for handling styles in scripts
are described as follows:
@@ -312,7 +886,7 @@ are described as follows:
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
+we force styles in the script using \prm {scriptstyle} and \prm
{crampedscriptstyle} we get this:
\startbuffer[demo]
@@ -328,11 +902,12 @@ we force styles in the script using \prm {scriptstyle} and \lpr
\getbuffer[demo]
-Now we set the following parameters
+Now we set the following parameters using \prm {setmathspacing} that accepts two
+class identifier, a style and a value.
\startbuffer[setup]
-\Umathordrelspacing\scriptstyle=30mu
-\Umathordordspacing\scriptstyle=30mu
+\setmathspacing 0 3 \scriptstyle = 30mu
+\setmathspacing 0 3 \scriptstyle = 30mu
\stopbuffer
\typebuffer[setup]
@@ -344,10 +919,10 @@ This gives a different result:
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
+\setmathspacing 0 3 \scriptstyle = 30mu
+\setmathspacing 0 3 \scriptstyle = 30mu
+\setmathspacing 0 3 \crampedscriptstyle = 30mu
+\setmathspacing 0 3 \crampedscriptstyle = 30mu
\stopbuffer
\typebuffer[setup]
@@ -356,11 +931,13 @@ Now we get:
\start\getbuffer[setup,demo]\stop
+\stopsubsection
+
\stopsection
\startsection[title={Math parameter settings}]
-\subsection {Many new \lpr {Umath*} primitives}
+\startsubsection[title={Many new \tex {Umath*} primitives}]
\topicindex {math+parameters}
@@ -368,68 +945,149 @@ In \LUATEX, the font dimension parameters that \TEX\ used in math typesetting ar
now accessible via primitive commands. In fact, refactoring of the math engine
has resulted in turning some hard codes properties into parameters.
+{\em The next needs checking ...}
+
\starttabulate
-\DB primitive name \BC description \NC \NR
+\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
+\NC \prm {Umathquad} \NC the width of 18 mu's \NC \NR
+\NC \prm {Umathaxis} \NC height of the vertical center axis of
+ the math formula above the baseline \NC \NR
+\NC \prm {Umathoperatorsize} \NC minimum size of large operators in display mode \NC \NR
+\NC \prm {Umathoverbarkern} \NC vertical clearance above the rule \NC \NR
+\NC \prm {Umathoverbarrule} \NC the width of the rule \NC \NR
+\NC \prm {Umathoverbarvgap} \NC vertical clearance below the rule \NC \NR
+\NC \prm {Umathunderbarkern} \NC vertical clearance below the rule \NC \NR
+\NC \prm {Umathunderbarrule} \NC the width of the rule \NC \NR
+\NC \prm {Umathunderbarvgap} \NC vertical clearance above the rule \NC \NR
+\NC \prm {Umathradicalkern} \NC vertical clearance above the rule \NC \NR
+\NC \prm {Umathradicalrule} \NC the width of the rule \NC \NR
+\NC \prm {Umathradicalvgap} \NC vertical clearance below the rule \NC \NR
+\NC \prm {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
+\NC \prm {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
+\NC \prm {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
+\NC \prm {Umathstackvgap} \NC vertical clearance between the two
elements in an \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
+\NC \prm {Umathstacknumup} \NC numerator shift upward in \prm {atop} stack \NC \NR
+\NC \prm {Umathstackdenomdown} \NC denominator shift downward in \prm {atop} stack \NC \NR
+\NC \prm {Umathfractionrule} \NC the width of the rule in a \prm {over} \NC \NR
+\NC \prm {Umathfractionnumvgap} \NC vertical clearance between the numerator and the rule \NC \NR
+\NC \prm {Umathfractionnumup} \NC numerator shift upward in \prm {over} \NC \NR
+\NC \prm {Umathfractiondenomvgap} \NC vertical clearance between the denominator and the rule \NC \NR
+\NC \prm {Umathfractiondenomdown} \NC denominator shift downward in \prm {over} \NC \NR
+\NC \prm {Umathfractiondelsize} \NC minimum delimiter size for \type {\...withdelims} \NC \NR
+\NC \prm {Umathlimitabovevgap} \NC vertical clearance for limits above operators \NC \NR
+\NC \prm {Umathlimitabovebgap} \NC vertical baseline clearance for limits above operators \NC \NR
+\NC \prm {Umathlimitabovekern} \NC space reserved at the top of the limit \NC \NR
+\NC \prm {Umathlimitbelowvgap} \NC vertical clearance for limits below operators \NC \NR
+\NC \prm {Umathlimitbelowbgap} \NC vertical baseline clearance for limits below operators \NC \NR
+\NC \prm {Umathlimitbelowkern} \NC space reserved at the bottom of the limit \NC \NR
+\NC \prm {Umathoverdelimitervgap} \NC vertical clearance for limits above delimiters \NC \NR
+\NC \prm {Umathoverdelimiterbgap} \NC vertical baseline clearance for limits above delimiters \NC \NR
+\NC \prm {Umathunderdelimitervgap} \NC vertical clearance for limits below delimiters \NC \NR
+\NC \prm {Umathunderdelimiterbgap} \NC vertical baseline clearance for limits below delimiters \NC \NR
+\NC \prm {Umathsubshiftdrop} \NC subscript drop for boxes and subformulas \NC \NR
+\NC \prm {Umathsubshiftdown} \NC subscript drop for characters \NC \NR
+\NC \prm {Umathsupshiftdrop} \NC superscript drop (raise, actually) for boxes and subformulas \NC \NR
+\NC \prm {Umathsupshiftup} \NC superscript raise for characters \NC \NR
+\NC \prm {Umathsubsupshiftdown} \NC subscript drop in the presence of a superscript \NC \NR
+\NC \prm {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
+\NC \prm {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
+\NC \prm {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 {Umathspacebeforescript} \NC additional space added before a super- or subprescript (bonus setting) \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
+\NC \prm {Umathsubsupvgap} \NC vertical clearance between super- and subscript \NC \NR
+\NC \prm {Umathspaceafterscript} \NC additional space added after a super- or subscript \NC \NR
+\NC \prm {Umathconnectoroverlapmin}\NC minimum overlap between parts in an extensible recipe \NC \NR
\LL
\stoptabulate
+In addition to the above official \OPENTYPE\ font parameters we have these (the
+undefined will get presets, quite likely zero):
+
+\starttabulate
+\DB primitive name \BC description \NC \NR
+\TB
+\NC \prm {Umathconnectoroverlapmin} \NC \NC \NR
+\NC \prm {Umathsubsupshiftdown} \NC \NC \NR
+\NC \prm {Umathfractiondelsize} \NC \NC \NR
+\NC \prm {Umathnolimitsupfactor} \NC a multiplier for the way limits are shifted up and down \NC \NR
+\NC \prm {Umathnolimitsubfactor} \NC a multiplier for the way limits are shifted up and down \NC \NR
+\NC \prm {Umathaccentbasedepth} \NC the complement of \prm {Umathaccentbaseheight} \NC \NR
+\NC \prm {Umathflattenedaccentbasedepth} \NC the complement of \prm {Umathflattenedaccentbaseheight} \NC \NR
+\NC \prm {Umathspacebeforescript} \NC \NC \NR
+\NC \prm {Umathprimeraise} \NC \NC \NR
+\NC \prm {Umathprimeraisecomposed} \NC \NC \NR
+\NC \prm {Umathprimeshiftup} \NC the prime variant of \prm {Umathsupshiftup} \NC \NR
+\NC \prm {Umathprimespaceafter} \NC the prescript variant of \prm {Umathspaceafterscript} \NC \NR
+\NC \prm {Umathprimeshiftdrop} \NC the prime variant of \prm {Umathsupshiftdrop} \NC \NR
+\NC \prm {Umathprimewidth} \NC the percentage of width that gets added \NC \NR
+\NC \prm {Umathskeweddelimitertolerance} \NC \NC \NR
+\NC \prm {Umathaccenttopshiftup} \NC the amount that a top accent is shifted up \NC \NR
+\NC \prm {Umathaccentbottomshiftdown} \NC the amount that a bottom accent is shifted down \NC \NR
+\NC \prm {Umathaccenttopovershoot} \NC \NC \NR
+\NC \prm {Umathaccentbottomovershoot} \NC \NC \NR
+\NC \prm {Umathaccentsuperscriptdrop} \NC \NC \NR
+\NC \prm {Umathaccentsuperscriptpercent} \NC \NC \NR
+\NC \prm {Umathaccentextendmargin} \NC margins added to automatically extended accents \NC \NR
+\NC \prm {Umathflattenedaccenttopshiftup} \NC the amount that a wide top accent is shifted up \NC \NR
+\NC \prm {Umathflattenedaccentbottomshiftdown} \NC the amount that a wide bottom accent is shifted down \NC \NR
+\NC \prm {Umathdelimiterpercent} \NC \NC \NR
+\NC \prm {Umathdelimitershortfall} \NC \NC \NR
+\NC \prm {Umathradicalextensiblebefore} \NC \NC \NR
+\NC \prm {Umathradicalextensibleafter} \NC \NC \NR
+\stoptabulate
+
+These relate to the font parameters and in \CONTEXT\ we assign some different
+defaults and tweak them in the goodie files:
+
+\starttabulate[|T|T|c|]
+\DB font parameter \BC primitive name \BC default \NC \NR
+\TB
+\NC MinConnectorOverlap \NC \prm {Umathconnectoroverlapmin} \NC 0 \NC \NR
+\NC SubscriptShiftDownWithSuperscript \NC \prm {Umathsubsupshiftdown} \NC inherited \NC \NR
+\NC FractionDelimiterSize \NC \prm {Umathfractiondelsize} \NC undefined \NC \NR
+\NC FractionDelimiterDisplayStyleSize \NC \prm {Umathfractiondelsize} \NC undefined \NC \NR
+\NC NoLimitSubFactor \NC \prm {Umathnolimitsupfactor} \NC 0 \NC \NR
+\NC NoLimitSupFactor \NC \prm {Umathnolimitsubfactor} \NC 0 \NC \NR
+\NC AccentBaseDepth \NC \prm {Umathaccentbasedepth} \NC reserved \NC \NR
+\NC FlattenedAccentBaseDepth \NC \prm {Umathflattenedaccentbasedepth} \NC reserved \NC \NR
+\NC SpaceBeforeScript \NC \prm {Umathspacebeforescript} \NC 0 \NC \NR
+\NC PrimeRaisePercent \NC \prm {Umathprimeraise} \NC 0 \NC \NR
+\NC PrimeRaiseComposedPercent \NC \prm {Umathprimeraisecomposed} \NC 0 \NC \NR
+\NC PrimeShiftUp \NC \prm {Umathprimeshiftup} \NC 0 \NC \NR
+\NC PrimeShiftUpCramped \NC \prm {Umathprimeshiftup} \NC 0 \NC \NR
+\NC PrimeSpaceAfter \NC \prm {Umathprimespaceafter} \NC 0 \NC \NR
+\NC PrimeBaselineDropMax \NC \prm {Umathprimeshiftdrop} \NC 0 \NC \NR
+\NC PrimeWidthPercent \NC \prm {Umathprimewidth} \NC 0 \NC \NR
+\NC SkewedDelimiterTolerance \NC \prm {Umathskeweddelimitertolerance} \NC 0 \NC \NR
+\NC AccentTopShiftUp \NC \prm {Umathaccenttopshiftup} \NC undefined \NC \NR
+\NC AccentBottomShiftDown \NC \prm {Umathaccentbottomshiftdown} \NC undefined \NC \NR
+\NC AccentTopOvershoot \NC \prm {Umathaccenttopovershoot} \NC 0 \NC \NR
+\NC AccentBottomOvershoot \NC \prm {Umathaccentbottomovershoot} \NC 0 \NC \NR
+\NC AccentSuperscriptDrop \NC \prm {Umathaccentsuperscriptdrop} \NC 0 \NC \NR
+\NC AccentSuperscriptPercent \NC \prm {Umathaccentsuperscriptpercent} \NC 0 \NC \NR
+\NC AccentExtendMargin \NC \prm {Umathaccentextendmargin} \NC 0 \NC \NR
+\NC FlattenedAccentTopShiftUp \NC \prm {Umathflattenedaccenttopshiftup} \NC undefined \NC \NR
+\NC FlattenedAccentBottomShiftDown \NC \prm {Umathflattenedaccentbottomshiftdown} \NC undefined \NC \NR
+\NC DelimiterPercent \NC \prm {Umathdelimiterpercent} \NC 0 \NC \NR
+\NC DelimiterShortfall \NC \prm {Umathdelimitershortfall} \NC 0 \NC \NR
+\stoptabulate
+
+These parameters not only provide a bit more control over rendering, they also
+can be used in compensating issues in font, because no font is perfect. Some are
+the side effects of experiments and they have CamelCase companions in the \type
+{MathConstants} table. For historical reasons the names are a bit inconsistent as
+some originate in \TEX\ so we prefer to keep those names. Not many users will
+mess around with these font parameters anyway. \footnote {I wonder if some names
+should change, so that decision is pending.}
+
Each of the parameters in this section can be set by a command like this:
\starttyping
@@ -439,10 +1097,37 @@ Each of the parameters in this section can be set by a command like this:
they obey grouping, and you can use \type {\the\Umathquad\displaystyle} if
needed.
-\subsection{Font|-|based math parameters}
+There are quite some parameters that can be set and there are eight styles, which means a lot
+of keying in. For that reason is is possible to set parameters groupwise:
+
+\starttabulate[|l|c|c|c|c|c|c|c|c|]
+\DB primitive name \BC D \BC D' \BC T \BC T' \BC S \BC S' \BC SS \BC SS' \NC \NR
+\TB
+\NC \prm {alldisplaystyles} \NC$+$\NC$+ $\NC \NC \NC \NC \NC \NC \NC \NR
+\NC \prm {alltextstyles} \NC \NC \NC$+$\NC$+ $\NC \NC \NC \NC \NC \NR
+\NC \prm {allscriptstyles} \NC \NC \NC \NC \NC$+$\NC$+ $\NC \NC \NC \NR
+\NC \prm {allscriptscriptstyles} \NC \NC \NC \NC \NC \NC \NC$+ $\NC$+ $\NC \NR
+\NC \prm {allmathstyles} \NC$+$\NC$+ $\NC$+$\NC$+ $\NC$+$\NC$+ $\NC$+ $\NC$+ $\NC \NR
+\NC \prm {allmainstyles} \NC \NC \NC \NC \NC \NC \NC \NC \NC \NR
+\NC \prm {allsplitstyles} \NC$+$\NC$+ $\NC$+$\NC$+ $\NC$-$\NC$- $\NC$- $\NC$- $\NC \NR
+\NC \prm {allunsplitstyles} \NC \NC \NC \NC \NC$+$\NC$+ $\NC$+ $\NC$+ $\NC \NR
+\NC \prm {alluncrampedstyles} \NC$+$\NC \NC$+$\NC \NC$+$\NC \NC$+ $\NC \NC \NR
+\NC \prm {allcrampedstyles} \NC \NC$+ $\NC \NC$+ $\NC \NC$+ $\NC \NC$+ $\NC \NR
+\LL
+\stoptabulate
+
+These groups are especially handy when you set up inter atom spacing, pre- and
+post atom penalties and atom rules.
+
+\stopsubsection
+
+\startsubsection[title={Font|-|based math parameters}]
\topicindex {math+parameters}
+We already introduced the font specific math parameters but we tell abit more
+about them and how they relate to the original \TEX\ font dimensions.
+
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
@@ -467,131 +1152,215 @@ 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 \llap{\high{\tx #2\enspace}}\ttbf \prm {#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}
+\MathLine{Umathaxis} {} {} {AxisHeight} {axis_height}
+\MathLine{Umathaccentbaseheight} {} {} {AccentBaseHeight} {xheight}
+\MathLine{Umathflattenedaccentbaseheight}{} {} {FlattenedAccentBaseHeight} {xheight}
+\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
+
+A few notes:
+
+\startitemize[n]
+
+\startitem
+ \OPENTYPE\ fonts set \prm {Umathlimitabovekern} and \prm
+ {Umathlimitbelowkern} to zero and set \prm {Umathquad} to the font size of
+ the used font, because these are not supported in the \type {MATH} table.
+\stopitem
+
+\startitem
+ Traditional \TFM\ fonts do not set \prm {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 \prm {Umathradicaldegreebefore}, \prm {Umathradicaldegreeafter}, and \prm
+ {Umathradicaldegreeraise}. These are then automatically initialized to
+ $5/18$quad, $-10/18$quad, and 60.
+\stopitem
+
+\startitem
+ If \TFM\ fonts are used, then the \prm {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
+ \prm {Umathradicalvgap} is set, it will not be recalculated any more.
+\stopitem
+
+\startitem
+ When \TFM\ fonts are used a similar situation arises with respect to \prm
+ {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 \prm {Umathspaceafterscript} is set, \prm {scriptspace} will never
+ be looked at again.
+\stopitem
+
+\startitem
+ Traditional \TFM\ fonts set \prm {Umathconnectoroverlapmin} to zero because
+ \TEX82\ always stacks extensibles without any overlap.
+\stopitem
+
+\startitem
+ The \prm {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.
+\stopitem
+
+\startitem
+ The \prm {Umathradicaldegreeraise} is a special case because it is the only
+ parameter that is expressed in a percentage instead of a number of scaled
+ points.
+\stopitem
+
+\startitem
+ \type {SubscriptShiftDownWithSuperscript} does not actually exist in the
+ \quote {standard} \OPENTYPE\ math font Cambria, but it is useful enough to be
+ added.
+\stopitem
+
+\startitem
+ \type {FractionDelimiterDisplayStyleSize} and \type {FractionDelimiterSize}
+ do not actually exist in the \quote {standard} \OPENTYPE\ math font Cambria,
+ but were useful enough to be added.
+\stopitem
+
+\stopitemize
+
+As this mostly refers to \LUATEX\ there is more to tell about how \LUAMETATEX\
+deals with it. However, it is enough to know that much more behavior is
+configurable.
+
+You can let the engine ignore parameter with \prm {setmathignore}, like:
+
+\starttyping
+\setmathignore \Umathspacebeforescript 1
+\setmathignore \Umathspaceafterscript 1
+\stoptyping
+
+Be aware of the fact that a global setting can get unnoticed by users because
+there is no warning that some parameter is ignored.
+
+\stopsubsection
+
+\stopsection
+
+\startsection[title={Extra parameters}]
+
+\startsubsection[title={Style related parameters}]
+
+There are a couple of parameters that don't relate to the font but are more generally
+influencing the appearances. Some were added for experimenting.
+
+\starttabulate[|l|l|]
+\DB primitive \BC meaning \NC \NR
+\prm {Umathextrasubpreshift} \NC \NR
+\prm {Umathextrasubprespace} \NC \NR
+\prm {Umathextrasubshift} \NC \NR
+\prm {Umathextrasubspace} \NC \NR
+\prm {Umathextrasuppreshift} \NC \NR
+\prm {Umathextrasupprespace} \NC \NR
+\prm {Umathextrasupshift} \NC \NR
+\prm {Umathextrasupspace} \NC \NR
+\prm {Umathsubshiftdistance} \NC \NR
+\prm {Umathsupshiftdistance} \NC \NR
+\prm {Umathpresubshiftdistance} \NC \NR
+\prm {Umathpresupshiftdistance} \NC \NR
+\prm {Umathprimeshiftdrop} \NC \NR
+\LL
+\stoptabulate
+
+\stopsubsection
+
+\startsubsection[title={Math struts}]
+
+Todo:
+
+\starttabulate[|l|l|]
+\DB primitive \BC meaning \NC \NR
+\NC \prm {Umathruleheight} \NC \NR
+\NC \prm {Umathruledepth} \NC \NR
\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.
+\stopsubsection
\stopsection
\startsection[title={Math spacing}]
-\subsection{Setting inline surrounding space with \lpr {mathsurround[skip]}}
+\startsubsection[reference=spacing:surround,title={Setting inline surrounding space with \prm {mathsurround} and \prm {mathsurroundskip}}]
\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
+dimension. There is now an additional parameter \prm {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.
+control has been added via \prm {mathsurroundmode}. This directive can take 6 values
+with zero being the default behavior.
\start
@@ -614,14 +1383,14 @@ with zero being the default behaviour.
\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{0}{obey \prm {mathsurround} when \prm {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}
+\OneLiner{6}{only apply \prm {mathsurroundskip} when also spacing}
+\OneLiner{7}{only apply \prm {mathsurroundskip} when no spacing}
\LL
\stoptabulate
@@ -637,106 +1406,111 @@ 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}
+\stopsubsection
+
+\startsubsection[title={Pairwise spacing}]
\topicindex {math+spacing}
-Besides the parameters mentioned in the previous sections, there are also 64 new
+Besides the parameters mentioned in the previous sections, there are also
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:
+\TEX book). This happens per class pair. Because we have many possible classes,
+we no longer have the many primitives that \LUATEX\ has but you can define then
+using the generic \prm {setmathspacing} primitive:
-\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
+\starttyping
+\def\Umathordordspacing {\setmathspacing 0 0 }
+\def\Umathordordopenspacing {\setmathspacing 0 4 }
+\stoptyping
+
+These parameters are (normally) of type \prm {muskip}, so setting a parameter can
+be done like this:
+
+\starttyping
+\setmathspacing 1 0 \displaystyle=4mu plus 2mu % op ord Umathopordspacing
+\stoptyping
+
+The atom pairs known by the engine are all initialized by \type {initex} to the
+values mentioned in the table in Chapter~18 of the \TEX book.
+
+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. As a bonus we also introduced the \prm {tinymuskip} and \prm
+{pettymuskip} primitives, just because we consider these fundamental, but they
+are not assigned internally to atom spacing combinations.
+
+In \LUAMETATEX\ we go a bit further. Any named dimension, glue and mu glue
+register as well as the constants with these properties can be bound to a pair by
+prefixing \prm {setmathspacing} by \prm {inherited}.
+
+Careful readers will realize that there are also primitives for the items marked
+\type {*} in the \TEX book. These will actually be used because we pose no
+restrictions. However, you can enforce the remapping rules to conform to the
+rules of \TEX\ (or yourself).
+
+Every class has a set of spacing parameters and the more classes you define the more
+pairwise spacing you need to define. However, you can default to an existing class.
+By default all spacing is zero and you can get rid of the defaults inherited from
+good old \TEX\ with \prm {resetmathspacing}. You can alias class spacing to an exiting
+class with \prm {letmathspacing}:
+
+\starttyping
+\letmathspacing class displayclass textclass scriptclass scriptscriptclass
+\stoptyping
+
+Instead you can copy spacing with \prm {copymathspacing}:
+
+\starttyping
+\copymathspacing class parentclass
+\stoptyping
+
+Specific paring happens with \prm {setmathspacing}:
+
+\starttyping
+\setmathspacing leftclass rightclass style value
+\stoptyping
+
+Unless we have a frozen parameter, the prefix \prm {inherited} makes it possible
+to have a more dynamic relationship: the used value resolves to the current value
+of the given register. Possible values are the usual mu skip register, a regular
+skip or dimension register, or just some mu skip value.
+
+A similar set of primitives deals with rules. These remap pairs onto other pairs, so
+\prm {setmathatomrule} looks like:
-These parameters are of type \prm {muskip}, so setting a parameter can be done
-like this:
+\starttyping
+\setmathatomrule oldleftclass oldrightclass newleftclass newrightclass
+\stoptyping
+
+The \prm {letmathatomrule} and \prm {copymathatomrule} primitives take two
+classes where the second is the parent.
+
+Some primitives are still experimental and might evolve, like \prm
+{letmathparent} and \prm {copymathparent} that take numbers as in:
\starttyping
-\Umathopordspacing\displaystyle=4mu plus 2mu
+\letmathatomrule class spacingclass prepenaltyclass postpenaltyclass options reserved
\stoptyping
-They are all initialized by \type {initex} to the values mentioned in the table
-in Chapter~18 of the \TEX book.
+Primitives like this were used when experimenting and when re use them in \CONTEXT\
+eventually they will become stable.
+
+The \prm {setmathprepenalty} and \prm {setmathpostpenalty} primitives take a
+class and penalty (integer) value. These are injected before and after atoms with
+the given class where a penalty of 10000 is a signal to ignore it.
-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.
+The engine control options for a class can be set with \prm {setmathoptions}. The
+possible options are discussed elsewhere. This primitive takes a class number and
+an integer (bitset). For all these setters the \CONTEXT\ math setup gives examples.
-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.
+\stopsubsection
-\subsection{Local \lpr {frozen} settings with}
+% \setdefaultmathcodes
+% \setmathignore parameter
+
+\startsubsection[title={Local \prm {frozen} settings with}]
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
@@ -777,232 +1551,99 @@ unprocessed math list. The result looks as follows:
\blank \getbuffer \blank
-\subsection{Checking a state with \lpr {ifmathparameter}}
-
-When you adapt math parameters it might make sense to see if they are set at all.
-When a parameter is unset its value has the maximum dimension value and you might
-for instance mistakenly multiply that value to open up things a bit, which gives
-unexpected side effects. For that reason there is a convenient checker: \lpr
-{ifmathparameter}. This test primitive behaves like an \prm {ifcase}, with:
-
-\starttabulate[|c|l|]
-\DB value \BC meaning \NC \NR
-\TB
-\NC 0 \NC the parameter value is zero \NC \NR
-\NC 1 \NC the parameter is set \NC \NR
-\NC 2 \NC the parameter is unset \NC \NR
-\LL
-\stoptabulate
+\stopsubsection
-\subsection{Skips around display math and \lpr {mathdisplayskipmode}}
+\startsubsection[title={Arbitrary atoms with \prm {mathatom} etc.}]
-\topicindex {math+spacing}
+The original \TEX\ engine has primitives like \prm {mathord} and a limited set of
+possible atoms. In \LUAMETATEX\ we have many more built in and you can add more.
+It will take a while before we have documented all the new math features and more
+details can be found in the manuals that come with \CONTEXT\ for which all this
+was implemented. In addition to \prm {mathordinary} (aka \prm {mathord}), \prm
+{mathoperator} (aka \prm {mathop}), \prm {mathbinary} (aka \prm {mathbin}), \prm
+{mathrelation} (aka \prm {mathrel}), \prm {mathopen}, \prm {mathclose}, \prm
+{mathpunctuation} (aka {mathpunct}) and \prm {mathinner} we have \prm
+{mathfraction}, \prm {mathradical}, \prm {mathmiddle}, \prm {mathaccent}, \prm
+{mathfenced}, \prm {mathghost} and the existing \prm {mathunderline} (aka \prm
+{underline}) and \prm {mathoverline} (aka \prm {overline}) class driven atoms.
-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:
+The \prm {mathatom} primitive is the generic one and it accepts a couple of
+keywords:
-\starttabulate[|c|l|]
-\DB value \BC meaning \NC \NR
+\starttabulate[|lT|l|l|]
+\DB keyword \BC argument \NC 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
+\NC attr \NC int int \NC attributes to be applied to this atom \NC \NR
+\NC leftclass \NC class \NC the left edge class that determines spacing etc \NC \NR
+\NC rightclass \NC class \NC the right edge class that determines spacing etc \NC \NR
+\NC class \NC class \NC the general class \NC \NR
+\NC unpack \NC \NC unpack this atom in inline math \NC \NR
+\NC source \NC int \NC a symbolic index of the resulting box \NC \NR
+\NC textfont \NC \NC use the current text font \NC \NR
+\NC mathfont \NC \NC use the current math font \NC \NR
+\NC limits \NC \NC put scripts on top and below \NC \NR
+\NC nolimits \NC \NC force scripts to be postscripts \NC \NR
+\NC nooverflow \NC \NC keep (extensible) within target dimensions \NC \NR
+\NC options \NC int \NC bitset with options \NC \NR
+\NC void \NC \NC discard content and ignore dimensions \NC \NR
+\NC phantom \NC \NC discard content but retain dimensions \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}
+To what extend the options kick in depends on the class as well where and how the
+atom is used.
-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
+The original \TEX\ engines has three atom modifiers: \prm {displaylimits}, \prm
+{limits}, and \prm {nolimits}. These look back to the last atom and set a limit
+related signal. Just to be consistent we have some more of that: \prm
+{Umathadapttoleft}, \prm {Umathadapttoright}, \prm {Umathuseaxis}, \prm
+{Umathnoaxis}, \prm {Umathphantom}, \prm {Umathvoid}, \prm {Umathsource}, \prm
+{Umathopenupheight}, \prm {Umathopenupdepth}, \prm {Umathlimits}, \prm
+{Umathnolimits}. The last two are equivalent to the lowercase ones with the
+similar names. Al these modifiers are cheap primitives and one can wonder if they
+are needed but that also now also applies to the original three. We could stick
+to one modifier that takes an integer but let's not diverge too much from the
+original concept.
-This kind of parameters relate to the fact that italic correction in \OPENTYPE\
-math is bound to fuzzy rules. So, control is the solution.
+The \prm {nonscript} primitive injects a glue node that signals that the next
+glue is to be ignored when we are in script or scriptscript mode. The \prm
+{noatomruling} does the same but this time the signal is that no inter|-|atom
+rules need to be applied.
-\subsection {Influencing script kerning with \lpr {mathscriptboxmode}}
+\stopsubsection
-\topicindex {math+kerning}
-\topicindex {math+scripts}
+\startsubsection[title={Checking a state with \prm {ifmathparameter}}]
-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 an \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.
+When you adapt math parameters it might make sense to see if they are set at all.
+When a parameter is unset its value has the maximum dimension value and you might
+for instance mistakenly multiply that value to open up things a bit, which gives
+unexpected side effects. For that reason there is a convenient checker: \prm
+{ifmathparameter}. This test primitive behaves like an \prm {ifcase}, with:
\starttabulate[|c|l|]
-\DB value \BC meaning \NC \NR
+\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 {3} \NC only kern math sub boxes with a boundary node present\NC \NR
+\NC 0 \NC the parameter value is zero \NC \NR
+\NC 1 \NC the parameter is set \NC \NR
+\NC 2 \NC the parameter is unset \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
+\stopsubsection
-\subsection{Forcing fixed scripts with \lpr {mathscriptsmode}}
+\startsubsection[title={Forcing fixed scripts with \prm {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
+\NC $d$ \NC \prm {Umathsubshiftdown} \NC \NR
+\NC $u$ \NC \prm {Umathsupshiftup} \NC \NR
+\NC $s$ \NC \prm {Umathsubsupshiftdown} \NC \NR
\LL
\stoptabulate
-When we set \lpr {mathscriptsmode} to a value other than zero these are used
+When we set \prm {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.
@@ -1016,18 +1657,21 @@ effects.
\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
+%
+% In \LUATEX\ but dropped in \LUAMETATEX:
+%
+%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.
+The value of this parameter obeys grouping and is applied to character atoms only
+(but that might evolve as we go).
-% if needed we can put the value in stylenodes but maybe more should go there
+\stopsubsection
-\subsection{Penalties: \lpr {mathpenaltiesmode}}
+\startsubsection[title={Penalties: \prm {mathpenaltiesmode}}]
\topicindex {math+penalties}
@@ -1051,7 +1695,9 @@ makes sense. As a bonus we also provide two extra penalties:
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}}
+\stopsubsection
+
+\startsubsection[title={Equation spacing: \prm {matheqnogapstep}}]
By default \TEX\ will add one quad between the equation and the number. This is
hard coded. A new primitive can control this:
@@ -1065,57 +1711,16 @@ 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.
+\stopsubsection
+
\stopsection
\startsection[title={Math constructs}]
-\subsection {Unscaled fences and \lpr{mathdelimitersmode}}
+\startsubsection[title={Cheating with fences}]
\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}).
-
Sometimes you might want to act upon the size of a delimiter, something that is
not really possible because of the fact that they are calculated {\em after} most
has been typeset already. For this we have two keyword: \type {phantom} and
@@ -1142,16 +1747,22 @@ In typeset form this looks like:
\getbuffer
-\subsection[mathacc]{Accent handling with \lpr {Umathaccent}}
+Normally fences need to be matched, that is: when a left fence is seen, there has
+to be a right fence. When you set \prm {mathcheckfencesmode} to non|-|zero the
+scanner silently recovers from this.
+
+\stopsubsection
+
+\startsubsection[title={Accent handling with \prm {Umathaccent}},reference=mathacc]
\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}.
+are controlled by optional keywords following \prm {Umathaccent}.
-The keyword \type {bottom} after \lpr {Umathaccent} signals that a bottom accent
+The keyword \type {bottom} after \prm {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).
@@ -1191,24 +1802,68 @@ fraction only applies to the stepwise selected shapes and is mostly meant for th
\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}}
+\stopsubsection
+
+\startsubsection[title={Building radicals with \prm {Uradical}, \prm {Uroot} and \prm {Urooted}}]
\topicindex {math+radicals}
+\topicindex {math+roots}
-The new primitive \lpr {Uroot} allows the construction of a radical noad
-including a degree field. Its syntax is an extension of \lpr {Uradical}:
+The new primitive \prm {Uroot} allows the construction of a radical noad
+including a degree field. Its syntax is an extension of \prm {Uradical}:
\starttyping
-\Uradical <fam integer> <char integer> <radicand>
-\Uroot <fam integer> <char integer> <degree> <radicand>
+\Uradical
+ <fam integer> <left char integer>
+ <content>
+\Uroot
+ <fam integer> <left char integer>
+ <degree>
+ <content>
+\Urooted
+ <fam integer> <left char integer>
+ <fam integer> <right char integer>
+ <degree>
+ <content>
\stoptyping
-The placement of the degree is controlled by the math parameters \lpr
-{Umathradicaldegreebefore}, \lpr {Umathradicaldegreeafter}, and \lpr
+The placement of the degree is controlled by the math parameters \prm
+{Umathradicaldegreebefore}, \prm {Umathradicaldegreeafter}, and \prm
{Umathradicaldegreeraise}. The degree will be typeset in \prm
{scriptscriptstyle}.
-\subsection{Super- and subscripts}
+In \CONTEXT\ we use \prm {Urooted} to wrap something in an \quote {annuity}
+umbrella where there is a symbol at the end that has to behave like the radical
+does at the left end: adapt its size. In order to support variants this primitive
+supports two delimiters.
+
+{\em todo: mention optional keywords}
+
+\stopsubsection
+
+\startsubsection[title={Tight delimiters with \prm {Udelimited}}]
+
+\topicindex {math+radicals}
+\topicindex {math+delimiters}
+
+This new primitive is like \prm {Urooted} in that it takes two delimiters but it
+takes no degree and no rule is drawn.
+
+\starttyping
+\Udelimited
+ <fam integer> <left char integer>
+ <fam integer> <right char integer>
+ <content>
+\stoptyping
+
+In \CONTEXT\ we use it for fourier notations in which case there is only a right
+symbol (like a hat).
+
+{\em todo: mention optional keywords}
+
+\stopsubsection
+
+\startsubsection[title={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}
@@ -1267,16 +1922,18 @@ next higher height and kern pair, or the highest one in the character (if there
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}}
+\stopsubsection
+
+\startsubsection[title={Scripts on extensibles: \prm {Uunderdelimiter}, \prm {Uoverdelimiter},
+\prm {Udelimiterover}, \prm {Udelimiterunder} and \prm {Uhextensible}}]
\topicindex {math+scripts}
\topicindex {math+delimiters}
\topicindex {math+extensibles}
-The primitives \lpr {Uunderdelimiter} and \lpr {Uoverdelimiter} allow the
+The primitives \prm {Uunderdelimiter} and \prm {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
+\prm {Udelimiterunder} and \prm {Udelimiterover} allow the placement of an
automatically extensible item as a subscript or superscript on a nucleus. The
input:
@@ -1294,18 +1951,18 @@ $\Udelimiterunder 0 "2194 {\hbox{\strut delimiterunder}}$
\blank \startnarrower \getbuffer \stopnarrower \blank
-The vertical placements are controlled by \lpr {Umathunderdelimiterbgap}, \lpr
-{Umathunderdelimitervgap}, \lpr {Umathoverdelimiterbgap}, and \lpr
+The vertical placements are controlled by \prm {Umathunderdelimiterbgap}, \prm
+{Umathunderdelimitervgap}, \prm {Umathoverdelimiterbgap}, and \prm
{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.
+The superscript in \prm {Uoverdelimiter} is typeset in a suitable scripted style,
+the subscript in \prm {Uunderdelimiter} is cramped as well.
These primitives accepts an optional \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:
+An extra primitive \prm {Uhextensible} is available that can be used like this:
\startbuffer
$\Uhextensible width 10cm 0 "2194$
@@ -1330,7 +1987,28 @@ $\Uhextensible width 1pt middle 0 "2194$
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}}
+\stopsubsection
+
+\startsubsection[title={Fractions and the new \prm {Ustretched} and \prm {Ustretchedwithdelims}}]
+
+\topicindex {math+fractions}
+
+These commands are similar the regular rule separated fractions but expect a delimiter
+that then will be used instead. This permits for instance the use of horizontal
+extensible arrows. When no extensible is possible (this is a font property) the given
+glyph is centered.
+
+Normally one will pass a specific delimiter and not a character, if only because
+these come from the non \ASCII\ ranges:
+
+\starttyping
+{ \Ustretched <delimiter> <options> {1} {2} }
+{ \Ustretchedwithdelims <delimiter> () <options> {1} {2} }
+\stoptyping
+
+\stopsubsection
+
+\startsubsection[title={Fractions and the new \prm {Uskewed} and \prm {Uskewedwithdelims}}]
\topicindex {math+fractions}
@@ -1348,21 +2026,21 @@ 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}.
+\prm {Umathskewedfractionhgap} and \prm {Umathskewedfractionvgap}.
The syntax used here is:
\starttyping
-{ {1} \Uskewed / <options> {2} }
-{ {1} \Uskewedwithdelims / () <options> {2} }
+{ \Uskewed / <options> {1} {2} }
+{ \Uskewedwithdelims / () <options> {1} {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$}
+\def\ShowA#1#2#3{$x + { \Uskewed / #3 {#1} {#2} } + x$}
+\def\ShowB#1#2#3{$x + { \Uskewedwithdelims / () #3 {#1} {#2} } + x$}
\start
\switchtobodyfont[modern]
@@ -1414,12 +2092,10 @@ The optional arguments are also supported but we have one extra option: \type
\Uover style \scriptstyle {top} {bottom}
\stoptyping
-The complete list of these commands is: \lpr {Uabove}, \lpr {Uatop}, \lpr
-{Uover}, \lpr {Uabovewithdelims}, \lpr {Uatopwithdelims}, \lpr {Uoverwithdelims},
-\lpr {UUskewed}, \lpr {UUskewedwithdelims}. As with other extensions we use a
-leading \type {U} and because we already had extra skew related primitives we end
-up with a \type {UU} there. This obscurity is not that big an issue because
-normally such primitives are wrapped in a macro. Here are a few examples:
+The complete list of these commands is: \prm {Uabove}, \prm {Uatop}, \prm
+{Uover}, \prm {Uabovewithdelims}, \prm {Uatopwithdelims}, \prm {Uoverwithdelims},
+\prm {Uskewed}, \prm {Uskewedwithdelims}. As with other extensions we use a
+leading \type {U}. Here are a few examples:
\startbuffer
$\Uover { 1234} { 5678} $\quad
@@ -1437,7 +2113,9 @@ $\Uover style \scriptscriptstyle {1234} {5678} $\blank
These render as: \getbuffer
-\subsection {Math styles: \lpr {Ustyle}}
+\stopsubsection
+
+\startsubsection[title={Math styles: \prm {Ustyle}}]
This primitive accepts a style identifier:
@@ -1453,7 +2131,7 @@ This in itself is not spectacular because it is equivalent to
Both commands inject a style node and change the current style. However, as in other
places where \LUAMETATEX\ expects a style you can also pass a number in the range
-zero upto seven (like the ones reported by the primitive \lpr {mathstyle}). So, the
+zero upto seven (like the ones reported by the primitive \prm {mathstyle}). So, the
next few lines give identical results:
\startbuffer
@@ -1467,7 +2145,9 @@ Like: \inlinebuffer . Values outside the valid range are ignored.
There is an extra option \type {norule} that can be used to suppress the rule while
keeping the spacing compatible.
-\subsection {Delimiters: \type{\Uleft}, \lpr {Umiddle} and \lpr {Uright}}
+\stopsubsection
+
+\startsubsection[title={Delimiters: \prm {Uleft}, \prm {Umiddle} and \prm {Uright}}]
\topicindex {math+delimiters}
@@ -1508,24 +2188,20 @@ 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.
+\stopsubsection
\stopsection
\startsection[title={Extracting values}]
-\subsection{Codes and using \lpr {Umathcode}, \lpr {Umathcharclass}, \lpr
-{Umathcharfam} and \lpr {Umathcharslot}}
+\startsubsection[title={Codes and using \prm {Umathcode}, \prm {Umathcharclass}, \prm
+{Umathcharfam} and \prm {Umathcharslot}}]
\topicindex {math+codes}
-You can extract the components of a math character. Say that we have defined:
+You should not really depend on the number that comes from \prm {Umathcode} because
+the engine can (at some point) use a different amount of families and classes. Given this,
+you can extract the components of a math character. Say that we have defined:
\starttyping
\Umathcode 1 2 3 4
@@ -1534,17 +2210,21 @@ You can extract the components of a math character. Say that we have defined:
then
\starttyping
-[\Umathcharclass1] [\Umathcharfam1] [\Umathcharslot1]
+[\Umathcharclass\Umathcode1] [\Umathcharfam\Umathcode1] [\Umathcharslot\Umathcode1]
\stoptyping
-will return:
+which will return:
\starttyping
[2] [3] [4]
\stoptyping
-These commands are provided as convenience. Before they come available you could
-do the following:
+You can of course store the code in for instance a register and use that as
+argument. The three commands also accept a specification (and maybe more in the
+future).
+
+These commands are provided as convenience. Before they became available you
+could do the following:
\starttyping
\def\Umathcharclass{\numexpr
@@ -1558,7 +2238,9 @@ do the following:
\relax}
\stoptyping
-\subsection {Last lines and \lpr{predisplaygapfactor}}
+\stopsubsection
+
+\startsubsection[title={Last lines and \prm{predisplaygapfactor}}]
\topicindex {math+last line}
@@ -1582,12 +2264,23 @@ get the length of the last line, the following will often work too:
\relax}
\stoptyping
+\stopsubsection
+
\stopsection
-\startsection[title={Math mode}]
+\startsection[title={Math mode and scripts}]
+
+\startsubsection[title={Entering and leaving math mode with \prm {Ustartmathmode}
+and \prm {Ustopmathmode}}]
-\subsection {Verbose versions of single|-|character math commands like \lpr {Usuperscript}
-and \lpr {Usubscript}}
+These commands are variants on the single and double (usually) dollar signs that
+make us enter math mode and later leave it. The start command expects a style
+identifier that determines in what style we end up in.
+
+\stopsubsection
+
+\startsubsection[title={Verbose versions of single|-|character math commands like \prm {Usuperscript}
+and \prm {Usubscript}}]
\topicindex {math+styles}
@@ -1595,31 +2288,33 @@ and \lpr {Usubscript}}
\type {^}, \type {_}, \type {$}, and \type {$$}:
\starttabulate[|l|l|]
-\DB primitive \BC explanation \NC \NR
+\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 {$}, % $
+\NC \prm {Usuperscript} \NC duplicates the functionality of \type {^} \NC \NR
+\NC \prm {Usubscript} \NC duplicates the functionality of \type {_} \NC \NR
+\NC \prm {Ustartmath} \NC duplicates the functionality of \type {$}, % $
when used in non-math mode. \NC \NR
-\NC \lpr {Ustopmath} \NC duplicates the functionality of \type {$}, % $
+\NC \prm {Ustopmath} \NC duplicates the functionality of \type {$}, % $
when used in inline math mode. \NC \NR
-\NC \lpr {Ustartdisplaymath} \NC duplicates the functionality of \type {$$}, % $$
+\NC \prm {Ustartdisplaymath} \NC duplicates the functionality of \type {$$}, % $$
when used in non-math mode. \NC \NR
-\NC \lpr {Ustopdisplaymath} \NC duplicates the functionality of \type {$$}, % $$
+\NC \prm {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
+The \prm {Ustopmath} and \prm {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}}
+\stopsubsection
+
+\startsubsection[title={Script commands \prm {Unosuperscript}, \prm {Unosubscript}, \prm {Unosuperprescript} and \prm {Unosubprescript}}]
\topicindex {math+styles}
\topicindex {math+scripts}
-These two commands result in super- and subscripts but with the current style (at the
+These commands result in super- and subscripts but with the current style (at the
time of rendering). So,
\startbuffer[script]
@@ -1635,81 +2330,57 @@ $
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}]
+\stopsubsection
-\subsection {Flattening: \lpr {mathflattenmode}}
+\startsubsection[title={Script commands \prm {Ushiftedsuperscript}, \prm {Ushiftedsubscript}, \prm {Ushiftedsuperprescript} and \prm {Ushiftedsubprescript}}]
-\topicindex {math+flattening}
+\topicindex {math+styles}
+\topicindex {math+scripts}
+\topicindex {math+indices}
-The \TEX\ math engine collapses \type {ord} noads without sub- and superscripts
-and a character as nucleus, which has the side effect that in \OPENTYPE\ mode
-italic corrections are applied (given that they are enabled).
+Sometimes a script acts as an index in which case is should be anchored
+differently. For that we have four extra primitives. Here the shifted postscripts
+are shown:
-\startbuffer[sample]
-\switchtobodyfont[modern]
-$V \mathbin{\mathbin{v}} V$\par
-$V \mathord{\mathord{v}} V$\par
+\startbuffer[script]
+$
+ x\Usuperscript {1}\Usubscript {2} =
+ x\Ushiftedsuperscript{1}\Ushiftedsubscript{2} =
+ x\Usuperscript {1}\Ushiftedsubscript{2} =
+ x\Ushiftedsuperscript{1}\Usubscript {2}
+$
\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.
+\typebuffer[script]
-\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
+results in \inlinebuffer[script].
+\stopsubsection
-\subsection {Less Tracing}
+\startsubsection[title={Injecting primes with \prm {Uprimescript}}]
-\topicindex {math+tracing}
+This one is a bit special. In \LUAMETATEX\ a prime is a native element of a
+nucleus, alongside the two prescript and two postscripts. The most confusing
+combination of primes and postscripts is the case where we have a prime and
+superscript. In that case we assume that in order to avoid confusion parenthesis
+are applied so we don't covert it. That leaves three cases:
-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.
+\startbuffer[script]
+$
+ a \Uprimescript{1} \Usuperscript{2} \Usubscript {3} +
+ b \Usubscript {3} \Uprimescript{1} +
+ c \Uprimescript{1} \Usubscript {3} = d
+$
+\stopbuffer
-\stopsection
+\typebuffer[script]
-\startsection[title={Experiments}]
+This gets rendered as: \inlinebuffer[script]. In this case a subscript is handled as if
+it were an index.
-There are a couple of experimental features. They will stay but details might
-change, for instance more control over spacing. We just show some examples and
-let your imagination work it out. First we have prescripts:
+\stopsubsection
-\subsection {Prescripts with \lpr {Usuperprescript} and {Usubprescript}}
+\startsubsection[title={Prescripts with \prm {Usuperprescript} and \prm {Usubprescript}}]
\startbuffer
\hbox{$
@@ -1724,11 +2395,13 @@ $}
\typebuffer
-The question is: are these double super and subscript triggers the way to go?
-Anyway, you need to have them either being active (which in \CONTEXT\ then boils
-down to them being other characters), or say \type {\supmarkmode = 1} to disable
-the normal multiple \type {^} treatment (a value larger than 1 will also disable
-that in text mode).
+The problem with the circumflex is that it is also used for escaping character
+input. Normally that only happens in a format file so you can safely disable
+that. Alternatives are using active characters that adapt. In \CONTEXT\ we make
+them regular (other) characters in text mode and set \prm {supmarkmode} to~1 to
+disable the normal multiple \type {^} treatment (a value larger than 1 will also
+disable that in text mode). In math mode we make them active and behave as
+expected.
\blank \getbuffer \blank
@@ -1754,16 +2427,110 @@ These more verbose triggers can be used to build interfaces:
\blank \getbuffer \blank
-\subsection {Prescripts with \lpr {Usuperprescript} and {Usubprescript}}
+\stopsubsection
+
+\startsubsection[title={Allowed math commands in non|-|math modes}]
+
+\topicindex {math+text}
+\topicindex {text+math}
+
+The commands \prm {mathchar}, and \prm {Umathchar} and control sequences that are
+the result of \prm {mathchardef} or \prm {Umathchardef} are also acceptable in
+the horizontal and vertical modes. In those cases, the \prm {textfont} from the
+requested math family is used.
+
+\stopsubsection
+
+\stopsection
+
+% \startsection[title={Flattening: \prm {mathflattenmode}}]
+%
+% \topicindex {math+flattening}
+%
+% The \TEX\ math engine collapses \type {ord} noads without sub- and superscripts
+% and a character as nucleus, 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 \prm {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
+%
+% \stopsubsection
+
+
+\startsection[title={Tracing}]
+
+\topicindex {math+tracing}
+
+\startsubsection[title={Assignments}]
+
+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.
+
+\stopsubsection
+
+\startsubsection[title={\prm{tracingmath}}]
+
+The \TEX\ engine has a of places where tracing information can be generated so
+one can see what gets read and what comes out, but the math machinery is a black
+box. In \LUAMETATEX\ the math engine has been extended with tracing too.
+
+A value of one shows only the initial list, but a value of two also shows the
+intermediate lists as well as applied rules, injected spacing, injected penalties
+and parameter initialization. A value of three shows the result and larger values
+will do so with maximum breadth and depth.
+
+If you also want to see something on the console make sure to set \prm
+{tracingonline} to more than one.
+
+\stopsubsection
+
+\stopsection
+
+\startsection[title={Classes}]
+
+\startsubsection[title={Forcing classes with \prm {Umathclass}}]
You can change the class of a math character on the fly:
\startbuffer
-$x\mathopen {!}+123+\mathclose {!}x$
-$x\Umathclass4 ! +123+\Umathclass5 ! x$
-$x ! +123+ ! x$
-$x\mathclose {!}+123+\mathopen {!}x$
-$x\Umathclass5 ! +123+\Umathclass4 ! x$
+$x\mathopen {!}+123+\mathclose {!}x$
+$x\Umathclass4 `! +123+\Umathclass5 `! x$
+$x ! +123+ ! x$
+$x\mathclose {!}+123+\mathopen {!}x$
+$x\Umathclass5 `! +123+\Umathclass4 `! x$
\stopbuffer
\typebuffer
@@ -1774,6 +2541,419 @@ Watch how the spacing changes:
\getbuffer
\stoplines
+The \TEX\ engines deal with active characters in math differently as in text.
+When a character has class~8 it will be fed back into the machinery with an
+active catcode which of course assumes that there is some meaning attached.
+
+A variant on this is the use of \prm {amcode}. A character that has that code set
+and that is active when we are in math mode, will be fed back with that code as
+catcode which can be one of alignment tab, superscript, subscript, letter, other
+char, or active. This feature is still experimental. Watch out: when an already
+active character remains active we get a loop. Also, math characters are checked
+for this property too, which can then turn them active.
+
+\stopsubsection
+
+\startsubsection[title={Checking class states}]
+
+When a formula is typeset it starts out with a begin class and finishes with an end class.
+This is done by adding two \quote {fake} atoms. here are two global state variables that tell
+what the most recent edge classes are and two variables that act like registers and are
+local. There are also two registers that can be set to values that will force begin and end
+classes.
+
+The values of \prm {mathbeginclass} and \prm {mathendclass} are used when a
+formula starts and afterwards they are reset. Afterwards \prm {mathleftclass} and
+\prm {mathrightclass} have the effective edge classes. The global \prm
+{lastleftclass} and \prm {lastrightclass} variables also have the last edge
+classes but them being global they might not always reflect what you expect.
+
+\stopsubsection
+
+\startsubsection[title={Getting class spacing}]
+
+You can query the pairwise spacing of atoms with \prm {mathatomglue} and inject it with
+\prm {mathatomskip}, as in:
+
+\startbuffer
+\the\mathatomglue 5 4 \displaystyle : $[\mathatomskip 5 4 \displaystyle]$
+\stopbuffer
+
+\typebuffer
+
+and get: \inlinebuffer.
+
+\stopsubsection
+
+\startsubsection[title={Default math codes}]
+
+The probably not that useful primitive (but who knows) \prm {setdefaultmathcodes}
+initializes the mathcodes of digits to family zero and the lowercase and
+uppercase letters to family one, just as standard \TEX\ does. Don't do this in in
+\CONTEXT.
+
+\stopsubsection
+
+\stopsection
+
+\startsection[title={Modes}]
+
+\startsubsection[title={Introduction}]
+
+For most cases the math engine acts the same as in regular \TEX, apart of course
+from some font specific features that need to be supported out of the box. There
+are however ways to divert, which we do in \CONTEXT. The following paragraphs are
+therefore rather \CONTEXT\ driven and not that relevant otherwise. Some modes have
+been removed and became default and|/|ro were replaced by more granular options.
+
+\stopsubsection
+
+\startsubsection[title={Controlling display math with \prm {mathdisplaymode}}]
+
+By setting \prm {mathdisplaymode} larger than zero double math shift characters
+(normally the dollar sign) are disabled. The reason for this feature is rather
+\CONTEXT\ specific: we pay a lot attention to spacing and the build in heuristics
+don't work well with that. We also need to initialize display math as well as
+deal with whatever has to be done with respect to finalizing. Because users use
+the high level commands anyway, disabling is okay for \CONTEXT\ and less likely
+to be done for other macro packages, so be careful with this one.
+
+\stopsubsection
+
+\startsubsection[title={Skips around display math and \prm {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: \prm
+{mathdisplayskipmode}. The following values apply:
+
+\starttabulate[|c|l|]
+\DB value \BC meaning \NC \NR
+\TB
+\NC 0 \NC normal \TEX\ behavior \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
+
+\stopsubsection
+
+\startsubsection[title={Scripts}]
+
+The regular superscript trigger \type {^} and subscript trigger \type {_} are
+quite convenient and although we do have verbose aliases in regular text these
+two will be used. A multiple superscript character sequence is used for accessing
+characters by number unless you disable that via catcode manipulations. In
+\CONTEXT\ the super- and subscript characters are regular characters and only in
+math mode they have a special meaning. We can have upto for script characters and
+they indicate pre- and postscripts.
+
+\starttabulate[|c|c|c|c|]
+\NC \type {^} \NC \NC super \NC post \NC \NR
+\NC \type {_} \NC \NC sub \NC post \NC \NR
+\NC \type {^^} \NC \NC super \NC pre \NC \NR
+\NC \type {__} \NC \NC sub \NC pre \NC \NR
+\NC \type {^^^} \NC shifted \NC super \NC post \NC \NR
+\NC \type {___} \NC shifted \NC sub \NC post \NC \NR
+\NC \type {^^^^} \NC shifted \NC super \NC pre \NC \NR
+\NC \type {____} \NC shifted \NC sub \NC pre \NC \NR
+\stoptabulate
+
+The shifted variants force a script to be an index and thereby make the other
+script move. This multiple character features used to be optional but is now always
+active.
+
+Related to this is the issue of double scripts. The regular \TEX\ is to issue
+an error message, inject an ordinary node and carry on when asked to. Here we have
+\prm {mathdoublescriptmode} as escape: when set to a zero or positive value it will
+also inject an atom but with class properties determined by its value. There will
+be no error message.
+
+\starttyping
+\mathdoublescriptmode"MMLLRR % main left right
+\stoptyping
+
+% Another variable that influences rendering is \prm {mathscriptcharmode} that in
+% \CONTEXT\ we default to~1. The \prm {mathscriptboxmode} parameter determines if a
+% boxed nucleus is analyzed and is also set to~1 in \CONTEXT. Both parameters are a
+% left|-|over from the split code path approach and might still be handy for
+% experiments. They might go away some day of replaced by a different control
+% option. Older versions if \LUAMETATEX\ had optional behavior for different values
+% but that code was removed.
+
+\stopsubsection
+
+\startsubsection[title={Grouping}]
+
+When set to non zero \prm {mathgroupingmode} will make stand alone \quote {list}
+as in \typ {a {bc} d} behave like grouping instead of creating composite atoms.
+In \CONTEXT\ indeed we set it to a positive value. Although it was ot strictly
+necessary it is nicer when users don't get side effects if they revert to low
+level source coding.
+
+\stopsubsection
+
+\startsubsection[title={Slack}]
+
+The \prm {mathslackmode} parameters controls removal of accidental left and|/|or
+right space added to a formula. Of course we enable this in \CONTEXT. There is
+more detailed control possible at the atom label as well as with class options.
+
+\stopsubsection
+
+\startsubsection[title={Limit fitting \prm {mathlimitsmode}}]
+
+\topicindex {math+limits}
+
+When set, this parameter avoids too wide limits to stick out too much by sort of
+centering them.
+
+\stopsubsection
+
+\startsubsection[title={Nolimit correction with \prm {mathnolimitsmode}}]
+
+\topicindex {math+limits}
+
+There are two extra math parameters \prm {Umathnolimitsupfactor} and \prm
+{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 \prm {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 \prm {mathnolimitsmode} larger that 15 is considered to
+be a factor for the subscript correction. This feature can be handy when
+experimenting.
+
+\stopsubsection
+
+\startsubsection[title={Some spacing control with \prm {mathsurroundmode}, \prm {mathspacingmode} and \prm {mathgluemode}}]
+
+See \in {section} [spacing:surround] for more about inline spacing. The \prm
+{mathsurroundmode} parameter just permits the glue variant to kick in and indeed
+we enable it in \CONTEXT.
+
+The \prm {mathspacingmode} parameter is for tracing: normally zero inter atom
+glue is not injected but when this parameter is set to non|-|zero even zero
+spacing will show up. This permits us to check the applied inter atom spacing.
+
+The \prm {mathgluemode} bitset controls if glue can stretch and|/|or shrink. It
+is used in some of the upgraded \CONTEXT\ high level math alignment command so
+probably more qualifies as a feature specific for that usage.
+
+\starttabulate[|c|l|]
+\DB value \BC meaning \NC \NR
+\TB
+\NC 0x01 \NC obey stretch component \NC \NR
+\NC 0x02 \NC obey shrink component \NC \NR
+\LL
+\stoptabulate
+
+\stopsubsection
+
+\stopsection
+
+\startsection[title={Experiments}]
+
+There are a couple of experimental features. They will stay but details might
+change, for instance more control over spacing. We just show some examples and
+let your imagination work it out.
+
+\startsubsection[title={Scaling spacing with \prm {Umathxscale} and \prm {Umathyscale}}]
+
+These two primitives scale the horizontal and vertical scaling related
+parameters. They are set by style. There is no combined scaling primitive.
+
+\startbuffer
+$\Umathxscale\textstyle 800 a + b + x + d + e = f $\par
+$\Umathxscale\textstyle 1000 a + b + x + d + e = f $\par
+$\Umathxscale\textstyle 1200 a + b + x + d + e = f $\blank
+
+$\Umathyscale\textstyle 800 \sqrt[2]{x+1}$\quad
+$\Umathyscale\textstyle 1000 \sqrt[2]{x+1}$\quad
+$\Umathyscale\textstyle 1200 \sqrt[2]{x+1}$\blank
+\stopbuffer
+
+\typebuffer
+
+Normally only small deviations from 1000 make sense but here we want to show the
+effect and use a 20\percent\ scaling:
+
+\getbuffer
+
+\startsubsection[title={Scaling with \prm {scaledmathstyle}}]
+
+Because styles put a style switching node in the stream we have a
+scaling primitive that uses such a style node to signal dynamic
+scaling. Thisis still somewhat experimental.
+
+\startbuffer
+$
+ {\scaledmathstyle 500 x + x}\quad
+ {\scaledmathstyle 1000 x + x}\quad
+ {\scaledmathstyle 1500 x + x}
+$
+\stopbuffer
+
+\typebuffer
+
+You get differently sized math but of course you then probably also need to
+handle spacing differently, although for small deviations from 1000 is should
+come out acceptable.
+
+\stopsubsection
+
+\startsubsection[title={Spreading math with \prm {maththreshold}}]
+
+Small formulas that don't get unpacked can be made to act like glue, that is,
+they become a sort of leader and permit the par builder to prevent excessive
+spacing because the embedded inter atom glue can now participate in the
+calculations. The \prm {maththreshold} primitive is a regular glue parameter.
+
+\stopsubsection
+
+\startsubsection[title={\prm {everymathatom} and \prm {lastatomclass}}]
+
+Just for completeness we have \prm {everymathatom} as companion for \prm {everyhbox}
+and friends and it is probably just as useful. The next example shows how it works:
+
+\startbuffer
+\everymathatom
+ {\begingroup
+ \scratchcounter\lastatomclass
+ \everymathatom{}%
+ \mathghost{\hbox to 0pt yoffset -1ex{\smallinfofont \setstrut\strut \the\scratchcounter\hss}}%
+ \endgroup}
+
+$ a = \mathatom class 4 {b} + \mathatom class 5 {c} $
+\stopbuffer
+
+\typebuffer
+
+We get a formula with open- and close atom spacing applied to~$b$ and~$c$:
+
+{\getbuffer}
+
+This example shows bit of all: we want the number to be invisible to the math
+machinery so we ghost it. So, we need to make sure we don't get recursion due to
+nested injection and expansion of \prm {everymathatom} and of course we need to
+store the number. The \prm {lastatomclass} state variable is only meaningful
+inside an explicit atom wrapper like \prm {mathatom} and \prm {mathatom}.
+
+\stopsubsection
+
+\startsubsection[title={\prm {postinlinepenalty} and \prm {preinlinepenalty}}]
+
+In horizontal lists math is embedded in a begin and end math node. These nodes
+also carry information about the surrounding space, and the in \LUAMETATEX\
+optional glue. We also store a penalty so that we can let that play a role in the
+decisions to be made; these two internal integer registers control this. Just
+like the mentioned spacing they are not visible as nodes in the list.
+
+\stopsubsection
+
+\startsubsection[title={\prm {mathforwardpenalties} and \prm {mathbackwardpenalties}}]
+
+These penalties are experimental and deltas added to the regular penalties
+between atoms. Here is an example, as with other primitives that take more
+arguments the first number indicates how much follows.
+
+\startbuffer
+$ a + b + c + d + e + f + g + h = x $\par
+\mathforwardpenalties 3 300 200 100
+\mathbackwardpenalties 3 250 150 50
+$ a + b + c + d + e + f + g + h = x $\par
+\stopbuffer
+
+\typebuffer
+
+You'll notice that we apply more severe penalties at the edges:
+
+{\showmakeup[penalty]\multiply\glyphscale\plustwo \getbuffer}
+
+\stopsubsection
+
+\startsubsection[title={\prm {Umathdiscretionary} and \prm {hmcode}}]
+
+\topicindex {math+discretionaries}
+
+The usual \prm {discretionary} command is supported in math mode but it has the
+disadvantage that one needs to make sure that the content triplet does the math
+right (especially the style). This command takes an optional class specification.
+
+\starttyping
+\Umathdiscretionary [class n] {+} {+} {+}
+\stoptyping
+
+It uses the same logic as \prm {mathchoice} but in this case we handle three
+snippets in the current style.
+
+A fully automatic mechanism kicks in when a character has a \prm {hmcode} set:
+
+\starttabulate[|c|l|p|]
+\DB bit \BC meaning \BC explanation \NC \NR
+\TB
+\NC 1 \NC normal \NC a discretionary is created with the same components \NC \NR
+\NC 2 \NC italic \NC following italic correction is kept with the component \NC \NR
+\LL
+\stoptabulate
+
+So we can say:
+
+\starttyping
+\hmcode `+ 3
+\stoptyping
+
+When the \type {italic} bit is set italic correction is kept at a linebreak.
+\stopsubsection
+
\stopsection
\stopchapter
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
index c687a5a46d3..5e64422323e 100644
--- 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
@@ -1,13 +1,38 @@
-% language=uk
-
-% lua.newtable
+% language=us runpath=texruns:manuals/luametatex
\environment luametatex-style
\startcomponent luametatex-metapost
+\startluacode
+ function document.showmpcodes(what)
+ context.type("mplib."..what.."()")
+ context(": ")
+ local t = mplib[what]()
+ for i=0,#t do
+ if i > 0 then
+ context(", ")
+ end
+ context("%i: %s",i,t[i])
+ end
+ end
+\stopluacode
+
\startchapter[reference=metapost,title={The \METAPOST\ library \type {mplib}}]
+\startsection[title={Introduction}][library=mplib]
+
+The library used in \LUAMETATEX\ differs from the one used in \LUATEX. There are
+for instance no backends and the binary number model is not available. There is
+also no textual output. There are scanners and injectors that make it possible to
+enhance the language and efficiently feed back into \METAPOST. File handling is
+now completely delegated to \LUA, so there are more callbacks.
+
+{\em Some functionality is experimental and therefore documentation is limited.
+Also, details are discussed in articles.}
+
+\stopsection
+
\startsection[title={Process management}][library=mplib]
\topicindex {\METAPOST}
@@ -18,9 +43,15 @@
\libindex{version}
The \METAPOST\ library interface registers itself in the table \type {mplib}. It
-is based on \MPLIB\ version \ctxlua {context(mplib.version())}.
+is based on \MPLIB\ version \ctxlua {context(mplib.version())} (\LUATEX\ used
+version 2+). Not all functionality is described here. Once we're out of the
+experimental stage some more information will be added. Using the library boils
+down to initializing an instance, executing statements and picking up assembled
+figures in the form of \LUA\ user data objects (and from there on \LUA\ variables
+like tables).
-\subsection{\type {new}}
+
+\startsubsection[title={\type {new}}]
\libindex{new}
@@ -34,59 +65,97 @@ This creates the \type {mp} instance object. The argument is a hash table that
can have a number of different fields, as follows:
\starttabulate[|l|l|pl|pl|]
-\DB name \BC type \BC description \BC default \NC \NR
+\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 \NC \NR
-\NC \type{find_file} \NC function \NC a function to find files \NC only local files \NC \NR
-\NC \type{utf8_mode} \NC boolean \NC permit characters in the
- range 128 upto 255 to be
- part of names \NC \type {false} \NC \NR
-\NC \type{text_mode} \NC boolean \NC permit characters 2 and 3
- as fencing string literals \NC \type {false} \NC \NR
+\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 \NC \NR
+\NC \type {utf8_mode} \NC boolean \NC permit characters in the
+ range 128 upto 255 to be
+ part of names \NC \type {false} \NC \NR
+\NC \type {text_mode} \NC boolean \NC permit characters 2 and 3
+ as fencing string literals \NC \type {false} \NC \NR
+\NC \type {tolerance} \NC number \NC the value used as criterium
+ for straight lines \NC \type {131/65536} \NC \NR
+\NC \type {extensions} \NC boolean \NC enable all extensions \NC (might go) \NC \NR
\LL
\stoptabulate
-The binary mode is no longer available in the \LUATEX\ version of \MPLIB. It
+The binary mode is no longer available in the \LUAMETATEX\ 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:
+In addition to the above we need to provide functions that helps \METAPOST\
+communicate to the outside world.
-\starttyping
-<string> found = finder (<string> name, <string> mode, <string> type)
-\stoptyping
-
-with:
-
-\starttabulate[|l|p|]
-\DB name \BC the requested file \NC \NR
+\starttabulate[|l|l|pl|pl|]
+\DB name \BC type \BC argument(s) \BC result \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
+\NC \type {find_file} \NC function \NC string, string, string \NC string \NC \NR
+\NC \NC function \NC string, string, number \NC string \NC \NR
+\NC \type {open_file} \NC function \NC string, string, string \NC table \NC \NR
+\NC \NC function \NC string, string, number \NC table \NC \NR
+\NC \type {run_logger} \NC function \NC number, string \NC \NC \NR
+\NC \type {run_script} \NC function \NC string \NC whatever [, boolean] \NC \NR
+\NC \NC function \NC number \NC whatever [, boolean] \NC \NR
+\NC \type {make_text} \NC function \NC string, number \NC string \NC \NR
+\NC \type {run_internal} \NC function \NC number, number, number, string \NC \NC \NR
+\NC \type {run_overload} \NC function \NC number, string, number \NC boolean \NC \NR
+\NC \type {run_error} \NC function \NC string, string, number \NC \NC \NR
\LL
\stoptabulate
-Return either the full path name of the found file, or \type {nil} if the file
-cannot be found.
+The \type {find_file} and \type {open_file} functions should be of this form:
-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.
+\starttyping
+<string> found = find_file (<string> name, <string> mode, <string> type)
+<table> actions = open_file (<string> name, <string> mode, <string> type)
+\stoptyping
+
+where the mode is \type {r} or \type {w} and the type is \type {mp}, \type
+{data}, \type {terminal} or a number, The finder is supposed to return the full
+path name of the found file, or \type {nil} if the file cannot be found. The
+\type {open_file} is supposed to return a table with a \type {close} and \type
+{read} function. This is similar to the way we do it in \TEX. The special name
+\type {terminal} is used for interactive input. A numeric type indicates a
+specific read or write channel.
+
+The \type {run_logger} callback gets a target and a string. A target \type {1}
+means log, a value \type {2} means and \type {3} means both.
+
+The \type {run_script} function gets either a number or a string. The string
+represents a script, the number can be used as reference to something stored. The
+return value can be a boolean, number, string or table. Booleans and numbers are
+injected directly, strings and concatenated tables are fed into scantokens. When
+the second argument is true, the strings are also injected directly and tables
+are injected as pairs, colors, paths, transforms, depending on how many elements
+there are.
+
+The \type {run_internal} function triggers when internal \METAPOST\ variables
+flagged with \type {runscript} are initialized, saved or restored. The first
+argument is an index, the second the action. When initialized a third and fourth
+argument are passed. This is an experimental feature.
+
+The experimental \type {run_overload} callback kicks in when a variable (or
+macro) with a property other than zero is redefined. It gets a property, name and
+the value of \type {overloadmode} passed and when the function returns \type
+{true} redefinition is permitted.
+
+The \type {run_error} callback gets the error message, help text and current
+interaction mode passed. Normally it's best to just quit and let the user fix
+the code.
When you are processing a snippet of text starting with \type {btex} or \type
{verbatimtex} and ending with \type {etex}, the \METAPOST\ \type {texscriptmode}
@@ -106,29 +175,39 @@ Possible values are:
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.
+line and preceded by a space or at the beginning of a line. The \type {make_text}
+function can return a string that gets fed into scantokens.
+
+\stopsubsection
-\subsection{\type {statistics}}
+\startsubsection[title={\type {getstatistics}}]
\libindex{statistics}
You can request statistics with:
\startfunctioncall
-<table> stats = mp:statistics()
+<table> stats = mp:getstatistics()
\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:
+This function returns the vital statistics for an \MPLIB\ instance. Some are
+useful, others make more sense when debugging.
\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
+\NC \type {memory} \NC number \NC bytes of node memory \NC \NR
+\NC \type {hash} \NC number \NC size of the hash \NC \NR
+\NC \type {parameters} \NC number \NC allocated parameter stack \NC \NR
+\NC \type {input} \NC number \NC allocated input stack \NC \NR
+\NC \type {tokens} \NC number \NC number of token nodes \NC \NR
+\NC \type {pairs} \NC number \NC number of pair nodes \NC \NR
+\NC \type {knots} \NC number \NC number of knot nodes \NC \NR
+\NC \type {nodes} \NC number \NC number of value nodes \NC \NR
+\NC \type {symbols} \NC number \NC number of symbolic nodes \NC \NR
+\NC \type {characters} \NC number \NC number of string bytes \NC \NR
+\NC \type {strings} \NC number \NC number of strings \NC \NR
+\NC \type {internals} \NC number \NC number of internals \NC \NR
\LL
\stoptabulate
@@ -136,7 +215,9 @@ 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}}
+\stopsubsection
+
+\startsubsection[title={\type {execute}}]
\libindex{execute}
@@ -154,28 +235,93 @@ 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.
+In contrast with the normal stand alone \type {mpost} command, there is \notabene
+{no} implied \quote{input} at the start of the first chunk. When no string is
+passed to the execute function, there will still be one triggered because it then
+expects input from the terminal and you can emulate that channel with the
+callback you provide.
-\subsection{\type {finish}}
+\stopsubsection
+
+\startsubsection[title={\type {finish}}]
\libindex{finish}
+Once you create an instance it is likely that you will keep it open for
+successive processing, if only because you want to avoid loading a format each
+time. If for some reason you want to stop using an \MPLIB\ instance while
+processing is not yet actually done, you can call \type {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
+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.
+\stopsubsection
+
+\startsubsection[title={\type {settolerance} and \type {gettolerance}}]
+
+\libindex{gettolerance}
+\libindex{settolerance}
+
+These two functions relate to the bend tolerance, a value that is used when the
+export determines if a path has straight lines (like a rectangle has).
+
+\stopsubsection
+
+\startsubsection[title={Errors}]
+
+\libindex{showcontext}
+
+In case of an error you can get the context where it happened with \type
+{showcontext}.
+
+\stopsubsection
+
+\startsubsection[title={The scanner status}]
+
+\libindex {getstatus}
+\libindex {getstates}
+
+When processing a graphic an instance is in a specific state and again we have a
+getter for the (internal) values \ctxlua {document.showmpcodes ("getstates")}.
+The current status can be queried with \type {getstatus}.
+
+\stopsubsection
+
+\startsubsection[title={The hash}]
+
+\libindex {gethashentries}
+\libindex {gethashentry}
+
+Macro names and variable names are stored in a hash table. You can get a list
+with entries with \type {gethashentries}, which takes an instance as first
+argument. When the second argument is \type {true} more details will be provided.
+With \type {gethashentry} you get info about the given macro or variable.
+
+\stopsubsection
+
+\startsubsection[title={Callbacks}]
+
+\libindex{getcallbackstate}
+
+Some statistics about the number of calls to the callbacks can be queried with
+\type {getcallbackstate}, This function expects a valid instance.
+
+\stopsubsection
+
\stopsection
\startsection[title={The end result}]
+\startsubsection[title={The figure}]
+
\libindex {fields}
+\libindex {stacking}
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).
@@ -183,10 +329,6 @@ 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,
@@ -203,45 +345,42 @@ 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:
+You can check if a figure uses stacking with the \type {stacking} function. When
+objects are fetched, memory gets freed so no information about stacking is
+available then. You can get the used bend tolerance of an object with \type
+{tolerance}.
+
\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{italic} \NC function \NC the \type {fontcharit} value \NC \NR
\NC \type{charcode} \NC function \NC the (rounded) \type {charcode} value \NC \NR
+\NC \type{stacking} \NC function \NC is there a non|-|zero stacking \NC \NR
\LL
\stoptabulate
Note: you can call \type {fig:objects()} only once for any one \type {fig}
-object!
+object! Some information, like stacking, can only be queried when the complete
+figure is still present and calling up objects will free elements in the original
+once they are transferred.
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: \type {fill}, \type {outline}, \type
{text}, \type {start_clip}, \type {stop_clip}, \type {start_bounds}, \type
-{stop_bounds}, \type {special}. Each type has a different list of accessible
-values.
+{stop_bounds}, \type {start_group} and \type {stop_group}. Each type has a
+different list of accessible values.
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
@@ -249,11 +388,13 @@ 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.
+following, \type {number}s are \POSTSCRIPT\ points (base points in \TEX\ speak)
+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}
+\stopsubsection
+
+\startsubsection[title={fill}]
\starttabulate[|l|l|p|]
\DB field \BC type \BC explanation \NC \NR
@@ -266,12 +407,15 @@ point number, unless stated otherwise. Field values that are of type \type
\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
+\NC \type{stacking} \NC number \NC the stacking (level) \NC \NR
\LL
\stoptabulate
The entries \type {htap} and \type {pen} are optional.
-\subsection{outline}
+\stopsubsection
+
+\startsubsection[title={outline}]
\starttabulate[|l|l|p|]
\DB field \BC type \BC explanation \NC \NR
@@ -285,56 +429,44 @@ The entries \type {htap} and \type {pen} are optional.
\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
+\NC \type{stacking} \NC number \NC the stacking (level) \NC \NR
\LL
\stoptabulate
The entry \type {dash} is optional.
-\subsection{text}
+\stopsubsection
+
+\startsubsection[title={start_bounds, start_clip, start_group}]
\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
+\NC \type{path} \NC table \NC the list of knots \NC \NR
+\NC \type{stacking} \NC number \NC the stacking (level) \NC \NR
\LL
\stoptabulate
-\subsection{special}
+\stopsubsection
-\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
+\startsubsection[title={stop_bounds, stop_clip, stop_group}]
-\subsection{start_bounds, start_clip}
+Here we have only one key:
\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{stacking} \NC number \NC the stacking (level) \NC \NR
\LL
\stoptabulate
-\subsubsection{stop_bounds, stop_clip}
-
-Here are no fields available.
+\stopsubsection
\stopsection
\startsection[title={Subsidiary table formats}]
-\subsection{Paths and pens}
+\startsubsection[title={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
@@ -358,7 +490,9 @@ 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}
+\stopsubsection
+
+\startsubsection[title={Colors}]
A color is an integer array with 0, 1, 3 or 4 values:
@@ -376,7 +510,9 @@ 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}
+\stopsubsection
+
+\startsubsection[title={Transforms}]
Each transform is a six|-|item array.
@@ -395,7 +531,9 @@ Each transform is a six|-|item array.
Note that the translation (index 1 and 2) comes first. This differs from the
ordering in \POSTSCRIPT, where the translation comes last.
-\subsection{Dashes}
+\stopsubsection
+
+\startsubsection[title={Dashes}]
Each \type {dash} is a hash with two items. We use the same model as \POSTSCRIPT\
for the representation of the dashlist. \type {dashes} is an array of \quote {on}
@@ -409,11 +547,13 @@ and \quote {off}, values, and \type {offset} is the phase of the pattern.
\LL
\stoptabulate
-\subsection{Pens and \type {pen_info}}
+\stopsubsection
-\libindex{pen_info}
+\startsubsection[title={Pens and \type {peninfo}}]
-There is helper function (\type {pen_info(obj)}) that returns a table containing
+\libindex{peninfo}
+
+There is helper function (\type {peninfo(obj)}) that returns a table containing
a bunch of vital characteristics of the used pen (all values are floats):
\starttabulate[|l|l|p|]
@@ -429,7 +569,9 @@ a bunch of vital characteristics of the used pen (all values are floats):
\LL
\stoptabulate
-\subsection[title={Character size information}]
+\stopsubsection
+
+\startsubsection[title={Character size information}]
\libindex{char_width}
\libindex{char_height}
@@ -445,6 +587,8 @@ id in the range 0 to 255; the returned \type {w} is in AFM units.
<number> d = char_depth(mp,<string> fontname, <number> char)
\stopfunctioncall
+\stopsubsection
+
\stopsection
\startsection[title=Scanners]
@@ -457,48 +601,30 @@ still preliminary and mostly provided as reminder.
\starttabulate[|l|l|p|]
\DB scanner \BC argument \BC returns \NC \NR
\TB
-\NC \type{scan_next} \NC instance, keep \NC token, mode, type \NC \NR
-\NC \type{scan_expression} \NC instance, keep \NC type \NC \NR
-\NC \type{scan_token} \NC instance, keep \NC token, mode, kind \NC \NR
-\NC \type{scan_symbol} \NC instance, keep, expand \NC string \NC \NR
-\NC \type{scan_numeric} \NC instance, type \NC number \NC \NR
-\NC \type{scan_integer} \NC instance, type \NC integer \NC \NR
-\NC \type{scan_boolean} \NC instance, type \NC boolean \NC \NR
-\NC \type{scan_string} \NC instance, type \NC string \NC \NR
-\NC \type{scan_pair} \NC instance, hashed, type \NC table or two numbers \NC \NR
-\NC \type{scan_color} \NC instance, hashed, type \NC table or three numbers \NC \NR
-\NC \type{scan_cmykcolor} \NC instance, hashed, type \NC table or four numbers \NC \NR
-\NC \type{scan_transform} \NC instance, hashed, type \NC table or six numbers \NC \NR
-\NC \type{scan_path} \NC instance, hashed, type \NC table with hashes or arrays \NC \NR
-\NC \type{scan_pen} \NC instance, hashed, type \NC table with hashes or arrays \NC \NR
+\NC \type{scannext} \NC instance, keep \NC token, mode, type \NC \NR
+\NC \type{scanexpression} \NC instance, keep \NC type \NC \NR
+\NC \type{scantoken} \NC instance, keep \NC token, mode, kind \NC \NR
+\NC \type{scansymbol} \NC instance, keep, expand \NC string \NC \NR
+\NC \type{scannumeric} \NC instance, type \NC number \NC \NR
+\NC \type{scaninteger} \NC instance, type \NC integer \NC \NR
+\NC \type{scanboolean} \NC instance, type \NC boolean \NC \NR
+\NC \type{scanstring} \NC instance, type \NC string \NC \NR
+\NC \type{scanpair} \NC instance, hashed, type \NC table or two numbers \NC \NR
+\NC \type{scancolor} \NC instance, hashed, type \NC table or three numbers \NC \NR
+\NC \type{scancmykcolor} \NC instance, hashed, type \NC table or four numbers \NC \NR
+\NC \type{scantransform} \NC instance, hashed, type \NC table or six numbers \NC \NR
+\NC \type{scanpath} \NC instance, hashed, type \NC table with hashes or arrays \NC \NR
+\NC \type{scanpen} \NC instance, hashed, type \NC table with hashes or arrays \NC \NR
+\NC \type{scanproperty} \NC {\em todo} \NC \NC \NR
+\HL
+\NC \type{skiptoken} \NC {\em todo} \NC \NC \NR
\LL
\stoptabulate
The types and token codes are numbers but they actually depend on the
implementation (although changes are unlikely). The types of data structures can
-be queried with \type {mplib.gettypes()}:
-
-\dontleavehmode \startluacode
- local t = mplib.gettypes()
- for i=0,#t do
- if i > 0 then
- context(", ")
- end
- context("%i: %s",i,t[i])
- end
-\stopluacode .
-
-The command codes are available with \type {mplib.getcodes()}:
-
-\dontleavehmode \startluacode
- local t = mplib.getcodes()
- for i=0,#t do
- if i > 0 then
- context(", ")
- end
- context("%i: %s",i,t[i])
- end
-\stopluacode .
+be queried with \ctxlua {document.showmpcodes ("gettypes")}, and command codes
+with \ctxlua {document.showmpcodes ("getcodes")}
Now, if you really want to use these, keep in mind that the internals of
\METAPOST\ are not trivial, especially because expression scanning can be
@@ -507,6 +633,38 @@ hidden below an abstraction layer so users are not bothered by all these
look|-|ahead and push|-|back issues that originate in the way \METAPOST\ scans
its input.
+The supported color models are: \ctxlua {document.showmpcodes ("getcolormodels")}.
+
+If you want the internal codes of the possible fields in a graphic object use
+\ctxlua {document.showmpcodes ("getobjecttypes")}. You can query the id of a
+graphic object with the \type {gettype} function.
+
+\startluacode
+local t = mplib.getobjecttypes()
+local f = mplib.getfields()
+context.starttabulate { "|T|T|Tpl|" }
+ context.DB()
+ context("id")
+ context.BC()
+ context("object")
+ context.BC()
+ context("fields")
+ context.NC()
+ context.NR()
+ for i=1,#t do
+ context.NC()
+ context(i)
+ context.NC()
+ context(t[i])
+ context.NC()
+ context("% t",f[i])
+ context.NC()
+ context.NR()
+ end
+ context.LL()
+context.stoptabulate()
+\stopluacode
+
\stopsection
\startsection[title=Injectors]
@@ -521,15 +679,16 @@ optimized. The other data structures were then added for completeness.}
\starttabulate[|l|l|]
\DB scanner \BC argument \NC \NR
\TB
-\NC \type{inject_numeric} \NC instance, number \NC \NR
-\NC \type{inject_integer} \NC instance, number \NC \NR
-\NC \type{inject_boolean} \NC instance, boolean \NC \NR
-\NC \type{inject_string} \NC instance, string \NC \NR
-\NC \type{inject_pair} \NC instance, (table with) two numbers \NC \NR
-\NC \type{inject_color} \NC instance, (table with) three numbers \NC \NR
-\NC \type{inject_cmykcolor} \NC instance, (table with) four numbers \NC \NR
-\NC \type{inject_transform} \NC instance, (table with) six numbers \NC \NR
-\NC \type{inject_path} \NC instance, table with hashes or arrays, cycle, variant \NC \NR
+\NC \type{injectnumeric} \NC instance, number \NC \NR
+\NC \type{injectinteger} \NC instance, number \NC \NR
+\NC \type{injectboolean} \NC instance, boolean \NC \NR
+\NC \type{injectstring} \NC instance, string \NC \NR
+\NC \type{injectpair} \NC instance, (table with) two numbers \NC \NR
+\NC \type{injectcolor} \NC instance, (table with) three numbers \NC \NR
+\NC \type{injectcmykcolor} \NC instance, (table with) four numbers \NC \NR
+\NC \type{injecttransform} \NC instance, (table with) six numbers \NC \NR
+\NC \type{injectpath} \NC instance, table with hashes or arrays, cycle, variant \NC \NR
+\NC \type{injectwhatever} \NC instance, ont of the above depending on type and size \NC \NR
\LL
\stoptabulate
@@ -540,6 +699,63 @@ the value \type {true} the path is closed. When the fourth argument is \type
setting the \type {curl} values to~1 automatically. \footnote {This is all
experimental so future versions might provide more control.}
+This is the simplest path definition:
+
+\starttyping
+{
+ { x, y },
+ ...,
+ cycle = true
+}
+\stoptyping
+
+and this one also has the control points:
+
+\starttyping
+{
+ { x0, y0, x1, y1, x2, y2 },
+ ...,
+ cycle = true
+}
+\stoptyping
+
+A very detailed specification is this but you have to make sure that the
+parameters make sense.
+
+\starttyping
+{
+ {
+ x_coord = ...,
+ y_coord = ...,
+ left_x = ...,
+ left_y = ...,
+ right_x = ...,
+ right_y = ...,
+ left_tension = ...,
+ right_tension = ...,
+ left_curl = ...,
+ right_curl = ...,
+ direction_x = ...,
+ direction_y = ...,
+ left_type = ...,
+ right_type = ...,
+ },
+ ...,
+ cycle = true
+}
+\stoptyping
+
+Instead of the optional keyword \type {cycle} you can use \type {close}.
+
+\stopsection
+
+\startsection[title={To be checked}]
+
+\starttyping
+% solvepath
+% expandtex
+\stoptyping
+
\stopsection
\stopchapter
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
index ac283bafd76..c18a2bc485a 100644
--- 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
@@ -1,4 +1,4 @@
-% language=uk
+% language=us runpath=texruns:manuals/luametatex
\environment luametatex-style
@@ -48,14 +48,23 @@ distribution, articles and presentations. It doesn't pay of to repeat that here,
especially not in a time when users often search instead of read from cover to
cover.
+Occasionally there are extensions to \PDFTEX\ and \LUATEX\ but these are unlikely
+to en dup in \LUAMETATEX. If needed one can add functionality using \LUA. Another
+reason is that because the way we handle files and generate output being
+compatible would only harm the engine. We have some fundamental extensions that
+overcome limitations anyway. One area where the are significate changes is in
+logging: at some point it no longer made sense to be compatible (with \LUATEX)
+because we carry around more information.
+
\stopsubsection
-\startsubsection[title=Changes from \TEX\ 3.1415926...]
+\startsubsection[title={Original \TEX}]
\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.
+Of course it all starts with traditional \TEX. Even if we started with the
+\PDFTEX\ code base, most still comes from original Knuthian \TEX. But we divert a
+bit.
\startitemize
@@ -78,29 +87,40 @@ most still comes from original Knuthian \TEX. But we divert a bit.
\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. Control over discretionaries is more granular and
- now managed by less variables.
+ See \in {chapter} [languages] for quite some changes related to paragraph
+ building, language handling and hyphenation. Because we have independent runs
+ over the node list for hyphenation, kerning, ligature building, plus
+ callbacks that also can tweak the list, adding a brace group in the middle of
+ a word (like in \type {of{}fice}) does not prevent ligature creation. In
+ fact, preventing kerns and ligatures can now be done with glyph options so
+ that we don't depend on side effects of the engine. Because 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. Control over
+ discretionaries is more granular and now managed by less variables. Although
+ \LUAMETATEX\ behaves pretty much like you expect from \TEX, due to the many
+ possibilities it is unlikely that you get identical output.
\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. All
- the other large memory structures, like those related to nesting, the save
- stack, input levels, the hash table and table of equivalents, etc. now all
- start out small and are enlarged when needed, where maxima are controlled in
- the usual way. In principle the initial memory footprint is smaller while at
- the same time we can go real large. Because we have wide memory words some
- data (arrays) used for housekeeping could be reorganized a bit.
+ to remove some constraints. Token and node memory management is a bit more
+ efficient which was needed because we carry around more information. All the
+ other large memory structures, like those related to nesting, the save stack,
+ input levels, the hash table and table of equivalents, etc. now all start out
+ small and are enlarged when needed, where maxima are controlled in the usual
+ way. In principle the initial memory footprint is smaller while at the same
+ time we can go real large. Because we have wide memory words some data
+ (arrays) used for housekeeping could be reorganized a bit.
+\stopitem
+
+\startitem
+ The macro (definition and expansion) parsers are extended and we can have more
+ detailed argument parsing. This has been done in a way that keeps compatibility.
\stopitem
\startitem
@@ -113,28 +133,42 @@ most still comes from original Knuthian \TEX. But we divert a bit.
\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.
+ Because the backend is not built|-|in, the magnification (\tex {mag})
+ primitive is gone. A \tex {shipout} command 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.
+ 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. There is plenty of control over the way glyphs
+ get treated and scaling of fonts and glyphs is also more dynamic.
\stopitem
\startitem
- The \type {\outer} and \type {\long} prefixed are silently ignored. It is
- permitted to use \type {\par} in math.
+ 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. The math processing has been adapted to the new
+ (dynamic) font and glyph scaling features. Because there is more granular
+ control, for instance because there are more classes, the engine has to be
+ set up differently. This is also true for features that control how for
+ instance math fonts are processed. An intermediate, improved, variant of the
+ \LUATEX\ dual code path approach has been sacrificed in the process.
\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.
+ Math atoms and constructs like fractions, fences, radicals and accents have
+ all been extended. The new variants accept all kind of keywords that control
+ the rendering. As direct consequence noads (and nodes in general) are much
+ bigger in terms of memory usage. For now we keep the old commands available
+ but that might change when we see no eight bit fonts being used.
+\stopitem
+
+\startitem
+ The \prm {outer} and \prm {long} prefixed are silently ignored but other
+ prefixes have been added. It is permitted to use \prm {par} in math and
+ there are more such convenience options.
\stopitem
\startitem
@@ -152,14 +186,19 @@ most still comes from original Knuthian \TEX. But we divert a bit.
\stopitemize
+There is much more to say here but at least this gives an idea of what you end up
+with if you move from traditional \TEX\ to \LUAMETATEX: a more complex but also
+more flexible system.
+
\stopsubsection
-\startsubsection[title=Changes from \ETEX\ 2.2]
+\startsubsection[title={Goodies from \ETEX}]
\topicindex {\ETEX}
-Being the de|-|facto standard extension of course we provide the \ETEX\
-features, but with a few small adaptations.
+Being the de|-|facto standard extension of course we provide the \ETEX\ features,
+but only those that make sense. We used version 2.2 which is basically the only
+version that was ever released.
\startitemize
@@ -172,14 +211,19 @@ features, but with a few small adaptations.
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.
+ directionality as starting point, albeit it has been changed quite a bit, so
+ that we're probably not that far from \TEXXET. In the end right to left
+ typesetting mostly boils down to marking regions in the node list and reverse
+ flushing these in the backend. The main addition that \OMEGA\ brought was the
+ initial paragraph node that stores the direction.
\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.
+ {tracingassigns} and \prm {tracingrestores} is not there. Where \ETEX\ added
+ some tracing, \LUAMETATEX\ adds much more and also permits to set details.
+ Tracing is not compatible, if only because we have more complex nodes and do
+ more in all kind of mechanism.
\stopitem
\startitem
@@ -192,113 +236,141 @@ features, but with a few small adaptations.
Because we have more nodes, conditionals, etc.\ the \ETEX\ status related
variables are adapted to \LUAMETATEX: we use different \quote {constants},
but that should be no problem because any sane macro package uses
- abstraction.
+ abstraction. All these properties can be queried via \LUA.
\stopitem
\startitem
- The \type {\scantokens} primitive is now using the same mechanism as \LUA\
+ The \prm {scantokens} primitive is now using the same mechanism as \LUA\
print|-|to|-|\TEX\ uses, which simplifies the code. There is a little
performance hit but it will not be noticed in \CONTEXT, because we never use
this primitive.
\stopitem
\startitem
+ The \ETEX\ engine provides \prm {protected} and although we have that too,
+ the implementation is different. Users should not notice that.
+\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
\startitem
- The \prm {readline} primitive has to be implemented in \LUA. This is a side
+ The \tex {readline} primitive has to be implemented in \LUA. This is a side
effect of delegating all file \IO.
\stopitem
+\startitem
+ Most of the code is rewritten but the original primitives are still tagged as
+ coming from \ETEX.
+\stopitem
+
\stopitemize
\stopsubsection
-\startsubsection[title=Changes from \PDFTEX\ 1.40]
+\startsubsection[title={Bits of \PDFTEX}]
\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.
+\PDFTEX\ program, so we took version 1.40. 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.
+ The experimental primitives \prm {ifabsnum} and \prm {ifabsdim} have been
+ promoted to core primitives and became part of the much larger repertoire
+ of \LUAMETATEX\ conditionals. The primitives \prm {ifincsname} is also
+ inherited but has a different implementation.
\stopitem
\startitem
- The primitives \lpr {ifincsname}, \lpr {expanded} and \lpr {quitvmode}
- have become core primitives.
+ Of course \prm {quitvmode} has become a core primitive too.
\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.
+ related primitives \prm {lpcode}, \prm {rpcode}, \prm {efcode}, \prm
+ {leftmarginkern}, \prm {rightmarginkern} are promoted to core primitives. The
+ two commands \prm {protrudechars} and \prm {adjustspacing} control these
+ processes. The protrusion and kern related primitives are now dimensions
+ while expansion is still one of these 1000 based scales.
\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).
+ specific settings: \prm {adjustspacingstep} (max: 100), \prm
+ {adjustspacingstretch} (max: 1000) and \prm {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.
+ The hz optimization code has been 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. Performance in \LUAMETATEX\ should be a bit better than in
+ \PDFTEX\ although of course its 32 bit machinery is in general slower than
+ the eight bit \PDFTEX.
\stopitem
\startitem
- When \lpr {adjustspacing} has value~2, hz optimization will be applied to
+ When \prm {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.
\stopitem
\startitem
- When \lpr {protrudechars} has a value larger than zero characters at the edge
+ When \prm {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
+ The pixel multiplier dimension \prm {pxdimen} has be inherited as core
primitive.
\stopitem
\startitem
- The primitive \lpr {tracingfonts} is now a core primitive but doesn't relate
+ The primitive \prm {tracingfonts} is now a core primitive but doesn't relate
to the backend.
\stopitem
+\startitem
+ The image inclusion code was already different in \LUATEX\ and is gone in
+ \LUAMETATEX\ which has no backend. One can implement the same abstraction
+ layer (aka resouces) using \LUA.
+\stopitem
+
\stopitemize
+Even if not that much is present from \PDFTEX\ in \LUAMETATEX\ we still see it as
+its ancestor. After all, without \PDFTEX\ the \TEX\ community would not be where
+it is now. We still use it as reference when we check something (that we
+changed).
+
\stopsubsection
-\startsubsection[title=Changes from \ALEPH\ RC4]
+\startsubsection[title=Direcionality from \ALEPH]
\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.
+In \LUATEX\ we took the 32 bit aspects of \ALEPH\ RC4, the stable version of
+\OMEGA\ that also integrated \ETEX. In \LUATEX\ we also took 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 this is left. We only have two
+horizontal directions. Instead of vertical directions we introduce an orientation
+model bound to boxes. We kept the initial par node, local boxes (that also use
+par nodes) and directional nodes.
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
@@ -318,7 +390,8 @@ Here is a summary of inherited functionality:
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.
+ don't support the odd number of \type {^^^^^} either. This kind of parsing
+ can be disabled in \LUAMETATEX.
\stopitem
\startitem
@@ -338,11 +411,22 @@ Here is a summary of inherited functionality:
take a number. The three letter codes are dropped.
\stopitem
+\startitem
+ The local box mechamism has been extended and redone which permits a more
+ generalized and robust usage.
+\stopitem
+
\stopitemize
+Most of the directional work is actually up to the backend. As \OMEGA\ never had
+a \PDF\ backend, the \LUATEX\ took care of the many directions. We now only have
+two directions so the backend code that has to be provided can be relatively
+simple. The biggest complication is in handling fonts and synchronizing the glyph
+streams. Much is also macro package (and usage) dependent.
+
\stopsubsection
-\startsubsection[title=Changes from standard \WEBC]
+\startsubsection[title={No longer \WEBC}]
\topicindex {\WEBC}
@@ -352,6 +436,30 @@ 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.
+The biggest consequence of this is that there are no dependencies, also not on
+ever changing libraries that we occasionally see break compilation of \LUATEX.
+Even on older machines (say 2013\endash2020) compilation should be sub minute.
+The amount of platform specific code is minimal.
+
+\stopsubsection
+
+\startsubsection[title={The follow up on \LUATEX}]
+
+\topicindex {\LUATEX}
+
+This engine is a follow up on \LUATEX, that became more or less frozen after
+version 1.10, so that is the version we started from. Apart from reorganizing the
+code base, simplifying the build, limiting dependencies etc.\ this project also
+adds new functionality and removes some as well. The main differences are
+discussed in a separate section. The basic ideas remain the same but the engine
+is not downward compatible. This is why we have \CONTEXT\ \MKIV\ for \LUATEX\ and
+\CONTEXT\ \LMTX\ for \LUAMETATEX .
+
+There is no \LUAJIT\ version of \LUAMETATEX, simply because there is not that
+much gain in the average run (at least not in \CONTEXT. Depending on the kind of
+documents, complexity of macro code and usage of \LUA, the \LUAMETATEX\ engine
+can be upto 30\percent\ faster than \LUATEX\ anyway.
+
\stopsubsection
\stopsection
@@ -376,13 +484,13 @@ The Program mostly applies!
\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
+and \prm {uccode} (and the new \prm {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}
+The \prm {catcode}, \prm {sfcode}, \prm {lccode}, \prm {uccode} and \prm {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.
@@ -477,11 +585,26 @@ that over time system dependencies have been handles with \TEX\ change files, th
\WEBC\ infrastructure, \KPSE\ features, compilation variables and flags, etc. In
\LUAMETATEX\ we try to minimize all that.
+When it became unavoidable that we output more detail, it also became clear that
+it made no sense to stay log and trace compatible. Some is controlled by
+parameters in order to stay close the original, but \CONTEXT\ is configured such
+that we benefit from the new possibilities. Examples are that in addition to
+\prm {meaning} we have \prm {meaningfull} that also exposes macro properties,
+and \prm {meaningless} that only exposes the body. The \prm {untraced} prefix
+will suppress some in the log, and we set \prm {tracinglevels} to 3 in order to
+get details about the input and grouping level. When there's less shown than
+expected keep in mind that \LUAMETATEX\ has a somewhat optimized saving and
+restoring of meanings so less can happen which is reflected in tracing. When node
+lists are serialized (as with \prm {showbox}) some nodes, like discretionaries
+report more detail. The compact serializer, used for instance to signal overfull
+boxes, also shows a bit more detail with respect to non|-|content nodes. I math
+more is shown if only because we have more control and additional mechanisms.
+
\stopsubsection
\startsubsection[title=Parsing]
-Token parsers have been upgraded for the sake of \LUA, \type {\csname} handling
+Token parsers have been upgraded for the sake of \LUA, \prm {csname} handling
has been extended, macro definitions can be more flexible so there code was
adapted, more conditionals also brought some changes. But we build upon the
(reorganized) \TEX\ foundation so the basics can definitely be recognized.
@@ -495,10 +618,10 @@ The reworked \LUAMETATEX\ engine is substantially faster than the \LUATEX\
predecessor.
The handling of conditionals has been adapted so that we can have flatter
-branches (\type {\orelse} cum suis). This again has some consequences for
+branches (\prm {orelse} cum suis). This again has some consequences for
parsing. Because parsing alignments is rather interwoven in general parsing and
expansion the handling of related primitives has been slightly adapted (also for
-the sake of \LUA\ interfacing) and dealing with \type {\noalign} situations is a
+the sake of \LUA\ interfacing) and dealing with \prm {noalign} situations is a
bit more convenient.
This are just a few of the adaptations and most of this happened stepwise with
@@ -507,6 +630,430 @@ different extension to the original. You're warned.
\stopsubsection
+\startsubsection[title=Changes in keyword scanning]
+
+\topicindex {keywords}
+
+Some primitives accept (optional) keywords and in \LUAMETATEX\ there are more
+keywords than in \LUATEX. Scanning can trigger error messages and lookahead side
+effects and in \LUAMETATEX\ these can be different. This is no big deal because
+errors are still errors.
+
+\stopsubsection
+
+\startsection[reference=differences,title={Differences with \LUATEX}]
+
+\startsubsection[title=Dropped primitives]
+
+As \LUAMETATEX\ is a leaner and meaner \LUATEX. This means that substantial parts and
+dependencies are gone: quite some font code, all backend code with related frontend
+code and of course image and font inclusion. There is also new functionality which
+makes for less lean but in the end we still have less, also in terms of dependencies.
+This chapter will discuss what is gone. We start with the primitives that were dropped.
+
+\starttabulate[|l|pl|]
+\BC fonts \NC \type {\letterspacefont}
+ \type {\copyfont}
+ \type {\expandglyphsinfont}
+ \type {\ignoreligaturesinfont}
+ \type {\tagcode}
+ \type {\leftghost}
+ \type {\rightghost}
+ \NC \NR
+\BC backend \NC \type {\dviextension}
+ \type {\dvivariable }
+ \type {\dvifeedback}
+ \type {\pdfextension}
+ \type {\pdfvariable }
+ \type {\pdffeedback}
+ \type {\dviextension}
+ \type {\draftmode}
+ \type {\outputmode}
+ \NC \NR
+\BC dimensions \NC \type {\pageleftoffset}
+ \type {\pagerightoffset}
+ \type {\pagetopoffset}
+ \type {\pagebottomoffset}
+ \type {\pageheight}
+ \type {\pagewidth}
+ \NC \NR
+\BC resources \NC \type {\saveboxresource}
+ \type {\useboxresource}
+ \type {\lastsavedboxresourceindex}
+ \type {\saveimageresource}
+ \type {\useimageresource}
+ \type {\lastsavedimageresourceindex}
+ \type {\lastsavedimageresourcepages}
+ \NC \NR
+\BC positioning \NC \type {\savepos}
+ \type {\lastxpos}
+ \type {\lastypos}
+ \NC \NR
+\BC directions \NC \type {\textdir}
+ \type {\linedir}
+ \type {\mathdir}
+ \type {\pardir}
+ \type {\pagedir}
+ \type {\bodydir}
+ \type {\pagedirection}
+ \type {\bodydirection}
+ \NC \NR
+\BC randomizer \NC \type {\randomseed}
+ \type {\setrandomseed}
+ \type {\normaldeviate}
+ \type {\uniformdeviate}
+ \NC \NR
+\BC utilities \NC \type {\synctex}
+ \NC \NR
+\BC extensions \NC \type {\latelua}
+ \type {\lateluafunction}
+ \type {\openout}
+ \type {\write}
+ \type {\closeout}
+ \type {\openin}
+ \type {\read}
+ \type {\readline}
+ \type {\closein}
+ \type {\ifeof}
+ \NC \NR
+\BC control \NC \type {\suppressfontnotfounderror}
+ \type {\suppresslongerror}
+ \type {\suppressprimitiveerror}
+ \type {\suppressmathparerror}
+ \type {\suppressifcsnameerror}
+ \type {\suppressoutererror}
+ \type {\mathoption}
+ \NC \NR
+\BC system \NC \type {\primitive}
+ \type {\ifprimitive}
+ \type {\formatname}
+ \NC \NR
+\BC ignored \NC \type {\long}
+ \type {\outer}
+ \type {\mag}
+ \NC \NR
+\stoptabulate
+
+The math machinery has been overhauled stepwise. In the process detailed control
+has been added but later some of that got removed or replaced. The engine now
+assumes that \OPENTYPE\ fonts are used but you do need to set up the engine
+properly, something that has to be done with respect to fonts anyway. By enabling
+and|/|disabling certain features you can emulate the traditional engine. Font
+parameters no longer are taken from the traditional parameters when they are not
+set. We just assume properly passed so called math constants and quite a few new
+ones have been added.
+
+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.
+Because we can hook in \LUA\ functions that get information about what is expected
+(consumer or provider) there are plenty possibilities for adding functionality
+using this scripting language.
+
+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 \prm
+{outer} and \prm {long} prefixes are gone as they don't make much sense
+nowadays and them becoming dummies opened the way to something new: control
+sequence properties that permit protection against as well as controlled
+overloading of definitions. I don't think that (\CONTEXT) users will notice these
+prefixes being gone. The definition and parsing related \type {\suppress..}
+features are now default and can't be changed so related primitives are gone.
+
+The \prm {shipout} primitive does no ship out but just erases the content of
+the box unless of course that has happened already in another way. A macro
+package should implement its own backend and related shipout. Talking of backend,
+the extension primitives that relate to backends 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 but we have an up to
+date \PDF\ parsing library on board.
+
+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, as mentioned, only generic whatsit
+nodes that can be used for some management related tasks. For instance you can
+use them to implement user nodes. More extensive status information is provided
+in the overhauled status library. All libraries have additional functionality and
+names of functions have been normalized (for as far as possible).
+
+The margin kern nodes are gone and we now use regular kern nodes for them. As a
+consequence there are two extra subtypes indicating the injected left or right
+kern. The glyph field served no real purpose so there was no reason for a special
+kind of node.
+
+The \KPSE\ library is no longer built|-|in, but one can use an external \KPSE\
+library, assuming that it is present on the system, because the engine has a so
+called optional library interface to it. 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_format_file open_data_file
+\stoptyping
+
+The callbacks related to errors are changed:
+
+\starttyping
+intercept_tex_error intercept_lua_error
+show_error_message show_warning_message
+\stoptyping
+
+There is a hook that gets called when one of the fundamental memory structures
+gets reallocated.
+
+\starttyping
+trace_memory
+\stoptyping
+
+When you use the overload protect mechanisms, a callback can be plugged in to handle
+exceptions:
+
+\starttyping
+handle_overload
+\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
+
+Because tracing boxes now reports a lot more information, we have a plug in for
+detail:
+
+\starttyping
+get_attribute
+\stoptyping
+
+Being the core of extensibility, the typesetting callbacks of course stayed. This
+is what we ended up with:
+
+\startalign[flushleft,nothyphenated]
+\tt \cldcontext{table.concat(table.sortedkeys(callbacks.list), ", ")}
+\stopalign
+
+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. All input goes via \LUA, even the console. One can program a terminal if
+needed.
+
+We took our time for reaching a stable state in \LUATEX. Among the reasons is the
+fact that most was experimented with in \CONTEXT, which we can adapt to the
+engine as we go. It took many years to decide what to keep and how to do things.
+Of course there are places when things can be improved but that most likely only
+happens 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, when the source code
+has become 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 quite a bit 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. In \CONTEXT\ we
+quit on an error simply because one has to fix source anyway and runs are fast
+enough. Logging provides more detail and new primitives can be used to prevent
+clutter in tracing (the more complex a macro package becomes, the more extreme
+tracing becomes).
+
+\stopsubsection
+
+\startsubsection[title=New primitives]
+
+There are new primitives 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! There are for instance a few
+csname related definers, we have integer and dimension constants, the macro
+argument parser can be brought in tolerant mode, the repertoire of conditionals
+has been extended, some internals can be controlled (think of normalization of
+lines, hyphenation etc.), and macros can be protected against user overload. Not
+all is discussed in detail in this manual but there are introductions in the
+\CONTEXT\ distribution that explain them. But the \TEX\ kernel is of course
+omnipresent.
+
+\startluacode
+
+local luametatex = tex.primitives()
+local luatex = table.load("luatex-primitives.lua")
+
+if not luatex then
+ local tex = "\\starttext \\ctxlua {table.save(tex.jobname .. '.lua',tex.primitives())} \\stoptext"
+
+ io.savedata("luatex-primitives.tex", tex)
+
+ os.execute("context --luatex --once luatex-primitives")
+
+ luatex = table.load("luatex-primitives.lua")
+end
+
+
+if luatex and luametatex then
+
+ local match = string.match
+
+ local found = { }
+
+ local function collect(index)
+ if index then
+ local data = index.entries
+ for i=1,#data do
+ found[match(data[i].list[1][1],"\\tex%s*{(.-)}") or ""] = true
+ end
+ -- inspect(found)
+ end
+ end
+
+ collect(structures.registers.collected and structures.registers.collected.texindex)
+ collect(structures.registers.collected and structures.registers.collected.luatexindex)
+
+ luatex = table.tohash(luatex)
+ luametatex = table.tohash(luametatex)
+
+ -- context.page()
+
+ context("The following primitives are available in \\LUATEX\\ but not in \\LUAMETATEX. ")
+ context("Some of these are emulated in \\CONTEXT.")
+
+ context.blank()
+ context.startcolumns { n = 2 }
+ for k, v in table.sortedhash(luatex) do
+ if not luametatex[k] then
+ if not found[k] then
+ context.dontleavehmode()
+ end
+ context.type(k)
+ context.crlf()
+ end
+ end
+ context.stopcolumns()
+ context.blank()
+
+ -- context.page()
+
+ context("The following primitives are available in \\LUAMETATEX\\ only. In the meantime ")
+ context("the \\LUAMETATEX\\ code base is so different from \\LUATEX\\ that backporting ")
+ context("is no longer reasonable.")
+
+ context.blank()
+ context.startcolumns { n = 2 }
+ for k, v in table.sortedhash(luametatex) do
+ if not luatex[k] then
+ if not found[k] then
+ context.dontleavehmode()
+ context.llap("\\infofont[todo] ")
+ end
+ context.type(k)
+ context.crlf()
+ end
+ end
+ context.stopcolumns()
+ context.blank()
+
+end
+
+\stopluacode
+
+\stopsubsection
+
+\startsubsection[title=Changed function names]
+
+As part of a bit more consistency some function names also changed. Names with an
+\type {_} got that removed (as that was the minority). It's easy to provide a
+back mapping if needed (just alias the functions).
+
+{\em Todo: only mention the \LUATEX\ ones.}
+
+\starttabulate[|l|l|l|l|]
+\DB library \BC old name \BC new name \BC comment \NC \NR
+\TB
+\NC language \NC clear_patterns \NC clearpatterns \NC \NR
+\NC \NC clear_hyphenation \NC clearhyphenation \NC \NR
+\NC mplib \NC italcor \NC italic \NC \NR
+\NC \NC pen_info \NC peninfo \NC \NR
+\NC \NC solve_path \NC solvepath \NC \NR
+\NC texio \NC write_nl \NC writenl \NC old name stays \NC \NR
+\NC node \NC protect_glyph \NC protectglyph \NC \NR
+\NC \NC protect_glyphs \NC protectglyphs \NC \NR
+\NC \NC unprotect_glyph \NC unprotectglyph \NC \NR
+\NC \NC unprotect_glyphs \NC unprotectglyphs \NC \NR
+\NC \NC end_of_math \NC endofmath \NC \NR
+\NC \NC mlist_to_hlist \NC mlisttohlist \NC \NR
+\NC \NC effective_glue \NC effectiveglue \NC \NR
+\NC \NC has_glyph \NC hasglyph \NC \NR
+\NC \NC first_glyph \NC firstglyph \NC \NR
+\NC \NC has_field \NC hasfield \NC \NR
+\NC \NC copy_list \NC copylist \NC \NR
+\NC \NC flush_node \NC flushnode \NC \NR
+\NC \NC flush_list \NC flushlist \NC \NR
+\NC \NC insert_before \NC insertbefore \NC \NR
+\NC \NC insert_after \NC insertafter \NC \NR
+\NC \NC last_node \NC lastnode \NC \NR
+\NC \NC is_zero_glue \NC iszeroglue \NC \NR
+\NC \NC make_extensible \NC makeextensible \NC \NR
+\NC \NC uses_font \NC usesfont \NC \NR
+\NC \NC is_char \NC ischar \NC \NR
+\NC \NC is_direct \NC isdirect \NC \NR
+\NC \NC is_glyph \NC isglyph \NC \NR
+\NC \NC is_node \NC isnode \NC \NR
+\NC token \NC scan_keyword \NC scankeyword \NC \NR
+\NC \NC scan_keywordcs \NC scankeywordcs \NC \NR
+\NC \NC scan_int \NC scanint \NC \NR
+\NC \NC scan_real \NC scanreal \NC \NR
+\NC \NC scan_float \NC scanfloat \NC \NR
+\NC \NC scan_dimen \NC scandimen \NC \NR
+\NC \NC scan_glue \NC scanglue \NC \NR
+\NC \NC scan_toks \NC scantoks \NC \NR
+\NC \NC scan_code \NC scancode \NC \NR
+\NC \NC scan_string \NC scanstring \NC \NR
+\NC \NC scan_argument \NC scanargument \NC \NR
+\NC \NC scan_word \NC scanword \NC \NR
+\NC \NC scan_csname \NC scancsname \NC \NR
+\NC \NC scan_list \NC scanlist \NC \NR
+\NC \NC scan_box \NC scanbox \NC \NR
+\LL
+\stoptabulate
+
+It's all part of trying to make the code base consistent but it is sometimes a
+bit annoying. However, that's why we develop this engine independent of the
+\LUATEX\ code base. It's anyway a change that has been on my todo list for quite
+a while because those inconsistencies annoyed me. It might take some years to
+get all done.
+
+\stopsubsection
+
\stopsection
\stopchapter
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
index 6773d346d78..c3ac0a29489 100644
--- 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
@@ -1,4 +1,4 @@
-% language=uk
+% language=us runpath=texruns:manuals/luametatex
\environment luametatex-style
@@ -14,23 +14,15 @@
\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
+\TEX's nodes are represented in \LUA\ as user data objects with a variable set of
+fields or by a numeric identifier when requested. When you print a node user data
object you will see these numbers. In the following syntax tables the type of
-such a userdata object is represented as \syntax {<node>}.
+such a user data 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
@@ -94,22 +86,22 @@ 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
+\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
+\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
+\NC \type{glueorder} \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
+\NC \type{glueset} \NC number \NC the calculated glue ratio \NC \NR
+\NC \type{gluesign} \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
@@ -133,9 +125,10 @@ more sense.
\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}.
+Contrary to traditional \TEX, \LUATEX\ has more \prm {hrule} and \prm {vrule}
+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
@@ -194,7 +187,7 @@ This node relates to the \prm {insert} primitive and support the fields: \showfi
\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}.
+\type {stretch}, \type {stretchorder}, \type {shrink} and \type {shrinkorder}.
These are all numbers.
A warning: never assign a node list to the \type {head} field unless you are sure
@@ -303,14 +296,14 @@ Math nodes represent the boundaries of a math formula, normally wrapped into
\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
+\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{stretchorder} \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{shrinkorder} \NC number \NC factor applied to shrink amount \NC \NR
\LL
\stoptabulate
@@ -326,21 +319,21 @@ The glue fields only kick in when the \type {surround} fields is zero.
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
+components of a skip internally is called a \nod {gluespec}. 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
+\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
+\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{stretchorder} \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{shrinkorder} \NC number \NC factor applied to shrink amount \NC \NR
\LL
\stoptabulate
@@ -350,14 +343,14 @@ 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
+the content fit in the available space. The \type {effectiveglue} 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}]
+\startsubsection[title={\nod {gluespec} nodes}]
\topicindex {nodes+glue}
\topicindex {gluespec}
@@ -368,7 +361,7 @@ is not seen in node lists. For instance the state of expression scanning (\type
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
+{gluespec}, 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
@@ -377,13 +370,13 @@ 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
+\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
+\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{stretchorder} \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{shrinkorder} \NC number \NC factor applied to shrink amount \NC \NR
\LL
\stoptabulate
@@ -403,12 +396,12 @@ 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
+\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
+\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} \NC number \NC multiplier related to hz for font kerns \NC \NR
\LL
\stoptabulate
@@ -449,30 +442,30 @@ it considers some input to be text. Glyph nodes are relatively large and have ma
fields: \showfields {glyph}.
\starttabulate[|l|l|p|]
-\DB field \BC type \BC explanation \NC \NR
+\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{language} \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{state} \NC number \NC a user field (replaces the component list) \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
+\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{language} \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{state} \NC number \NC a user field (replaces the component list) \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} \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.
-Valid bits for the \type {subtype} field are:
+\type {expansion} is assigned in the par builder and used in the backend. Valid
+bits for the \type {subtype} field are:
\starttabulate[|c|l|]
\DB bit \BC meaning \NC \NR
@@ -485,8 +478,8 @@ Valid bits for the \type {subtype} field are:
\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
+The \type {expansion} 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
@@ -494,17 +487,22 @@ 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
+The \type {ischar} 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
+returned. The \type {isglyph} 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
+making more readable tests. The \type {usesfont} helpers takes a node
and font id and returns true when a glyph or disc node references that font.
+The \type {isnextchar} and \type {isprevchar} return a next node, a character
+code (or false) and an node id or next character code. The four \type {is}
+checkers take a node and optionally a font, data, state, scale, xscale and yscale
+value that are then checked.
+
\stopsubsection
\startsubsection[title={\nod {boundary} nodes}]
@@ -536,22 +534,22 @@ This node is inserted at the start of a paragraph. You should not mess
too much with this one. Valid fields are: \showfields {par}.
\starttabulate[|l|l|p|]
-\DB field \BC type \BC explanation \NC \NR
+\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
+\NC \type{attr} \NC node \NC list of attributes \NC \NR
+\NC \type{interlinepenalty} \NC number \NC local interline penalty (from \prm {localinterlinepenalty}) \NC \NR
+\NC \type{brokenpenalty} \NC number \NC local broken penalty (from \prm {localbrokenpenalty}) \NC \NR
+\NC \type{dir} \NC string \NC the direction of this par. see~\in [dirnodes] \NC \NR
+\NC \type{leftbox} \NC node \NC the \prm {localleftbox} \NC \NR
+\NC \type{leftboxwidth} \NC number \NC width of the \prm {localleftbox} \NC \NR
+\NC \type{rightbox} \NC node \NC the \prm {localrightbox} \NC \NR
+\NC \type{rightboxwidth} \NC number \NC width of the \prm {localrightbox} \NC \NR
+\NC \type{middlebox} \NC node \NC the \prm {localmiddlebox} (zero width) \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.
+A warning: never assign a node list to one of the box fields unless you are sure
+its internal link structure is correct, otherwise an error may result.
\stopsubsection
@@ -561,7 +559,7 @@ error may result.
\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
+and the \prm {textdirection} command generates them. Again this is a small node, we
just have \showfields {dir}.
\starttabulate[|l|l|p|]
@@ -612,8 +610,8 @@ 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 {delimiter}. These are endpoints and therefore the
+or math lists or node lists: \type {mathchar}, \type {mathtextchar}, {subbox}
+and \type {submlist} and \type {delimiter}. 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
@@ -639,10 +637,10 @@ are common:
\stopsubsubsection
-\startsubsubsection[title={\nod {math_char} and \nod {math_text_char} subnodes}]
+\startsubsubsection[title={\nod {mathchar} and \nod {mathtextchar} subnodes}]
These are the most common ones, as they represent characters, and they both have
-the same fields: \showfields {math_char}.
+the same fields: \showfields {mathchar}.
\starttabulate[|l|l|p|]
\DB field \BC type \BC explanation \NC \NR
@@ -653,20 +651,20 @@ the same fields: \showfields {math_char}.
\LL
\stoptabulate
-The \nod {math_char} is the simplest subnode field, it contains the character and
+The \nod {mathchar} 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
+to a font. The \nod {mathtextchar} 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}]
+\startsubsubsection[title={\nod {subbox} and \nod {submlist} 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},
+These two subnode types are used for subsidiary list items. For \nod {subbox},
+the \type {list} points to a \quote {normal} vbox or hbox. For \nod {submlist},
the \type {list} points to a math list that is yet to be converted. Their fields
-are: \showfields {sub_box}.
+are: \showfields {subbox}.
\starttabulate[|l|l|p|]
\DB field \BC type \BC explanation \NC \NR
@@ -688,19 +686,19 @@ before, the \type {next} and \type {prev} fields are unused, but we do have:
\showfields {delimiter}.
\starttabulate[|l|l|p|]
-\DB field \BC type \BC explanation \NC \NR
+\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
+\NC \type{attr} \NC node \NC list of attributes \NC \NR
+\NC \type{smallchar} \NC number \NC character index of base character \NC \NR
+\NC \type{smallfamily} \NC number \NC family number of base character \NC \NR
+\NC \type{largechar} \NC number \NC character index of next larger character \NC \NR
+\NC \type{largefamily} \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}.
+The fields \type {largechar} and \type {largefamily} can be zero, in that case
+the font that is set for the \type {smallfamily} is expected to provide the large
+version as an extension to the \type {smallchar}.
\stopsubsubsection
@@ -731,13 +729,13 @@ Accent nodes deal with stuff on top or below a math constructs. They support:
\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
+\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{topaccent} \NC kernel node \NC top accent \NC \NR
+\NC \type{bottomaccent} \NC kernel node \NC bottom accent \NC \NR
+\NC \type{fraction} \NC number \NC larger step criterium (divided by 1000) \NC \NR
\LL
\stoptabulate
@@ -812,7 +810,7 @@ is correct, otherwise an error can be triggered.
\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{degree} \NC kernel node \NC only set by \prm {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
@@ -826,22 +824,22 @@ 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
+\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
+\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{numerator} \NC kernel node \NC numerator \NC \NR
+\NC \type{denominator} \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.
+Warning: never assign a node list to the \type {numerator}, or \type
+{denominator} field unless you are sure its internal link structure is correct,
+otherwise an error can result.
\stopsubsubsection
@@ -878,7 +876,7 @@ renderer and might get adapted in the process.
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.
+user data. 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}.
@@ -886,7 +884,7 @@ Each node has at least the three fields \type {next}, \type {id}, and \type
\startitemize[intro]
\startitem
- The \type {next} field returns the userdata object for the next node in a
+ The \type {next} field returns the user data object for the next node in a
linked list of nodes, or \type {nil}, if there is no next node.
\stopitem
@@ -1027,10 +1025,10 @@ there is no node with that id.
\stopsubsubsection
-\startsubsubsection[title={\type {fields} and \type {has_field}}]
+\startsubsubsection[title={\type {fields} and \type {hasfield}}]
\libindex {fields}
-\libindex {has_field}
+\libindex {hasfield}
This function returns an indexed table with valid field names for a particular
type of node.
@@ -1043,11 +1041,11 @@ 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}
+The \type {hasfield} 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)
+<boolean> t = node.hasfield(<node> n, <string> field)
\stopfunctioncall
This function probably is not that useful but some nodes don't have a \type
@@ -1055,18 +1053,18 @@ This function probably is not that useful but some nodes don't have a \type
\stopsubsubsection
-\startsubsubsection[title={\type {is_node}}]
+\startsubsubsection[title={\type {isnode}}]
\topicindex {nodes+functions}
-\libindex {is_node}
+\libindex {isnode}
\startfunctioncall
-<boolean|integer> t = node.is_node(<any> item)
+<boolean|integer> t = node.isnode(<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.
+is a user data object of type \type {<node>} and false when no node is passed.
\stopsubsubsection
@@ -1090,11 +1088,11 @@ back somehow.
\stopsubsubsection
-\startsubsubsection[title={\type {free}, \type {flush_node} and \type {flush_list}}]
+\startsubsubsection[title={\type {free}, \type {flushnode} and \type {flushlist}}]
\libindex{free}
-\libindex{flush_node}
-\libindex{flush_list}
+\libindex{flushnode}
+\libindex{flushlist}
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
@@ -1104,11 +1102,11 @@ 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)
+flushnode(<node> n)
\stopfunctioncall
The \type {free} function returns the next field of the freed node, while the
-\type {flush_node} alternative returns nothing.
+\type {flushnode} 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
@@ -1116,19 +1114,19 @@ from a register or some \type {next} field: it is up to you to make sure that th
internal data structures remain correct.
\startfunctioncall
-node.flush_list(<node> n)
+node.flushlist(<node> n)
\stopfunctioncall
-When you free for instance a discretionary node, \type {flush_list} is applied to
+When you free for instance a discretionary node, \type {flushlist} 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}}]
+\startsubsubsection[title={\type {copy} and \type {copylist}}]
\libindex{copy}
-\libindex{copy_list}
+\libindex{copylist}
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.
@@ -1141,8 +1139,8 @@ 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)
+<node> m = node.copylist(<node> n)
+<node> m = node.copylist(<node> n, <node> m)
\stopfunctioncall
Note that you cannot copy attribute lists this way. However, there is normally no
@@ -1248,12 +1246,12 @@ changed. When the third argument is passed, the node is freed.
\stopsubsubsection
-\startsubsubsection[title={\type {insert_before}}]
+\startsubsubsection[title={\type {insertbefore}}]
-\libindex {insert_before}
+\libindex {insertbefore}
\startfunctioncall
-<node> head, new = node.insert_before(<node> head, <node> current, <node> new)
+<node> head, new = node.insertbefore(<node> head, <node> current, <node> new)
\stopfunctioncall
This function inserts the node \type {new} before \type {current} into the list
@@ -1265,12 +1263,12 @@ will become \type {new}.
\stopsubsubsection
-\startsubsubsection[title={\type {insert_after}}]
+\startsubsubsection[title={\type {insertafter}}]
-\libindex {insert_after}
+\libindex {insertafter}
\startfunctioncall
-<node> head, new = node.insert_after(<node> head, <node> current, <node> new)
+<node> head, new = node.insertafter(<node> head, <node> current, <node> new)
\stopfunctioncall
This function inserts the node \type {new} after \type {current} into the list
@@ -1281,12 +1279,12 @@ field). If \type {head} is initially \type {nil}, it will become \type {new}.
\stopsubsubsection
-\startsubsubsection[title={\type {last_node}}]
+\startsubsubsection[title={\type {lastnode}}]
-\libindex {last_node}
+\libindex {lastnode}
\startfunctioncall
-<node> n = node.last_node()
+<node> n = node.lastnode()
\stopfunctioncall
This function pops the last node from \TEX's \quote{current list}. It returns
@@ -1343,12 +1341,12 @@ If the above is unclear to you, see the section \quote {For Statement} in the
\stopsubsubsection
-\startsubsubsection[title={\type {traverse_id}}]
+\startsubsubsection[title={\type {traverseid}}]
-\libindex {traverse_id}
+\libindex {traverseid}
\startfunctioncall
-<node> t, subtype = node.traverse_id(<number> id, <node> n)
+<node> t, subtype = node.traverseid(<number> id, <node> n)
\stopfunctioncall
This is an iterator that loops over all the nodes in the list that starts at
@@ -1374,37 +1372,37 @@ See the previous section for details. The change is in the local function \type
\stopsubsubsection
-\startsubsubsection[title={\type {traverse_char} and \type {traverse_glyph}}]
+\startsubsubsection[title={\type {traversechar} and \type {traverseglyph}}]
-\libindex {traverse_char}
-\libindex {traverse_glyph}
+\libindex {traversechar}
+\libindex {traverseglyph}
-The \type{traverse_char} iterator loops over the \nod {glyph} nodes in a list.
+The \type {traversechar} iterator loops over the \nod {glyph} nodes in a list.
Only nodes with a subtype less than 256 are seen.
\startfunctioncall
-<direct> n, font, char = node.direct.traverse_char(<direct> n)
+<direct> n, font, char = node.direct.traversechar(<direct> n)
\stopfunctioncall
-The \type{traverse_glyph} iterator loops over a list and returns the list and
+The \type{traverseglyph} iterator loops over a list and returns the list and
filters all glyphs:
\startfunctioncall
-<direct> n, font, char = node.traverse_glyph(<direct> n)
+<direct> n, font, char = node.traverseglyph(<direct> n)
\stopfunctioncall
These functions are only available for direct nodes.
\stopsubsubsection
-\startsubsubsection[title={\type {traverse_list}}]
+\startsubsubsection[title={\type {traverselist}}]
-\libindex {traverse_list}
+\libindex {traverselist}
This iterator loops over the \nod {hlist} and \nod {vlist} nodes in a list.
\startfunctioncall
-<direct> n, id, subtype, list = node.traverse_list(<direct> n)
+<direct> n, id, subtype, list = node.traverselist(<direct> n)
\stopfunctioncall
The four return values can save some time compared to fetching these fields but
@@ -1413,15 +1411,15 @@ nodes.
\stopsubsubsection
-\startsubsubsection[title={\type {traverse_content}}]
+\startsubsubsection[title={\type {traversecontent}}]
-\libindex {traverse_content}
+\libindex {traversecontent}
This iterator loops over nodes that have content: \nod {hlist}, \nod {vlist}, \nod {glue}
with leaders, \nod {glyphs}, \nod {disc} and \nod {rules} nodes.
\startfunctioncall
-<direct> n, id, subtype[, list|leader] = node.traverse_list(<direct> n)
+<direct> n, id, subtype[, list|leader] = node.traverselist(<direct> n)
\stopfunctioncall
The four return values can save some time compared to fetching these fields but
@@ -1449,13 +1447,13 @@ end
for n in node.traverse(l,true,true) do
print("3>",n)
end
-for n in node.traverse_id(nodes.nodecodes.glyph,l) do
+for n in node.traverseid(nodes.nodecodes.glyph,l) do
print("4>",n)
end
-for n in node.traverse_id(nodes.nodecodes.glyph,l,true) do
+for n in node.traverseid(nodes.nodecodes.glyph,l,true) do
print("5>",n)
end
-for n in node.traverse_id(nodes.nodecodes.glyph,l,true,true) do
+for n in node.traverseid(nodes.nodecodes.glyph,l,true,true) do
print("6>",n)
end
\stoptyping
@@ -1498,15 +1496,15 @@ been processed by the font handlers):
\stopsubsection
-\startsubsubsection[title={\type {find_node}}]
+\startsubsubsection[title={\type {findnode}}]
-\libindex {find_node}
+\libindex {findnode}
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)
+<node> n = node.findnode(<node> n, <integer> subtype)
+<node> n, subtype = node.findnode(<node> n)
\stopfunctioncall
\stopsubsubsection
@@ -1525,7 +1523,7 @@ passed the property becomes zero.
\startfunctioncall
node.setglue(<node> n)
-node.setglue(<node> n,width,stretch,shrink,stretch_order,shrink_order)
+node.setglue(<node> n,width,stretch,shrink,stretchorder,shrinkorder)
\stopfunctioncall
When you pass values, only arguments that are numbers are assigned so
@@ -1547,8 +1545,8 @@ When a list node is passed, you set the glue, order and sign instead.
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)
+<integer> width, <integer> stretch, <integer> shrink, <integer> stretchorder,
+ <integer> shrinkorder = node.getglue(<node> n)
\stopfunctioncall
When the second argument is false, only the width is returned (this is consistent
@@ -1559,15 +1557,15 @@ glue and the sign.
\stopsubsubsection
-\startsubsubsection[title={\type {is_zero_glue}}]
+\startsubsubsection[title={\type {iszeroglue}}]
-\libindex {is_zero_glue}
+\libindex {iszeroglue}
This function returns \type {true} when the width, stretch and shrink properties
are zero.
\startfunctioncall
-<boolean> isglue = node.is_zero_glue(<node> n)
+<boolean> isglue = node.iszeroglue(<node> n)
\stopfunctioncall
\stopsubsubsection
@@ -1588,61 +1586,56 @@ dedicated functions in the \type {node} library.
\stopsubsubsection
-\startsubsubsection[title={\nod {attribute_list} nodes}]
+\startsubsubsection[title={\nod {attribute} 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:
+An \type {attribute} comes in two variants, indicated by subtype. Because attributes
+are stored in a sorted linked list, and because they are shared, the first node is a
+list reference node and the following ones are value nodes. So, most attribute nodes
+are value nodes. These are forward linked lists. The reference node has fields:
\starttabulate[|l|l|p|]
-\DB field \BC type \BC explanation \NC \NR
+\DB field \BC type \BC explanation \NC \NR
\TB
-\NC \type{next} \NC node \NC pointer to the first attribute \NC \NR
+\NC \type{next} \NC node \NC pointer to the first attribute \NC \NR
+\NC \type{count} \NC number \NC the reference count \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.
+Value nodes have these:
\starttabulate[|l|l|p|]
-\DB field \BC type \BC explanation \NC \NR
+\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{index} \NC number \NC the attribute index \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.
+Because there are assumptions to how these list are build you should rely on the
+helpers, also because details might change.
\stopsubsubsection
-\startsubsubsection[title={\type {current_attr}}]
+\startsubsubsection[title={\type {currentattr}}]
-\libindex{current_attr}
+\libindex{currentattr}
This returns the currently active list of attributes, if there is one.
\startfunctioncall
-<node> m = node.current_attr()
+<node> m = node.currentattr()
\stopfunctioncall
-The intended usage of \type {current_attr} is as follows:
+The intended usage of \type {currentattr} is as follows:
\starttyping
local x1 = node.new("glyph")
-x1.attr = node.current_attr()
+x1.attr = node.currentattr()
local x2 = node.new("glyph")
-x2.attr = node.current_attr()
+x2.attr = node.currentattr()
\stoptyping
or:
@@ -1650,25 +1643,25 @@ or:
\starttyping
local x1 = node.new("glyph")
local x2 = node.new("glyph")
-local ca = node.current_attr()
+local ca = node.currentattr()
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.
+The attribute lists are reference counted and the assignment takes care of
+incrementing the count. 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}}]
+\startsubsubsection[title={\type {hasattribute}}]
-\libindex {has_attribute}
+\libindex {hasattribute}
\startfunctioncall
-<number> v = node.has_attribute(<node> n, <number> id)
-<number> v = node.has_attribute(<node> n, <number> id, <number> val)
+<number> v = node.hasattribute(<node> n, <number> id)
+<number> v = node.hasattribute(<node> n, <number> id, <number> val)
\stopfunctioncall
Tests if a node has the attribute with number \type {id} set. If \type {val} is
@@ -1677,12 +1670,12 @@ or, if no match is found, \type {nil}.
\stopsubsubsection
-\startsubsubsection[title={\type {get_attribute}}]
+\startsubsubsection[title={\type {getattribute}}]
-\libindex {get_attribute}
+\libindex {getattribute}
\startfunctioncall
-<number> v = node.get_attribute(<node> n, <number> id)
+<number> v = node.getattribute(<node> n, <number> id)
\stopfunctioncall
Tests if a node has an attribute with number \type {id} set. It returns the
@@ -1691,12 +1684,12 @@ zero attributes is assumed.
\stopsubsubsection
-\startsubsubsection[title={\type {find_attribute}}]
+\startsubsubsection[title={\type {findattribute}}]
-\libindex {find_attribute}
+\libindex {findattribute}
\startfunctioncall
-<number> v, <node> n = node.find_attribute(<node> n, <number> id)
+<number> v, <node> n = node.findattribute(<node> n, <number> id)
\stopfunctioncall
Finds the first node that has attribute with number \type {id} set. It returns
@@ -1704,12 +1697,12 @@ the value and the node if there is a match and otherwise nothing.
\stopsubsubsection
-\startsubsubsection[title={\type {set_attribute}}]
+\startsubsubsection[title={\type {setattribute}}]
-\libindex {set_attribute}
+\libindex {setattribute}
\startfunctioncall
-node.set_attribute(<node> n, <number> id, <number> val)
+node.setattribute(<node> n, <number> id, <number> val)
\stopfunctioncall
Sets the attribute with number \type {id} to the value \type {val}. Duplicate
@@ -1717,15 +1710,15 @@ assignments are ignored.
\stopsubsubsection
-\startsubsubsection[title={\type {unset_attribute}}]
+\startsubsubsection[title={\type {unsetattribute}}]
-\libindex {unset_attribute}
+\libindex {unsetattribute}
\startfunctioncall
<number> v =
- node.unset_attribute(<node> n, <number> id)
+ node.unsetattribute(<node> n, <number> id)
<number> v =
- node.unset_attribute(<node> n, <number> id, <number> val)
+ node.unsetattribute(<node> n, <number> id, <number> val)
\stopfunctioncall
Unsets the attribute with number \type {id}. If \type {val} is also supplied, it
@@ -1741,13 +1734,13 @@ If the attribute was actually deleted, returns its old value. Otherwise, returns
\startsubsection[title={Glyph handling}][library=node]
-\startsubsubsection[title={\type {first_glyph}}]
+\startsubsubsection[title={\type {firstglyph}}]
-\libindex {first_glyph}
+\libindex {firstglyph}
\startfunctioncall
-<node> n = node.first_glyph(<node> n)
-<node> n = node.first_glyph(<node> n, <node> m)
+<node> n = node.firstglyph(<node> n)
+<node> n = node.firstglyph(<node> n, <node> m)
\stopfunctioncall
Returns the first node in the list starting at \type {n} that is a glyph node
@@ -1757,29 +1750,29 @@ end of the list.
\stopsubsubsection
-\startsubsubsection[title={\type {is_char} and \type {is_glyph}}]
+\startsubsubsection[title={\type {ischar} and \type {isglyph}}]
-\libindex {is_char}
-\libindex {is_glyph}
+\libindex {ischar}
+\libindex {isglyph}
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)
+<boolean> b = node.ischar(<node> n)
+<boolean> b = node.isglyph(<node> n)
\stopfunctioncall
\stopsubsubsection
-\startsubsubsection[title={\type {has_glyph}}]
+\startsubsubsection[title={\type {hasglyph}}]
-\libindex {has_glyph}
+\libindex {hasglyph}
This function returns the first glyph or disc node in the given list:
\startfunctioncall
-<node> n = node.has_glyph(<node> n)
+<node> n = node.hasglyph(<node> n)
\stopfunctioncall
\stopsubsubsection
@@ -1815,14 +1808,14 @@ word boundaries are possible).
\stopsubsubsection
-\startsubsubsection[title={\type {unprotect_glyph[s]}}]
+\startsubsubsection[title={\type {unprotectglyph[s]}}]
-\libindex {unprotect_glyphs}
-\libindex {unprotect_glyph}
+\libindex {unprotectglyphs}
+\libindex {unprotectglyph}
\startfunctioncall
-node.unprotect_glyph(<node> n)
-node.unprotect_glyphs(<node> n,[<node> n])
+node.unprotectglyph(<node> n)
+node.unprotectglyphs(<node> n,[<node> n])
\stopfunctioncall
Subtracts 256 from all glyph node subtypes. This and the next function are
@@ -1831,14 +1824,14 @@ processing. The second argument is optional and indicates the end of a range.
\stopsubsubsection
-\startsubsubsection[title={\type {protect_glyph[s]}}]
+\startsubsubsection[title={\type {protectglyph[s]}}]
-\libindex {protect_glyphs}
-\libindex {protect_glyph}
+\libindex {protectglyphs}
+\libindex {protectglyph}
\startfunctioncall
-node.protect_glyph(<node> n)
-node.protect_glyphs(<node> n,[<node> n])
+node.protectglyph(<node> n)
+node.protectglyphs(<node> n,[<node> n])
\stopfunctioncall
Adds 256 to all glyph node subtypes in the node list starting at \type {n},
@@ -1849,12 +1842,12 @@ optional and indicates the end of a range.
\stopsubsubsection
-\startsubsubsection[title={\type {protrusion_skippable}}]
+\startsubsubsection[title={\type {protrusionskippable}}]
-\libindex {protrusion_skippable}
+\libindex {protrusionskippable}
\startfunctioncall
-<boolean> skippable = node.protrusion_skippable(<node> n)
+<boolean> skippable = node.protrusionskippable(<node> n)
\stopfunctioncall
Returns \type {true} if, for the purpose of line boundary discovery when
@@ -1862,10 +1855,10 @@ character protrusion is active, this node can be skipped.
\stopsubsubsection
-\startsubsubsection[title={\type {check_discretionary}, \type {check_discretionaries}}]
+\startsubsubsection[title={\type {checkdiscretionary}, \type {checkdiscretionaries}}]
-\libindex{check_discretionary}
-\libindex{check_discretionaries}
+\libindex{checkdiscretionary}
+\libindex{checkdiscretionaries}
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
@@ -1875,8 +1868,8 @@ 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)
+node.checkdiscretionary(<node> n)
+node.checkdiscretionaries(<node> head)
\stopfunctioncall
The plural variant runs over all disc nodes in a list, the singular variant
@@ -1884,15 +1877,15 @@ checks one node only (it also checks if the node is a disc node).
\stopsubsubsection
-\startsubsubsection[title={\type {flatten_discretionaries}}]
+\startsubsubsection[title={\type {flattendiscretionaries}}]
-\libindex {flatten_discretionaries}
+\libindex {flattendiscretionaries}
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)
+<node> head, count = node.flattendiscretionaries(<node> n)
\stopfunctioncall
\stopsubsubsection
@@ -1954,21 +1947,6 @@ 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}
@@ -1989,10 +1967,10 @@ is also possible:
\startfunctioncall
<number> w, <number> h, <number> d =
- node.dimensions(<number> glue_set, <number> glue_sign, <number> glue_order,
+ node.dimensions(<number> glueset, <number> gluesign, <number> glueorder,
<node> n)
<number> w, <number> h, <number> d =
- node.dimensions(<number> glue_set, <number> glue_sign, <number> glue_order,
+ node.dimensions(<number> glueset, <number> gluesign, <number> glueorder,
<node> n, <node> t)
\stopfunctioncall
@@ -2005,9 +1983,9 @@ example in code like this, which prints the width of the space in between the
\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].glueset,
+ tex.box[0].gluesign,
+ tex.box[0].glueorder,
tex.box[0].head.next,
node.tail(tex.box[0].head)
)) }
@@ -2040,27 +2018,27 @@ A simple and somewhat more efficient variant is this:
\startsubsection[title={Math}][library=node]
-\startsubsubsection[title={\type {mlist_to_hlist}}]
+\startsubsubsection[title={\type {mlisttohlist}}]
-\libindex {mlist_to_hlist}
+\libindex {mlisttohlist}
\startfunctioncall
<node> h =
- node.mlist_to_hlist(<node> n, <string> display_type, <boolean> penalties)
+ node.mlisttohlist(<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}.
+as for the callback \cbk {mlisttohlist}.
\stopsubsubsection
-\startsubsubsection[title={\type {end_of_math}}]
+\startsubsubsection[title={\type {endofmath}}]
-\libindex {end_of_math}
+\libindex {endofmath}
\startfunctioncall
-<node> t = node.end_of_math(<node> start)
+<node> t = node.endofmath(<node> start)
\stopfunctioncall
Looks for and returns the next \type {math_node} following the \type {start}. If
@@ -2088,16 +2066,16 @@ 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:
+user data 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
+The user data 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
+directly. However, even with user data 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.
@@ -2189,7 +2167,7 @@ head = node.direct.reverse(head)
head = node.direct.exchange(head,first,[second])
\stoptyping
-In \CONTEXT\ some of the not performance|-|critical userdata variants are
+In \CONTEXT\ some of the not performance|-|critical user data variants are
emulated in \LUA\ and not in the engine, so we retain downward compatibility.
\def\yes{$+$} \def\nop{$-$}
@@ -2204,31 +2182,32 @@ emulated in \LUA\ and not in the engine, so we retain downward compatibility.
\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_list} \yes \yes \relax
-%supported {copy_only} \nop \yes \relax
+\supported {checkdiscretionaries} \nop \yes \yes
+\supported {checkdiscretionary} \nop \yes \yes
+\supported {copylist} \yes \yes \relax
+%supported {copyonly} \nop \yes \relax
\supported {copy} \yes \yes \relax
\supported {count} \nop \yes \yes
-\supported {current_attributes} \yes \yes \relax
+\supported {currentattributes} \yes \yes \relax
\supported {dimensions} \nop \yes \yes
-\supported {effective_glue} \nop \yes \yes
-\supported {end_of_math} \nop \yes \yes
-\supported {find_attribute_range} \nop \yes \relax
-\supported {find_attribute} \nop \yes \yes
-\supported {find_node} \nop \yes \relax
-\supported {first_glyph} \nop \yes \yes
-\supported {flatten_discretionaries} \nop \yes \yes
-\supported {flush_list} \yes \yes \relax
-\supported {flush_node} \yes \yes \relax
+\supported {effectiveglue} \nop \yes \yes
+\supported {endofmath} \nop \yes \yes
+\supported {findattributerange} \nop \yes \relax
+\supported {findattribute} \nop \yes \yes
+\supported {findnode} \nop \yes \relax
+\supported {firstglyph} \nop \yes \yes
+\supported {flattendiscretionaries} \nop \yes \yes
+\supported {flushlist} \yes \yes \relax
+\supported {flushnode} \yes \yes \relax
\supported {free} \yes \yes \relax
-\supported {get_attributes} \nop \yes \relax
-\supported {get_attribute} \yes \yes \relax
-\supported {get_properties_table} \yes \yes \relax
-\supported {get_synctex_fields} \nop \yes \relax
+\supported {getattributes} \nop \yes \relax
+\supported {getattribute} \yes \yes \relax
+\supported {getpropertiestable} \yes \yes \relax
+\supported {getsynctexfields} \nop \yes \relax
\supported {getattributelist} \nop \yes \relax
\supported {getboth} \nop \yes \relax
\supported {getbox} \nop \yes \relax
+\supported {getclass} \nop \yes \relax
\supported {getchar} \nop \yes \relax
\supported {getdata} \nop \yes \relax
\supported {getdepth} \nop \yes \relax
@@ -2273,6 +2252,7 @@ emulated in \LUA\ and not in the engine, so we retain downward compatibility.
\supported {getsub} \nop \yes \relax
\supported {getsuppre} \nop \yes \relax
\supported {getsup} \nop \yes \relax
+\supported {getprime} \nop \yes \relax
\supported {gettotal} \yes \yes \relax
%supported {getwhatever} \nop \yes \relax % experiment for myself
\supported {getwhd} \nop \yes \relax
@@ -2280,44 +2260,43 @@ emulated in \LUA\ and not in the engine, so we retain downward compatibility.
\supported {getxscale} \nop \yes \relax
\supported {getxyscale} \nop \yes \relax
\supported {getyscale} \nop \yes \relax
-\supported {has_attribute} \yes \yes \relax
-\supported {has_dimensions} \nop \yes \relax
-\supported {has_field} \yes \yes \relax
-\supported {has_glyph_option} \nop \yes \yes
-\supported {has_glyph} \nop \yes \yes
+\supported {hasattribute} \yes \yes \relax
+\supported {hasdimensions} \nop \yes \relax
+\supported {hasfield} \yes \yes \relax
+\supported {hasglyphoption} \nop \yes \yes
+\supported {hasglyph} \nop \yes \yes
\supported {hpack} \nop \yes \yes
\supported {hyphenating} \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_next_char} \nop \yes \relax
-\supported {is_next_glyph} \nop \yes \relax
-\supported {is_node} \yes \yes \relax
-\supported {is_prev_char} \nop \yes \relax
-\supported {is_prev_glyph} \nop \yes \relax
-\supported {is_valid} \nop \yes \relax
-\supported {is_zero_glue} \nop \yes \yes
+\supported {ignoremathskip} \nop \yes \relax
+\supported {insertafter} \yes \yes \relax
+\supported {insertbefore} \yes \yes \relax
+\supported {ischar} \nop \yes \relax
+\supported {isdirect} \nop \yes \relax
+\supported {isglyph} \nop \yes \relax
+\supported {isnextchar} \nop \yes \relax
+\supported {isnextglyph} \nop \yes \relax
+\supported {isnode} \yes \yes \relax
+\supported {isprevchar} \nop \yes \relax
+\supported {isprevglyph} \nop \yes \relax
+\supported {isvalid} \nop \yes \relax
+\supported {iszeroglue} \nop \yes \yes
\supported {kerning} \nop \yes \yes
-\supported {last_node} \nop \yes \yes
+\supported {lastnode} \nop \yes \yes
\supported {length} \nop \yes \yes
\supported {ligaturing} \nop \yes \yes
-\supported {make_extensible} \nop \yes \yes
+\supported {makeextensible} \nop \yes \yes
\supported {migrate} \nop \yes \relax
-\supported {mlist_to_hlist} \nop \yes \yes
+\supported {mlisttohlist} \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 {protectglyphs} \nop \yes \yes
+\supported {protectglyph} \nop \yes \yes
+\supported {protrusionskippable} \nop \yes \yes
\supported {rangedimensions} \nop \yes \yes
\supported {remove} \yes \yes \relax
-\supported {set_attributes} \nop \yes \relax
-\supported {set_attribute} \yes \yes \relax
-\supported {set_synctex_fields} \nop \yes \relax
+\supported {setattributes} \nop \yes \relax
+\supported {setattribute} \yes \yes \relax
+\supported {setsynctexfields} \nop \yes \relax
\supported {setattributelist} \nop \yes \relax
\supported {setboth} \nop \yes \relax
\supported {setbox} \nop \yes \relax
@@ -2362,10 +2341,11 @@ emulated in \LUA\ and not in the engine, so we retain downward compatibility.
\supported {setsub} \nop \yes \relax
\supported {setsuppre} \nop \yes \relax
\supported {setsup} \nop \yes \relax
+\supported {setprime} \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 {startofpar} \nop \yes \relax
\supported {subtype} \nop \nop \relax
\supported {tail} \yes \yes \relax
\supported {todirect} \nop \yes \relax
@@ -2373,20 +2353,20 @@ emulated in \LUA\ and not in the engine, so we retain downward compatibility.
\supported {tostring} \yes \nop \relax
\supported {total} \nop \yes \relax
\supported {tovaliddirect} \nop \yes \relax
-\supported {traverse_char} \yes \yes \relax
-\supported {traverse_content} \yes \yes \relax
-\supported {traverse_glyph} \yes \yes \relax
-\supported {traverse_id} \yes \yes \relax
-\supported {traverse_list} \yes \yes \relax
+\supported {traversechar} \yes \yes \relax
+\supported {traversecontent} \yes \yes \relax
+\supported {traverseglyph} \yes \yes \relax
+\supported {traverseid} \yes \yes \relax
+\supported {traverselist} \yes \yes \relax
\supported {traverse} \yes \yes \relax
\supported {type} \yes \nop \relax
-\supported {unprotect_glyphs} \nop \yes \yes
-\supported {unprotect_glyph} \nop \yes \yes
-\supported {unset_attributes} \nop \yes \relax
-\supported {unset_attribute} \yes \yes \relax
+\supported {unprotectglyphs} \nop \yes \yes
+\supported {unprotectglyph} \nop \yes \yes
+\supported {unsetattributes} \nop \yes \relax
+\supported {unsetattribute} \yes \yes \relax
\supported {usedlist} \nop \yes \yes
-\supported {uses_font} \nop \yes \yes
-\supported {vertical_break} \nop \yes \relax
+\supported {usesfont} \nop \yes \yes
+\supported {verticalbreak} \nop \yes \relax
\supported {vpack} \nop \yes \yes
\supported {write} \yes \yes \relax
\LL
@@ -2413,21 +2393,14 @@ true for the \type {width}, \type {height} and \type {depth} of glue nodes. Thes
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)
+node.setsynctexfields(<integer> f, <integer> l)
<integer> f, <integer> l =
- node.get_synctex_fields(<node> n)
+ node.getsynctexfields(<node> n)
\stopfunctioncall
Of course you need to know what you're doing as no checking on sane values takes
@@ -2477,9 +2450,8 @@ This is experimental code and might take a while to become frozen.
\topicindex {nodes+properties}
\topicindex {properties}
-\libindex{flush_properties_table}
-\libindex{get_properties_table}
-\libindex{set_properties_mode}
+\libindex{getpropertiestable}
+\libindex{setpropertiesmode}
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 consult them at the
@@ -2576,8 +2548,7 @@ 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
+{getpropertiestable} 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
@@ -2604,13 +2575,9 @@ 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.
+Both are not done because 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. The
+copy gets its own table with the original table as metatable.
A few more experiments 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
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
index 3412d0820fd..1394df9f5c4 100644
--- 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
@@ -1,4 +1,4 @@
-% language=uk
+% language=us runpath=texruns:manuals/luametatex
% lua.newtable
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
deleted file mode 100644
index 5a2dae818b1..00000000000
--- a/Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex-preamble.tex
+++ /dev/null
@@ -1,189 +0,0 @@
-% 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 and not a tutorial. This means that we discuss changes
-relative to traditional \TEX\ and also present new (or extended) 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 like this, where a \type
-{par} node stores some metadata and is followed by a \type {hlist} flagged as
-indent box:
-
-\starttyping
-[par] <=> [hlist] <=> H <=> i <=> [glue] <=> T <=> h <=> e <=> r <=> e ...
-\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
-[par] <=> [hlist] <=> H <=> i <=> [glue] <=> Th <=> e <=> r <=> e ...
-\stoptyping
-
-And maybe some characters get positioned relative to each other, so we might
-see:
-
-\starttyping
-[par] <=> [hlist] <=> H <=> [kern] <=> i <=> [glue] <=> Th <=> e <=> r <=> e ...
-\stoptyping
-
-Actually, the above representation is one view, because in \LUAMETATEX\ we can
-choose for this:
-
-\starttyping
-[par] <=> [glue] <=> H <=> [kern] <=> i <=> [glue] <=> Th <=> e <=> r <=> e ...
-\stoptyping
-
-where glue (currently fixed) is used instead of an empty hlist (think of a \type
-{\hbox}). Options like this are available because want a certain view on these
-lists from the \LUA\ end and the result being predicable is part of that.
-
-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.
-Adding more callbacks makes no sense, also because at some point the performance
-hit gets too large. There are plenty ways to achieve one goals. For that reason:
-take remarks about \LUATEX, features, potential, performance etc.\ with a natural
-grain of salt.
-
-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
-what commands relate to them. 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
-
-Whatever we feed into \TEX\ at some point becomes a token which is either
-interpreted directly or stored in a linked list. A token is just a number that
-encodes a specific command (operator) and some value (operand) that further
-specifies what that command is supposed to do. In addition to an interface to
-nodes, there is an interface to tokens, as later chapters will demonstrate.
-
-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 pack(ag)ing it can mean two things. When \TEX\ has consumed
-some tokens that represent text. When the text is put into a so called \type
-{\hbox} it (normally) first gets hyphenated (even in an horizontal list), next
-ligatures are build, and finally kerns are added. Each of these 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 information is stored in a leading \type {par} node. Then indentation
-is appended and the paragraph ends with some glue. 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
index edbf7d32c19..0d6af420e9f 100644
--- 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
@@ -1 +1,3 @@
-\starttext \ctxlua {table.save(tex.jobname .. '.lua',tex.primitives())} \stoptext \ No newline at end of file
+% language=us runpath=texruns:manuals/luametatex
+
+\starttext \ctxlua {table.save(tex.jobname .. '.lua',tex.primitives())} \stoptext
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
index f230a4500ca..a4ef2cb7115 100644
--- 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
@@ -1,3 +1,5 @@
+% language=us runpath=texruns:manuals/luametatex
+
\environment luametatex-style
\startcomponent luametatex-registers
@@ -11,11 +13,11 @@
\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.
+ are of course many more primitives. The \ETEX\ and \LUATEX\ primitives are
+ typeset in bold (some originate in \PDFTEX).
- \placeregister[primitiveindex][indicator=no]
+ %\placeregister[primitiveindex][indicator=no]
+ \placeregister[texindex,etexindex,luatexindex][indicator=no]
\stopchapter
@@ -28,8 +30,7 @@
\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.
+ are in bold, whatsits that are determined by their subtype are normal.
\placeregister[nodeindex]
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex-rejected.tex b/Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex-rejected.tex
new file mode 100644
index 00000000000..2cf7edf8192
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex-rejected.tex
@@ -0,0 +1,94 @@
+% language=us runpath=texruns:manuals/luametatex
+
+\environment luametatex-style
+
+\startcomponent luametatex-rejected
+
+\startchapter[reference=rejected,title={Rejected features}]
+
+\startsection[title=Introduction]
+
+I should have started this chapter sooner because some experiments were removed
+without them being documented. This chapter is mostly for myself so that I don't
+revisit rejected features.
+
+\stopsection
+
+\startsection[title=Text]
+
+{\em todo}
+
+\stopsection
+
+\startsection[title=Math]
+
+\startsubsection[title=Fences]
+
+The \tex {mathfencesmode} primitive could be used to force the atom class of the
+fake fences to be the old inner class instead of the new fence class but we
+dropped that: it's now always a fence subtype (class). Unpacking is therefore now
+controlled by a class option and not enforced by the (new in \LUAMETATEX) subtype.
+
+\stopsubsection
+
+\startsubsection[title=Delimiters]
+
+The \tex {mathdelimitersmode} primitive was experimental and dealt 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.
+
+So, when set to 7 fenced subformulas with unscaled delimiters came out the same
+as unfenced ones. This could be handy for cases where one was forced to use \prm
+{left} and \prm {right} always because of unpredictable content. The full list of
+flags that we had at the time of removal 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
+\NC \type{"20} \NC don't error on a missing right \NC \NR
+\LL
+\stoptabulate
+
+Because the effect depends on the font (and for Cambria one could use for
+instance \type {"16}) we finally decided to kick it out and correct the font
+instead using the font goodie file. After all it's more a \CONTEXT\ preference
+than an overall demand (read: we think no one else cares much about this).
+
+The \type {"20} options to not error on a missing right fence has been turned
+into \prm {mathcheckfencesmode}.
+
+\stopsubsection
+
+\startsubsection[title=Flattening]
+
+The \tex {mathflattenmode} primitive is gone as we have other ways to deal with
+this now. It related to italic corrections in traditional fonts.
+
+\stopsubsection
+
+\startsubsection[title=Rules]
+
+The \tex {mathrulethicknessmode} feature has been turned into a class option
+which is more granular.
+
+\stopsection
+
+\startsubsection[title=Control]
+
+Although it has its use when developing \LUAMETATEX\ the \tex {mathcontrolmode}
+parameters is no longer there. We have plenty of (more) detailed control now.
+
+\stopsection
+
+
+\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
index d779a0899a8..23ccf24d4d1 100644
--- 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
@@ -1,4 +1,4 @@
-% language=uk
+% language=us runpath=texruns:manuals/luametatex
\environment luametatex-style
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
index 1b4a8d5a1c7..6586e6fc162 100644
--- 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
@@ -1,3 +1,5 @@
+% language=us runpath=texruns:manuals/luametatex
+
\startenvironment luametatex-style
% \environment luatex-style
@@ -115,11 +117,12 @@
\stopluacode
-\protected\def\showfields #1{\ctxlua{document.functions.showfields("#1")}}
-\protected\def\showid #1{\ctxlua{document.functions.showid("#1")}}
-\protected\def\showsubtypes#1{\ctxlua{document.functions.showsubtypes("#1")}}
-\protected\def\showvalues #1{\ctxlua{document.functions.showvalues(node.values("#1"))}}
-\protected\def\showtypes {\ctxlua{document.functions.showvalues(node.types())}}
+\protected\def\showfields #1{\ctxlua{document.functions.showfields("#1")}}
+\protected\def\showid #1{\ctxlua{document.functions.showid("#1")}}
+\protected\def\showsubtypes #1{\ctxlua{document.functions.showsubtypes("#1")}}
+\protected\def\showvalues #1{\ctxlua{document.functions.showvalues(node.values("#1"))}}
+\protected\def\showtypes {\ctxlua{document.functions.showvalues(node.types())}}
+\protected\def\showvaluelist#1{\ctxlua{document.functions.showvalues(#1)}}
\definecolor[blue] [b=.5]
@@ -146,7 +149,7 @@
\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 [subsubsection][align={flushleft,broad},style=\bf,after=\blank,before=\blank]
\setuphead [chapter] [color=maincolor]
\setuphead [section] [color=maincolor]
@@ -385,12 +388,21 @@
\setuplist
[chapter]
[style=bold,
- before={\testpage[4]\blank},
color=keptcolor]
\setuplist
- [section]
- [before={\testpage[3]}]
+ [chapter]
+ [before={\testpage[4]\blank},
+% after={\blank[none,samepage]}]
+ after={\blank[samepage]}]
+
+% \setuplist
+% [section]
+% [before={\testpage[3]}] % \ifnum \structurelistrawnumber{section} > 2 ... \fi
+
+\setuplist
+ [section,subsection]
+ [before={\ifnum \structurelistrawnumber{section}=1 \blank[samepage] \fi}]
\setuplist
[subsection,subsubsection]
@@ -425,22 +437,30 @@
\dontcomplain
-\usemodule[abbreviations-mixed]
+%usemodule[abbreviations-mixed]
+\usemodule[abbreviations-logos]
\defineregister[topicindex]
+\defineregister[luatexindex]
+\defineregister[etexindex]
+\defineregister[texindex]
\defineregister[primitiveindex]
\defineregister[callbackindex]
\defineregister[nodeindex]
\defineregister[libraryindex]
-\protected\def\lpr#1{\doifmode{*bodypart}{\primitiveindex[#1]{\bf\tex {#1}}}\tex {#1}}
-\protected\def\prm#1{\doifmode{*bodypart}{\primitiveindex[#1]{\tex {#1}}}\tex {#1}}
-\protected\def\orm#1{\doifmode{*bodypart}{\primitiveindex[#1]{\tex {#1}}}\tex {#1}}
+\setupregister[etexindex] [textstyle=bold]
+\setupregister[luatexindex][textstyle=bold]
+
+%protected\def\lpr#1{\doifmode{*bodypart}{\primitiveindex[#1]{\bf\tex {#1}}}\tex {#1}}
+%protected\def\prm#1{\doifmode{*bodypart}{\primitiveindex[#1]{\tex {#1}}}\tex {#1}}
\protected\def\cbk#1{\doifmode{*bodypart}{\callbackindex [#1]{\type {#1}}}\type{#1}}
\protected\def\nod#1{\doifmode{*bodypart}{\nodeindex [#1]{\bf\type{#1}}}\type{#1}}
\protected\def\whs#1{\doifmode{*bodypart}{\nodeindex [#1]{\type {#1}}}\type{#1}}
\protected\def\noa#1{\doifmode{*bodypart}{\nodeindex [#1]{\type {#1}}}\type{#1}}
+\protected\def\prm#1{\doifmode{*bodypart}{\getvalue{\ctxlua{document.primitiveorigin("#1")}index}{\tex{#1}}}\tex{#1}}
+
\hyphenation{sub-nodes}
\def\currentlibraryindex{\namedstructureuservariable{section}{library}}
@@ -487,10 +507,27 @@
% video: interesting what comes out of top musicians working remote.
\startluacode
-local list = token.getprimitives()
+local list = token.getprimitives()
+local origins = tex.getprimitiveorigins()
+local hash = { }
+
+for i=1,#list do
+ local l = list[i]
+ hash[l[3]] = l
+end
-- redo this:
+function document.primitiveorigin(name)
+ local h = hash[name]
+ if h then
+ context(origins[h[4]])
+ else
+ logs.report("!!!!!!","unknown primitive %s",name)
+ context("tex")
+ end
+end
+
function document.showprimitives(tag)
local t = tex.extraprimitives(tag)
table.sort(t)
@@ -527,14 +564,15 @@ end
function document.allprimitives()
local c = tokens.commands
- local o = tex.getprimitiveorigins()
+ local o = origins
table.sort(list, function(a,b)
return a[3] < b[3]
end)
- context.starttabulate { "|T|T|Tc|T|" }
+ context.starttabulate { "|T|T|Tr|Tr|T|" }
context.DB() context("primitive")
- context.BC() context("command code")
- context.BC() context("char code")
+ context.BC() context("command name")
+ context.BC() context("cmd")
+ context.BC() context("chr")
context.BC() context("origin")
context.NC() context.NR()
context.TB()
@@ -542,6 +580,7 @@ function document.allprimitives()
local l = list[i]
context.NC() context.tex(l[3])
context.NC() context(c[l[1]])
+ context.NC() context(l[1])
context.NC() context(l[2])
context.NC() context(o[l[4]])
context.NC() context.NR()
@@ -552,3 +591,65 @@ end
\stopluacode
\stopenvironment
+
+% \startluacode
+%
+% local function identify(name, l)
+% local t = { }
+% local l = l or _G[name]
+% if type(l) == "table" then
+% for k, v in next, l do
+% print(k)
+% if string.find(k,"^_") then
+% elseif type(v) == "table" then
+% t[k] = identify(k,v)
+% else
+% t[k] = type(v)
+% end
+% end
+% else
+% print("unknown " .. name)
+% end
+% return t
+% end
+%
+% local builtin = {
+% --
+% md5 = identify("md5"),
+% sha2 = identify("sha2"),
+% basexx = identify("basexx"),
+% lfs = identify("lfs"),
+% fio = identify("fio"),
+% sio = identify("sio"),
+% sparse = identify("sparse"),
+% xzip = identify("xzip"),
+% xmath = identify("xmath") ,
+% xcomplex = identify("xcomplex"),
+% xdecimal = identify("xdecimal"),
+% --
+% socket = identify("socket"),
+% mime = identify("mime"),
+% --
+% lua = identify("lua"),
+% status = identify("status"),
+% texio = identify("texio"),
+% --
+% tex = identify("tex"),
+% token = identify("token"),
+% node = identify("node"),
+% callback = identify("callback"),
+% font = identify("font"),
+% language = identify("language"),
+% --
+% mplib = identify("mplib"),
+% --
+% pdfe = identify("pdfe"),
+% pdfdecode = identify("pdfdecode"),
+% pngdecode = identify("pngdecode"),
+% --
+% optional = identify("optional"),
+% };
+%
+% inspect(builtin)
+%
+% \stopluacode
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
index 503bbfd8293..67661fe7662 100644
--- 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
@@ -1,19 +1,9 @@
-% language=uk
+% language=us runpath=texruns:manuals/luametatex
\environment luametatex-style
\startcomponent luametatex-tex
-% { "getbytecode", lualib_get_bytecode },
-% { "setbytecode", lualib_set_bytecode },
-% { "callbytecode", lualib_call_bytecode },
-% { "getfunctionstable", lualib_get_functions_table },
-% { "getstartupfile", lualib_get_startupfile },
-% { "getversion", lualib_get_version },
-% { "setexitcode", lualib_set_exitcode },
-% { NULL, NULL },
-
-
\startchapter[reference=tex,title={The \TEX\ related libraries}]
\startsection[title={The \type {lua} library}][library=lua]
@@ -249,7 +239,7 @@ Most variables speak for themselves, some are more obscure. For instance the
\DB n \NC meaning \NC explanation \NC \NR
\TB
\NC 0 \NC initializing \NC \type {--ini} mnode \NC \NR
-\NC 1 \NC updating \NC relates to \lpr {overloadmode} \NC \NR
+\NC 1 \NC updating \NC relates to \prm {overloadmode} \NC \NR
\NC 2 \NC production \NC a regular (format driven) run \NC \NR
\LL
\stoptabulate
@@ -341,6 +331,8 @@ stack.
\subsubsection{Integer parameters}
+\topicindex{parameters+integer}
+
The integer parameters accept and return \LUA\ integers. In some cases the values
are checked, trigger other settings or result in some immediate change of
behaviour: \ctxlua {document.filteredprimitives ("internal_int")}.
@@ -353,6 +345,8 @@ some internal integer register but to an engine property: \typ {deadcycles},
\subsubsection{Dimension parameters}
+\topicindex{parameters+dimension}
+
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: \ctxlua {document.filteredprimitives
@@ -364,6 +358,8 @@ These are read|-|only: \typ {pagedepth}, \typ {pagefilllstretch}, \typ
\subsubsection{Direction parameters}
+\topicindex{parameters+direction}
+
The direction states can be queried with: \typ {gettextdir}, \typ {getlinedir},
\typ {getmathdir} and \typ {getpardir}. You can set them with \typ
{settextdir}, \typ {setlinedir}, \typ {setmathdir} and \typ {setpardir},
@@ -378,16 +374,22 @@ tex.textdirection = 1
\subsubsection{Glue parameters}
+\topicindex{parameters+glue}
+
The internal glue parameters accept and return a userdata object that represents
a \nod {glue_spec} node: \ctxlua {document.filteredprimitives ("internal_glue")}.
\subsubsection{Muglue parameters}
+\topicindex{parameters+muglue}
+
All muglue parameters are to be used read|-|only and return a \LUA\ string
\ctxlua {document.filteredprimitives ("internal_mu_glue")}.
\subsubsection{Tokenlist parameters}
+\topicindex{parameters+tokens}
+
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
@@ -442,7 +444,7 @@ provide a consistent \LUA\ interface.
\libindex{getmark}
-\TEX's attributes (\lpr {attribute}), counters (\prm {count}), dimensions (\prm
+\TEX's attributes (\prm {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:
@@ -460,7 +462,7 @@ tex.toks
\stoptyping
\stopthreecolumns
-It is possible to use the names of relevant \lpr {attributedef}, \prm {countdef},
+It is possible to use the names of relevant \prm {attributedef}, \prm {countdef},
\prm {dimendef}, \prm {skipdef}, or \prm {toksdef} control sequences as indices
to these tables:
@@ -470,7 +472,7 @@ 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
+valid \prm {countdef} (or \prm {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).
@@ -693,7 +695,7 @@ smallfam, smallchar, largefam, largechar =
\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
+according to \prm {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$.
@@ -860,18 +862,20 @@ 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
+\DB field \BC explanation \NC \NR
\TB
-\NC \type{page_ins_head} \NC circular list of pending insertions \NC \NR
-\NC \type{contribute_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
+\NC \type{pageinserthead} \NC circular list of pending insertions \NC \NR
+\NC \type{contributehead} \NC the recent contributions \NC \NR
+\NC \type{pagehead} \NC the current page content \NC \NR
+%NC \type{temphead} \NC \NC \NR
+\NC \type{holdhead} \NC used for held-over items for next page \NC \NR
+\NC \type{postadjusthead} \NC head of the (pending) post adjustments \NC \NR
+\NC \type{preadjusthead} \NC head of the (pending) pre adjustments \NC \NR
+\NC \type{postmigratehead} \NC head of the (pending) post migrations \NC \NR
+\NC \type{premigratehead} \NC head of the (pending) pre migrations \NC \NR
+%NC \type{alignhead} \NC \NC \NR
+\NC \type{pagediscardshead} \NC head of the discarded items of a page break \NC \NR
+\NC \type{splitdiscardshead} \NC head of the discarded items in a vsplit \NC \NR
\LL
\stoptabulate
@@ -925,11 +929,11 @@ The known fields are:
\NC \type{direction} \NC node \NC hmode \NC stack 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,
+\NC \type{delimiter} \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
+\NC \type{mathdir} \NC boolean \NC mmode \NC true when during math processing the \prm {mathdirection} is not
+ the same as the surrounding \prm {textdirection} \NC \NR
+\NC \type{mathstyle} \NC number \NC mmode \NC the current \prm {mathstyle} \NC \NR
\LL
\stoptabulate
@@ -970,7 +974,7 @@ 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
+defined by \prm {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}
@@ -1054,7 +1058,7 @@ 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
+controlled by setting \prm {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.
@@ -1175,8 +1179,8 @@ tex.print(tex.romannumeral(123))
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))
+tex.print(tex.fontname(1))
+tex.print(tex.fontidentifier(1))
\stopfunctioncall
\subsubsection{\type {sp}}
@@ -1424,7 +1428,7 @@ 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
+documented primitive \prm {formatname}, provided that the control sequences \type
{\LuaTeXformatname} is currently undefined.
When \LUATEX\ is run with \type {--ini} only the \TEX82 primitives and \prm
@@ -1637,61 +1641,35 @@ 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}
+\libindex{setsynctexmode} \libindex{getsynctexmode}
+\libindex{setsynctexnofiles}
+\libindex{setsynctextag} \libindex{getsynctextag} \libindex{forcesynctextag}
+\libindex{setsynctexline} \libindex{getsynctexline} \libindex{forcesynctexline}
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
+\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
+\NC \type{setsynctexmode} \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{setsynctextag} \NC set the current tag (file) value (obeys save stack) \NC \NR
+\NC \type{setsynctexline} \NC set the current line value (obeys save stack) \NC \NR
+\NC \type{setsynctexnofiles} \NC disable synctex file logging \NC \NR
+\NC \type{getsynctexmode} \NC returns the current mode (for values see above) \NC \NR
+\NC \type{getsynctextag} \NC get the currently set value of tag (file) \NC \NR
+\NC \type{getsynctexline} \NC get the currently set value of line \NC \NR
+\NC \type{forcesynctextag} \NC overload the tag (file) value (\type {0} resets) \NC \NR
+\NC \type{forcesynctexline} \NC overload the line value (\type {0} resets) \NC \NR
\LL
\stoptabulate
@@ -1711,30 +1689,49 @@ that overhead. Passing a value of 1 disables registering.
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.
+and executing the startup file. Watch out: some keys are different from \LUATEX,
+which is a side effect of a more granular and dynamic memory management.
-\starttabulate[|l|l|l|]
-\DB key \BC type \BC default \NC \NR
+\starttabulate[|l|l|l|l|]
+\DB key \BC type \BC default \BC comment \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
+\NC \type{buffersize} \NC number/table \NC 1000000 \NC input buffer bytes \NC \NR
+\NC \type{filesize} \NC number/table \NC 1000 \NC max number of open files \NC \NR
+\NC \type{fontsize} \NC number/table \NC 250 \NC number of permitted fonts \NC \NR
+\NC \type{hashsize} \NC number/table \NC 150000 \NC number of hash entries \NC \NR
+\NC \type{inputsize} \NC number/table \NC 10000 \NC maximum input stack \NC \NR
+\NC \type{languagesize} \NC number/table \NC 250 \NC number of permitted languages \NC \NR
+\NC \type{marksize} \NC number/table \NC 50 \NC number of mark classes \NC \NR
+\NC \type{nestsize} \NC number/table \NC 1000 \NC max depth of nesting \NC \NR
+\NC \type{nodesize} \NC number/table \NC 1000000 \NC max node memory (various size) \NC \NR
+\NC \type{parametersize} \NC number/table \NC 20000 \NC max size of parameter stack \NC \NR
+\NC \type{poolsize} \NC number/table \NC 10000000 \NC max number of string bytes \NC \NR
+\NC \type{savesize} \NC number/table \NC 100000 \NC mas size of save stack \NC \NR
+\NC \type{stringsize} \NC number/table \NC 150000 \NC max number of strings \NC \NR
+\NC \type{tokensize} \NC number/table \NC 1000000 \NC max token memory \NC \NR
+\ML
+\NC \type{expandsize} \NC number/table \NC 10000 \NC max expansion nesting \NC \NR
+\NC \type{propertiessize} \NC number \NC 0 \NC initial size of node properties table \NC \NR
+\NC \type{functionsize} \NC number \NC 0 \NC initial size of \LUA\ functions table \NC \NR
+\NC \type{errorlinesize} \NC number \NC 79 \NC how much or an error is shown \NC \NR
+\NC \type{halferrorlinesize} \NC number \NC 50 \NC idem \NC \NR
+\ML
+\NC \type{formatname} \NC string \NC \NC \NC \NR
+\NC \type{jobname} \NC string \NC \NC \NC \NR
+\ML
+\NC \type{starttime} \NC number \NC \NC for testing only \NC \NR
+\NC \type{useutctime} \NC number \NC \NC for testing only \NC \NR
+\NC \type{permitloadlib} \NC number \NC \NC for testing only \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.
+be tested first instead of simply quitting. The statistics library has methods for
+tracking down how much memory is available and has been configured. The size parameters
+take a number (for the maximum allocated size) or a table with three possible keys:
+\type {size}, \type {plus} (for extra size) and step for the increment when more memory
+is needed. They all start out with a hard coded minimum and also have an hard coded maximum,
+the the configured size sits somewhere between these.
\stopsection
@@ -1746,13 +1743,15 @@ be tested first instead of simply quitting.
This library takes care of the low|-|level I/O interface: writing to the log file
and|/|or console.
-\startsubsection[title={\type {write}}]
+\startsubsection[title={\type {write} and \type {writeselector}}]
\libindex{write}
+\libindex{writeselector}
\startfunctioncall
texio.write(<string> target, <string> s, ...)
texio.write(<string> s, ...)
+texio.writeselector(<string> s, ...)
\stopfunctioncall
Without the \type {target} argument, writes all given strings to the same
@@ -1767,19 +1766,24 @@ prevent \LUA\ from interpreting the first string as the target.
\stopsubsection
-\startsubsection[title={\type {write_nl}}]
+\startsubsection[title={\type {writenl} and \type {writeselectornl}}]
-\libindex{write_nl}
+\libindex{writenl}
+\libindex{writeselectornl}
\startfunctioncall
-texio.write_nl(<string> target, <string> s, ...)
-texio.write_nl(<string> s, ...)
+texio.writenl(<string> target, <string> s, ...)
+texio.writenl(<string> s, ...)
+texio.writeselectornl(<string> target, ...)
\stopfunctioncall
This function behaves like \type {texio.write}, but makes 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.
+The selector variants always expect a selector, so there is no misunderstanding
+if \type {logfile} is a string or selector.
+
\stopsubsection
\startsubsection[title={\type {setescape}}]
@@ -1812,20 +1816,20 @@ to know what you're doing (or more precise: what \TEX\ is doing with input).
\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}
+\libindex{scankeyword}
+\libindex{scankeywordcs}
+\libindex{scanint}
+\libindex{scanreal}
+\libindex{scanfloat}
+\libindex{scandimen}
+\libindex{scanglue}
+\libindex{scantoks}
+\libindex{scancode}
+\libindex{scanstring}
+\libindex{scanargument}
+\libindex{scanword}
+\libindex{scancsname}
+\libindex{scanlist}
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
@@ -1837,26 +1841,26 @@ 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
+\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 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 \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
+\NC \type{scankeyword} \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{scankeywordcs} \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{scanint} \NC \NC returns an integer \NC \NR
+\NC \type{scanreal} \NC \NC returns a number from e.g.\ \type {1}, \type {1.1}, \type {.1} with optional collapsed signs \NC \NR
+\NC \type{scanfloat} \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{scandimen} \NC infinity, mu-units \NC returns a number representing a dimension or two numbers being the filler and order \NC \NR
+\NC \type{scanglue} \NC mu-units \NC returns a glue spec node \NC \NR
+\NC \type{scantoks} \NC definer, expand \NC returns a table of tokens \NC \NR
+\NC \type{scancode} \NC bitset \NC returns a character if its category is in the given bitset (representing catcodes) \NC \NR
+\NC \type{scanstring} \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{scanargument} \NC \NC this one is simular to \type {scanstring} but also accepts a \type {\cs}
+ (which then get expanded) \NC \NR
+\NC \type{scanword} \NC \NC returns a sequence of characters with catcode 11 or 12 as string \NC \NR
+\NC \type{scancsname} \NC \NC returns \type {foo} after scanning \type {\foo} \NC \NR
+\NC \type{scanlist} \NC \NC picks up a box specification and returns a \type {[h|v]list} node \NC \NR
\LL
\stoptabulate
@@ -1864,7 +1868,7 @@ The integer, dimension and glue scanners take an extra optional argument that
signals that en optional equal is permitted.
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 {scan_keyword}
+The \type {scancode} function takes an optional number, the \type {scankeyword}
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
@@ -1872,7 +1876,7 @@ 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 \type {scan_argument} function expands the given argument. When a braced
+The \type {scanargument} function expands the given argument. When a braced
argument is scanned, expansion can be prohibited by passing \type {false}
(default is \type {true}). In case of a control sequence passing \type {false}
will result in a one|-|level expansion (the meaning of the macro).
@@ -1894,9 +1898,9 @@ 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
+\NC \type {\directlua{token.scanstring()}{foo}} \NC \directlua{context("{\\red\\type {"..token.scanstring().."}}")} {foo} \NC full expansion \NC \NR
+\NC \type {\directlua{token.scanstring()}foo} \NC \directlua{context("{\\red\\type {"..token.scanstring().."}}")} foo \NC letters and others \NC \NR
+\NC \type {\directlua{token.scanstring()}\foo} \NC \directlua{context("{\\red\\type {"..token.scanstring().."}}")}\foo \NC meaning \NC \NR
\LL
\stoptabulate
@@ -1905,13 +1909,13 @@ expanded definition (\prm {edef}'d). In the case of the braced variant one can o
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
+The \type {scanword} scanner can be used to implement for instance a number
scanner. An optional boolean argument can signal that a trailing space or \type
{\relax} should be gobbled:
\starttyping
-function token.scan_number(base)
- return tonumber(token.scan_word(),base)
+function token.scannumber(base)
+ return tonumber(token.scanword(),base)
end
\stoptyping
@@ -1942,7 +1946,7 @@ You can also do this:
\starttyping
\directlua {
function mymacro()
- local d = token.scan_dimen()
+ local d = token.scandimen()
...
end
}
@@ -1975,19 +1979,19 @@ a bit but for passing strings conversion to and from tokens has to be done anywa
\startsubsection[title={Picking up one token}]
-\libindex {scan_next}
-\libindex {scan_next_expanded}
-\libindex {skip_next}
-\libindex {skip_next_expanded}
-\libindex {peek_next}
-\libindex {peek_next_expanded}
-\libindex {scan_token}
+\libindex {scannext}
+\libindex {scannextexpanded}
+\libindex {skipnext}
+\libindex {skipnextexpanded}
+\libindex {peeknext}
+\libindex {peeknextexpanded}
+\libindex {scantoken}
\libindex {expand}
The scanners look for a sequence. When you want to pick up one token from the
-input you use \type {scan_next}. This creates a token with the (low level)
+input you use \type {scannext}. 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} or the \type {_expanded}
+enforce expansion first you can use \type {scantoken} or the \type {_expanded}
variants. 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.
@@ -1998,14 +2002,14 @@ enough about \TEX\ not to be too worried about that. It basically is a call to
the internal expand related function.
\starttabulate[|lT|p|]
-\DB name \BC explanation \NC \NR
+\DB name \BC explanation \NC \NR
\TB
-\NC scan_next \NC get the next token \NC \NR
-\NC scan_next_expanded \NC get the next expanded token \NC \NR
-\NC skip_next \NC skip the next token \NC \NR
-\NC skip_next_expanded \NC skip the next expanded token \NC \NR
-\NC peek_next \NC get the next token and put it back in the input \NC \NR
-\NC peek_next_expanded \NC get the next expanded token and put it back in the input \NC \NR
+\NC scannext \NC get the next token \NC \NR
+\NC scannextexpanded \NC get the next expanded token \NC \NR
+\NC skipnext \NC skip the next token \NC \NR
+\NC skipnextexpanded \NC skip the next expanded token \NC \NR
+\NC peeknext \NC get the next token and put it back in the input \NC \NR
+\NC peeknextexpanded \NC get the next expanded token and put it back in the input \NC \NR
\LL
\stoptabulate
@@ -2026,20 +2030,20 @@ alike.
\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_frozen}
-\libindex{get_user}
-
-\libindex{scan_next}
+\libindex{getcommand}
+\libindex{getcmdname}
+\libindex{getcsname}
+\libindex{getid}
+\libindex{getactive}
+\libindex{getexpandable}
+\libindex{getprotected}
+\libindex{getmode}
+\libindex{getindex}
+\libindex{gettok}
+\libindex{getfrozen}
+\libindex{getuser}
+
+\libindex{scannext}
The creator function can be used as follows:
@@ -2069,7 +2073,7 @@ primitive. The possible properties of tokens are:
\LL
\stoptabulate
-Alternatively you can use a getter \type {get_<fieldname>} to access a property
+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
@@ -2124,14 +2128,14 @@ need to know that boundary condition.
\topicindex {macros}
-\libindex{set_macro}
-\libindex{get_macro}
-\libindex{get_meaning}
-\libindex{set_char}
-\libindex{set_lua}
-\libindex{get_functions_table}
-\libindex{push_macro}
-\libindex{pop_macro}
+\libindex{setmacro}
+\libindex{getmacro}
+\libindex{getmeaning}
+\libindex{setchar}
+\libindex{setlua}
+\libindex{getfunctionstable}
+\libindex{pushmacro}
+\libindex{popmacro}
The \type {set_macro} function can get upto 4 arguments:
@@ -2157,8 +2161,8 @@ The results are like:
\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
+The \type {getmacro} function can be used to get the content of a macro while
+the \type {getmeaning} 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
@@ -2177,11 +2181,11 @@ 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
+that you can access with \type {lua.getfunctions_table}. It is the companion
+to \prm {luadef}. When the first (and only) argument is true the size will preset
to the value of \type {texconfig.function_size}.
-The \type {push_macro} and \type {pop_macro} function are very experimental and
+The \type {pushmacro} and \type {popmacro} function are very experimental and
can be used to get and set an existing macro. The push call returns a user data
object and the pop takes such a userdata object. These object have no accessors
and are to be seen as abstractions.
@@ -2190,20 +2194,20 @@ and are to be seen as abstractions.
\startsubsection[title={Pushing back}]
-\libindex{scan_next}
-\libindex{put_next}
+\libindex{scannext}
+\libindex{putnext}
There is a (for now) experimental putter:
\starttyping
-local t1 = token.scan_next()
-local t2 = token.scan_next()
-local t3 = token.scan_next()
-local t4 = token.scan_next()
+local t1 = token.scannext()
+local t2 = token.scannext()
+local t3 = token.scannext()
+local t4 = token.scannext()
-- watch out, we flush in sequence
-token.put_next { t1, t2 }
+token.putnext { t1, t2 }
-- but this one gets pushed in front
-token.put_next ( t3, t4 )
+token.putnext ( t3, t4 )
\stoptyping
When we scan \type {wxyz!} we get \type {yzwx!} back. The argument is either a
@@ -2218,11 +2222,11 @@ works out okay:
\directlua {
local list = { 101, 102, 103, token.create("foo"), "{abracadabra}" }
- token.put_next("(the)")
- token.put_next(list)
- token.put_next("(order)")
- token.put_next(unpack(list))
- token.put_next("(is reversed)")
+ token.putnext("(the)")
+ token.putnext(list)
+ token.putnext("(order)")
+ token.putnext(unpack(list))
+ token.putnext("(is reversed)")
}
\stopbuffer
@@ -2259,9 +2263,9 @@ create a hash entry and when later it gets defined that entry will be reused. So
\type {\oof} really exists but can be in an undefined state.
\startbuffer[demo]
-oof : \directlua{tex.print(token.scan_csname())}\oof
-foo : \directlua{tex.print(token.scan_csname())}\foo
-myfirstoof : \directlua{tex.print(token.scan_csname())}\myfirstoof
+oof : \directlua{tex.print(token.scancsname())}\oof
+foo : \directlua{tex.print(token.scancsname())}\foo
+myfirstoof : \directlua{tex.print(token.scancsname())}\myfirstoof
\stopbuffer
\startlines
@@ -2307,9 +2311,9 @@ 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.scan_next() tex.print(t.id.." "..t.tok)}\myfirstoof
-\directlua{local t = token.scan_next() tex.print(t.id.." "..t.tok)}\mysecondoof
-\directlua{local t = token.scan_next() tex.print(t.id.." "..t.tok)}\mythirdoof
+\directlua{local t = token.scannext() tex.print(t.id.." "..t.tok)}\myfirstoof
+\directlua{local t = token.scannext() tex.print(t.id.." "..t.tok)}\mysecondoof
+\directlua{local t = token.scannext() tex.print(t.id.." "..t.tok)}\mythirdoof
\stopbuffer
\startlines
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
index 6f7a6f9a5a5..0d33cda0cc1 100644
--- 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
@@ -1,3 +1,5 @@
+% language=us runpath=texruns:manuals/luametatex
+
\environment luametatex-style
\startcomponent luametatex-titlepage
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex.tex b/Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex.tex
index 1327ea3a14b..bb20761bc7a 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luametatex.tex
@@ -1,4 +1,11 @@
-% ------------------------ ------------------------ ------------------------
+% language=us runpath=texruns:manuals/luametatex
+
+% \enabledirectives[backend.pdf.inmemory]
+
+% \setupalign[profile]
+% \enabletrackers[profiling.lines.show]
+
+% ------------------------ ------ ------------------ ------------------------
% 2019-12-17 32bit 64bit 2020-01-10 32bit 64bit 2020-11-30 32bit 64bit
% ------------------------ ------------------------ ------------------------
% freebsd 2270k 2662k freebsd 2186k 2558k freebsd 2108k 2436k
@@ -17,10 +24,6 @@
% clang bins are still slower .. quite inconsistent differences between 32 and
% 64 bit (not all compilers are the same version)
-% \loggingall
-% \tracingonline \zerocount
-% \tracingmacros \plusone
-
% \enableautoglyphscaling % saves only a few instances ... no gain .. a few pages more
% \enabletexdirective{vspacing.experimental}
@@ -53,6 +56,15 @@
% rpi 64 : 26.0 (overclocked)
% amd 10 fitlet : 28.2
+% 20210812 : 298 pages
+% mingw : 9.7
+
+% 20210903 : 300 pages
+% mingw : 9.6
+
+% 20210916 : 300 pages
+% mingw : 9.4 (9.25 with LTO, 9.75 native)
+
% But speed can differ a bit per compilation (upto .5 seconds maybe due to how
% compiled code is organized which might influence caching. Who knows ... (or
% cares). For instance at 20200407 I measured 10.9 seconds after some new low level
@@ -61,7 +73,12 @@
% took 10.5 seconds, that is, we were at exactly 24 pages per second but after
% switching to gcc9 it dropped again. In december 2020, with IPO enabled I crossed
% the 26 pps barrier and went below 10 seconds but that was also after some further
-% cleanup in \LMTX.
+% cleanup in \LMTX. Mid August 2021 I measured over 30 pps but not all is due to
+% the engine I guess. End august we were are over 31 pps so it's not getting worse.
+
+% (This means that on a modern desktop we probably can get around 100 pps on a
+% manual like this but, always using laptops, I don't have access to machines like
+% that. A modern laptop probably could perform over 50 pps.)
% msvc 1899k (2% slower than mingw)
% msvc /GL 2297k (similar to mingw)
@@ -78,9 +95,36 @@
% 290 pages, 10.8 sec, 292M lua, 99M tex, 158 instances
% 290 pages, 9.5 sec, 149M lua, 35M tex, 30 instances
+% On the 2018 Dell 7520 Precission Xeon laptop runtime for 322 pages is now exactly
+% 8 seconds (just below 40 pages per second), we talking July 16, 2022.
+%
+% At the first of August 2022 the (slightly reorganized and updated) manual counted
+% 350 pages and took 8.6 seconds to process (some 41 pages per second), so we're
+% rather stable. End of 2022 processing that amount of pages dropped somewhat
+% (occasionally under 8.3 seconds for 356 pages with little other system load). In
+% means that 43 pages per seconds is now the new normal but that might of course
+% become less again as we evolve.
+
+% \enableexperiments [tabulateusesize]
+% \enableexperiments [tabulatesparseskips]
+
+\ifdefined\linebuffering \linebuffering \fi
+
\enableexperiments[fonts.compact]
+%disableexperiments[fonts.accurate]
+
% \enabledirectives[fonts.injections.method=advance] % tricky ... not all xoffsets are advance robust
+% This is only for testing, use the command line (or banner line) instead.
+%
+% \startluacode
+% lpdf.setencryption {
+% ownerpassword = "password",
+% userpassword = " ",
+% permissions = "print,quality"
+% }
+% \stopluacode
+
\pushoverloadmode \unprotect
% test code
\protect \popoverloadmode
@@ -104,28 +148,28 @@
\stopfrontmatter
\startbodymatter
- \component luametatex-preamble
- \component luametatex-differences
\component luametatex-modifications
\component luametatex-lua
\component luametatex-enhancements
\component luametatex-fonts
\component luametatex-languages
\component luametatex-math
+ \component luametatex-building
\component luametatex-nodes
\component luametatex-callbacks
\component luametatex-tex
\component luametatex-metapost
\component luametatex-pdf
\component luametatex-libraries
- \component luametatex-primitives
+ \component luametatex-primitives % this generates a list
+ % \component luametatex-rejected % local file
\stopbodymatter
\startbackmatter
- % \component luametatex-rejected % local file
\component luametatex-codes
\component luametatex-registers
\component luametatex-statistics
+ \component luametatex-remarks
\stopbackmatter
\stopdocument
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luatex-primitives.lua b/Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luatex-primitives.lua
new file mode 100644
index 00000000000..49ffed7eb32
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luatex-primitives.lua
@@ -0,0 +1 @@
+return { "vskip", "Umathcloseopspacing", "unless", "botmarks", "textdir", "write", "vsize", "Umathordpunctspacing", "currentiftype", "Udelimiterunder", " ", "boundary", "unhcopy", "pagediscards", "mathsurroundmode", "output", "-", "/", "Uskewedwithdelims", "unskip", "bodydirection", "unvbox", "Umathopenpunctspacing", "boxmaxdepth", "muskipdef", "string", "pagebottomoffset", "mutoglue", "luabytecodecall", "mathsurroundskip", "toksdef", "displaywidowpenalties", "endlocalcontrol", "Umathordinnerspacing", "Umathbinclosespacing", "floatingpenalty", "righthyphenmin", "voffset", "toksapp", "rightghost", "fontcharic", "fontchardp", "escapechar", "fontcharht", "Umathlimitbelowbgap", "topmark", "fontcharwd", "Umathopeninnerspacing", "textdirection", "nolocaldirs", "splitfirstmark", "vsplit", "everydisplay", "badness", "tokspre", "xleaders", "textfont", "showlists", "language", "Umathnolimitsubfactor", "mathchoice", "Uoverdelimiter", "Umathpunctpunctspacing", "Umathclosepunctspacing", "mathdisplayskipmode", "saveimageresource", "mathrulesfam", "Umathrelordspacing", "topskip", "abovedisplayshortskip", "underline", "Umathsupbottommin", "Umathlimitbelowkern", "tracinglostchars", "copyfont", "pagedirection", "Umathstackdenomdown", "localrightbox", "Umathfractionrule", "pagefillstretch", "unvcopy", "widowpenalties", "splitbotmark", "Umathcharfam", "finalhyphendemerits", "Umathcloseinnerspacing", "Umathopenrelspacing", "atopwithdelims", "tracingifs", "Uhextensible", "Umathsupsubbottommax", "pretolerance", "leftmarginkern", "iffontchar", "Umathcloserelspacing", "linedirection", "fi", "dp", "eTeXVersion", "setlanguage", "ht", "mathchardef", "ifincsname", "nulldelimiterspace", "or", "wd", "Umathcharnum", "Umathinnerordspacing", "synctex", "luabytecode", "formatname", "pagegoal", "advance", "letterspacefont", "boxdirection", "pdfextension", "protected", "chardef", "catcode", "mathchar", "Umathrelinnerspacing", "topmarks", "showgroups", "scriptscriptfont", "mathcode", "leftskip", "Umathsubtopmax", "glueexpr", "randomseed", "pageshrink", "splitfirstmarks", "suppressoutererror", "predisplaydirection", "Umathsubsupshiftdown", "pagefilstretch", "Umathopbinspacing", "delcode", "Umathordbinspacing", "fontname", "Umathrelopspacing", "brokenpenalty", "Umathopenbinspacing", "suppressprimitiveerror", "Umathoverdelimiterbgap", "localleftbox", "alignmark", "Uunderdelimiter", "hyphenationmin", "Umathclosebinspacing", "Umathcodenum", "dvifeedback", "lastkern", "outputmode", "belowdisplayshortskip", "tolerance", "mathopen", "luafunction", "exhyphenpenalty", "compoundhyphenmode", "maxdepth", "Umathpunctopenspacing", "luacopyinputnodes", "Umathconnectoroverlapmin", "futurelet", "abovewithdelims", "crampedscriptscriptstyle", "csstring", "hangindent", "Umathradicaldegreeafter", "everyeof", "lastskip", "eTeXversion", "uniformdeviate", "linepenalty", "luatexversion", "everyjob", "xspaceskip", "globaldefs", "Umathfractionnumup", "rightmarginkern", "everypar", "Umathopclosespacing", "scriptfont", "clubpenalties", "mathrulesmode", "delimiter", "explicithyphenpenalty", "Umathordclosespacing", "savingvdiscards", "splitbotmarks", "Umathoverdelimitervgap", "etokspre", "afterassignment", "firstmark", "expanded", "suppressmathparerror", "Udelcode", "bodydir", "wordboundary", "showtokens", "immediateassigned", "tracingassigns", "shapemode", "dimexpr", "lineskiplimit", "lineskip", "def", "parshapedimen", "attribute", "nolocalwhatsits", "readline", "fam", "day", "iffalse", "textstyle", "end", "mag", "box", "belowdisplayskip", "Umathsubshiftdrop", "Umathsubshiftdown", "ifx", "matheqnogapstep", "Umathpunctrelspacing", "let", "errmessage", "lastsavedimageresourceindex", "exhyphenchar", "hss", "expandafter", "lastsavedimageresourcepages", "mathoption", "the", "displaywidth", "Umathradicaldegreeraise", "fixupboxesmode", "Uright", "mathsurround", "pagedepth", "adjustspacing", "looseness", "Umathsupshiftdrop", "Umathcharslot", "leaders", "Umathcloseclosespacing", "luatexrevision", "vss", "insertht", "localinterlinepenalty", "useboxresource", "ifhmode", "explicitdiscretionary", "Umathchar", "botmark", "Udelimiterover", "Ustack", "Umathcode", "mathdelimitersmode", "saveboxresource", "Udelcodenum", "gtoksapp", "tracingscantokens", "suppresslongerror", "displaystyle", "ignoreligaturesinfont", "accent", "immediate", "Umathaxis", "Umathfractionnumvgap", "ifmmode", "gtokspre", "mathflattenmode", "Umathskewedfractionhgap", "Umathrelclosespacing", "meaning", "Umathpunctbinspacing", "abovedisplayskip", "medmuskip", "emergencystretch", "Ustopdisplaymath", "quitvmode", "rightskip", "mathclose", "hangafter", "hoffset", "crampedscriptstyle", "letcharcode", "setrandomseed", "hyphenationbounds", "crampedtextstyle", "pagedir", "Umathbinrelspacing", "aftergroup", "Umathopordspacing", "dvivariable", "attributedef", "mathdirection", "Umathordordspacing", "pdffeedback", "cleaders", "romannumeral", "hbadness", "mathbin", "Umathskewedfractionvgap", "Umathopenordspacing", "showboxbreadth", "mathitalicsmode", "ifvmode", "jobname", "mathdir", "vbadness", "patterns", "nonstopmode", "errhelp", "predisplaypenalty", "outputbox", "Umathcloseordspacing", "Umathnolimitsupfactor", "endlinechar", "mathinner", "lastbox", "showboxdepth", "pagewidth", "postdisplaypenalty", "Ustopmath", "aligntab", "mathrel", "holdinginserts", "radical", "mathord", "prehyphenchar", "dviextension", "pagetotal", "luafunctioncall", "Umathpunctopspacing", "everycr", "breakafterdirmode", "adjdemerits", "Umathsubsupvgap", "luaescapestring", "prerelpenalty", "halign", "begincsname", "defaultskewchar", "tracingnesting", "errorcontextlines", "Umathradicalrule", "splitmaxdepth", "Uleft", "ifcase", "Umathunderbarrule", "noindent", "postexhyphenchar", "Umathradicaldegreebefore", "tracingmacros", "moveright", "predisplaysize", "Umathstacknumup", "tracingrestores", "message", "ifhbox", "deadcycles", "normaldeviate", "interlinepenalty", "mathpunct", "lccode", "ifdefined", "noboundary", "displayindent", "Umathbinopspacing", "nonscript", "xtoksapp", "everyhbox", "boxdir", "Ustartdisplaymath", "savecatcodetable", "Umathbinpunctspacing", "eTeXglueshrinkorder", "mathscriptboxmode", "tagcode", "global", "Uroot", "lastsavedboxresourceindex", "penalty", "tracingcommands", "everymath", "Unosuperscript", "nolimits", "noalign", "Umathoperatorsize", "directlua", "xtokspre", "inputlineno", "Uradical", "pagestretch", "parskip", "indent", "dimendef", "mathstyle", "Umathopopenspacing", "widowpenalty", "ifvbox", "above", "Umathordopenspacing", "automatichyphenpenalty", "Umathbininnerspacing", "spaceskip", "middle", "Umathinnerrelspacing", "clearmarks", "Umathoverbarvgap", "fontid", "displaylimits", "pausing", "Umathopenopenspacing", "immediateassignment", "everyvbox", "iftrue", "moveleft", "mathop", "Umathunderdelimiterbgap", "Umathoverbarrule", "endcsname", "setfontid", "crampeddisplaystyle", "ifabsdim", "Umathlimitabovebgap", "Umathcharclass", "dimen", "Umathstackvgap", "Umathinneropspacing", "currentifbranch", "Umathrelbinspacing", "ifcat", "clubpenalty", "splittopskip", "Umathcloseopenspacing", "ifcondition", "doublehyphendemerits", "ifdim", "pardir", "limits", "ifeof", "firstmarks", "ignorespaces", "initcatcodetable", "insert", "delimitershortfall", "lastnodetype", "ifodd", "nokerns", "pageleftoffset", "insertpenalties", "tracingpages", "hpack", "luadef", "vadjust", "tracingfonts", "nospaces", "tracingonline", "Umathrelopenspacing", "count", "Umathlimitabovekern", "ifnum", "Udelimiter", "savepos", "edef", "nohrule", "char", "begingroup", "mathrulethicknessmode", "tracingparagraphs", "hyphenation", "marks", "localbrokenpenalty", "Umathfractiondelsize", "exceptionpenalty", "hfuzz", "openout", "automaticdiscretionary", "currentgrouplevel", "leqno", "gleaders", "Umathunderdelimitervgap", "Umathinnerbinspacing", "hyphenpenalty", "vcenter", "hfil", "thickmuskip", "maxdeadcycles", "mkern", "hbox", "overfullrule", "noligs", "else", "hsize", "raise", "thinmuskip", "spacefactor", "input", "hrule", "left", "eqno", "parfillskip", "font", "valign", "dump", "relax", "hyphenpenaltymode", "draftmode", "prevdepth", "read", "shipout", "batchmode", "right", "automatichyphenmode", "setbox", "prebinoppenalty", "baselineskip", "Usubscript", "special", "mskip", "Umathcharnumdef", "endgroup", "uchyph", "binoppenalty", "rpcode", "interlinepenalties", "endinput", "omit", "pagefilllstretch", "muexpr", "overwithdelims", "unexpanded", "newlinechar", "vfilneg", "time", "tpack", "skip", "vfill", "span", "prevgraf", "over", "show", "vbox", "tracingstats", "year", "mathpenaltiesmode", "ifcsname", "defaulthyphenchar", "nullfont", "parshapeindent", "mathscriptcharmode", "muskip", "vpack", "toks", "Umathaccent", "pagetopoffset", "outer", "showifs", "multiply", "pageheight", "tracingoutput", "firstvalidlanguage", "catcodetable", "parindent", "parshapelength", "protrusionboundary", "displaywidowpenalty", "unhbox", "lefthyphenmin", "vtop", "mathaccent", "Umathspaceafterscript", "predisplaygapfactor", "primitive", "Umathinneropenspacing", "Uskewed", "pxdimen", "vfuzz", "glyphdimensionsmode", "overline", "Umathopenopspacing", "unkern", "splitdiscards", "gluetomu", "eTeXgluestretchorder", "glueshrink", "gluestretch", "glueshrinkorder", "gluestretchorder", "numexpr", "ifabsnum", "scantextokens", "scantokens", "interactionmode", "detokenize", "currentiflevel", "currentgrouptype", "mathnolimitsmode", "mathscriptsmode", "suppressifcsnameerror", "suppressfontnotfounderror", "savinghyphcodes", "lastlinefit", "tracinggroups", "eTeXrevision", "eTeXminorversion", "pardirection", "pdfvariable", "lateluafunction", "latelua", "useimageresource", "pagerightoffset", "linedir", "closeout", "showthe", "showbox", "uppercase", "lowercase", "closein", "openin", "errorstopmode", "scrollmode", "efcode", "lpcode", "skewchar", "hyphenchar", "hjcode", "preexhyphenchar", "posthyphenchar", "Umathinnerinnerspacing", "Umathinnerpunctspacing", "Umathinnerclosespacing", "Umathpunctinnerspacing", "Umathpunctclosespacing", "Umathpunctordspacing", "Umathopenclosespacing", "Umathrelpunctspacing", "Umathrelrelspacing", "Umathbinopenspacing", "Umathbinbinspacing", "Umathbinordspacing", "Umathopinnerspacing", "Umathoppunctspacing", "Umathoprelspacing", "Umathopopspacing", "Umathordrelspacing", "Umathordopspacing", "Umathsupshiftup", "Umathlimitbelowvgap", "Umathlimitabovevgap", "Umathfractiondenomdown", "Umathfractiondenomvgap", "Umathradicalvgap", "Umathradicalkern", "Umathunderbarvgap", "Umathunderbarkern", "Umathoverbarkern", "Umathquad", "sfcode", "uccode", "skipdef", "countdef", "Umathchardef", "glet", "xdef", "gdef", "long", "Uvextensible", "Umiddle", "atop", "Unosubscript", "Usuperscript", "scriptscriptstyle", "scriptstyle", "Ustartmath", "discretionary", "unpenalty", "copy", "lower", "kern", "vfil", "hfilneg", "hfill", "hskip", "crcr", "cr", "ifprimitive", "ifvoid", "ifinner", "if", "Uchar", "luatexbanner", "number", "lastypos", "lastxpos", "lastpenalty", "par", "novrule", "vrule", "etoksapp", "parshape", "noexpand", "mark", "leftghost", "fontdimen", "expandglyphsinfont", "divide", "lastnamedcs", "csname", "scriptspace", "protrudechars", "outputpenalty", "month", "delimiterfactor", "relpenalty", "tabskip" } \ No newline at end of file
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luatex-primitives.tex b/Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luatex-primitives.tex
new file mode 100644
index 00000000000..edbf7d32c19
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/luametatex/luatex-primitives.tex
@@ -0,0 +1 @@
+\starttext \ctxlua {table.save(tex.jobname .. '.lua',tex.primitives())} \stoptext \ No newline at end of file
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/luatex/luatex-contents.tex b/Master/texmf-dist/doc/context/sources/general/manuals/luatex/luatex-contents.tex
index 2582a81c72b..3759078ab25 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/luatex/luatex-contents.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/luatex/luatex-contents.tex
@@ -1,3 +1,5 @@
+% language=us engine=luatex runpath=texruns:manuals/luatex
+
\environment luatex-style
\startcomponent luatex-contents
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/luatex/luatex-enhancements.tex b/Master/texmf-dist/doc/context/sources/general/manuals/luatex/luatex-enhancements.tex
index 537961661f5..a1b17ac162f 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/luatex/luatex-enhancements.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/luatex/luatex-enhancements.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us engine=luatex runpath=texruns:manuals/luatex
\environment luatex-style
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/luatex/luatex-firstpage.tex b/Master/texmf-dist/doc/context/sources/general/manuals/luatex/luatex-firstpage.tex
index 772fbb3fe2a..fc94fe83611 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/luatex/luatex-firstpage.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/luatex/luatex-firstpage.tex
@@ -1,3 +1,5 @@
+% language=us engine=luatex runpath=texruns:manuals/luatex
+
\startcomponent luatex-firstpage
\startstandardmakeup
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 e944b2c5b56..b0921c70cd7 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
@@ -1,4 +1,4 @@
-% language=uk
+% language=us engine=luatex runpath=texruns:manuals/luatex
\environment luatex-style
@@ -728,13 +728,12 @@ 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.
-If you want a copy of the internal data you can use \type {font.copyfont}:
\startfunctioncall
-<table> f = font.copyfont(<number> n)
+<table> f = font.getfont(<number> n)
\stopfunctioncall
-This one will return a table of the parameters as known to \TEX. These can be
+So, this one will return a table of the parameters as known to \TEX. These can be
different from the ones in the cached table:
\startfunctioncall
@@ -788,7 +787,7 @@ Within reasonable bounds you can extend a font after it has been defined. Becaus
some properties are best left unchanged this is limited to adding characters.
\startfunctioncall
-font.addcharacters(<number n>, <table> f)
+font.addcharacters(<number> n, <table> f)
\stopfunctioncall
The table passed can have the fields \type {characters} which is a (sub)table
@@ -882,6 +881,30 @@ The effective values are never negative. The zero mode is the default.
\LL
\stoptabulate
+\stopsubsection
+
+\startsubsection[title={\type {\discretionaryligaturemode}}]
+
+This parameter controls how complex ligatures interact with discretionaries (as
+injected by the hyphenator). The non||zero values prevent the construction of
+so called init and select discretionaries.
+
+\definefontfeature[ligmodetest][default][mode=base]
+\definefont [ligmodefont][Serif*ligmodetest]
+
+\hyphenation{xx-f-f-i-xx}
+
+\starttabulate[|p|p|p|]
+ \DB 0 \BC 1 \BC 2 \NC \NR
+ \TB
+ \NC \ligmodefont \discretionaryligaturemode0 \hsize1pt xxffixx
+ \NC \ligmodefont \discretionaryligaturemode1 \hsize1pt xxffixx
+ \NC \ligmodefont \discretionaryligaturemode2 \hsize1pt xxffixx \NC \NR
+ \LL
+\stoptabulate
+
+\stopsubsection
+
\stopsection
\stopchapter
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/luatex/luatex-introduction.tex b/Master/texmf-dist/doc/context/sources/general/manuals/luatex/luatex-introduction.tex
index 93d0215a821..bbe93f86c9e 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/luatex/luatex-introduction.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/luatex/luatex-introduction.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us engine=luatex runpath=texruns:manuals/luatex
\environment luatex-style
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/luatex/luatex-languages.tex b/Master/texmf-dist/doc/context/sources/general/manuals/luatex/luatex-languages.tex
index d4a7bda607a..cb9ca10f32d 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/luatex/luatex-languages.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/luatex/luatex-languages.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us engine=luatex runpath=texruns:manuals/luatex
\environment luatex-style
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/luatex/luatex-logos.tex b/Master/texmf-dist/doc/context/sources/general/manuals/luatex/luatex-logos.tex
index 3172336ec3f..ef5db3c4c3a 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/luatex/luatex-logos.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/luatex/luatex-logos.tex
@@ -1,3 +1,5 @@
+% language=us engine=luatex runpath=texruns:manuals/luatex
+
\startenvironment luatex-logos
\usemodule[abr-02]
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/luatex/luatex-lua.tex b/Master/texmf-dist/doc/context/sources/general/manuals/luatex/luatex-lua.tex
index 625334c1b8a..9765051895f 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/luatex/luatex-lua.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/luatex/luatex-lua.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us engine=luatex runpath=texruns:manuals/luatex
\environment luatex-style
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/luatex/luatex-math.tex b/Master/texmf-dist/doc/context/sources/general/manuals/luatex/luatex-math.tex
index 89c0836ba76..4b86c586439 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/luatex/luatex-math.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/luatex/luatex-math.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us engine=luatex runpath=texruns:manuals/luatex
\environment luatex-style
@@ -130,6 +130,20 @@ sections:
\LL
\stoptabulate
+Instead of the pseudo class variable (7) you can use a family number as signal
+for using the current family. This permits classifying characters with a class
+and still let the family adapt. The trigger family is set with \lpr
+{variablefam}. So:
+
+\starttyping
+\variablefam"24
+\Umathchardef\foo "3 "24 123
+\foo \fam9
+\stoptyping
+
+Results in a curly left brace taken from family 9 with class \quote {relation}
+and spacing around it will be accordingly.
+
\stopsection
\startsection[title={Math styles}]
@@ -754,6 +768,11 @@ to fully control spacing. Therefore \LUATEX\ comes with a new directive: \lpr
\LL
\stoptabulate
+By default the short skip detection is not adapted to r2l typesetting and that
+hasn't been the case since the start of the project. Changing it could break
+hacks that users came up with but when you set \lpr {matheqdirmode} to a positive
+value direction will be taken into account.
+
\subsection {Nolimit correction}
\topicindex {math+limits}
@@ -769,13 +788,13 @@ 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 % probably not ok, we need a raw int here
+ \NC \mathnolimitsmode0 $\displaystyle\mathop{\normalint}\nolimits^0_1$
+ \NC \mathnolimitsmode1 $\displaystyle\mathop{\normalint}\nolimits^0_1$
+ \NC \mathnolimitsmode2 $\displaystyle\mathop{\normalint}\nolimits^0_1$
+ \NC \mathnolimitsmode3 $\displaystyle\mathop{\normalint}\nolimits^0_1$
+ \NC \mathnolimitsmode4 $\displaystyle\mathop{\normalint}\nolimits^0_1$
+ \NC \mathnolimitsmode8000 $\displaystyle\mathop{\normalint}\nolimits^0_1$
\NC \NR
\TB
\BC mode
@@ -817,9 +836,9 @@ experimenting.
\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.
+before noads that represent some more complex structure (read: everything that is
+not an ord, bin, rel, open, close, punct or inner). A value of~2 will enforce the
+old school font code path for all italics. We show a Cambria example.
\starttexdefinition Whatever #1
\NC \type{\mathitalicsmode = #1}
@@ -1575,6 +1594,40 @@ 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.
+\subsection {Math options with \lpr {mathdefaultsmode}}
+
+This option has been introduced because \LATEX\ developers wanted some of the
+defaults to be different from the ones that were set in stone when we froze
+\LUATEX. The default values are:
+
+\starttabulate[|l|c|c|]
+\DB \BC scanning \BC rendering \NC \NR
+\TB
+\NC radical/root \NC cramped \NC cramped \NC \NR
+\NC under delimiter \NC cramped \NC supstyle \NC \NR
+\NC over delimiter \NC cramped \NC substyle \NC \NR
+\NC delimiter under \NC cramped \NC current \NC \NR
+\NC delimiter over \NC cramped \NC current \NC \NR
+\LL
+\stoptabulate
+
+When \type {\mathdefaultsmode} is larger than zero, we have:
+
+\starttabulate[|l|c|c|]
+\DB \BC scanning \BC rendering \NC \NR
+\TB
+\NC radical/root \NC cramped \NC cramped \NC \NR
+\NC under delimiter \NC substyle \NC substyle \NC \NR
+\NC over delimiter \NC supstyle \NC supstyle \NC \NR
+\NC delimiter under \NC current \NC current \NC \NR
+\NC delimiter over \NC cramped \NC cramped \NC \NR
+\LL
+\stoptabulate
+
+It is outside the scope of this manual to discuss the rationale behind these
+defaults. The zero values date back from the early times. If needed you can
+explicitly set the style in the content argument.
+
\subsection {Math options with \lpr {mathoption}}
The logic in the math engine is rather complex and there are often no universal
@@ -1588,7 +1641,7 @@ This option was introduced for testing purposes when the math engine got split
code paths and it forces the engine to treat new fonts as old ones with respect
to italic correction etc. There are no guarantees given with respect to the final
result and unexpected side effects are not seen as bugs as they relate to font
-properties. Ther eis currently only one option:
+properties. There is currently only one option:
\startbuffer
\mathoption old 1
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 bf4233165b9..3bd23ff2724 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
@@ -1,4 +1,4 @@
-% language=uk
+% language=us engine=luatex runpath=texruns:manuals/luatex
\environment luatex-style
@@ -507,6 +507,14 @@ opened it up.
\stopsubsection
+\startsubsection[title=Changes from anywhere]
+
+The \type {\partokenname} and \type {\partokencontext} primitives are taken from
+the \PDFTEX\ change file posted on the implementers list. They are explained in
+the \PDFTEX\ manual and are classified as \ETEX\ extensions.
+
+\stopsubsection
+
\startsubsection[title=Changes from standard \WEBC]
\topicindex {\WEBC}
@@ -592,6 +600,7 @@ primitives (for as far their functionality is still around) you now can do this:
\starttyping
\protected\def\pdfliteral {\pdfextension literal}
+\protected\def\pdflateliteral {\pdfextension lateliteral}
\protected\def\pdfcolorstack {\pdfextension colorstack}
\protected\def\pdfsetmatrix {\pdfextension setmatrix}
\protected\def\pdfsave {\pdfextension save\relax}
@@ -658,6 +667,8 @@ The configuration related registers have become:
\edef\pdfgentounicode {\pdfvariable gentounicode}
\edef\pdfomitcidset {\pdfvariable omitcidset}
\edef\pdfomitcharset {\pdfvariable omitcharset}
+\edef\pdfomitinfodict {\pdfvariable omitinfodict}
+\edef\pdfomitmediabox {\pdfvariable omitmediabox}
\edef\pdfpagebox {\pdfvariable pagebox}
\edef\pdfminorversion {\pdfvariable minorversion}
\edef\pdfuniqueresname {\pdfvariable uniqueresname}
@@ -737,11 +748,12 @@ normally generated by the engine. You even need to include the brackets here!
Although we started from a merge of \PDFTEX\ and \ALEPH, by now the code base as
well as functionality has diverted from those parents. Here we show the options
-that can be passed to the extensions.
+that can be passed to the extensions. The \type {shipout} option is a compatibility
+feature. Instead one can use the \type {deferred} prefix.
\starttexsyntax
\pdfextension literal
- [ direct | page | raw ] { tokens }
+ [shipout] [ direct | page | raw ] { tokens }
\stoptexsyntax
\starttexsyntax
@@ -907,6 +919,8 @@ The engine sets the following defaults.
\pdfgentounicode 0
\pdfomitcidset 0
\pdfomitcharset 0
+\pdfomitinfodict 0
+\pdfomitmediabox 0
\pdfpagebox 0
\pdfminorversion 4
\pdfuniqueresname 0
@@ -1129,6 +1143,14 @@ kerns, should be handled in the input or macro package because there is no way w
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.
+Directions are complicated by the fact that they often need to work over groups
+so a separate grouping related stack is used. A side effect is that there can be
+paragraphs with only a local par node followed by direction synchronization
+nodes. Paragraphs like that are seen as empty paragraphs and therefore ignored.
+Because \type {\noindent} doesn't inject anything but a \type {\indent} injects
+an box, paragraphs with only an indent and directions are handles ad paragraphs
+with content.
+
\stopsubsection
\startsubsection[title={Controlling glue with \lpr {breakafterdirmode}}]
@@ -1387,6 +1409,26 @@ incompatible. We already expose some more details.
\stopsubsection
+\startsubsection[title=Hyperlinks]
+
+\topicindex {hyperlinks}
+
+There is an experimental feature that makes multi|-|line hyper links behave a
+little better, fixing some side effects that showed up in r2l typesetting but
+also can surface in l2r. Because this got unnoticed till 2023, and because it
+depends bit on how macro packages deal with hyper links, the fix is currently
+under parameter control:
+
+\starttyping
+\pdfvariable linking = 1
+\stoptyping
+
+That way (we hope) legacy documents come out as expected, whatever those
+expectations are. One of the aspects dealt with concerns (unusual) left and right
+skips.
+
+\stopsubsection
+
\stopsection
\stopchapter
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/luatex/luatex-nodes.tex b/Master/texmf-dist/doc/context/sources/general/manuals/luatex/luatex-nodes.tex
index a379b7b0a4d..1883a0c46cb 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/luatex/luatex-nodes.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/luatex/luatex-nodes.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us engine=luatex runpath=texruns:manuals/luatex
\environment luatex-style
@@ -890,6 +890,9 @@ The difference between \type {data} and \type {string} is that on assignment, th
\type {data} field is converted to a token list, cf.\ use as \lpr {latelua}. The
\type {string} version is treated as a literal string.
+When a function is used, it gets called with as first argument the node that triggers
+the call.
+
\stopsection
\startsection[title={\DVI\ backend whatsits}]
@@ -911,7 +914,7 @@ output file.
\startsection[title={\PDF\ backend whatsits}]
-\subsection{\whs {pdf_literal}}
+\subsection{\whs {pdf_literal} and \whs {pdf_late_literal}}
\starttabulate[|l|l|p|]
\DB field \BC type \BC explanation \NC \NR
@@ -959,7 +962,7 @@ what you generate.
\NC \type{width} \NC number \NC the width (not used in calculations) \NC \NR
\NC \type{height} \NC number \NC the height (not used in calculations) \NC \NR
\NC \type{depth} \NC number \NC the depth (not used in calculations) \NC \NR
-\NC \type{objnum} \NC number \NC the referenced \PDF\ object number \NC \NR
+\NC \type{objnum} \NC number \NC the referenced \PDF\ (structure) object number \NC \NR
\NC \type{data} \NC string \NC the annotation data \NC \NR
\LL
\stoptabulate
@@ -1016,10 +1019,16 @@ objects.
\TB
\NC \type{action_type} \NC number \NC the kind of action involved \NC \NR
\NC \type{action_id} \NC number or string \NC token list reference or string \NC \NR
-\NC \type{named_id} \NC number \NC the index of the destination \NC \NR
+%NC \type{named_id} \NC number \NC the index of the destination \NC \NR
+% a strange key but needed for latex; a probably downward incompable patch instead of a fix
+\NC \type{named_id} \NC number \NC are \type {dest_id} and \type {struct_id} string values? \NC \NR
\NC \type{file} \NC string \NC the target filename \NC \NR
\NC \type{new_window} \NC number \NC the window state of the target \NC \NR
\NC \type{data} \NC string \NC the name of the destination \NC \NR
+% needed for latex and therefore equivalent to pdftex
+\NC \type{struct_id} \NC nil \NC the action does not reference a structure destination \NC \NR
+\NC \NC number \NC id of the referenced structure destination \NC \NR
+\NC \NC string \NC name of the referenced structure destination \NC \NR
\LL
\stoptabulate
@@ -1241,9 +1250,9 @@ This converts a single type name to its internal numeric representation.
\libindex {type}
\libindex {subtype}
-In 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}
+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
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 e6389528414..1d0e3f8087d 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
@@ -1,4 +1,4 @@
-% language=uk
+% language=us engine=luatex runpath=texruns:manuals/luatex
\environment luatex-style
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/luatex/luatex-registers.tex b/Master/texmf-dist/doc/context/sources/general/manuals/luatex/luatex-registers.tex
index 36b1ec0513d..b69b71b02fd 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/luatex/luatex-registers.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/luatex/luatex-registers.tex
@@ -1,3 +1,5 @@
+% language=us engine=luatex runpath=texruns:manuals/luatex
+
\environment luatex-style
\startcomponent luatex-registers
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/luatex/luatex-statistics.tex b/Master/texmf-dist/doc/context/sources/general/manuals/luatex/luatex-statistics.tex
index efd7f1c75c4..e008f17fd25 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/luatex/luatex-statistics.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/luatex/luatex-statistics.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us engine=luatex runpath=texruns:manuals/luatex
\environment luatex-style
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/luatex/luatex-style.tex b/Master/texmf-dist/doc/context/sources/general/manuals/luatex/luatex-style.tex
index aa0a7edc3fe..a1dd4887f4a 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/luatex/luatex-style.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/luatex/luatex-style.tex
@@ -1,3 +1,5 @@
+% language=us engine=luatex runpath=texruns:manuals/luatex
+
\startenvironment luatex-style
% todo: use \useMPlibrary[lua]
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/luatex/luatex-titlepage.tex b/Master/texmf-dist/doc/context/sources/general/manuals/luatex/luatex-titlepage.tex
index d9ca4b3f933..726a1ae3f55 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/luatex/luatex-titlepage.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/luatex/luatex-titlepage.tex
@@ -1,3 +1,5 @@
+% language=us engine=luatex runpath=texruns:manuals/luatex
+
\environment luatex-style
\startcomponent luatex-titlepage
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 46739513a60..6031b7c5fc9 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
@@ -1,4 +1,4 @@
-% macros=mkvi engine=luatex
+% language=us engine=luatex runpath=texruns:manuals/luatex
% \nopdfcompression
@@ -8,7 +8,7 @@
%
% same runtime as regular context or linux
% author : Hans Hagen with Taco Hoekwater, Luigi Scarso & Hartmut Henkel
-% copyright : PRAGMA ADE & ConTeXt Development Team
+% copyright : ConTeXt Development Team
% license : Creative Commons Attribution ShareAlike 4.0 International
% reference : pragma-ade.nl | contextgarden.net | texlive (related) distributions
% origin : the ConTeXt distribution
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/manuals-explaining-contents.tex b/Master/texmf-dist/doc/context/sources/general/manuals/manuals-explaining-contents.tex
index 3e1fadabc13..1d3c8ed7c84 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/manuals-explaining-contents.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/manuals-explaining-contents.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
\startcomponent manuals-explaining-contents
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/manuals-explaining-cover.tex b/Master/texmf-dist/doc/context/sources/general/manuals/manuals-explaining-cover.tex
index 8b4f3e891ba..a77d35e4e49 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/manuals-explaining-cover.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/manuals-explaining-cover.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
% 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
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/manuals-explaining-environment.tex b/Master/texmf-dist/doc/context/sources/general/manuals/manuals-explaining-environment.tex
index f896c219bbe..dfe4d4e6440 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/manuals-explaining-environment.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/manuals-explaining-environment.tex
@@ -116,7 +116,7 @@
[chapter]
[pagenumber=no,
style=bold,
- before={\blank\startcolor[\structurelistuservariable{color}]},
+ before={\blank\startcolor[\rawstructurelistuservariable{color}]},
after={\placelist[section]\stopcolor}]
\setuplist
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/manuals-xml-environment.tex b/Master/texmf-dist/doc/context/sources/general/manuals/manuals-xml-environment.tex
index 5a5d9a92de2..b5adb5b6a67 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/manuals-xml-environment.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/manuals-xml-environment.tex
@@ -1,7 +1,4 @@
-% language=uk
-%
-% author : Hans Hagen, PRAGMA ADE, NL
-% license : Creative Commons, Attribution-NonCommercial-ShareAlike 3.0 Unported
+% language=us
\usemodule[abr-01]
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/math/math-alignments.tex b/Master/texmf-dist/doc/context/sources/general/manuals/math/math-alignments.tex
index bb2801b8a90..2f0088c34da 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/math/math-alignments.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/math/math-alignments.tex
@@ -1,3 +1,5 @@
+% language=us runpath=texruns:manuals/math
+
\environment math-layout
\startcomponent math-alignments
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/math/math-combining.tex b/Master/texmf-dist/doc/context/sources/general/manuals/math/math-combining.tex
index 5cd2ccb9b34..f47ec78a517 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/math/math-combining.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/math/math-combining.tex
@@ -1,3 +1,5 @@
+% language=us runpath=texruns:manuals/math
+
\environment math-layout
\startcomponent math-combining
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/math/math-contents.tex b/Master/texmf-dist/doc/context/sources/general/manuals/math/math-contents.tex
index 7d8fb05c76f..3432ccd5230 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/math/math-contents.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/math/math-contents.tex
@@ -1,3 +1,5 @@
+% language=us runpath=texruns:manuals/math
+
\environment math-layout
\startcomponent math-contents
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/math/math-definitions.tex b/Master/texmf-dist/doc/context/sources/general/manuals/math/math-definitions.tex
index d8903121a49..61dee1be94c 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/math/math-definitions.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/math/math-definitions.tex
@@ -1,3 +1,5 @@
+% language=us runpath=texruns:manuals/math
+
\environment math-layout
\startcomponent math-definitions
@@ -77,8 +79,8 @@ So this time we get:
\getbuffer
-We can now redefine the \quote {interiorset} symbol to use
-\type {0x2217} instead of \type {0x2218}:
+We can now redefine the \quote {interiorset} symbol to use \type {0x2217} instead
+of \type {0x2218}:
\startbuffer
\definemathover[mysymbol][interiorset]["2217]
@@ -92,7 +94,9 @@ We can now redefine the \quote {interiorset} symbol to use
Of course normally you will not use color:
+\pushoverloadmode
\getbuffer
+\popoverloadmode
\stopsection
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/math/math-features.tex b/Master/texmf-dist/doc/context/sources/general/manuals/math/math-features.tex
index 863493804b7..913aba95fcd 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/math/math-features.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/math/math-features.tex
@@ -1,3 +1,5 @@
+% language=us runpath=texruns:manuals/math
+
\environment math-layout
\usemodule[fonts-features]
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/math/math-fonts-accents-001.tex b/Master/texmf-dist/doc/context/sources/general/manuals/math/math-fonts-accents-001.tex
new file mode 100644
index 00000000000..4c9737fa7ef
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/math/math-fonts-accents-001.tex
@@ -0,0 +1,23 @@
+\environment math-fonts-helpers
+
+\startbuffer[accents]
+ $+\bar{u}\bar{f}\bar{\Omega}$
+ $\overbar{u}\overbar{f}\overbar{\Omega}$
+ $\overline{u}\overline{f}\overline{\Omega}$
+ \blank
+ $\dot{u}\dot{f}\dot{\Omega}$
+ $\hat{u}\hat{f}\hat{\Omega}$
+ $\tilde{u}\tilde{f}\tilde{\Omega}$
+ \blank
+ $\ddot{u}\ddot{f}\ddot{\Omega}$
+ $\widehat{u}\widehat{f}\widehat{\Omega}$
+ $\widetilde{u}\widetilde{f}\widetilde{\Omega}$
+\stopbuffer
+
+\starttext
+ \MathSamples [
+ ] [
+ accents
+ ]
+
+\stoptext
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/math/math-fonts-helpers.tex b/Master/texmf-dist/doc/context/sources/general/manuals/math/math-fonts-helpers.tex
new file mode 100644
index 00000000000..7d52c2a7f39
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/math/math-fonts-helpers.tex
@@ -0,0 +1,83 @@
+\starttexdefinition OneMathSample #1#2
+ \startcontent
+ \switchtobodyfont[#1]
+ \framed[align=middle,offset=2ex,corner=round,rulethickness=1pt,framecolor=darkred] \bgroup
+ \getbuffer[#2]%
+ \blank[back]
+ \egroup
+ \stopcontent
+ \startcaption
+ \tt\tfb\color[darkred]{#1}
+ \stopcaption
+\stoptexdefinition
+
+\startluacode
+ local default = {
+ "cambria",
+ "modern",
+ -- "modernlatin",
+ "dejavu",
+ "pagella",
+ "termes",
+ "bonum",
+ "schola",
+ "lucidadk",
+ -- "xits",
+ "stixtwo",
+ "libertinus",
+ "ebgaramond",
+ "kpfonts",
+ -- "minion",
+ -- "asana"
+ }
+
+ function document.MathSamples(list,samples)
+ list = string.strip(list)
+ samples = string.strip(samples)
+ local s = list ~= "" and utilities.parsers.settings_to_array(list) or default
+ local n = #s
+ if s[n] == "" then
+ n = n - 1
+ end
+ local m = n % 4
+ local x = 4
+ local y = n // 4
+ if m > 0 then
+ x = x + 1
+ end
+ -- for i=1,n do
+ -- context.usebodyfont { s[i] }
+ -- end
+-- context.startTEXpage { offset = "2ex" }
+ context.startcombination { nx = x, ny = y, location = "top", distance = "2ex", after = "\\blank[2*big]" }
+ for i=1,n do
+ context.OneMathSample(s[i],samples)
+ end
+ context.stopcombination()
+-- context.stopTEXpage()
+ end
+\stopluacode
+
+\protected\def\MathSamples[#1]#*[#2]%
+ {\ctxlua{document.MathSamples("#1","#2")}}
+
+\def\DoShowNextBox
+ {\begingroup
+ \dowithnextbox
+ {\showboxinbuffer{mathbox}\nextbox\plusone
+ \midaligned{\framed{\box\nextbox}}%
+ \switchtobodyfont[4pt]
+ \typebuffer[mathbox][option=TEX]%
+ \endgroup
+ \endgroup}%
+ \hbox}
+
+\protected\def\StartShowBox
+ {\begingroup
+ \protected\def\StopShowBox{\removeunwantedspaces\egroup}%
+ \DoShowNextBox
+ \bgroup\ignorespaces}
+
+\protected\def\ShowBox
+ {\begingroup
+ \DoShowNextBox}
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/math/math-fonts-italics-002.tex b/Master/texmf-dist/doc/context/sources/general/manuals/math/math-fonts-italics-002.tex
new file mode 100644
index 00000000000..89d93deb3f7
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/math/math-fonts-italics-002.tex
@@ -0,0 +1,28 @@
+\environment math-fonts-helpers
+
+\startbuffer[italic-1]
+ $\showglyphs \showfontitalics V^1_2 + V^1 + V_2$
+ \blank
+ $\showglyphs \showfontitalics f^1_2 + g^1_2 + v^1_2 + w^1_2$
+ \blank
+ $\showglyphs \showfontitalics A^1_2 + B^1_2 + V^1_2 + W^1_2$
+ \blank
+\stopbuffer
+
+\startbuffer[italic-2]
+ \mathfontcontrol \italicshapekernmathcontrolcode
+ \mathcontrolmode \plusone
+ \getbuffer[italic-1]%
+\stopbuffer
+
+% \continueifinputfile{italics-002}
+
+\starttext
+
+ \MathSamples [
+ ] [
+ italic-1,
+ italic-2
+ ]
+
+\stoptext
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/math/math-fonts-primes-001.tex b/Master/texmf-dist/doc/context/sources/general/manuals/math/math-fonts-primes-001.tex
new file mode 100644
index 00000000000..a93934defae
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/math/math-fonts-primes-001.tex
@@ -0,0 +1,28 @@
+% \enableexperiments[fonts.compact]
+% \enabletrackers[fonts.defining]
+
+\environment math-fonts-helpers
+
+\startbuffer[primes]
+ $\textstyle f' f'(x) $
+ $\textstyle f'' f''(x) $
+ $\textstyle f''' f'''(x) $
+ \blank
+ $\scriptstyle f' f'(x) $
+ $\scriptstyle f'' f''(x) $
+ $\scriptstyle f''' f'''(x) $
+ \blank
+ $\scriptscriptstyle f' f'(x) $
+ $\scriptscriptstyle f'' f''(x) $
+ $\scriptscriptstyle f''' f'''(x) $
+\stopbuffer
+
+\setupmathematics[stylealternative={calligraphic}]
+
+\starttext
+ \MathSamples [
+ ] [
+ primes
+ ]
+
+\stoptext
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/math/math-fonts-radicals-001.tex b/Master/texmf-dist/doc/context/sources/general/manuals/math/math-fonts-radicals-001.tex
new file mode 100644
index 00000000000..a88378b9814
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/math/math-fonts-radicals-001.tex
@@ -0,0 +1,18 @@
+\environment math-fonts-helpers
+
+\startbuffer[scripts]
+ \ruledhbox{$\textstyle \char"221A \sqrt{x} \sqrt[3]{x} \sqrt{\frac{1}{x}}$}
+ \blank
+ \ruledhbox{$\scriptstyle \char"221A \sqrt{x} \sqrt[3]{x} \sqrt{\frac{1}{x}}$}
+ \blank
+ \ruledhbox{$\scriptscriptstyle \char"221A \sqrt{x} \sqrt[3]{x} \sqrt{\frac{1}{x}}$}
+\stopbuffer
+
+\starttext
+
+ \MathSamples [
+ ] [
+ scripts
+ ]
+
+\stoptext
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/math/math-fonts-scripts-001.tex b/Master/texmf-dist/doc/context/sources/general/manuals/math/math-fonts-scripts-001.tex
new file mode 100644
index 00000000000..b0af35e6cb1
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/math/math-fonts-scripts-001.tex
@@ -0,0 +1,18 @@
+\environment math-fonts-helpers
+
+\startbuffer[scripts]
+ \ruledhbox{$\textstyle x\char"207A x\char"207B x\char"208A x\char"208B$}
+ \blank
+ \ruledhbox{$\scriptstyle x\char"207A x\char"207B x\char"208A x\char"208B$}
+ \blank
+ \ruledhbox{$\scriptscriptstyle x\char"207A x\char"207B x\char"208A x\char"208B$}
+\stopbuffer
+
+\starttext
+
+ \MathSamples [
+ ] [
+ scripts
+ ]
+
+\stoptext
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/math/math-fonts.tex b/Master/texmf-dist/doc/context/sources/general/manuals/math/math-fonts.tex
new file mode 100644
index 00000000000..421dfe43eae
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/math/math-fonts.tex
@@ -0,0 +1,263 @@
+% language=us runpath=texruns:manuals/math
+
+\environment math-layout
+\environment math-fonts-helpers
+
+% todo: use "keep-latin-modern-math.otf" and "keep-texgyre-pagella-math.otf"
+
+\startcomponent math-fonts
+
+\startchapter[title=Fonts]
+
+\startsection[title=Introduction]
+
+In this document we will discuss how we deal with \OPENTYPE\ math fonts. There is
+a set of samples that are used for testing. One problem is that these fonts
+evolve so what we discuss and fix today might not be applicable tomorrow in which
+case this document can also be seen from a historic perspective. We will mostly
+use \CONTEXT\ speak.
+
+The examples that we show use test files and normally they should render okay. If
+not, we need to fix something. They are part of a set of test files by Mikael
+Sundqvist and Hans Hagen made in the perspective of defining proper goodie files
+and this chapter summarizes our journey.
+
+{\em This chapter is uncorrected work in progress.}
+
+\stopsection
+
+\startsection[title=Italics]
+
+First of all we need to mention some fundamental differences between a
+traditional setup and one for \OPENTYPE\ \UNICODE\ fonts. When \TEX\ showed up,
+fonts had at most 256 characters. Sets of characters are organized in so called
+families of which there are 16: family zero is the one used for what is called
+roman (upright), family one for so called math italic characters, family two for
+all kind of symbols and family three for extensible characters. The \TEX\
+distribution comes with matching fonts. Now, when one enters a formula like this:
+
+\starttyping
+y = \sqrt{x^2 + 4}
+\stoptyping
+
+the \type {x} and \type {y} are math italics (family 1), \type {1} and \type {2}
+are upright (family 0), the \type {+} is a symbol (family 2) and the radical
+comes from family 3 as it can differ in size. The letters are actually from the
+math {\it italic} alphabet and there can be other alphabets: bold, bold italic,
+blackboard, script, etc. For these one defines additional families or when one
+runs out of families symbolic names can be used to map to the non alphabetic
+\ASCII\ slots.
+
+In \CONTEXT\ right from when we started with \LUATEX\ the multiple families were
+dropped in favor of just one. \footnote {This is not entirely true because we
+also have one for bold, and two for r2l regular and bold, but these are dealt
+with in a special way: all definitions use family zero.} Because \UNICODE\ has a
+concept of math alphabets (unfortunately with holes) we use \UNICODE\ \OPENTYPE\
+fonts as well as (certainly before there was anything else than Cambria) virtual
+(runtime) assemblies of traditional \TYPEONE\ fonts.
+
+In this and following chapters we only discuss the \OPENTYPE\ fonts because that
+is what we normally deal with. One complication there is that, although Cambria
+set a clear standard, the fonts that evolved in the \TEX\ ecosystem are to a
+large extend modelled after the traditional \TEX\ fonts. Fonts that originate
+from elsewhere are a mix of both models. And it is this curious mix of approaches
+that forces us to adapt the machinery and|/|or the fonts to our needs. For a long
+time \CONTEXT\ assumed some consistency and although there were mechanisms in
+place to deal with these (often not) subtle differences, in the long run that was
+not what we wanted. So, when these fonts became more and more frozen we decided
+to go for a more individual long term \quote {fix them runtime} solution.
+
+A result is that in \LMTX\ we use a similar approach as in \MKIV\ but instead of
+trying to fix the fonts automatically (driven by pseudo features), we now
+delegate that to the font goodie mechanism where we can also fine tune more
+easily per font: runtime tweaks. The basics are the same but it is a bit easier
+that way, also because in the worst case one can program a specific tweak without
+side effects for the rest.
+
+\startplacefigure[title={Italics Sample 2}]
+ \externalfigure
+ [math-fonts-italics-002.tex]
+ [width=\textwidth]
+\stopplacefigure
+
+The tweak that deals with italics (and other shapes) is:
+
+\starttabulate[|T|||]
+\NC tweak \NC \type {dimensions} \NC \NC \NR
+\NC list \NC table \NC a hash with treatments \NC \NR
+\stoptabulate
+
+\stopsection
+
+\startsection[title={Primes}]
+
+% \ctxlua{nodes.tasks.disableaction("math","noads.handlers.fixscripts")}
+% \ctxlua{nodes.tasks.enableaction("math","noads.handlers.fixscripts")}
+
+Primes are implemented in a curious way. In traditional \TEX\ they are treated as
+superscripts which is often achieved by making the single quote into an active
+character (in math mode) that takes care of this. The dimensions of a prime are
+such that it comes at the right spot (according to the designers wish). However,
+in \UNICODE\ the same symbol is used for minutes in text mode and because there
+are no duplicates in \UNICODE, it is that already superscripted symbol that we
+see show up in fonts. There is (for some reason) no dedicated single prime slot
+(and one can argue that minutes and primes are really different things and if
+not, why then does greek and latin don't share more).
+
+In \CONTEXT\ we don't want to mess with active characters and even more, we want
+proper symbols for the multiple primes. At the same time we need to handle
+following superscripts as well as cases where a subscript is used as index to a
+nucleus where the whole is then primed. This is implemented in a combination of
+\TEX, \LUA\ and normalized prime symbols.
+
+\startplacefigure[title={Primes Sample 1}]
+ \externalfigure
+ [math-fonts-primes-001.tex]
+ [width=\textwidth]
+\stopplacefigure
+
+Fixing primes boils down to fixing dimensions and repositioning the shape.
+Optionally the multiples can be emulated and a smaller size can be chosen. It's
+also a matter of taste and primes are often not the best designed symbols.
+
+The specification is:
+
+\starttabulate[|T|||]
+\NC tweak \NC \type {fixprimes} \NC \NC \NR
+\NC factor \NC number \NC fraction of the accent base height that the prime shifts up \NC \NR
+\NC smaller \NC boolean \NC when \type {true}, replace multiples \NC \NR
+\NC scale \NC number \NC the glyph scale \NC \NR
+\NC fake \NC number \NC when set, fake multiples and use this width 0.75 \NC \NR
+\NC keep \NC boolean \NC keep text size prime as it is \NC \NR
+\stoptabulate
+
+In \MKIV\ we remap primes but in \LMTX\ we adapt the regular slots. As a
+consequence we sacrifice the text size minutes. The \type {keep} option will
+leave the text size variant as it is.
+
+Keep in mind that primes are processed depending on what precedes and follows so
+you cannot really test a character by just calling it: when there is something in
+front it will become a superscripted prime.
+
+\stopsection
+
+\startsection[title={Scripts}]
+
+This tweak will add superscript characters for plus and minus. The main reason
+for them being supplied is that we need them to indicate an explicit (minus)
+sign in calculator math examples.
+
+\startplacefigure[title={Scripts Sample 1}]
+ \externalfigure
+ [math-fonts-scripts-001.tex]
+ [width=\textwidth]
+\stopplacefigure
+
+The specification is:
+
+\starttabulate[|T|||]
+\NC tweak \NC \type {addscripts} \NC \NC \NR
+\NC scale \NC number \NC the scale of the scripted character \NC \NR
+\stoptabulate
+
+Keep in mind that these scripts are processed depending on what precedes so you
+cannot really test a character by just calling it.
+
+\stopsection
+
+\startsection[title={Radicals}]
+
+The traditional \TEX\ engine is made in conjunction with the Computer Modern
+Fonts and there the radical symbol sits below the baseline so that the height
+indicates the rule thickness. In \OPENTYPE\ fonts this is a variable. The Latin
+Modern Math font inherits this somewhat strange position property but we can fix
+that with this tweak:
+
+\startplacefigure[title={Radicals Sample 1}]
+ \externalfigure
+ [math-fonts-radicals-001.tex]
+ [width=\textwidth]
+\stopplacefigure
+
+There are no options:
+
+\starttabulate[|T|||]
+\NC tweak \NC \type {fixradicals} \NC \NC \NR
+\stoptabulate
+
+\stopsection
+
+\startsection[title={Accents}]
+
+We cannot yet tweak accents, but here is an example:
+
+\startplacefigure[title={Accents Sample 1}]
+ \externalfigure
+ [math-fonts-accents-001.tex]
+ [width=\textwidth]
+\stopplacefigure
+
+\stopsection
+
+\startsection[title={Spacing}]
+
+There are \UNICODE\ characters for various spaces and this option defines them
+when they are not present. It is up to the macro package to make sure that the
+non breakable spaces are treated as such. In this document we get:
+
+\def\ShowSpacing#1#2%
+ {\NC \ruledhbox{\showmakeup[glue]\showstruts\strut\char"#1\strut}\NC#2\NC\NR}
+
+\starttabulate[|w(1.5em)|T|]
+ \ShowSpacing{00A0}{nbsp}
+ \ShowSpacing{2000}{enquad}
+ \ShowSpacing{2001}{emquad}
+ \ShowSpacing{2002}{enspace}
+ \ShowSpacing{2003}{emspace}
+ \ShowSpacing{2004}{threeperemspace}
+ \ShowSpacing{2005}{fourperemspace}
+ \ShowSpacing{2006}{sixperemspace}
+ \ShowSpacing{2007}{figurespace}
+ \ShowSpacing{2008}{punctuationspace}
+ \ShowSpacing{2009}{breakablethinspace}
+ \ShowSpacing{200A}{hairspace}
+ \ShowSpacing{200B}{zerowidthspace}
+ \ShowSpacing{202F}{narrownobreakspace}
+ \ShowSpacing{205F}{maththinspace}
+\stoptabulate
+
+There are no options:
+
+\starttabulate[|T|||]
+\NC tweak \NC \type {checkspacing} \NC \NC \NR
+\stoptabulate
+
+\stopsection
+
+\startsection[title=Parameters]
+
+An \OPENTYPE\ math fonts has a lot of parameters and because the engine let you
+set them for every style (regular and cramped) you can exercise a lot of control.
+A difference with traditional math is that we only have one cramped parameter:
+\typ {SuperscriptShiftUpCramped}.
+
+\startbuffer
+\startoverlay
+ {\ruledhbox{$\strut \red \displaystyle x^2_1 x^2 x_1$}}
+ {\ruledhbox{$\strut \blue \crampeddisplaystyle x^2_1 x^2 x_1$}}
+\stopoverlay
+\stopbuffer
+
+\typebuffer
+
+Only the superscript is affected (in some miraculous way):
+
+\startlinecorrection
+ \scale[height=3cm]{\switchtobodyfont[pagella]\getbuffer}
+\stoplinecorrection
+
+\stopsection
+
+\stopchapter
+
+\stopcomponent
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/math/math-framing-001.tex b/Master/texmf-dist/doc/context/sources/general/manuals/math/math-framing-001.tex
index 5081b8ad2b5..8203af611e6 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/math/math-framing-001.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/math/math-framing-001.tex
@@ -1,3 +1,5 @@
+% language=us runpath=texruns:manuals/math
+
\setuplayout[topspace=5mm,bottomspace=5mm,height=middle,header=1cm,footer=0cm]
\starttext
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/math/math-framing.tex b/Master/texmf-dist/doc/context/sources/general/manuals/math/math-framing.tex
index b93d57f4926..6cd5efbe3ac 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/math/math-framing.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/math/math-framing.tex
@@ -1,3 +1,5 @@
+% language=us runpath=texruns:manuals/math
+
\environment math-layout
\startcomponent math-framing
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/math/math-fun.tex b/Master/texmf-dist/doc/context/sources/general/manuals/math/math-fun.tex
new file mode 100644
index 00000000000..e4291154929
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/math/math-fun.tex
@@ -0,0 +1,118 @@
+% language=us runpath=texruns:manuals/math
+
+\environment math-layout
+
+\startcomponent math-fun
+
+\usemodule[mathfun]
+
+\startchapter[title=Fun stuff] % As is watching the funplex DVD.
+
+% \startsection[title=How it started]
+
+When I decided to add the \type {\uuid} macro (a trivial task because there was
+already a \LUA\ function for it in \CONTEXT) I wondered about other functions
+that could be added, like those for sine and cosine. There is no real need
+for that because we can already do this:
+
+\startbuffer[a]
+\luaexpr{math.sin(math.pi/4)}
+\stopbuffer
+
+\typebuffer[a]
+
+\startbuffer[b]
+\luaexpr[.4N]{math.sin(math.pi/4)}
+\stopbuffer
+
+which gives us \inlinebuffer[a]\ as result, but still one can ponder the
+usability of additional macros. When seeing this, one of the first things that
+probably comes to mind is how to get less digits, and indeed that can be
+achieved, as \inlinebuffer[b]\ demonstrates.
+
+\typebuffer[b]
+
+The optional argument between square brackets is a template as we know from other
+\CONTEXT\ commands without the leading percentage sign. But what if we don't want
+this expression and explicit math function call?
+
+\startbuffer
+$ \sin (x) = \the\sin{pi/8} $
+\stopbuffer
+
+\typebuffer
+
+This gives us a normal rendered sin function symbol at the left hand and a
+numeric result at the right hand: \inlinebuffer. The nice thing about it is that
+we don't need to come up with new macro names. \footnote {At some point \CONTEXT\
+might introduce a namespace mechanism to deal with possible conflicts between
+environments.} In a similar fashion we can do this:
+
+\startbuffer
+$ \sind(x) = \luaexpr[.4N]{math.sind(120)} = \the\sind[.4N]{120} $
+\stopbuffer
+
+\typebuffer
+
+Both calls give the same result: \inlinebuffer\ and in case you wonder why we
+have only three digits: the \type {N} formatter removes trailing zeros. However,
+the \type {\the} prefix is still not that nice, apart from the fact that we abuse
+a feature of the \LUA\ interface meant for other purposes (read: we cheat). So,
+in a next step in exploring this I cooked up:
+
+\startbuffer
+$ \sqrt(x) = \the\sqrt[.3N] {2} $
+$ \sqrt(x) = \compute\sqrt[.3N] {2} $
+\stopbuffer
+
+\typebuffer
+
+There is still a prefix but \type {\compute} looks more natural. It is not an
+alias for \type {\the} but a shortcut for a prefix feature that can drive all
+kind of interpretations of in this case \type {\sin}, and that is probably where
+the real fun will start. Instead of functions we can also have constants:
+
+\startbuffer
+$ \pi = \compute\pi[.4N] $
+\stopbuffer
+
+In case you wonder how extensible this mechanism is, here is what happens in the
+\type {mathfun} module that needs to be loaded in the usual way. There you find:
+
+\pushoverloadmode
+ \ifdefined\normalpi \else\let\normalpi\pi \fi
+
+ \registermathfunction[sind,cosd,tand,sin,cos,tan]
+ \registermathfunction[sqrt]
+ \registermathfunction[pi][constant]
+\popoverloadmode
+
+The module also provides a few more expression variants (these can end up in the
+core if really needed much):
+
+\startbuffer
+$ \pi = \mathexpr[.40N]{pi} $
+$ \pi = \mathexpr[.80N]{sqrt(11)} $
+$ \pi = \decimalexpr[.80N]{sqrt(11)} $
+$ \pi = \decimalexpr{sqrt(11)} $
+$ c = \complexexpr{123 + new(456,789)} $
+\stopbuffer
+
+\typebuffer
+
+This gives:
+
+\startlines
+ \getbuffer
+\stoplines
+
+The question is: do we need this and if so, what more do we need? Feel free to
+bing it up on the \CONTEXT\ mailing list. It anyway is a nice demonstration of
+what can be done with the mix of languages.
+
+% \stopsection
+
+\stopchapter
+
+\stopcomponent
+
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/math/math-grouping.tex b/Master/texmf-dist/doc/context/sources/general/manuals/math/math-grouping.tex
new file mode 100644
index 00000000000..d28e26587b9
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/math/math-grouping.tex
@@ -0,0 +1,212 @@
+% language=us runpath=texruns:manuals/math
+
+\environment math-layout
+
+\startbuffer[oldcolor]
+ \disableexperiments[simplegroups]%
+ % when we no longer have it as experiment
+ \unprotect \pushoverloadmode
+ \permanent\protected\def\color[#1]%
+ {\bgroup % \beginsimplegroup
+ \edef\currentcolorname{#1}%
+ \ifempty\currentcolorprefix
+ \colo_helpers_activate_nop
+ \else
+ \colo_helpers_activate_yes
+ \fi
+ \let\nexttoken}%
+ \popoverloadmode \protect
+\stopbuffer
+
+\startbuffer[newcolor]
+ \enableexperiments[simplegroups]%
+\stopbuffer
+
+\startcomponent math-grouping
+
+\startchapter[title=Grouping]
+
+\startsection[title=Some details]
+
+In \TEX\ there are all kind of groups. When you start with a curly brace, you
+often enter a group but when you start a box or table cell you also do that. When
+you enter math a math group is started. Assignments are, unless explicitly done
+global, nearly always local to the group. Here we discuss the following two
+cases:
+
+\starttyping
+{ .... }
+\bgroup .... \egroup
+\begingroup .... \endgroup
+\stoptyping
+
+We say two cases, not three, because the first two are equivalent: the two macros
+in the second line are not primitives but aliases to the curly braces. There is
+however one fundamental difference between them. The verbose \type {\begingroup}
+starts a so called simple group so let's call the other complex. A complex group
+is bounded by equivalents to the two characters (braces) that have catcodes that
+begin and end these groups. So, the following is valid.
+
+\starttyping
+{ .... }
+{ .... \egroup
+\bgroup .... }
+\bgroup .... \egroup
+\stoptyping
+
+This means that a macro like this is okay:
+
+\starttyping
+\def\foo{\bgroup\bf\let\next} \foo{text}
+\stoptyping
+
+The \type {\foo} will start a complex group, switch font and then pick up the
+brace. The group will be closed by the matching right brace or an equivalent.
+The following two cases are invalid:
+
+\starttyping
+\bgroup .... \endgroup
+\begingroup .... \egroup
+\stoptyping
+
+which means that:
+
+\starttyping
+\def\foo{\begingroup\bf\let\next} \foo{text}
+\stoptyping
+
+will trigger an error message. This is rather unfortunate because using braces
+to wrap an argument in curly braces is rather convenient. The way out is this:
+
+\starttyping
+\def\foo#1{\begingroup\bf#1\endgroup} \foo{text}
+\stoptyping
+
+which is perfectly valid apart from the fact that the argument is first picked up
+and then fed back into the input. Apart from a small performance hit and using
+more memory it also adds noise to tracing.
+
+\stopsection
+
+\startsection[title=Side effects]
+
+In math mode matters are complicates by the fact that complex groups (the ones
+started with the curly brace) start a math list. And that has side effects because
+the spacing between math elements depends on what we deal with: math symbol, lists,
+fenced material. The following example shows a whole lot of this:
+
+\startbuffer[example]
+\starttabulate[|j1|j1||]
+ \NC $\sin{\left(xxx\right)}$
+ \NC $f {\left(xxx\right)}$
+ \NC $x {\left(xxx\right)}$
+ \NR
+ \NC $\sin\begingroup\left(xxx\right)\endgroup$
+ \NC $f \begingroup\left(xxx\right)\endgroup$
+ \NC $x \begingroup\left(xxx\right)\endgroup$
+ \NR
+ \NC $\sin\left(xxx\right)$\par
+ \NC $f \left(xxx\right)$\par
+ \NC $x \left(xxx\right)$\par
+ \NR
+ \NC $\sin\color[darkgreen]{(xxx)}$\par
+ \NC $f \color[darkgreen]{(xxx)}$\par
+ \NC $x \color[darkgreen]{(xxx)}$\par
+ \NR
+ \NC $\sin\startcolor[darkblue](xxx)\stopcolor$\par
+ \NC $f \startcolor[darkblue](xxx)\stopcolor$\par
+ \NC $x \startcolor[darkblue](xxx)\stopcolor$\par
+ \NR
+ \NC $\sin(xxx)$\par
+ \NC $f (xxx)$\par
+ \NC $x (xxx)$\par
+ \NR
+ \NC $\sin{\color[darkyellow]{(xxx)}}$\par
+ \NC $f {\color[darkyellow]{(xxx)}}$\par
+ \NC $x {\color[darkyellow]{(xxx)}}$\par
+ \NR
+ \NC $\sin\begingroup\color[darkred]{(xxx)}\endgroup$\par
+ \NC $f \begingroup\color[darkred]{(xxx)}\endgroup$\par
+ \NC $x \begingroup\color[darkred]{(xxx)}\endgroup$\par
+ \NR
+\stoptabulate
+\stopbuffer
+
+\typebuffer[example]
+
+A valid question is why we would want to add curly braces. One reason is that we
+we want to apply something to a few characters, in this case color the argument
+to the sinus. Now, when a color command is defined as the \type {\foo} before, we
+start a complex group and that influences spacing! This is demonstrated in the
+left part of \in {figure} [fig:grouping:sin] (you can zoom in on the table to
+see the details; we also report the kind of spacing applied).
+
+\startplacefigure[reference=fig:grouping:sin,title=Grouping influencing math spacing (list).]
+ \startcombination[nx=2,ny=1,distance=2em,style=bold]
+ \startcontent
+ \showmakeup[math,fontkern,italic]% laps into the margin hence the -2em
+ \getbuffer[oldcolor]%
+ \scale[width=\dimexpr\measure{combination}-2em\relax]{\getbuffer[example]}%
+ \stopcontent
+ \startcaption
+ pseudo grouping
+ \stopcaption
+ \startcontent
+ \showmakeup[math,fontkern,italic]% laps into the margin hence the -2em
+ \getbuffer[newcolor]%
+ \scale[width=\dimexpr\measure{combination}-1em\relax]{\getbuffer[example]}%
+ \stopcontent
+ \startcaption
+ grouping
+ \stopcaption
+ \stopcombination
+\stopplacefigure
+
+The right variant in that figure uses a different way of grouping, one that is
+equivalent to:
+
+\starttyping
+\def\foo{\beginsimplegroup\bf\let\next}
+\stoptyping
+
+This time we effectively do \type {\begingroup} but permits both \type
+{\endgroup} or a curly brace (or \type {\egroup} to wrap up the group. That means
+that we don't get the side effect of starting a math list.
+
+\startbuffer[example]
+$ x = y \quad x \color[red]{=} y$
+\stopbuffer
+
+This example shows the effect of coloring a single character (the result is shown
+in \in {figure} [fig:grouping:char]):
+
+\typebuffer[example]
+
+\startplacefigure[reference=fig:grouping:char,title=Grouping influencing math spacing (symbol).]
+ \vkern4ex
+ \startcombination[nx=2,ny=1,distance=4em,style=bold]
+ \startcontent
+ \showmakeup[math,fontkern,italic]% laps into the margin hence the -2em
+ \getbuffer[oldcolor]%
+ \scale[width=\dimexpr\measure{combination}-2em\relax]{\getbuffer[example]}%
+ \stopcontent
+ \startcaption
+ pseudo grouping
+ \stopcaption
+ \startcontent
+ \showmakeup[math,fontkern,italic]% laps into the margin hence the -2em
+ \getbuffer[newcolor]%
+ \scale[width=\dimexpr\measure{combination}-2em\relax]{\getbuffer[example]}%
+ \stopcontent
+ \startcaption
+ grouping
+ \stopcaption
+ \stopcombination
+ \vkern2ex
+\stopplacefigure
+
+\stopsection
+
+\stopchapter
+
+\stopcomponent
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/math/math-input.tex b/Master/texmf-dist/doc/context/sources/general/manuals/math/math-input.tex
index 9b14057d0c1..d5f75a1ac56 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/math/math-input.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/math/math-input.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us runpath=texruns:manuals/math
\environment math-layout
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/math/math-introduction.tex b/Master/texmf-dist/doc/context/sources/general/manuals/math/math-introduction.tex
index de7c0a96006..f8e15533bc9 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/math/math-introduction.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/math/math-introduction.tex
@@ -1,3 +1,5 @@
+% language=us runpath=texruns:manuals/math
+
\environment math-layout
\startcomponent math-introduction
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/math/math-layout.tex b/Master/texmf-dist/doc/context/sources/general/manuals/math/math-layout.tex
index 83137444deb..d2ab2219637 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/math/math-layout.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/math/math-layout.tex
@@ -1,19 +1,27 @@
+% language=us runpath=texruns:manuals/math
+
\startenvironment math-layout
\enabledirectives[fontgoodies.mathkerning]
-\usebodyfont [modern]
-\usebodyfont [cambria]
-\usebodyfont [lucidaot]
-\usebodyfont [xits]
-\usebodyfont [stixtwo]
-\usebodyfont [dejavu]
-\usebodyfont [pagella]
-\usebodyfont [termes]
-\usebodyfont [bonum]
-\usebodyfont [schola]
-
-\setupbodyfont
+\usebodyfont [modern]
+\usebodyfont [modernlatin]
+\usebodyfont [cambria]
+\usebodyfont [lucidadk]
+\usebodyfont [xits]
+\usebodyfont [stixtwo]
+\usebodyfont [dejavu]
+\usebodyfont [pagella]
+\usebodyfont [termes]
+\usebodyfont [bonum]
+\usebodyfont [schola]
+\usebodyfont [libertinus]
+\usebodyfont [ebgaramond]
+\usebodyfont [kpfonts]
+%usebodyfont [minion]
+%usebodyfont [asana]
+
+\setupbodyfont % don't change this, it's assumed in examples
[pagella]
\setupwhitespace
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/math/math-mkiv.tex b/Master/texmf-dist/doc/context/sources/general/manuals/math/math-mkiv.tex
index 11fb4ca1cab..a816b79156e 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/math/math-mkiv.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/math/math-mkiv.tex
@@ -1,7 +1,9 @@
-% language=uk
+% language=us runpath=texruns:manuals/math
+
+% language=us
% author : Hans Hagen
-% copyright : PRAGMA ADE & ConTeXt Development Team
+% copyright : ConTeXt Development Team
% license : Creative Commons Attribution ShareAlike 4.0 International
% reference : pragma-ade.nl | contextgarden.net | texlive (related) distributions
% origin : the ConTeXt distribution
@@ -42,6 +44,11 @@
\component math-suboptimal
\component math-tricks
\component math-oddities
+ \component math-grouping
+ \ifcase \contextlmtxmode \else
+ \component math-fun
+ % \component math-notdone
+ \fi
\stopbodymatter
\stopdocument
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/math/math-notdone.tex b/Master/texmf-dist/doc/context/sources/general/manuals/math/math-notdone.tex
new file mode 100644
index 00000000000..9cb5c802786
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/math/math-notdone.tex
@@ -0,0 +1,146 @@
+% language=us runpath=texruns:manuals/math
+
+\environment math-layout
+
+% goes to oddities
+
+\startcomponent math-notdone
+
+\startchapter[title=Why we don't do this]
+
+The \TEX\ engine has two math modes: inline and display. What exactly happens
+before we enter math depends on what mode we are in.
+
+\startitemize
+ \startitem
+ When we are in horizontal mode, single dollar signs makes us go into
+ inline math mode. Double dollars on the other hand trigger display math
+ and one of the first things that does is flush the current vertical list
+ contributions. As we are in horizontal mode it is likely that something
+ shows up.
+ \stopitem
+ \startitem
+ When we are in vertical mode the engine will trigger a new paragraph in
+ the hard way: the initial par state node gets added as well as the
+ indentation and everything that \type {\everypar} likes to inject. Inline
+ math then stays inline but display math starts out with flushing the
+ current paragraph and that happens to be the state, indentation and
+ everything else injected at the beginning. Often nothing is seen, just
+ an empty line sits there.
+ \stopitem
+ \startitem
+ In math mode the engine will check if we ended the right way and then
+ render and inject the formula.
+ \stopitem
+\stopitemize
+
+Especially the second case is tricky. The \quote {empty} line is placed with
+proper \typ {\parskip}, \typ {\parindent} and whatever. That can end up with a
+lot of supposedly whitespace of which is not really clear (for the user) what
+comes from where: interline space, whitespace, line height, display spacing, etc.
+To that you can add that empty lines are special themselves: in \MKII\ we relax
+\type {\par}, in \MKIV\ we setup {\LUATEX} to accept \type {\par} equivalents and
+\LUAMETATEX\ has no checks at all. \footnote {The same can be told about \type
+{\outer}.}
+
+Before we show some examples of this we have to make clear that \CONTEXT\ users
+don't have to worry about all this. We don't follow the (Plain and
+\LATEX) \AMS\ policy of \quotation {no empty lines before display math} and
+\quotation {no empty lines in display math}. We don't even use the display skip
+parameters and we do compensate for these empty line issues. The basics haven't
+changed between \MKII, \MKIV\ and \LMTX\ but it has become leaner and meaner deep
+down. We could actually remove display mode (not to be confused with \type
+{\displaystyle}) from the engine but then we could not show the examples below.
+
+\startbuffer[zero]
+\dorecurse{10}{test #1 }
+\startformula
+ x = \the\mathdisplayskipmode + \the\mathdisplaymode
+\stopformula
+\dorecurse{10}{test #1 }
+\stopbuffer
+
+\startbuffer[one]
+\dorecurse{10}{test #1 } \par
+$$ x = \the\mathdisplayskipmode + \the\mathdisplaymode $$ \par
+\dorecurse{10}{test #1 } \par
+\stopbuffer
+
+\startbuffer[two]
+\dorecurse{10}{test #1 }
+$$ x = \the\mathdisplayskipmode + \the\mathdisplaymode $$
+\dorecurse{10}{test #1 }
+\stopbuffer
+
+We use this as example:
+
+\typebuffer[one]
+
+as well as this:
+
+\typebuffer[two]
+
+In \CONTEXT\ one does this:
+
+\typebuffer[zero]
+
+and get:
+
+{\showmakeup[line] \getbuffer[zero]}
+
+% \predisplaysize
+
+For the examples with dollars we use this setup:
+
+\startbuffer[setup]
+\everypar {!}
+\mathdisplaymode 0
+\normalizelinemode 0
+\parindent 30pt
+\parskip 40pt
+\abovedisplayskip 20pt
+\belowdisplayskip \abovedisplayskip
+\abovedisplayshortskip \abovedisplayskip
+\belowdisplayshortskip \abovedisplayshortskip
+\stopbuffer
+
+\typebuffer[setup]
+
+We make sure that we get something typeset when we start a paragraph, just in
+order that we don't necessarily get empty lines: there can be many. The two modes
+make sure that we operate in regular \TEX\ mode, the way other macro packages do.
+
+First we show what we get with \typ {\mathdisplayskipmode 1}. This makes the
+engine behave like other engines. We don't show what we get with \typ
+{\mathdisplayskipmode 2} where zero skips are ignored but we don't have these.
+Last we show what we get with \typ {\mathdisplayskipmode 3}. Here the math
+specific skips are completely ignored.
+
+In both shown cases you will notice that the \type {\parskip} and \type
+{\baselineskip} interfere which in turn demonstrates why in \CONTEXT\ we always
+did things differently. It is possible to enhance the engine to deal with this
+but because in \CONTEXT\ we don't need it and because it is unlikely that other
+macro packages will use it no time will be wasted on this.
+
+\startbuffer
+\page
+\start
+\showmakeup[line]
+\getbuffer[setup,one,two]
+\stop
+\page
+\stopbuffer
+
+{\mathdisplayskipmode 1 \getbuffer}
+{\mathdisplayskipmode 3 \getbuffer}
+
+
+% \mathdisplaymode 0
+% before \par $$ \vadjust {\bf post 1} \vadjust {\bf post 2} x_2 \vadjust pre {\bf pre} $$ \par after \blank[3*line]
+% before \par $$ \vadjust {\bf post 1} \vadjust {\bf post 2} x_2 \vadjust pre {\bf pre} $$ \par after \blank[3*line]
+% before \par $ \vadjust {\bf post 1} \vadjust {\bf post 2} x_3 \vadjust pre {\bf pre} $ \par after \blank[3*line]
+% before \par $\displaystyle \vadjust {\bf post 1} \vadjust {\bf post 2} x_3 \vadjust pre {\bf pre} $ \par after \blank[3*line]
+
+\stopchapter
+
+\stopcomponent
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/math/math-numbering.tex b/Master/texmf-dist/doc/context/sources/general/manuals/math/math-numbering.tex
index 1576e17bbef..fc74cdb81c1 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/math/math-numbering.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/math/math-numbering.tex
@@ -1,3 +1,5 @@
+% language=us runpath=texruns:manuals/math
+
\environment math-layout
\startcomponent math-numbering
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/math/math-oddities.tex b/Master/texmf-dist/doc/context/sources/general/manuals/math/math-oddities.tex
index 015a3012672..07fbcece6d5 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/math/math-oddities.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/math/math-oddities.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us runpath=texruns:manuals/math
\environment math-layout
@@ -81,7 +81,7 @@ this:
A & B
\stoptyping
-Which procces okay and gives the ampersand as glyph. The following is also okay:
+Which processes okay and gives the ampersand as glyph. The following is also okay:
\starttyping
$A \Umathchar"2"0"26 B$
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/math/math-spacing-001.tex b/Master/texmf-dist/doc/context/sources/general/manuals/math/math-spacing-001.tex
index a0ccda449e3..5c21be489cf 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/math/math-spacing-001.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/math/math-spacing-001.tex
@@ -1,3 +1,5 @@
+% language=us runpath=texruns:manuals/math
+
\doifmodeelse {with-struts} {
\def\Line{\dontleavehmode{\showstruts\dorecurse{18}{x \strut x }}}
} {
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/math/math-spacing.tex b/Master/texmf-dist/doc/context/sources/general/manuals/math/math-spacing.tex
index 913a90d9eee..477e4c9fb87 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/math/math-spacing.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/math/math-spacing.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us runpath=texruns:manuals/math
\environment math-layout
@@ -611,9 +611,9 @@ Math has its own direction control:
\starttexdefinition unexpanded MathTest #1#2#3
\ruledvbox \bgroup
- \mathdir#1\relax
- \textdir#2\relax
- \pardir #3\relax
+ \mathdirection#1\relax
+ \textdirection#2\relax
+ \pardirection #3\relax
\hsize=30mm
\startformula
a^2+b^2=c^2
@@ -629,14 +629,14 @@ Math has its own direction control:
\startbuffer
\startcombination[nx=4,ny=2,distance=1cm]
- {\MathTest{TLT}{TLT}{TLT}} {\MathShow1{TLT}{TLT}{TLT}}
- {\MathTest{TLT}{TLT}{TRT}} {\MathShow2{TLT}{TLT}{TRT}}
- {\MathTest{TLT}{TRT}{TLT}} {\MathShow3{TLT}{TRT}{TLT}}
- {\MathTest{TLT}{TRT}{TRT}} {\MathShow4{TLT}{TRT}{TRT}}
- {\MathTest{TRT}{TLT}{TLT}} {\MathShow5{TRT}{TLT}{TLT}}
- {\MathTest{TRT}{TLT}{TRT}} {\MathShow6{TRT}{TLT}{TRT}}
- {\MathTest{TRT}{TRT}{TLT}} {\MathShow7{TRT}{TRT}{TLT}}
- {\MathTest{TRT}{TRT}{TRT}} {\MathShow8{TRT}{TRT}{TRT}}
+ {\MathTest{0}{0}{0}} {\MathShow1{0}{0}{0}}
+ {\MathTest{0}{0}{1}} {\MathShow2{0}{0}{1}}
+ {\MathTest{0}{1}{0}} {\MathShow3{0}{1}{0}}
+ {\MathTest{0}{1}{1}} {\MathShow4{0}{1}{1}}
+ {\MathTest{1}{0}{0}} {\MathShow5{1}{0}{0}}
+ {\MathTest{1}{0}{1}} {\MathShow6{1}{0}{1}}
+ {\MathTest{1}{1}{0}} {\MathShow7{1}{1}{0}}
+ {\MathTest{1}{1}{1}} {\MathShow8{1}{1}{1}}
\stopcombination
\stopbuffer
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/math/math-suboptimal.tex b/Master/texmf-dist/doc/context/sources/general/manuals/math/math-suboptimal.tex
index 9f4e947305a..42d705f08f2 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/math/math-suboptimal.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/math/math-suboptimal.tex
@@ -1,3 +1,4 @@
+% language=us runpath=texruns:manuals/math
\environment math-layout
\startcomponent math-subtoptimal
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/math/math-titlepage.tex b/Master/texmf-dist/doc/context/sources/general/manuals/math/math-titlepage.tex
index 1d1ac306a37..1d289bb1c0b 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/math/math-titlepage.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/math/math-titlepage.tex
@@ -1,3 +1,5 @@
+% language=us runpath=texruns:manuals/math
+
\startcomponent math-titlepage
\startMPpage
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/math/math-tricks.tex b/Master/texmf-dist/doc/context/sources/general/manuals/math/math-tricks.tex
index 7efcec50bc1..c2748c2308c 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/math/math-tricks.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/math/math-tricks.tex
@@ -1,3 +1,5 @@
+% language=us runpath=texruns:manuals/math
+
\environment math-layout
\startcomponent math-tricks
@@ -334,6 +336,8 @@ return {
\startsection[title=Integrals]
+{\em This section needs to be adapted to extensible integrals.}
+
A curious exception in the math system is the integral sign. Its companions are
the summation and product signs, but integral has as extra property that it has a
slant. In \LUATEX\ there is rather advanced control over how the (optional)
@@ -347,13 +351,12 @@ liking. One reason for this is that you might want a consistent size across
formulas. Let's use the following setup:
\startbuffer[setup]
-\setupmathextensible
+% \setupmathextensible
+\setupmathdelimiter
[integral]
[rightoffset=-1mu,
exact=yes,
factor=2]
-
-\let\int\integral
\stopbuffer
\typebuffer[setup]
@@ -376,8 +379,12 @@ We use the following exmaple:
This renders as:
+\pushoverloadmode
+
\dontleavehmode\hbox{\getbuffer[setup,demo]}
+\popoverloadmode
+
\stopsection
\startsection[title=Fancy fences]
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/math/math-tweaks.tex b/Master/texmf-dist/doc/context/sources/general/manuals/math/math-tweaks.tex
new file mode 100644
index 00000000000..6a775688d20
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/math/math-tweaks.tex
@@ -0,0 +1,2008 @@
+% language=us runpath=texruns:manuals/math macros=mkvi
+
+% \enabletrackers[math.tweaks]
+
+% \mapfontsize[pagella][script] [.30] % a test
+% \mapfontsize[pagella][scriptscript][.45] % a test
+
+\hyphenation{ere-whon}
+
+\enableexperiments[fonts.compact] % gives different sized outline !
+
+% \definefontfeature[stixtwo:mathextra][kern=yes,script=dflt,language=dflt]
+
+\startluacode
+local list = {
+ { "cambria", "cambria-math" },
+ { "modern", "modern-math" },
+ { "pagella", "pagella-math" },
+ { "termes", "termes-math" },
+ { "schola", "schola-math" },
+ { "bonum", "bonum-math" },
+ { "dejavu", "dejavu-math" },
+ { "erewhon", "erewhon-math" },
+ { "concrete", "concrete-math" },
+ { "kpfonts", "kpfonts-math" },
+ { "lucida", "lucida-math" },
+ { "stixtwo", "stixtwo-math" },
+ { "ebgaramond", "ebgaramond-math" },
+ { "libertinus", "libertinus-math" },
+ { "xcharter", "xcharter-math" },
+}
+
+local loaded = { }
+local used = table.setmetatableindex("table")
+
+local function identify(fontname,filename)
+ local g = fonts.goodies.load(filename)
+ if g then
+ local tweaks = g.mathematics.tweaks
+ if tweaks then
+ local after = tweaks.aftercopying
+ if after then
+ local sequence = { }
+ local usage = { }
+ local bigslots = false
+ for i=1,#after do
+ local tweak = after[i].tweak
+ if tweak then
+ sequence[#sequence+1] = tweak
+ usage[tweak] = true
+ used[tweak][fontname] = true
+ if tweak == "bigslots" then
+ bigslots = bigslots
+ end
+ end
+ end
+ local t = {
+ sequence = sequence,
+ usage = usage,
+ goodies = g.mathematics,
+ bigslots = bigslots,
+ }
+ loaded[fontname] = t
+ end
+ else
+ print("no tweaks",filename)
+ end
+ else
+ print("no goodie file",filename)
+ end
+end
+
+for i=1,#list do
+ local l = list[i]
+ identify(l[1],l[2])
+ context.usebodyfont { l[1] }
+ context.usebodyfont { l[1] .. "-nt" }
+end
+
+document.usedfonts = list -- order
+document.usedgoodies = loaded
+document.usedtweaks = used
+
+function document.gettweakusage(name)
+ local list = table.sortedkeys(document.usedtweaks[name])
+ if #list > 0 then
+ context("This tweak is used in: %, t.",list)
+ else
+ context("This tweak is used \\emphasized{nowhere}.")
+ end
+end
+
+function document.showsomething(name)
+ for i=1,#document.usedfonts do
+ context[name](document.usedfonts[i][1])
+ end
+end
+
+-- inspect(loaded)
+
+\stopluacode
+
+\def\ShowTweakUsage#1{\ctxlua{document.gettweakusage("#1")}}
+\def\ShowSomething #1{\ctxlua{document.showsomething("#1")}}
+
+\setupbodyfont[bonum]
+
+\usemodule[abbreviations-logos]
+
+\setuplayout
+ [height=middle,
+ width=middle,
+ footer=0pt]
+
+\setupwhitespace
+ [big]
+
+\setuphead
+ [chapter]
+ [header=high]
+
+\starttext
+
+% A riddle. Maybe use the path and the path randomizer.
+
+\startMPpage
+ fill Page enlarged 1mm withcolor darkred ;
+
+ picture p ; p := lmt_outline [ text = "\textdollar" ] ;
+ picture q ; q := lmt_outline [ text = "\texteuro" ] ;
+
+ p := (p shifted - center p) randomized .7 ;
+ q := (q shifted - center q) randomized .7 ;
+
+ draw image ( draw p ; draw q ; )
+ xysized (PaperWidth -4cm, PaperHeight -10cm)
+ shifted center Page
+ shifted (0,4cm)
+ withcolor yellow
+ withpen pencircle scaled 5mm ;
+
+ draw textext ("tweaking")
+ xsized (PaperWidth -4cm)
+ shifted center bottomboundary Page
+ shifted (0,5.5cm)
+ withcolor white ;
+
+ draw textext ("math fonts")
+ xsized (PaperWidth -4cm)
+ shifted center bottomboundary Page
+ shifted (0,2.25cm)
+ withcolor white ;
+
+ setbounds currentpicture to Page ;
+\stopMPpage
+
+\starttitle[title=Contents]
+ \startcolumns
+ \placelist[chapter][before=,after=,alternative=a]
+ \stopcolumns
+\stoptitle
+
+\startchapter[title=What is there to tweak]
+
+We have written about our struggle to \OPENTYPE\ render math fonts well before,
+but here we will do it from the perspective of \LUAMETATEX\ and \CONTEXT\ \LMTX\
+combined with the fonts available in 2022. So what is the state of these fonts?
+The answer to this question is that now the landscape has settled we have a
+curious mix of old and new style fonts that has to be dealt with. Our answer to
+this is an updated math engine combined with (in \CONTEXT) tweaking font
+properties that we can (or will not) deal with in the engine: think of adapting
+dimensions, adding missing shapes, variants and extensibles, normalizing anchors
+and kerns. Before we discuss these in details let us look at what fonts we
+have.
+
+In 2022 we can distinguish several groups of math fonts. The first contains only
+one font: Cambria by \MICROSOFT. This is the reference font that more or less
+defines the standard and indicates how an \OPENTYPE\ math font is to be
+constructed. It has been stable for a long time and we don't see any development
+in it. In the meantime the specification has been improved but there is still
+room for interpretation.
+
+The second group consists if Latin Modern, Pagella, Termes, Bonum, Schola and
+Dejavu. These are the outcome of the \TEX Gyre project funded by user groups and
+conducted by the GUST foundation (Jerzy, Jacko and friends). In this project some
+choices were made that are reflected in todays versions. It is a mix between old
+school \TEX\ fonts (that were the starting point) and interpretation of the
+\quote {standard} that at that time to some extend had to be deduced from
+observing Cambria usage in MSWord.
+
+The third group started with the release of the \TYPEONE\ \STIX\ fonts that had
+been announced several times as the reference \UNICODE\ math coverage font. In
+order to check its promises those fonts were quickly converted into a useable
+\XITS\ \OPENTYPE\ math font by Khaled Hosny. It took a while before an official
+\STIX\ (two) showed up. In principle that font can replace \XITS\ now because
+\XITS\ is no longer maintained (but it remain useful as it is a good benchmark
+for \STIX). We also inherit some bidirectional elements of \XITS\ that we can
+inject into other fonts.
+
+A fourth group contains Erewhon, Kepler, XCharter, Concrete and Euler. These are
+existing fonts repackaged and fine-tuned by Daniel Flippo. At the time of writing
+this they are a bit in flux and getting better by the day.
+
+Then there are the commercial fonts. Most noticeable is Lucida by Biggelow and
+Holmes which is font expanded, maintained and distributed by \TUG\ derived from
+the original \TYPEONE\ fonts. When we were upgrading the math engine we were
+happy to be awarded the opportunity to improve the metrics (and some minor)
+details in order to bring down the quite extensive number of runtime tweaks
+needed. As a commercial font it stands out because there is an update policy, so
+we can trust fixes to be available to users. The complete \OPENTYPE\ Lucida font
+family is also dirt cheap compared to fonts with such a broad coverage. Another
+commercial math font is Minion Math by Johannes Küstler but we have limited
+possibilities to tweak that because one needs the font as well as the text
+minions. It doesn't make sense to spend much time on fonts that one can't use in
+(sample) documents and one cannot expect us to invest in fonts we can't use
+anyway, right? So where Lucida is extensively supported for other commercial
+fonts we just apply default tweaks to those fonts which is probably good enough.
+
+Group six contains the left-overs: Garamond and Libertinus. We also expect a Plex
+Math companion. Originally Asana was in this group but eventually we decided that
+it is unusable in practice, so we dropped support for that weird and visually
+inconsistent mix of fonts. We have to see how Computer Modern Book will fit in
+but as we can use Latin Modern with effects instead there is no hurry with that
+one. The mentioned Garamond (that is meant to be combined with EBGaramond) is a
+bit outlier in the sense that it has excessive amounts of variants and some
+shapes that might look okay in text but not so in math, but thereby it makes a
+good test case for tweaks.
+
+There are some other setups that we take into account, like Euler over Pagella and
+Pagella over Euler but these just use the tweaks that apply to either of them.
+
+\stopchapter
+
+\startchapter[title=Math fonts in \CONTEXT]
+
+In \MKII\ math fonts are set up in the traditional way and because all available
+fonts \TYPEONE\ are modelled after Computer Modern quite some definitions were
+needed to populate the math families: the basic foursome: roman, italic, symbol,
+extensible, as well as additional families that deal with additional alphabets.
+
+In \MKIV\ it became simpler: we went \UNICODE. Traditional fonts can be assembled
+into a virtual \UNICODE\ font at runtime. Loading now came down to just one font,
+or two when bold math is required. Because \XITS\ introduced right-to-left math
+we actually can kick in a a few more instances but it doesn't change the
+principles.
+
+In \LMTX\ we integrated bidirectional math in such a way that we now only need
+one instance and the new \LUAMETATEX\ engine also provides an alternative to the
+triple family model where text, script and scriptscript share the same font
+instance which further limits loading time, which in turn means that we can waste
+some runtime on tweaking.
+
+So indeed in \MKIV\ and \LMTX\ we can tweak fonts runtime: we patch them before
+passing them to the engine. What was still experimental in \MKIV\ has matured in
+\LMTX, also because now considerable time was spent on trying out and configuring
+tweaks. This made sense because by now we can consider the math fonts to be sort
+of frozen: we have to accept that and have to rely on these patches. That we
+divert a bit from the \quote {official} \OPENTYPE\ math approach doesn't bother
+us much because after all, \TEX\ is still sort of setting the quality standard.
+
+We start with showing some usage tables. When defining a typeface one or more
+goodie files can be specified. This is what we set up by default:
+
+\startluacode
+
+context.starttabulate { "|l|l|" }
+ context.NC() context("bodyfont")
+ context.NC() context("goodie file")
+ context.NC() context.NR()
+ for i=1,#document.usedfonts do
+ local name = document.usedfonts[i][1]
+ local goodie = document.usedfonts[i][2]
+ context.NC() context(name)
+ context.NC() context(goodie)
+ context.NC() context.NR()
+ end
+context.stoptabulate()
+\stopluacode
+
+Tweaks are applied in a specific order and sometimes a tweak is applied several
+times with different character lists and|/|or directives:
+
+\startluacode
+context.starttabulate { "|l|lp|" }
+ context.NC() context("bodyfont")
+ context.NC() context("tweak order")
+ context.NC() context.NR()
+ for i=1,#document.usedfonts do
+ local name = document.usedfonts[i][1]
+ local goodie = document.usedfonts[i][2]
+ local sequence = document.usedgoodies[name].sequence
+ context.NC() context(name)
+ context.NC() context("% t",sequence)
+ context.NC() context.NR()
+ end
+context.stoptabulate()
+\stopluacode
+
+Keep in mind that some of these steps are driven by optional features or specific
+versions of the font, so there are likely less applied than seen here. We can
+condense this list to usage only:
+
+\startluacode
+context.starttabulate { "|l|lp|" }
+ context.NC() context("bodyfont")
+ context.NC() context("tweak usage")
+ context.NC() context.NR()
+ for i=1,#document.usedfonts do
+ local name = document.usedfonts[i][1]
+ local goodie = document.usedfonts[i][2]
+ local usage = table.sortedkeys(document.usedgoodies[name].usage)
+ context.NC() context(name)
+ context.NC() context("% t",usage)
+ context.NC() context.NR()
+ end
+context.stoptabulate()
+\stopluacode
+
+Finally we show what tweaks are actually applied. We have some more but these are
+either experimental, diagnostic or in the meantime sort of obsolete.
+
+\startluacode
+context.starttabulate { "|l|lp|" }
+ context.NC() context("tweak")
+ context.NC() context("usage")
+ context.NC() context.NR()
+ for tweak, detail in table.sortedhash(document.usedtweaks) do
+ context.NC() context(tweak)
+ context.NC() context("% t",table.sortedkeys(detail))
+ context.NC() context.NR()
+ end
+context.stoptabulate()
+-- inspect(table.sortedkeys(mathematics.tweaks))
+\stopluacode
+
+In the next chapters we will discuss the possible tweaks where roughly group them. Tweaks
+that are no longer used will be left out (even if they are still in \LMTX). One reason
+for orphaning tweaks is that we (finally) decided to get rid of all italics.
+
+(This is work in progress: we don't want to waste time on tweaks that became unused.)
+
+\stopchapter
+
+\startchapter[title=Math constants]
+
+A math goodie file looks like this"
+
+\starttyping
+return {
+ name = "pagella-math",
+ version = "1.00",
+ comment = "Goodies that complement pagella.",
+ author = "Hans Hagen & Mikael Sundqvist",
+ copyright = "ConTeXt development team",
+ mathematics = {
+ parameters = {
+ AccentTopShiftUp = 10,
+ FlattenedAccentTopShiftUp = 10,
+ AccentBaseDepth = 80,
+ DelimiterPercent = 90,
+ DelimiterShortfall = 400,
+ DisplayOperatorMinHeight = 1800, -- 1500 in font
+ PrimeRaisePercent = 75, -- 50 default
+ PrimeRaiseComposedPercent = 10, -- 25 default
+ },
+ tweaks = {
+ -- Here we have a list of tweaks. Just have a look at the file!
+ },
+ }
+}
+\stoptyping
+
+In following chapters we discuss the entries in the tweaks subtable, here we spend some
+words on the parameters. In \OPENTYPE\ speak these are called constants, which is also the
+term we use when passing a font from \LUA\ to the engine.
+
+\definedescription[MathFP][alternative=serried,width=fit,headstyle=\bf\tt,align={flushleft}]
+
+These are the mandate font parameters with their description straight from the specification:
+
+\startMathFP {ScriptPercentScaleDown} Percentage of scaling down for level 1 superscripts and subscripts. Suggested value: 80 pct. \stopMathFP
+\startMathFP {ScriptScriptPercentScaleDown} Percentage of scaling down for level 2 (scriptscript) superscripts and subscripts. Suggested value: 60 pct. \stopMathFP
+\startMathFP {DelimitedSubFormulaMinHeight} Minimum height required for a delimited expression (contained within parentheses, etc.) to be treated as a sub-formula. Suggested value: normal line height times 1.5. \stopMathFP
+\startMathFP {DisplayOperatorMinHeight} Minimum height of n-ary operators (such as integral and summation) for formulas in display mode (that is, appearing as standalone page elements, not embedded inline within text). \stopMathFP
+\startMathFP {MathLeading} White space to be left between math formulas to ensure proper line spacing. For example, for applications that treat line gap as a part of line ascender, formulas with ink going above (\typ {os2.sTypoAscender} + \typ {os2.sTypoLineGap} - \typ {MathLeading}) or with ink going below \typ {os2.sTypoDescender} will result in increasing line height. \stopMathFP
+\startMathFP {AxisHeight} Axis height of the font. In math typesetting, the term axis refers to a horizontal reference line used for positioning elements in a formula. The math axis is similar to but distinct from the baseline for regular text layout. For example, in a simple equation, a minus symbol or fraction rule would be on the axis, but a string for a variable name would be set on a baseline that is offset from the axis. The axisHeight value determines the amount of that offset. \stopMathFP
+\startMathFP {AccentBaseHeight} Maximum (ink) height of accent base that does not require raising the accents. Suggested: x‑height of the font (\typ {os2.sxHeight}) plus any possible overshots. \stopMathFP
+\startMathFP {FlattenedAccentBaseHeight} Maximum (ink) height of accent base that does not require flattening the accents. Suggested: cap height of the font (\typ {os2.sCapHeight}). \stopMathFP
+\startMathFP {SubscriptShiftDown} The standard shift down applied to subscript elements. Positive for moving in the downward direction. Suggested: \typ {os2.ySubscriptYOffset}. \stopMathFP
+\startMathFP {SubscriptTopMax} Maximum allowed height of the (ink) top of subscripts that does not require moving subscripts further down. Suggested: 4/5 \typ {xheigh}t. \stopMathFP
+\startMathFP {SubscriptBaselineDropMin} Minimum allowed drop of the baseline of subscripts relative to the (ink) bottom of the base. Checked for bases that are treated as a box or extended shape. Positive for subscript baseline dropped below the base bottom. \stopMathFP
+\startMathFP {SuperscriptShiftUp} Standard shift up applied to superscript elements. Suggested: \typ {os2.ySuperscriptYOffset}. \stopMathFP
+\startMathFP {SuperscriptShiftUpCramped} Standard shift of superscripts relative to the base, in cramped style. \stopMathFP
+\startMathFP {SuperscriptBottomMin} Minimum allowed height of the (ink) bottom of superscripts that does not require moving subscripts further up. Suggested: 1/4 times \typ {xheight}. \stopMathFP
+\startMathFP {SuperscriptBaselineDropMax} Maximum allowed drop of the baseline of superscripts relative to the (ink) top of the base. Checked for bases that are treated as a box or extended shape. Positive for superscript baseline below the base top. \stopMathFP
+\startMathFP {SubSuperscriptGapMin} Minimum gap between the superscript and subscript ink. Suggested: 4 times default rule thickness. \stopMathFP
+\startMathFP {SuperscriptBottomMaxWithSubscript} The maximum level to which the (ink) bottom of superscript can be pushed to increase the gap between superscript and subscript, before subscript starts being moved down. Suggested: 4/5 times \typ {xheigh}t. \stopMathFP
+\startMathFP {SpaceAfterScript} Extra white space to be added after each subscript and superscript. Suggested: 0.5 pt for a 12 pt font. (Note that, in some math layout implementations, a constant value, such as 0.5 pt, may be used for all text sizes. Some implementations may use a constant ratio of text size, such as 1/24 of \typ {emwidth}.) \stopMathFP
+\startMathFP {UpperLimitGapMin} Minimum gap between the (ink) bottom of the upper limit, and the (ink) top of the base operator. \stopMathFP
+\startMathFP {UpperLimitBaselineRiseMin} Minimum distance between baseline of upper limit and (ink) top of the base operator. \stopMathFP
+\startMathFP {LowerLimitGapMin} Minimum gap between (ink) top of the lower limit, and (ink) bottom of the base operator. \stopMathFP
+\startMathFP {LowerLimitBaselineDropMin} Minimum distance between baseline of the lower limit and (ink) bottom of the base operator. \stopMathFP
+\startMathFP {StackTopShiftUp} Standard shift up applied to the top element of a stack. \stopMathFP
+\startMathFP {StackTopDisplayStyleShiftUp} Standard shift up applied to the top element of a stack in display style. \stopMathFP
+\startMathFP {StackBottomShiftDown} Standard shift down applied to the bottom element of a stack. Positive for moving in the downward direction. \stopMathFP
+\startMathFP {StackBottomDisplayStyleShiftDown} Standard shift down applied to the bottom element of a stack in display style. Positive for moving in the downward direction. \stopMathFP
+\startMathFP {StackGapMin} Minimum gap between (ink) bottom of the top element of a stack, and the (ink) top of the bottom element. Suggested: 3 times default rule thickness. \stopMathFP
+\startMathFP {StackDisplayStyleGapMin} Minimum gap between (ink) bottom of the top element of a stack, and the (ink) top of the bottom element in display style. Suggested: 7 times default rule thickness. \stopMathFP
+\startMathFP {StretchStackTopShiftUp} Standard shift up applied to the top element of the stretch stack. \stopMathFP
+\startMathFP {StretchStackBottomShiftDown} Standard shift down applied to the bottom element of the stretch stack. Positive for moving in the downward direction. \stopMathFP
+\startMathFP {StretchStackGapAboveMin} Minimum gap between the ink of the stretched element, and the (ink) bottom of the element above. Suggested: same value as \typ {UpperLimitGapMin}. \stopMathFP
+\startMathFP {StretchStackGapBelowMin} Minimum gap between the ink of the stretched element, and the (ink) top of the element below. Suggested: same value as \typ {LowerLimitGapMin}. \stopMathFP
+\startMathFP {FractionNumeratorShiftUp} Standard shift up applied to the numerator. \stopMathFP
+\startMathFP {FractionNumeratorDisplayStyleShiftUp} Standard shift up applied to the numerator in display style. Suggested: same value as \typ {StackTopDisplayStyleShiftUp}. \stopMathFP
+\startMathFP {FractionDenominatorShiftDown} Standard shift down applied to the denominator. Positive for moving in the downward direction. \stopMathFP
+\startMathFP {FractionDenominatorDisplayStyleShiftDown} Standard shift down applied to the denominator in display style. Positive for moving in the downward direction. Suggested: same value as \typ {StackBottomDisplayStyleShiftDown}. \stopMathFP
+\startMathFP {FractionNumeratorGapMin} Minimum tolerated gap between the (ink) bottom of the numerator and the ink of the fraction bar. Suggested: default rule thickness. \stopMathFP
+\startMathFP {FractionNumDisplayStyleGapMin} Minimum tolerated gap between the (ink) bottom of the numerator and the ink of the fraction bar in display style. Suggested: 3 times default rule thickness. \stopMathFP
+\startMathFP {FractionRuleThickness} Thickness of the fraction bar. Suggested: default rule thickness. \stopMathFP
+\startMathFP {FractionDenominatorGapMin} Minimum tolerated gap between the (ink) top of the denominator and the ink of the fraction bar. Suggested: default rule thickness. \stopMathFP
+\startMathFP {FractionDenomDisplayStyleGapMin} Minimum tolerated gap between the (ink) top of the denominator and the ink of the fraction bar in display style. Suggested: 3 times default rule thickness. \stopMathFP
+\startMathFP {SkewedFractionHorizontalGap} Horizontal distance between the top and bottom elements of a skewed fraction. \stopMathFP
+\startMathFP {SkewedFractionVerticalGap} Vertical distance between the ink of the top and bottom elements of a skewed fraction. \stopMathFP
+\startMathFP {OverbarVerticalGap} Distance between the overbar and the (ink) top of he base. Suggested: 3 times default rule thickness. \stopMathFP
+\startMathFP {OverbarRuleThickness} Thickness of overbar. Suggested: default rule thickness. \stopMathFP
+\startMathFP {OverbarExtraAscender} Extra white space reserved above the overbar. Suggested: default rule thickness. \stopMathFP
+\startMathFP {UnderbarVerticalGap} Distance between underbar and (ink) bottom of the base. Suggested: 3 times default rule thickness. \stopMathFP
+\startMathFP {UnderbarRuleThickness} Thickness of underbar. Suggested: default rule thickness. \stopMathFP
+\startMathFP {UnderbarExtraDescender} Extra white space reserved below the underbar. Always positive. Suggested: default rule thickness. \stopMathFP
+\startMathFP {RadicalVerticalGap} Space between the (ink) top of the expression and the bar over it. Suggested: 5/4 times default rule thickness. \stopMathFP
+\startMathFP {RadicalDisplayStyleVerticalGap} Space between the (ink) top of the expression and the bar over it. Suggested: default rule thickness + 1/2 timss \typ {xheight}. \stopMathFP
+\startMathFP {RadicalRuleThickness} Thickness of the radical rule. This is the thickness of the rule in designed or constructed radical signs. Suggested: default rule thickness. \stopMathFP
+\startMathFP {RadicalExtraAscender} Extra white space reserved above the radical. Suggested: same value as \typ {RadicalRuleThickness}. \stopMathFP
+\startMathFP {RadicalKernBeforeDegree} Extra horizontal kern before the degree of a radical, if such is present. Suggested: 5/18 of \typ {emwidth}. \stopMathFP
+\startMathFP {RadicalKernAfterDegree} Negative kern after the degree of a radical, if such is present. Suggested: −10/18 of \typ {emwidth}. \stopMathFP
+\startMathFP {RadicalDegreeBottomRaisePercent} Height of the bottom of the radical degree, if such is present, in proportion to the ascender of the radical sign. Suggested: 60 pct. \stopMathFP
+
+All these parameters can be set in the goodie file and will then overload the
+ones that are set already in the font. During \LUATEX\ and \LUAMETATEX\ development some
+additional parameters have been added:
+
+\startMathFP {MinConnectorOverlap} to be described \stopMathFP
+\startMathFP {SubscriptShiftDownWithSuperscript} to be described \stopMathFP
+\startMathFP {FractionDelimiterSize} to be described \stopMathFP
+\startMathFP {FractionDelimiterDisplayStyleSize} to be described \stopMathFP
+\startMathFP {NoLimitSubFactor} to be described \stopMathFP
+\startMathFP {NoLimitSupFactor} to be described \stopMathFP
+\startMathFP {AccentBaseDepth} to be described \stopMathFP
+\startMathFP {FlattenedAccentBaseDepth} to be described \stopMathFP
+\startMathFP {SpaceBeforeScript} to be described \stopMathFP
+\startMathFP {PrimeRaisePercent} to be described \stopMathFP
+\startMathFP {PrimeShiftUp} to be described \stopMathFP
+\startMathFP {PrimeShiftUpCramped} to be described \stopMathFP
+\startMathFP {PrimeSpaceAfter} to be described \stopMathFP
+\startMathFP {PrimeBaselineDropMax} to be described \stopMathFP
+\startMathFP {PrimeWidthPercent} to be described \stopMathFP
+\startMathFP {SkewedDelimiterTolerance} to be described \stopMathFP
+\startMathFP {AccentTopShiftUp} to be described \stopMathFP
+\startMathFP {AccentBottomShiftDown} to be described \stopMathFP
+\startMathFP {AccentTopOvershoot} to be described \stopMathFP
+\startMathFP {AccentBottomOvershoot} to be described \stopMathFP
+\startMathFP {AccentSuperscriptDrop} to be described \stopMathFP
+\startMathFP {AccentSuperscriptPercent} to be described \stopMathFP
+\startMathFP {FlattenedAccentTopShiftUp} to be described \stopMathFP
+\startMathFP {FlattenedAccentBottomShiftDown} to be described \stopMathFP
+\startMathFP {DelimiterPercent} to be described \stopMathFP
+\startMathFP {DelimiterShortfall} to be described \stopMathFP
+
+Whenever we thought that we should have some control we added a variable to play
+with. There are more variables that control the engine and some are set in
+\CONTEXT. Often a parameter can be set per style. We don't set them all.
+
+\stopchapter
+
+\startchapter[title=Font sizes]
+
+For quite a while \CONTEXT\ \MKIV\ and \LMTX\ have been set up to use the script
+and scriptscript scales from the \OPENTYPE\ fonts. However, the method used
+didn't always work as expected with the configured sizes in bodyfont environments
+that were based on initial usage of Computer Modern. That in itself is no big
+problem but as we defined the smaller sizes of for instance five point to be that
+value too, a conflict of namespace surfaced. It's a side effect of race
+condition: we want fast loading for which we need a namespace (at every size) but
+when the size in the \OPENTYPE\ file is non standard (read: the 10pt, 7pt, 5pt
+ratio) we get the wrong scales from the hash. We need to know the scale before we
+initialize the font. But as we don't want to consult the font data each time we
+check a scale we have now moved the ratios to the typescripts. This also makes it
+possible to overload them easier.
+
+The following table shows the values as configured and you will notice that there
+are differences. By moving them into the typescript we can also assure that
+updates to the font have no side effects. As with most math parameters in the
+font, these are not then well defined|/|explored anyway.
+
+\def\MappedScriptSize {\cldcontext{fonts.hashes.mathparameters[\the\fontid\scriptscriptfont0].ScriptPercentScaleDown}}
+\def\MappedScriptScriptSize{\cldcontext{fonts.hashes.mathparameters[\the\fontid\scriptscriptfont0].ScriptScriptPercentScaleDown}}
+
+\starttexdefinition ShowMappedFontSize #1
+ \NC #1
+ \NC \mappedfontsize{#1}{script}
+ \NC \mappedfontsize{#1}{scriptscript}
+ \NC \bgroup\switchtobodyfont[#1]\normalexpanded{\egroup\MappedScriptSize}
+ \NC \bgroup\switchtobodyfont[#1]\normalexpanded{\egroup\MappedScriptScriptSize}
+ \NC \NR
+\stoptexdefinition
+
+\starttabulate[|l|c|c|c|c|]
+ \FL
+ \NC
+ \NS[1][c] user or typescript
+ \NS[1][c] font parameter
+ \NC \NR
+ \NC bodyfont
+ \NC script
+ \NC scriptscript
+ \NC script
+ \NC scriptscript
+ \NC \NR
+ \ML
+ \ShowSomething{ShowMappedFontSize}
+ \LL
+\stoptabulate
+
+A user can do the following:
+
+\starttyping
+\mapfontsize[pagella][script] [.75]
+\mapfontsize[pagella][scriptscript][.65]
+\stoptyping
+
+before defining a typeface. In that case the definition in the typescript is
+ignored.
+
+Below we show the script and scriptscript shapes as available in the font. We
+just show overlayed shaped, so this is not a formula with proper spacing.
+
+\definecolor[tred] [r=1,t=.5,a=1]
+\definecolor[tgreen][g=1,t=.5,a=1]
+\definecolor[tblue] [b=1,t=.5,a=1]
+
+\starttexdefinition ShowSizes #1
+ \startoverlay
+ {\tred \definedfont[MathRoman*math]#1}
+ {\tgreen\definedfont[MathRoman*math-script]#1}
+ {\tblue \definedfont[MathRoman*math-scriptscript]#1}
+ \stopoverlay
+\stoptexdefinition
+
+\starttexdefinition ShowMathSizes #1
+ \NC #1 \NC \scale [s=4] {\inframed[frame=off]
+ {\switchtobodyfont[#1]\showglyphs%
+ \dontleavehmode \strut
+ \ShowSizes{2}\ShowSizes{+}
+ \ShowSizes{𝐴}\ShowSizes{=}
+ \ShowSizes{𝑔}\ShowSizes{−}
+ \ShowSizes{𝜋}\ShowSizes{)}}}
+ \NR \NR
+\stoptexdefinition
+
+\starttabulate[|l|l|]
+ \ShowSomething{ShowMathSizes}
+\stoptabulate
+
+\stopchapter
+
+\startchapter[title=Data structure]
+
+A traditional \TEX\ engine only needs metrics, that is: the shape is not
+relevant. The only measure that somewhat reflect the shape is the italic
+correction but it actually is not so much a correction and more the anchor of the
+subscript. This is also true for an engine that can deal with \OPENTYPE\ math.
+However, there the shape is reflected in the staircase kern tables that define
+the kerning at the corners.
+
+In \LUAMETATEX\ each character has the following numeric properties (there cna be
+more at the \LUA\ end: width, height, depth, italic, expansion, leftprotrusion
+and rightprotrusion. An \OPENTYPE\ font only provides the width and boundingbox
+so the later defines the height and depth. We have an status field that tells
+what we're dealing with and some special treatments is needed and a pointer
+(index) to a follow up glyph (the next in size in math.) There are an optional
+kerning table and ligature table (pointers to allocated arrays) as well as an
+optional pointer to a math specific table. At the \LUA\ end we have more fields
+and some play a role in tweaks. For instance, we can redefine dimensions and
+shift the shape around. These are \CONTEXT\ specific.
+
+The optional math (sub)table of a character has many fields. Here we only mention
+them because some will be referred to in later chapters: smaller, mirror, {\em
+flat accent}, top anchor, bottom anchor, {\em four optional corner math kerns
+arrays (with their size)}, {\em optional horizontal and vertical extensible
+recipes}, four simple corner kerns, four edge margins, a top and bottom accent
+overshoot, {\em italics for vertical and horizontal extensibles}, and an inner
+location, x offset and y offset for e.g. degree anchoring. The cursive fields
+come from \OPENTYPE\ MATH.
+
+This means that a math character has more data in the engine and therefore uses
+more memory. However, there are only a few math fonts loaded and not all
+characters need the math information. One reason for splitting the data in
+\LUAMETATEX\ is that we could save a lot of memory when huge e.g. \CJK\ fonts are
+used: there we want to occupy as little memory as possible.
+
+When reading the next chapters keep in mind that quite a bit fo the
+implementation of tweaks is \CONTEXT\ specific. The engine should be able to do a
+proper job without tweaks in which case one just has to live with the limitations
+of and artifacts in fonts.
+
+When making a manual like this a complication is that one has to load many math
+fonts and also find a way to show both the tweaked and non-tweaked version. We
+only demonstrate the core set of tweaked files so here is an example:
+
+\starttexdefinition TweakTest #1
+ \NC #1
+ \NC \switchtobodyfont[#1] $\showglyphs\showfontitalics f^2_2 + x + 1$
+ \NC \switchtobodyfont[#1-nt] $\showglyphs\showfontitalics f^2_2 + x + 1$
+ \NC \switchtobodyfont[#1] $\showglyphs\showfontitalics\showmakeup[mathglue] f^2_2 + x + 1$
+ \NC \switchtobodyfont[#1-nt] $\showglyphs\showfontitalics\showmakeup[mathglue] f^2_2 + x + 1$
+ \NC \NR
+\stoptexdefinition
+
+\starttabulate[|l|c|c|c|c|]
+ \NC \NC tweaked \NC original \NC tweaked \NC original \NC \NR
+ \ctxlua {
+ for i=1,#document.usedfonts do
+ if i > 1 then
+ context.TB()
+ end
+ context.TweakTest(document.usedfonts[i][1])
+ end
+ }
+\stoptabulate
+
+You will notice that in the tweaked version we have no kerns that compensate for the
+width. We will come to that later because these examples are more meant as calibrating
+the loading.
+
+\stopchapter
+
+\startchapter[title=Script parameters]
+
+Here we show the parameters that deal with script placement. This chapter was
+added after we found that some values in Latin Modern were off. The tables show a
+factor that relates the value to the x-height which is for some part of the
+recommendation.
+
+\starttabulate[|c|l|c|l|]
+\NC \NC SubscriptBaselineDropMin \NC .10 \NC harmless, seldom triggered \NC \NR
+\NC \star \NC SubscriptShiftDown \NC .40 \NC by inspection in several files \NC \NR
+\NC \star \NC SubscriptShiftDownWithSuperscript \NC .40 \NC as above \NC \NR
+\NC \NC SubscriptTopMax \NC .80 \NC Microsoft recommendation \NC \NR
+\NC \NC SuperscriptBaselineDropMax \NC .10 \NC see Subscript..Min variant \NC \NR
+\NC \NC SuperscriptBottomMaxWithSubscript \NC .80 \NC Microsoft recommendation \NC \NR
+\NC \NC SuperscriptBottomMin \NC .25 \NC Microsoft recommendation \NC \NR
+\NC \star \NC SuperscriptShiftUp \NC .65 \NC by inspection, a gamble \NC \NR
+\NC \star \NC SuperscriptShiftUpCramped \NC .65 \NC see above, non-\TEX \NC \NR
+\stoptabulate
+
+In the end only the ones marked with a star are really important. The other ones
+are often small and the drop ones between .5 and 1.5 points with (to us) no clear
+logic. We decided to not enable a tweak but explicitly check and set the (four)
+values in the goodie file.
+
+\starttexdefinition ShowScriptsValue #1#2#3
+ \NC \csstring#2
+ \NC \bgroup \switchtobodyfont[#1-nt]\normalexpanded{\egroup\fam0 \cldcontext{"\letterpercent0.3f",\number#2\textstyle/\number\exheight}}
+ \NC \bgroup \switchtobodyfont[#1-nt]\normalexpanded{\egroup\fam0 \the#2\textstyle}
+ \NC \bgroup \switchtobodyfont [#1]\normalexpanded{\egroup\fam0 \the#2\textstyle}
+ \NC \NR
+\stoptexdefinition
+
+\starttexdefinition ShowScripts #1
+ \testpage[4]
+ \starttabulate[|l|r|r|r|]
+ \FL
+ \NC \bf #1
+ \NC factor
+ \NC original
+ \NC tweaked
+ \NC \NR
+ \ML
+ % \ShowScriptsValue{#1}{\Umathaxis} {MathAxis}
+ \ShowScriptsValue{#1}{\Umathsubshiftdown} {SubscriptShiftDown}
+ \ShowScriptsValue{#1}{\Umathsubshiftdrop} {SubscriptBaselineDropMin}
+ \ShowScriptsValue{#1}{\Umathsubsupshiftdown}{SubscriptShiftDownWithSuperscript}
+ % \ShowScriptsValue{#1}{\Umathsubsupvgap} {}
+ \ShowScriptsValue{#1}{\Umathsubtopmax} {SubscriptTopMax}
+ \ShowScriptsValue{#1}{\Umathsupbottommin} {SuperscriptBottomMin}
+ \ShowScriptsValue{#1}{\Umathsupshiftdrop} {SuperscriptBaselineDropMax}
+ \ShowScriptsValue{#1}{\Umathsupshiftup} {SuperscriptShiftUp}
+ \ShowScriptsValue{#1}{\Umathsupsubbottommax}{SuperscriptBaselineDropMax}
+ \LL
+ \stoptabulate
+\stoptexdefinition
+
+\ShowSomething{ShowScripts}
+
+One of the pitfalls is that in \CONTEXT\ we actually set \type
+{\Umathsubsupshiftdown} which the results in a bad parameter being used. This
+also makes that we do need to fix the font. footnote {Other macro packages are
+less likely to suffer from this as long as they don't set that parameter.} These
+are issues that we easily spent days on checking, double checking and exploring
+variants before settling on some approach. In this case we compared traditional
+\PDFTEX\ output using Computer Modern with \OPENTYPE\ rendering using Latin
+Modern which exposed the issue.
+
+\stopchapter
+
+\startchapter[title=primes]
+
+A few words on primes, a pain in the butt symbol. In traditional \TEX\ (fonts) a
+prime is a special symbol. Macro packages are set up in such a way that single
+quotes become primes. In practice that then boils down to putting the symbol in
+the superscript which means that at the \TEX\ level the smaller size is used.
+
+This smaller size is somehow reflected in the \OPENTYPE\ math fonts: the script
+and scriptscript sized (ssty variant 1 and 2) are basically meant to be
+superscripted. The text size however often looks differently and is positioned
+like an accent. Supposedly it is meant to be used without placement, as minute or
+second indicator. This is one of the cases where a text, script and scriptscript
+variant of the same glyphs looks pretty incompatible.
+
+Combined with up to four primes being combined as well as up to three reverse
+primes being provided this a rather messy implementation. In \CONTEXT\ we always
+tweaked the dimensions to consistently suit our purpose.
+
+When we experimented with primes as operator, implemented like we do with fourier
+using right delimited radicals, we realized that hooking this into the text level
+symbol gave inconsistent results so in the end we simplified the \type
+{fixprimes} tweak in a way that suits both usage patterns: we just use the \type
+{ssty}~1 variant (of course scaled to the right relative size) for all three
+sizes: there is no need to be more granular and it safes us some trouble. We
+thereby also sacrifice some detailed tweaking but also got rid of potential
+visual incompatibilities as for instance in \STIX.
+
+\stopchapter
+
+\startchapter[title=Tweak: dimensions] \ShowTweakUsage{dimensions}
+
+Usage of this tweak can best be observed (and experimented) in the goodie files
+because there are many parameters. Most are fractions, for instance of the width.
+It is important to realize than when you mess with the \type {width} and \type
+{xoffset}, you need to set the \type {advance} to (most likely) the old width
+when it hasn't yet be set. This tells the backend what the natural glyph
+progression is.
+
+\stopchapter
+
+\startchapter[title=Tweak: topanchors] \ShowTweakUsage{topanchors}
+
+\startbuffer
+\im{\hat{f}+\widehat{f}}
+\stopbuffer
+
+\starttabulate[|l|c|c|]
+ \NC \NC tweaked \NC original \NC \NR
+ \NC ebgaramond
+ \NC \switchtobodyfont[ebgaramond] \getbuffer
+ \NC \switchtobodyfont[ebgaramond-nt] \getbuffer \NR
+\stoptabulate
+
+\stopchapter
+
+\startchapter[title=Tweak: moveitalics] \ShowTweakUsage{moveitalics}
+
+By now we have written plenty about italic correction in math fonts. To summarize
+it: in traditional \TEX\ fonts the width of characters is such that the subscript
+sits nicely against the shape, and the italic correction determines where the
+superscript ends up or when that is absent where the next item starts. It is also
+used for positioning the limits on n-ary operators. In \OPENTYPE\ fonts kerning
+happens with staircase kerns and italic correction is supposedly only used after
+a run of italic shapes. There positioning the limits is also driven by that
+correction.
+
+The dual purpose is confusing. In traditional fonts the italic correction is
+actually a kern and that is why we decided to just add it to the width and use
+the same value for a negative bottom kern. An exception is the integral where as
+mentioned the correction determines the limits.
+
+With the fonts being some mix for old and new we also have to deal with the left
+end of the shapes, especially in relation to the positioning of top accents which
+can be somewhat erratic.
+
+All this head lead us to a tweak that does several things at once: get rid of
+weird left side bearings (so that for instance a math italic \type {f} doesn't
+stick out in a way that makes it unusable), correct the advance width with the
+italic correction, turn top accent values into top and bottom anchors, add top
+and bottom right and left kerns based on all this. Finally we wipe the old italic
+and top accent values and end up with a clean glyph that we can deal with properly
+in several circumstances.
+
+In the goodie files you can find these lines:
+
+\starttyping
+presets.moveitalics { correct = true },
+presets.moveitalics { correct = true, letters = true },
+\stoptyping
+
+In the file \type {common-math.lfg} you can find how these are defined. The first
+one does the alphabets and the second one all the letters. That second one is
+sort of redundant but one can now comment the line in order to check for
+left-overs. Because we do this for all fonts, we have defined these operations as
+presets. so it makes sense to study this file. These lines are in fact function
+calls that return a regular tweak table entry.
+
+\stopchapter
+
+\startchapter[title=Tweak: movelimits] \ShowTweakUsage{movelimits}
+
+This tweak turns the italic correction of integrals into anchors and right kerns,
+something that the engine can deal with in a more advanced way than just some
+fuzzy italic correction because kerns permeable through the renderer. Again we
+have a preset:
+
+\starttyping
+presets.moveintegrals { factor = 1.5 }
+\stoptyping
+
+This is defined as:
+
+\starttyping
+moveintegrals = function(parameters)
+ return {
+ tweak = "movelimits",
+ factor = parameters.factor or 1,
+ list = mathematics.tweaks.subsets.integrals,
+ }
+end
+\stoptyping
+
+Watch how we pas a factor that does an extra shift on the top and bottom anchors.
+For the list we use a predefined list of integrals (and there are plenty in
+\UNICODE).
+
+\stopchapter
+
+\startchapter[title=Tweak: wipeanchors] \ShowTweakUsage{wipeanchors}
+
+This tweak wipes the top anchors (top accents) for the given (ranges) of
+characters. There are fonts out there with weird ones and when wiped the centered
+positioning that kicks in when no anchor is defined works better. In practice
+only a few very sloped characters benefit from anchors. Interesting is that the
+math italic f is sensitive for bad dimensions and anchors and as that character
+is used a lot the impression can be that a whole font is bad if that one is.
+
+\stopchapter
+
+\startchapter[title=Tweak: wipeitalics] \ShowTweakUsage{wipeitalics}
+
+This tweak wipes the \quote {italic correction} fields that are left over after
+applying \type {moveitalics} and \type {movelimits}. For instance some symbols
+can have italic corrections that make no sense but might have resulted from some
+automatic font generation workflow.
+
+\stopchapter
+
+\startchapter[title=Tweak: checkspacing] \ShowTweakUsage{checkspacing}
+
+This is a rather harmless but still useful tweak. There are plenty of spacing characters
+in \UNICODE\ and although in math mode spacing is handled automatically users might be
+tempted to inject their own. Normally that happens with commands but using these direct
+characters can be an option.
+
+\starttexdefinition CheckSpacingA #1
+ \start
+ \switchtobodyfont[#1]
+ \normalexpanded{\stop\ttx\withoutpt\emwidth}%
+\stoptexdefinition
+
+\starttexdefinition CheckSpacingB #1#2
+ \vrule height 1.5\exheight depth 0.5\exheight width 1pt
+ \start
+ \switchtobodyfont[#1]%
+ \char#2\relax
+ \stop
+ \vrule height 1.5\exheight depth 0.5\exheight width 1pt
+\stoptexdefinition
+
+\startluacode
+ local list = mathematics.tweaks.datasets.checkspacing
+ context.starttabulate { "|l|l|" .. string.rep("c|",#list) }
+ context.NC() context.NC()
+ for i=1,#list do
+ context.NC() context.rotate( { rotation = "90" }, string.formatters["\\ttx %U"](list[i][1]) )
+ end
+ context.NC() context.NR()
+ context.NC() context.NC()
+ for i=1,#list do
+ context.NC() context("\\ttx %s",list[i][2]) -- space quad char
+ end
+ context.NC() context.NR()
+ for i=1,#document.usedfonts do
+ local font = document.usedfonts[i][1]
+ context.NC()
+ context(font)
+ context.NC()
+ context.CheckSpacingA(font)
+ for i=1,#list do
+ context.NC()
+ context.CheckSpacingB(font,list[i][1])
+ end
+ context.NC()
+ context.NR()
+ end
+ context.stoptabulate()
+\stopluacode
+
+In this table the \type {s} indicates that the value is a spacer, like a \quote
+{non breakable space}, the \type {q} that the value is derived from a quad, like
+\quote {four per em space}, and the \type {c} means that we have a character
+driven quantity, like a \quote {punctuation space}.
+
+\stopchapter
+
+\startchapter[title=Tweak: setovershoots] \ShowTweakUsage{setovershoots}
+
+This tweak add some tolerance to characters which will make accents on top of
+them look a bit better.
+
+\starttyping
+{
+ tweak = "setovershoots",
+ list = {
+ {
+ target = "uppercasescript",
+ topovershoot = 0.05,
+ },
+ {
+ target = "uppercaseboldscript",
+ topovershoot = 0.05,
+ },
+ },
+}
+\stoptyping
+
+\stopchapter
+
+\startchapter[title=Tweak: simplifykerns] \ShowTweakUsage{simplifykerns}
+
+The native kerning mechanism in \OPENTYPE\ math fonts uses staircase kerns for
+positioning scripts at each corner. When we looked into fonts in more detail we
+noticed that when the first step was normally okay, the second of third was such
+that the shape was actually touched. This made us add this tweak, where the
+extremes of staircase kerns (first top and last bottom) are used instead. This is
+possible because in \LUAMETATEX\ we have additional kerning features.
+
+One can argue that this degrades the quality but one has to keep in mind that
+\TEX\ will move script up and down anyway, so one seldom ends up in the more
+dangerous zones. So it's best to just catch it and throw out the few that we
+could benefit from.
+
+\stopchapter
+
+\startchapter[title=Tweak: kernpairs] \ShowTweakUsage{kernpairs}
+
+We use this tweak to optimize kerning between successive characters. Here are
+some examples for bonum:
+
+\startlines
+{\showglyphs\switchtobodyfont [bonum]$aj$\quad $fj$\quad $ij$}
+{\showglyphs\switchtobodyfont[bonum-nt]$aj$\quad $fj$\quad $ij$}
+\stoplines
+
+It might take while before we have set them up; fortunately we can use
+categories to set up a lot at the same time.
+
+Some fonts have kerns, for instance \STIX\ but not for math. Borrowing the
+default latin ones is no real option because it looks too inconsistent for use in
+math. This is why for now we keep it explicit.
+
+% \startlines
+% {\showglyphs\switchtobodyfont [stixtwo]$aj$\quad $fj$\quad $ij$\quad \char65 \char67}
+% {\showglyphs\switchtobodyfont[stixtwo-nt]$aj$\quad $fj$\quad $ij$\quad \char65 \char67}
+% \stoplines
+
+\stopchapter
+
+\startchapter[title=Tweak: kerns] \ShowTweakUsage{kerns}
+
+This tweak can be used to set the (simple) corner kerns.
+
+\starttyping
+{
+ tweak = "kerns",
+ list = {
+ [0x002F] = { topleft = -0.2, bottomright = -0.2 },
+ }
+}
+\stoptyping
+
+The numbers are a fraction of the width and valid fields are \typ {topleft}, \typ
+{topright}, \typ {bottomleft} and \typ {bottomright}. These kerns are used in pre
+and postscripts.
+
+\starttexdefinition KernsTest #1
+ \NC #1
+ \NC \switchtobodyfont[#1] $\showglyphs x^2/2$
+ \NC \switchtobodyfont[#1-nt] $\showglyphs x^2/2$
+ \NC \NR
+\stoptexdefinition
+
+\starttabulate[|l|c|c|]
+ \NC \NC tweaked \NC original \NC \NR
+ \ctxlua {
+ for i=1,#document.usedfonts do
+ if i > 1 then
+ context.TB { "medium" }
+ end
+ context.KernsTest(document.usedfonts[i][1])
+ end
+ }
+\stoptabulate
+
+\stopchapter
+
+\startchapter[title=Tweak: margins] \ShowTweakUsage{margins}
+
+This tweak is similar to the kerns tweak but adds margins instead. it is a trick to
+enforce larger and|/|or smaller accents (like for instance \type {\widetilde}.
+
+\starttyping
+{
+ tweak = "margins",
+ list = {
+ [0x1D7DC] = { left = -.1, right = -.1 }, -- doublestruck 4
+ }
+}
+\stoptyping
+
+The relevant fields are \type {left} and \type {right}, they specify the margins
+as fraction of the width, and \type {top} and \type {bottom}, those specify
+margins as fraction of the combined height and depth.
+
+Keep in mind that these are not \OPENTYPE\ math properties but specific (and
+native) to \LUAMETATEX.
+
+\stopchapter
+
+\startchapter[title=Tweak: staircase] \ShowTweakUsage{staircase}
+
+{\em This tweak is kind of obsolete and might go away some day.}
+
+\stopchapter
+
+\startchapter[title=Tweak: fixintegrals] \ShowTweakUsage{fixintegrals}
+
+In the Computer Modern font there are only a few sizes for the integral sign
+\type {U+222B} and they are very sloped. Nowadays fonts also have an extensible
+in which case the shape is upright. In \UNICODE\ there are quite some characters
+that can be used to construct extensibles (like braces) and there are also
+snippets for constructing integrals: \type {0x2320}, \type {0x23AE} and \type
+{0x2321}. The fact that these are there and that fonts then provide them also
+makes it easy to provide extensibles: you just stack them:
+
+\starttexdefinition TestIntegralSnippets #1
+ \NC #1
+ \NC \showglyphs \switchtobodyfont[#1-nt]%
+ $ \displaystyle \integral { \quad \vcenter\bgroup
+ \darkred
+ \offinterlineskip
+ \hpack{$\char"2320$}
+ \hpack{$\char"23AE$}
+ \hpack{$\char"2321$}
+ \egroup } $
+ \NC \showglyphs \switchtobodyfont[#1-nt]$\char"2320$
+ \NC \showglyphs \switchtobodyfont[#1-nt]$\char"23AE$
+ \NC \showglyphs \switchtobodyfont[#1-nt]$\char"2321$
+ \NC \NR
+\stoptexdefinition
+
+\starttabulate[|||c|c|c|]
+ \ShowSomething{TestIntegralSnippets}
+\stoptabulate
+
+This tweak can use these snippets to provide an extensible in case it is not part
+of the integral glyph definition. In these examples we show the untweaked
+integral that is choosen when we provide the one made from three snippets. The
+red one is the constructed variant. Keep in mind that an extensible works best
+when there is some overlap possible.
+
+\stopchapter
+
+\startchapter[title=Tweak: accentdimensions] \ShowTweakUsage{accentdimensions}
+
+Positioning of accents is driven by \typ {AccentBaseHeight} and \typ
+{AccentBaseDepth} combined with the height of what goes under an accent as we ll
+as the height of the accent. Unfortunately the height of the accents is not
+always consistent across the repertoire and within a variant list starting with
+the initial character.
+
+\starttexdefinition TestAccentDimension #1#2#3
+ \NC \ifnum#3=1 #1\fi
+ \NC \tttf U+\ifnum#2<"FFF 0\fi\tohexadecimal#2
+ \NC \switchtobodyfont [#1]\showglyphs$\char#2$
+ \NC \switchtobodyfont [#1]\showglyphs$\dorecurse{3}{\char\mathvariantcode #2 ##1\quad}\unskip$
+ \NC \switchtobodyfont[#1-nt]\showglyphs$\char#2$
+ \NC \switchtobodyfont[#1-nt]\showglyphs$\dorecurse{3}{\char\mathvariantcode #2 ##1\quad}\unskip$
+ \NC \NR
+\stoptexdefinition
+
+\startluacode
+ function document.TestAccentDimension(list)
+ context.starttabulate { "|l|c|c|c|c|c|" }
+ context.FL()
+ context.NC() context("bodyfont")
+ context.NC() context("unicode")
+ context.NC() context("tweaked")
+ context.NC()
+ context.NC() context("original")
+ context.NC()
+ context.NC() context.NR()
+ for i=1,#document.usedfonts do
+ context.ML()
+ local n = 0
+ for k, v in table.sortedhash(mathematics.tweaks.datasets.accentdimensions[list]) do
+ n = n + 1
+ context.TestAccentDimension(document.usedfonts[i][1],k,n)
+ end
+ end
+ context.LL()
+ context.stoptabulate()
+ end
+\stopluacode
+
+The over and under accents are not always present so other tweaks fill in these gaps.
+
+\ctxlua{document.TestAccentDimension("over")}
+\ctxlua{document.TestAccentDimension("under")}
+
+We can specify what accents get processed but here we show the default set. In most cases o
+treatment is needed.
+
+\ctxlua{document.TestAccentDimension("accent")}
+
+The specification can be simple, just the tweak name, but you can also specify
+a detailed list:
+
+\starttyping
+{
+ tweak = "accentdimensions",
+ list = { "over", "under" }, -- "accent"
+}
+\stoptyping
+
+or even:
+
+\starttyping
+{
+ tweak = "accentdimensions",
+ list = {
+ [0x203E] = { factor = "over" }, -- overbar
+ [0x203E] = { factor = "under" }, -- underbar
+ [0x23DE] = { factor = "over" }, -- overbrace
+ [0x23DF] = { factor = "under" }, -- underbrace
+ [0x23DC] = { factor = "over" }, -- overparent
+ [0x23DD] = { factor = "under" }, -- underparent
+ [0x23B4] = { factor = "over" }, -- overbracket
+ [0x23B5] = { factor = "under" }, -- underbracket
+ }
+}
+\stoptyping
+
+Instead of a named factor you can pass a number to be applied to the height or
+depth. As with all tweaks, they are normally not applied at the user level so if
+you have to you'd better check the source code to see what really happens in this
+tweak (this is true for more tweaks).
+
+\stopchapter
+
+\startchapter[title=Tweak: copyaccents] \ShowTweakUsage{copyaccents}
+
+This tweak deals with a mixup of combining accents and wide accents where
+recipes can be on the \quote {wrong} code point.
+
+\startluacode
+context.starttabulate { "|T|T|c|c|" }
+context.FL()
+context.NC() context("base")
+context.NC() context("accent")
+context.NC() context("scale")
+context.NC() context.NR()
+context.ML()
+for k, v in table.sortedhash(mathematics.tweaks.datasets.copyaccents) do
+ context.NC() context("%U",k)
+ context.NC() context("%U",v[1])
+ context.NC() context(v[2] and "yes" or "no")
+ context.NC() context("$\\char %i$",v[1])
+ context.NC() context.NR()
+end
+context.LL()
+context.stoptabulate()
+\stopluacode
+
+\stopchapter
+
+\startchapter[title=Tweak: fixaccents] \ShowTweakUsage{fixaccents}
+
+When the width of an accent is zero but it has an top (accent) anchor defined we
+can fix the its width, which is what this somewhat obscure tweak does. It belongs
+to the repertoire of weird tweaks that we came up with when trying to make
+suboptimal fonts work well.
+
+\stopchapter
+
+\startchapter[title=Tweak: extendaccents] \ShowTweakUsage{extendaccents}
+
+When a wide accent is used the engine will try to find a best match from a
+sequence of variants. When there are no more variants it will use an extensible
+(recipe) when present. When that is not the case, one can decide to stretch the
+last variant to fit, but that only works for a few accents: the scale column in
+the table in the chapter about copying accents shows them. This tweak takes a few
+optional parameters: \type{all} that is either \type {true} or a number
+indicating after which variant stretching starts, and \type {force} that forces
+stretch on all variants.
+
+\stopchapter
+
+% \startchapter[title=Tweak: fixanchors] \ShowTweakUsage{fixanchors}
+% obsolete
+% \stopchapter
+
+\startchapter[title=Tweak: flattenaccents] \ShowTweakUsage{flattenaccents}
+
+An \OPENTYPE\ math font can have a flat variant of an accent that can kick in when we
+run out of space. This feature will flatten regular accents. The same list is used as
+for copying accents. There are optional parameters to control the flattening:
+
+\starttabulate[||||]
+\FL
+\NC parameter \NC type \NC default \NC \NR
+\ML
+\NC force \NC boolean \NC false \NC \NR
+\NC height \NC factor \NC 0.8 \NC \NR
+\NC offset \NC factor \NC 0.9 or calculated \NC \NR
+\NC squeeze \NC factor \NC 0.1 or calculated \NC \NR
+\LL
+\stoptabulate
+
+\stopchapter
+
+\startchapter[title=Tweak: bigslots] \ShowTweakUsage{bigslots}
+
+This tweak can be applied as tweak or at a higher level in the mathematics goodie
+table. When defined as tweak it is under font version control.
+
+\starttexdefinition CheckBigSlotA #1#2
+ \start
+ \switchtobodyfont[#1]%
+ \im{\char\mathvariantcode "7B #2}%
+ \stop
+ \hss
+\stoptexdefinition
+
+\starttexdefinition CheckBigSlotB #1#2
+ \start
+ \switchtobodyfont[#1]%
+ \setbox\scratchbox\hbox{\im{\char\mathvariantcode "7B #2}}%
+ \normalexpanded{\stop{\ttxx
+ \cldcontext{"\letterpercent.3f",\number\htdp\scratchbox/\number\exheight}%
+ }}\quad
+\stoptexdefinition
+
+\starttexdefinition CheckBigSlotC #1
+ \start
+ \switchtobodyfont[#1]%
+ \normalexpanded{\stop{\ttxx\withoutpt\exheight}}%
+\stoptexdefinition
+
+\startluacode
+context.starttabulate { "|l|l|l|l|l|" }
+ context.NC() context("font")
+ -- context.NC() context("tweak")
+ -- context.NC() context("global")
+ context.NC() context("sequence")
+ context.NC() context("ex-height")
+ context.NC() context("rendering")
+ context.NC() context("ratio to ex")
+ context.NC() context.NR()
+ for i=1,#document.usedfonts do
+ local font = document.usedfonts[i][1]
+ local goodies = document.usedgoodies[font]
+ local llist = goodies.bigslots
+ local glist = goodies.goodies.bigslots
+ local list = glist or llist
+ context.NC() context(font)
+ -- context.NC() context("% t",llist)
+ -- context.NC() context("% t",glist)
+ context.NC() if list then context("\\ttxx % t",list) else context("unset") end
+ context.NC()
+ if list then
+ context.CheckBigSlotC(font)
+ end
+ context.NC()
+ if list then
+ -- context.switchtobodyfont { font }
+ -- for i=1,#list do
+ -- context(function()
+ -- context.im(utf.char(mathematics.variantcode(0x7B,list[i]))) context.quad()
+ -- context.im(utf.char(mathematics.variantcode(0x5D,list[i]))) context.quad()
+ -- end)
+ -- end
+ context.hss()
+ for i=1,#list do
+ context.CheckBigSlotA(font,list[i])
+ end
+ end
+ context.NC()
+ if list then
+ for i=1,#list do
+ context.CheckBigSlotB(font,list[i])
+ end
+ end
+ context.NC() context.NR()
+ end
+context.stoptabulate()
+\stopluacode
+
+\stopchapter
+
+\startchapter[title=Tweak: wipevariants] \ShowTweakUsage{wipevariants}
+
+When a font has too many variants one can wipe them with this tweak. The entries
+in the list specify the last variant. When a \type {*} will wipe all variants.
+
+\starttyping % [style=\ttx]
+{
+ tweak = "radicaldegreeanchors",
+ list = {
+ [0x221A] = 5, -- becomes last variant
+ }
+}
+\stoptyping
+
+\stopchapter
+
+\startchapter[title=Tweak: radicaldegreeanchors] \ShowTweakUsage{radicaldegreeanchors}
+
+The position of the radical degree is determined by some font parameters (todo)
+but these are shared among the different sizes as well as the extensible. We
+therefore provide a tweak that sets real anchors. These are not officially in
+\UNICODE\ math but an engine feature. Here is the experimental setup we made for
+Lucida. It demonstrates that we can set the base character, variants and the
+extensible. The factors that default to one, are applied to the width and height
+plus depth in order to get the coordinates.
+
+\starttyping[style=\ttx]
+{
+ tweak = "radicaldegreeanchors",
+ list = {
+ -- the base radical:
+ -- [0x221A] = { hfactor = .05, vfactor = .675 },
+ -- all variants:
+ -- ["0x221A.variants.*"] = { hfactor = .05, vfactor = .6 },
+ -- specific variants:
+ -- ["0x221A.variants.1"] = { hfactor = .05, vfactor = .65 },
+ -- ["0x221A.variants.2"] = { hfactor = .1, vfactor = .65 },
+ ["0x221A.variants.3"] = { hfactor = 0, vfactor = .55 },
+ ["0x221A.variants.4"] = { hfactor = 0, vfactor = .50 },
+ -- ["0x221A.variants.5"] = { hfactor = .05, vfactor = .525 },
+ -- ["0x221A.variants.5"] = { hfactor = .1, vfactor = .55 },
+ -- ["0x221A.variants.6"] = { hfactor = .1, vfactor = .55 },
+ -- extensibles where the setting of bottom wins over top:
+ -- ["0x221A.parts.top"] = { hfactor = .1, vfactor = 5.5 },
+ ["0x221A.parts.bottom"] = { hfactor = 0, vfactor = .85 },
+ }
+}
+\stoptyping
+
+The \type {location} is not set here and defaults to \type {left}; it is
+redundant because currently we only have left sided radical degrees (but we do
+have right sided radicals).
+
+\stopchapter
+
+\startchapter[title=Tweak: fixradicals] \ShowTweakUsage{fixradicals}
+
+Because there is are limited number of heights and depths available in original
+\TFM\ files and variants by their nature differ in height and depth some glyphs
+like radicals have interesting dimensions. At the time of writing this only Latin
+Modern has this property.
+
+{\em ff image needed here}
+
+\starttexdefinition TestFixRadical #1
+ \dontleavehmode
+ \NC {\srule height3ex depth 2ex \relax}#1
+ \NC \showglyphs \switchtobodyfont[#1-nt]$\mathaxisbelow \char"221A + x$
+ \NC \showglyphs \switchtobodyfont [#1]$\mathaxisbelow \char"221A + x$
+ \NC \showglyphs \switchtobodyfont [#1]$\mathaxisbelow \char\mathvariantcode "221A 1 + x$
+ \NC \showglyphs \switchtobodyfont [#1]$\mathaxisbelow \sqrt{x}$
+ \NC \NR
+\stoptexdefinition
+
+\starttabulate[|l|c|c|c|c|]
+ \NC bodyfont \NC untweaked \NC tweaked \NC first variant \NC example \NC \NR
+ \ShowSomething{TestFixRadical}
+\stoptabulate
+
+% after this: \dorecurse{15}{ Nacht Na de Dam 2021 | Wende - Bloed in mijn Bloed }
+
+\stopchapter
+
+\startchapter[title=Tweak: fallbacks] \ShowTweakUsage{fallbacks}
+
+This tweak is not really a tweak but hooks into the fallbacks that a user
+defined. However, when fallbacks are set, they need to be injected at the right
+spot in the sequence of tweaks which is why it is defined in the goodie file.
+
+\stopchapter
+
+\startchapter[title=Tweak: replacealphabets] \ShowTweakUsage{replacealphabets}
+
+This tweak is an important one. It is used to add or swap script and calligraphic
+alphabets, inject right to left variants and configure replacements based on
+features. The following fields can be set:
+
+\starttabulate[||||]
+\NC filename \NC string \NC source file \NC \NR
+\NC feature \NC string \NC feature \NC \NR
+\NC source \NC string \NC alphabet name \NC \NR
+\NC \NC table \NC first source range \NC \NR
+\NC target \NC string \NC alphabet name \NC \NR
+\NC \NC table \NC first source range \NC \NR
+\NC rscale \NC number \NC relative scale \NC \NR
+\stoptabulate
+
+When an effect (like boldening) is used it is also applied to the injected
+alphabets. When not given, the target range is the same as the source. An example
+of a more extensive specification is:
+
+\starttyping
+{
+ tweak = "replacealphabets",
+ feature = "euleroverpagella",
+ filename = "euler.otf",
+ list = {
+ { source = { first = 0x02100, last = 0x02BFF } },
+ { source = { first = 0x1D400, last = 0x1D7FF } },
+ { source = { first = 0x1D538, last = 0x1D550 } },
+ },
+}
+\stoptyping
+
+The feature at the outer level is a selector that can be set as follows:
+
+\starttyping
+\definefontfeature[lucida:mathextra][euleroverpagella=yes]
+\stoptyping
+
+This feature is not to be confused by the file related one that we access in for
+instance for instance Lucida:
+
+\starttyping
+{
+ tweak = "replacealphabets",
+ list = {
+ {
+ source = "uppercasescript",
+ target = "uppercasecalligraphic",
+ feature = "ss04",
+ },
+ {
+ source = "lowercasescript",
+ target = "lowercasecalligraphic",
+ feature = "ss04",
+ },
+ {
+ source = "uppercaseboldscript",
+ target = "uppercaseboldcalligraphic",
+ feature = "ss04",
+ },
+ -- No lowercase bold calligraphic/script in font
+ },
+},
+\stoptyping
+
+The calligraphic alphabets are not official \UNICODE\ but internal \CONTEXT\ ones
+that are used to switch between script and calligraphic styles.
+
+\stopchapter
+
+\startchapter[title=Tweak: replace] \ShowTweakUsage{replace}
+
+You can replace a character in a font by another one:
+
+\starttyping
+{
+ tweak = "replace",
+ list = {
+ [0x123] = 0x125
+ },
+},
+\stoptyping
+
+\stopchapter
+
+\startchapter[title=Tweak: substitute] \ShowTweakUsage{substitute}
+
+You can substitute a character in a font by one from a substitution feature:
+
+\starttyping
+{
+ tweak = "substitute",
+ list = {
+ [0x123] = "ss01"
+ },
+},
+\stoptyping
+
+\stopchapter
+
+\startchapter[title=Tweak: fixprimes] \ShowTweakUsage{fixprimes}
+
+\starttexdefinition PrimeTest #1
+ \NC #1
+ \NC \showglyphs \switchtobodyfont[#1] $f'(x)+e^{g'(x)} - a''+ b''' + c''''$
+ \NC \showglyphs \switchtobodyfont[#1-nt] $f'(x)+e^{g'(x)} - a''+ b''' + c''''$
+ \NC \showglyphs \switchtobodyfont[#1] $\primed{f}$
+ \NC \NR
+\stoptexdefinition
+
+\starttabulate[|l|c|c|c|]
+ \NC \NC tweaked \NC original \NC primed \NC \NR
+ \ctxlua {
+ for i=1,#document.usedfonts do
+ if i > 1 then
+ context.TB()
+ end
+ context.PrimeTest(document.usedfonts[i][1])
+ end
+ }
+\stoptabulate
+
+\stopchapter
+
+\startchapter[title=Tweak: fixslashes] \ShowTweakUsage{fixslashes}
+
+This tweak makes sure that the regular slash \type {U+002F} behaves compatible
+with the math one \type {U+2044}. Not all fonts provide the correct variants
+chain.
+
+% There is currently no need to show datasets.fixslashes as there is
+% just one entry.
+
+\stopchapter
+
+\startchapter[title=Tweak: fixellipses] \ShowTweakUsage{fixellipses}
+
+\startbuffer
+\im{1 + 2+ \cdots + n} \im{1, 2, \ldots, n}
+\stopbuffer
+
+\starttabulate[|l|c|c|]
+ \NC \NC tweaked \NC original \NC \NR
+ \NC concrete
+ \NC \switchtobodyfont[concrete] \getbuffer
+ \NC \switchtobodyfont[concrete-nt] \getbuffer \NR
+\stoptabulate
+
+\stopchapter
+
+\startchapter[title=Tweak: wipecues] \ShowTweakUsage{wipecues}
+
+Cues are hidden directives that should not take space so we set their dimensions
+to zero:
+
+\startluacode
+ local t = mathematics.tweaks.datasets.wipecues
+ local c = characters.data
+ context.starttabulate { "|c|c|l|" }
+ for i=1,#t do
+ local u = t[i]
+ context.NC() context("%U",u)
+ context.NC() context("$\\char %i$",u)
+ context.NC() context(c[u].description)
+ context.NC() context.NR()
+ end
+ context.stoptabulate()
+\stopluacode
+
+{\em Maybe some day we add tracers in which case they are visible but stil take
+no space.}
+
+\stopchapter
+
+\startchapter[title=Tweak: addactuarian] \ShowTweakUsage{addactuarian}
+
+This adds the annuity symbol \type {U+020E7} but as extensible because in itself
+this symbol, if present in the font at all, is rather unusable. It uses the same
+mechanism as radicals (roots) but from the other edge.
+
+% {\em todo: realistic example by Mikael}
+% From wiki: https://en.wikipedia.org/wiki/Actuarial_notation
+
+{\red MPS: In the \typ{\rannuity{m}} example, I would like it to be without the top bar, but I cannot find that. Also, maybe the bar over $n$ should also be tighter.}
+
+
+\starttexdefinition ActuarianTest #1
+ \NC #1
+ \NC \switchtobodyfont[#1]
+ $\bar{A}^1_{x:\rannuity{n}}^^{2}__{\rannuity{m}}$
+ \NC \NR
+\stoptexdefinition
+
+\starttabulate[|l|c|]
+ \NC \NC tweaked \NC \NR
+ \ctxlua {
+ for i=1,#document.usedfonts do
+ if i > 1 then
+ context.TB()
+ end
+ context.ActuarianTest(document.usedfonts[i][1])
+ end
+ }
+\stoptabulate
+
+
+
+\stopchapter
+
+\startchapter[title=Tweak: addarrows] \ShowTweakUsage{addarrows}
+
+Not all fonts have extensible arrows. Traditionally in \TEX\ these were made
+from arrow heads and rules. This tweak makes proper extensibles.
+
+\startluacode
+ local t = mathematics.tweaks.datasets.addarrows
+ local c = characters.data
+ context.starttabulate { "|c|c|c|l|" }
+ for i=1,#t do
+ local u = t[i]
+ context.NC() context("%U",u)
+ context.NC() context("$\\char %i$",u)
+ context.NC() context("$\\Umathaccent 0 0 %i{\\hskip3em}$",u)
+ context.NC() context(c[u].description)
+ context.NC() context.NR()
+ end
+ context.stoptabulate()
+\stopluacode
+
+\stopchapter
+
+\startchapter[title=Tweak: addbars] \ShowTweakUsage{addbars}
+
+There is only one parameter to this tweak: \type {advance} which is a fraction
+of the width.
+
+\starttexdefinition BarTest #1
+ \NC #1
+ \NC \showglyphs \switchtobodyfont[#1] $\char"007C\quad\char"2016\quad\char"2980$
+ \NC \showglyphs \switchtobodyfont[#1-nt] $\char"007C\quad\char"2016\quad\char"2980$
+ \NC \NR
+\stoptexdefinition
+
+\starttabulate[|l|c|c|]
+ \NC \NC tweaked \NC original \NC \NR
+ \ctxlua {
+ for i=1,#document.usedfonts do
+ if i > 1 then
+ context.TB()
+ end
+ context.BarTest(document.usedfonts[i][1])
+ end
+ }
+\stoptabulate
+
+\stopchapter
+
+\startchapter[title=Tweak: addequals] \ShowTweakUsage{addequals}
+
+There is only one parameter to this tweak: \type {advance} which is a fraction
+of the width.
+
+\starttexdefinition EqualTest #1
+ \NC #1
+ \NC \showglyphs \switchtobodyfont[#1] $\char"003D\quad\char"2A75\quad\char"2A76$
+ \NC \showglyphs \switchtobodyfont[#1-nt] $\char"003D\quad\char"2A75\quad\char"2A76$
+ \NC \NR
+\stoptexdefinition
+
+\starttabulate[|l|c|c|]
+ \NC \NC tweaked \NC original \NC \NR
+ \ctxlua {
+ for i=1,#document.usedfonts do
+ if i > 1 then
+ context.TB()
+ end
+ context.EqualTest(document.usedfonts[i][1])
+ end
+ }
+\stoptabulate
+
+\stopchapter
+
+\startchapter[title=Tweak: addfourier] \ShowTweakUsage{addfourier}
+
+This adds the fourier rendering which uses the radical subsystem but with a right
+hand symbol.
+
+% {\em todo: realistic example by Mikael}
+% From Folland - Real analysis:
+
+\starttexdefinition FourierTest #1
+ \NC #1
+ \NC \switchtobodyfont[#1]
+ $\partial^\alpha \hat{f} = \fourier{[(-2\pi i x )^{\alpha} f]}$
+ \NC \NR
+\stoptexdefinition
+
+\starttabulate[|l|c|]
+ \NC \NC tweaked \NC \NR
+ \ctxlua {
+ for i=1,#document.usedfonts do
+ if i > 1 then
+ context.TB()
+ end
+ context.FourierTest(document.usedfonts[i][1])
+ end
+ }
+\stoptabulate
+
+\stopchapter
+
+\startchapter[title=Tweak: addmirrors] \ShowTweakUsage{addmirrors}
+
+This adds symbols for right|-|to|-|left math by simply mirroring existing ones.
+Deep down the engine doesn't really care about in what direction typesetting
+happens (wrt spacing and building structures), and it is the backend that does
+the real work. However, symbols need to be flipped.
+
+\stopchapter
+
+\startchapter[title=Tweak: addparts] \ShowTweakUsage{addparts}
+
+Here is an example of a (probably rarely used) low level extensible definition:
+
+\starttyping
+{
+ tweak = "addparts",
+ list = {
+ [0x21F4] = {
+ horizontal = true,
+ template = 0x2192,
+ sequence = {
+ { glyph = "first", factor = 2 },
+ { glyph = 0x2218 },
+ { glyph = "first", factor = 2 },
+ { glyph = "last" },
+ }
+ }
+ }
+},
+\stoptyping
+
+In this example \type {first} is equivalent to the first part of the template, and
+\type {last} to the last one. Like:
+
+\blank \start \switchtobodyfont[stixtwo] \im {
+ \char"21F4 \quad
+ \Umathtopaccent 0 0 "21F4 {\mathtexttf{\strut one two three}}
+} \stop \blank
+
+\stopchapter
+
+\startchapter[title=Tweak: addprivates] \ShowTweakUsage{addprivates}
+
+This tweak adds some characters to the repertoire. Currently we have only a few:
+
+\starttexdefinition PrivatesTest #1
+ \NC #1
+ \NC \switchtobodyfont[#1] $\um 2$
+ \NC \switchtobodyfont[#1] $\up 2$
+ \NC \switchtobodyfont[#1] $\ump 2$
+ \NC \switchtobodyfont[#1] $\upm 2$
+ \NC \NR
+\stoptexdefinition
+
+\starttabulate[|l|c|c|c|c|]
+ \NC \NC \type {\um} \NC \type {\up} \NC \type {\ump} \NC \type {\upm} \NC \NR
+ \ctxlua {
+ for i=1,#document.usedfonts do
+% if i > 1 then
+% context.TB { "small" }
+% end
+ context.PrivatesTest(document.usedfonts[i][1])
+ end
+ }
+\stoptabulate
+
+\stopchapter
+
+\startchapter[title=Tweak: addrules] \ShowTweakUsage{addrules}
+
+This adds a few (missing) rule based shapes to a font:
+
+\starttexdefinition RulesTest #1
+ \NC #1
+ \NC \switchtobodyfont[#1] $\Umathaccent top 0 0 "23B4 {\hskip2cm}$
+ \NC \switchtobodyfont[#1] $\Umathaccent top 0 0 "203E {\hskip2cm}$
+ \NC \switchtobodyfont[#1] $\Umathaccent bottom 0 0 "23B5 {\hskip2cm}$
+ \NC \NR
+\stoptexdefinition
+
+\starttabulate[|l|c|c|c|]
+ \NC \NC \type {0x23B4} \NC \type {0x203E} \NC \type {0x23B5} \NC \NR
+ \ctxlua {
+ for i=1,#document.usedfonts do
+ if i > 1 then
+ context.TB { "small" }
+ end
+ context.RulesTest(document.usedfonts[i][1])
+ end
+ }
+\stoptabulate
+
+\stopchapter
+
+\startchapter[title=Tweak: addscripts] \ShowTweakUsage{addscripts}
+
+This tweak adds high plus and minus shapes (we use them for indicating calculator
+input):
+
+\starttexdefinition ScriptsTest #1
+ \NC #1
+ \NC \switchtobodyfont[#1] $\char"207A x$
+ \NC \switchtobodyfont[#1] $\char"207B x$
+ \NC \switchtobodyfont[#1] $\char"208A x$
+ \NC \switchtobodyfont[#1] $\char"208B x$
+ \NC \NR
+\stoptexdefinition
+
+\starttabulate[|l|c|c|c|c|]
+ \NC \NC \type {0x207A} \NC \type {0x2037B} \NC \type {0x208A} \NC \type {0x208B} \NC \NR
+ \ctxlua {
+ for i=1,#document.usedfonts do
+ if i > 1 then
+ context.TB { "small" }
+ end
+ context.ScriptsTest(document.usedfonts[i][1])
+ end
+ }
+\stoptabulate
+
+\stopchapter
+
+\startchapter[title=What we ran into]
+
+\startsubject[title=Introduction]
+
+In this chapter we will show some of the characters that triggered adding a tweak
+feature. It can be that in the meantime something changed (got fixed) but
+nevertheless we think that by collecting some example here can help developers of
+math fonts to play safe so that the engine can do a good job even without tweaks.
+
+\stopsubject
+
+\startsubject[title=Latin Modern: radical base]
+
+In traditional \TEX\ fonts, for practical reasons (like implementation limits)
+the base radical character sits quite a bit below the baseline. The engine will
+automatically compensate for this when it is defined as radical but it makes
+usage as stand alone character hard. It also doesn't play well with corner kerns
+and degree anchoring.
+
+\startlinecorrection
+\startcombination
+ {\externalfigure[lm-radical-base.png] [width=.25\textwidth]} {base}
+ {\externalfigure[lm-radical-variant1.png][width=.25\textwidth]} {variant 1}
+\stopcombination
+\stoplinecorrection
+
+\stopsubject
+
+\startsubject[title=Latin Modern: weird anchors]
+
+The \TEX Gyre fonts have top accent anchors defined but they are (at least when
+we write this) often positioned on the highest point of the shape, which is
+probably a side effect of some automated heuristic. However, for some shapes that
+works out bad. This is why we can wipe these anchors, just use the middle of the
+width and provide our own when it makes sense.
+
+\startlinecorrection
+ \externalfigure[lm-7-anchor.png][width=.25\textwidth]
+\stoplinecorrection
+
+\stopsubject
+
+\startsubject[title=StixTwo]
+
+When trying to improve font metrics (aka tweaking) we sometimes take a look at
+the shapes in FontForge. So for instance when we noticed that the integral mid
+segment in StixTwo was too narrow we took that look. Then we also noticed that
+the glyph was positioned at the edge instead of in the middle but that the
+hinting was such that it ended up in the middle. Intrigued by this we looked into
+it in more detail and noticed that the \OPENTYPE\ and \TRUETYPE\ files show up
+quite different. So we fetching the source files from the git repository, and
+played with the build script.
+
+The starting point is a \TRUETYPE\ file that seems to provide all kind of tables,
+that are then adapted using a dedicated glyph name file (basically many verbose
+glyph names are replaced by (in the end sort of redundant) uni names as well as
+plenty small glif files (we didn't check if these are different from what is in
+the original ttf file). Intermediate files are generated and at some point auto
+hinting happens, using different tools for the two formats.
+
+At some point we figured out that the left side bearing in the head table was
+somehow interfering and more experiments (we used for instance Lucida Math as
+comparison) if became clear that the lsb bit in the head flags was the culprit.
+By (un)setting it we could let \FONTFORGE\ show the \OPENTYPE\ and \TRUETYPE\
+files in the same way of differently. We could also zero the lsb entries in the
+hmtx table, which sort of fixed it independent of the bit. For the record we
+show the effect here (this document is also a bit our archive).
+
+\startlinecorrection
+\startcombination[nx=3,ny=1]
+ {\externalfigure[StixTwo23AE-original.png][width=.25\textwidth]} {original otf}
+ {\externalfigure[StixTwo23AE-fixed.png] [width=.25\textwidth]} {fixed otf}
+ {\externalfigure[StixTwo23AE-ttf.png] [width=.25\textwidth]} {ttf}
+\stopcombination
+\stoplinecorrection
+
+The original variant:
+
+\starttyping
+<CharString name="uni23AE">
+125 21 -21 hstem
+301 102 vstem
+403 hmoveto
+650 -102 -650 vlineto
+endchar
+</CharString>
+\stoptyping
+
+The fixed version:
+
+\starttyping
+<CharString name="uni23AE">
+125 0 650 -629 -21 hstemhm
+301 102 hintmask 01100000
+403 0 rmoveto
+hintmask 10100000
+0 650 rlineto
+-102 0 rlineto
+0 -650 rlineto
+endchar
+</CharString>
+\stoptyping
+
+It was this character that we looked at because we use it in a demo, but actually
+many characters had this visual hinting side effect. So, one solution is to wipe
+the hints and let FontForge add new ones, but easier is to just use the
+\TRUETYPE\ files instead of the \OPENTYPE\ ones, either fixed or with hints
+removed,as in:
+
+\starttyping
+<CharString name="uni23AE">
+ 125 403 0 rmoveto
+ 0 650 rlineto
+ -102 0 rlineto
+ 0 -650 rlineto
+ endchar
+</CharString>
+\stoptyping
+
+This is the original \type {uni23A_E_.glif} file:
+
+\starttyping
+<?xml version='1.0' encoding='UTF-8'?>
+<glyph name="uni23AE" format="2">
+ <advance width="704"/>
+ <unicode hex="23AE"/>
+ <outline>
+ <contour>
+ <point x="403" y="0" type="line"/>
+ <point x="403" y="650" type="line"/>
+ <point x="301" y="650" type="line"/>
+ <point x="301" y="0" type="line"/>
+ </contour>
+ </outline>
+</glyph>
+\stoptyping
+
+In case one wonders why all this matters: occasionally we use the shape in
+\METAPOST\ and there we don't apply hinting, which means that we don't want to
+end up with the glyph positioned wrongly in the bounding box with hints moving
+them to the right spot. So that is why we now prefer the \TRUETYPE\ variant
+because then at least we can compare different programs visually. \footnote {In
+the FontForge preview rendering in the overview, hinting is also not applied so
+there glyphs are also positioned somewhat weird. In TypeTool3 the glyph doesn't
+show up at all when we enable outline fill so it makes an interesting puzzle.}
+
+\stopsubject
+
+\stopchapter
+
+% \startchapter[title=Left-overs]
+
+% "action",
+% "subsets",
+% "parameters",
+
+% "message",
+% "showinfo",
+% "setoptions",
+% "oldstylemath",
+% "fixoldschool",
+% "version",
+
+% \stopchapter
+
+\stoptext
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/mathml/envexamp.tex b/Master/texmf-dist/doc/context/sources/general/manuals/mathml/envexamp.tex
index 8a2b4e2df55..50a38fc0fb8 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/mathml/envexamp.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/mathml/envexamp.tex
@@ -1,3 +1,5 @@
+% language=us runpath=texruns:manuals/mathml
+
\startenvironment envexamp
% this is an old style. only slightly updated to mkiv
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/mathml/mmlexamp.tex b/Master/texmf-dist/doc/context/sources/general/manuals/mathml/mmlexamp.tex
index 0beb211ad8d..aee7d5a194f 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/mathml/mmlexamp.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/mathml/mmlexamp.tex
@@ -1,7 +1,7 @@
-% language=uk
+% language=us runpath=texruns:manuals/mathml
% author : Hans Hagen
-% copyright : PRAGMA ADE & ConTeXt Development Team
+% copyright : ConTeXt Development Team
% license : Creative Commons Attribution ShareAlike 4.0 International
% reference : pragma-ade.nl | contextgarden.net | texlive (related) distributions
% origin : the ConTeXt distribution
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/mathml/mmlprime.tex b/Master/texmf-dist/doc/context/sources/general/manuals/mathml/mmlprime.tex
index 811ba376b4e..9b9d3424d86 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/mathml/mmlprime.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/mathml/mmlprime.tex
@@ -1,7 +1,7 @@
-% language=uk
+% language=us runpath=texruns:manuals/mathml
% author : Hans Hagen
-% copyright : PRAGMA ADE & ConTeXt Development Team
+% copyright : ConTeXt Development Team
% license : Creative Commons Attribution ShareAlike 4.0 International
% reference : pragma-ade.nl | contextgarden.net | texlive (related) distributions
% origin : the ConTeXt distribution
@@ -17,6 +17,12 @@
% Group journal or otherwise. Thanks to the editors for corrections. Also thanks
% to users for testing, feedback and corrections.
+% The layout is made for the traditional lucida bright fonts. In the meantime we
+% use the opentype variant but it sometimes has different default shapes. So,
+% rendering has become less optimal. However, this is one of the oldest documents
+% that come with \CONTEXT, which has always supported \MATHML, so we keep it as it
+% is. The same is true for the style definition, which hasn't changed much.
+
% \setupbackend[export=yes]
\usemodule[abr-02,mathml,math-coverage,asciimath]
@@ -87,11 +93,13 @@
textcolor=darkred,
after={\blank[big]}]
-\unexpanded\def\SectionCommand#1#2%
- {\darkblue<--\enspace\ifconditional\headshownumber\enspace#1\quad\fi#2\enspace-->}
+\protected\def\SectionCommand#1#2%
+% {\darkblue<--\enspace\ifconditional\headshownumber#1\quad\fi#2\enspace-->}
+ {\darkblue<--\enspace\ifconditional\headshownumber#1\enspace\fi#2\enspace-->}
-\unexpanded\def\SubSectionCommand#1#2%
- {\darkblue<?\enspace\ifconditional\headshownumber#1\quad\fi#2\enspace ?>}
+\protected\def\SubSectionCommand#1#2%
+% {\darkblue<?\enspace\ifconditional\headshownumber#1\quad\fi#2\enspace ?>}
+ {\darkblue<?\space\ifconditional\headshownumber#1\enspace\fi#2\enspace ?>}
\setuplayout
[style=\hw]
@@ -600,17 +608,21 @@
local gsub = string.gsub
local mapping = {
[";"] = "{{\\darkblue\\string;}}",
- ["&"] = "{{\\ttsl\\darkblue\\string&}}", -- otherwise "et"
+ -- ["&"] = "{{\\ttx\\sl\\darkblue\\string&}}", -- too ugly
+ ["&"] = "{{\\darkblue\\string&}}", -- otherwise "et"
["/"] = "{{\\darkblue\\string/}}",
["<"] = "{{\\darkblue\\string<}}",
[">"] = "{{\\darkblue\\string>}}",
}
function document.filterxmltitlestuff(name)
- local data = io.loaddata(name) or ""
- data = gsub(data,"<math[^>]*>","<math>")
- data = gsub(data,"[%s ]+"," ")
- data = gsub(data,"(.)",mapping)
- context(data)
+-- local data = io.loaddata(name) or ""
+local data = io.loaddata(resolvers.findfile(name)) or ""
+ if data then
+ data = gsub(data,"<math[^>]*>","<math>")
+ data = gsub(data,"[%s ]+"," ")
+ data = gsub(data,"(.)",mapping)
+ context(data)
+ end
end
\stopluacode
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/mcommon.tex b/Master/texmf-dist/doc/context/sources/general/manuals/mcommon.tex
index 57ab24a8d97..fcb7c1b98d7 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/mcommon.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/mcommon.tex
@@ -1,7 +1,3 @@
-% content=tex
-%
-% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa
-
\startenvironment mcommon
% modules
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-backgrounds.tex b/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-backgrounds.tex
index 200620cae4c..f3135236db9 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-backgrounds.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-backgrounds.tex
@@ -1,6 +1,4 @@
-% language=uk
-%
-% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa
+% language=us runpath=texruns:manuals/metafun
\startcomponent metafun-backgrounds
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-backpage.tex b/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-backpage.tex
index 82931d756f3..23c158fc08a 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-backpage.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-backpage.tex
@@ -1,6 +1,4 @@
-% language=uk
-%
-% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa
+% language=us runpath=texruns:manuals/metafun
\doifmode{book}{\endinput}
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 479f396022b..3eeefee2256 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
@@ -1,6 +1,4 @@
-% language=uk
-%
-% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa
+% language=us runpath=texruns:manuals/metafun
\startcomponent metafun-basics
@@ -1953,7 +1951,7 @@ the point and rotates afterwards. Because each consecutive point on the path is
rotated an additional 90 degrees, we use the \METAPOST\ macro \type {hide} to
isolate the assignment. The \type {hide} command executes the hidden command and
afterwards continues as if it were never there. You must not confuse this with
-grouping, since the hidden commands are visible to its surroundings.
+grouping, since the hidden commands are visible to their surroundings.
\startbuffer[c]
def qq = q hide(q := q rotated 90) enddef ;
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-colofon-paper.tex b/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-colofon-paper.tex
index 1a611a3258d..62e83873956 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-colofon-paper.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-colofon-paper.tex
@@ -1,6 +1,4 @@
-% language=uk
-%
-% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa
+% language=us runpath=texruns:manuals/metafun
\startcomponent metafun-colofon-paper
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-colofon-screen.tex b/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-colofon-screen.tex
index 590c7725f84..c7707f960d2 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-colofon-screen.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-colofon-screen.tex
@@ -1,6 +1,4 @@
-% language=uk
-%
-% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa
+% language=us runpath=texruns:manuals/metafun
\startcomponent metafun-colofon-screen
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-colofon.tex b/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-colofon.tex
index b4c162a896d..701ad5355f1 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-colofon.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-colofon.tex
@@ -1,6 +1,4 @@
-% language=uk
-%
-% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa
+% language=us runpath=texruns:manuals/metafun
\startcomponent metafun-colofon
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-contents.tex b/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-contents.tex
index 0767a024810..2ff829f9dd6 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-contents.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-contents.tex
@@ -1,6 +1,4 @@
-% language=uk
-%
-% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa
+% language=us runpath=texruns:manuals/metafun
\startcomponent metafun-contents
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-conventions.tex b/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-conventions.tex
index 6a6072c562e..4c044a5cc06 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-conventions.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-conventions.tex
@@ -1,6 +1,4 @@
-% language=uk
-%
-% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa
+% language=us runpath=texruns:manuals/metafun
\startcomponent metafun-conventions
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-debugging.tex b/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-debugging.tex
index f8957b5d834..7f0c09f107f 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-debugging.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-debugging.tex
@@ -1,6 +1,4 @@
-% language=uk
-%
-% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa
+% language=us runpath=texruns:manuals/metafun
\startcomponent mfun-debugging
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-document.tex b/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-document.tex
index bb554085052..09884e88287 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-document.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-document.tex
@@ -1,6 +1,4 @@
-% language=uk
-%
-% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa
+% language=us runpath=texruns:manuals/metafun
\startcomponent metafun-document
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-effects.tex b/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-effects.tex
index 6c020acda90..b9d60e15b2b 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-effects.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-effects.tex
@@ -1,6 +1,4 @@
-% language=uk
-%
-% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa
+% language=us runpath=texruns:manuals/metafun
% graphic text takes 5 sec on 21
@@ -234,9 +232,12 @@ path p ; p := fullcircle scaled u shifted (u/4,0);
% fill p rotated 210 withcolor transparent("\MPvar{a}",.5,xgreen) ;
% fill p rotated 330 withcolor transparent("\MPvar{a}",.5,xblue) ;
-fill p rotated 90 withcolor (0,0,1,0) withtransparency("\MPvar{a}",.5) ;
-fill p rotated 210 withcolor (0,1,0) withtransparency("\MPvar{a}",.5) ;
-fill p rotated 330 withcolor (0,0,1) withtransparency("\MPvar{a}",.5) ;
+% fill p rotated 90 withcolor (0,0,1,0) withtransparency("\MPvar{a}",.5) ;
+% fill p rotated 210 withcolor (0,1,0) withtransparency("\MPvar{a}",.5) ;
+% fill p rotated 330 withcolor (0,0,1) withtransparency("\MPvar{a}",.5) ;
+fill p rotated 90 withcolor (0,0,1,0) withtransparency(\MPvar{b},.5) ;
+fill p rotated 210 withcolor (0,1,0) withtransparency(\MPvar{b},.5) ;
+fill p rotated 330 withcolor (0,0,1) withtransparency(\MPvar{b},.5) ;
\stopuseMPgraphic
\startplacefigure[location=here,reference=fig:transparencies,title={The 12 transparency alternatives by name.}]
@@ -246,22 +247,22 @@ fill p rotated 330 withcolor (0,0,1) withtransparency("\MPvar{a}",.5) ;
\setupcombination[nx=4,ny=4]
}
\startcombination
- {\useMPgraphic{test}{a=normal}} {\tttf normal}
- {\useMPgraphic{test}{a=multiply}} {\tttf multiply}
- {\useMPgraphic{test}{a=screen}} {\tttf screen}
- {\useMPgraphic{test}{a=overlay}} {\tttf overlay}
- {\useMPgraphic{test}{a=softlight}} {\tttf softlight}
- {\useMPgraphic{test}{a=hardlight}} {\tttf hardlight}
- {\useMPgraphic{test}{a=colordodge}} {\tttf colordodge}
- {\useMPgraphic{test}{a=colorburn}} {\tttf colorburn}
- {\useMPgraphic{test}{a=darken}} {\tttf darken}
- {\useMPgraphic{test}{a=lighten}} {\tttf lighten}
- {\useMPgraphic{test}{a=difference}} {\tttf difference}
- {\useMPgraphic{test}{a=exclusion}} {\tttf exclusion}
- {\useMPgraphic{test}{a=hue}} {\tttf hue}
- {\useMPgraphic{test}{a=saturation}} {\tttf saturation}
- {\useMPgraphic{test}{a=color}} {\tttf color}
- {\useMPgraphic{test}{a=luminosity}} {\tttf luminosity}
+ {\useMPgraphic{test}{b=1,a=normal}} {\tttf normal}
+ {\useMPgraphic{test}{b=2,a=multiply}} {\tttf multiply} % here the mu in multiply triggers lookahead in lmtx
+ {\useMPgraphic{test}{b=3,a=screen}} {\tttf screen}
+ {\useMPgraphic{test}{b=4,a=overlay}} {\tttf overlay}
+ {\useMPgraphic{test}{b=5,a=softlight}} {\tttf softlight}
+ {\useMPgraphic{test}{b=6,a=hardlight}} {\tttf hardlight}
+ {\useMPgraphic{test}{b=7,a=colordodge}} {\tttf colordodge}
+ {\useMPgraphic{test}{b=8,a=colorburn}} {\tttf colorburn}
+ {\useMPgraphic{test}{b=9,a=darken}} {\tttf darken}
+ {\useMPgraphic{test}{b=10,a=lighten}} {\tttf lighten}
+ {\useMPgraphic{test}{b=11,a=difference}} {\tttf difference}
+ {\useMPgraphic{test}{b=12,a=exclusion}} {\tttf exclusion}
+ {\useMPgraphic{test}{b=13,a=hue}} {\tttf hue}
+ {\useMPgraphic{test}{b=14,a=saturation}} {\tttf saturation}
+ {\useMPgraphic{test}{b=15,a=color}} {\tttf color}
+ {\useMPgraphic{test}{b=16,a=luminosity}} {\tttf luminosity}
\stopcombination
\stopplacefigure
@@ -317,9 +318,9 @@ Of course this also works well for \CMYK\ colors.
Gray scales work as well:
\startbuffer
-\definecolor[ta][s=.9,t=.7,a=11]
-\definecolor[tb][s=.7,t=.7,a=11]
-\definecolor[tc][s=.5,t=.7,a=11]
+\definecolor[tgraya][s=.9,t=.7,a=11]
+\definecolor[tgrayb][s=.7,t=.7,a=11]
+\definecolor[tgrayc][s=.5,t=.7,a=11]
\stopbuffer
\typebuffer \getbuffer
@@ -338,9 +339,9 @@ difference in fonts.
% \stopbuffer
\startbuffer
-draw textext("\color[ta]{\tf Hello}") scaled 5 ;
-draw textext("\color[tb]{\bf Hello}") scaled 5 ;
-draw textext("\color[tc]{\sl Hello}") scaled 5 ;
+draw textext("\color[tgraya]{\tf Hello}") scaled 5 ;
+draw textext("\color[tgrayb]{\bf Hello}") scaled 5 ;
+draw textext("\color[tgrayc]{\sl Hello}") scaled 5 ;
\stopbuffer
\typebuffer
@@ -1237,7 +1238,7 @@ definition.
\startbuffer
\startMPclip{head clip}
- w := \width ; h := \height ;
+ w := OverlayWidth ; h := OverlayHeight ;
clip currentpicture to
((0,h)--(w,h){down}..{left}(0,0)--cycle) ;
\stopMPclip
@@ -1305,7 +1306,7 @@ We can call up such a buffer as if it were an external figure. \in {Figure}
\startbuffer[a]
\startMPclip{text clip}
clip currentpicture to fullcircle shifted (.5,.5)
- xscaled \width yscaled \height ;
+ xscaled OverlayWidth yscaled OverlayHeight ;
\stopMPclip
\stopbuffer
@@ -1373,7 +1374,7 @@ in a similar way, using the predefined path \type {diamond}:
\starttyping
\startMPclip{diamond}
clip currentpicture to unitdiamond
- xscaled \width yscaled \height ;
+ xscaled OverlayWidth yscaled OverlayHeight ;
\stopMPclip
\stoptyping
@@ -1384,7 +1385,7 @@ with \CONTEXT.
\starttyping
\startMPclip{negellipse}
clip currentpicture to (unitcircle peepholed unitsquare)
- xscaled \width yscaled \height ;
+ xscaled OverlayWidth yscaled OverlayHeight ;
\stopMPclip
\stoptyping
@@ -2025,6 +2026,7 @@ suffix determines the number of arguments and rendering. The \type {r} suffix
reverses the order: the fill comes over the draw. There is a \type {p} suffix
that returns just the picture.
+
The next example demonstrates that you can combine \TEX's powerful line breaking
algorithm with \METAPOST's graphic capabilities.
@@ -2115,7 +2117,7 @@ width is half the size specified.
\startbuffer
draw outlinetext.b
- ("\mathematics{\left({{\sqrt{1+x}}\over{\sqrt{2+x^2}}}\right)}")
+ ("\mathematics{\left(\frac{\sqrt{1+x}}{\sqrt{2+x^2}}\right)}")
(withcolor .850white)
(withcolor .625red
dashed evenly scaled .1
@@ -2229,7 +2231,7 @@ and one with Dejavu (the Tufte quote).
\startcombination[1*4]
\bgroup
\def|#1|{-}%
- \definedfont[texgyrepagella-regular.otf*none]%
+ \definedfont[file:texgyrepagella-regular.otf*none]%
\startMPcode
draw outlinetext.b
("\framed[align=normal,width=max]{\input{zapf}}")
@@ -2239,7 +2241,7 @@ and one with Dejavu (the Tufte quote).
\egroup {pagella / no features}
\bgroup
\def|#1|{-}%
- \definedfont[texgyrepagella-regular.otf*default]%
+ \definedfont[file:texgyrepagella-regular.otf*default]%
\startMPcode
draw outlinetext.b
("\framed[align=normal,width=max]{\input{zapf}}")
@@ -2249,7 +2251,7 @@ and one with Dejavu (the Tufte quote).
\egroup {pagella / default features}
\bgroup
\def|#1|{-}%
- \definedfont[dejavuserif.ttf*none]%
+ \definedfont[file:dejavuserif.ttf*none]%
\startMPcode
draw outlinetext.b
("\framed[align=normal,width=max]{\input{tufte}}")
@@ -2259,7 +2261,7 @@ and one with Dejavu (the Tufte quote).
\egroup {dejavu serif / no features}
\bgroup
\def|#1|{-}%
- \definedfont[dejavuserif.ttf*default]%
+ \definedfont[file:dejavuserif.ttf*default]%
\startMPcode
draw outlinetext.b
("\framed[align=normal,width=max]{\input{tufte}}")
@@ -2310,7 +2312,7 @@ We start by defining the font:
script=hang,
language=kor]
-\definefont[KoreanFont][hanbatanglvt*korean-base]
+\definefont[KoreanFont][file:hanbatanglvt*korean-base]
\stopbuffer
\typebuffer \getbuffer
@@ -2319,52 +2321,52 @@ Next we define a macro that will draw the outline:
\startbuffer
\startMPdefinitions
- string KoreanColors[] ;
-
- KoreanColors[1] := "darkred" ;
- KoreanColors[2] := "darkgreen" ;
- KoreanColors[3] := "darkblue" ;
- KoreanColors[4] := "darkyellow" ;
- KoreanColors[5] := "darkgray" ;
-
- newinternal KoreanSplit ; KoreanSplit := -1 ;
- newinternal KoreanCode ; KoreanCode := -2 ;
- newinternal KoreanMode ; KoreanMode := KoreanSplit ;
-
- def KoreanOutline(expr txt) =
- picture p ; p := outlinetext.p(txt) ;
- numeric n ; n := 0 ;
- string old, new ; old := "" ;
- for i within p :
- if KoreanMode == KoreanSplit :
- n := n + 1 ;
- elseif KoreanMode == KoreanCode :
- new := prescriptpart i ;
- if new <> old :
- old := new ;
- n := n + 1 ;
- fi ;
- else :
- n := KoreanMode ;
+string KoreanColors[] ;
+
+KoreanColors[1] := "darkred" ;
+KoreanColors[2] := "darkgreen" ;
+KoreanColors[3] := "darkblue" ;
+KoreanColors[4] := "darkyellow" ;
+KoreanColors[5] := "darkgray" ;
+
+newinternal KoreanSplit ; KoreanSplit := -1 ;
+newinternal KoreanCode ; KoreanCode := -2 ;
+newinternal KoreanMode ; KoreanMode := KoreanSplit ;
+
+def KoreanOutline(expr txt) =
+ picture p ; p := outlinetext.p(txt) ;
+ numeric n ; n := 0 ;
+ string old, new ; old := "" ;
+ for i within p :
+ if KoreanMode == KoreanSplit :
+ n := n + 1 ;
+ elseif KoreanMode == KoreanCode :
+ new := prescriptpart i ;
+ if new <> old :
+ old := new ;
+ n := n + 1 ;
fi ;
- if unknown KoreanColors[n] :
- n := 1 ;
- fi ;
- draw pathpart i
- withpen pencircle scaled 1/10
- withcolor KoreanColors[n] ;
- endfor ;
- enddef ;
-
- def KoreanTest(expr txt) =
- image (
- KoreanMode := KoreanSplit ; KoreanOutline(txt) ;
- currentpicture := currentpicture shifted (- xpart urcorner currentpicture, 0);
- KoreanMode := KoreanCode ; KoreanOutline(txt) ;
- currentpicture := currentpicture shifted (- xpart urcorner currentpicture, 0);
- KoreanMode := 3 ; KoreanOutline(txt) ;
- )
- enddef ;
+ else :
+ n := KoreanMode ;
+ fi ;
+ if unknown KoreanColors[n] :
+ n := 1 ;
+ fi ;
+ draw pathpart i
+ withpen pencircle scaled 1/10
+ withcolor KoreanColors[n] ;
+ endfor ;
+enddef ;
+
+def KoreanTest(expr txt) =
+ image (
+ KoreanMode := KoreanSplit ; KoreanOutline(txt) ;
+ currentpicture := currentpicture shifted (- xpart urcorner currentpicture, 0);
+ KoreanMode := KoreanCode ; KoreanOutline(txt) ;
+ currentpicture := currentpicture shifted (- xpart urcorner currentpicture, 0);
+ KoreanMode := 3 ; KoreanOutline(txt) ;
+ )
+enddef ;
\stopMPdefinitions
\stopbuffer
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-embedding.tex b/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-embedding.tex
index 10383fa3afe..f2dc097aba7 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-embedding.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-embedding.tex
@@ -1,6 +1,4 @@
-% language=uk
-%
-% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa
+% language=us runpath=texruns:manuals/metafun
\startcomponent metafun-embedding
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-environment-layout.tex b/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-environment-layout.tex
index 8a30aad7c68..b41cdf7719a 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-environment-layout.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-environment-layout.tex
@@ -1,3 +1,5 @@
+% language=us runpath=texruns:manuals/metafun
+
\startenvironment metafun-environment-layout
\setupsystem
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-environment-samples.tex b/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-environment-samples.tex
index 5991a61d521..e9addbc5df9 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-environment-samples.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-environment-samples.tex
@@ -1,3 +1,5 @@
+% language=us runpath=texruns:manuals/metafun
+
\startenvironment metafun-environment-sample
\startuseMPgraphic{sample setup}
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-environment-screen.tex b/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-environment-screen.tex
index afeea700848..5f0fb4bdffb 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-environment-screen.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-environment-screen.tex
@@ -1,6 +1,4 @@
-% language=uk
-%
-% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa
+% language=us runpath=texruns:manuals/metafun
\startenvironment mfun-environment-screen
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-environment.tex b/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-environment.tex
index 57875008dbe..07b50bdcd8e 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-environment.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-environment.tex
@@ -1,6 +1,4 @@
-% language=uk
-%
-% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa
+% language=us runpath=texruns:manuals/metafun
\startenvironment metafun-environment
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-examples.tex b/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-examples.tex
index 5549a3bdd85..a0721103e65 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-examples.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-examples.tex
@@ -1,6 +1,4 @@
-% language=uk
-%
-% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa
+% language=us runpath=texruns:manuals/metafun
\startcomponent metafun-examples
@@ -3431,7 +3429,7 @@ We demonstrate the differences with an example. The result can be seen in
\startbuffer
\startcombination
{\startMPcode
- picture first, second ;
+ picture first, second ;
first := outlinetext.p("N") ; first := first scaled 10 ;
second := outlinetext.p("T") ; second := second scaled 10 ;
second := second rotatedaround(center second, 5) shifted (1,-1) ;
@@ -3517,6 +3515,43 @@ Again we demonstrate the differences with some examples. The result can be seen
\stopsection
+\startsection[title=Hidden beauty]
+
+\index {hiding}
+
+The \type {hide} wraps its (text) argument in a group in such a way that whatever
+happens is not interfering with its surrounding. This is comparable with what
+\type {vardef} does except that there is nothing of value produced.
+
+\startbuffer
+def mfun_curve_to_a = hide(let connect = mfun_curve_to_b ;) enddef ; def mfun_curve_to_b = .. enddef ;
+def mfun_line_to_a = hide(let connect = mfun_line_to_b ;) enddef ; def mfun_line_to_b = -- enddef ;
+
+def forcurve = hide(let connect = mfun_curve_to_a ;) for enddef;
+def forline = hide(let connect = mfun_line_to_a ;) for enddef;
+
+draw image (
+ draw forline i = 0 upto 25 : connect(i,sin(i)) endfor
+ withcolor darkblue
+ withtransparency (1,.5) ;
+ draw forcurve i = 0 upto 25 : connect(i,sin(i)) endfor
+ withcolor darkyellow
+ withtransparency (1,.5) ;
+) xysized (TextWidth, 3cm) ;
+\stopbuffer
+
+\typebuffer
+
+In this example we hide the assignment in the loop and not only define the \type
+{connect} macro but also adept it after its first expansion. Usage is shown \in
+{in } [fig:hide].
+
+\startplacefigure[title=Hiding assignments in a loop,reference=fig:hide]
+ \processMPbuffer
+\stopplacefigure
+
+\stopsection
+
\stopchapter
\stopcomponent
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-functions.tex b/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-functions.tex
index 78012740830..30ca6b0f73a 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-functions.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-functions.tex
@@ -1,6 +1,4 @@
-% language=uk
-%
-% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa
+% language=us runpath=texruns:manuals/metafun
\startcomponent metafun-functions
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-gadgets.tex b/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-gadgets.tex
index 014bd66e81c..6c48a923f8d 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-gadgets.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-gadgets.tex
@@ -1,6 +1,4 @@
-% language=uk
-%
-% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa
+% language=us runpath=texruns:manuals/metafun
\startcomponent metafun-gadgets
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-graphics.tex b/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-graphics.tex
index 79c5df0df0e..988d672ed5b 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-graphics.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-graphics.tex
@@ -1,6 +1,4 @@
-% language=uk
-%
-% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa
+% language=us runpath=texruns:manuals/metafun
\startcomponent metafun-graphics
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-index.tex b/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-index.tex
index 8be313d85d4..5290b582c22 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-index.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-index.tex
@@ -1,6 +1,4 @@
-% language=uk
-%
-% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa
+% language=us runpath=texruns:manuals/metafun
\startcomponent metafun-index
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-introduction.tex b/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-introduction.tex
index e2c33f6f3e8..fb260e0f5f9 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-introduction.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-introduction.tex
@@ -1,6 +1,4 @@
-% language=uk
-%
-% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa
+% language=us runpath=texruns:manuals/metafun
\startcomponent metafun-introduction
@@ -97,6 +95,17 @@ with the latest version; thanks to Otared Kavian for keeping an eye on that and
posting me possible issues. The real new features are part of what is to become
\LUAMETAFUN, but for that we have a separate manual.
+In 2022 Mikael Sundqvist and I spent a lot of time on improving math in both
+\LUAMETATEX\ and \CONTEXT\ \LMTX, which is now the main version. Because we're both
+\METAPOST\ fans we let ourselves being sidetracked to also explore new possibilities
+in the library. Some of the macros that evolved from that made it into \METAFUN\
+which is why we also discuss some here. Be aware of the fact that we do some things
+different in \LMTX\ than in \MKIV, for instance we moved to colors being specified
+as strings (references to colors defined in \CONTEXT). There are also some new
+features that are unique to the library in \LUAMETATEX, like \type {&&}, \type
+{&&&}, \type {&&&&} and \type {nocycle}. THis means that not everything discussed
+here works in \MKIV\ too.
+
\blank[big,samepage]
\startlines
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-layout.tex b/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-layout.tex
index e81800bb43a..4b6e1f0b19b 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-layout.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-layout.tex
@@ -1,6 +1,4 @@
-% language=uk
-%
-% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa
+% language=us runpath=texruns:manuals/metafun
\startcomponent metafun-layout
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-lua.tex b/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-lua.tex
index e445cef53f9..a61fa43e5f9 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-lua.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-lua.tex
@@ -1,6 +1,4 @@
-% language=uk
-%
-% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa
+% language=us runpath=texruns:manuals/metafun
% this is an extension of about-lua
@@ -1650,64 +1648,6 @@ but also nicely abstract ones.
% p = mp.getpath(name)
% \stoptyping
%
-% A is path a table of tables that have six values: the coordinates and the
-% pre- and postcontrol. You can manipulate this table and feed it back into
-% \METAPOST.
-%
-% \startlinecorrection
-% \startMPcode
-% numeric n ; n := lua.mp.newhash() ;
-%
-% for i=1 upto 3 :
-% lua.mp.tohash(n,i) ;
-% endfor ;
-%
-% fill fullcircle scaled 10mm withcolor
-% if lua.mp.inhash(n,3) : green else : red fi ;
-%
-% fill fullcircle scaled 5mm withcolor
-% if lua.mp.inhash(n,4) : green else : red fi ;
-%
-% lua.mp.disposehash(n)
-% \stopMPcode
-% \stoplinecorrection
-%
-% You can also store values with keys and access them later:
-%
-% \startlinecorrection
-% \startMPcode
-% numeric n ; n := lua.mp.newhash() ;
-%
-% for i=1 upto 3 :
-% lua.mp.tohash(n,i,decimal sqrt(i)) ;
-% endfor ;
-%
-% draw textext(lua.mp.fromhash(n,3))
-% ysized 1cm
-% withcolor blue ;
-%
-% lua.mp.disposehash(n)
-% \stopMPcode
-% \stoplinecorrection
-%
-% You can also name your own hash:
-%
-% \startlinecorrection
-% \startMPcode
-% lua.mp.newhash("foo") ;
-%
-% for i=1 upto 3 :
-% lua.mp.tohash("foo",i,decimal sqrt(i)) ;
-% endfor ;
-%
-% draw textext(lua.mp.fromhash("foo",2))
-% ysized 1cm
-% withcolor green ;
-%
-% lua.mp.disposehash("foo")
-% \stopMPcode
-% \stoplinecorrection
-%
% Although it might look like \METAPOST\ supports arrays the reality is that it
% doesn't really. There is a concept of suffixes but internally these are just a
% way to compose macros. The following test is one that is used in one of the
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-macros.tex b/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-macros.tex
index 969e7d1b169..bcbb292406f 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-macros.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-macros.tex
@@ -1,6 +1,4 @@
-% language=uk
-%
-% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa
+% language=us runpath=texruns:manuals/metafun
\startcomponent metafun-macros
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-positioning.tex b/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-positioning.tex
index 5a3b1ece08a..448dcd9664d 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-positioning.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-positioning.tex
@@ -1,6 +1,4 @@
-% language=uk
-%
-% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa
+% language=us runpath=texruns:manuals/metafun
\startcomponent metafun-positioning
@@ -63,7 +61,7 @@ macro package reading this chapter only makes sense when you use \CONTEXT.
save pa, pb, pm, pab, na, nb, sa, sb ;
path pa, pb, pm, pab ; numeric na, nb ; string sa, sb ;
% the tags
- sa := texstr("from") ;
+ sa := texstr("from") ; % MPvars
sb := texstr("to") ;
% we need to check page crossing so we fetch the page numbers
na := positionpage(sa) ;
@@ -136,6 +134,7 @@ macro package reading this chapter only makes sense when you use \CONTEXT.
\startbuffer[box:1:also]
\startMPpositiongraphic{mpos:box}{fillcolor,linecolor,linewidth}
path box ; box := positionbox(texstr("self")) ;
+% path box ; box := positionbox("\MPvar{self}") ;
box := box enlarged texvar("filloffset") ;
fill box
withcolor texvar("fillcolor") ;
@@ -353,6 +352,7 @@ other tricks with positioning.
\startbuffer[g-circle]
\startMPpositiongraphic{mypos:circle}
path p ; p := positionbox(texstr("self")) ;
+% path p ; p := positionbox("\MPvar{self}") ;
p := fullcircle xsized (bbwidth(p)+4pt) shifted center p ;
pickup pencircle scaled 1pt ;
fill p withcolor .800white ;
@@ -364,8 +364,8 @@ other tricks with positioning.
\startbuffer[g-line]
\startMPpositiongraphic{mypos:line}
path pa, pb, pab ; numeric na, nb ; string ta, tb ;
- ta := texstr("from") ;
- tb := texstr("to") ;
+ ta := texstr("from") ; % "\MPvar{from}"
+ tb := texstr("to") ; % "\MPvar{to}"
na := positionpage(ta) ;
nb := positionpage(tb) ;
pa := positionbox(ta) ;
@@ -545,6 +545,7 @@ saw in the graphic:
\starttyping
path p ; p := positionbox(texstr("self")) ;
+% path p ; p := positionbox("\MPvar{self}") ;
\stoptyping
\type {texstr("self")} will return the current position, which, fed to \type
@@ -808,6 +809,8 @@ desktop.
\typebuffer
+\page
+
\startbuffer[demo]
\startbuffer
\setlayer [DemoLayer]
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-reference.tex b/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-reference.tex
index bc59218b0cc..947610323c4 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-reference.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-reference.tex
@@ -1,6 +1,4 @@
-% language=uk
-%
-% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa
+% language=us runpath=texruns:manuals/metafun
\startcomponent metafun-reference
@@ -472,6 +470,7 @@ defineshade cshade withshademethod "circular" ;
\ShowSampleII {mp} {dashed oddly} {dashed oddly}
\ShowSampleII {mp} {dashpattern} {dashed dashpattern (on .1 off .2 on .3 off .4)}
\ShowSampleII {mp} {undashed} {dashed evenly undashed}
+\ShowSampleII {fm} {withdashes pair} {withdashes (.1,.2)}
\ShowSampleJ {mm} {pencircle transform} {pencircle}
\ShowSampleJ {mm} {pensquare transform} {pensquare}
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-sneaky.tex b/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-sneaky.tex
index 56bf5d4d61e..a1df9afa308 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-sneaky.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-sneaky.tex
@@ -1,6 +1,4 @@
-% language=uk
-%
-% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa
+% language=us runpath=texruns:manuals/metafun
\startcomponent metafun-conventions
@@ -159,9 +157,12 @@ The result is predictable:
Of course there is also a \type {cld} approach possible:
+% context.startMPpage { offset = "10pt" }
+% context.stopMPpage()
+
\startbuffer
\startluacode
- context.startMPcode() -- context.startMPpage { offset = "10pt" }
+ context.startMPcode()
for i=0,100,20 do
context ( [[draw fullcircle scaled (%s * cm)
withcolor "darkmagenta" withpen pencircle scaled 1cm ;]], i)
@@ -170,7 +171,7 @@ Of course there is also a \type {cld} approach possible:
context ( [[draw fullcircle scaled (%s * cm)
withcolor "darkcyan" withpen pencircle scaled 1cm ;]], i)
end
- context.stopMPcode() -- context.stoppage()
+ context.stopMPcode()
\stopluacode
\stopbuffer
@@ -186,8 +187,6 @@ All these methods are rather efficient because all happens in memory and without
intermediate runs. It is this kind of features that the tight integration of \TEX,
\METAPOST\ and \LUA\ make possible.
-\stoptext
-
\stopsection
\stopchapter
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-styles.tex b/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-styles.tex
index 6de9a54daa2..1b0d759821f 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-styles.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-styles.tex
@@ -1,6 +1,4 @@
-% language=uk
-%
-% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa
+% language=us runpath=texruns:manuals/metafun
\startcomponent metafun-styles
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-syntax.tex b/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-syntax.tex
index 9407b1dd0e4..840204ffe53 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-syntax.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-syntax.tex
@@ -1,6 +1,4 @@
-% language=uk
-%
-% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa
+% language=us runpath=texruns:manuals/metafun
% eoclip: no postscript possible yet
%
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-text-lmtx.tex b/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-text-lmtx.tex
index abdca3c3ad0..d6fb2bc23d3 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-text-lmtx.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-text-lmtx.tex
@@ -1,6 +1,4 @@
-% language=uk
-%
-% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa
+% language=us runpath=texruns:manuals/metafun
\startcomponent metafun-text
@@ -1514,6 +1512,75 @@ The text and graphics come together in a framed text:
\stopsection
+\startsection[title=Hashes]
+
+\index {hashes}
+
+We can store data in a hash and access it later. Storage happens efficiently at the
+\LUA\ end.
+
+\startbuffer
+\startMPcode
+ tohash("foo","bar","gnu") ;
+ tohash("foo","rab","ung") ;
+ fill fullcircle scaled 1cm withcolor "lightgray" ;
+ draw textext(fromhash("foo","bar")) ;
+ draw textext(fromhash("foo","rab")) rotated 90 ;
+\stopMPcode
+\stopbuffer
+
+\typebuffer \startlinecorrection \getbuffer \stoplinecorrection
+
+With \type {newhash("foo")} we get back an index but this macro is only needed in
+\MKIV\ where. With \type {disposehash("foo")} a hash get wiped.
+
+\startbuffer
+\startMPcode
+ tohash(4,"bar","gnu") ;
+ tohash(4,"rab","ung") ;
+ fill fullcircle scaled 1cm withcolor "lightgray" ;
+ draw textext(fromhash(4,"bar")) ;
+ draw textext(fromhash(4,"rab")) rotated 90 ;
+\stopMPcode
+\stopbuffer
+
+\typebuffer \startlinecorrection \getbuffer \stoplinecorrection
+
+You can also used an indexed hash:
+
+\startbuffer
+\startMPcode
+ tohash("foo",1,"gnu") ;
+ tohash("foo",2,"ung") ;
+ fill fullcircle scaled 1cm withcolor "lightgray" ;
+ for i=1 upto 3 :
+ if inhash("foo",i) :
+ draw textext(fromhash("foo",i))
+ rotated ((i-1) * 90) ;
+ fi ;
+ endfor ;
+\stopMPcode
+\stopbuffer
+
+\typebuffer \startlinecorrection \getbuffer \stoplinecorrection
+
+And even booleans can be used as index:
+
+\startbuffer
+\startMPcode
+ tohash("foo",false,"gnu") ;
+ tohash("foo",true,"ung") ;
+ fill fullcircle scaled 1cm withcolor "lightgray" ;
+ draw textext(fromhash("foo",false)) ;
+ draw textext(fromhash("foo",true)) rotated 90 ;
+\stopMPcode
+\stopbuffer
+
+\typebuffer \startlinecorrection \getbuffer \stoplinecorrection
+
+
+\stopsection
+
\stopchapter
\stopcomponent
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-text.tex b/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-text.tex
index 8229e35db46..135fe7e3504 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-text.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-text.tex
@@ -1,6 +1,4 @@
-% engine=luatex language=uk
-%
-% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa
+% language=us runpath=texruns:manuals/metafun
\startcomponent metafun-text
@@ -177,7 +175,7 @@ You may consider coloring the dots to be an exercise in clipping.
\resetMPenvironment
An environment can be reset with \typ {\resetMPenvironment} or by passing \type
-{reset} to \typ {\startMPenvironment}.
+{reset} as first argument:
\starttyping
\startMPenvironment[reset]
@@ -265,8 +263,8 @@ width in an array (\type {len}). The number of characters is stored in~\type {n}
In a few paragraphs we will see why the other arrays are needed.
While defining the graphic, we need \TEX\ to do some calculations. Therefore, we
-will use \type {\startMPdrawing} to stepwise construct the definition. The basic
-pattern we will follow is:
+will use \typ {\startMPdrawing ... \stopMPdrawing} to stepwise construct the
+definition. The basic pattern we will follow is:
\starttyping
\resetMPdrawing
@@ -695,18 +693,18 @@ In the examples, the text is typeset along the path with:
\typebuffer[toks]
-\startlinecorrection[blank]
-\getbuffer[toks]
-\stoplinecorrection
+% \startlinecorrection[blank]
+% \getbuffer[toks]
+% \stoplinecorrection
-Since we did not set a path, a dummy path is used. We can provide a path by
-(re)defining the graphic \type {followtokens}.
+% Since we did not set a path, a dummy path is used. We can provide a path by
+% (re)defining the graphic \type {followtokens}.
-\startbuffer[trac]
-\startMPinclusions
- boolean TraceRot ; TraceRot := true ;
-\stopMPinclusions
-\stopbuffer
+% \startbuffer[trac]
+% \startMPinclusions
+% boolean TraceRot ; TraceRot := true ;
+% \stopMPinclusions
+% \stopbuffer
\startbuffer[draw]
\startuseMPgraphic{followtokens}
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-titlepage-paper.tex b/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-titlepage-paper.tex
index 558e3b798a2..46df6905957 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-titlepage-paper.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-titlepage-paper.tex
@@ -1,6 +1,4 @@
-% language=uk
-%
-% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa
+% language=us runpath=texruns:manuals/metafun
\doifmode{book}{\endinput}
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-titlepage-screen.tex b/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-titlepage-screen.tex
index 6350bdbda7f..b39fa510d96 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-titlepage-screen.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-titlepage-screen.tex
@@ -1,6 +1,4 @@
-% language=uk
-%
-% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa
+% language=us
\startcomponent metafun-titlepage-screen
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-welcome.tex b/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-welcome.tex
index 725d03756c4..90ceab73034 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-welcome.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun-welcome.tex
@@ -1,6 +1,4 @@
-% language=uk
-%
-% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa
+% language=us
\startcomponent metafun-welcome
@@ -2183,6 +2181,56 @@ The macro \type {drawoptions} provides you a way to set the default attributes.
drawoptions(dashed evenly withcolor red) ;
\stoptyping
+Dashes are pretty much bound to the backend in the sense that like line width
+they are a property that the \POSTSCRIPT\ (or actually nowadays the \PDF)
+interpreter handles. There is not that much cleverness involved at the \METAPOST\
+end. Take these examples:
+
+\startbuffer
+ pickup pencircle scaled 2mm ; path p ;
+
+ p := (0,0) {dir 25} .. (5cm,0) ;
+ draw p withcolor darkyellow ;
+ draw p dashed dashpattern (on 4mm off 3mm) withcolor darkblue ;
+ drawpoints point 0 of p withcolor white ;
+
+ p := ((0,0) {dir 70} .. {up} (5cm,0) .. cycle) yshifted -1cm ;
+ draw p withcolor darkyellow ;
+ draw p dashed dashpattern (on 4mm off 3mm) withcolor darkblue ;
+ drawpoints point 0 of p withcolor white ;
+\stopbuffer
+
+\typebuffer[a]
+
+\startlinecorrection[blank]
+\processMPbuffer
+\stoplinecorrection
+
+In both cases the dash is not evenly spread which for the line results in
+different begin and end rendering while the closed shape gets some weird looking
+connection. The next variant uses the \type {withdashes} macro that adapts the
+dashes to fit nicely to the path.
+
+\startbuffer[a]
+ pickup pencircle scaled 2mm ; path p ;
+
+ p := (0,0) {dir 25} .. (5cm,0) ;
+ draw p withcolor darkyellow ;
+ draw p withdashes (4mm,3mm) withcolor darkblue ;
+ drawpoints point 0 of p withcolor white ;
+
+ p := ((0,0) {dir 70} .. {up} (5cm,0) .. cycle) yshifted -1cm ;
+ draw p withcolor darkyellow ;
+ draw p withdashes (4mm,3mm) withcolor darkblue ;
+ drawpoints point 0 of p withcolor white ;
+\stopbuffer
+
+\typebuffer
+
+\startlinecorrection[blank]
+\processMPbuffer
+\stoplinecorrection
+
\stopsection
\startsection[reference=sec:text,title={Text}]
@@ -3166,7 +3214,7 @@ following line:
\startbuffer[b]
redraw currentpicture withpen pencircle scaled 2pt ;
-draw boundingbox currenpicture withpen pencircle scaled .5mm ;
+draw boundingbox currentpicture withpen pencircle scaled .5mm ;
\stopbuffer
\typebuffer[b]
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun.tex b/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun.tex
index 6739b1ed537..0e737d7bde4 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/metafun/metafun.tex
@@ -1,7 +1,7 @@
-% language=uk macros=mkvi
+% language=us runpath=texruns:manuals/metafun
% author : Hans Hagen
-% copyright : PRAGMA ADE & ConTeXt Development Team
+% copyright : ConTeXt Development Team
% license : Creative Commons Attribution ShareAlike 4.0 International
% reference : pragma-ade.nl | contextgarden.net | texlive (related) distributions
% origin : the ConTeXt distribution
@@ -32,10 +32,17 @@
% comment : Before I started updating the manual to lmtx (luametafun) I made sure that it
% processed okay in the february 2021 version of lmtx. The runtime for 448 pages
% (which is 20 more than the previous test) is some 16.5 seconds (just below 16
-% with compact fonts). So we can safely conclude that we're not worse off with
+% with compact fonts). So we can safely conclude that we're not worse of with
% respect to performance. (I use the same machine.)
-
-% \enableexperiments[fonts.compact]
+%
+% comment : June 31 2020, in the process of checking manuals with the runpath feature, the
+% manual has 414 (some mkii and mkiv stuff has been removed) pages and processing
+% takes 14.2 seconds (13.7 with compact fonts). With about 29 pps for the removed
+% pages we then come to about 15.5 seconds so again we gained some (which is what
+% I expect with the more efficient \LUA|-|\METAPOST\ interfacing). It also means
+% that \LUAMETATEX|-|\LMTX\ is now comparable with \LUAJITTEX|-|\MKIV.
+
+\enableexperiments[fonts.compact]
% \enablemode[optional]
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/metafun/mfun-700.tex b/Master/texmf-dist/doc/context/sources/general/manuals/metafun/mfun-700.tex
index e393a34f336..78e013447e8 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/metafun/mfun-700.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/metafun/mfun-700.tex
@@ -1,6 +1,4 @@
-% language=uk
-%
-% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa
+% language=us runpath=texruns:manuals/metafun
\starttext
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/metafun/mfun-771.tex b/Master/texmf-dist/doc/context/sources/general/manuals/metafun/mfun-771.tex
index 460c16f2a43..4466a507cea 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/metafun/mfun-771.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/metafun/mfun-771.tex
@@ -1,6 +1,4 @@
-% language=uk
-%
-% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa
+% language=us runpath=texruns:manuals/metafun
\usemodule[present-organic]
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/metafun/mfun-772.tex b/Master/texmf-dist/doc/context/sources/general/manuals/metafun/mfun-772.tex
index 99dec15516d..8185aea822a 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/metafun/mfun-772.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/metafun/mfun-772.tex
@@ -1,6 +1,4 @@
-% language=uk
-%
-% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa
+% language=us runpath=texruns:manuals/metafun
\usemodule[present-organic]
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/metafun/mfun-773.tex b/Master/texmf-dist/doc/context/sources/general/manuals/metafun/mfun-773.tex
index daefcfe6656..e6f3e93e0a9 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/metafun/mfun-773.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/metafun/mfun-773.tex
@@ -1,6 +1,4 @@
-% language=uk
-%
-% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa
+% language=us runpath=texruns:manuals/metafun
\usemodule[present-organic]
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/metafun/mfun-774.tex b/Master/texmf-dist/doc/context/sources/general/manuals/metafun/mfun-774.tex
index 725d1199b4f..95b8e9e5efb 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/metafun/mfun-774.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/metafun/mfun-774.tex
@@ -1,6 +1,4 @@
-% language=uk
-%
-% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa
+% language=us runpath=texruns:manuals/metafun
\usemodule[present-organic]
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/metafun/mfun-775.tex b/Master/texmf-dist/doc/context/sources/general/manuals/metafun/mfun-775.tex
index e9d2b85a706..9e569949efd 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/metafun/mfun-775.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/metafun/mfun-775.tex
@@ -1,6 +1,4 @@
-% language=uk
-%
-% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa
+% language=us runpath=texruns:manuals/metafun
\usemodule[present-organic]
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/metafun/mfun-776.tex b/Master/texmf-dist/doc/context/sources/general/manuals/metafun/mfun-776.tex
index 82b5c18dd24..7e8db38b289 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/metafun/mfun-776.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/metafun/mfun-776.tex
@@ -1,6 +1,4 @@
-% language=uk
-%
-% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa
+% language=us runpath=texruns:manuals/metafun
\usemodule[present-organic]
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/metafun/mfun-800.tex b/Master/texmf-dist/doc/context/sources/general/manuals/metafun/mfun-800.tex
index aa0c1260f70..bd0e5c7789f 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/metafun/mfun-800.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/metafun/mfun-800.tex
@@ -1,6 +1,4 @@
-% language=uk
-%
-% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa
+% language=us runpath=texruns:manuals/metafun
\setupMPpage
[offset=1pt,
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/metafun/mfun-900.tex b/Master/texmf-dist/doc/context/sources/general/manuals/metafun/mfun-900.tex
index c295ec90831..a6df0e45b22 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/metafun/mfun-900.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/metafun/mfun-900.tex
@@ -1,6 +1,4 @@
-% language=uk
-%
-% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa
+% language=us runpath=texruns:manuals/metafun
\startcomponent mfun-900
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/metafun/mfun-901.tex b/Master/texmf-dist/doc/context/sources/general/manuals/metafun/mfun-901.tex
index 23adf77b47f..4ed33311452 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/metafun/mfun-901.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/metafun/mfun-901.tex
@@ -1,6 +1,4 @@
-% language=uk
-%
-% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa
+% language=us runpath=texruns:manuals/metafun
\startcomponent mfun-901
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/metafun/mfun-902.tex b/Master/texmf-dist/doc/context/sources/general/manuals/metafun/mfun-902.tex
index 7c4fed73ea1..61753039203 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/metafun/mfun-902.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/metafun/mfun-902.tex
@@ -1,6 +1,4 @@
-% language=uk
-%
-% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa
+% language=us runpath=texruns:manuals/metafun
\startcomponent mfun-902
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-arabic.tex b/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-arabic.tex
index a9f9e52d96a..c99a58ad524 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-arabic.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-arabic.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
\startcomponent mk-arabic
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-breakingapart.tex b/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-breakingapart.tex
index 7bb74fa2a84..618fda99ec2 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-breakingapart.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-breakingapart.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
\startcomponent mk-breakingapart
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-calcmath.tex b/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-calcmath.tex
index 71673118294..225e0d9d5ca 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-calcmath.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-calcmath.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
\startcomponent mk-calcmath
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-cjk.tex b/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-cjk.tex
index dfe17a29c58..ead00e7f9f8 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-cjk.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-cjk.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
\usemodule[fnt-24]
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-code.tex b/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-code.tex
index e150531ebaf..268c55851b0 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-code.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-code.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
\startcomponent mk-code
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-colors.tex b/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-colors.tex
index 0d12c976e8d..2c7c64b9f51 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-colors.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-colors.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
\startcomponent mk-colors
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-contents.tex b/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-contents.tex
index cc5eac2d9e2..89bf5e0ad7b 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-contents.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-contents.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
\startcomponent mk-contents
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-dirtytricks.tex b/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-dirtytricks.tex
index 30f9ff648fd..5fc08d319fd 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-dirtytricks.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-dirtytricks.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
\startcomponent mk-dirtytricks
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-environment.tex b/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-environment.tex
index bcbfa085123..c38353d8e2a 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-environment.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-environment.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
\startenvironment mk-environment
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-fallback.tex b/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-fallback.tex
index 5ded10b72a4..473252f18db 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-fallback.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-fallback.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
\startcomponent mk-fallback
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-fonts.tex b/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-fonts.tex
index b5e945923a4..1c9c45093de 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-fonts.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-fonts.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
\usemodule[virtual]
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-goingbeta.tex b/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-goingbeta.tex
index 9937a373dc2..02ea4c5fb19 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-goingbeta.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-goingbeta.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
\startcomponent mk-goingbeta
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-goingutf.tex b/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-goingutf.tex
index 1d81cc999ce..c525b0040f9 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-goingutf.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-goingutf.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
\startcomponent mk-gointutf
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-halfway.tex b/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-halfway.tex
index badb5d42836..4589dab54a9 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-halfway.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-halfway.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
\environment mk-environment
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-iitoiv.tex b/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-iitoiv.tex
index 276693704d1..cf832ca4445 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-iitoiv.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-iitoiv.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
\startcomponent mk-iitoiv
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-initialization.tex b/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-initialization.tex
index 1b2fd4704f7..bbdc323d8ba 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-initialization.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-initialization.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
\startcomponent mk-initialization
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-introduction.tex b/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-introduction.tex
index c9d1e129aeb..774aa2fc785 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-introduction.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-introduction.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
\startcomponent introduction
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-itworks.tex b/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-itworks.tex
index 0a9d5fce8cf..41ec9760579 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-itworks.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-itworks.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
\environment mk-environment
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-last.tex b/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-last.tex
index b2d3dc51926..cb1f0aabaf0 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-last.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-last.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
\startcomponent mk-arabic
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-luafitsin.tex b/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-luafitsin.tex
index 9391b63c25e..3592ec52895 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-luafitsin.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-luafitsin.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
\startcomponent mk-luafitsin
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-math.tex b/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-math.tex
index 9fddd4f2739..808e7707991 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-math.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-math.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
\usemodule[fnt-23]
\usemodule[fnt-25]
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-memory.tex b/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-memory.tex
index f8259c7db31..d3303d8d7a7 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-memory.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-memory.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
\environment mk-environment
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-mix.tex b/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-mix.tex
index dd2c72d5baf..aa0077bbd27 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-mix.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-mix.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
\startcomponent mk-mix
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-mplib.tex b/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-mplib.tex
index 78e7b8f9794..6a1be350808 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-mplib.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-mplib.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
\useMPlibrary[dum]
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-nicetoknow.tex b/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-nicetoknow.tex
index 2c0d4967f26..60a98907973 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-nicetoknow.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-nicetoknow.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
\environment mk-environment
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-nodes.tex b/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-nodes.tex
index fb59ec05c26..0bd5f8963ac 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-nodes.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-nodes.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
\startcomponent mk-nodes
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-open.tex b/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-open.tex
index 648c03bf3a5..ab01a033a60 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-open.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-open.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
\startcomponent mk-open
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-optimization.tex b/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-optimization.tex
index f398faf2419..2d34d259491 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-optimization.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-optimization.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
\startcomponent mk-arabic
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-order.tex b/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-order.tex
index 1e6306c45d3..436792631b1 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-order.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-order.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
\environment mk-environment
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-performance.tex b/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-performance.tex
index c0bb13efb08..bedc646797d 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-performance.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-performance.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
\startcomponent mk-performance
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-plain.tex b/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-plain.tex
index 67c5a34630f..278205c68ff 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-plain.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-plain.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
\environment mk-environment
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-punk.tex b/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-punk.tex
index 1220815465d..84e3dfacc4f 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-punk.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-punk.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
% This only works in MKIV because in LMTX we don't load the font-vir module
% any longer. No one used it anyway.
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-reflection.tex b/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-reflection.tex
index f9a22650c87..1d150c9801a 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-reflection.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-reflection.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
\startcomponent mk-reflection
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-structure.tex b/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-structure.tex
index f199feb7be0..9f921887a90 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-structure.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-structure.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
\usemodule[narrowtt]
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-timing-1-luatex-progress.lut b/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-timing-1-luatex-progress.lut
index 63d4774a3da..058e408c0d5 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-timing-1-luatex-progress.lut
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-timing-1-luatex-progress.lut
@@ -48050,15981 +48050,4 @@ return {
["penalty"]="35",
["rule"]="4",
["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=4781,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=30,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=49447666,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=4786,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=31,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=49674358,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=4789,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=31,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=49901050,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=4792,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=31,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.01800012588501,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=50127742,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=4795,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=31,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017999887466431,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=50354434,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=4798,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=31,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.01800012588501,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=50581126,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=4801,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=31,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=50807818,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=4805,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=31,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=51034510,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=4808,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=31,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.019000053405762,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=51261202,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=4811,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=31,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017999887466431,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=51487894,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=4814,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=31,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017000198364258,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=51714586,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=4817,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=31,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=51941278,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=4820,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=31,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017999887466431,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=52167970,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=4824,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=31,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.01800012588501,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=52394662,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=4827,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=31,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=52621354,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=4830,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=31,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=52848046,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=4833,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=31,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.019000053405762,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=53074738,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=4836,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=31,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017999887466431,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=53301430,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=4839,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=31,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.01800012588501,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=53528122,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=4843,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=31,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=53754814,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=4846,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=31,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=53981506,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=4849,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=31,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=54208198,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=4852,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=31,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.01800012588501,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=54434890,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=4855,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=31,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=54661582,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=4858,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=31,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=54888274,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=4862,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=31,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.01800012588501,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=55114966,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=4865,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=31,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=55341658,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=4868,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=31,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017999887466431,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=55568350,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=4871,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=31,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=55795042,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=4874,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=31,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.01800012588501,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=56021734,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=4877,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=31,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=56248426,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=4881,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=31,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017999887466431,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=56475118,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=4884,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=31,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017000198364258,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=56701810,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=4887,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=31,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017999887466431,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=56928502,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=4890,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=31,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=57155194,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=4893,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=31,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=57381886,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=4896,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=31,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017000198364258,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=57608578,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=4900,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=31,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017999887466431,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=57835270,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=4903,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=31,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.01800012588501,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=58061962,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=4906,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=31,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=58288654,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=4909,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=31,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=58515346,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=4912,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=31,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=58742038,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=4915,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=31,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=58968730,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=4919,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=31,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.01800012588501,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=59195422,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=4922,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=31,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017999887466431,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=59422114,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=4925,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=31,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=59648806,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=4928,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=31,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=59875498,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=4931,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=31,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017000198364258,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=60102190,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=4934,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=31,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=60328882,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=4938,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=31,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017999887466431,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=60555574,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=4941,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=31,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.01800012588501,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=60782266,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=4944,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=32,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=61008958,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=4948,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=32,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=61235650,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=4951,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=32,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.01800012588501,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=61462342,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=4954,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=32,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=61689034,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=4958,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=32,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017999887466431,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=61915726,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=4961,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=32,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.01800012588501,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=62142418,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=4964,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=32,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=62369110,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=4967,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=32,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=62595802,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=4970,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=32,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=62822494,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=4973,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=32,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.01800012588501,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=63049186,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=4977,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=32,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=63275878,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=4980,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=32,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017999887466431,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=63502570,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=4983,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=32,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=63729262,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=4986,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=32,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017000198364258,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=63955954,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=4989,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=32,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=64182646,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=4992,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=32,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017999887466431,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=64409338,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=4996,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=32,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=64636030,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=4999,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=32,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.019000053405762,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=64862722,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5002,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=32,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.01800012588501,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=65089414,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5005,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=32,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017999887466431,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=65316106,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5008,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=32,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=65542798,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5011,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=32,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017000198364258,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=65769490,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5015,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=32,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=65996182,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5018,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=32,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017999887466431,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=66222874,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5021,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=32,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=66449566,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5024,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=32,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.01800012588501,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=66676258,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5027,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=32,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=66902950,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5030,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=32,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=67129642,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5034,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=32,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=67356334,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5037,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=32,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.01800012588501,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=67583026,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5040,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=32,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=67809718,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5043,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=32,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017999887466431,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=68036410,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5046,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=32,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017000198364258,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=68263102,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5049,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=32,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=68489794,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5053,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=32,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017999887466431,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=68716486,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5056,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=32,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=68943178,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5059,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=32,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.01800012588501,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=69169870,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5062,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=32,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=69396562,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5065,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=32,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017999887466431,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=69623254,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5068,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=32,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017000198364258,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=69849946,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5072,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=32,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=70076638,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5075,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=32,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=70303330,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5078,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=32,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017999887466431,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=70530022,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5081,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=32,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017000198364258,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=70756714,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5084,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=32,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017999887466431,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=70983406,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5087,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=32,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=71210098,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5091,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=32,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.01800012588501,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=71436790,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5094,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=32,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=71663482,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5097,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=32,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017999887466431,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=71890174,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5100,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=32,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017000198364258,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=72116866,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5103,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=33,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=72343558,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5107,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=33,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017999887466431,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=72570250,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5111,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=33,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=72796942,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5114,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=33,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017000198364258,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=73023634,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5117,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=33,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=73250326,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5120,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=33,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017999887466431,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=73477018,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5123,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=33,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=73703710,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5126,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=33,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017000198364258,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=73930402,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5130,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=33,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017999887466431,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=74157094,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5133,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=33,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=74383786,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5136,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=33,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=74610478,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5139,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=33,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.019000053405762,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=74837170,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5142,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=33,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.01800012588501,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=75063862,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5145,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=33,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017999887466431,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=75290554,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5149,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=33,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.01800012588501,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=75517246,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5152,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=33,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017999887466431,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=75743938,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5155,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=33,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017999887466431,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=75970630,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5158,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=33,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.01800012588501,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=76197322,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5161,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=33,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017999887466431,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=76424014,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5164,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=33,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.01800012588501,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=76650706,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5168,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=33,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017999887466431,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=76877398,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5171,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=33,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.01800012588501,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=77104090,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5174,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=33,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017999887466431,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=77330782,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5177,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=33,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.019000053405762,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=77557474,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5180,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=33,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.01800012588501,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=77784166,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5183,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=33,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.018999814987183,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=78010858,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5187,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=33,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.01800012588501,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=78237550,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5190,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=33,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017999887466431,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=78464242,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5193,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=33,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.01800012588501,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=78690934,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5196,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=33,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.019999980926514,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=78917626,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5199,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=33,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.019000053405762,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=79144318,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5202,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=33,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017999887466431,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=79371010,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5206,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=33,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.01800012588501,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=79597702,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5209,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=33,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017999887466431,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=79824394,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5212,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=33,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017999887466431,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=80051086,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5215,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=33,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.01800012588501,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=80277778,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5218,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=33,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017999887466431,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=80504470,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5221,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=33,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.01800012588501,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=80731162,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5225,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=33,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017999887466431,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=80957854,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5228,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=33,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.01800012588501,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=81184546,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5231,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=33,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017999887466431,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=81411238,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5234,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=33,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.01800012588501,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=81637930,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5237,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=33,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.019000053405762,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=81864622,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5240,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=33,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=82091314,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5244,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=33,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017999887466431,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=82318006,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5247,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=33,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.01800012588501,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=82544698,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5250,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=33,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017999887466431,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=82771390,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5253,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=33,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.01800012588501,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=82998082,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5256,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=33,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.019999980926514,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=83224774,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5259,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=33,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017999887466431,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=83451466,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5264,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=34,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.01800012588501,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=83678158,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5267,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=34,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017999887466431,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=83904850,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5270,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=34,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.01800012588501,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=84131542,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5273,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=34,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.018999814987183,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=84358234,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5276,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=34,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.019000053405762,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=84584926,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5279,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=34,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.01800012588501,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=84811618,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5283,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=34,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017999887466431,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=85038310,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5286,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=34,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.01800012588501,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=85265002,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5289,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=34,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.018999814987183,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=85491694,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5292,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=34,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.019999980926514,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=85718386,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5295,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=34,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.080000162124634,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=85938559,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5298,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=34,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.020999908447266,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=86172602,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5302,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=34,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.020999908447266,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=86399294,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5305,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=34,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.020000219345093,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=86625986,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5308,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=34,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.019999980926514,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=86852678,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5311,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=34,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.019999980926514,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=87079370,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5314,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=34,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.021999835968018,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=87078614,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5317,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=34,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.027000188827515,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=84774138,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5321,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=34,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.019999980926514,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=85000830,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5324,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=34,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.019999980926514,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=85227522,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5327,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=34,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.019999980926514,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=85454214,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5330,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=34,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.019000053405762,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=85680906,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5333,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=34,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.023000001907349,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=84851578,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5336,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=34,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.021999835968018,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=83835070,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5340,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=34,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.022000074386597,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=82824162,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5343,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=34,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.022000074386597,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=81807654,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5346,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=34,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.023000001907349,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=80796746,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5349,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=34,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.023999929428101,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=79785838,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5352,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=34,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.023000001907349,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=78769330,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5355,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=34,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.022000074386597,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=77758422,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5359,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=34,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.021999835968018,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=76747514,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5362,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=34,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.022000074386597,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=75731006,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5365,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=34,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.022000074386597,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=74720098,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5368,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=34,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.021999835968018,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=73703590,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5371,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=34,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.022000074386597,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=72692682,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5374,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=34,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.022000074386597,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=71681774,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5378,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=34,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.023000001907349,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=70665266,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5381,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=34,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.021999835968018,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=69654358,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5384,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=34,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.022000074386597,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=68643450,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5387,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=34,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.023000001907349,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=67626942,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5390,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=34,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.022000074386597,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=66616034,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5393,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=34,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.022000074386597,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=65599526,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5397,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=34,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.021999835968018,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=64588618,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5400,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=34,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.022000074386597,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=63577710,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5403,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=34,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.022000074386597,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=62561202,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5406,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=34,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.021999835968018,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=61550294,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5409,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=34,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.023000001907349,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=60533786,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5412,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=34,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.022000074386597,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=59522878,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5416,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=34,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.022000074386597,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=58511970,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5419,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=34,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.021999835968018,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=57495462,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5422,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=35,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.023000001907349,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=56484554,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5426,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=35,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.02400016784668,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=55473646,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5429,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=35,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.021999835968018,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=54457138,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5432,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=35,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.023000001907349,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=53446230,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5436,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=35,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.023000001907349,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=52429722,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5439,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=35,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.023000001907349,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=51418814,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5442,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=35,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.023000001907349,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=50407906,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5445,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=35,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.023000001907349,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=49391398,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5448,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=35,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.022000074386597,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=48538163,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5451,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=35,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.023999929428101,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=48764906,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5455,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=35,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.01800012588501,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=48991598,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5458,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=35,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017999887466431,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=49218290,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5461,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=35,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=49444982,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5464,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=35,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017000198364258,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=49671674,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5467,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=35,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017999887466431,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=49898366,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5470,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=35,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=50125058,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5474,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=35,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=50351750,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5477,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=35,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.01800012588501,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=50578442,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5480,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=35,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017999887466431,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=50805134,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5483,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=35,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=51031826,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5486,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=35,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017000198364258,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=51258518,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5489,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=35,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=51485210,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5493,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=35,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017999887466431,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=51711902,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5496,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=35,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=51938594,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5499,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=35,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.01800012588501,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=52165286,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5502,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=35,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.019000053405762,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=52391978,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5505,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=35,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017999887466431,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=52618670,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5508,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=35,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.019000053405762,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=52845362,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5512,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=35,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017999887466431,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=53072054,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5515,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=35,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017000198364258,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=53298746,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5518,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=35,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017999887466431,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=53525438,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5521,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=35,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=53752130,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5524,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=35,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=53978822,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5527,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=35,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017000198364258,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=54205514,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5531,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=35,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=54432206,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5534,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=35,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017999887466431,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=54658898,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5537,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=35,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.01800012588501,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=54885590,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5540,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=35,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=55112282,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5543,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=35,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017999887466431,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=55338974,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5546,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=35,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=55565666,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5550,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=35,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017000198364258,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=55792358,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5553,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=35,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017999887466431,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=56019050,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5556,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=35,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.01800012588501,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=56245742,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5559,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=35,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=56472434,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5562,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=35,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017999887466431,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=56699126,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5565,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=35,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=56925818,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5569,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=35,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017000198364258,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=57152510,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5572,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=35,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=57379202,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5575,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=35,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017999887466431,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=57605894,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5578,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=35,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=57832586,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5581,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=36,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017000198364258,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=58059278,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5585,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=36,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017999887466431,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=58285970,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5589,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=36,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=58512662,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5592,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=36,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=58739354,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5595,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=36,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.01800012588501,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=58966046,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5598,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=36,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=59192738,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5601,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=36,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017999887466431,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=59419430,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5604,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=36,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017000198364258,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=59646122,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5608,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=36,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=59872814,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5611,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=36,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017999887466431,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=60099506,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5614,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=36,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=60326198,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5617,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=36,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.01800012588501,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=60552890,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5620,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=36,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=60779582,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5623,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=36,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=61006274,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5627,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=36,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=61232966,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5630,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=36,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.01800012588501,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=61459658,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5633,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=36,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017999887466431,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=61686350,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5636,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=36,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017000198364258,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=61913042,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5639,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=36,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017999887466431,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=62139734,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5642,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=36,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=62366426,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5646,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=36,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=62593118,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5649,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=36,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.019000053405762,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=62819810,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5652,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=36,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=63046502,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5655,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=36,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.01800012588501,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=63273194,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5658,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=36,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017999887466431,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=63499886,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5661,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=36,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=63726578,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5665,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=36,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017000198364258,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=63953270,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5668,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=36,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=64179962,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5671,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=36,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017999887466431,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=64406654,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5674,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=36,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=64633346,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5677,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=36,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.01800012588501,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=64860038,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5680,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=36,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=65086730,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5684,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=36,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017999887466431,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=65313422,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5687,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=36,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.019000053405762,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=65540114,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5690,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=36,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.01800012588501,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=65766806,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5693,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=36,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.018999814987183,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=65993498,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5696,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=36,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.01800012588501,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=66220190,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5699,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=36,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=66446882,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5703,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=36,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=66673574,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5706,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=36,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.01800012588501,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=66900266,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5709,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=36,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=67126958,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5712,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=36,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=67353650,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5715,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=36,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.01800012588501,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=67580342,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5718,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=36,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=67807034,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5722,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=36,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017999887466431,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=68033726,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5725,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=36,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=68260418,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5728,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=36,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.01800012588501,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=68487110,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5731,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=36,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=68713802,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5734,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=36,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017999887466431,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=68940494,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5737,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=36,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.01800012588501,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=69167186,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5742,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=37,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=69393878,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5745,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=37,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=69620570,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5748,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=37,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.01800012588501,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=69847262,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5751,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=37,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=70073954,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5754,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=37,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017999887466431,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=70300646,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5757,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=37,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017000198364258,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=70527338,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5761,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=37,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017999887466431,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=70754030,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5764,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=37,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=70980722,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5767,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=37,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=71207414,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5770,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=37,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017000198364258,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=71434106,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5773,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=37,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017999887466431,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=71660798,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5776,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=37,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=71887490,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5780,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=37,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.01800012588501,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=72114182,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5783,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=37,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=72340874,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5786,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=37,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=72567566,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5789,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=37,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017999887466431,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=72794258,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5792,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=37,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017000198364258,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=73020950,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5795,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=37,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017999887466431,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=73247642,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5799,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=37,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.01800012588501,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=73474334,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5802,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=37,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=73701026,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5805,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=37,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=73927718,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5808,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=37,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017999887466431,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=74154410,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5811,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=37,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017000198364258,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=74381102,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5814,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=37,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017999887466431,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=74607794,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5818,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=37,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=74834486,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5821,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=37,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=75061178,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5824,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=37,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.01800012588501,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=75287870,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5827,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=37,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017999887466431,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=75514562,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5830,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=37,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.01800012588501,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=75741254,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5833,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=37,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017999887466431,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=75967946,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5837,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=37,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.01800012588501,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=76194638,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5840,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=37,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017999887466431,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=76421330,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5843,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=37,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.01800012588501,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=76648022,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5846,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=37,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017999887466431,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=76874714,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5849,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=37,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.01800012588501,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=77101406,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5852,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=37,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.018999814987183,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=77328098,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5856,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=37,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.01800012588501,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=77554790,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5859,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=37,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017999887466431,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=77781482,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5862,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=37,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.01800012588501,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=78008174,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5865,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=37,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.019000053405762,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=78234866,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5868,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=37,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017999887466431,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=78461558,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5871,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=37,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.01800012588501,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=78688250,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5875,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=37,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017999887466431,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=78914942,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5878,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=37,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017999887466431,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=79141634,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5881,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=37,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.01800012588501,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=79368326,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5884,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=37,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.019000053405762,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=79595018,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5887,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=37,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017999887466431,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=79821710,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5890,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=37,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.019000053405762,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=80048402,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5894,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=37,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017999887466431,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=80275094,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5897,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=37,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.01800012588501,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=80501786,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5900,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=38,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017999887466431,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=80728478,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5904,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=38,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.01800012588501,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=80955170,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5907,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=38,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017999887466431,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=81181862,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5910,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=38,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.01800012588501,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=81408554,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5914,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=38,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.019000053405762,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=81635246,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5917,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=38,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017999887466431,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=81861938,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5920,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=38,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=82088630,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5923,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=38,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.019000053405762,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=82315322,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5926,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=38,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=82542014,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5929,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=38,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.019000053405762,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=82768706,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5933,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=38,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017999887466431,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=82995398,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5936,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=38,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.019999980926514,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=83222090,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5939,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=38,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.01800012588501,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=83448782,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5942,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=38,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.019000053405762,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=83675474,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5945,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=38,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017999887466431,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=83902166,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5948,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=38,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.01800012588501,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=84128858,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5952,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=38,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.018999814987183,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=84355550,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5955,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=38,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.01800012588501,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=84582242,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5958,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=38,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017999887466431,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=84808934,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5961,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=38,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.01800012588501,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=85035626,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5964,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=38,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017999887466431,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=85262318,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5967,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=38,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.019000053405762,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=85489010,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5971,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=38,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.019000053405762,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=85715702,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5974,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=38,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017999887466431,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=85942394,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5977,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=38,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.019000053405762,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=86169086,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5980,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=38,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.019000053405762,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=86395778,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5983,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=38,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.083999872207642,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=86622150,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5986,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=38,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.020000219345093,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=86849162,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5990,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=38,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.019999980926514,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=87075854,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5993,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=38,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.020999908447266,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=87302546,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5996,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=38,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.019999980926514,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=87529238,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=5999,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=38,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.020999908447266,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=87755930,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=6002,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=38,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.025000095367432,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=86485322,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=6005,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=38,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.023999929428101,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=85426186,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=6009,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=38,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.019999980926514,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=85652878,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=6012,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=38,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.020000219345093,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=85879570,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=6015,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=38,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.020999908447266,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=86106262,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=6018,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=38,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.019999980926514,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=85950642,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=6021,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=38,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.023000001907349,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=84934134,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=6024,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=38,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.023000001907349,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=83923226,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=6028,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=38,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.023000001907349,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=82906718,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=6031,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=38,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.022000074386597,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=81895810,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=6034,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=38,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.020999908447266,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=80884902,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=6037,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=38,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.023000001907349,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=79868394,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=6040,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=38,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.022000074386597,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=78857486,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=6043,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=38,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.023999929428101,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=77846578,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=6047,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=38,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.022000074386597,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=76830070,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=6050,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=38,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.020999908447266,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=75819162,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=6053,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=38,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.023000001907349,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=74802654,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=6056,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=38,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.022000074386597,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=73791746,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=6059,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=39,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.023000001907349,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=72780838,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=6063,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=39,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.021999835968018,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=71764330,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=6067,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=39,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.022000074386597,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=70753422,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=6070,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=39,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.021000146865845,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=69736914,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=6073,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=39,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.023000001907349,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=68726006,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=6076,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=39,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.021999835968018,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=67715098,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=6079,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=39,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.022000074386597,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=66698590,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=6082,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=39,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.022000074386597,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=65687682,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=6086,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=39,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.021999835968018,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=64676774,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=6089,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=39,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.022000074386597,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=63660266,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=6092,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=39,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.022000074386597,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=62649358,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=6095,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=39,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.021999835968018,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=61632850,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=6098,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=39,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.022000074386597,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=60621942,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=6101,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=39,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.022000074386597,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=59611034,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=6105,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=39,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.023000001907349,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=58594526,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=6108,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=39,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.021999835968018,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=57583618,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=6111,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=39,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.023000001907349,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=56572710,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=6114,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=39,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.023000001907349,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=55556202,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=6117,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=39,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.02400016784668,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=54545294,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=6120,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=39,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.023000001907349,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=53528786,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=6124,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=39,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.021999835968018,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=52517878,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=6127,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=39,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.023000001907349,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=51506970,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=6130,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=39,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.023000001907349,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=50490462,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=6133,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=39,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.02400016784668,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=49479554,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=6136,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=39,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.020999908447266,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=48893019,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=6139,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=39,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017999887466431,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=49119762,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=6143,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=39,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017000198364258,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=49346454,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=6146,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=39,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017999887466431,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=49573146,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=6149,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=39,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=49799838,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=6152,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=39,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.01800012588501,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=50026530,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=6155,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=39,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017999887466431,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=50253222,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=6158,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=39,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=50479914,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=6162,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=39,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017000198364258,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=50706606,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=6165,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=39,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017999887466431,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=50933298,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=6168,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=39,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=51159990,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=6171,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=39,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.019000053405762,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=51386682,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=6174,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=39,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017999887466431,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=51613374,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=6177,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=39,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017000198364258,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=51840066,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=6181,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=39,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=52066758,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=6184,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=39,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017999887466431,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=52293450,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=6187,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=39,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=52520142,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=6190,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=39,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017000198364258,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=52746834,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=6193,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=39,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017999887466431,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=52973526,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=6196,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=39,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=53200218,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=6200,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=39,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=53426910,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=6203,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=39,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.019000053405762,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=53653602,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=6206,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=39,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.01800012588501,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=53880294,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=6209,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=39,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=54106986,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=6212,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=39,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.019000053405762,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=54333678,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=6215,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=39,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=54560370,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=6220,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=40,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017999887466431,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=54787062,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=6223,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=40,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=55013754,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=6226,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=40,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.01800012588501,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=55240446,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=6229,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=40,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=55467138,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=6232,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=40,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.01800012588501,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=55693830,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=6235,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=40,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=55920522,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=6239,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=40,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=56147214,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=6242,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=40,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017999887466431,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=56373906,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=6245,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=40,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=56600598,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=6248,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=40,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017000198364258,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=56827290,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=6251,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=40,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017999887466431,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=57053982,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=6254,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=40,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=57280674,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=6258,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=40,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.01800012588501,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=57507366,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=6261,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=40,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=57734058,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=6264,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=40,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=57960750,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=6267,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=40,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=58187442,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=6270,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=40,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=58414134,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=6273,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=40,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.01800012588501,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=58640826,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=6277,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=40,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017999887466431,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=58867518,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=6280,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=40,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017000198364258,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=59094210,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=6283,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=40,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=59320902,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=6286,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=40,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=59547594,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=6289,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=40,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017999887466431,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=59774286,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=6292,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=40,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.01800012588501,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=60000978,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=6296,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=40,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=60227670,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=6299,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=40,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=60454362,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=6302,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=40,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=60681054,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=6305,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=40,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.01800012588501,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=60907746,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=6308,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=40,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=61134438,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=6311,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=40,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017999887466431,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=61361130,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=6315,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=40,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017000198364258,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=61587822,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=6318,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=40,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017999887466431,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=61814514,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=6321,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=40,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=62041206,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=6324,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=40,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=62267898,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=6327,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=40,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.01800012588501,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=62494590,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=6330,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=40,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=62721282,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=6334,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=40,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.01800012588501,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=62947974,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=6337,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=40,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=63174666,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=6340,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=40,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017999887466431,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=63401358,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=6343,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=40,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=63628050,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=6346,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=40,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.01800012588501,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=63854742,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=6349,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=40,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=64081434,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=6353,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=40,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017999887466431,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=64308126,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=6356,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=40,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.019000053405762,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=64534818,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=6359,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=40,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=64761510,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=6362,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=40,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017000198364258,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=64988202,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=6365,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=40,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514444,
- ["elapsed_time"]=0.017999887466431,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=65214894,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=6368,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=40,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
- {
- ["cs_count"]=38012,
- ["dyn_used"]=514432,
- ["elapsed_time"]=0.016999959945679,
- ["luabytecode_bytes"]=9200,
- ["luastate_bytes"]=65441586,
- ["max_buf_stack"]=251,
- ["node_memory"]={
- ["attribute"]="171",
- ["attribute_list"]="77",
- ["dir"]="5",
- ["disc"]="196",
- ["glue"]="449",
- ["glue_spec"]="281",
- ["glyph"]="2014",
- ["hlist"]="98",
- ["if_stack"]="7",
- ["kern"]="14",
- ["local_par"]="15",
- ["pdf_literal"]="33",
- ["penalty"]="35",
- ["rule"]="4",
- ["temp"]="5",
- ["vlist"]="31",
- },
- ["obj_ptr"]=6372,
- ["pdf_mem_ptr"]=1,
- ["pdf_mem_size"]=10000,
- ["pdf_os_cntr"]=40,
- ["pool_ptr"]=647904,
- ["str_ptr"]=2136899,
- },
-} \ No newline at end of file
+ ["vlist
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-titlepage.tex b/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-titlepage.tex
index 78f8154f1d8..8654cb7c56c 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-titlepage.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-titlepage.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
\startcomponent mk-titlepage
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-tokenspeak.tex b/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-tokenspeak.tex
index 8382f5cfcc9..bbfacc6b240 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-tokenspeak.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-tokenspeak.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
\startcomponent mk-tokenspeak
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-tracking.tex b/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-tracking.tex
index e24653e3bba..38219ab9838 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-tracking.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-tracking.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
% \enabletrackers[otf.loading]
% \enabletrackers[otf.lookups]
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-xml.tex b/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-xml.tex
index 41398a3653c..45d18b5d14e 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-xml.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-xml.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
% \startluacode
% xml.trace_lpath = true
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-zapfino.tex b/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-zapfino.tex
index f427f13a1c2..b2dde304e76 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-zapfino.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk-zapfino.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
\startcomponent mk-zapfino
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk.tex b/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk.tex
index 430a19892ad..8962f79c798 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/mk/mk.tex
@@ -1,5 +1,5 @@
% author : Hans Hagen
-% copyright : PRAGMA ADE & ConTeXt Development Team
+% copyright : ConTeXt Development Team
% license : Creative Commons Attribution ShareAlike 4.0 International
% reference : pragma-ade.nl | contextgarden.net | texlive (related) distributions
% origin : the ConTeXt distribution
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/musings/musings-children.tex b/Master/texmf-dist/doc/context/sources/general/manuals/musings/musings-children.tex
index b814675bbd4..aca89877421 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/musings/musings-children.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/musings/musings-children.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us runpath=texruns:manuals/musings
% naming-nature.jog
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/musings/musings-contents.tex b/Master/texmf-dist/doc/context/sources/general/manuals/musings/musings-contents.tex
index 45b21ec60c9..db3714be30b 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/musings/musings-contents.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/musings/musings-contents.tex
@@ -1,3 +1,5 @@
+% language=us runpath=texruns:manuals/musings
+
\startcomponent musings-contents
\starttitle[title=Content]
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/musings/musings-introduction.tex b/Master/texmf-dist/doc/context/sources/general/manuals/musings/musings-introduction.tex
index d8dadd74344..dc5eb28892c 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/musings/musings-introduction.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/musings/musings-introduction.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us runpath=texruns:manuals/musings
\startcomponent musings-introduction
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
index 55641ecd957..470aba10927 100644
--- 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
@@ -1,4 +1,4 @@
-% language=uk
+% language=us runpath=texruns:manuals/musings
\startcomponent musings-names
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/musings/musings-perception.tex b/Master/texmf-dist/doc/context/sources/general/manuals/musings/musings-perception.tex
index 9936044737b..3f1253f7e64 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/musings/musings-perception.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/musings/musings-perception.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us runpath=texruns:manuals/musings
\definefontfeature[ligatures][liga=yes,mode=node]
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
index 757f7300c55..96396bb8162 100644
--- 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
@@ -1,4 +1,4 @@
-% language=uk
+% language=us runpath=texruns:manuals/musings
% \showfontkerns
@@ -259,8 +259,8 @@ 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}
+{\dimen0=16383.99999pt \the\dimen0 \quad \number\dimen0}
+{\dimen0=16383.99998pt \the\dimen0 \quad \number\dimen0}
\stopbuffer
\typebuffer
@@ -269,7 +269,7 @@ acceptable for \TEX\ as dimension:
\getbuffer
\stoplines
-Indeed it is the largest legal dimension but the real largest one is slighly
+Indeed it is the largest legal dimension but the real largest one is slightly
less. We could also have said the following, which also indicates what the
maximum cardinal is:
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/musings/musings-roadmap.tex b/Master/texmf-dist/doc/context/sources/general/manuals/musings/musings-roadmap.tex
index f8771ba426b..8deeeb42999 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/musings/musings-roadmap.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/musings/musings-roadmap.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us runpath=texruns:manuals/musings
% \showfontkerns
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/musings/musings-speed.tex b/Master/texmf-dist/doc/context/sources/general/manuals/musings/musings-speed.tex
new file mode 100644
index 00000000000..ecf6d220b40
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/musings/musings-speed.tex
@@ -0,0 +1,687 @@
+% language=us runpath=texruns:manuals/musings
+
+% musical timestamp: listening to FLUX (jazz trio) in Januari 2023
+
+\startcomponent musings-speed
+
+\environment musings-style
+
+\startchapter[title={Speeding up \TEX}]
+
+\startsection[title={Introduction}]
+
+Recently a couple of cordless phones that I use gave up as soon as I used them
+for a minute or so. The first time that happened I figured that after all these
+years the batteries had gone bad and after some testing I decided to replace
+them. I got some of these high end batteries that discharge slowly and store a
+lot of power. Within a year they were dead too. Then I went for the more regular
+and cheaper ones, again with a lot of capacity. And yes, these also gave up, that
+is: only in the phones that were hardly used. The batteries lasted longer in
+phones that were discharged by usage daily.
+
+When I went out for new batteries I was asked if I needed them for cordless
+phones and, surprise, was given special ones that actually stored less but were
+guaranteed to work for at least 6 years. The package explicitly mentioned use in
+cordless phones. So here performance doesn't come with the most high end ones,
+based on specifications that impress.
+
+This is also true for computers that are used to process \TEX\ documents. More
+cores amount to much accumulated processing power but for a single core \TEX\
+process, a few fast cores are more relevant than plenty slower ones that run in
+parallel. More memory helps but compared to other processes \TEX\ actually
+doesn't use that much memory. And disk speed matters but less so when the
+operating system caches files. What does play a role are cpu caches because \TEX\
+is very memory intense and processing is not concentrated in a few functions. But
+a large cache shared among many (busy) cores makes for a less impressive
+performance.
+
+So what matters really? In the next sections we will explore a few points of
+view. It's not some advertisement for a specific engine, but much more about
+putting it into perspective (as one can run into ridiculous arguments on the
+web). It is not only the hardware and software that matters but also how one uses
+it.
+
+\stopsection
+
+\startsection[title=The engine]
+
+There are various ways to compare engines and each has its own characteristics.
+The \PDFTEX\ engine is closest to the original. It directly produces the output
+which can give it an edge. It is eight bit and therefore uses small fonts and
+internally all that is related to fonts and characters is also small. This means
+that there is little overhead in typesetting a paragraph: hyphenation, ligature
+building and kerning are interwoven and perform well.
+
+The \XETEX\ engine supports wide fonts and \UNICODE\ and therefore can be seen as
+32 bit. I never looked into the code so I can't tell how far that goes but
+performance is definitely less than \PDFTEX. The rendering of text is delegated
+to a library (there were some changes in that along its development) which is
+less efficient than the built in \PDFTEX\ route. But it is also more powerful.
+
+The \LUATEX\ engine is mostly 32 bit and delegates non standard font handling to
+\LUA\ which comes with a performance penalty but also adds a lot of flexibility.
+Also, the fact that one can call out to \LUA\ in many places makes that one can
+not really blame the engine for performance hits. The fact that hyphenation,
+ligature building and kerning is split comes at a small price too. We have larger
+nodes so compared to \PDFTEX\ more memory is used and accessed. Some mechanisms
+are actually more efficient, like font expansion and protrusion.
+
+The \LUAMETATEX\ engine lacks a font loader (but it does have the traditional
+renderer on board) and it has no backend. So even more is delegated to \LUA,
+which in turn makes this the slowest of the lot. And, again more data travels
+with nodes. In some modes of operation much more calculations take place.
+However, because it has an enriched macro processor, additional primitives, and
+plenty deep down \quote {improvements} it can perform better than \LUATEX\ (and
+even \LUAJITTEX, the \LUATEX\ version with a faster but limited \LUA\ virtual
+machine). And as with \LUATEX, there are usage patterns that make it faster than
+\PDFTEX.
+
+So, in general the order of performance is \PDFTEX, \XETEX, \LUAJITTEX\ (kind of
+obsolete), \LUATEX, \LUAMETATEX. But then, how come that \CONTEXT\ users never
+complain about performance? The reasons is simple: performance is quite okay and
+as it is relative to what one does, a user will accept a drop in performance when
+more has to be done. When we moved on from \LUATEX\ to \LUAMETATEX\ there
+definitely was a drop in performance, simply because of the \LUA\ backend.
+Because upgrading happened in small (but continuous) steps, right from the start
+the new engine was good enough to be used in production which is why most users
+switched to \LMTX\ as soon as became clear that this is where the progress is
+made.
+
+There were no real complaints about the upto 15\percent\ initial performance drop
+which indicates that for most users it doesn't matter that much. As the engine
+evolved we could gain some back and now \LUAMETATEX\ ends up between \PDFTEX\ and
+\LUATEX\ and in many modern scenarios even comes out first. The fact that in the
+meantime we can be much faster than \LUATEX\ did get noticed (when asked).
+However, as development takes years updating a machine in the meantime puts
+discussions about performance in a different (causality) perspective anyway.
+
+\stopsection
+
+\startsection[title=The coding]
+
+Performance can increase when native engine features are used instead of complex
+macros that have to work around limitations. It can also decrease when new
+features are used that add complex functionality. And when an engine extends
+existing functionality that is likely to come at a price. So where \LUAMETATEX\
+provides a more rich programming environment, it also had a more complex par
+builder, page builder, insert, mark and adjust handling, plenty of extra
+character, rule and box features and all of that definitely adds some overhead.
+Quite often a gain in simplicity (nicer and more efficient macros) compensate the
+more complex features. That is because on the average the engine doesn't do that
+much (tens of thousands of the same) complex macro expansion and also doesn't
+demand that much complex low level typesetting. A gain here is often compensated
+by a loss there. This is one reason why during the years \LUAMETATEX\ could
+sustain a decent performance. Personally I don't accept a drop in performance
+easily which is why in practice most mechanism, even when extended, probably
+perform better but I'm not going to prove that observation.
+
+One important reason why \CONTEXT\ \LMTX\ with \LUAMETATEX\ is faster than its
+ancestors is that we got rid of some intermediate programming layers. Most users
+have never seen the auxiliary macros or implementation details but plenty were
+used in \MKII\ and \MKIV. Of course we kept them because often they are nicer
+than many lines of primitive code, but only a few (and less in the future) are
+used in the core. Examples are multi step macros (that pick up arguments) that
+became single step and complex if tests that became inline native tests. Because
+\CONTEXT\ always had a high level of abstraction consistency of the interface
+also makes that we don't need many helpers. When some features (like for instance
+box manipulation) got extended one could expect a performance hit due to more
+extensive optional keyword scanning in the engine but that was compensated by
+improved scanners. The same is true for scanning numbers and dimensions. So, more
+functionality doesn't always come at a price.
+
+To summarize this: although the engine went a bit more \quote {cisc} than \type
+{risc} the macro package went more \quote {risc}. It reminds me a bit of the end
+of the previous century when there was much talk of fourth generation languages,
+something on top of the normal languages. In the end it were scripting languages
+that became the fashion while traditional languages like \CCODE\ remained
+relatively stable and unchanged for implementing them (and more). A similar
+observation can be made for \CONTEXT\ itself. Whenever some new feature gets
+added to an existing mechanism I try to not cripple performance and thanks to the
+way \CONTEXT\ is set up it works out okay.
+
+Let's look at an example. In \MKII\ we can compare two \quote {strings} with the
+macro \type {doifelse}. Its definition is as follows:
+
+\starttyping
+\long\def\doifelse#1#2%
+ {\let\donottest\dontprocesstest
+ \edef\!!stringa{#1}%
+ \edef\!!stringb{#2}%
+ \let\donottest\doprocesstest
+ \ifx\!!stringa\!!stringb
+ \expandafter\firstoftwoarguments
+ \else
+ \expandafter\secondoftwoarguments
+ \fi}
+\stoptyping
+
+This macro takes two arguments that gets expanded inside two helpers that we
+then compare with a primitive \type {\ifx}. Depending on the outcome we
+expand one of the two following arguments but first we get rid of the interfering
+\type {\else} and \type {\fi}. The pushing and popping of \type {\donottest} takes
+care of protection of unwanted expansion in an \type {\edef}. Many functional macros
+are what we call protected: then expand in two steps depending on the embedded
+\type {\donottest} macro. Think of (simplified):
+
+\starttyping
+\def\realfoo{something is done here}
+\def\usedfoo{\donottest\realfoo}
+\stoptyping
+
+Normally \type {\donottest} is doing nothing so \type {\realfoo} gets expanded
+but there are cases where we (for instance) \type {\let} it be \type {\string}
+which then serializes the macro. This is something that happens when writing to
+the multi pass data file. It can also be used for overloading, for instance in
+the backend or when converting something. This protection against expansion has
+always been a \CONTEXT\ feature, which in turn made it pretty robust in multi
+pass scenarios, but it definitely came with performance penalty.
+
+When \PDFTEX\ got the \ETEX\ extensions we could use the \type {\protected}
+prefix to replace this trickery. That means that \MKII\ will use a different
+definition of \type {\doifelse} when that primitive is known:
+
+\starttyping
+\long\def\doifelse#1#2%
+ {\edef\!!stringa{#1}%
+ \edef\!!stringb{#2}%
+ \ifx\!!stringa\!!stringb
+ \expandafter\firstoftwoarguments
+ \else
+ \expandafter\secondoftwoarguments
+ \fi}
+\stoptyping
+
+This works okay because we now do this:
+
+\starttyping
+\protected\def\usedfoo{something is done here}
+\stoptyping
+
+The \type {\doifelse} helper itself is not protected in \MKII\ (non \ETEX\ mode)
+It would be a performance hit. I won't bore the reader with the tricks needed to
+do the opposite, that is: expand a protected macro. It is seldom needed anyway.
+
+The \MKIV\ definition used with \LUATEX\ is not much different, only the \type
+{\long} prefix is missing. That one is needed when one wants \type {#1} and|/|or
+\type {#2} to be tolerant with respect to embedded \type {\par} equivalents. In
+\LUAMETATEX\ we can disable that check and in \CONTEXT\ all macros are thereby
+\type {\long}. Users won't notice because in \CONTEXT\ most macros were always
+defined the long way; we also suppress \type {\outer} errors.
+
+\starttyping
+\protected\def\doifelse#1#2%
+ {\edef\m_syst_string_one{#1}%
+ \edef\m_syst_string_two{#2}%
+ \ifx\m_syst_string_one\m_syst_string_two
+ \expandafter\firstoftwoarguments
+ \else
+ \expandafter\secondoftwoarguments
+ \fi}
+\stoptyping
+
+Implementation wise a macro, once scanned and stored, carries the long property
+in its command code so that has overhead. However because \LUATEX\ is compatible
+we cannot make all normal macros long by default when \type {\suppresslongerror}
+is used. Therefore checking for an argument running into a \type {\par} is still
+checked but the message is suppressed based on the setting of the mentioned
+parameter. Performance wise, not using \type {\long} comes a the cost of checking
+a parameter which means an additional memory access and comparison. Unless we
+otherwise gain something in the engine it comes at a cost. In \LUAMETATEX\ the
+\type {\long} and \type {\outer} prefixes are ignored. Even better, protected
+macros are also implemented a bit more efficiently.
+
+In the end the definition of \type {\doifelse} in \LMTX\ looks a bit different:
+
+\starttyping
+\permanent\protected\def\doifelse#1#2%
+ {\iftok{#1}{#2}%
+ \expandafter\firstoftwoarguments
+ \else
+ \expandafter\secondoftwoarguments
+ \fi}
+\stoptyping
+
+The \typ {\permanent} prefix flags this macro as such. Depending on the value of
+\typ {\overloadmode} a redefinition is permitted, comes with a warning or
+results in a fatal error. Of course this comes at a price when we define macros
+or values of quantities but this is rather well compensated by all kind of
+improvements in handling macros: defining, expansion, saving and restoring, etc.
+
+More interesting is the use of \type {\iftok} here. It saves us defining two
+helper macros. Of course the content still needs to be expanded before comparison
+but we no longer have various macro management overhead. In scenarios where we
+don't need to jump over the \type {\else} or \type {\fi} we can use this test in
+place which saves passing two arguments and grabbing one argument later on.
+Actually, grabbing is also different, compare:
+
+\starttyping
+ \def\firstoftwoarguments #1#2{#1} % MkII and MkIV
+\permanent\def\firstoftwoarguments #1#-{#1} % MkXL aka LMTX
+
+ \def\secondoftwoarguments#1#2{#1} % MkII and MkIV
+\permanent\def\secondoftwoarguments#-#1{#1} % MkXL aka LMTX
+\stoptyping
+
+In the case of \LUAMETATEX\ the \type {#-} makes that we don't even bother to
+store the argument as it is ignored. Where \type {#0} does the same it also
+increments the argument counter which is why here even the second arguments has
+number ~1. Now, if this more efficient? Sure, but how often does it really
+happen? The engine still needs to scan (which comes at a cost) but we save on
+temporary token list storage. Because \TEX\ is so fast already, measuring only
+shows differences when one has many (and here a real lot) iterations. However,
+all these small bits add up which is what we've seen in 2022 in \CONTEXT: it is
+the reason why we are now faster than \MKIV\ with \LUATEX, even with more
+functionality in the engine.
+
+I can probably write hundreds of pages in explaining what was added, changed,
+made more flexible and what side effects it had|/|has on performance but I bet no
+one is really interested in that. In fact, the previous exploration is just a
+side effect of a question that triggered it, so maybe future questions will
+trigger more explanations. It anyhow demonstrates what I meant when I said that
+\LUAMETATEX\ is meant to be leaner and meaner. Of course the code base and binary
+is smaller but that also gets compensated by more functionality. It also means
+that we can make the \CONTEXT\ code base nicer because for me a good looking
+source (which of course is subjective) is pretty important.
+
+\stopsection
+
+\startsection[title=Compatibility]
+
+There are non \CONTEXT\ users who seem to love to stress that successive versions
+of \CONTEXT\ are incompatible. Other claims are that it is developed in a
+commercial setting. While it is true that there are changes and it is also true
+that \CONTEXT\ is used in commercial settings, it is not that different from
+other open source projects. The majority of the code is written without
+compensation and it is offered without advertisements or request for support. It
+is true that when we can render better, it will be done. But the user interfaces
+only change when there is a reason and there are few cases where some
+functionality became obsolete, think of input and font encodings. Most such
+changes directly relate to the engine: in \PDFTEX\ and \MKII\ we emulate \UTF-8\
+wile in \LUATEX\ is comes natively. In \PDFTEX\ eight bit (\TYPEONE) fonts are
+used while \LUATEX\ adds support for \OPENTYPE. Other macro packages support that
+by additional packages while \CONTEXT\ has it integrated. That is why the system
+evolves over time.
+
+Just a users adapt to (yearly) operating system interfaces, mobile phones, all
+kinds of hardware, cars, clothing, media and so on, the \CONTEXT\ users have no
+problem adapting to an evolving \TEX\ ecosystem. I guess claims about changes
+(being a disadvantage) can only point to a lack of development elsewhere. The
+main reason for mentioning this is that when \CONTEXT\ users move on to newer
+engines, the older ones are seldom used. So, few users compare a \LMTX\ run with
+one using \PDFTEX\ or \LUATEX. They naturally expect \LUAMETATEX\ to perform well
+and maybe even to perform better over time. They just don't complain. And unless
+one hacks (overloads) system macros compatibility is not really an issue. What
+can be an issue is that updates and adaptations to a newer engine come with bugs
+but those are solved.
+
+So, the fact that we compare incompatible engines with likely different low level
+macro implementations of otherwise stable features of a macro package makes
+comparison hard. For instance, maybe there are speedups possible in frozen \MKII,
+although it is unlikely, which makes that it might even perform better than
+reported. In a similar fashion, the fact that \OPENTYPE\ is more demanding for
+sure makes that \LUATEX\ rendering is slower than \PDFTEX. It anyhow makes a
+discussion about performance within and between macro packages even more
+ridiculous. Just don't buy those claims and|/|or ask on the \CONTEXT\ mailing
+list for clarification.
+
+\stopsection
+
+\startsection[title=The job]
+
+So, say that we now have an efficient and powerful engine and a matching macro
+package. Does that make all jobs faster? For sure, the ones that I use as
+benchmark run much smoother. The 360 page \LUAMETATEX\ manual runs in less than
+8.4 seconds on a Dell Precision laptop with (mobile) Intel(R) Xeon(R) CPU
+E3-1505M v6 @ 3.00GHz, 2TB fast Samsung pro SSD, and 48 GB of memory, running
+Windows 10. The \METAFUN\ manual with many more pages and thousands of \METAPOST\
+graphics needs a bit more than 12 seconds. So you don't hear me complain. This
+chapter takes 7.5 seconds plus 0.5 is for the runner, not enough time to get
+coffee.
+
+Nowadays I tend to measure performance in terms of pages per second, because in
+the end that is what users experience. For me more important are the gains for my
+colleague who processes documents of 400 pages from hundreds of small \XML\ files
+with multiple graphics per page. Given different output variants a lot of
+processing takes place, so there a gain from 20 pages per second to 25 pages per
+second is welcome. Anyway, here are a few measurements of a {\em simple} test suite
+per January 7, 2023. We use this as test text:
+
+\starttyping
+\def\Knuth{%%
+Thus, I came to the conclusion that the designer of a new system
+must not only be the implementer and first large||scale user; the
+designer should also write the first user manual.
+\par
+The separation of any of these four components would have hurt
+\TeX\ significantly. If I had not participated fully in all these
+activities, literally hundreds of improvements would never have
+been made, because I would never have thought of them or perceived
+why they were important.
+\par
+But a system cannot be successful if it is too strongly influenced
+by a single person. Once the initial design is complete and fairly
+robust, the real test begins as people with many different
+viewpoints undertake their own experiments.
+}
+\stoptyping
+
+Now keep in mind that these are simple examples. On more complex documents the
+\LUAMETATEX\ engine with \LMTX\ is relatively faster: think \XML, plenty
+\METAPOST, complex tables, advanced math, dozens of fonts in combination with the
+new compact font mode.
+
+The tests themselves are simple: we switch fonts (because fonts bring overhead),
+we add some color (because we use different methods), we process some graphics
+(to show what embedding \METAPOST\ brings), we do some tables (because that can
+be stressful). Each sample is run 50, 500 or 1000 times, and each set is run a
+couple of times so that we compensate for caching and fluctuating system load.
+The tests are more about signaling a trend than about absolute numbers. For
+what it's worth, I used a \LUA\ script to run the samples.
+
+When you run an experiment that measures performance, keep in mind that
+performance not only depends on the engine, but also on for instance logging.
+When I run the \CONTEXT\ test suite it takes 1250 seconds if the console takes
+the full screen on a 2560 by 1600 display and 30 seconds more on a 3840 by 2160
+display and it even depends on how large the font is set. On the 1920 by 1200
+monitor I get to 1230. Of course these times change when we add more to the test
+suite so it's always a momentary measurement.
+
+Similar differences can be observed when running in an editor. A good test is
+making a \CONTEXT\ format: 2.2 seconds goes down to below 1.8 when the output is
+piped to a file. On a decent 2023 desktop those times are probably half but I
+don't have one at hand.
+
+\startsubsubject[title={sample 1, number of runs: 2}]
+
+\starttyping
+\starttext
+ \dorecurse {%s} {
+ \Knuth
+ \par
+ }
+\stoptext
+\stoptyping
+
+\starttabulate[||r|r|r|]
+\HL
+\BC engine \BC 50 \BC 500 \BC 1000 \NC \NR
+\HL
+\BC pdftex \NC 0.63 \NC 0.83 \NC 1.07 \NC \NR
+\BC luatex \NC 0.95 \NC 1.86 \NC 2.94 \NC \NR
+\BC luametatex \NC 0.61 \NC 1.49 \NC 2.48 \NC \NR
+\HL
+\stoptabulate
+
+\stopsubsubject
+
+\startsubsubject[title={sample 2, number of runs: 2}]
+
+\starttyping
+\starttext
+ \dorecurse {%s} {
+ \tf \Knuth \bf \Knuth
+ \it \Knuth \bs \Knuth
+ \par
+ }
+\stoptext
+\stoptyping
+
+\starttabulate[||r|r|r|]
+\HL
+\BC engine \BC 50 \BC 500 \BC 1000 \NC \NR
+\HL
+\BC pdftex \NC 0.70 \NC 1.73 \NC 2.80 \NC \NR
+\BC luatex \NC 1.37 \NC 5.37 \NC 9.92 \NC \NR
+\BC luametatex \NC 1.04 \NC 5.06 \NC 9.73 \NC \NR
+\HL
+\stoptabulate
+
+\stopsubsubject
+
+\startsubsubject[title={sample 3, number of runs: 2}]
+
+\starttyping
+\starttext
+ \dorecurse {%s} {
+ \tf \Knuth \it knuth \bf \Knuth \bs knuth
+ \it \Knuth \tf knuth \bs \Knuth \bf knuth
+ \par
+ }
+\stoptext
+\stoptyping
+
+\starttabulate[||r|r|r|]
+\HL
+\BC engine \BC 50 \BC 500 \BC 1000 \NC \NR
+\HL
+\BC pdftex \NC 0.71 \NC 1.81 \NC 2.98 \NC \NR
+\BC luatex \NC 1.41 \NC 5.84 \NC 10.77 \NC \NR
+\BC luametatex \NC 1.05 \NC 5.71 \NC 10.60 \NC \NR
+\HL
+\stoptabulate
+
+\stopsubsubject
+
+\startsubsubject[title={sample 4, number of runs: 2}]
+
+\starttyping
+\setupcolors[state=start]
+\starttext
+ \dorecurse {%s} {
+ {\red \tf \Knuth \green \it knuth}
+ {\red \bf \Knuth \green \bs knuth}
+ {\red \it \Knuth \green \tf knuth}
+ {\red \bs \Knuth \green \bf knuth}
+ \par
+ }
+\stoptext
+\stoptyping
+
+\starttabulate[||r|r|r|]
+\HL
+\BC engine \BC 50 \BC 500 \BC 1000 \NC \NR
+\HL
+\BC pdftex \NC 0.73 \NC 1.91 \NC 3.64 \NC \NR
+\BC luatex \NC 1.39 \NC 5.82 \NC 12.58 \NC \NR
+\BC luametatex \NC 1.07 \NC 5.57 \NC 11.85 \NC \NR
+\HL
+\stoptabulate
+
+\stopsubsubject
+
+\startsubsubject[title={sample 5, number of runs: 2}]
+
+\starttyping
+\starttext
+ \dorecurse {%s} {
+ \null \page
+ }
+\stoptext
+\stoptyping
+
+\starttabulate[||r|r|r|]
+\HL
+\BC engine \BC 50 \BC 500 \BC 1000 \NC \NR
+\HL
+\BC pdftex \NC 0.62 \NC 1.12 \NC 1.68 \NC \NR
+\BC luatex \NC 0.90 \NC 1.39 \NC 1.98 \NC \NR
+\BC luametatex \NC 0.58 \NC 0.99 \NC 1.46 \NC \NR
+\HL
+\stoptabulate
+
+\stopsubsubject
+
+\startsubsubject[title={sample 6, number of runs: 2}]
+
+\starttyping
+\starttext
+ \dorecurse {%s} {
+ %% nothing
+ }
+\stoptext
+\stoptyping
+
+\starttabulate[||r|r|r|]
+\HL
+\BC engine \BC 50 \BC 500 \BC 1000 \NC \NR
+\HL
+\BC pdftex \NC 0.55 \NC 0.54 \NC 0.56 \NC \NR
+\BC luatex \NC 0.79 \NC 0.81 \NC 0.82 \NC \NR
+\BC luametatex \NC 0.54 \NC 0.52 \NC 0.53 \NC \NR
+\HL
+\stoptabulate
+
+\stopsubsubject
+
+\startsubsubject[title={sample 7, number of runs: 2}]
+
+\starttyping
+\starttext
+ \dontleavehmode
+ \dorecurse {%s} {
+ \framed[width=1cm,height=1cm,offset=2mm]{x}
+ }
+\stoptext
+\stoptyping
+
+\starttabulate[||r|r|r|]
+\HL
+\BC engine \BC 50 \BC 500 \BC 1000 \NC \NR
+\HL
+\BC pdftex \NC 0.58 \NC 0.65 \NC 0.71 \NC \NR
+\BC luatex \NC 0.84 \NC 0.96 \NC 1.08 \NC \NR
+\BC luametatex \NC 0.54 \NC 0.62 \NC 0.72 \NC \NR
+\HL
+\stoptabulate
+
+\stopsubsubject
+
+\startsubsubject[title={sample 8, number of runs: 2}]
+
+\starttyping
+\starttext
+ \dontleavehmode
+ \dorecurse {%s} {
+ \framed
+ [width=1cm,height=1cm,offset=2mm,
+ foregroundstyle=bold,foregroundcolor=red,
+ background=color,backgroundcolor=green]
+ {x}
+ }
+\stoptext
+\stoptyping
+
+\starttabulate[||r|r|r|]
+\HL
+\BC engine \BC 50 \BC 500 \BC 1000 \NC \NR
+\HL
+\BC pdftex \NC 0.59 \NC 0.70 \NC 0.83 \NC \NR
+\BC luatex \NC 0.87 \NC 1.00 \NC 1.17 \NC \NR
+\BC luametatex \NC 0.55 \NC 0.66 \NC 0.78 \NC \NR
+\HL
+\stoptabulate
+
+\stopsubsubject
+
+\startsubsubject[title={sample 9, number of runs: 2}]
+
+\starttyping
+\starttext
+ \ifdefined\permanent\else\def\BC{\NC\bf}\fi
+ \dontleavehmode
+ \dorecurse {%s} {
+ \starttabulate[|||||]
+ \NC test \BC test \NC test \NC test \NC \NR
+ \NC test \BC test \NC test \NC test \NC \NR
+ \NC test \BC test \NC test \NC test \NC \NR
+ \NC test \BC test \NC test \NC test \NC \NR
+ \stoptabulate
+ }
+\stoptext
+\stoptyping
+
+\starttabulate[||r|r|r|]
+\HL
+\BC engine \BC 50 \BC 500 \BC 1000 \NC \NR
+\HL
+\BC pdftex \NC 0.62 \NC 1.15 \NC 1.71 \NC \NR
+\BC luatex \NC 0.94 \NC 1.84 \NC 2.86 \NC \NR
+\BC luametatex \NC 0.60 \NC 1.19 \NC 1.88 \NC \NR
+\HL
+\stoptabulate
+
+\stopsubsubject
+
+\startsubsubject[title={sample 10, number of runs: 2}]
+
+\starttyping
+\starttext
+ \dontleavehmode
+ \dorecurse {%s} {
+ \startMPcode
+ fill fullcircle scaled 1cm withcolor red ;
+ fill fullsquare scaled 1cm withcolor green ;
+ \stopMPcode
+ \space
+ }
+\stoptext
+\stoptyping
+
+\starttabulate[||r|r|r|]
+\HL
+\BC engine \BC 50 \BC 500 \BC 1000 \NC \NR
+\HL
+\BC pdftex \NC 5.73 \NC 50.98 \NC 102.10 \NC \NR
+\BC luatex \NC 0.93 \NC 1.07 \NC 1.30 \NC \NR
+\BC luametatex \NC 0.57 \NC 0.71 \NC 0.86 \NC \NR
+\HL
+\stoptabulate
+
+\stopsection
+
+\startsection[title=Final words]
+
+Whenever I run into (or get send) remarks of (especially non \CONTEXT) users
+suggesting that \LUATEX\ is much slower than \PDFTEX\ or that \LUAMETATEX\ seems
+much faster than \LUATEX, one really has to keep in mind that this is not always
+true. Among the questions to be asked are \quotation {What engine do you use?},
+\quotation {Which macro package do you use?}, \quotation {How well is your style
+set up?}, \quotation {How complex is the document?}, \quotation {Is your own
+additional code efficient?}, \quotation {Do you use engine and macro package
+features the right way?} and of course \quotation {What do you compare with?},
+\quotation {What do you expect and why?}, \quotation {Do you actually know what
+goes on deep down?}. An embarrassing one can be \quotation {Do you have an idea
+what is involved in fulfilling your request given that we use a flexible adaptive
+macro language?}. Much probably these questions not get answered properly.
+
+Another thing to make clear is that when someone claims for instance that
+\CONTEXT\ \LMTX\ is fast because of \LUAMETATEX, or that \LUAMETATEX\ is much
+faster than \LUATEX, a healthy suspicion should kick in: does that someone really
+knows what happens and matters? The previous numbers do show differences for
+simple cases but we're often not talking of differences that can be used as an
+excuse for insufficient coding. In the end it is all about the experience: does
+performance feel in tune with expectations. Which is not to say that I will make
+\CONTEXT\ and \LUAMETATEX\ faster because after all there are usage scenarios
+where one has to process tens of thousands of documents with a reasonable amount
+of time, on regular infrastructure, and of course with as little as possible
+energy consumption.
+
+If \PDFTEX\ suits your purpose, there is no need to move to \LUATEX. As with
+rechargeable batteries in cordless phones a higher capacity can make things
+worse. If \LUATEX\ fits the bill, don't dream about using \LUAMETATEX\ instead
+because it will half runtime because the adaptations needed in the macro package
+(like adding a backend) might actually slow it down. Moores law doesn't apply to
+\TEX\ engines and macro packages and you might get disappointed. Accept that the
+choice you made for a macro package can come with a price.
+
+Quite often it is rather easy to debunk complaints and claims which makes one
+wonder why claims about perceived or potential are made at all. But then, I'm
+accustomed to weird remarks and conclusions about \CONTEXT\ as a macro package,
+or for that matter \LUATEX\ (as it originates in the \CONTEXT\ community) even by
+people who should know better. Hopefully the above invites to being more careful.
+
+\stopsection
+
+\stopchapter
+
+\stopcomponent
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/musings/musings-stability.tex b/Master/texmf-dist/doc/context/sources/general/manuals/musings/musings-stability.tex
index 7dc35c6be54..e80d0c4c556 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/musings/musings-stability.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/musings/musings-stability.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us runpath=texruns:manuals/musings
\environment musings-style
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/musings/musings-staygo.tex b/Master/texmf-dist/doc/context/sources/general/manuals/musings/musings-staygo.tex
index 4be647e47b2..c9503dd8298 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/musings/musings-staygo.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/musings/musings-staygo.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us runpath=texruns:manuals/musings
% Written with on repeat:
%
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/musings/musings-style.tex b/Master/texmf-dist/doc/context/sources/general/manuals/musings/musings-style.tex
index a85960bdddd..873c652c133 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/musings/musings-style.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/musings/musings-style.tex
@@ -1,3 +1,5 @@
+% language=us runpath=texruns:manuals/musings
+
\startenvironment musings-style
\usemodule[abr-04]
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/musings/musings-titlepage.tex b/Master/texmf-dist/doc/context/sources/general/manuals/musings/musings-titlepage.tex
index 33eb44d95a4..27868ea8b3c 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/musings/musings-titlepage.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/musings/musings-titlepage.tex
@@ -1,3 +1,5 @@
+% language=us runpath=texruns:manuals/musings
+
\environment musings-style
\startcomponent musings-titlepage
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/musings/musings-toocomplex.tex b/Master/texmf-dist/doc/context/sources/general/manuals/musings/musings-toocomplex.tex
new file mode 100644
index 00000000000..103dd19069b
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/musings/musings-toocomplex.tex
@@ -0,0 +1,389 @@
+% language=us runpath=texruns:manuals/musings
+
+\useMPlibrary[dum]
+
+% Extending Darwin's Revolution – David Sloan Wilson & Robert Sapolsky
+
+\startcomponent musings-toocomplex
+
+\environment musings-style
+
+\startchapter[title={False promises}]
+
+\startsection[title={Introduction}]
+
+\startlines \setupalign[flushright]
+Hans Hagen
+Hasselt NL
+July 2019 (public 2023)
+\stoplines
+
+The \TEX\ typesetting system is pretty powerful, and even more so when you
+combine it with \METAPOST\ and \LUA. Add an \XML\ parser, a whole lot of handy
+macros, provide support for fonts and advanced \PDF\ output and you have a hard
+to beat tool. We're talking \CONTEXT.
+
+Such a system is very well suited for fully automated typesetting. There are
+\TEX\ lovers who claim that \TEX\ can do anything better than the competition but
+that's not true. Automated typesetting is quite doable when you accept the
+constraints. When the input is unpredictable you need to play safe!
+
+Some things are easy: turning complex \XML\ into \PDF\ with adaptive graphics,
+fast data processing, colorful layouts, conditional processing, extensive cross
+referencing, you can safely say that it can be done. But in practice there is
+some design involved and those are often specified by people who manipulate a
+layout on the fly and tweak and cheat in an interactive \WYSIWYG\ program. That is
+however not an option in automated typesetting. Traditional thinking with manual
+intervention has to make place for systematic and consistent solutions.
+Limitations can be compensated by clever designs and getting the maximum out of
+the system used.
+
+Unfortunately in practice some habits are hard to get rid of. Inconsistent use of
+colors, fonts, sectioning, image placements are just a few aspects that come to
+mind. When you typeset educational documents you also have to deal with strong
+opinions about how something should be presented and what students can't~(!)
+handle, like for instance cross references. One of the most dominant demands in
+typesetting such documents are so called side floats. In (for instance)
+scientific publishing references to content typeset elsewhere (formulas,
+graphics) is acceptable but in educational documents this is often not an option
+(don't ask me why).
+
+In the next sections I will mention a few aspects of side floats. I will not
+discuss the options because these are covered in manuals. Here we stick to the
+challenges and the main question that you have to ask yourself is: \quotation
+{How would I solve that if it can be solved at all?}. It might make you a bit
+more tolerant for suboptimal outcome.
+
+\stopsection
+
+\startsection[title={The basics}]
+
+We start with a simple example. The result is shown in \in {figure} [demo-1a]. We
+have figures, put at the left, with enough text alongside so that we don't have a
+problem running into the next figure.
+
+\startbuffer[demo-1a]
+\dorecurse {8} {
+ \useMPlibrary[dum]
+ \setuplayout[middle]
+ \setupbodyfont[plex]
+ \startplacefigure[location=left]
+ \externalfigure[dummy][width=3cm]
+ \stopplacefigure
+ \samplefile{sapolsky}
+ \par
+}
+\stopbuffer
+
+\typebuffer[demo-1a]
+
+\startplacefigure[reference=demo-1a,title={A simple example with enough text in a single paragraph.}]
+ \startcombination
+ {\typesetbuffer[demo-1a][width=5cm,frame=on,page=1]} {}
+ {\typesetbuffer[demo-1a][width=5cm,frame=on,page=2]} {}
+ \stopcombination
+\stopplacefigure
+
+Challenge: Anchor some boxed material to the running text and make sure that the
+text runs around that material. When there is not enough room available on the
+page, enforce a page break and move the lot to the next page.
+
+But more often than not, the following paragraph is not long enough to go around
+the insert. The worst case is of course when we end up with one word below the
+insert, for which the solution is to adapt the text or make the insert wider or
+narrower. Forgetting about this for now, we move to the case where there is not
+enough text: \in {figure} [demo-1b].
+
+\startbuffer[demo-1b]
+\dorecurse {8} {
+ \useMPlibrary[dum]
+ \setuplayout[middle]
+ \setupbodyfont[plex]
+ \startplacefigure[location=left]
+ \externalfigure[dummy][width=3cm]
+ \stopplacefigure
+ \samplefile{ward} \par \samplefile{ward}
+ \par
+}
+\stopbuffer
+
+\typebuffer[demo-1b]
+
+\startplacefigure[reference=demo-1b,title={A simple example with enough text but multiple paragraphs.}]
+ \startcombination
+ {\typesetbuffer[demo-1b][width=5cm,frame=on,page=1]} {}
+ {\typesetbuffer[demo-1b][width=5cm,frame=on,page=2]} {}
+ \stopcombination
+\stopplacefigure
+
+Challenge: At every new paragraph, check if we're still not done with the blob
+we're typesetting around and carry on till we are behind the insert.
+
+\startbuffer[demo-1c]
+\dorecurse {8} {
+ \useMPlibrary[dum]
+ \setuplayout[middle]
+ \setupbodyfont[plex]
+ \startplacefigure[location=left]
+ \externalfigure[dummy][width=3cm]
+ \stopplacefigure
+ \samplefile{ward}
+ \par
+}
+\stopbuffer
+
+The next example, shown in \in {figure} [demo-1c], has less text. However, the
+running text is still alongside the figure, so this means that white space need
+to be added till we're beyond.
+
+\typebuffer[demo-1c]
+
+\startplacefigure[reference=demo-1c,title={A simple example with less text}]
+ \startcombination
+ {\typesetbuffer[demo-1c][width=5cm,frame=on,page=1]} {}
+ {\typesetbuffer[demo-1c][width=5cm,frame=on,page=2]} {}
+ \stopcombination
+\stopplacefigure
+
+Challenge: When there is not enough content, and the next insert is coming, we
+add enough whitespace to go around the insert and then start the new one. This is
+typically something that can also be enforced by an option.
+
+Before we move on to the next challenge, let's explain how we run around the
+insert. When \TEX\ typesets a paragraph, it uses dimensions like \typ {\leftskip}
+and \typ {\rightskip} (margins) and shape directives like \typ {\hangindent} and
+\typ {\hangafter}. There is also the possibility to define a \typ {\parshape} but
+we will leave that for now. The with of the image is reflected in the indent and
+the height gets divided by the line height and becomes the \typ {\hangafter}.
+Whenever a new paragraph is started, these parameters have to be set again.
+\footnote {I still consider playing with a third parameter representing hang
+height and add that to the line break routine, but I have to admit that tweaking
+that is tricky. Do I really understand what is going on there?} In \CONTEXT\
+hanging is also available as basic feature.
+
+\startbuffer
+\starthanging[location=left]
+ {\blackrule[color=maincolor,width=3cm,height=1cm]}
+ \samplefile{carrol}
+\stophanging
+\stopbuffer
+
+\typebuffer {\setupalign[tolerant,stretch]\getbuffer}
+
+\startbuffer
+\starthanging[location=right]
+ {\blackrule[color=maincolor,width=10cm,height=1cm]}
+ \samplefile{jojomayer}
+\stophanging
+\stopbuffer
+
+\typebuffer {\setupalign[tolerant,stretch]\getbuffer}
+
+The hanging floats are not implemented this way but are hooked into the
+paragraph start routines. The original approach was a variant of
+the macros by Daniel Comenetz as published in TUGBoat Volume 14 (1993),
+No.~1: Anchored Figures at Either Margin. In the meantime they are far
+from that, so \CONTEXT\ users can safely blame me for any issues.
+
+\stopsection
+
+\startsection[title={Unpredictable dimensions}]
+
+In an ideal world images will be sort of consistent but in practice the dimension
+will differ, even fonts used in graphics can be different, and they can have
+white space around them. When testing a layout it helps to use mockups with a
+clear border. If these look okay, one can argue that worse looking assemblies
+(more visual whitespace above of below) is a matter of making better images. In
+\in {figure} [demo-2a] we demonstrate how different dimensions influence the space
+below the placement.
+
+\startbuffer[demo-2a]
+\dostepwiserecurse {2} {8} {1} {
+ \useMPlibrary[dum]
+ \setuplayout[middle]
+ \setupbodyfont[plex]
+ \setupalign[tolerant,stretch]
+ \startplacefigure[location=left]
+ \externalfigure[dummy][width=#1cm]
+ \stopplacefigure
+ \samplefile{sapolsky}
+ \par
+}
+\stopbuffer
+
+\typebuffer[demo-2a]
+
+\startplacefigure[reference=demo-2a,title={Spacing relates to dimensions.}]
+ \startcombination[3*1]
+ {\typesetbuffer[demo-2a][width=5cm,frame=on,page=1]} {}
+ {\typesetbuffer[demo-2a][width=5cm,frame=on,page=2]} {}
+ {\typesetbuffer[demo-2a][width=5cm,frame=on,page=3]} {}
+ \stopcombination
+\stopplacefigure
+
+In \CONTEXT\ there are plenty of options to add more space above or below the
+image. You can anchor the image to the first line in different ways and you can
+move it some lines down, either or not with text flowing around it. But here we
+stick to simple cases, we only discuss the challenges.
+
+Challenge: Adapt the wrapping to the right dimensions and make sure that the
+(optional) caption doesn't overlap with the text below.
+
+\stopsection
+
+\startsection[title={Moving forward}]
+
+When the insert doesn't fit it has to move, which is why it's called a float. One
+solution is do take it out of the page stream and turn it into a regular
+placement, normally centered horizontally somewhere on the page, and in this case
+probably at the top of one of the next pages. Because we can cross reference this
+is a quite okay solution. But, in educational documents, where authors refer to
+the graphic (picture) on the left or right, that doesn't work out well. The
+following content is bound to the image.
+
+Calculating the amount of available space is a bit tricky due to the way \TEX\
+works. But let's assume that this can be done, in \CONTEXT\ we have seen several
+strategies for this, we then end up at the top of the next page and there
+different spacing rules apply, like: no spacing at the top at all. In our
+examples no whitespace between paragraphs is present. The final solutions are
+complicated by the fact that we need to take this into account.
+
+Challenge: Make sure that we never run off the page but also that we
+don't end up with weird situations at the top of the next page.
+
+Another possibility is that images so tightly fit a whole number of lines, that a
+next one can come too close to a previous one. Again, this demands some analysis.
+Here we use examples with captions but when there are no captions, there is also
+less visual space (no depth in lines).
+
+Challenge: Make sure that a following insert never runs too close to a previous
+insert.
+
+Solutions can be made better when we use multi|-|pass information. Because in a
+typical \TEX\ run there is only looking back, storing information can actually
+make us look forward. But, as in science fiction: when you act upon the future,
+the past becomes different and therefore also the future (after that particular
+future). This means that you can only go forward. Say you have 10 cases: when
+case 5 changes because of some feedback, then case 6 upto 10 also can change. So,
+you might need more than 10 runs to get things right. In a workflow where users
+are waiting for a result, and a few hundred side floats are used this doesn't
+sell well: processing 400 pages with a 20 page per second rate takes 20 seconds
+per run. Normally one needs a few runs to get the references right. Assuming a
+worst case of 60 seconds, 10 extra runs will bring you close to 15 minutes. No
+deal.
+
+Of course one can argue for some load|-|in|-|memory and optimize in one go, but
+although \TEX\ can do that well for paragraphs, it won't work for complex
+documents. Sure, it's a nice academic exercise to explore limited cases but
+those are not what we encounter.
+
+\stopsection
+
+\startsection[title={Cooperation}]
+
+When discussing (on YouTube) \quotation {Extending Darwin's Revolution} David
+Sloan Wilson and Robert Sapolsky touch on the fact that in some disciplines (like
+economics) evolutionary principles are applied. One can apply for instance the
+concept of a \quote {selfish gene}. However, they argue that when doing that, one
+actually lags behind the now accepted group selection (which goes beyond the
+individual benefits). An example is given where aggressive behavior on the short
+term can turn one in a winner (who takes it all) but which can lead to self
+destructive in the long run: cooperating seems to works better than terminal
+competition.
+
+In \TEX\ we have glues and penalties. The machinery likes to break at a glue but
+a severe penalty can prohibit that. The fact that we have penalties and no
+rewards is interesting: a break can be stimulated by a negative penalty. I've
+forgotten most of what I learned about cognitive psychology but I do remember
+that penalty vs reward discussions could get somewhat out of hand.
+
+So, when we have in the node list a mix of glue (you can break here), penalties
+(better not break here) and rewards (consider breaking here) you can imagine that
+these nodes compete. The optimal solution is not really a group process but
+basically a rather selfish game. Building a system around that kind of
+cooperation is not easy. In \CONTEXT\ a lot of attention always went into
+consistent vertical spacing. In \MKII\ there were some \quote {look back} and
+\quote {control forward} mechanisms in place, and in \MKIV\ we use a model of
+weighted glue: a combination of penalties and skips. Again we look back and again
+we also try to control the future. This works reasonable well but what if we end
+up in a real competition?
+
+A section head should not end up at the bottom of a page. Because when it gets
+typeset it is unknown what follows, it does some checking and then tries to make
+sure that there is no page break following. Of course there needs to be a
+provision for the cases that there are many (sub)heads and of course when there
+are only heads on a page (in a concept for instance) you don't want to run of the
+page.
+
+Similar situations arise with for instance itemized lists and the tabulate
+mechanism. There we have some heuristics that keep content together in a way that
+makes sense given the construct: no single table line at the bottom of a page
+etc. But then comes the side float. The available space is checked. When doing
+that the whitespace following the section head has to collapse with the space
+around the image, but of course at the top of a page spacing is different. So,
+calculations are done, but even a small difference between what is possible and
+what is needed can eventually still trigger an unwanted page break. This is
+because you cannot really ask how much has been accumulated so far: the space
+used is influenced by what comes next (like whitespace, maybe interline space,
+the previous depth correction, etc). That in turn means that you have to (sort
+of) trigger these future space related items to be applied already.
+
+Challenge: Let the side float mechanism nicely cooperate with other mechanisms
+that have their own preferences for crossing pages, adding whitespace and being
+bound to following content.
+
+\stopsection
+
+\startsection[title={Easy bits}]
+
+Of course, once there is such a mechanism in place, user demands will trigger
+more features. Most of these are actually not that hard to deal with: renumbering
+due to moved content, automatic anchoring to the inner or outer margin,
+horizontal placement and shifting into margins, etc. Everything that doesn't
+relate to vertical placement is rather trivial to deal with, especially when the
+whole infrastructure for that is already present (as in \CONTEXT). The problem
+with such extensions is that one can easily forget what is possible because most
+are rarely used.
+
+Challenge: Make sure that all fits into an understandable model and is easy to
+control.
+
+\stopsection
+
+\startsection[title={Conclusion}]
+
+The side float mechanism in \CONTEXT\ is complex, has many low level options, and
+its code doesn't look pretty. It is probably the mechanism that has been
+overhauled and touched most in the code base. It is also the mechanism that
+(still) can behave in ways you don't expect when combined with other mechanisms.
+The way we deal with this (if needed) is to add directives to (in our case) \XML\
+files that tells the engine what to do. Because that is a last resort it is only
+needed when making the final product. So in the end, we're still have the
+benefits of automated typesetting.
+
+Of course we can come up with a different model (basically re|-|implement the
+page builder) but apart from much else falling apart, it will just introduce
+other constraints and side effects. Thinking in terms of selfish nodes, glues and
+penalties, works ok for a specific document where one can also impose usage
+rules. If you know that a section head is always followed by regular text, things
+become easier. But in a system like \CONTEXT\ you need to update your thinking to
+group selection: mechanisms have to work together and that can be pretty
+complicated. Some mechanisms can do that better than others. One outcome can be
+that for instance side floats are not really group players, so eventually they
+might become less popular and fade away. Of course, as often, years later they
+get rediscovered and the cycle starts again. Maybe a string argument can be made
+that in fully automated typesetting concepts like side floats should not be used
+anyway.
+
+If I have to summarize this wrap up, the conclusion is that we should be
+realistic: we're not dealing with an expert system, but with a bunch of
+heuristics. You need an intelligent system to help you out of deadlock and
+oscillating solutions. Given the different preferences you need a multiple
+personality system. You might actually need a system that wraps your expectations
+and solutions and that adapts to changes in those over time. But if there is such
+a system (some day) it probably doesn't need you. In fact, maybe even typesetting
+is not needed any more by then.
+
+\stopsection
+
+\stopchapter
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/musings/musings-whytex.tex b/Master/texmf-dist/doc/context/sources/general/manuals/musings/musings-whytex.tex
index 8f9b7de9b15..97dc0628514 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/musings/musings-whytex.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/musings/musings-whytex.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us runpath=texruns:manuals/musings
\startcomponent musings-whytex
@@ -6,6 +6,12 @@
\startchapter[title={Why use \TEX ?}]
+\startlines \setupalign[flushright]
+Hans Hagen
+Hasselt NL
+July 2021 (public 2023)
+\stoplines
+
\startsection[title={Introduction}]
Let's assume that you know what \TEX\ is: a program that interprets a language
@@ -15,16 +21,17 @@ a button and get some typeset result in return. After a while you start tweaking
this black box, meet other users (on the web), become more fluent and stick to it
forever.
-But now let's assume that you don't know \TEX\ and are in search of a system
-that helps you create beautiful documents in an efficient way. When your
-documents have a complex structure you are probably willing to spend some time on
-figuring out what the best tool is. Even if a search lets you end up with
-something called \TEX, a three letter word with a dropped E, you still don't
-know what it is. Advertisement for \TEX\ is often pretty weak. It's rather easy
-to point to the numerous documents that can be found on the web. But what exactly
-does \TEX\ do and what are its benefits? In order to answer this we need to know
-who you are: an author, editor, an organization that deals with documents or needs
-to generate readable output, like publishers do.
+But now let's assume that you don't know \TEX\ and are in search of a system that
+helps you create beautiful documents in an efficient way. When your documents
+have a complex structure you are probably willing to spend some time on figuring
+out what the best tool is. Even if a search lets you end up with something called
+\TEX, a three letter word with a dropped E, you still don't know what it is. It
+helps to search for \type {\TeX} which is pronounced as \type {tech}.
+Advertisement for \TEX\ is often pretty weak. It's rather easy to point to the
+numerous documents that can be found on the web. But what exactly does \TEX\ do
+and what are its benefits? In order to answer this we need to know who you are:
+an author, editor, an organization that deals with documents or needs to generate
+readable output, like publishers do.
\stopsection
@@ -37,7 +44,6 @@ by \TEX\ look great.} but they do advocate that for rendering math it is a prett
good system. The source code of these documents often look rather messy and
unattractive and for a non|-|math user it can be intimidating. Choosing some
lightweight click|-|and|-|ping alternative looks attractive.
-lightweight click|-|and|-|ping alternative looks attractive.
Making \TEX\ popular is not going to happen by convincing those who have to write
an occasional letter or report. They should just use whatever suits them. On the
@@ -79,7 +85,7 @@ an obvious choice, but if you're a bit able to use it it's hard to beat in
quality, flexibility and efficiency. I'm often surprised that companies are
willing to pay a fortune for functionality that basically comes for free.
Programmers are accustomed to running commands and working in a code editor with
-syntax highlighting so that helps too. They too recognize when something can be
+syntax highlighting so that helps too. They also recognize when something can be
done more efficiently.
When you need to go from some kind of input (document source, database,
@@ -222,17 +228,17 @@ philosophy and we like the community. It is actually not really giving us an
advantage commercially: it costs way more to develop, support and keep
up|-|to|-|date than it will ever return. We can come up with better, faster and
easier solutions and in the end we pay the price because it takes less time to
-cook up styles. So there is some backslash involved because commercially a
+cook up styles. So there is some back slash involved because commercially a
difficult solution leads to more billable hours. Luckily we tend to avoid wasting
time so we improve when possible and then it ends up in the distributed code.
And, once the solution is there, anyone can use it. Basically also for us it's
-just a tool, like the operating system, editor and viewer are. So, what keep
+just a tool, like the operating system, editor and viewer are. So, what keeps
development going is mostly the interaction with the community. This also means
-that a customer can't really demand functionality for free: either wait for it to
-show up or pay for it (which seldom happens). Open source is not equivalent with
-\quotation {You get immediately what you want because someone out there writes
-the code.}. There has to be a valid reason and often it's just users and meetings
-or just some challenge that drives it.
+that a customer can't really demand functionality for free: either do it
+yourself, wait for it to show up, or pay for it (which seldom happens). Open
+source is not equivalent with \quotation {You get immediately what you want
+because someone out there writes the code.}. There has to be a valid reason and
+often it's just users and meetings or just some challenge that drives it.
This being said, it is hard to convince a company to use \TEX. It has to come
from users in the organization. Or, what we sometimes see with publishers, it
@@ -307,17 +313,18 @@ message.
The \TEX\ ecosystem was among the first in supporting for instance \OPENTYPE, and
the community even made sure that there were free fonts available. A format like
-\PDF\ was supported as soon as it shows up and \TEX\ was the first to demonstrate
-what advanced features were there and how way it was to adapt to changes.
-Processing \XML\ using \TEX\ has never been a big deal and if that is a reason to
-look at this already old and mature technology, then an organization can wonder
-if years and opportunities (for instance for publishing on demand or easy
-updating of manuals) have been lost. Of course there are (and have been)
-alternative tools but the arguments for using \TEX\ or not are not much different
-now. It can be bad marketing of open and free software. It can be that \TEX\ has
-been around too long. It can also be that its message was not understood yet. On
-the other hand, in software development it's quite common to reinvent wheels and
-present old as new. It's never to late to catch on.
+\PDF\ was supported as soon as it showed up and \TEX\ was the first to
+demonstrate what advanced features were there and it shows again how it is
+possible to adapt \TEX\ to changes in its environment. Processing \XML\ using
+\TEX\ has never been a big deal and if that is a reason to look at this already
+old and mature technology, then an organization can wonder if years and
+opportunities (for instance for publishing on demand or easy updating of manuals)
+have been lost. Of course there are (and have been) alternative tools but the
+arguments for using \TEX\ or not are not much different now. It can be bad
+marketing of open and free software. It can be that \TEX\ has been around too
+long. It can also be that its message was not understood yet. On the other hand,
+in software development it's quite common to reinvent wheels and present old as
+new. It's never too late to catch on.
\stopsection
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 687fcdb50f0..13bf4f4ef93 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
@@ -1,3 +1,5 @@
+% language=us runpath=texruns:manuals/musings
+
\environment musings-style
\startproduct musings
@@ -18,9 +20,14 @@
\component musings-roadmap
\component musings-names
\component musings-plain
- % \component musings-performance
+ \component musings-toocomplex
+ % \component musings-manuals
+ \component musings-performance
% \component musings-history
% \component musings-treasures
+ % \component musings-whytex-again
+ \component musings-dontusetex
+ \component musings-speed
\stopbodymatter
\stopproduct
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/nodes/nodes.tex b/Master/texmf-dist/doc/context/sources/general/manuals/nodes/nodes.tex
index 2d97e676a4a..2059ae1bc99 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/nodes/nodes.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/nodes/nodes.tex
@@ -1,4 +1,4 @@
-% interface=english modes=screen
+% language=us runpath=texruns:manuals/nodes
% author : Alan Braslau
% copyright : ConTeXt Development Team
@@ -739,7 +739,7 @@ first view, but it simplifies things in the end, really!
To avoid such confusion, in particular when drawing complicated diagrams
containing many nodes, the \CONTEXT\ interface allows the use of a \type
-{reference} or tag, assigning a symbolic name to a numbered node. The example of
+{reference} or tag, assigning a symbolic name to a numbered node. The example of
\in{Figure} [fig:ConTeXt] can be redrawn a little more verbosely as:
\startbuffer
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/notnow/notnow-columns-and-notes.tex b/Master/texmf-dist/doc/context/sources/general/manuals/notnow/notnow-columns-and-notes.tex
index 336c39480d5..24290fc20dd 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/notnow/notnow-columns-and-notes.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/notnow/notnow-columns-and-notes.tex
@@ -1,3 +1,5 @@
+% language=us runpath=texruns:manuals/notnow
+
\usemodule[art-01]
\starttext
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/notnow/notnow-sidefloats.tex b/Master/texmf-dist/doc/context/sources/general/manuals/notnow/notnow-sidefloats.tex
index c7de6c2c57f..3c454d367fd 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/notnow/notnow-sidefloats.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/notnow/notnow-sidefloats.tex
@@ -1,3 +1,5 @@
+% language=us runpath=texruns:manuals/notnow
+
\usemodule[art-01]
\definefloat
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/notnow/notnow.tex b/Master/texmf-dist/doc/context/sources/general/manuals/notnow/notnow.tex
index e1768db41a2..d50c10f1074 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/notnow/notnow.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/notnow/notnow.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us runpath=texruns:manuals/notnow
\usemodule[typesetting]
@@ -128,6 +128,26 @@ already complex code more than needed. Also, it will never be perfect anyway.
\stopchapter
+\startchapter[title=Sidefloats]
+
+Support for side floats is non|-|trivial and no solution will serve all intended
+usage. Over the years we have improved on border cases but it is still not
+perfect. For that reason the implementation is (apart from solving bugs, mostly) frozen.
+Here is an example of a use case that we ran into. We manipulate the spacing with
+an offset parameter.
+
+\typefile{notnow-sidefloats.tex}
+
+You can best play with these parameters and see what they do. If you use this
+mechanism in a long term project, use a frozen instance of \CONTEXT !
+
+\TwoPages{notnow-sidefloats}
+
+The second pages has preceding and trailing whitespace outside the sidefloat
+flow.
+
+\stopchapter
+
\startpagemakeup[pagestate=stop,page=left,doublesided=no]
\scale[width=\paperwidth,height=\paperheight] \bgroup
\bTABLE[strut=no,height=29.7pt,width=21pt,align={lohi,middle},foregroundcolor=white,framecolor=white,background=color]
@@ -152,24 +172,4 @@ already complex code more than needed. Also, it will never be perfect anyway.
\egroup
\stoppagemakeup
-\startchapter[title=Sidefloats]
-
-Support for side floats is non|-|trivial and no solution will serve all intended
-usage. Over the years we have improved on border cases but it is still not
-perfect. For that reason the implementation is (apart from solving bugs, mostly) frozen.
-Here is an example of a use case that we ran into. We manipulate the spacing with
-an offset parameter.
-
-\typefile{notnow-sidefloats.tex}
-
-You can best play with these parameters and see what they do. If you use this
-mechanism in a long term project, use a frozen instance of \CONTEXT !
-
-\TwoPages{notnow-sidefloats}
-
-The second pages has preceding and trailing whitespace outside the sidefloat
-flow.
-
-\stopchapter
-
\stopdocument
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/onandon/onandon-110.tex b/Master/texmf-dist/doc/context/sources/general/manuals/onandon/onandon-110.tex
index e8b005f2405..b9f661d1ddf 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/onandon/onandon-110.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/onandon/onandon-110.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
% After watching \quotation {What Makes This Song Great 30: Alanis Morisette} by
% Rick Beato, it's tempting to poder \quotation {What makes \TEX\ great}.
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 c724bf810d2..64b8451a1cd 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
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
\startcomponent onandon-53
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/onandon/onandon-decade.tex b/Master/texmf-dist/doc/context/sources/general/manuals/onandon/onandon-decade.tex
index 890668a5ce2..c7e5d72c432 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/onandon/onandon-decade.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/onandon/onandon-decade.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
\startcomponent onandon-decade
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/onandon/onandon-editing.tex b/Master/texmf-dist/doc/context/sources/general/manuals/onandon/onandon-editing.tex
index c8482397eca..efd0691a2ec 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/onandon/onandon-editing.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/onandon/onandon-editing.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
\startcomponent onandon-editing
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/onandon/onandon-emoji.tex b/Master/texmf-dist/doc/context/sources/general/manuals/onandon/onandon-emoji.tex
index 0a89727a19b..0bd36f45290 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/onandon/onandon-emoji.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/onandon/onandon-emoji.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
\usemodule[fonts-emoji]
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 9d5458fe909..99573dc0f24 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
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
\startcomponent onandon-execute
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/onandon/onandon-expansion.tex b/Master/texmf-dist/doc/context/sources/general/manuals/onandon/onandon-expansion.tex
index 73a0b495374..a25b7524660 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/onandon/onandon-expansion.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/onandon/onandon-expansion.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
\startcomponent onandon-expansion
@@ -75,6 +75,11 @@ the other with user defined conditions. The first one relates directly to
expansion, the second one concerns conditions and relates more to parsing
branches which on purpose avoids expansion.
+{\em In the meantime \LUAMETATEX\ has a slightly different implementation which
+goes under the umbrella \quote {local control}. We show both ways here. The
+example where two token lists are compared can be done easier with \type
+{\iftok}.}
+
For the first one I use some silly examples. I must admit that although I can
envision useful application, I really need to go over the large amount of
\CONTEXT\ source code to really find a place where it is making things better.
@@ -106,8 +111,14 @@ 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
+% luatex
+
\def\TestMe{\immediateassignment\advance\NumberOfCalls1 }
+% luametatex
+
+\def\TestMe{\localcontrolled{\advance\NumberOfCalls1 }}
+
\edef\Tested{\TestMe bar:\the\NumberOfCalls}
\edef\Tested{\TestMe bar:\the\NumberOfCalls}
\edef\Tested{\TestMe bar:\the\NumberOfCalls}
@@ -126,7 +137,9 @@ Here is a somewhat silly example of an expanded comparison of two \quote
{strings}:
\startbuffer
-\def\expandeddoifelse#1#2#3#4%
+% luatex
+
+\def\ExpandedDoifElse#1#2#3#4%
{\immediateassignment\edef\tempa{#1}%
\immediateassignment\edef\tempb{#2}%
\ifx\tempa\tempb
@@ -136,9 +149,21 @@ Here is a somewhat silly example of an expanded comparison of two \quote
\fi
\next}
+% luametatex
+
+\def\ExpandedDoifElse#1#2#3#4%
+ {\localcontrolled{\edef\tempa{#1}}%
+ \localcontrolled{\edef\tempb{#2}}%
+ \ifx\tempa\tempb
+ \localcontrolled{\def\next{#3}}%
+ \else
+ \localcontrolled{\def\next{#4}}%
+ \fi
+ \next}
+
\edef\Tested
- {(\expandeddoifelse{abc}{def}{yes}{nop}/%
- \expandeddoifelse{abc}{abc}{yes}{nop})}
+ {(\ExpandedDoifElse{abc}{def}{yes}{nop}/%
+ \ExpandedDoifElse{abc}{abc}{yes}{nop})}
\meaning\Tested
\stopbuffer
@@ -162,7 +187,9 @@ In addition to this one|-|time immediate assignment a pseudo token list variant
is provided, so the above could be rewritten to:
\starttyping
-\def\expandeddoifelse#1#2#3#4%
+% luatex
+
+\def\ExpandedDoifElse#1#2#3#4%
{\immediateassigned {
\edef\tempa{#1}
\edef\tempb{#2}
@@ -173,6 +200,20 @@ is provided, so the above could be rewritten to:
\immediateassignment\def\next{#4}%
\fi
\next}
+
+% luametatex
+
+\def\ExpandedDoifElse#1#2#3#4%
+ {\beginlocalcontrol
+ \edef\tempa{#1}
+ \edef\tempb{#2}
+ \endlocalcontrol
+ \ifx\tempa\tempb
+ \localcontrolled{\def\next{#3}}%
+ \else
+ \localcontrolled{\def\next{#4}}%
+ \fi
+ \next}
\stoptyping
While \tex {expanded} first builds a token lists that then gets used, the \tex
@@ -261,18 +302,35 @@ previously mentioned immediate assignment. Here is another example:
The previously defined comparison macro can now be rewritten as:
\starttyping
-\def\equaltokens#1#2%
+% luatex
+
+\def\EqualTokens#1#2%
{\immediateassignment\edef\tempa{#1}%
\immediateassignment\edef\tempb{#2}%
\ifx\tempa\tempb}
-\def\expandeddoifelse#1#2#3#4%
- {\ifcondition\equaltokens{#1}{#2}%
+\def\ExpandedDoifElse#1#2#3#4%
+ {\ifcondition\EqualTokens{#1}{#2}%
\immediateassignment\def\next{#3}%
\else
\immediateassignment\def\next{#4}%
\fi
\next}
+
+% luametatex
+
+\def\EqualTokens#1#2%
+ {\localcontrolled{\edef\tempa{#1}}%
+ \localcontrolled{\edef\tempb{#2}}%
+ \ifx\tempa\tempb}
+
+\def\ExpandedDoifElse#1#2#3#4%
+ {\ifcondition\EqualTokens{#1}{#2}%
+ \localcontrolled{\def\next{#3}}%
+ \else
+ \localcontrolled{\def\next{#4}}%
+ \fi
+ \next}
\stoptyping
When used this way it will of course also work without the \tex {ifcondition} but
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/onandon/onandon-fences.tex b/Master/texmf-dist/doc/context/sources/general/manuals/onandon/onandon-fences.tex
index 133b9bfeb32..76ade938edd 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/onandon/onandon-fences.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/onandon/onandon-fences.tex
@@ -1,4 +1,9 @@
-% language=uk
+% language=us
+
+% This feature has been removed because we have different control now in the
+% reworked engine so this chapter cnanot be processed any longer.
+
+\endinput
\startcomponent onandon-fences
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/onandon/onandon-ffi.tex b/Master/texmf-dist/doc/context/sources/general/manuals/onandon/onandon-ffi.tex
index 01c1bb4c550..a3dd2cedaef 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/onandon/onandon-ffi.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/onandon/onandon-ffi.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
\startcomponent onandon-ffi
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/onandon/onandon-media.tex b/Master/texmf-dist/doc/context/sources/general/manuals/onandon/onandon-media.tex
index f44c3bb1984..c6750d3f7d5 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/onandon/onandon-media.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/onandon/onandon-media.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
\startcomponent onandon-media
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/onandon/onandon-modern.tex b/Master/texmf-dist/doc/context/sources/general/manuals/onandon/onandon-modern.tex
index 65b5d0490f5..5be2e845282 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/onandon/onandon-modern.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/onandon/onandon-modern.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
% 284 instances, 234 shared in backend, 126 common vectors, 108 common hashes, load time 1.343 seconds
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/onandon/onandon-performance.tex b/Master/texmf-dist/doc/context/sources/general/manuals/onandon/onandon-performance.tex
index b1b34443d41..10c98142c45 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/onandon/onandon-performance.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/onandon/onandon-performance.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
% no zero timing compensation, just simple tests
% m4all book
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/onandon/onandon-runtoks.tex b/Master/texmf-dist/doc/context/sources/general/manuals/onandon/onandon-runtoks.tex
index b3adeb4a5db..0a88c13fc2b 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/onandon/onandon-runtoks.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/onandon/onandon-runtoks.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
\startcomponent onandon-amputating
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/onandon/onandon-seguiemj.tex b/Master/texmf-dist/doc/context/sources/general/manuals/onandon/onandon-seguiemj.tex
index eff8a6acbec..b51d5c44110 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/onandon/onandon-seguiemj.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/onandon/onandon-seguiemj.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
\environment onandon-environment
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/onandon/onandon-variable.tex b/Master/texmf-dist/doc/context/sources/general/manuals/onandon/onandon-variable.tex
index c308864e68e..aa44567bbdb 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/onandon/onandon-variable.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/onandon/onandon-variable.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
% todo: callback: stream, llx, lly, urx, ury, wd, lsb
% add glyphs runtime
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/onandon/onandon.tex b/Master/texmf-dist/doc/context/sources/general/manuals/onandon/onandon.tex
index 00b01f9aebd..7ea81205da2 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/onandon/onandon.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/onandon/onandon.tex
@@ -1,5 +1,5 @@
% author : Hans Hagen
-% copyright : PRAGMA ADE & ConTeXt Development Team
+% copyright : ConTeXt Development Team
% license : Creative Commons Attribution ShareAlike 4.0 International
% reference : pragma-ade.nl | contextgarden.net | texlive (related) distributions
% origin : the ConTeXt distribution
@@ -39,7 +39,7 @@
\component onandon-emoji
\component onandon-performance
\component onandon-editing
- \component onandon-fences % first published in user group magazines
+ % \component onandon-fences % first published in user group magazines / obsolete
\component onandon-media
\component onandon-53 % first published in user group magazines
\component onandon-execute % first published in user group magazines
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/ontarget/ontarget-alsomath.tex b/Master/texmf-dist/doc/context/sources/general/manuals/ontarget/ontarget-alsomath.tex
new file mode 100644
index 00000000000..19acc43d3f0
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/ontarget/ontarget-alsomath.tex
@@ -0,0 +1,90 @@
+% language=us runpath=texruns:manuals/ontarget
+
+\startcomponent ontarget-alsomath
+
+\environment ontarget-style
+
+\startchapter[title={The curious case of \type {\over}}]
+
+Normally \TEX\ scans forward but there are a few special cases. First of all,
+\TEX\ is either scanning regular content or it is scanning alignments. That
+results in intercepts in all kind of places. When a row ends, scanning for
+inter|-|row actions happens. When the preamble is scanned there is some lookahead
+with partial expansion. This has side effects but these can be avoided in
+\LUAMETATEX\ by several options. Another special case is math mode. Normally
+curly braces indicate grouping but not in math mode: there they construct an
+atom, ordinary by default. Although most math constructs actually pick up some
+following atom, in which case we get a wrapped construct that actually is
+processed in a nested cal to the math processing routine. That whole has a class
+and although in \LUAMETATEX\ we can make atoms with a different left end right
+class, normally what is inside is hidden stays hidden. \footnote {We can think of
+optionally exposing the edge classes but although it is easy to implement we see
+no reason to do that now. After all, the information is actually available
+already via variables.}
+
+Fraction commands like \type {\over} and \type {\above} are used like this:
+
+\starttyping
+a + 1 \over 2 + b
+\stoptyping
+
+and as there can be more than for instance single digits we can do:
+
+\starttyping
+a + {12} \over {34} + b
+\stoptyping
+
+but it doesn't end there because you actually need to wrap:
+
+\starttyping
+a + {{12} \over {34}} + b
+\stoptyping
+
+If you don't do this $b$ will become part of the fraction. The curly braces here
+make the $12$, $34$ and the whole fraction made from them ordinary atoms. Because
+that also influences spacing one should be aware of side effects.
+
+\starttyping
+a + {{12} \over {34}} + b
+\stoptyping
+
+The argument of \type {simplicity} of input is easily defeated by using
+
+\starttyping
+a + \frac{12}{34} + b
+\stoptyping
+
+because it also reads sequential, is in sync with other commands like \type
+{\sqrt} and actually uses less tokens. It used more runtime, also because
+\CONTEXT\ adds plenty of control and extras but you won't notice it.
+
+Because in \CONTEXT\ we assume users to use \type {\frac} it made sense to see if
+we can make curly braces act like groups. In \LUAMETATEX\ we already have \type
+{\beginmathgroup} and \type {\endmathgroup} that provide grouping with mathstyle
+recovery, and by setting \type {\mathgroupingmode} to a non|-|zero value curly
+braces will act like these.
+
+The effects are subtle:
+
+\showmakeup[mathglue]
+
+\startbuffer
+$ a + { \bf x } ^ 2 + {\bf 1} + {\red 123} +
+\frac{1}{2} + {\scriptstyle 123} + \dd $
+\stopbuffer
+
+\typebuffer
+
+\startcombination[1*2]
+ {\scale[scale=2500]{\showmakeup[mathglue] \mathgroupingmode 0 \getbuffer}} {\type {\mathgroupingmode 0}}
+ {\scale[scale=2500]{\showmakeup[mathglue] \mathgroupingmode 1 \getbuffer}} {\type {\mathgroupingmode 1}}
+\stopcombination
+
+If you see the differences you might be happy with this new trick, if not, you
+probably are not that much into optimal math spacing anyway and you can forget
+about what you just read.
+
+\stopchapter
+
+\stopcomponent
+
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/ontarget/ontarget-anchoring.tex b/Master/texmf-dist/doc/context/sources/general/manuals/ontarget/ontarget-anchoring.tex
new file mode 100644
index 00000000000..4cdb7295099
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/ontarget/ontarget-anchoring.tex
@@ -0,0 +1,280 @@
+% language=us runpath=texruns:manuals/ontarget
+
+\startcomponent ontarget-eventually
+
+\environment ontarget-style
+
+\startchapter[title={Anchoring}]
+
+\startsection[title=Introduction]
+
+It is valid to question what functionality should be in the engine and what can
+best be implemented using callbacks and postprocessing of lists (and boxes)
+relying for instance on attributes as signals. In \LUATEX\ we are rather strict
+in this and assume that the second method is used. In \LUAMETATEX\ we still
+promote this but at the same time some (lightweight) functionality has been added
+to the engine that helps implementing some features more efficiently. Reasons are
+that it can be handy to carry (fundamental) properties around that are bound to
+nodes and that we can set them using primitives, especially for glyphs and boxes.
+That way they become part of the formal functionality that one can argue should
+be present in a modern engine. Examples for glyph nodes are scales, offsets and
+hyphenation, detailed ligature and kerning control. For box nodes we have for
+instance offsets and orientation. Most of these are always taken into account by
+core mechanisms like breaking paragraphs into lines, where dimensions matter in
+which case it really makes sense for them to be part of the engine design.
+
+Some properties are just passed on to for instance a font handler or the backend
+but still they belong to the core functionality. An example of the later is a
+(new) simple mechanism for anchoring boxes. This is not really a fundamental
+feature, because one can just move content around using a combination of kerning
+and boxing, either or not with offsets. But because we already have features like
+offsets to boxes it was not that much work to add anchoring as a more fundamental
+property. The frontend is agnostic to this feature because dimensions are kind of
+virtual here: the backend however carries the real burden. Because backends are
+written in \LUA\ it might have a performance hit simply because at least we need
+to check if this feature is used. Normally that can compensated when this feature
+{\em is} used because less work and shuffling around happens in the frontend. And
+when this feature is no longer experimental (and stays) we can gain some back by
+using it in existing scenarios. It sounds worse than it is because for
+orientations we already have to do some usage checking and we can share that
+check; in most situations nothing needs to be done anyway.
+
+\stopsection
+
+\startsection[title=The low level approach]
+
+When we anchor, a box can be a source and|/|or a target. Both are represented by
+a number and can be assigned via a keyword. These numbers can be picked up by the
+backend. Here is an example:
+
+\startbuffer
+\def\TestMe#1{%
+ \setbox \scratchbox \ruledvbox
+ source 123
+ orientation #1
+ \bgroup
+ \hsize7cm
+ \samplefile{zapf}
+ \hbox to 0pt
+ source 124 target 123
+ xoffset 20pt yoffset -30pt
+ {\darkred \bfc TEST1}%
+ \hbox to 0pt
+ source 125 target 124
+ xoffset 10pt yoffset -20pt
+ {\darkblue \bfc TEST2}%
+ \egroup
+ \box \scratchbox
+}
+\stopbuffer
+
+\typebuffer \getbuffer
+
+This example also uses a few offsets. The \quote {origin} is at the left edge of
+the baseline. Now, we could have passed the source and target as attribute and
+intercepting an attribute in the backend can work pretty well. However, the code
+that deals with the final result of the typesetting and thereby flushes it to for
+instance a \PDF\ file is, at least that is the setup we use in \CONTEXT,
+attribute agnostic. Mixing in attributes at that stage, except for user nodes and
+whatsits that are effectively plugins, is counter intuitive and all is already
+pretty complex so a clear separation of functionality makes a lot of sense. Of
+course the \CONTEXT\ approach is not the only one when it comes to generic engine
+functionality. Not that many fundamental (conceptual) extensions showed up over
+the last few decades so no one will bother if in \LUAMETATEX\ we have new stuff
+that is only used by \CONTEXT. The example code shown here gives:
+
+\startbuffer[four]
+\startcombination[4*1]
+ {\scale[sx=.4,sy=.4]{\TestMe{0}}} {\type {orientation 0}}
+ {\scale[sx=.4,sy=.4]{\TestMe{1}}} {\type {orientation 1}}
+ {\scale[sx=.4,sy=.4]{\TestMe{2}}} {\type {orientation 2}}
+ {\scale[sx=.4,sy=.4]{\TestMe{3}}} {\type {orientation 3}}
+\stopcombination
+\stopbuffer
+
+\startlinecorrection
+\dontcomplain\getbuffer[four]
+\stoplinecorrection
+
+In order to avoid additional shifting around, which then might involve copying
+and injecting boxes as well as repackaging, two additional keys are available
+and these deal with the way boxes get anchored.
+
+\startbuffer
+\vbox
+ source 123
+ \bgroup
+ \offinterlineskip
+ \blackrule[width=4cm,height=2cm,depth=0cm,color=darkred]\par
+ \blackrule[width=4cm,height=0cm,depth=1cm,color=darkblue]\par
+ \setbox\scratchboxtwo\hbox
+ anchors "0004 "0001
+ % anchor "00040001
+ target 123
+ orientation 1
+ {\blackrule[width=2cm,height=1cm,depth=0cm,color=darkgreen]%
+ \hskip-2cm
+ \blackrule[width=2cm,height=0cm,depth=1cm,color=darkyellow]}%
+ %
+ \smash{\box\scratchboxtwo}%
+ \egroup
+\stopbuffer
+
+\typebuffer
+
+The anchor is just an number but with the plural keyword we can scan it as two
+because that is a bit easier on usage. The two numbers four byte numbers control
+the source to target anchoring and there is plenty room for future extensions
+because not all bits are used.
+
+\starttabulate[|lT|lT|]
+\NC 0x00\uchexnumber\leftoriginlistanchorcode \NC left origin \NC \NR
+\NC 0x00\uchexnumber\leftheightlistanchorcode \NC left height \NC \NR
+\NC 0x00\uchexnumber\leftdepthlistanchorcode \NC left depth \NC \NR
+\NC 0x00\uchexnumber\rightoriginlistanchorcode \NC right origin \NC \NR
+\NC 0x00\uchexnumber\rightheightlistanchorcode \NC right height \NC \NR
+\NC 0x00\uchexnumber\rightdepthlistanchorcode \NC right depth \NC \NR
+\NC 0x00\uchexnumber\centeroriginlistanchorcode \NC center origin \NC \NR
+\NC 0x00\uchexnumber\centerheightlistanchorcode \NC center height \NC \NR
+\NC 0x00\uchexnumber\centerdepthlistanchorcode \NC center depth \NC \NR
+\NC 0x00\uchexnumber\halfwaytotallistanchorcode \NC halfway total \NC \NR
+\NC 0x00\uchexnumber\halfwayheightlistanchorcode \NC halfway height \NC \NR
+\NC 0x00\uchexnumber\halfwaydepthlistanchorcode \NC halfway depth \NC \NR
+\NC 0x00\uchexnumber\halfwayleftlistanchorcode \NC halfway left \NC \NR
+\NC 0x00\uchexnumber\halfwayrightlistanchorcode \NC halfway right \NC \NR
+\stoptabulate
+
+The target and source are handled in a way that sort of naturally binds them
+which involves a little juggling with dimensions in the backend. There is some
+additional control over this but usage is not advertized here because it might
+change.
+
+% \negatexlistsigncode \negateylistsigncode \negatelistsigncode
+
+One can set these anchoring related properties with keywords but there are also
+primitive box manipulators: \type {\boxanchor}, \type {\boxanchors}, \type
+{\boxsource} and \type {\boxtarget} that take a box number and value.
+
+\startlinecorrection
+\getbuffer
+\stoplinecorrection
+
+There are some helpers at the \LUA\ end but I haven't completely made up my mind
+about them. Normally that evolves with usage.
+
+\stopsection
+
+\startsection[title={A first higher level interface}]
+
+Exploring this here in more detail makes no sense because it is still
+experimental and also rather \CONTEXT\ specific. As a teaser an interface that
+hooks into layers is shown:
+
+\startbuffer
+\defineanchorboxoverlay[framed]
+
+\def\DemoAnchor#1#2#3#4%
+ {\setanchorbox
+ [#1]%
+ [target={#3},source={#4}]%
+ \hbox{\backgroundline[#2]{\white\smallinfofont\setstrut\strut target=#3 source=#4}}}
+
+\def\DemoAnchorX#1#2%
+ {\DemoAnchor{#1}{darkred} {#2}{left,top}%
+ \DemoAnchor{#1}{darkblue} {#2}{left,bottom}%
+ \DemoAnchor{#1}{darkgreen} {#2}{right,bottom}%
+ \DemoAnchor{#1}{darkyellow}{#2}{right,top}%
+ }%
+
+\startsetups framed:demo
+ \DemoAnchorX{framed:background}{left,top}%
+ \DemoAnchorX{framed:background}{right,top}%
+ \DemoAnchorX{framed:background}{left,bottom}%
+ \DemoAnchorX{framed:background}{right,bottom}%
+ \DemoAnchorX{framed:foreground}{middle}%
+\stopsetups
+
+\midaligned\bgroup
+ \framed
+ [align=normal,
+ width=.7\textwidth,
+ backgroundcolor=gray,
+ background={color,framed:background,foreground,framed:foreground}]
+ \bgroup
+ \samplefile{zapf}\par
+ \directsetup{framed:demo}%
+ \samplefile{zapf}%
+ \egroup
+\egroup
+\stopbuffer
+
+\typebuffer
+
+Those familiar with \CONTEXT\ will recognize the approach. This one basically is
+a more low level variant of layers and a high level variant of the primitives.
+Performance wise (in terms of memory usage and runtime) it sits in a sweet spot.
+
+\startlinecorrection[2*big]
+ \getbuffer
+\stoplinecorrection
+
+I played a bit with a mechanism that can store the embedded (to be anchored)
+content in a more independent way and it actually works okay. However, I'm not
+entirely sure if that solution is the best so for now it's commented. As usual it
+is also up to users to come up with demands.
+
+\stopsection
+
+\stopchapter
+
+\stopcomponent
+
+% \defineanchorbox[page:background]
+% \defineanchorbox[page:foreground]
+% \defineoverlay[page:background][\overlayanchorbox{page:background}]
+% \defineoverlay[page:foreground][\overlayanchorbox{page:foreground}]
+%
+% \defineanchorboxoverlay[page]
+%
+% \setupbackgrounds[page][background={page:background,foreground,page:foreground}]
+%
+% test
+%
+% \setanchorbox[page:background]\ruledhbox
+% xoffset 200pt
+% yoffset 100pt
+% % anchors \halfwayleftlistanchorcode \halfwayrightlistanchorcode
+% {\blue DOES IT WORK}
+%
+% \setanchorbox[page:foreground]\ruledhbox
+% orientation 2
+% % anchors \halfwayleftlistanchorcode \halfwayrightlistanchorcode
+% {\red DOES IT WORK}
+%
+
+% \registeranchorbox[demo][before]\ruledhbox
+% \registeranchorbox[demo][after]\ruledhbox
+%
+% \defineanchorbox[demo]
+%
+% \startbuffer
+% \vbox
+% source 123
+% \bgroup
+% \offinterlineskip
+% \blackrule[width=4cm,height=2cm,depth=0cm,color=darkred]\par
+% \blackrule[width=4cm,height=0cm,depth=1cm,color=darkblue]\par
+% \registeranchorbox[demo][before]\ruledhbox
+% % \registeranchorbox[demo][after]\ruledhbox
+% anchors "0004 "0001
+% % anchor "00040001
+% target 123
+% orientation 1
+% {\blackrule[width=2cm,height=1cm,depth=0cm,color=darkgreen]%
+% \hskip-2cm
+% \blackrule[width=2cm,height=0cm,depth=1cm,color=darkyellow]}%
+% %
+% \egroup
+% \stopbuffer
+%
+% \typebuffer
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/ontarget/ontarget-binary.tex b/Master/texmf-dist/doc/context/sources/general/manuals/ontarget/ontarget-binary.tex
new file mode 100644
index 00000000000..b3fbff7ec4f
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/ontarget/ontarget-binary.tex
@@ -0,0 +1,99 @@
+% language=us runpath=texruns:manuals/ontarget
+
+\startcomponent ontarget-binary
+
+\environment ontarget-style
+
+\startchapter[title={The binary}]
+
+This is a very short chapter. Because \LUAMETATEX\ is also a script runner, I
+want to keep it lean and mean. So, when the size exceeded 3MB after we'd extended
+the math engine, I decided to (finally) let all the \METAPOST\ number interfaces
+pass pointers which brought down the binary 100K and below the 3MB mark again.
+
+I then became curious about how much of the binary actually is taken by
+\METAPOST, and a bit of calculation indicated that we went from 20.1\percent\ down
+to 18.3\percent. Here is the state per May 13, 2022:
+
+\startluacode
+
+ local bytes = {
+ liblua = 515156,
+ libluaoptional= 103668,
+ libluarest = 82492,
+ libluasocket = 105700,
+ libmimalloc = 178800,
+ libminiz = 51584,
+ libmp = 797636,
+ libmp = 797636, -- went from 20.1% to 18.3% after going more pointers
+ -- libmp = 797636 + (3061799 - 2960091),
+ libpplib = 325162,
+ libtex = 2207190,
+ }
+
+ local comment = {
+ liblua = "lua core, tex interfaces",
+ libluaoptional= "framework, several small interfaces, cerf",
+ libluarest = "general helper libraries",
+ libluasocket = "helper that interfaces to the os libraries",
+ libmimalloc = "memory management partial",
+ libminiz = "minimalistic core",
+ libmp = "mp graphic core, number libraries, lua interfacing",
+ libpplib = "pdf reading core, encryption helpers",
+ libtex = "extended tex core",
+ }
+
+ local luametatex = 2960091
+ local libraries = 0 for k, v in next, bytes do libraries = libraries + v end
+ local normalizer = luametatex/libraries
+
+ local luastuff = bytes.liblua
+ + bytes.libluaoptional
+ + bytes.libluarest
+ + bytes.libluasocket
+
+ -------(luametatex) context.par()
+ -------(libraries) context.par()
+ -------(normalizer) context.par()
+
+ context.starttabulate { "|l|r|r|p|" }
+ context.FL()
+ context.NC() context.bold("component")
+ context.NC() context.bold("pct")
+ context.NC() context.bold("bytes")
+ context.NC() context.bold("comment")
+ context.NC() context.NR()
+ context.ML()
+ for k, v in table.sortedpairs(bytes) do
+ context.NC() context(k)
+ context.NC() context("%.1f",100*v/libraries)
+ context.NC() context(math.round(normalizer*v))
+ context.NC() context(comment[k])
+ context.NC() context.NR()
+ end
+ context.ML()
+ context.NC() context.bold("luametatex")
+ context.NC()
+ context.NC() context.bold(luametatex)
+ context.NC() context("2022-05-13")
+ context.NC() context.NR()
+ context.LL()
+ context.stoptabulate()
+
+ function document.texstuff() context("%.1f\\percent",100 * bytes.libtex /libraries) end
+ function document.mpsstuff() context("%.1f\\percent",100 * bytes.libmp /libraries) end
+ function document.pdfstuff() context("%.1f\\percent",100 * bytes.libpplib/libraries) end
+ function document.luastuff() context("%.1f\\percent",100 * luastuff /libraries) end
+
+\stopluacode
+
+It is clear that the \TEX\ core is good for half of the code (\ctxlua {document .
+texstuff ()}) with the accumulated \LUA\ stuff (\ctxlua {document . luastuff ()})
+and \METAPOST\ being a good second (\ctxlua {document . mpsstuff ()}) and third
+and the \PDF\ interpreting library a decent fourth (\ctxlua {document . pdfstuff
+()}) place.
+
+\stopchapter
+
+\stopcomponent
+
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/ontarget/ontarget-contents.tex b/Master/texmf-dist/doc/context/sources/general/manuals/ontarget/ontarget-contents.tex
new file mode 100644
index 00000000000..f0a733b01d6
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/ontarget/ontarget-contents.tex
@@ -0,0 +1,13 @@
+% language=us runpath=texruns:manuals/ontarget
+
+\startcomponent ontarget-contents
+
+\environment ontarget-style
+
+\starttitle[title={Table of contents}]
+
+ \placelist[chapter]
+
+\stoptitle
+
+\stopcomponent
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/ontarget/ontarget-dk.tex b/Master/texmf-dist/doc/context/sources/general/manuals/ontarget/ontarget-dk.tex
new file mode 100644
index 00000000000..d1df3b8cc7d
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/ontarget/ontarget-dk.tex
@@ -0,0 +1,90 @@
+% language=us runpath=texruns:manuals/ontarget
+
+\startcomponent ontarget-dk
+
+\environment ontarget-style
+
+\startchapter[title={A new unit: \type {dk}}]
+
+At the \CONTEXT\ 2021 meeting I mixed my \TEX\ talks with showing some of the
+(upcoming) \LUAMETATEX\ source code. One evening we had a extension party where a
+new unit was implemented, the \type {dk}. This event was triggered by a remark
+Hraban [Ramm] made on the participants list in advance of the meeting, where he pointed
+to a Wikipedia article from which we quote:
+
+\startquotation
+In issue 33, Mad published a partial table of the \quotation {Potrzebie System of
+Weights and Measures}, developed by 19|-|year|-|old Donald~E. Knuth, later a famed
+computer scientist. According to Knuth, the basis of this new revolutionary
+system is the potrzebie, which equals the thickness of Mad issue 26, or
+2.2633484517438173216473 mm [\dots].
+\stopquotation
+
+So, as the result of that session, the source code now has this comment:
+
+\startquotation
+We support the Knuthian Potrzebie, cf.\ \typ
+{en.wikipedia.org/wiki/Potrzebie}, as the \type {dk} unit. It was added on
+2021-09-22 exactly when we crossed the season during an evening session at the
+15\high {th} \CONTEXT\ meeting in Bassenge (Boirs) Belgium. It took a few
+iterations to find the best numerator and denominator, but Taco Hoekwater, Harald
+Koenig and Mikael Sundqvist figured it out in this interactive session. The error
+messages have been adapted accordingly and the scanner in the \LUA\ \type {tex}
+library also handles it. One \type {dk} is 6.43985pt. There is no need to make
+\METAPOST\ aware of this unit because there it is just a numeric multiplier in a
+macro package.
+\stopquotation
+
+When compared to the already present units the \type {dk} nicely fills a gap:
+
+\def\TheUnit#1{
+ \NC \type {#1}
+ \NC \withoutpt\dimexpr1#1\relax
+ \NC \number\dimexpr1#1\relax
+ \NC \vrule width 1#1 height 1.5ex depth .5ex\relax
+ \NC \NR
+}
+
+\starttabulate[|c|cg{.}|r|l|]
+ \BC unit \BC points \BC scaled \BC visual \NC \NR
+ \TheUnit{sp}
+ \TheUnit{pt}
+ \TheUnit{bp}
+ \TheUnit{dd}
+ \TheUnit{mm}
+ \TheUnit{dk}
+ \TheUnit{pc}
+ \TheUnit{cc}
+ \TheUnit{cm}
+ \TheUnit{in}
+
+ %\TheUnit{em}
+ %\TheUnit{ex}
+ %\TheUnit{mu}
+ %\TheUnit{px}
+\stoptabulate
+
+Deep down, the unit scanner uses a numerator and denominator in order
+to map the given value onto the internally used scaled points, so the
+relevant snippet of \CCODE\ is:
+
+\starttyping
+*num = 49838; // 152940;
+*denom = 7739; // 23749;
+return normal_unit_scanned;
+\stoptyping
+
+The impact on performance of scanning an additional unit can be neglected because
+the scanning code is a bit different from the code in \LUATEX\ and (probably the)
+other engines anyway.
+
+Under consideration are a few extra units in the \type {relative_unit_scanned}
+category that we see in \CSS: \type {vw} (relative to the \type {\hsize}), \type
+{vh} (relative to the \type {\vsize}), maybe a percentage (but of what) and \type
+{ch} (width of the current zero digit character). As usual with \TEX ies,
+once it's there it will be (ab)used.
+
+\stopchapter
+
+\stopcomponent
+
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/ontarget/ontarget-eventually.tex b/Master/texmf-dist/doc/context/sources/general/manuals/ontarget/ontarget-eventually.tex
new file mode 100644
index 00000000000..6787b30f22b
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/ontarget/ontarget-eventually.tex
@@ -0,0 +1,375 @@
+% language=us runpath=texruns:manuals/ontarget
+
+\startcomponent ontarget-eventually
+
+\environment ontarget-style
+
+\startchapter[title={Eventually 1.0}]
+
+\startsection[title=Reflection]
+
+This is just a short reflection on how we came to version 1.0 of \LUAMETATEX.
+Much has already been said in articles and history documents. There is nothing
+in here that is new but I just occasionally like to wrap up the current state.
+At the time of writing, which happens to be the \CONTEXT\ 2021 meeting, we're
+somewhere between 0.9 and 1.0 and as usual it reflects a current state of mind.
+
+\stopsection
+
+\startsection[title=Introduction]
+
+The development on \LUAMETATEX\ took a bit more time than I had in planned when I
+started with it. I presume that it also relates to the way the \TEX\ program is
+looked at: a finished program that converges to a bugless state. But, with
+version 1.0 near by it makes sense to reflect on the process. Before I go into
+details I want to remark that when I wrote \CONTEXT\ I looked at this program
+from the macro end. I had no real reason to look into the code, and figuring out
+what happens in a black box is a challenge (and kind of game) in itself. At the
+time I started using \TEX\ I had done my share of complex and relatively large
+scale programming in \PASCAL\ and \MODULA\ so it's not that I was afraid of
+languages. It was before the Internet took off and not being in academia and
+connected one had to figure things out anyway. I did have Don's 5 volume \TEX\
+series but stuck to the \TEX\ book. Being on \MSDOS\ I couldn't compile the
+program anyway, definitely not without the source at hand. I did read the first
+chapters of the \METAFONT\ book, but apart from being intrigued by it, it was not
+before I ran into \METAPOST\ that knowing that language took off. Of course I had
+browsed \TEX\ the program but not in a systematic way.
+
+I was involved with \PDFTEX\ development but stayed at my end of the line: needs,
+applications, testing and suggestions. With \LUATEX\ that line got crossed,
+triggered by the \LUA\ interfaces, but while I focussed on the \TEX\ end, Taco
+did the \CCODE, and we had pleasant and intense daily discussion on how to move
+forward. I could not get away any longer with the abstraction but had to deal
+with nodes and such, which was okay as we were hit the boundaries of convenience
+programming solutions in \CONTEXT.
+
+When we started our \LUATEX\ journey the \TEX\ follow|-|up most widely used,
+\PDFTEX, did have some \ETEX\ extensions but in retrospect only a few of those
+were of relevance to us, like the concept of \type {\protected} macros \footnote
+{In \CONTEXT\ we always had a protection mechanism and from the \LUATEX\ source I
+learned that the macro bases solution was basically the same as the one used in
+the engine.} and the larger set of registers. And the \ETEX\ project, in spite of
+occasional discussions, never became a continuous effort. The \NTS\ project that
+was related to \ETEX\ and had as objective an extensible successor produced a
+\JAVA\ implementation but that one was never useful (as a starter, its
+performance was such that it could not be used) and I didn't really look forward
+to spending time on \JAVA\ anyway. Taco and I played with an extended \ETEX\ but
+lack of time made that one end up in the archive.
+
+There were some programmatic additions to \PDFTEX\ but it's main attributes were
+protrusion, expansion and a \PDF\ backend (\THANH's thesis subject). Features
+like position tracking were handy but basically just a built|-|in variant of a
+concept we already had come up with at the \DVI\ level (using a postprocessing
+script that later became \type {dvipos}). There was \OMEGA\ with a directional
+model but this engine was always more of an academic project, not a production
+system. \footnote {\ALEPH\ was more reliable but never took off, if only because
+\PDFTEX\ had a backend.} It was \XETEX\ that moved the \TEX\ world into the
+\UNICODE\ domain and opened the engine up to new font technologies. Although
+\UTF8\ was already doable in earlier engines (which is why \CONTEXT\ used it
+already for some internals), native support was way more convenient.
+
+It was clear that if we wanted to move on we had to make more fundamental steps,
+but in such a way that it still fit in with what people expect from \TEX. While
+it started an a playground by embedding the \LUA\ interpreter, it quickly became
+clear that we could open up the internals in fundamental ways, thereby also
+getting around the discussion about to what extent \TEX\ could and should be
+extended: that discussion could be and was postponed by the opening up. Because
+we already foresaw some of possibilities it was decided to freeze \CONTEXT\ for
+the older engines. It was around the first \CONTEXT\ meeting that the \MKII\ and
+\MKIV\ tags showed up, around the same time that \LUATEX\ became useable. More
+than a decade later, when \LUATEX\ basically had become frozen, at another
+meeting it was decided to move on with \LUAMETATEX: the \LUATEX\ project was
+pretty much a \CONTEXT\ projects and that follow up would be even more driven by
+\CONTEXT\ users and usage. But how does it all feel 15 years later? I'll try to
+summarize that below. It will also explain why I got more audacious in extending
+the \LUATEX\ engine into what is now \LUAMETATEX. This also related to the fact
+that at some point I realized that progress just demands taking decisions, and it
+happens that we can make these in the perspective of \CONTEXT\ without side
+effects for other \TEX\ usage. It is also fun to experiment.
+
+\stopsection
+
+\startsection[title=Extending necessary parts]
+
+The \PDFTEX\ program, having a backend built in already supports the usage of
+wide \TRUETYPE\ but it was \XETEX\ that first provided using them directly in the
+frontend. But that happened within the concept of traditional \TEX, especially
+when it comes to math. There are some extra primitives to deal with scripts and
+languages but (and this is personally) I decided that these didn't really fit in
+the way \CONTEXT\ looks at things so \MKII\ doesn't support anything beyond the
+fonts. The \XETEX\ program first was available on Apple computers and font
+support was closely related to its technology as well as technologies that relate
+to where the program originates. Later other operating systems became supported
+too.
+
+We decided in \LUATEX\ to delegate \quote {everything fonts} to \LUA, for a good
+reason: we didn't want to be platform dependent. And using libraries has the
+danger of periodical enforced fundamental changes because in these times software
+politics and fashion have short cycles. The fact that \XETEX\ later changed the
+font engine proved that this was a good decision. At some point \LATEX\ decided
+to use a special version of \LUATEX\ that uses a font library as alternative,
+which is fine, but that also introduces a dependency (and frequent updating of
+the binary). The \LUATEX\ engine has a slim variant of the \FONTFORGE\ library
+built in for reading various font formats and its backend can embed subsets of
+\OPENTYPE, \TYPEONE\ and traditional bitmap fonts. At some point \CONTEXT\
+switched to its own \LUA\ based font file interpreter and experimented with a
+\LUA\ based backend that later became exclusive for \LUAMETATEX. It became clear
+that we could do with less code in the engine and thereby less dependencies.
+
+In this perspective it is also good to notice that the \LUATEX\ engine has no
+real concept of \UNICODE: it just expects \UTF8\ and that's it. All internals
+provide enough granularity to support \UNICODE. The rest has to come from the
+macro package, as we know that each one does it its own way. There are no
+dependencies on \UNICODE\ libraries. You only have to look at what ends up on
+your system when you install a program that just juggles bytes to notice that by
+including one library a whole lot gets drawn in, most of which is not relevant to
+the program and we don't want that. It might start small but who knows where
+one ends up. If we want users to be able to compile the program, we don't want
+to end up in dependency hell.
+
+The \LUATEX\ project was, apart from curiosity and potential usage in \CONTEXT,
+initially also driven by the Oriental \TEX\ project that aimed at high quality
+bidirectional typesetting. There the focus was on fonts as well as processing
+paragraphs. That triggered all kinds of opening up of internals and once
+\CONTEXT\ started swapping (and adding) mechanisms using \LUA\ more came to
+fruit. In the end it took a decade to reach version 1.0 and we could have stopped
+there knowing that we're quite prepared for the future.
+
+Although the whole \TEX\ concept didn't change, there were some fundamental
+changes. From the documentation by Don Knuth it becomes clear that interpreting
+is closely interwoven with typesetting: the so called main interpretation loop
+calls out to font processing, ligature building, hyphenation, kerning, breaking
+lines, processing pages, etc. In \LUATEX\ these steps became more independent
+simply because the processing of fonts (via \LUA) came down to feeding a linked
+list of nodes to a callback function. That list should be hyphenated if needed (a
+now separated step) and if needed the traditional font processing could be
+applied (ligature building and kerning). But, although one can say that we
+already got away from the way \TEX\ works internally, most documentation to the
+original program still applied, simply because the fundamental approach was the
+same. We didn't feel too guilty about it and I don't think anyone objected. By
+the way, the same is true for the math subsystem: we had to adapt it to
+\OPENTYPE\ parameters and formula construction and although that was inspired by
+\TEX\ it definitely was different, even to the extend that the math fonts that
+evolved in the community are now a strange hybrid of old and new.
+
+\stopsection
+
+\startsection[title=Getting around the frozen machinery]
+
+So why did the \LUAMETATEX\ project started at all? There has been plenty written
+on how \LUATEX\ evolved and the same is true for \LUAMETATEX\ so I'm not going to
+repeat that here. It is enough to know that the demand for a stable and frozen
+\LUATEX\ by other users than \CONTEXT\ simply doesn't go well with further
+experiments and we still had plenty ideas. Because at some point Taco had no time
+I was already responsible for quite some additions to the \LUATEX\ program so it
+was no big deal to switch to a an even more extensive mix of working with
+\quotation {\TEX\ the macro language} and \quotation {\TEX\ the program}.
+
+The first priorities were with some basic cleanup: remove unused font code, get
+rid of some ever changing libraries and remove the backend related code. I could
+do that because I already had a \LUA\ driven backend in \MKIV\ (which was removed
+later on) and font handling was already all done in \LUA. The idea was to go lean
+and mean, and indeed, even with all kind of extensions, the binary is much
+smaller than its predecessor, which is nice because it is also a \LUA\ engine.
+Simplifying the build so that users can easily compile themselves was also of
+high priority because I considered the rather large and complex setup as a time
+bomb. And I also had my doubts if we could prevent the \LUATEX\ engine to evolve
+over time in a way that made it less useable for \CONTEXT.
+
+But, interestingly all this extending and pruning didn't feel like I was
+violating the concept of a long term stable engine. In fact, original \TEX\ has
+no backend either, just a simple binary serialization of output (\DVI). And by
+removing some font related frontend code we actually came closer to the original.
+I suppose that these decisions slowly made me aware of the fact that there was no
+reason to not consider more drastic extensions. After all, wasn't the \ETEX\
+project also about extending. \footnote {Although non of the ideas that Taco and
+I discussed on our numerous trips to meetings all over the world ever made it
+into that engine.}
+
+When we look at \LUAMETATEX\ 1.0 we still see the expected machinery there but
+many subsystems have been extended. Once I made the decision that it's now or
+never, each subsystem got evaluated against my long term wish list and usage in
+\CONTEXT. Now, let's be clear: I basically can do all I want in \LUATEX\ but that
+doesn't mean it's always a pretty solution. And to make the \CONTEXT\ code base
+better to understand for users, even if it is already rather consistent and set
+up to be readable, is one of my objectives. I spend a lot of time on readability:
+I cannot stand a bad looking source and over time the look and feel is also
+determined by the way the \CONTEXT\ interfaces and related syntax highlighting
+evolved, especially the \TEX, \METAPOST, \LUA\ mix. This is why \LUAMETATEX\ has
+some extensions to the macro language.
+
+So, while some might argue that \quotation {It can already be done.} I decided to
+ignore that argument when the actual solutions came too close to \quotation {See
+how well I can do this using dirty tricks!}. If we can do better, without harming
+the system, let's do it: \LUA\ did it, \CCODE\ did it and even Don Knuth switched
+from \PASCAL\ to \CCODE . If we want we can put all the extensions under the
+\quotation {\TEX\ is meant to be extended} umbrella, as long as we call it
+different, which is what we do. But I admit that one has to (emotionally) cross a
+boundary of feeling comfortable with fundamental additions to a program like
+\TEX. But I've been around long enough to not feel guilty about it.
+
+So in the end that means that for instance marks were extended, inserts got more
+options, glyphs and boxes have way more properties, (the result and handling of)
+paragraphs can be better controlled, page breaking got hooks (and might be
+extended), local boxes got redone, adjustments were extended, the math machinery
+has been completely opened up, hyphenation became more powerful, the font
+mechanism got more control and new scaling features, alignments got some
+extensions, we can do more with boxes, etc. But often I still first had to
+convince myself that it's okay to do so. After all, none of this had happened
+before and to my knowledge also has not been considered in ways that resulted in
+an implementation (but I might be wrong here). It helps that I can test out
+experiments in production versions of \LMTX\ and that users are quite willing to
+test.
+
+\stopsection
+
+\startsection[title=Extending the macro language]
+
+In the previous section some mechanisms were mentioned, but before \TEX\ even
+ends up there macros and primitives come into play. The \LUATEX\ engine already
+has some handy extras, like ways to prepend and append tokens and a limited so
+called \quote {local control} mechanism (think of nested main loops). There are
+some new look head and expansions related primitives and csname related tricks.
+There are a few more conditionals too. Details can be found in manual and
+articles.
+
+In \LUAMETATEX\ some more got added and some of these mechanism could be improved
+and the reason again is that I aim at readable code. Most programming languages
+for instance have conditionals with some kind of continuation (like \type
+{elseif}) and so I added that to \TEX\ too \type {\orelse}. Actually, there are
+even more new conditionals than in \LUATEX. Yes, we don't really need these,
+especially because in \LUAMETATEX\ we can now extend the primitive language via
+\LUA, but I wanted to improve readability deep down in \CONTEXT. It also reduces
+the clutter when logging, although logging itself has been quite a bit
+overhauled. There is less need for intermediate (often not that natural)
+intermediate layers when we can do it properly in primitive \TEX\ lingua.
+
+More fundamental was extending the way \TEX\ deals with macro arguments. Although
+the extensions to parsing them are using specifiers that make them upward
+compatible I admit that even I have to consult a list of possibilities every now
+and then but in the end they make things better (performance wise with less
+code). As a side effect the macro machinery could be optimized a bit (expansion
+as well as the save stacking).
+
+There are a few more ways to store integers and dimensions (these fit in nicely),
+there are new into grouping, some primitives have more keywords and
+therefore scanners have been extended, the \ETEX\ expression handlers have
+alternative variants.
+
+Although this is a sensitive aspect of \TEX\ when it comes to compatibility, at
+some point I decided that it made no sense to not expose more details about
+nodes, input, and nesting states. The grouping and input related stacks had been
+optimized in the meantime so reporting in that area was already not compatible.
+Improving logging is an ongoing effort and I don't really loose sleep over it not
+being compatible, as long as it gets better. There is now also some tracing for
+marks, inserts, math and alignments.
+
+\stopsection
+
+\startsection[title=Refactoring the code base]
+
+This is again an emotionally laden decision: what to touch and keep. For sure we
+keep the original comments but that doesn't make it literate. We started out with
+a \CCODE\ base that came from converted \PASCAL\ \WEB.
+
+The input machinery is a bit different due to the fact that \LUA\ can (and often
+has to) kick in. In \LUAMETATEX\ it's even more different because even more goes
+via \LUA. We cannot even run the engine without a basic set of callbacks
+assigned: if you don't like that, use \LUATEX. Does this violate the \TEX\
+concept? Not really, because system dependencies are explicitly mentioned as such
+in the source code. We have to adapt to the way an operating system sees files
+anyway (eight bit, \UTF8, \UTF16).
+
+We still have many global variables (a practical Knuth thing I guess) but now
+they are grouped into structures so that we can more clearly see where they
+belong. This involved quite a but of shuffling and editing but I got there. In
+\LUAMETATEX\ all constants (coded in macros) became enumerations, and all hard
+coded values too which was quite a bit of work too. Probably no one will notice
+or realize that, but starting from an existing code base is more work than
+starting from scratch, which is what I always did so far. When possible we use
+case statements. Most macros became (inline) functions. Complex functions got
+better variable names. All functions are in name spaces. This was (and is) a
+stepwise process that takes lots of time, especially because \CONTEXT\ users
+expect a reasonable stable system and changes like that are sensitive for errors.
+
+Talking of errors, the error and reporting system has been overhauled, so for
+instance we have now a dedicated string formatter. This all happened in several
+steps: normalization, consistency, abstraction, formatters, etc. Keep in mind
+that we not only have the original messages but also new ones. And we have \TEX,
+\LUA\ and \METAPOST\ communicating with the user. Where in \LUATEX\ we have to
+conform more to the traditional engine, because that is what other macro packages
+rely on, In \CONTEXT\ we have more freedom, so we can make it better and more
+detailed. Of course it could all be controlled by configurations but at some
+point I decided to kick out variables doing that because it made no sense to
+complicate the code base.
+
+Memory management has been overhauled (more dynamic) as has dumping to the (more
+efficient) format file. With what is mentioned in the previous paragraphs we can
+safely say that in the meantime back porting to \LUATEX\ (which I had in mind)
+makes no sense any longer. There is occasionally some pressure to let \LUATEX\ do
+the same as other engines (new common features) and that doesn't always fit into
+the model. There is no need for \LUAMETATEX\ to follow up on that because often
+we already have plenty of possibilities. There is of course still work todo, for
+instance I still have to make some variable names in functions more verbose but
+that is not fundamental. I also have to go over the documentation in the code. I
+might make some interfaces more consistent anyway, so that also would demand
+adaptations. And of course the documentation in general always lags behind.
+
+So far I only mentioned dealing with \TEX, but keep in mind that in \LUAMETATEX\
+we also have an upgraded \METAPOST: only a \LUA\ backend (we can produce \PDF\
+from that other output), no font code, a couple of extensions, more callbacks,
+\IO\ via \LUA. Scanners make extending the language possible and injectors make
+for efficient piping back to \METAPOST. Such extensions are also possible in
+\TEX\ and the \LUAMETATEX\ scanning interfaces have been improved and extended
+too. We have extra callbacks (but some were dropped), more helpers (most
+noticeable in the node namespace), libraries that improve dealing with binary
+files, a reworked token library (which in turn lead to a reorganization of
+command codes in the \TEX\ engine), a few more extensions if \LUA\ file handling
+and string manipulations. We got decimal math, complex math, new compression
+libraries, better (\LUA) memory management, a few optional library interfaces,
+etc. Fortunately that all didn't bloat the binary.
+
+So, because in the meantime \LUAMETATEX\ is quite different from \LUATEX, we can
+consider the last one to be a prototype for the real deal.
+
+\stopsection
+
+\startsection[title=Simplifying the build]
+
+This was one of the first things I did. It was a curious process of removing more
+and more of the original build (all kind of dependencies) which is not entirely
+trivial because of the way the \LUATEX\ build is set up. I admit that I did try
+to stay within the regular source build concept but after a while I realized that
+this made no sense so we (Mojca was involved in that) made the move to \CMAKE.
+Shortly after that I started using Visual Studio as editing environment (which
+saves time and is rather convenient) and native compilation under \MSWINDOWS\
+became possible without any special measures (in fact, setting up the build for
+\ARM\ processors was more work).
+
+A side effect is that right from the start we could provide binaries for various
+platforms via the compile farm on the \CONTEXT\ garden maintained by Mojca, who
+also does daily \TEX\ live builds there. On my machine I use the Windows Linux
+Subsystem for cross compilation but we can also do native builds. And, with my
+laptop being a robust 2013 old timer I force myself to make sure that
+\LUAMETATEX\ keeps performing well.
+
+\stopsection
+
+\startsection[title=Because it just makes sense]
+
+So, in the end \LUAMETATEX\ is likely the engine most different from the Knuthian
+original but from the above one can conclude that this was a graduate process
+where I got more audacious over time. In the end the only thing that matters (and
+I believe that Don Knuth agrees with this) that you like writing the code, feel
+confident that the code is all right, explore the possibilities, try to improve
+the quality and understanding and that successive rewrites can reduce obscurity.
+And in my opinion we didn't loose the \TEX\ look and feel and still can operate
+well within the established boundaries of the \TEX\ ecosystem. The fact that most
+\CONTEXT\ users in the meantime use \LUAMETATEX\ and the related \LMTX\ variant
+is an indication that they are okay with it, and that is what matters most.
+
+\stopsection
+
+\stopchapter
+
+\stopcomponent
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/ontarget/ontarget-gettingridof.tex b/Master/texmf-dist/doc/context/sources/general/manuals/ontarget/ontarget-gettingridof.tex
new file mode 100644
index 00000000000..75b7f5bc040
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/ontarget/ontarget-gettingridof.tex
@@ -0,0 +1,1666 @@
+% language=us runpath=texruns:manuals/ontarget
+
+\startcomponent ontarget-gettingridof
+
+\environment ontarget-style
+
+\startchapter[title={Issues in math fonts}]
+
+\startsection[title=Introduction]
+
+After trying to improve math rendering of \OPENTYPE\ math fonts, we \footnote
+{Mikael Sundqvist and Hans Hagen} ended up with a mix of improving the engine and
+fixing fonts runtime, and we are rather satisfied with the results so far.
+
+However, as we progress and also improve the more structural and input related
+features of \CONTEXT, we wonder why we don't simply are more drastic when it
+comes to fonts. The \OPENTYPE\ specifications are vague, and most existing
+\OPENTYPE\ math fonts use a mixture of the \OPENTYPE\ features and the old \TEX\
+habits, so we are sort of on our own. The advantage of this situation is that we
+feel free to experiment and do as we like.
+
+In another article we discuss our issues with \UNICODE\ math, and we have
+realized that good working solutions will be bound to a macro package anyway.
+Also, math typesetting has not evolved much after Don Knuth set the standard,
+even if the limitations of those times in terms of memory, processing speed and
+font technologies have been lifted already for a while. And right from the start
+Don invited users to extend and adapt \TEX\ to one's needs.
+
+Here we will zoom in on a few aspects: font parameters, glyph dimensions and
+properties and kerning of scripts and atoms. We discuss \OPENTYPE\ math fonts
+only, and start with a summary of how we tweak them. We leave a detailed engine
+discussion to a future article, since that would demand way more pages, and could
+confuse the reader.
+\stopsection
+
+\startsection[title={Tweaks, also known as goodies}]
+
+The easiest tweaks to describe are those that wipe features. Because the
+\TEXGYRE\ fonts have many bad top accent anchors (they sit above the highest
+point of the shape) the \typ {wipeanchors} tweak can remove them, and we do that
+per specified alphabet.
+
+\bgroup
+\definefontfeature[mathextra][goodies=]
+\switchtobodyfont[modern]
+\startformula
+\scale[s=2]{$\widehat{7}$}
+% \widehat{7}
+\stopformula
+\egroup
+\stopformulas
+
+In a similar fashion we \typ {wipeitalics} from upright shapes. Okay, maybe they
+can play a role for subscript placement, but then they can also interfere, and
+they do not fit with the \OPENTYPE\ specification. The \typ {wipecues} tweak
+zeros the dimensions of the invisible times and friends so that they don't
+interfere and \typ {wipevariants} gets rid of bad variants of specified
+characters.
+
+The fixers is another category, and the names indicate what gets fixed. Tweaks
+like these take lists of code points and specific properties to fix. We could
+leave it to your imagination what \typ {fixaccents}, \typ {fixanchors}, \typ
+{fixellipses}, \typ {fixoldschool}, \typ {fixprimes}, \typ {fixradicals} and \typ
+{fixslashes} do, but here are some details. Inconsistencies in the dimensions of
+accents make them jump all over the place so we normalize them. We support
+horizontal stretching at the engine level.
+
+\startformula
+\scale[s=2]{\dm{\widehat{a+b+c+d} = \widetilde{u+v+w+x+y}}}
+\stopformula
+
+It required only a few lines of code thanks to already present scaling features.
+
+% MPS: I thought of an example showing the accents, but I could
+% not get it to work fine with the goodies loaded the second
+% time the font was loaded
+%
+% \startformulas
+% \bgroup \definefontfeature[mathextra][goodies=]\setupbodyfont[modern]
+% \startformula[width=2em]
+% \widehat{7}
+% \stopformula
+% \egroup
+% \bgroup\setupbodyfont[modern]
+% \startformula[width=2em]
+% \widehat{7}
+% \stopformula
+% \egroup
+% \stopformulas
+
+Anchors can be off so we fix these in a way so that they look better on
+especially italic shapes. We make sure that the automated sizing works
+consistently, as this is driven by width and overshoot. Several kind of ellipses
+can be inconsistent with each other as well as with periods (shape and size wise)
+so we have to deal with that. Radicals and other extensibles have old school
+dimensions (\TEX\ fonts have a limited set of widths and heights). We need to fix
+for instance fences of various size because we want to apply kerns to scripts on
+the four possible corners for which we need to know the real height and depth,
+
+Discussing primes would take many paragraphs so we stick to mentioning that they
+are a mess. We now have native prime support in the engine as well as assume
+properly dimensioned symbols to be used. Slashes are used for skewed fractions so
+we'd better make sure they are set up right.
+
+A nice tweak is \typ {replacealphabets}. We use this to provide alternative
+script (roundhand) and calligraphic (chancery) alphabets (yes we have both
+natively in \CONTEXT\ while \UNICODE\ combines them in one alphabet). Many
+available \OPENTYPE\ math fonts come with one of the two alphabets only, some
+with roundhand and some with chancery. For the record: this tweak replaces the
+older \typ {variants} tweak that filtered scripts from a stylistic font feature.
+
+We also use the \typ {replacealphabets} tweak to drop in Arabic shapes so that we
+can do bidirectional math. In practice that doesn't really boil down to a
+replacement but more to an addition. The \typ {addmirrors} features accompanies
+this, and it is again a rather small extension to the engine to make sure we can
+do this efficiently: when a character is looked up we check a mirror variant when
+we are in r2l mode, just like we look up a smaller variant when we're in compact
+font mode (a \CONTEXT\ feature).
+
+\bgroup
+\definefontfeature[mathextra][mathxitsarabic=yes]
+\switchtobodyfont[bonum]
+\setupmathematics[bidi=yes,align=righttoleft]\par
+\setupalign[righttoleft] %
+\startformula
+\scale[s=2]{\dm{
+\sum_{\char"1EE4E=\char"1EE01}^{\char"1EE02} \char"1EE03^{\char"1EE4E} =
+\char"1EE03^{\char"1EE01}\frac{\char"0661 - \char"1EE03^{\char"1EE02 -
+\char"1EE01 + \char"0661}}{\char"0661 - \char"1EE03} \quad (\char"1EE03\neq
+\char"0661)
+}}
+
+% \int_{\char"0627}^{\char"0628} \char"1EE03 '(\char"1EE4E)
+% %\mathatom class \mathdifferentialcode {\char"062F}
+% \dd
+% \char"1EE4E
+% = \char"1EE03(\char"0628) - \char"1EE03(\char"0627)
+% \stopformula
+% \startformula
+% \sqrt[\char"0663](\char"1EE30) = (\char"1EE30)^{1/\char"0663}
+\stopformula
+\egroup
+
+Another application of \typ {replacealphabets} is to drop in single characters
+from another font. We use this for instance to replace the \quote {not really an
+alpha} in Bonum by one of our own liking. Below we show a math italic a and the
+original alpha, together with the modified alpha.
+
+\startformula
+\scale[s=2]{\dm{
+a + \text{\getnamedglyphdirect{file:TeXGyreBonumMath-Companion.otf}{alpha.old}} + \alpha
+}}
+\stopformula
+
+For that we ship a companion font. On our disks (and in the distribution) you can
+find:
+
+\starttyping
+/tex/texmf-fonts/fonts/data/cms/companion/RalphSmithsFormalScript-Companion.otf
+/tex/texmf-fonts/fonts/data/cms/companion/TeXGyreBonumMath-Companion.otf
+/tex/texmf-fonts/fonts/data/cms/companion/XITSMath-Companion.otf
+\stoptyping
+
+All these are efficient drop|-|ins that are injected by the \typ
+{replacealphabets}, some under user control, some always. We tried to limit the
+overhead and actually bidirectional math could be simplified which also had the
+benefit that when one does tens of thousands of bodyfont switches a bit of
+runtime is gained.
+
+There are more addition tweaks: \typ {addactuarian} creates the relevant symbols
+which is actually a right sided radical (the engine has support for two|-|sided
+radicals). It takes a bit of juggling with virtual glyphs and extensible recipes,
+but the results are rewarding.
+
+\setupmathradical[annuity][strut=no]
+\definemathdelimited
+ [myannuity]
+ [topoffset=.2\exheight,
+ strut=no,
+ rightmargin=.05\emwidth,
+ right=\delimitedrightanutityuc]
+
+\startformula
+\scale[s=2]{\dm{
+\widebar{A}__{\myannuity{m}}^^{2}_{x:\annuity{n}}^{1}
+}}
+\stopformula
+
+In a similar fashion we try to add missing extensible arrows with \typ
+{addarrows}, bars with \typ {addbars}, equals with \typ {addequals} and again
+using the radical mechanism fourier notation symbols (like hats) with \typ
+{addfourier}. That one involves subtle kerning because these symbols end up at
+the right top of a fence like symbol.
+
+\startformula
+\scale[s=2]{\dm{
+\widehat{f \ast g \ast h}(\xi) = \fourier{\F1\left(f\ast g \ast h\right)}(\xi)
+}}
+\stopformula
+
+It was actually one of the reasons to introduce a more advanced kerning mechanism
+in the engine, which is not entirely trivial because one has to carry around more
+information, since all this is font and character bound, and when wrapped in
+boxes that gets hard to analyze. The \typ {addrules} makes sure that we can do
+bars over and under constructs properly. The \typ {addparts} is there to add
+extensible recipes to characters.
+
+Some of these tweaks actually are not new and are also available in \MKIV\ but
+more as features (optionally driven by the goodie file). An example is \typ
+{addscripts} that is there for specially positioned and scaled signs (high minus
+and such) but that tweak will probably be redone as part of the \quotation {deal
+with all these plus and minus issues}. The dedicated to Alan Braslau \typ
+{addprivates} tweak is an example of this: we add specific variants for unary
+minus and plus that users can enable on demand, which in turn of course gives
+class specific spacing, but we promised not to discuss those engine features
+here.
+
+\startformula
+\scale[s=2]{\dm{
+\int_1^2 \left[(x+2)^{\frac[strut=no]{1}{2}} - (x+2)^{\um\frac[strut=no]{1}{2}}\right] \dd x
+}}
+\stopformula
+
+There is a handful of tweaks that deals with fixing glyph properties (in detail).
+We mention: \typ {dimensions} and \typ {accentdimensions} that can reposition in
+the boundingbox, fix the width and italic correction, squeeze and expand etc. The
+\typ {kernpairs} tweak adds kern pairs to combinations of characters. The \typ
+{kerns} provides a way to add top left, bottom left, top right and bottom right
+kerns and those really make the results look better so we love it!
+
+\startformula
+\scale[s=2]{\showglyphs\dm{\F3\left(\frac{1}{1+x^2}\right)^n \quad x^2/(1+x)}}
+\stopformula
+
+The \typ {margins} tweak sets margin fields that the engine can use to calculate
+accents over the base character better. The same is true for \typ {setovershoots}
+that can make accents lean over a bit. The \typ {staircase} feature can be used
+to add the somewhat complicated \OPENTYPE\ kerns. From all this you can deduce
+that the engine has all types of kerning that \OPENTYPE\ requires, and more.
+
+Accents as specified in fonts can be a pain to deal with so we have more tweaks
+for them: \typ {copyaccents} moves them to the right slots and \typ
+{extendaccents} makes sure that we can extend them. Not all font makers have the
+same ideas about where these symbols should sit and what their dimensions should
+be.
+
+The \typ {checkspacing} tweak fixes bad or missing spacing related to \UNICODE\
+character entries in the font, because after all, we might need them. We need to
+keep for instance \MATHML\ in mind, which means: processing content that we don't
+see and that can contain whatever an editor puts in. The \typ {replacements}
+feature replaces one character by another from the same font. The \typ
+{substitutes} replaces a character by one from a stylistic feature.
+
+Relatively late we added the \typ {setoptions} which was needed to control the
+engine for specific fonts. The rendering is controlled by a bunch of options
+(think of kerning, italic correction, and such). Some are per font, many per
+class. Because we can (and do) use mixed math fonts in a document, we might need
+to adapt the engine level options per font, and that is what this tweak does: it
+passes options to the font so that the engine can consult them and prefer them
+over the \quote {global} ones. We needed this for some fonts that have old school
+dimensions for extensibles (like Lucida), simply because they imitated Computer
+Modern. Normally that goes unnoticed, but, as mentioned before, it interferes
+with our optional kerning. The \typ {fixoldschool} tweak sort of can fix that too
+so \typ {setoptions} is seldom needed. Luckily, some font providers are willing
+to fix their fonts!
+
+We set and configure all these tweaks in a so-called goodie file, basically a
+runtime module that returns a \LUA\ table with specifications. In addition to the
+tweaks subtable in the math namespace, there is a subtable that overloads the
+font parameters: the ones that \OPENTYPE\ specifies, but also new ones that we
+added. In the next section we elaborate more on these font bound parameters.
+
+\stopsection
+
+\startsection[title=Font parameters]
+
+At some point in the upgrading of the math machinery we discussed some of the
+inconsistencies between the math constants of the XITS and STIX fonts. Now, one
+has to keep in mind that XITS was based on a first release of STIX that only had
+\TYPEONE\ fonts so what follows should not to be seen as criticism, but more as
+observations and reason for discussion, as well as a basis for decisions to be
+made.
+
+One thing we have to mention in advance, is that we often wonder why some weird
+and|/|or confusing stuff in math fonts go unnoticed. We have some suggestions:
+
+\startitemize
+\startitem
+ The user doesn't care that much how math comes out. This can easily be
+ observed when you run into documents on the internet or posts on forums. And
+ publishers don't always seem to care either. Consistency with old documents
+ sometimes seems to be more important than quality.
+\stopitem
+\startitem
+ The user switches to another math font when the current one doesn't handle
+ its intended math domain well. We have seen that happening and it's the
+ easiest way out when you have not much control anyway (for instance when
+ using online tools).
+\stopitem
+\startitem
+ The user eventually adds some skips and kerns to get things right, because
+ after all \TEX\ is also about tweaking.
+\stopitem
+\startitem
+ The user doesn't typeset that complex math. It's mostly inline math with an
+ occasional alignment (also in text style) and very few multi|-|level display
+ math (with left and right fences that span at most a fraction).
+\stopitem
+\stopitemize
+
+We do not claim to be perfect, but we care for details, so let's go on. The next
+table shows the math constants as they can be found in the \STIX\ (two) and
+\XITS\ (one) fonts. When you typeset with these fonts you will notice that \XITS\
+is somewhat smaller, so two additional columns show the values compensated for
+the axis height and accent base height.
+
+\startluacode
+local one = {
+ ["AccentBaseHeight"]=450,
+ ["AxisHeight"]=250,
+ ["DelimitedSubFormulaMinHeight"]=1500,
+ ["DisplayOperatorMinHeight"]=1450,
+ ["FlattenedAccentBaseHeight"]=662,
+ ["FractionDenominatorDisplayStyleGapMin"]=198,
+ ["FractionDenominatorDisplayStyleShiftDown"]=700,
+ ["FractionDenominatorGapMin"]=66,
+ ["FractionDenominatorShiftDown"]=480,
+ ["FractionNumeratorDisplayStyleGapMin"]=198,
+ ["FractionNumeratorDisplayStyleShiftUp"]=580,
+ ["FractionNumeratorGapMin"]=66,
+ ["FractionNumeratorShiftUp"]=480,
+ ["FractionRuleThickness"]=66,
+ ["LowerLimitBaselineDropMin"]=600,
+ ["LowerLimitGapMin"]=150,
+ ["MathLeading"]=150,
+ ["MinConnectorOverlap"]=50,
+ ["OverbarExtraAscender"]=66,
+ ["OverbarRuleThickness"]=66,
+ ["OverbarVerticalGap"]=198,
+ ["RadicalDegreeBottomRaisePercent"]=70,
+ ["RadicalDisplayStyleVerticalGap"]=186,
+ ["RadicalExtraAscender"]=66,
+ ["RadicalKernAfterDegree"]=-555,
+ ["RadicalKernBeforeDegree"]=277,
+ ["RadicalRuleThickness"]=66,
+ ["RadicalVerticalGap"]=82,
+ ["ScriptPercentScaleDown"]=75,
+ ["ScriptScriptPercentScaleDown"]=60,
+ ["SkewedFractionHorizontalGap"]=300,
+ ["SkewedFractionVerticalGap"]=66,
+ ["SpaceAfterScript"]=41,
+ ["StackBottomDisplayStyleShiftDown"]=900,
+ ["StackBottomShiftDown"]=800,
+ ["StackDisplayStyleGapMin"]=462,
+ ["StackGapMin"]=198,
+ ["StackTopDisplayStyleShiftUp"]=580,
+ ["StackTopShiftUp"]=480,
+ ["StretchStackBottomShiftDown"]=600,
+ ["StretchStackGapAboveMin"]=150,
+ ["StretchStackGapBelowMin"]=150,
+ ["StretchStackTopShiftUp"]=300,
+ ["SubSuperscriptGapMin"]=264,
+ ["SubscriptBaselineDropMin"]=50,
+ ["SubscriptShiftDown"]=250,
+ ["SubscriptTopMax"]=400,
+ ["SuperscriptBaselineDropMax"]=375,
+ ["SuperscriptBottomMaxWithSubscript"]=400,
+ ["SuperscriptBottomMin"]=125,
+ ["SuperscriptShiftUp"]=400,
+ ["SuperscriptShiftUpCramped"]=275,
+ ["UnderbarExtraDescender"]=66,
+ ["UnderbarRuleThickness"]=66,
+ ["UnderbarVerticalGap"]=198,
+ ["UpperLimitBaselineRiseMin"]=300,
+ ["UpperLimitGapMin"]=150,
+}
+
+local two = {
+ ["AccentBaseHeight"]=480,
+ ["AxisHeight"]=258,
+ ["DelimitedSubFormulaMinHeight"]=1325,
+ ["DisplayOperatorMinHeight"]=1800,
+ ["FlattenedAccentBaseHeight"]=656,
+ ["FractionDenominatorDisplayStyleGapMin"]=150,
+ ["FractionDenominatorDisplayStyleShiftDown"]=640,
+ ["FractionDenominatorGapMin"]=68,
+ ["FractionDenominatorShiftDown"]=585,
+ ["FractionNumeratorDisplayStyleGapMin"]=150,
+ ["FractionNumeratorDisplayStyleShiftUp"]=640,
+ ["FractionNumeratorGapMin"]=68,
+ ["FractionNumeratorShiftUp"]=585,
+ ["FractionRuleThickness"]=68,
+ ["LowerLimitBaselineDropMin"]=670,
+ ["LowerLimitGapMin"]=135,
+ ["MathLeading"]=150,
+ ["MinConnectorOverlap"]=100,
+ ["OverbarExtraAscender"]=68,
+ ["OverbarRuleThickness"]=68,
+ ["OverbarVerticalGap"]=175,
+ ["RadicalDegreeBottomRaisePercent"]=55,
+ ["RadicalDisplayStyleVerticalGap"]=170,
+ ["RadicalExtraAscender"]=78,
+ ["RadicalKernAfterDegree"]=-335,
+ ["RadicalKernBeforeDegree"]=65,
+ ["RadicalRuleThickness"]=68,
+ ["RadicalVerticalGap"]=85,
+ ["ScriptPercentScaleDown"]=70,
+ ["ScriptScriptPercentScaleDown"]=55,
+ ["SkewedFractionHorizontalGap"]=350,
+ ["SkewedFractionVerticalGap"]=68,
+ ["SpaceAfterScript"]=40,
+ ["StackBottomDisplayStyleShiftDown"]=690,
+ ["StackBottomShiftDown"]=385,
+ ["StackDisplayStyleGapMin"]=300,
+ ["StackGapMin"]=150,
+ ["StackTopDisplayStyleShiftUp"]=780,
+ ["StackTopShiftUp"]=470,
+ ["StretchStackBottomShiftDown"]=590,
+ ["StretchStackGapAboveMin"]=68,
+ ["StretchStackGapBelowMin"]=68,
+ ["StretchStackTopShiftUp"]=800,
+ ["SubSuperscriptGapMin"]=150,
+ ["SubscriptBaselineDropMin"]=160,
+ ["SubscriptShiftDown"]=210,
+ ["SubscriptTopMax"]=368,
+ ["SuperscriptBaselineDropMax"]=230,
+ ["SuperscriptBottomMaxWithSubscript"]=380,
+ ["SuperscriptBottomMin"]=120,
+ ["SuperscriptShiftUp"]=360,
+ ["SuperscriptShiftUpCramped"]=252,
+ ["UnderbarExtraDescender"]=68,
+ ["UnderbarRuleThickness"]=68,
+ ["UnderbarVerticalGap"]=175,
+ ["UpperLimitBaselineRiseMin"]=300,
+ ["UpperLimitGapMin"]=135,
+}
+
+local designrelated = {
+ ["AccentBaseHeight"] = "optional**",
+ ["AxisHeight"] = "mandate",
+ ["FlattenedAccentBaseHeight"] = "optional**",
+ ["FractionRuleThickness"] = "optional",
+ ["MinConnectorOverlap"] = "mandate",
+ ["OverbarRuleThickness"] = "optional*",
+ ["RadicalDegreeBottomRaisePercent"] = "mandate",
+ ["UnderbarRuleThickness"] = "optional*",
+}
+
+local a1 = two.AccentBaseHeight / one.AccentBaseHeight
+local a2 = two.AxisHeight / one.AxisHeight
+
+context.starttabulate { "|l|r|r|r|r|l|" }
+ context.FL()
+ context.BC() context("constant")
+ context.BC() context("stix")
+ context.BC() context("xits")
+ context.BC() context("base")
+ context.BC() context("axis")
+ context.BC() context("relevance")
+ context.BC() context.NR()
+ context.ML()
+ for key, oldvalue in table.sortedhash(one) do
+ local newvalue = two[key]
+ local accvalue = math.round(oldvalue * a1)
+ local axivalue = math.round(oldvalue * a2)
+ context.NC() context(key)
+ context.NC() context(newvalue)
+ context.NC() context(oldvalue)
+ context.NC() if newvalue == accvalue then context.bold(accvalue) else context(accvalue) end
+ context.NC() if newvalue == axivalue then context.bold(axivalue) else context(axivalue) end
+ context.NC() context(designrelated[key])
+ context.NC() context.NR()
+ end
+ context.LL()
+context.stoptabulate()
+\stopluacode
+
+Very few values are the same. So, what exactly do these constants tell us? You
+can even wonder why they are there at all. Just think of this: we want to typeset
+math, and we have an engine that we can control. We know how we want it to look.
+So, what do these constants actually contribute? Plenty relates to the height and
+depth of the nucleus and|/|or the axis. The fact that we have to fix some in the
+goodie files, and the fact that we actually need more variables that control
+positioning, makes for a good argument to just ignore most of the ones provided
+by the font, especially when they seem somewhat arbitrarily. Can it be that font
+designers are just gambling a bit, looking at another font, and starting from
+there?
+
+The relationship between \TEX's math font parameters and the \OPENTYPE\ math
+constants is not one|-|to|-|one. Mapping them onto each other is possible but
+actually is font dependent. However, we can assume that the values of Computer
+Modern are leading.
+
+The \typ {AxisHeight}, \typ {AccentBaseHeight} and \typ
+{FlattenedAccentBaseHeight} are set to the x|-|height, a value that is defined in
+all fonts. The \typ {SkewedFractionVerticalGap} also gets that value. Other
+variables relate to the em|-|width (or \type {\quad}), for instance the \typ
+{SkewedFractionHorizontalGap} that gets half that value. Of course these last two
+then assume that the engine handles skewed fractions.
+
+Variables that directly map onto each other are \typ {StretchStackGapBelowMin} as
+\typ {bigopspacing1}, \typ {StretchStackTopShiftUp} as \typ {bigopspacing3}, \typ
+{StretchStackGapAboveMin} as \typ {bigopspacing2} and \typ
+{StretchStackBottomShiftDown} as \typ {bigopspacing4}. However, these clash with
+\typ {UpperLimitBaselineRiseMin} as \typ {bigopspacing3}, \typ {UpperLimitGapMin}
+as \typ {bigopspacing1}, \typ {LowerLimitBaselineDropMin} as \typ {bigopspacing4}
+and \typ {LowerLimitGapMin} as \typ {bigopspacing2}. Where in traditional fonts
+these are the same, in \OPENTYPE\ they can be different. Should they be?
+
+Internally we use different names for variables, simply because the engine has
+some parameters that \OPENTYPE\ maths hasn't. So we have \typ {limit_above_kern}
+and \typ {limit_below_kern} for \typ {bigopspacing5}.
+
+A couple of parameters have different values for (cramped) displaystyle. The \typ
+{FractionDelimiterSize} and \typ {FractionDelimiterDisplayStyleSize} use \typ
+{delim2} and \typ {delim1}. The \typ {FractionDenominatorShiftDown} and \typ
+{FractionDenominatorDisplayStyleShiftDown} map onto \typ {denom2} and \typ
+{denom1} and their numerator counterparts from \typ {num2} and \typ {num1}. The
+\typ {Stack*} parameters also use these. The \typ {sub1}, \typ{sub2}, \typ{sup1},
+\typ{sup2}, \typ{sup3}, and \typ {supdrop} can populate the \type {Sub*} and
+\type {Super*} parameters, also in different styles.
+
+The rest of the parameters can be defined in terms of the default rulethickness,
+quad or xheight, often multiplied by a factor. For some we see the \type {1/18}
+show up a number that we also see with muskips. Some constants can be set from
+registers, like \typ {SpaceAfterScript} which is just \type {\scriptspace}.
+
+If you look at the \LUATEX\ source you wil find a section where this mapping is
+done in the case of a traditional font, that is: one without a math constants
+table. In \LUAMETATEX\ we don't need to do this because font loading happens in
+\LUA. So we simply issue an error when the math engine can't resolve a mandate
+parameter. The fact that we have a partial mapping from math constants onto
+traditional parameters and that \LUATEX\ has to deal with the traditional ones
+too make for a somewhat confusing landscape. When in \LUAMETATEX\ we assume wide
+fonts to be used that have a math constants table, we can probably clean up some
+of this.
+
+We need to keep in mind that Cambria was the starting point, and it did borrow
+some concepts from \TEX. But \TEX\ had parameters because there was not enough
+information in the glyphs! Also, Cambria was meant for \MSWORD, and a word
+processor is unlikely to provide the level of control that \TEX\ offers, so it
+needs some directions with respect to e.g.\ spacing. Without user control, it has
+to come up with acceptable compromises. So actually the \LUAMETATEX\ math engine
+can be made a bit cleaner when we just get rid of these parameters.
+
+So, which constants are actually essential? The \typ {AxisHeight} is important
+and also design related. Quite likely this is where the minus sits above the
+baseline. It is used for displacements of the baseline so that for instance
+fractions nicely align. When testing script anchored to fences we noticed that
+the parenthesis in XITS had too little depth while STIX had the expected amount.
+This relates to anchoring relative to the math axis.
+
+Is there a reason why \typ {UnderbarRuleThickness} and \typ
+{OverbarRuleThickness} should differ? If not, then we only need a variable that
+somehow tells us what thickness fits best with the other top and bottom accents.
+It is quite likely the same as the \typ {RadicalRuleThickness}, which is needed
+to extend the radical symbol. So, here three constants can be replaced by one
+design related one. The \typ {FractionRuleThickness} can also be derived from
+that, but more likely is that it is a quantity that the macro package sets up
+anyway, maybe related to rules used elsewhere.
+
+The \typ {MinConnectorOverlap} and \typ {RadicalDegreeBottomRaisePercent} also
+are related to the design although one could abuse the top accent anchor for the
+second one. So they are important. However, given the small number of
+extensibles, they could have been part of the extensible recipes.
+
+The \typ {AccentBaseHeight} and \typ {FlattenedAccentBaseHeight} might relate to
+the margin that the designer put below the accent as part of the glyph, so it is
+kind of a design related constant. Nevertheless, we fix quite some accents in the
+goodie files because they can be inconsistent. That makes these constants
+somewhat dubious too. If we have to check a font, we can just as well set up
+constants that we need in the goodie file. Also, isn't it weird that there are no
+bottom variants?
+
+We can forget about \typ {MathLeading} as it serves no purpose in \TEX. The \typ
+{DisplayOperatorMinHeight} is often set wrong so although we fix that in the
+goodie file it might be that we just can use an internal variable. It is not the
+font designer who decides that anyway. The same is true for \typ
+{DelimitedSubFormulaMinHeight}.
+
+If we handle skewed fractions, \typ {SkewedFractionHorizontalGap} and \typ
+{SkewedFractionVerticalGap} might give an indication of the tilt but why do we
+need two? It is design related though, so they have some importance, when set
+right.
+
+The rest can be grouped, and basically we can replace them by a consistent set of
+engine parameters. We can still set them up per font, but at least we can then
+use a clean set. Currently, we already have more. For instance, why only \typ
+{SpaceAfterScript} and not one for before, and how about prescripts and primes?
+If we have to complement them with additional ones and also fix them, we can as
+well set up all these script related variables.
+
+For fractions the font provides \typ {FractionDenominatorDisplayStyleGapMin},
+\typ {FractionDenominatorDisplayStyleShiftDown}, \typ
+{FractionDenominatorGapMin}, \typ {FractionDenominatorShiftDown}, \typ
+{FractionNumeratorDisplayStyleGapMin}, \typ
+{FractionNumeratorDisplayStyleShiftUp}, \typ {FractionNumeratorGapMin} and \typ
+{FractionNumeratorShiftUp}. We might try to come up with a simpler model.
+
+Limits have: \typ {LowerLimitBaselineDropMin}, \typ {LowerLimitGapMin}, \typ
+{UpperLimitBaselineRiseMin} and \typ {UpperLimitGapMin}. Limits are tricky anyway
+as they also depend on abusing the italic correction for anchoring.
+
+Horizontal bars are driven by \typ {OverbarExtraAscender}, \typ
+{OverbarVerticalGap}, \typ {UnderbarExtraDescender} and \typ
+{UnderbarVerticalGap}, but for e.g.\ arrows we are on our own, so again a not so
+useful set.
+
+Then radicals: we need some more than these \typ
+{RadicalDisplayStyleVerticalGap}, \typ {RadicalExtraAscender}, \typ
+{RadicalKernAfterDegree}, \typ {RadicalKernBeforeDegree} and \typ
+{RadicalVerticalGap}, and because we really need to check these there is no gain
+having them in the font.
+
+Isn't it more a decision by the macro package how script and scriptscript should
+be scaled? Currently we listen to \typ {ScriptPercentScaleDown} and \typ
+{ScriptScriptPercentScaleDown}, but maybe it relates more to usage.
+
+We need more control than just \typ {SpaceAfterScript} and an engine could
+provide it more consistently. It's a loner.
+
+How about \typ {StackBottomDisplayStyleShiftDown}, \typ {StackBottomShiftDown},
+\typ {StackDisplayStyleGapMin}, \typ {StackGapMin}, \typ
+{StackTopDisplayStyleShiftUp} and \typ {StackTopShiftUp}? And isn't this more for
+the renderer to decide: \typ {StretchStackBottomShiftDown}, \typ
+{StretchStackGapAboveMin}, \typ {StretchStackGapBelowMin} and \typ
+{StretchStackTopShiftUp}?
+
+This messy bit can also be handled more convenient so what exactly is the
+relationship with the font design of \typ {SubSuperscriptGapMin}, \typ
+{SubscriptBaselineDropMin}, \typ {SubscriptShiftDown}, \typ {SubscriptTopMax},
+\typ {SuperscriptBaselineDropMax}, \typ {SuperscriptBottomMaxWithSubscript}, \typ
+{SuperscriptBottomMin}, \typ {SuperscriptShiftUp} and \typ
+{SuperscriptShiftUpCramped}?
+
+Just for the record, here are the (font related) ones we added so far. A set of
+prime related constants similar to the script ones: \typ {PrimeRaisePercent},
+\typ {PrimeRaiseComposedPercent}, \typ {PrimeShiftUp}, \typ
+{PrimeBaselineDropMax}, \typ {PrimeShiftUpCramped}, \typ {PrimeSpaceAfter} and
+\typ {PrimeWidthPercent}. Of course, we also added \typ {SpaceBeforeScript} just
+because we want to be symmetrical in the engine where we also have to deal with
+prescripts.
+
+These we provide for some further limit positioning: \typ {NoLimitSupFactor} and
+\typ {NoLimitSubFactor}; these for delimiters: \typ {DelimiterPercent} and \typ
+{DelimiterShortfall}; and these for radicals in order to compensate for sloping
+shapes: \typ {RadicalKernAfterExtensible} and \typ {RadicalKernBeforeExtensible}
+because we have doublesided radicals.
+
+Finally, there are quite some (horrible) accent tuning parameters: \typ
+{AccentTopShiftUp}, \typ {AccentBottomShiftDown}, \typ
+{FlattenedAccentTopShiftUp}, \typ {FlattenedAccentBottomShiftDown}, \typ
+{AccentBaseDepth}, \typ {AccentFlattenedBaseDepth}, \typ {AccentTopOvershoot},
+\typ {AccentBottomOvershoot}, \typ {AccentSuperscriptDrop}, \typ
+{AccentSuperscriptPercent} and \typ {AccentExtendMargin}, but we tend to move
+some of that to the tweaks on a per accent basis.
+
+Setting these parameters right is not trivial, and also a bit subjective. We might,
+however, assume that for instance the math axis is set right, but alas, when we
+were fixing the less and greater symbols in Lucida Bright Math, we found that all
+symbols actually were designed for a math axis of 325, instead of the given
+value 313, and that difference can be seen!
+
+\startbuffer
+\scale[s=2]{\dm{
+ 2 > -\left\{\frac{1}{1+x^2}\right\}
+}}
+\stopbuffer
+
+\startlinecorrection
+\startcombination[nx=2]
+ \startcontent
+ % \definefontfeature[mathextra][goodies=]
+ \switchtobodyfont[lucidaold]
+ \showglyphs
+ \getbuffer
+ \stopcontent
+ \startcaption
+ Old Lucida
+ \stopcaption
+ \startcontent
+ \switchtobodyfont[lucida]
+ \showglyphs
+ \getbuffer
+ \stopcontent
+ \startcaption
+ New Lucida
+ \stopcaption
+\stopcombination
+\stoplinecorrection
+
+The assumption is that the axis goes trough the middle of
+the minus. Luckily it was relatively easy to fix these two symbols (they also had
+to be scaled, maybe they originate in the text font?) and adapt the
+axis. We still need to check all the other fonts, but it looks like they are okay,
+which is good because the math axis plays an important role in rendering math.
+It is one of the few parameters that has to be present and right. A nice side
+effect of this is that we end up with discussing new (\CONTEXT) features. One
+can for instance shift all non-character symbols down just a little and lower
+the math axis, to get a bit more tolerance in lines with many inline fractions,
+radicals or superscripts, that otherwise would result in interline skips.
+
+A first step in getting out of this mess is to define {\em all} these parameters
+in the goodie file where we fix them anyway. That way we are at least not
+dependent on changes in the font. We are not a word processor so we have way more
+freedom to control matters. And preset font parameters sometimes do more harm
+than good. A side effect of a cleanup can be that we get rid of the evolved mix
+of uppercase and lowercase math control variables and can be more consistent.
+Ever since \LUATEX\ got support for \OPENTYPE, math constants names have been
+mapped and matched to traditional \TEX\ font parameters.
+
+\stopsection
+
+\startsection[title=Metrics]
+
+With metrics we refer to the dimensions and other properties of math glyphs. The
+origin of digital math fonts is definitely Computer Modern and thereby the
+storage of properties is bound to the \TFM\ file format. That format is binary
+and can be loaded fast. It can also be stored in the format, unless you're using
+\LUATEX\ or \LUAMETATEX\ where \LUA\ is the storage format. A \TFM\ file stores
+per character the width, height, depth and italic correction. The file also
+contains font parameters. In math fonts there are extensible recipes and there is
+information about next in size glyphs. The file has kerning and ligature tables
+too.
+
+Given the times \TEX\ evolved in, the format is rather compact. For instance, the
+height, depth and italic correction are shared and indices to three shared values
+are used. There can be 16 heights and depths and 64 italic corrections. That way
+much fits into a memory word.
+
+The documentation tells us that \quotation {The italic correction of a character
+has two different uses. (a)~In ordinary text, the italic correction is added to
+the width only if the \TEX\ user specifies \quote{\type {\/}} after the
+character. (b)~In math formulas, the italic correction is always added to the
+width, except with respect to the positioning of subscripts.} It is this last
+phenomena that gives us some trouble with fonts in \OPENTYPE\ math. The fact that
+traditional fonts cheat with the width and that we add and selectively remove or
+ignore the correction makes for fuzzy code in \LUATEX\ although splitting the
+code paths and providing options to control all this helps a bit. In \LUAMETATEX\
+we have more control but also expect an \OPENTYPE\ font. In \OPENTYPE\ math there
+are italic corrections, and we even have the peculiar usage of it in positioning
+limits. However, the idea was that staircase kerns do the detailed relative
+positioning.
+
+Before we dive into this a bit more, it is worth mentioning that Don Knuth paid a
+lot of attention to details. The italic alphabet in math uses the same shapes as
+the text italic but metrics are different as is shown below. We have also met fonts
+where it looked like the text italics were taken, and where the metrics were handled
+via more excessive italic correction, sometimes combined with staircase kerns that
+basically were corrections for the side bearing. This is why we always come back to
+Latin Modern and Cambria when we investigate fonts: one is based on the traditional
+\TEX\ model, with carefully chosen italic corrections, and the other is based on the
+\OPENTYPE\ model with staircase kerning. They are our reference fonts.
+
+\startlinecorrection
+\startcombination[nx=1,ny=2]
+ \startcontent
+ \definedfont[file:lmroman10italic.otf]%
+ \showglyphs
+ \scale[s=3]{abcdefghijklmnopqrstuvwxyz}
+ \stopcontent
+ \startcaption
+ Latin Modern Roman Italic
+ \stopcaption
+ \startcontent
+ \definedfont[file:latinmodernmath.otf]%
+ \showglyphs
+ \scale[s=3]{𝑎𝑏𝑐𝑑𝑒𝑓𝑔ℎ𝑖𝑗𝑘𝑙𝑚𝑛𝑜𝑝𝑞𝑟𝑠𝑡𝑢𝑣𝑤𝑥𝑦𝑧}
+ \stopcontent
+ \startcaption
+ Latin Modern Math Italic
+ \stopcaption
+\stopcombination
+\stoplinecorrection
+
+In \CONTEXT\ \MKIV\ we played a lot with italic correction in math and there were
+ways to enforce, ignore, selectively apply it, etc. But, because fonts actually
+demand a mixture, in \LUAMETATEX\ we ended up with more extensive runtime
+patching of them. Another reason for this was that math fonts can have weird
+properties. It looks like when these standards are set and fonts are made, the
+font makers can do as they like as long as the average formula comes out right,
+and metrics to some extent resemble a traditional font. However, when testing how
+well a font behaves in a real situation there can be all kind of interferences
+from the macro package: inter|-|atom kerning, spacing corrections macros,
+specific handling of cases, etc. We even see \OPENTYPE\ fonts that seem to
+have the same limited number of heights, depths and italic corrections. And, as a
+consequence we get for instance larger sizes of fences having the same depth for
+all the size variants, something that is pretty odd for an \OPENTYPE\ font with no
+limitations.
+
+The italic correction in traditional \TEX\ math gets added to the width. When a
+subscript is attached to a kernel character it sits tight against that character:
+its position is driven by the width of the kernel. A superscript on the other
+hand is moved over the italic width so that it doesn't overlap or touch the
+likely sticking out bit of the kernel. This means that a traditional font (and
+quite some \OPENTYPE\ math fonts are modelled after Computer Modern) have to find
+compromises of width and italic correction for characters where the subscript is
+supposed to move left (inside the bounding box of the kernel).
+
+The \OPENTYPE\ specification has some vague remarks about applying italic
+correction between the last in a series of slanted shapes and operators, as well
+as positioning limits, and suggests that it relates to relative super- and
+subscript positioning. It doesn't mention that the correction is to be added to
+the width. However, the main mechanism for anchoring script are these top and
+bottom edge kerns. It's why in fonts that provide these, we are unlikely to find
+italic correction unless it is used for positioning limits.
+
+It is for that reason that an engine can produce reasonable results for fonts
+that either provide italics or provide kerns for anchoring: having both on the
+same glyph would mean troubles. It means that we can configure the engine options
+to add italic correction as well as kerns, assuming distinctive usage of those
+features. For a font that uses both we need to make a choice (this is possible,
+since we can configure options per font). But that will never lead to always nicely
+typeset math. In fact, without tweaks many fonts will look right because in
+practice they use some mixture. But we are not aiming at partial success, we want
+all to look good.
+
+Here is another thing to keep in mind (although now we are guessing a bit). There
+is a limited number of heights and depths in \TEX\ fonts possible (16), but four
+times as many italic corrections can be defined (64). Is it because Don Knuth
+wanted to properly position the sub- and subscripts? Adding italic correction to
+the width is pretty safe: shapes should not overlap. Choosing the right width for
+a subscript needs more work because it's is more visual. In the end we have a
+width that is mostly driven by superscript placement! That also means that as
+soon as we remove the italic correction things start looking bad. In fact,
+because also upright math characters have italic correction the term \quote
+{italic} is a bit of a cheat: it's all about script positioning and has little to
+do with the slope of the shapes.
+
+One of the reasons why for instance spacing between an italic shape and an
+upright one in \TEX\ works out okay is that in most cases they come from a
+different font, which can be used as criterium for keeping the correction;
+between a sequence of same|-|font characters it gets removed. However, in
+\OPENTYPE\ math there is a good chance that all comes from the same font (at
+least in \CONTEXT), unless one populates many families as in traditional \TEX. We
+have no clue how other macro packages deal with this but it might well be the
+case that using many families (one for each alphabet) works better in the end.
+The engine is really shape and alphabet agnostic, but one can actually wonder if
+we should add a glyph property indicating the distinctive range. It would provide
+engine level control over a run of glyphs (like multiplying a variable
+represented by a greek alpha by another variable presented by an upright b).
+
+But glyph properties cannot really be used here because we are still dealing with
+characters when the engine transforms the noad list into a node list. So, when we
+discussed this, we started wondering how the engine could know about a specific
+shape (and tilt) property at all, and that brought us to pondering about an
+additional axis of options. We already group characters in classes, but we can
+also group them with properties like \typ {tilted}, \typ {dotless}, \typ {bold}.
+When we pair atoms we can apply options, spacing and such based on the specific
+class pair, and we can do something similar with category pairs. It basically
+boils down to for instance \type {\mccode} that binds a character to a category.
+Then we add a command like \typ {\setmathcategorization} (analogue to \typ
+{\setmathspacing}) that binds options to pairs of categories. An easier variant
+of this might be to let the \type {\mccode} carry a (bit)set of options that then
+get added to the already existing options that can be bound to character noads as
+we create them. This saves us some configuration. Deciding what suits best
+depends on what we want to do: the fact that \TEX\ doesn't do this means that
+probably no one ever gave it much thought, but once we do have this mechanism it
+might actually trigger demand, if only by staring at existing documents where
+characters of a different kind sit next to each other (take this \quote {a}
+invisible times \quote {x}). It would not be the first time that (in \CONTEXT)
+the availability of some feature triggers creative (ab)usage.
+
+Because the landscape has settled, because we haven't seen much fundamental
+evolution in \OPENTYPE\ math, because in general \TEX\ math doesn't really
+evolve, and because \CONTEXT\ in the past has not been seen as suitable for
+ math, we can, as mentioned before, basically decide what approach we
+follow. So, that is why we can pick up on this italic correction in a more
+drastic way: we can add the correction to the width, thereby creating a nicely
+bounded glyph, and moving the original correction to the right bottom kern, as
+that is something we already support. In fact, this feature is already available,
+we only had to add setting the right bottom kern. The good news is that we don't
+need to waste time on trying to get something extra in the font format, which is
+unlikely to happen anyway after two decades.
+
+It is worth noticing that when we were exploring this as part of using \METAPOST\
+to analyze and visualize these aspects, we also reviewed the \typ {wipeitalics}
+tweak and wondered if, in retrospect, it might be a dangerous one when applied to
+alphabets (for digits and blackboard bold letters it definitely makes
+sense): it can make traditional super- and subscript anchoring less optimal.
+However, for some fonts we found that improper bounding boxes can badly interfere
+anyway: for instance the upright \quote {f} in EBGaramond sticks out left and
+right, and has staircase kerns that make scripts overlap. The right top of the
+shape sticks out a lot and that is because the text font variant is used. We already decided to
+add a \typ {moveitalics} tweak that moves italic kerns into the
+width and then setting a right bottom kern that compensates it that can be a
+pretty good starting point for our further exploration of optimal kerns at the
+corners. That tweak also fixes the side bearings (negative llx) and compensates
+left kerns (when present) accordingly. An additional \typ {simplifykerns} tweak
+can later migrate staircase kerns to simple kerns.
+
+So, does that free us from tweaks like \typ {dimensions} and \typ {kerns}? Not
+completely. But we can forget about the italic correction
+in most cases. We have to set up less lower right kerns and maybe correct a few.
+It is just a more natural solution. So how about these kerns that we need to
+define? After all, we also have to deal with proper top kerns, and like to add
+kerns that are not there simply because the mentioned comprise between width,
+italic and the combination was impossible. More about that in the next section.
+
+\stopsection
+
+\startsection[title=Kerning]
+
+In the next pictures we will try to explain more visual what we have in mind and
+are experimenting with as we write this. In the traditional approach we have
+shapes that can communicate the width, height, depth and italic correction to the
+engine so that is what the engine can work with. The engine also has the
+challenge to anchor subscripts and superscripts in a visual pleasing way.
+
+\startMPdefinitions
+ numeric UsedUnit ; UsedUnit = 1mm ;
+ numeric UsedWidth ; UsedWidth := 10UsedUnit ;
+ numeric UsedItalic ; UsedItalic := 2UsedUnit ;
+ numeric UsedScript ; UsedScript = 5UsedUnit;
+ picture LeftCharA ; LeftCharA := image(
+ draw origin -- (UsedWidth,UsedWidth)
+ withpen pencircle scaled 2UsedUnit
+ withcolor .4white ;
+ path p ; p := boundingbox currentpicture ;
+ draw rightboundary currentpicture
+ bottomenlarged -5UsedUnit
+ withpen pencircle scaled .5UsedUnit ;
+ setbounds currentpicture to p ;
+ draw origin
+ withpen pencircle scaled 1UsedUnit
+ withcolor .1white ;
+ setbounds currentpicture to boundingbox currentpicture
+ leftenlarged -UsedItalic
+ rightenlarged -UsedItalic ;
+ draw boundingbox currentpicture
+ withpen pencircle scaled .1UsedUnit ;
+ ) ;
+ picture RightCharA ; RightCharA := image(
+ draw (0,UsedWidth) -- (UsedWidth,0)
+ withpen pencircle scaled 2UsedUnit
+ withcolor .6white ;
+ path p ; p := boundingbox currentpicture ;
+ draw rightboundary currentpicture
+ bottomenlarged -5UsedUnit
+ withpen pencircle scaled .5UsedUnit ;
+ setbounds currentpicture to p ;
+ draw origin
+ withpen pencircle scaled 1UsedUnit
+ withcolor .1white ;
+ setbounds currentpicture to boundingbox currentpicture
+ leftenlarged -UsedItalic
+ rightenlarged -UsedItalic ;
+ draw boundingbox currentpicture
+ withpen pencircle scaled .1UsedUnit ;
+ ) ;
+ picture LeftCharB ; LeftCharB := image(
+ draw origin -- (UsedWidth,UsedWidth)
+ withpen pencircle scaled 2UsedUnit
+ withcolor .4white ;
+ path p ; p := boundingbox currentpicture ;
+ draw origin
+ withpen pencircle scaled 1UsedUnit
+ withcolor .1white ;
+ draw boundingbox currentpicture
+ withpen pencircle scaled .1UsedUnit ;
+ draw lrcorner p
+ shifted (-UsedItalic,0)
+ withpen pencircle scaled 1UsedUnit
+ withcolor .1white ;
+ draw urcorner p
+ withpen pencircle scaled 1UsedUnit
+ withcolor .1white ;
+ setbounds currentpicture to p ;
+ ) ;
+ picture RightCharB ; RightCharB := image(
+ draw (0,UsedWidth) -- (UsedWidth,0)
+ withpen pencircle scaled 2UsedUnit
+ withcolor .6white ;
+ path p ; p := boundingbox currentpicture ;
+ draw origin
+ withpen pencircle scaled 1UsedUnit
+ withcolor .1white ;
+ draw boundingbox currentpicture
+ withpen pencircle scaled .1UsedUnit ;
+ draw lrcorner p
+ shifted (-UsedItalic,0)
+ withpen pencircle scaled 1UsedUnit
+ withcolor .1white ;
+ draw urcorner p
+ withpen pencircle scaled 1mm
+ withcolor .1white ;
+ setbounds currentpicture to p ;
+ ) ;
+ picture SuperScript ; SuperScript := image(
+ draw unitsquare scaled UsedScript
+ shifted (0,-UsedScript/2)
+ ) ;
+ picture SubScript ; SubScript := image(
+ draw unitsquare scaled UsedScript
+ shifted (0,-UsedScript/2)
+ ) ;
+ def WidenResultA =
+ setbounds currentpicture to boundingbox currentpicture
+ leftenlarged 6UsedUnit
+ rightenlarged 6UsedUnit;
+ enddef ;
+ def WidenResultB =
+ setbounds currentpicture to boundingbox currentpicture
+ topenlarged .5UsedScript
+ leftenlarged 6UsedUnit
+ rightenlarged 6UsedUnit;
+ enddef ;
+\stopMPdefinitions
+
+\startlinecorrection
+ \startcombination[nx=3,ny=1]
+ \startcontent
+ \startMPcode
+ draw LeftCharA ;
+ draw RightCharA xshifted (UsedWidth+UsedItalic+3UsedUnit) ;
+ WidenResultA ;
+ \stopMPcode
+ \stopcontent
+ \startcaption
+ two characters
+ \stopcaption
+ \startcontent
+ \startMPcode
+ draw LeftCharA ;
+ draw RightCharA xshifted UsedWidth ;
+ WidenResultA ;
+ \stopMPcode
+ \stopcontent
+ \startcaption
+ width only
+ \stopcaption
+ \startcontent
+ \startMPcode
+ draw LeftCharA ;
+ draw RightCharA xshifted (UsedWidth+UsedItalic) ;
+ WidenResultA ;
+ \stopMPcode
+ \stopcontent
+ \startcaption
+ with italic
+ \stopcaption
+ \stopcombination
+\stoplinecorrection
+
+In this graphic we show two pseudo characters. The shown bounding box indicates
+the width as seen by the engine. An example of such a shape is the math italic~f,
+and as it is used a lot in formulas it is also one of the most hard ones to handle
+when it comes to spacing: in nearly all fonts the right top sticks out and in
+some fonts the left part also does that. Imagine how that works out with scripts,
+fences and preceding characters.
+
+When we put two such characters together they will overlap, and this is why we need
+to add the italic correction. That is also why the \TEX\ documentation speaks in
+terms of \quotation {always add the italic correction to the width}. This also
+means that we need to remove it occasionally, something that you will notice when
+you study for instance the \LUATEX\ source, that has a mix of traditional and
+\OPENTYPE\ code paths. Actually, compensating can either be done by changing the
+width property of a glyph node or by explicitly adding a kern. In \LUAMETATEX\ we
+always add real kerns because we can then trace better.
+
+The last graphic in the above set shows how we compensate the width for the bit
+that sticks out. It also shows that we definitely need to take neighboring shapes
+into account when we determine the width and italic correction, especially when
+the later is {\em not} applied (read: removed).
+
+\startlinecorrection
+ \startcombination[nx=3,ny=1]
+ \startcontent
+ \startMPcode
+ draw LeftCharA ;
+ path p ; p := boundingbox currentpicture ;
+ draw SuperScript
+ shifted urcorner p xshifted UsedScript ;
+ draw SubScript
+ shifted lrcorner p xshifted UsedScript ;
+ WidenResultB ;
+ \stopMPcode
+ \stopcontent
+ \startcaption
+ kernel
+ \stopcaption
+ \startcontent
+ \startMPcode
+ draw LeftCharA ;
+ path p ; p := boundingbox currentpicture ;
+ draw SuperScript
+ shifted urcorner p ;
+ draw SubScript
+ shifted lrcorner p ;
+ WidenResultB ;
+ \stopMPcode
+ \stopcontent
+ \startcaption
+ subscript
+ \stopcaption
+ \startcontent
+ \startMPcode
+ draw LeftCharA ;
+ path p ; p := boundingbox currentpicture ;
+ draw SuperScript
+ shifted urcorner p
+ xshifted UsedItalic ;
+ draw SubScript
+ shifted lrcorner p ;
+ WidenResultB ;
+ \stopMPcode
+ \stopcontent
+ \startcaption
+ superscript
+ \stopcaption
+ \stopcombination
+\stoplinecorrection
+
+Here we anchored a super- and subscript. The subscript position it tight to the
+advance width, again indicated by the box. The superscript however is moved by
+the italic correction and in the engine additional spacing before and after can
+be applied as well, but we leave that for now. It will be clear that when the
+font designer chooses the width and italic correction, the fact that scripts get
+attached has to be taken into account.
+
+\startlinecorrection
+ \startcombination[nx=2,ny=1]
+ \startcontent
+ \startMPcode
+ draw LeftCharB ;
+ draw RightCharB xshifted (UsedWidth+UsedItalic+3UsedUnit) ;
+ WidenResultA ;
+ \stopMPcode
+ \stopcontent
+ \startcaption
+ two characters
+ \stopcaption
+ \startcontent
+ \startMPcode
+ draw LeftCharB ;
+ draw RightCharB xshifted (UsedWidth+UsedItalic) ;
+ WidenResultA ;
+ \stopMPcode
+ \stopcontent
+ \startcaption
+ width only
+ \stopcaption
+ \stopcombination
+\stoplinecorrection
+
+In this graphic we combine the italic correction with the width. Keep in mind
+that in these examples we use tight values but in practice that correction can
+also add some extra right side bearing (white space). This addition is an
+operation that we can do when loading a font. At the same time we also compensate
+the left edge for which we can use the x coordinate of the left corner of the
+glyphs real bounding box. The advance width starts at zero and that corner is
+then left of the origin. By looking at shapes we concluded that in most cases
+that shift is valid for usage in math where we don't need that visual overlap. In
+fact, when we tested some of that we found that the results can be quite horrible
+when you don't do that; not all fonts have left bottom kerning implemented.
+
+The dot at the right is actually indicating the old italic correction. Here we
+let it sit on the edge but as mentioned there can be additional (or maybe less)
+italic correction than tight.
+
+\startlinecorrection
+ \startcombination[nx=3,ny=1]
+ \startcontent
+ \startMPcode
+ draw LeftCharB ;
+ path p ; p := boundingbox currentpicture ;
+ draw SuperScript
+ shifted urcorner p xshifted UsedScript ;
+ draw SubScript
+ shifted lrcorner p xshifted UsedScript ;
+ WidenResultB ;
+ \stopMPcode
+ \stopcontent
+ \startcaption
+ kernel
+ \stopcaption
+ \startcontent
+ \startMPcode
+ draw LeftCharB ;
+ path p ; p := boundingbox currentpicture ;
+ draw SuperScript
+ shifted urcorner p ;
+ draw SubScript
+ shifted lrcorner p ;
+ WidenResultB ;
+ \stopMPcode
+ \stopcontent
+ \startcaption
+ superscript
+ \stopcaption
+ \startcontent
+ \startMPcode
+ draw LeftCharB ;
+ path p ; p := boundingbox currentpicture ;
+ draw SuperScript
+ shifted urcorner p ;
+ draw SubScript
+ shifted (-UsedItalic,0)
+ shifted lrcorner p ;
+ WidenResultB ;
+ \stopMPcode
+ \stopcontent
+ \startcaption
+ subscript
+ \stopcaption
+ \stopcombination
+\stoplinecorrection
+
+Finally we add the scripts here. This time we position the superscript and
+subscript at the top and bottom anchors. The bottom anchor is, as mentioned, the
+old italic correction, and the top one currently just the edge. And this is what
+our next project is about: identify the ideal anchors and use these instead.
+
+In the \CONTEXT\ goodie files (the files that tweak the math fonts runtime) we
+can actually already set these top and bottom anchors and the engine will use
+them when set. These kerns are not to be confused with the more complicated
+staircase kerns. They are much simpler and lightweight. The fact that we already
+have them makes it relatively easy to experiment with this.
+
+It must be noted that we talk about three kinds of kerns: inter character kerns,
+corner kerns and staircase kerns. We can set them all up with tweaks but so far
+we only did that for the most significant ones, like integrals. The question is:
+can we automate this? We should be careful because the bad top accent anchors in
+the \TEXGYRE\ fonts demonstrate how flawed heuristics can be. Interesting is that
+the developers of these font used \METAPOST\ and are highly qualified in that
+area. And for us using \METAPOST\ is also natural!
+
+The approach that we follow is somewhat interactive. When working on the math
+update we like to chat (with zoom) about these matters. We discuss and explore
+plenty and with these kerns we do the same. Because \METAPOST\ produces such nice
+and crispy graphics, and because \METAFUN\ is well integrated into \CONTEXT\ we
+can link all these subsystems and just look at what we get. A lot is about
+visualization: if we discuss so called \quote {grayness} in the perspective of
+kerning, we end up with calculating areas, then look at what it tells us and as a
+next step figure out some heuristic. And of course we challenge each other into
+new trickery.
+
+% THIS WILL BECOME A MODULE!
+
+\startluacode
+local formatters = string.formatters
+
+local glyph = nil
+local mpdata = nil
+
+local f_boundingbox = formatters["((%N,%N)--(%N,%N)--(%N,%N)--(%N,%N)--cycle)"]
+local f_vertical = formatters["((%N,%N)--(%N,%N))"]
+
+function mp.lmt_glyphshape_start(id,character)
+ if type(id) == "string" then
+ id = fonts.definers.internal({ name = id } ,"<module:fonts:shapes:font>")
+ end
+ local fontid = (id and id ~= 0 and id) or font.current()
+ local shapedata = fonts.hashes.shapes[fontid] -- by index
+ local characters = fonts.hashes.characters[fontid] -- by unicode
+ local descriptions = fonts.hashes.descriptions[fontid] -- by unicode
+ local shapeglyphs = shapedata.glyphs or { }
+ if type(character) == "string" and character ~= "" then
+ local hex = string.match(character,"^0x(.+)")
+ if hex then
+ character = tonumber(hex,16)
+ else
+ character = utf.byte(character)
+ end
+ else
+ character = tonumber(character)
+ end
+ local chardata = characters[character]
+ local descdata = descriptions[character]
+ if chardata then
+ glyph = shapeglyphs[chardata.index]
+ if glyph and (glyph.segments or glyph.sequence) and not glyph.paths then
+ local units = shapedata.units or 1000
+ local factor = 100/units
+ local width = (descdata.width or 0) * factor
+ local height = descdata.boundingbox[4] * factor
+ local depth = descdata.boundingbox[2] * factor
+ local math = descdata.math
+ local italic = (math and math.italic or 0) * factor
+ local accent = (math and math.accent or 0) * factor
+ mpdata = {
+ paths = fonts.metapost.paths(glyph,factor),
+ boundingbox = fonts.metapost.boundingbox(glyph,factor),
+ baseline = fonts.metapost.baseline(glyph,factor),
+ width = width,
+ height = height,
+ depth = depth,
+ italic = italic,
+ accent = accent,
+ usedbox = f_boundingbox(0,depth,width,depth,width,height,0,height),
+ usedline = f_vertical(0,0,width,0),
+ }
+ end
+ else
+ print("NO",id,character)
+ end
+end
+
+function mp.lmt_glyphshape_stop()
+ glyph = nil
+ mpdata = nil
+end
+
+function mp.lmt_glyphshape_n()
+ if mpdata then
+ mp.print(#mpdata.paths)
+ else
+ mp.inject.numeric(0)
+ end
+end
+
+function mp.lmt_glyphshape_path(i)
+ if mpdata then
+ mp.print(mpdata.paths[i])
+ else
+ mp.inject.pair(0,0)
+ end
+end
+
+function mp.lmt_glyphshape_boundingbox()
+ if mpdata then
+ mp.print(mpdata.boundingbox)
+ else
+ mp.inject.pair(0,0)
+ end
+end
+function mp.lmt_glyphshape_usedbox()
+ if mpdata then
+ mp.print(mpdata.usedbox)
+ else
+ mp.inject.pair(0,0)
+ end
+end
+
+function mp.lmt_glyphshape_baseline()
+ if mpdata then
+ mp.print(mpdata.baseline)
+ else
+ mp.inject.pair(0,0)
+ end
+end
+function mp.lmt_glyphshape_usedline()
+ if mpdata then
+ mp.print(mpdata.usedline)
+ else
+ mp.inject.pair(0,0)
+ end
+end
+
+function mp.lmt_glyphshape_width () mp.print(mpdata and mpdata.width or 0) end
+function mp.lmt_glyphshape_depth () mp.print(mpdata and mpdata.depth or 0) end
+function mp.lmt_glyphshape_height() mp.print(mpdata and mpdata.height or 0) end
+function mp.lmt_glyphshape_italic() mp.print(mpdata and mpdata.italic or 0) end
+function mp.lmt_glyphshape_accent() mp.print(mpdata and mpdata.accent or 0) end
+
+\stopluacode
+
+\startMPdefinitions
+ presetparameters "glyphshape" [
+ % id = "",
+ % character = "",
+ shape = true,
+ boundingbox = false,
+ baseline = false,
+ usedline = true,
+ usedbox = true,
+ ] ;
+
+def lmt_glyphshape = applyparameters "glyphshape" "lmt_do_glyphshape" enddef ;
+
+vardef glyphshape_start(expr id, character) =
+ lua.mp.lmt_glyphshape_start(id, character) ;
+enddef ;
+
+vardef glyphshape_stop = lua.mp.lmt_glyphshape_stop() ; enddef ;
+vardef glyphshape_n = lua.mp.lmt_glyphshape_n() enddef ;
+vardef glyphshape_path(expr i) = lua.mp.lmt_glyphshape_path(i) enddef ;
+vardef glyphshape_boundingbox = lua.mp.lmt_glyphshape_boundingbox() enddef ;
+vardef glyphshape_baseline = lua.mp.lmt_glyphshape_baseline() enddef ;
+vardef glyphshape_usedbox = lua.mp.lmt_glyphshape_usedbox() enddef ;
+vardef glyphshape_usedline = lua.mp.lmt_glyphshape_usedline() enddef ;
+vardef glyphshape_width = lua.mp.lmt_glyphshape_width() enddef ;
+vardef glyphshape_height = lua.mp.lmt_glyphshape_height() enddef ;
+vardef glyphshape_depth = lua.mp.lmt_glyphshape_depth() enddef ;
+vardef glyphshape_italic = lua.mp.lmt_glyphshape_italic() enddef ;
+vardef glyphshape_accent = lua.mp.lmt_glyphshape_accent() enddef ;
+
+vardef lmt_do_glyphshape =
+ image (
+ pushparameters "glyphshape" ;
+ lua.mp.lmt_glyphshape_start(getparameter "id", getparameter "character") ;
+ if getparameter "shape" :
+ draw for i=1 upto lua.mp.lmt_glyphshape_n() :
+ lua.mp.lmt_glyphshape_path(i) &&
+ endfor cycle ;
+ fi ;
+ if getparameter "boundingbox" :
+ draw
+ lua.mp.lmt_glyphshape_boundingbox()
+ withcolor red
+ ;
+ fi ;
+ if getparameter "usedline" :
+ draw
+ lua.mp.lmt_glyphshape_usedline()
+ withcolor green
+ ;
+ fi ;
+ if getparameter "usedbox" :
+ draw
+ lua.mp.lmt_glyphshape_usedbox()
+ withcolor blue
+ ;
+ fi ;
+ lua.mp.lmt_glyphshape_stop() ;
+ popparameters ;
+ )
+enddef ;
+
+\stopMPdefinitions
+
+\startplacefigure[location=none]
+\startMPcode[offset=1dk]
+picture leftchar ;
+picture rightchar ;
+path leftbbox ;
+path rightbbox ;
+numeric leftitalic ;
+numeric rightitalic ;
+numeric leftaccent ;
+numeric rightaccent ;
+
+numeric N ; N := 50 ;
+
+glyphshape_start("file:texgyrebonum-math.otf", "0x1D453") ;
+ leftchar := image (draw for i=1 upto glyphshape_n : glyphshape_path(i) && endfor cycle ;) ;
+ leftbbox := glyphshape_usedbox ;
+ leftaccent := glyphshape_accent ;
+ leftitalic := xpart urcorner leftbbox - glyphshape_italic ;
+glyphshape_stop ;
+glyphshape_start("file:texgyrebonum-math.otf", "0x1D45A") ;
+ rightchar := image (draw for i=1 upto glyphshape_n : glyphshape_path(i) && endfor cycle ;) ;
+ rightbbox := glyphshape_usedbox ;
+ rightaccent := glyphshape_accent ;
+ rightitalic := xpart urcorner rightbbox - glyphshape_italic ;
+glyphshape_stop ;
+
+rightchar := rightchar xshifted (xpart lrcorner leftbbox) ;
+rightbbox := rightbbox xshifted (xpart lrcorner leftbbox) ;
+
+rightaccent := rightaccent + xpart lrcorner leftbbox ;
+rightitalic := rightitalic + xpart lrcorner leftbbox ;
+
+numeric d ; d := (xpart lrcorner leftbbox) - leftitalic ;
+rightchar := rightchar shifted (d,0);
+rightbbox := rightbbox shifted (d,0);
+
+draw leftbbox withcolor 0.5white ;
+draw rightbbox withcolor 0.5white ;
+draw leftchar withpen pencircle scaled 1 ;
+draw rightchar withpen pencircle scaled 1 ;
+
+numeric miny, maxy ;
+
+miny := max(ypart lrcorner leftbbox, ypart llcorner rightbbox) ;
+maxy := min(ypart urcorner leftbbox, ypart ulcorner rightbbox) ;
+
+path testv ; testv := ((0,miny) -- (0,maxy)) xshifted (xpart lrcorner leftbbox) ;
+
+% % testv := testv shifted (d,0);
+% draw testv withcolor darkred ;
+
+path midpath, leftintersections, rightintersections ;
+pair leftintersection[], rightintersection[] ;
+
+numeric yta ; yta := 0 ;
+numeric minl ; minl := 1000 ;
+
+for i = 1 upto (N-1) :
+ midpath := (0, ypart point (i/N) along testv) -- (xpart urcorner rightbbox, ypart point (i/N) along testv);
+ for j within leftchar :
+ midpath := midpath cutbeforelast pathpart j ;
+ endfor
+ for j within rightchar :
+ midpath := midpath cutafterfirst pathpart j ;
+ endfor
+
+ if ( (i = 1) or ((xpart point 1 of midpath) - (xpart point 0 of midpath) < minl) ) :
+ minl := (xpart point 1 of midpath) - (xpart point 0 of midpath) ;
+ fi
+
+ if ((xpart point 0 of midpath) < eps) or ((xpart point 1 of midpath) > ((xpart urcorner rightbbox) - eps)) :
+ draw midpath withpen pencircle scaled 1 withcolor 0.1[white,darkgreen] withtransparency (1,0.5) ;
+ midpath := (point 0 of midpath) && cycle ;
+ fi
+
+ draw midpath withcolor 0.4[white,darkgreen] ;
+ draw point 0 of midpath withpen pencircle scaled 1 withcolor darkgreen ;
+ draw point 1 of midpath withpen pencircle scaled 1.25 withcolor darkgreen ;
+
+ yta := yta + (1/N)*((xpart point 1 of midpath) - (xpart point 0 of midpath)) ;
+endfor
+
+drawarrow (origin -- ((xpart lrcorner leftbbox) - leftitalic,0)) shifted (urcorner leftbbox) withcolor "orange" ;
+drawarrow (origin -- ((xpart lrcorner rightbbox) - rightitalic - d,0)) shifted (urcorner rightbbox) withcolor "orange" ;
+
+% draw (leftaccent, (ypart urcorner leftbbox )) withcolor "darkblue" withpen pencircle scaled 3 ;
+% draw (rightaccent + d, (ypart urcorner rightbbox)) withcolor "darkblue" withpen pencircle scaled 3 ;
+
+\stopMPcode
+
+\stopplacefigure
+
+
+We are sure that getting this next stage in the perfection of math typesetting in
+\CONTEXT\ and \LUAMETATEX\ will take quite some time, but the good news is that
+all machinery is in place. We also have to admit that it all might not work out
+well, so that we stick to what we have now. But at least we had the fun then. And
+it is also a nice example of both applying mathematics and programming graphics.
+
+That said, if it works out well, we can populate the goodie files with output
+from \METAPOST, tweak a little when needed, and that saves us some time. One
+danger is that when we try to improve rendering the whole system also evolves
+which in turn will give different output, but we can always implement all this as
+features because after all \CONTEXT\ is very much about configuration. And it
+makes nice topics for articles and talks too!
+
+The kerns discussed in the previous paragraphs are not the ones that we
+find in \OPENTYPE\ fonts. There we have \quote {staircase} kerns that stepwise go
+up or down by height and kern. So, one can have different kerns depending on the
+height and sort of follow the shape. This permits quite precise kerning between
+for instance the right bottom of a kernel and left top of a subscript. So how is
+that used in practice? The reference font Cambria has these kerns but close
+inspection shows that these are not that accurate. Fortunately, we never enter
+the danger zone with subscripts, because other parameters prevent that. If we look
+at for instance Lucida and Garamond, then we see that their kerns are mostly used
+as side bearing, and not really as staircase kerns.
+
+\usemodule[s][fonts-shapes]
+
+\startlinecorrection
+\startcombination[nx=5,ny=1]
+ \startcontent
+ \ShowGlyphShape{name:cambria-math}{100bp}{0x1D6FD}
+ \stopcontent
+ \startcaption
+ \type {U+1D6FD}
+ \stopcaption
+ \startcontent
+ \ShowGlyphShape{name:cambria-math}{100bp}{0x003A4}
+ \stopcontent
+ \startcaption
+ \type {U+003A4}
+ \stopcaption
+ \startcontent
+ \ShowGlyphShape{name:cambria-math}{100bp}{0x1D4CC}
+ \stopcontent
+ \startcaption
+ \type {U+1D4CC}
+ \stopcaption
+ \startcontent
+ \ShowGlyphShape{name:cambria-math}{100bp}{0x1D6B8}
+ \stopcontent
+ \startcaption
+ \type {U+1D6B8}
+ \stopcaption
+ \startcontent
+ \ShowGlyphShape{name:cambria-math}{100bp}{0x1D70C}
+ \stopcontent
+ \startcaption
+ \type {U+1D70C}
+ \stopcaption
+\stopcombination
+\stoplinecorrection
+
+In these figures you see a few glyphs from cambria with staircase kerns and
+although we show them small you will notice that some kern boundaries touch the
+shape. As subscripts never go that high it goes unnoticed but it also shows that
+sticking to the lowest boundary makes sense.
+
+We conclude that we can simplify these kerns, and just transform them into our
+(upto four) corner kerns. It is unlikely that Cambria gets updates and that other
+fonts become more advanced. One can even wonder if multiple steps really give
+better results. The risk of overlap increases with more granularity because not
+every pair of glyphs is checked. Also, the repertoire of math characters will
+likely not grow and include shapes that differ much from what we can look at now.
+Reducing these kerns to simple ones, that can easily be patched at will in a
+goodie file, has advantages. We can even simplify the engine.
+
+\stopsection
+
+\startsection[title=Conclusion]
+
+So how can we summarize the above? The first conclusion is that we can only get
+good results when we runtime patch fonts to suite the engine and our (\CONTEXT)
+need. The second conclusion is that we should seriously consider to drop (read:
+ignore) most math font parameter and|/|or to reorganize them. There is no
+need to be conforming, because these parameters are often not that well
+implemented (thumb in mouth). The third conclusion (or observation) is that we
+should get rid of the excessive use of italic correction, and go for our new
+corner kerns instead. Last, we can conclude that it makes sense to explore how we
+can use \METAPOST\ to analyze the shapes in such a way that we can improve inter
+character kerning, corner kerns and maybe even, in a limited way, staircase kerns.
+
+And, to come back to accents: very few characters need a top kern. Most can be
+handled with centered anchors, and we need tweaks for margins and overshoot
+anyway. The same is true for many other tweaks: they are there to stay.
+
+This is how we plan to go forward:
+
+\startitemize[packed]
+ \startitem
+ We pass no italic corrections in the math fonts to the engine,
+ but instead we have four dedicated simple corner kerns, top and
+ bottom anchors, and we also compensate negative left side bearing. We
+ should have gone that route earlier (as follow up on a \MKIV\ feature)
+ but were still in some backward compatibility mindset.
+ \stopitem
+ \startitem
+ The \LUAMETATEX\ math engine might then be simplified by removing all
+ code related to italic correction. Of course it hurts that we spent so
+ much time on that over the years. We can anyway disable engine options
+ related to italic correction in the \CONTEXT\ setup. Of course the engine
+ is less old school generic then but that is the price of progress.
+ \stopitem
+ \startitem
+ A default goodie file is applied that takes care of this when no goodie
+ file is provided. We could do some in the engine, but there is no real
+ need for that. We can simplify the mid 2022 goodie files because we have
+ to fix less glyphs.
+ \stopitem
+ \startitem
+ If we ever need italic correction (that is: backtrack) then we use the
+ (new) \type {\mccode} option code that can identity sloped shapes. But,
+ given that ignoring the correction between sloped shapes looks pretty bad,
+ we can as well forget about this. After all, italic correction never
+ really was about correcting italics, but more about anchoring scripts.
+ \stopitem
+ \startitem
+ Staircase kerns can be reduced to simple corner kerns and the engine can
+ be simplified a bit more. In the end, all we need is true widths and simple
+ corner kerns.
+ \stopitem
+ \startitem
+ We reorganize the math parameters and get rid of those that are not
+ really font design dependent. This also removes a bit of overlap. This will
+ be done as we document.
+ \stopitem
+ \startitem
+ Eventually we can remove tweaks that are no longer needed in the new
+ setup, which is a good thing as it also save us some documenting and
+ maintenance.
+ \stopitem
+\stopitemize
+
+All this will happen in the perspective of \CONTEXT\ and \LUAMETATEX\ but we
+expect that after a few years of usage we can with confidence come to some
+conclusions that can trickle back in the other engines so that other macro
+packages can benefit from a somewhat radical different but reliable approach to
+math rendering, one that works well with the old and new fonts.
+
+\stopsection
+
+\stopchapter
+
+\stopcomponent
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/ontarget/ontarget-introduction.tex b/Master/texmf-dist/doc/context/sources/general/manuals/ontarget/ontarget-introduction.tex
new file mode 100644
index 00000000000..f7ac0a19d4e
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/ontarget/ontarget-introduction.tex
@@ -0,0 +1,104 @@
+% language=us runpath=texruns:manuals/ontarget
+
+\startcomponent ontarget-introduction
+
+\environment ontarget-style
+
+\startchapter[title={Introduction}]
+
+This is the seventh wrapup of the \LUATEX\ and \LUAMETATEX\ development cycle. It
+is dedicated to all those users who kept up with developments and are always
+willing to test the new features. Without them a project like this would not be
+possible.
+
+At the time this introduction is written the \LUAMETATEX\ code base is rather
+stable and quite a bit of the \MKIV\ code base has been adapted to new situation.
+But, as usual, there are always new possibilities to explore, so I expect that
+this document will grow over time as did the others. I'm not going to repeat all
+that has been done because that's what the previous episodes are about.
+
+As the title suggest, we're still on target. When the \LUAMETATEX\ project
+started there actually was no deadline formulated so in fact we're always on
+target. The core components \TEX, \METAPOST, and \LUA\ are all long term efforts
+so we're in no hurry at all. However, this is the year that a fast pace will
+become a slow pace with respect to the \LUAMETATEX\ code base. There are still
+some things on the agenda but in principle the goals are reached. One problem in
+today's code development is that useability and quality seems to relate to the
+amount of changes in code. No update can mean old, unusable and uninteresting.
+It's probably why some sources get this silly yearly copyright year update.
+However, the update cycle of good old \TEX\ has an decade interval by now while
+it is still a pretty useable program. It would be nice to end up in such a long
+term cycle with \LUAMETATEX: bug fixes only.
+
+Although \CONTEXT\ has always adapted early to new developments (color, graphics,
+\PDF, \METAPOST, \ETEX, \PDFTEX, \LUATEX, \UTF, fonts) the effects on the
+\CONTEXT\ code base are mostly hidden for users. There have been some changes
+between \MKII\ and \MKIV, simply because there has been a shift from specific
+eight bit encodings to \UTF\ and \TYPEONE\ to \OPENTYPE\ fonts. Both had an
+impact on important subsystems: input encodings, font definitions and features,
+language and script support. On other subsystems the impact was hardly
+noticeable, like for instance backend related features (these have always been
+kind of abstract). That doesn't mean that these haven't changed deep down, they
+definitely have. Some mechanisms became better in \MKIV, simply because less
+hackery was needed. My experience is that when users see that it gets better or
+easier, they are also willing to adapt the few lines in their document source
+that benefit from it. Of course the impact on the \METAPOST\ integration in
+\CONTEXT\ had a real large impact, especially in terms of performance.
+
+The upgrade to \LMTX, the version of \CONTEXT\ for \LUAMETATEX, is even less
+visible although already some new mechanisms showed up. This time a couple of
+engine specific features have been improved and made more flexible. In fact, the
+whole code base of the engine has been overhauled. This happened stepwise because
+we had to make sure all things kept working. As a first step code was made
+independent of the compilation infrastructure and the dependencies, other than a
+very few small ones, have been removed. The result is a rather lean and mean
+setup, even when we consider what has been added at the primitive level and
+traditional subsystems. A benefit is that in the meantime the \LUAMETATEX\ \LMTX\
+combination outperforms \LUATEX\ with \MKIV, something that was not ensured when
+the built|-|in \PDF\ backend was removed and delegated to \LUA. By binding
+development closely to \CONTEXT\ we also hope that the code base stays clean of
+arbitrary extensions.
+
+Because in the end, \TEX\ is also a programming language, there have been
+extensions that make programming easier. There is already a stable middle layer
+of auxiliary macros in \CONTEXT\ that help the user who likes to program but
+doesn't like real low level primitives and dirty tricks, but by extending the
+primitive repertoire a bit users can now stay closer to the original \TEX\
+concepts. Adding more and more layers of indirectness makes no sense if we can
+improve the bottom programming layer. It also makes coding a bit more natural
+(the \TEX\ look), apart from offering performance benefits. This is where you can
+see differences between the \MKIV\ and \LMTX\ code base which for that reason is
+now nearly split completely. The \METAPOST\ subsystem has been extended with
+proper scanners so that we can enhance the interfaces in a natural way and as a
+result we also have an upgraded code base there. We also moved to \LUA 5.4 and
+will keep up as long as compatibility is no issue. Some \LUA\ code is likely to
+remain common between \MKIV\ and \LMTX, for instance font handling and helpers
+but we'll see where that ends.
+
+The \LUAMETATEX\ engine provides control over most internals and there are all
+kind of new interesting features. Decades of \CONTEXT\ development are behind
+that. Also, in the days that there were discussions about extending \TEX,
+\CONTEXT\ was not that much of influence and on the road to and from user group
+meetings, Taco and I often discussed what we'd like to see added (and some was
+actually implemented in \type {eetex} but that only lived on our machines. One
+can consider \LUATEX\ to be a follow up on that, and \LUAMETATEX\ in turn follows
+up on that project, which we both liked doing a lot. In some way \LUATEX\ lowered
+the boundary for implementing some of the more intrusive extensions in
+\LUAMETATEX\ and the follow up on \MPLIB. And once you start along that road
+small steps become large steps and one can as well be try to be as complete as
+possible. We've come a long way but eventually arrived at the destination.
+Personally I think we got there by not being in a hurry.
+
+But even targets that are reached can eventually move,
+
+\blank[2*big]
+
+\startlines
+Hans Hagen
+Hasselt NL
+August 2021\high{++}
+\stoplines
+
+\stopchapter
+
+\stopcomponent
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/ontarget/ontarget-makesnosense.tex b/Master/texmf-dist/doc/context/sources/general/manuals/ontarget/ontarget-makesnosense.tex
new file mode 100644
index 00000000000..3a9e45e5e14
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/ontarget/ontarget-makesnosense.tex
@@ -0,0 +1,213 @@
+% language=us runpath=texruns:manuals/ontarget
+
+\startcomponent ontarget-makesnosense
+
+\environment ontarget-style
+
+\startchapter[title={Not all makes sense}]
+
+The development of \CONTEXT\ is to a large extend driven by users with a wide
+variety of background and usage. I can safely say that much time spent on
+\CONTEXT\ qualifies as hobby (or maybe even more by curiosity). Of course I do
+use it myself but personally I never make advanced documents. I'm not a writer,
+nor an artist, nor a typesetter. I do like challenges so that's why we get
+mechanisms that can do tricky things and some stay sort of hidden because the
+practical usage is limited, although you will be surprised to see what users find
+in the source and use anyway. My colleague uses \CONTEXT\ for large scale, mostly
+complex and demanding \XML\ documents where one source is rendered in different
+ways with different parts used. Many features in \CONTEXT\ relate to workflows.
+
+I like to visualize things so that's part of the development cycle. I never start
+from some \quote {typographical} point of view, if only because in my experience
+much design is arbitrary and personal. The output should look okay on the
+average, and on reasonable simple documents there should be no need for manual
+intervention. I am quite willing to accept an occasional less optimal looking
+page and don't loose sleep over it. A next time, when a sentence gets added, it
+might be better and the problem can be moved further down the pages. Also, given
+what one runs into nowadays the average job that \TEX\ does is pretty good (but
+users can of course mess up). It is boundary conditions that determine in what
+direction a style or solution goes. The more abstract one argues about
+typesetting and possible solutions, the less interested I often become simply
+because there are no perfect solutions for every case. There are always those
+last few \percent\ points that need manual intervention or some trickery and most
+users get that. It is also what makes using \TEX\ fun.
+
+As mentioned, the \TEX\ engine does a pretty good job on average but that didn't
+prevent me from extending it: the mix of \TEX, \METAPOST\ and \LUA\ is even more
+fun. But what is the development agenda there? Again, it is very much driven by
+what users want me to solve, but there's also the curiosity element. A recent
+example of extending is the math sub system. It was already made more
+configurable and some features where added but now it is really flexible. This
+was doable because the heuristics in the engine are clear. It was could be done
+because I had a dedicated partner in this journey. \footnote {In another chapter
+I summarize what Mikael Sundqvist and I did in this context.} Other parts are
+more difficult but have nevertheless been extended, to mention a few: alignments,
+par building and page building. However the last two use some heuristics that are
+hard to make more flexible. For instance the badness calculation combined with
+the loop that tries to find breakpoints is already quite good and the somewhat
+special values involved in the calculations have been optimized stepwise by Don
+Knuth during the development of \TEX.
+
+Does that mean that one cannot add some options to influence that tuning? For sure
+one can. The source has this comment:
+
+\startquotation
+ When looking for optimal line breaks, \TEX\ creates a \quote {break node} for
+ each break that is {\em feasible}, in the sense that there is a way to end a line
+ at the given place without requiring any line to stretch more than a given
+ tolerance. A break node is characterized by three things: the position of the
+ break (which is a pointer to a \type {glue_node}, \type {math_node}, \type
+ {penalty_node}, or \type {disc_node}); the ordinal number of the line that will
+ follow this breakpoint; and the fitness classification of the line that has just
+ ended, i.e., \type {tight_fit}, \type {decent_fit}, \type {loose_fit}, or \type
+ {very_loose_fit}.
+\stopquotation
+
+The book {\TEX\ by Topic} (by Eijkhout) gives a good explanation of the way lines
+are broken so there is no need to go into detail here. The code involved is not
+that trivial anyway. The criteria for deciding what is bad are as follows:
+
+\starttabulate[|c|c|c|]
+\FL
+\BC verdict \BC effect \BC badness \NC \NR
+\ML
+\NC very loose \NC stretch \NC >= 100 \NC \NR
+\NC loose \NC stretch \NC >= 13 \NC \NR
+\NC decent \NC \NC <= 12 \NC \NR
+\NC tight \NC shrink \NC >= 13 \NC \NR
+\LL
+\stoptabulate
+
+When the difference between two lines is more than one, they are considered to be
+visually incompatible. Then, if the badness of any line exceeds \type
+{pretolerance} a second pass is triggered, When \type {pretolerance} is negative
+the first pass is skipped. When the badness of any line exceeds \type {tolerance}
+a third pass is triggered and \type {emergencystretch} is used to make things fit.
+
+Where in traditional \TEX\ a lot of parsing, hyphenation, font handling and par
+building is combined, in \LUAMETATEX\ we always work with completely hyphenated
+and font readied lists. In traditional \TEX\ the first pass works on
+the original non|-|hyphenated lists.
+
+In the source there is an old note that one day I will play with a plugged in
+badness calculation but it also says that there might be a performance impact as
+well as all kind of unforeseen side effects because \TEX\ makes sure that the
+heuristics lead to values that don't result in overflow and such.
+
+Another note concerns more fitness values. Doing that will increase the runtime a
+little but on a modern machine that is not really an issue. Shortly after I
+upgraded my laptop to a somewhat newer one I decided to play with this and
+therefore any performance hit would go unnoticed anyway. The following snippet
+from the source shows the idea:
+
+\starttyping
+typedef enum fitness_value {
+ very_loose_fit, /*tex lines stretching more than their stretchability */
+ loose_fit, /*tex lines stretching 0.5 to 1.0 of their stretchability */
+ semi_loose_fit,
+ decent_fit, /*tex for all other lines */
+ semi_tight_fit,
+ tight_fit, /*tex lines shrinking 0.5 to 1.0 of their shrinkability */
+ n_of_finess_values
+} fitness_value;
+\stoptyping
+
+This means that when we loop over \type {very_loose_fit} upto \type {tight_fit}
+we have two more classes to take into account: the semi ones. Playing with that
+and associating them with magic numbers quickly learned that we enter the area of
+\quote {random improvements}. You can render variants and because some will look
+better and others worse one can argue for any case. And as usual, once a user
+(unaware of what we are doing) looks at it, things like successive hyphens, wider
+spaces, rivers and such are seen as the main difference. Of course spacing is the
+direct result of this kind of messing, but because the effects are actually
+mostly noticeable on non|-|justified texts it then is the end|-|of|-|line spacing
+that influences the verdict. \footnote {When \HZ\ showed up in \PDFTEX\ we did
+experiments with random samples of its usage and \TEX ies at user group meetings
+and the results were such that one could only draw the conclusion that on the
+average a user has no clue if something is good or bad for what reason. The
+strong emphasis in the \TEX\ community on hyphenation makes that an eye|-|catching
+criterium. So having two in a successive lines even when there is really no
+better solution is what draws the attention and users then tend to think that
+what a survey is about is \quotation {The quality of hyphenation related to
+breaking paragraphs into lines.}}
+
+In the end this kind of extensions make little sense. One can of course play
+science and introduce all kind of imaginary cases where it might work but that is
+why I started this summary by explaining what drives developments: users and
+constraints. Playing science for the sake of it is pseudo science. And, as with
+much science related to typesetting (probably with the exception of Don's work)
+most has therefore little practical value.
+
+So, do we keep this feature or not? We actually do, if only to be able to
+demonstrate the fuzziness of this. We have an undocumented magic parameter:
+
+\starttyping
+\linebreakcriterium"0C0C0C63
+\stoptyping
+
+Actually the value is zero but when one of the four byte pairs is zero it will
+default to \type {"0C} (\number"0C) or \type {"63} (\number"63). The values
+concern \type {semitight}, \type {decent}, \type {semiloose}, and \type {loose}.
+After some trial and error I got to the examples on the next two pages. You need
+to zoom in to see the differences (the black one is the original). In setting used are:
+
+\starttabulate[|c|c|l|]
+\BC \BC \type {\hsize} \BC \type {\setupalign} \NC \NR
+\NC 1 \NC 12em \NC normal, stretch, tolerant \NC \NR
+\NC 2 \NC 18em \NC flushleft \NC \NR
+\stoptabulate
+
+As mentioned, one can look at specific expected properties and draw conclusions
+but when \TEX\ cannot find a good solution using its default, it is unlikely that
+alternative settings help you out, unless you do that on a per|-|paragraph basis.
+
+% run in default font and layout
+
+\startbuffer[lbc]
+\def\TestA#1#2#3%
+ {\switchtobodyfont[10pt]%
+ \ruledvtop
+ {\hsize#1\relax
+ \begingroup
+ \setupalign[#2]%
+ \linebreakcriterium"#3\relax
+ \samplefile{tufte}\par
+ \endgroup
+ \hpack to \hsize{\hss\infofont\setstrut\strut\black\string\linebreakcriterium="#3\hss}}}
+
+\def\TestB#1#2%
+ {\startTEXpage[offset=4dk]
+ \hbox \bgroup
+ {\black \TestA{#1}{#2}{00000000}}\kern1ex
+ {\red \TestA{#1}{#2}{00001C00}}\kern1ex
+ {\green \TestA{#1}{#2}{00002C00}}\kern1ex
+ {\blue \TestA{#1}{#2}{00003C00}}\kern1ex
+ {\cyan \TestA{#1}{#2}{00004C00}}\kern1ex
+ {\magenta\TestA{#1}{#2}{00005C00}}
+ \egroup
+ \vskip1ex
+ \hbox \bgroup
+ \startoverlay {\TestA{#1}{#2}{00000000}} \stopoverlay \kern1ex
+ \startoverlay {\TestA{#1}{#2}{00000000}} {\red \TestA{#1}{#2}{00001C00}} \stopoverlay \kern1ex
+ \startoverlay {\TestA{#1}{#2}{00000000}} {\green \TestA{#1}{#2}{00002C00}} \stopoverlay \kern1ex
+ \startoverlay {\TestA{#1}{#2}{00000000}} {\blue \TestA{#1}{#2}{00003C00}} \stopoverlay \kern1ex
+ \startoverlay {\TestA{#1}{#2}{00000000}} {\cyan \TestA{#1}{#2}{00004C00}} \stopoverlay \kern1ex
+ \startoverlay {\TestA{#1}{#2}{00000000}} {\magenta\TestA{#1}{#2}{00005C00}} \stopoverlay
+ \egroup
+ \stopTEXpage}
+
+\TestB{12em}{normal,stretch,tolerant}
+\TestB{18em}{flushleft}
+\stopbuffer
+
+\startpagemakeup[pagestate=start,doublesided=no,page=no]
+ \centerbox {\typesetbuffer[lbc][page=1,frame=on,height=\dimexpr\textwidth-2ex\relax,orientation=90]}
+\stoppagemakeup
+\startpagemakeup[pagestate=start,doublesided=no,page=no]
+ \centerbox {\typesetbuffer[lbc][page=2,frame=on,width=\dimexpr\textheight-2ex\relax,orientation=90]}
+\stoppagemakeup
+
+\stopchapter
+
+\stopcomponent
+
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/ontarget/ontarget-makessense.tex b/Master/texmf-dist/doc/context/sources/general/manuals/ontarget/ontarget-makessense.tex
new file mode 100644
index 00000000000..e0a635285d9
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/ontarget/ontarget-makessense.tex
@@ -0,0 +1,110 @@
+% language=us runpath=texruns:manuals/ontarget
+
+\startcomponent ontarget-makessense
+
+\environment ontarget-style
+
+\startchapter[title={But this does}]
+
+In \LUAMETATEX\ one can do a lot on \LUA, like what I will discuss next, but
+because it is somewhat fundamental it became a core feature of the engine. It was
+also quite easy to implement. It has to do with packaging. \footnote {I actually
+did prototype it in \LUA\ first but wanted a more natural integration in the
+end.}
+
+The box constructors in traditional \TEX\ accept two keywords: \type {to} for
+setting an exact width and \type {spread} for specifying additional width. In
+\LUAMETATEX\ we have some more like \type {shift} (a traditional \TEX\ concept),
+\type {orientation}, \type {xmove}, \type {xoffset}, \type {ymove} and \type
+{yoffset} for absolute positioning, \type {anchor(s)}, \type {target} and \type
+{source} for relative positioning, \type {axis} and \type {class} for usage in
+\math, \type {delay} for leader like boxes, the multiple \type {attr} key for
+setting attributes, a special subtype directive \type {container} and \type
+{direction} for controlling bidirectional typesetting, and \type {reverse} for
+reversing content. The latest addition: \type {adapt} is there for controlling
+and freezing glue.
+
+So, in addition to the width related keys \type {to} and \type {spread} we have
+\type {adapt} that drives wo what width the box will be typeset. \footnote {For
+the moment this keyword only has effect for horizontal boxes.} The keyword is
+followed by a scale values between -1000 and 1000 where a negative value enforces
+shrink and a positive value stretch. The following table shows the effects:
+
+\startbuffer
+\starttabulate
+ \Test{}
+ \Test{to 4cm}
+ \Test{to \hsize}
+ \Test{spread 1cm}
+ \Test{spread -1cm}
+ \Test{adapt -1000}
+ \Test{adapt -750}
+ \Test{adapt -500}
+ \Test{adapt 0}
+ \Test{adapt 500}
+ \Test{adapt 750}
+ \Test{adapt 1000}
+\stoptabulate
+\stopbuffer
+
+\def\Test#1{%
+ \NC
+ \type {#1}
+ \NC
+ \showglyphs
+ \ruledhbox#1{Here are just some words so that we can see what happens.}%
+ \NC \NR
+}
+
+\getbuffer
+
+When a box is typeset the natural glue width is used but when the required width
+exceeds the natural width the glue stretch components kick in. With a negative
+spread the shrink is used but you can get underflows. The \type {adapt} feature
+freezes the glue and it removes the stretch and shrink after applying it to the
+glue width with the given scale factor. So, in order to get the minimum width you
+use \type {adapt -1000}.
+
+\def\Test#1{%
+ \NC
+ \type {#1}
+ \NC
+ \medmuskip 4mu plus 2mu minus 2mu\relax
+ \showmakeup[mathglue]%
+ \showglyphs
+ \ruledhbox#1{$ x + x + a = 2x + a$\hss}%
+ \NC \NR
+}
+
+The reason why I decided to add this feature is that when experimenting with math
+alignments I wanted to be able to see what shrink could be achieved. \footnote
+{At that time Mikael and I were experimenting with consistent spacing in math
+alignments.} The next example shows this:
+
+\getbuffer
+
+Once we had this new feature it made sense to add support for it to \type
+{\framed}, one of the oldest macros that got extended over time:
+
+\startbuffer
+\inframed[adaptive=1000] {Just some words}
+\inframed[adaptive=500] {Just some words}
+\inframed[adaptive=0] {Just some words}
+\inframed[adaptive=-500] {Just some words}
+\inframed[adaptive=-1000]{Just some words}
+\stopbuffer
+
+\typebuffer
+
+This renders as:
+
+\startlinecorrection \getbuffer \stoplinecorrection
+
+Once we have it there other mechanisms can benefit from it, for instance natural
+tables. But keep in mind that spaces are fixed in there so there is only the
+expected result if glue has stretch or shrink.
+
+\stopchapter
+
+\stopcomponent
+
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/ontarget/ontarget-math.tex b/Master/texmf-dist/doc/context/sources/general/manuals/ontarget/ontarget-math.tex
new file mode 100644
index 00000000000..83aae8bcd4c
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/ontarget/ontarget-math.tex
@@ -0,0 +1,2179 @@
+% language=us runpath=texruns:manuals/ontarget
+
+% \profilemacro\scaledfontdimen
+
+% \usebodyfont[modern]
+% \usebodyfont[cambria]
+% \usebodyfont[termes]
+% \usebodyfont[pagella]
+% \usebodyfont[bonum]
+
+\startcomponent ontarget-math
+
+\environment ontarget-style
+
+\startchapter[title={A different approach to math spacing}]
+
+\startsubject[title=Introduction]
+
+The \TEX\ engine is famous for its rendering of math and even after decades there
+is no real contender. And so there also is no real pressure to see if we can do
+better. However, when Mikael Sundqvist ran into a Swedish math rendering
+specification and we started discussing a possible support for that in \CONTEXT,
+it quickly became clear that the way \TEX\ does spacing is a bit less flexible
+than one wishes for. We already have much of what is needed in place but it also
+has to work well with how \TEX\ sees things:
+
+\startitemize[packed,n]
+\startitem
+ Math is made from a sequence of atoms: a quantity with a nucleus, superscript
+ subscript. \footnote {I suddenly realize why in the engine noads have a
+ nucleus field: they are atoms \unknown\ but what does that make super and
+ subscripts.} Atoms are spaced by \type {\thinmuskip}, \type {\medmuskip} and
+ \type {\thickmuskip} or nothing, and that is sort of hard coded.
+\stopitem
+\startitem
+ Atoms are organized by class and there are seven (or eight, depending on how
+ you look at it) of them visible: binary symbols, relations, etc. The
+ invisible ones, composites like fractions and fenced material (we call them
+ molecules) are at some point mapped onto the core set. Molecules like fences
+ have a different class left and right of the fenced material.
+\stopitem
+\startitem
+ In addition the engine itself has all kind of spacing related parameters and
+ these kick in automatically and sometimes have side effects. The same is
+ true for penalties.
+\stopitem
+\stopitemize
+
+The normal approach to spacing other than imposed by the engine is to use
+correction space, like \type {\,} and I think that quite some \TEX\ users think
+that this is how it is supposed to be. The standard way to enter math relates to
+scientific publishing and there the standards are often chiseled in stone so why
+should users tweak anyway. However, in \CONTEXT\ we tend to start from the users
+and not the publishers end so there we can decide to follow different routes.
+Users can always work around something they don't like but we focus on reliable
+input giving predictable output. Also, when reading on, it is good to realize
+that it is all about the user experience here: it should look nice (which then of
+course makes one become aware of issues elsewhere) and we don't care much about
+specific demands of publishers in the scientific field: the fact that they often
+re|-|key content doesn't go well with users paying attention themselves, let
+alone the fact that nowadays they can demand word processor formats.
+
+The three mentioned steps are fine for the average case but sometimes make no
+sense. It was definitely the best approach given time and resources but when
+\LUATEX\ went \OPENTYPE\ a lot of parameters were added and at that time we
+therefore added spacing by class pair. That not only decoupled the relation
+between the three (configurable) muskip parameters but also made it possible to
+use plenty of them. Now it must be said that for consistency having these three
+skips works great but given the tweaking expected from users consistency is
+not always what comes out.
+
+This situation is very well comparable to the proclaimed qualities of the
+typesetting of text by \TEX. Yes, it can do a great job, and often does, but users
+can mess up quite well. I remember that when we did tests with \HZ\ the outcomes
+were pretty unimpressive. When you give an audience a set of sample renderings,
+where each sample is slightly different and each user gets a randomized subset,
+the sudden lack of being able to compare (and agree) with another \TEX ie makes
+for interesting conclusions. They look for the opposites of what is claimed to be
+perfect. So, two lines with hyphens rate low, even if not doing it would look
+worse. The same for a few short words in the last line of a paragraph. Excessive
+spacing is also seen as bad. So, when asked why some paragraphs looked okay
+noticing (excessive and troublesome) expansion was not seen as a problem; instead
+it were hyphens that got the attraction.
+
+The same is probably true for math: the input with lots of correction spaces or
+commands where characters would do can be horrible but it's just the way it is
+supposed to be. The therefore expected output can only be perfect, right,
+independent of how one actually messed up spacing. But personally I think that it
+is often spacing messed up by users that make a \TEX\ document recognizable. It
+compares to word processor results that one can sometimes identify by multiple
+consecutive spaces in the typeset text instead of using a glue model like \TEX.
+Reaching perfection is not always trivial, but fortunately we can also find
+plenty of nice looking documents done with \TEX.
+
+The \TEX book has an excellent and intriguing chapter on the fine points of math
+and it definitely shows why Don Knuth wrote \TEX\ as a tool for his books. He
+pays a lot of attention to detail and that is also why it all works out so well.
+If you need to render from unseen sources (as happens in an \XML\ workflow)
+coming from several authors and have time nor money to check everything, you're
+off worse. And I'm not even talking of input where invisible \UNICODE\ spacing
+characters are injected. It is the \TEX\ book(s) that has drawn me to this
+program and believe it or not, in the first project I was involved in that
+demanded typeset (quantum mechanics) math the \IBM\ typewriter with changing
+bulbs ruled the scenery. In fact, our involvement was quickly cut off when we
+dared to show a chapter done in \TEX\ that looked better.
+
+Apart from an occasional tweak, in \CONTEXT\ we never really used this opened up
+math atom pair spacing mechanism available in \LUATEX\ extensively. So, when I
+was pondering how to proceed it stroke me that it would make sense to generalize
+this mechanism. It was already possible (via a mode parameter) to bypass the
+second step mentioned above, but we definitely needed more than the visible
+classes that the engine had. In \CONTEXT\ we already had more classes but those
+were meant for assigning characters and commands to specific math constructs
+(think of fences, fractions and radicals) so in the end they were not really
+classes. Considering this option was made easier by the fact that Mikael would do
+the testing and help configuring the defaults, which all will result in a new
+math user manual.
+
+There are extensions introduced in \LUATEX\ and later \LUAMETATEX\ that are not
+discussed here. In this expose we concentrate on the features that were explored,
+extended and introduced while we worked on updating math support in \LMTX.
+
+\stopsubject
+
+\startsubject[title=An example]
+
+Before we go into details, let's give an example of unnoticed spacing effects. We
+use three simple formulas all using fractions:
+
+\startbuffer[one]
+\ruledhbox{$\frac{x^2}{a+1}$}
+\stopbuffer
+
+\startbuffer[two]
+\ruledhbox{$x + \frac{x^2}{a+1} = 10$}
+\stopbuffer
+
+\startbuffer[three]
+\ruledhbox{$\frac{1}{2}\frac{1}{2}x$}
+\stopbuffer
+
+\typebuffer[one]
+
+and:
+
+\typebuffer[two]
+
+as well as:
+
+\typebuffer[three]
+
+\startbuffer[all]
+\dontleavehmode
+\scale[scale=4000]{\getbuffer[one]}
+\scale[scale=4000]{\getbuffer[two]}
+\scale[scale=4000]{\getbuffer[three]}
+\stopbuffer
+
+\startlinecorrection
+\nulldelimiterspace=1.2pt\getbuffer[all]
+\stoplinecorrection
+
+If you look closely you see that the fraction has a little space at the left and
+right. Where does that come from? Because we normally don't put a tight frame
+around a fraction, we are not really aware of it. The spacing between what are
+called ordinary, operator, binary, relation and other classes of atoms is
+explained in the \TEX book (or \quotation {\TEX\ by Topic} if you want a summary)
+and basically we have a class by class matrix that is built into \TEX. The
+engine looks at successive items and spacing depends on their (perceived) class.
+Because the number of classes is limited, and because the spacing pairs are hard
+coded, the engine cheats a little. Depending on what came before or comes next
+the class of an atom is adapted to suit the spacing matrix. One can say that a
+\quotation {reading mathematician} is built in. And most of the decisions are
+okay. If needed one can always wrap something in e.g.\ \type {\mathrel} but of
+course that also can interfere with grouping. All this is true for \TEX, \PDFTEX,
+\XETEX\ and \LUATEX, but a bit different in \LUAMETATEX\ as we will see.
+
+The little spacing on both edges of the fraction is a side effect of the way they
+are built internally: fractions are actually a generalized form of \quotation
+{stuff put on top of other stuff} and they can have left and|/|or right
+delimiters: this is driven by primitives that have names like \type {\atop} and
+\type {\atopwithdelims}. The way the components are placed is (especially in the
+case of \OPENTYPE) driven by lots of parameters and I will leave that out of the
+discussion.
+
+When there are no delimiters, a so called \type {\nulldelimiterspace} will be
+injected. That parameter is set to 1.2 points and I have to admit that in
+\CONTEXT\ I never considered letting that one adapt to the body font size, which
+means that, as we default to a 12 point body font, the value there should have
+been 1.44 points: mea culpa. When we set this parameter to zero point, we get
+this:
+
+\startlinecorrection
+\nulldelimiterspace=0pt\getbuffer[all]
+\stoplinecorrection
+
+As intermezzo and moment of contemplation I show some examples of fractions mixed
+into text. When we have the delimiter space set we get this:
+
+\start \nulldelimiterspace=1.2pt \dorecurse{100}{test $\frac{1}{#1}$ } \stop
+
+While with zero it looks like this, quite a different outcome:
+
+\start \nulldelimiterspace=0pt \dorecurse{100}{test $\frac{1}{#1}$ } \stop
+
+A little tracing shows it more clearly:
+
+\start \showboxes \nulldelimiterspace=1.2pt \dorecurse{100}{test $\frac{1}{#1}$ } \stop
+
+You can zoom in and see where it interferes with margin alignment.
+
+\start \showboxes \nulldelimiterspace=0pt \dorecurse{100}{test $\frac{1}{#1}$ } \stop
+
+So, if you ever meet a user who claims perfection and superiority of typesetting,
+check out her|/|his work which might have inline fractions done the spacy way. It
+might make other visually typesetting claims less trustworthy. And yes, one can
+wonder if margin kerning could help here but as this content is wrapped in boxes it
+is unlikely to work out well (and not worth the effort).
+
+In order to get a better picture of the spacing, two more renderings are shown.
+This time we show the bounding boxes of the characters too (you might need to zoom
+in to see it):
+
+\startlinecorrection
+\showglyphs\nulldelimiterspace=1.2pt\getbuffer[all]
+\stoplinecorrection
+
+Again we also show the zero case
+
+\startlinecorrection
+\showglyphs\nulldelimiterspace=0pt\getbuffer[all]
+\stoplinecorrection
+
+This makes clear why there actually is this extra space around a fraction:
+regular operators have side bearings and thereby have some added space. And when
+we put a fraction in front of a symbol we need that little extra space. Of course
+a proper class pair spacing value could do the job but there is no fraction
+class. The engine cheats by changing the class depending on what follows or came
+before and this is why on the average it looks okay. However, these examples
+demonstrate that there are some assumptions with regard to for instance fonts
+and this is one of the reasons why the more or less official expected \OPENTYPE\
+behavior as dictated by the Cambria font doesn't always work out well for fonts
+that evolved from the ones used in the \TEX\ community. Also imagine how this
+interferes with the fact that traditional \TEX\ fonts and the machinery do magic
+with cheating about width combined with italic correction (all plausible and
+quite clever but somewhat tricky with respect to \OPENTYPE).
+
+Because here we discuss the way \LUAMETATEX\ and \CONTEXT\ deal with this, the
+following examples show a probably unexpected outcome. Again first the non|-|zero
+case:
+
+\startlinecorrection
+\showglyphs\showmakeup[mathglue]\nulldelimiterspace=1.2pt\getbuffer[all]
+\stoplinecorrection
+
+And here the zero case:
+
+\startlinecorrection
+\showglyphs\showmakeup[mathglue]\nulldelimiterspace=0pt\getbuffer[all]
+\stoplinecorrection
+
+I will not go into details about the way fractions are supported in the engine
+because some extensions are already around for quite a while. The main
+observation here is that in \LUAMETATEX\ we have alternative primitives that
+assume forward scanning, as if the numerator and denominator are arguments. The
+engine also supports skewed (vulgar) fractions natively where numerator and
+denominator are raised and lowered relative to the (often) slash. Many aspects
+of the rendering can be tuned in the so called font goodie files, which is also
+the place where we define the additional font parameters.
+
+\stopsubject
+
+\startsubject[title=Atom spacing]
+
+If you are familiar with traditional \TEX\ you know that there is some built in
+\type {ordbin} spacing. But there is no such pair for a fraction and a relation,
+simply because there is no fraction class. However, in \LUAMETATEX\ there is one,
+and we'd better set it up if we zero the margins of a fraction.
+
+It is worth noticing that fractions are sort of special anyway. The official
+syntax is \type {n \over m} and numerator and denominator can be sub formulas.
+This is the one case where the parser sort of has to look back, which is tricky
+because the machinery is a forward looking one. Therefore, in order to get the
+expected styling (or avoid unexpected side effects) one will normally wrap all in
+braces as in: \type {{ {n} \over {m} }} which of course kind defeats the simple
+syntax which probably is supported for \type {1\over2} kind of usage, so a next
+challenge is to make \type {1/2} come out right. All this means that in practice
+we have wrappers like \type {\frac} which accidentally in \LUAMETATEX\ can be
+defined using forward looking primitives with plenty extra properties driven by
+keywords. It also means that fractions as expected by the engine due to wrapping
+actually can be a different kind of atom, which can have puzzling side effects
+with respect to spacing (because the remapping happens unseen).
+
+Interesting is that adapting \LUAMETATEX\ to a more extensive model was quite
+doable, also because the code base had already been made more configurable. Of
+course it involved quite a bit of tedious editing and throwing out already nice
+and clean code that had taken some effort, but that's the way it is. Of course
+more classes also means that some storage properties had to be adapted within the
+available space but by sacrificing families that was possible. With 64 potential
+classes we now are back to 64 families compared to 7 classes and 256 families in
+\LUATEX\ and 7 classes and 16 families in traditional \TEX.
+
+Also interesting is that the new implementation is actually somewhat simpler and
+therefore the binary is a tad smaller too. But does all that mean that there were
+no pitfalls? Sure there were! It is worth noticing that doing all this reminded
+me of the early days of \LUATEX\ development, where Taco and I exchanged binaries
+and \TEX\ code in a more or less constant way using Skype. For \LUAMETATEX\ we
+used good old mail for files and Mojca's build farm for binaries and Mikael and I
+spent many months exchanging information and testing out alternatives on a daily
+basis: it is in my opinion the only way to do this and it's fun too. It has been
+a lot of work but once we got going there was nothing that could stop us. A side
+effect was that there were no updates during this period, which was something
+users noticed.
+
+In the spacing matrix there is \type {inner} and internally there's also some
+care to be taken of \type {vcenter}. The \type {inner} class is actually shared
+with the \type {variable} class which is not so much a real class but more a
+signal to the engine that when an alphabetic or numeric character is included
+it has to come from a specific family: upright family zero or math italic family
+one in traditional speak. But, what if we don't have that setup? Well, then one
+has to make sure that this special class number is not associated (which is no
+big deal). It does mean that when we extend the repertoire of classes we
+cannot use slot seven. Always keep in mind that classes (and thereby signals) get
+assigned to characters (some defaults by the engine, others by the macro
+package). It is why in \CONTEXT\ we use abstract class numbers, just in case the
+engine gets adapted.
+
+We also cannot use slot eight because that one is a signal too: for a possible
+active math character, a feature somewhat complicated by the fact that it should
+not interfere with passing around such active characters in arguments. In math
+mode where we have lots of macros passing around content, this special class works
+around these side effects. We don't need this feature in \CONTEXT\ because
+contrary to other macro packages we don't handle primes, pseudo superscripts
+potentially followed by other super and subscripts by making the \type {'} an
+active character and thereby a macro in math mode. This trickery again closely
+relates to preferable input, font properties, and limitations of memory and such
+at the time \TEX\ showed up (much has to fit into 8, 16 or 32 bits, so there is
+not much room for e.g.\ more than 8 classes). Since we started with \MKIV\ the way
+math is dealt with is a bit different than normally done in \TEX\ anyway.
+
+\stopsubject
+
+\startsubject[title=Atom rules]
+
+We can now control the spacing between every atom but unfortunately that is not
+good enough. Therefore, we arrive at yet another feature built into the engine:
+turning classes into other classes depending on neighbors. And this is precisely
+why we have certain classes. Let's quote \quotation {\TEX\ by Topic}: {\em The
+cases \type {*} (in the atom spacing matrix) cannot occur, because a \type {bin}
+object is converted to \type {ord} if it is the first in the list, preceded by
+\type {bin}, \type {op}, \type {open}, \type {punct}, \type {rel}, or followed by
+\type{close}, \type {punct}, or \type {rel}; also, a \type{rel} is converted to
+\type{ord} when it is followed by \type {close} or \type {punct}.}
+
+We can of course keep these hard coded heuristics but can as well make that bit
+of code configurable, which we did. Below is demonstrated how one can set up the
+defaults at the \TEX\ end. We use symbolic names for the classes.
+
+\starttyping
+\setmathatomrule \mathbegincode \mathbinarycode % old
+ \allmathstyles \mathordinarycode \mathordinarycode % new
+
+\setmathatomrule \mathbinarycode \mathbinarycode
+ \allmathstyles \mathbinarycode \mathordinarycode
+\setmathatomrule \mathoperatorcode \mathbinarycode
+ \allmathstyles \mathoperatorcode \mathordinarycode
+\setmathatomrule \mathopencode \mathbinarycode
+ \allmathstyles \mathopencode \mathordinarycode
+\setmathatomrule \mathpunctuationcode \mathbinarycode
+ \allmathstyles \mathpunctuationcode \mathordinarycode
+\setmathatomrule \mathrelationcode \mathbinarycode
+ \allmathstyles \mathrelationcode \mathordinarycode
+
+\setmathatomrule \mathbinarycode \mathclosecode
+ \allmathstyles \mathordinarycode \mathclosecode
+\setmathatomrule \mathbinarycode \mathpunctuationcode
+ \allmathstyles \mathordinarycode \mathpunctuationcode
+\setmathatomrule \mathbinarycode \mathrelationcode
+ \allmathstyles \mathordinarycode \mathrelationcode
+
+\setmathatomrule \mathrelationcode \mathclosecode
+ \allmathstyles \mathordinarycode \mathclosecode
+\setmathatomrule \mathrelationcode \mathpunctuationcode
+ \allmathstyles \mathordinarycode \mathpunctuationcode
+\stoptyping
+
+Watch the special class with \type {\mathbegincode}. This is actually class 62 so
+you don't need much fantasy to imagine that class 63 is \type {\mathendcode}, but
+that one is not yet used. In a similar fashion we can initialize the spacing
+itself: \footnote {Constant, engine specific, numbers like these are available in
+tables at the \LUA\ end so we can change them and users can check that.}
+
+\starttyping
+\setmathspacing \mathordcode \mathopcode \allmathstyles \thinmuskip
+\setmathspacing \mathordcode \mathbincode \allsplitstyles \medmuskip
+\setmathspacing \mathordcode \mathrelcode \allsplitstyles \thickmuskip
+\setmathspacing \mathordcode \mathinnercode \allsplitstyles \thinmuskip
+
+\setmathspacing \mathopcode \mathordcode \allmathstyles \thinmuskip
+\setmathspacing \mathopcode \mathopcode \allmathstyles \thinmuskip
+\setmathspacing \mathopcode \mathrelcode \allsplitstyles \thickmuskip
+\setmathspacing \mathopcode \mathinnercode \allsplitstyles \thinmuskip
+
+\setmathspacing \mathbincode \mathordcode \allsplitstyles \medmuskip
+\setmathspacing \mathbincode \mathopcode \allsplitstyles \medmuskip
+\setmathspacing \mathbincode \mathopencode \allsplitstyles \medmuskip
+\setmathspacing \mathbincode \mathinnercode \allsplitstyles \medmuskip
+
+\setmathspacing \mathrelcode \mathordcode \allsplitstyles \thickmuskip
+\setmathspacing \mathrelcode \mathopcode \allsplitstyles \thickmuskip
+\setmathspacing \mathrelcode \mathopencode \allsplitstyles \thickmuskip
+\setmathspacing \mathrelcode \mathinnercode \allsplitstyles \thickmuskip
+
+\setmathspacing \mathclosecode \mathopcode \allmathstyles \thinmuskip
+\setmathspacing \mathclosecode \mathbincode \allsplitstyles \medmuskip
+\setmathspacing \mathclosecode \mathrelcode \allsplitstyles \thickmuskip
+\setmathspacing \mathclosecode \mathinnercode \allsplitstyles \thinmuskip
+
+\setmathspacing \mathpunctcode \mathordcode \allsplitstyles \thinmuskip
+\setmathspacing \mathpunctcode \mathopcode \allsplitstyles \thinmuskip
+\setmathspacing \mathpunctcode \mathrelcode \allsplitstyles \thinmuskip
+\setmathspacing \mathpunctcode \mathopencode \allsplitstyles \thinmuskip
+\setmathspacing \mathpunctcode \mathclosecode \allsplitstyles \thinmuskip
+\setmathspacing \mathpunctcode \mathpunctcode \allsplitstyles \thinmuskip
+\setmathspacing \mathpunctcode \mathinnercode \allsplitstyles \thinmuskip
+
+\setmathspacing \mathinnercode \mathordcode \allsplitstyles \thinmuskip
+\setmathspacing \mathinnercode \mathopcode \allmathstyles \thinmuskip
+\setmathspacing \mathinnercode \mathbincode \allsplitstyles \medmuskip
+\setmathspacing \mathinnercode \mathrelcode \allsplitstyles \thickmuskip
+\setmathspacing \mathinnercode \mathopencode \allsplitstyles \thinmuskip
+\setmathspacing \mathinnercode \mathpunctcode \allsplitstyles \thinmuskip
+\setmathspacing \mathinnercode \mathinnercode \allsplitstyles \thinmuskip
+\stoptyping
+
+And because we have a few more atom classes this also needs to happen:
+
+\starttyping[style=\tt]
+\letmathspacing \mathactivecode \mathordinarycode
+\letmathspacing \mathvariablecode \mathordinarycode
+\letmathspacing \mathovercode \mathordinarycode
+\letmathspacing \mathundercode \mathordinarycode
+\letmathspacing \mathfractioncode \mathordinarycode
+\letmathspacing \mathradicalcode \mathordinarycode
+\letmathspacing \mathmiddlecode \mathopencode
+\letmathspacing \mathaccentcode \mathordinarycode
+
+\letmathatomrule \mathactivecode \mathordinarycode
+\letmathatomrule \mathvariablecode \mathordinarycode
+\letmathatomrule \mathovercode \mathordinarycode
+\letmathatomrule \mathundercode \mathordinarycode
+\letmathatomrule \mathfractioncode \mathordinarycode
+\letmathatomrule \mathradicalcode \mathordinarycode
+\letmathatomrule \mathmiddlecode \mathopencode
+\letmathatomrule \mathaccentcode \mathordinarycode
+\stoptyping
+
+With \type {\resetmathspacing} we get an all|-|zero state but that might become
+more refined in the future. What is not clear from the above is that there is
+also an inheritance mechanism. The three special muskip registers are actually
+shortcuts so that changing the register value is reflected in the spacing. When a
+regular muskip value is (verbose or as register) that value is sort of frozen.
+However, the \type {\inherited} prefix will turn references to registers and
+constants into a delayed value: as with the predefined we now have a more dynamic
+behavior which means that we can for instance use reserved muskip registers as we
+can use the predefined. A bonus is that one can also use regular glue or
+dimensions, just in case one wants the same spacing in all styles (a muskip
+adapts to the size).
+
+When you look at all of the above you might wonder how users are supposed to deal
+with math spacing. The answer is that often they can just assume that \TEX\ does
+the right thing. If something somehow doesn't feel right, looking at solutions by
+others will probably lead a new user to just copy a trick, like injecting a \type
+{\thinmuskip}. But it can be that atoms depend on the already applied (or not)
+spacing, which in turn depends on values in the atom spacing matrix that probably
+only a few users have seen. So, in the end it all boils down to trust in the
+engine and one's eyesight combined with hopefully some consistency in adding
+space directives and often with \TEX\ it is consistency that makes documents look
+right. In \CONTEXT\ we have many more classes even if only a few characters fit in,
+like differential, exponential and imaginary.
+
+\stopsubject
+
+\startsubject[title=Fractions again]
+
+We now return to the fraction molecule. With the mechanisms at our disposal we
+can change the fixed margins to more adaptive ones:
+
+\starttyping
+\inherited\setmathspacing \mathbinarycode \mathfractioncode
+ \allmathstyles \thickermuskip
+\inherited\setmathspacing \mathfractioncode \mathbinarycode
+ \allmathstyles \thickermuskip
+\nulldelimiterspace\zeropoint
+$x + \frac{1}{x+2} + x$
+\stoptyping
+
+Here \typ {\thickermuskip} is defined as \type {7mu plus 5mu} where the stretch
+is the same as a \typ {\thickmuskip} and the width \type {2mu} more. We start out
+with three variants, where the last two have \typ {\nulldelimiterspace} set to
+\type {0pt} and the first one uses the \type {1.2pt}.
+
+\definecolor[tred] [r=1,a=1,t=.5]
+\definecolor[tgreen][g=1,a=1,t=.5]
+\definecolor[tblue] [b=1,a=1,t=.5]
+
+\startlinecorrection
+\scale[scale=4000]\bgroup\vbox\bgroup \forgetall
+ \bgroup \tgreen \nulldelimiterspace=1.2pt $x + \frac{1}{x+2} + x$\egroup\par
+ \bgroup \tred \nulldelimiterspace=0.0pt $x + \frac{1}{x+2} + x$\egroup\par
+ \bgroup \tblue \nulldelimiterspace=0.0pt $x + \frac{1}{x+2} + x$\egroup\par
+\egroup\egroup
+\stoplinecorrection
+
+When we now apply the new settings to the last one, and overlay them we get the
+following output: the first and last case are rather similar which is why this
+effort was started in the first place.
+
+\startlinecorrection
+\scale[scale=4000]\bgroup
+ \startoverlay
+ \bgroup
+ \inherited\setmathspacing \mathbinarycode \mathfractioncode \allmathstyles \thickmuskip
+ \inherited\setmathspacing \mathfractioncode \mathbinarycode \allmathstyles \thickmuskip
+ \tgreen \nulldelimiterspace=1.2pt $x + \frac{1}{x+2} + x$
+ \egroup
+ \bgroup
+ \inherited\setmathspacing \mathbinarycode \mathfractioncode \allmathstyles \thickmuskip
+ \inherited\setmathspacing \mathfractioncode \mathbinarycode \allmathstyles \thickmuskip
+ \tred \nulldelimiterspace=0.0pt $x + \frac{1}{x+2} + x$
+ \egroup
+ \bgroup
+ \inherited\setmathspacing \mathbinarycode \mathfractioncode \allmathstyles \thickermuskip
+ \inherited\setmathspacing \mathfractioncode \mathbinarycode \allmathstyles \thickermuskip
+ \tblue \nulldelimiterspace=0.0pt $x + \frac{1}{x+2} + x$
+ \egroup
+ \stopoverlay
+\egroup
+\stoplinecorrection
+
+Of course these changes are not upward compatible but as they are tiny they are
+not that likely to change the number of lines in a paragraph. In display mode
+changes in horizontal dimensions also have little effect.
+
+\startsubject[title=Penalties]
+
+An inline formula can be broken across lines, and for sure there are places where
+you don't want to break or prefer to break. In \TEX\ line breaks can be
+influenced by using penalties. At the outer level of an inline math formula, we
+can have a specific penalty before and after a binary and|/|or relation. The
+defaults are such that there are no penalties set, but most macro packages set
+the so called \type {\relpenalty} and \type {\binoppenalty} (the \type {op} in
+this name does not relate to the operator class) so a value between zero and
+1000. In \LUATEX\ we also have \type{\pre} variants of these, so we have four
+penalties that can be set, but that is not enough in our new approach.
+
+These penalties are class bound and don't relate to styles, like atom spacing
+does. That means that while atom spacing involves $64 \times 64 \times 8$
+potential values, an amount that we can manage by using the discussed
+inheritance. The inheritance takes less values because which store 4 style values
+per class in one number. For penalties we only need to keep $64 \times 2$ in
+mind, plus a range of inheritance numbers. Therefore it was decided to also
+generalize penalties so that each class can have them. The magic commands are
+shown with some useless examples:
+
+\starttyping
+\letmathparent \mathdigitcode
+ \mathbincode % pre penalty
+ \mathbincode % post penalty
+ \mathdigitcode % options
+ \mathdigitcode % reserved
+\stoptyping
+
+By default the penalties are on their own, like:
+
+\starttyping
+\letmathparent \mathdigitcode
+ \mathdigitcode % pre penalty
+ \mathdigitcode % post penalty
+ \mathdigitcode % options
+ \mathdigitcode % reserved
+\stoptyping
+
+The options and reserved parent mapping are not (yet) discussed here. Unless
+values are assigned they are ignored.
+
+\starttyping
+\setmathprepenalty \mathordcode 100
+\setmathpostpenalty \mathordcode 600
+\setmathprepenalty \mathbincode 200
+\setmathpostpenalty \mathbincode 700
+\setmathprepenalty \mathrelcode 300
+\setmathpostpenalty \mathrelcode 800
+\stoptyping
+
+As with spacing, when there is no known value, the parent will be consulted. An unset
+penalty has a value of 10000.
+
+After discussing the implications of inline math crossing lines, Mikael and I
+decided there can be two solutions. Both can of course be implemented in \LUA,
+but on the other hand, they make good extensions, also because it sort of
+standardized it. The first advanced control feature tweaks penalties:
+
+\starttyping
+\mathforwardpenalties 2 200 100
+\mathbackwardpenalties 2 100 50
+\stoptyping
+
+This will add 200 and 100 to the first two math related penalties, and 100 and 50
+to the last two (watch out: the 100 will be assigned to the last one found, the
+50 to the one before it). As with all things penalty and line break related, you
+need to have some awareness of how non|-|linear the badness calculation is as
+well of the fact that the tolerance and stretch related parameters play a role
+here.
+
+The second tweak is setting \type {\maththreshold} to some value. When set to for
+instance \type {40pt}, formulas that take less space than this will be wrapped in
+a \type {\hbox} and thereby will never break across a page. \footnote {A future
+version might inject severe penalties instead, time will learn.} Actually that
+second tweak has a variant so we have three tweaks! Say that we have this sample
+formula wrapped in some bogus text and repeat that snippet a lot of times:
+
+\startbuffer[demo]
+x xx xxx xxxx $1 + x$ x xx xxx xxxx
+\stopbuffer
+
+\typebuffer[demo]
+
+Now look at the example on the next page. You will notice that the red and blue
+text have different line breaks. This is because we have given the threshold some
+stretch and shrink. The red text has a zero threshold so it doesn't do any magic
+at all, while the second has this setup:
+
+\startbuffer
+\setupmathematics[threshold=medium]
+\stopbuffer
+
+\typebuffer
+
+That setting set the threshold to \typ {4em plus 0.75em minus 0.50em} and when
+the formula size exceeds the four quads the line break code will use the real
+formula width but with the given stretch and shrink. Eventually the calculated
+size will be used to repackage the formula. In the future we will also provide a
+way to define slack more relative to the size and|/|or number of atoms.
+
+\startpostponing
+\startlinecorrection \small
+\startoverlay
+ {\setupmathematics[threshold=none]%
+ \vbox\bgroup
+ \darkred
+ \dorecurse {40} {\getbuffer[demo]}
+ \egroup}
+ {\setupmathematics[threshold=medium]%
+ \vbox\bgroup
+ \darkblue
+ \dorecurse {40} {\getbuffer[demo]}
+ \egroup}
+\stopoverlay
+\stoplinecorrection
+\stoppostponing
+
+Another way to influence line breaks is to use the two inline math related
+penalties that have been added at Mikael's suggestion:
+
+\startbuffer \setupalign[verytolerant]
+{\dorecurse{25}{test $\darkred #1^{#1} + x_{#1}^{#1}$ test }\blank}
+{\preinlinepenalty 500 \postinlinepenalty -500
+ \dorecurse{25}{test $\darkgreen #1^{#1} + x_{#1}^{#1}$ test }\blank}
+{\postinlinepenalty 500 \preinlinepenalty -500
+ \dorecurse{25}{test $\darkblue #1^{#1} + x_{#1}^{#1}$ test }\blank}
+\stopbuffer
+
+\typebuffer
+
+To get an example that shows the effect takes a bit of trial and error because
+\TEX\ does a very good job in line breaking. This is why we've set the tolerance
+and also use negative penalties.
+
+In addition to the \type {\mathsurround} (kern) and \type {\mathsurroundskip}
+(glue) parameters this is a property of the nodes that mark the beginning and end
+of an inline math formula.
+
+\blank \getbuffer \blank
+
+\stopsubject
+
+\startsubject[title=Flattening]
+
+The traditional engine has some code for flattening math constructs that in the
+end are just one character. So in the end, \type {\tilde {u}} and \type {\tilde
+{uu}} become different objects even if both are in fact accents. In fact, when an
+accent is constructed there is a special code path for single characters so that
+script placement adapts to the shape of that character.
+
+However because of interaction with primes, which themselves are sort of
+superscripts and due to the somewhat weird way fonts provide them when it comes
+to positioning and sizes, in \CONTEXT\ we already are fooling around a bit with
+these characters. For understandable reasons of memory usage, complexity and
+eightbitness primes are not a native \TEX\ thing but more something that is
+handled at the macro level (although not in \MKIV\ and \LMTX).
+
+In the end it was script placements on (widely) accented math characters that
+made us introduce a dedicated \type {\Umathprime} primitive that adds a prime to
+a math atom. It permits an uninterupted treatment of scripts while in the final
+assembly of the molecule the prime, superscript, subscript and maybe even
+prescripts that prime gets squeezed in. Because the concept of primes is missing
+in \OPENTYPE\ math an additional font parameter \type {PrimeTopRaisePercent} has
+been introduced as well as an \type {\Umathprimeraise} primitive. In retrospect I
+should have done that earlier but one tends to stick to the original as much as
+possible. However, at some point Mikael and I reached a state where we decided
+that proper (clean) engine extensions make way more sense than struggling with
+border cases and explaining users why things are so complicated.
+
+The input \type {$ X \Uprimescript{'} ^2 _3 $} gives this:
+
+\startlinecorrection
+\startcombination[nx=4,distance=3em,inbetween={\blank[3*medium]}]
+ {\switchtobodyfont [modern]\removeunwantedspaces\scale[s=5]{\strut$\showboxes\showglyphs X\Uprimescript{'}^2_3$}} {Latin Modern}
+ {\switchtobodyfont[cambria]\removeunwantedspaces\scale[s=5]{\strut$\showboxes\showglyphs X\Uprimescript{'}^2_3$}} {Cambria}
+ {\switchtobodyfont[pagella]\removeunwantedspaces\scale[s=5]{\strut$\showboxes\showglyphs X\Uprimescript{'}^2_3$}} {Pagella}
+ {\switchtobodyfont [dejavu]\removeunwantedspaces\scale[s=5]{\strut$\showboxes\showglyphs X\Uprimescript{'}^2_3$}} {Dejavu}
+\stopcombination
+\stoplinecorrection
+
+With \type {\tracingmath = 1} this nicely traces as:
+
+\starttyping
+> \inlinemath=
+\noad[ord][...]
+.\nucleus
+..\mathchar[ord] family "0, character "58
+.\superscript
+..\mathchar[dig] family "0, character "32
+.\subscript
+..\mathchar[dig] family "0, character "32
+.\primescript
+..\mathchar[ord] family "0, character "27
+\stoptyping
+
+Of course this feature can also be used for other prime like ornaments and who
+knows how it will evolve over time.
+
+You can influence the positioning with \type {\Umathprimesupshift} which adds
+some kern between a prime and superscript. The \type {\Umathextraprimeshift}
+moves a prime up. The \type {\Umathprimeraise} is a font parameter that defaults
+to 25 which means a raise of 25\percent of the height. These are all (still)
+experimental parameters.
+
+\stopsubject
+
+\startsubject[title=Fences]
+
+Fences can be good for headaches. Because the math that I (or actually my
+colleague) deal with is mostly school math encoded in presentation \MATHML\ (sort
+or predictable) or some form of sequential \ASCII\ based input (often rather
+messy and therefore unpredictable due to ambiguity) fences are a pain. A \TEX ie
+can make sure that left and right fences are matched. A \TEX ie also knows when
+something is an inline parenthesis or when a more high level structure is needed,
+for instance when parentheses have to scale with what they wrap. In that case the
+\type {\left} and \type {\right} mechanism is used. In arbitrary input missing
+one of those is fatal. Therefore, handling of fences in \CONTEXT\ is one of the
+more complex sub mechanisms: we not only need to scale when needed, but also
+catch asymmetrical usage.
+
+A side effect of the encapsulating fencing construct is that it wraps the content
+in a so called inner (as in \type {\mathinner}) which means that we get a box,
+and it is a well known property of boxes that they don't break across lines. With
+respect to fences, a way out is to not really fence content, but do something
+like this:
+
+\starttyping
+\left(\strut\right. x + 1 \left.\strut\right)
+\stoptyping
+
+and hope for the best. Both pairs are coupled in the sense that their sizes will
+match and the strut is what determines the size. So, as long as there is a proper
+match of struts all is well, but it is definitely a decent hack. The drawback is
+in the size of the strut: if a formula needs a higher one, larger struts have to
+be used. This is why in plain \TEX\ we have these commands:
+
+\starttyping[style=\small\tt]
+\def\bigl {\mathopen \big } \def\bigm {\mathrel\big } \def\bigr {\mathclose\big }
+\def\Bigl {\mathopen \Big } \def\Bigm {\mathrel\Big } \def\Bigr {\mathclose\Big }
+\def\biggl{\mathopen \bigg} \def\biggm{\mathrel\bigg} \def\biggr{\mathclose\bigg}
+\def\Biggl{\mathopen \Bigg} \def\Biggm{\mathrel\Bigg} \def\Biggr{\mathclose\Bigg}
+
+\def\big #1{{\hbox{$\left#1\vbox to 8.5pt{}\right.\nomathspacing$}}}
+\def\Big #1{{\hbox{$\left#1\vbox to 11.5pt{}\right.\nomathspacing$}}}
+\def\bigg#1{{\hbox{$\left#1\vbox to 14.5pt{}\right.\nomathspacing$}}}
+\def\Bigg#1{{\hbox{$\left#1\vbox to 17.5pt{}\right.\nomathspacing$}}}
+
+\def\nomathspacing{\nulldelimiterspace0pt\mathsurround0pt} % renamed
+\stoptyping
+
+The middle is kind of interesting because it has relation properties, while the
+\type {\middle} introduced in \ETEX\ got open properties, but we leave that
+aside.
+
+In \CONTEXT\ we have plenty of alternatives, including these commands, but they
+are defined differently. For instance they adapt to the font size. The hard coded
+point sizes in the plain \TEX\ code relates to the font and steps available in
+there (either by next larger or by extensible). The values thereby need to be
+adapted to the chosen body font as well as the body font size. In \MKIV\ and even
+better in \LMTX\ we can actually consult the font and get more specific sizes.
+
+But, this section is not about how to get these fixed sizes. Actually, the need
+to choose explicitly is not what we want, especially because \TEX\ can size
+delimiters so well. So, take this code snippet:
+
+\startbuffer
+$ x = \left( \dorecurse{40}{\frac{x}{x+#1} +} x \right) $
+\stopbuffer
+
+\typebuffer
+
+% \dostepwiserecurse{0}{25}{1}{
+% \begingroup \showmakeup[mathglue] \showglyphs
+% \advance\hsize-#1pt\relax \inleftmargin{#1pt}%
+% $ x = \left( \dorecurse{20}{\frac{x}{x+##1} +} x \right) $
+% \blank \endgroup
+% }
+When we typeset this inline, as in \inlinebuffer, we get nicely scaled fences but
+in a way that permits line breaks. The reason is that the engine has been
+extended with a \type {fenced} class so that we can recognize later on,
+when \TEX\ comes to injecting spaces and penalties, that we need to unpack the
+construct. It is another beneficial side effect of the generalization.
+
+The Plain \TEX\ code can be used to illustrate some of what we discussed before
+about fractions. In the next code we use excessive delimiter spacing:
+
+\starttyping
+\def\Bigg#1{% watch the wrapping in a box
+ {%
+ \hbox {%
+ $\normalleft#1\vbox to 17.5pt{}\normalright.\nomathspacing$%
+ }%
+ }%
+}
+
+\nulldelimiterspace0pt
+\def\nomathspacing{\nulldelimiterspace0pt\mathsurround0pt}
+
+$\Bigg( 1 + x\Bigg) \quad \Bigg( \frac{1}{x}\Bigg)$\par
+
+\nulldelimiterspace10pt
+\def\nomathspacing{\nulldelimiterspace0pt\mathsurround0pt}
+
+$\Bigg( 1 + x\Bigg) \quad \Bigg( \frac{1}{x}\Bigg)$\par
+
+\nulldelimiterspace10pt
+\def\nomathspacing{\mathsurround0pt}
+
+$\Bigg( 1 + x\Bigg) \quad \Bigg( \frac{1}{x}\Bigg)$\par
+\stoptyping
+
+This renders as follows. We explicitly set \type {\nulldelimiterspace} to values
+because in \CONTEXT\ it is now zero by default.
+
+\startlinecorrection
+ \pushoverloadmode
+ \def\Bigg#1{{\hbox{$\normalleft#1\vbox to 17.5pt{}\normalright.\nomathspacing$}}}
+ \popoverloadmode
+ \startcombination[nx=3,ny=1,distance=3em]
+ {\showboxes
+ \nulldelimiterspace0pt
+ \def\nomathspacing{\nulldelimiterspace0pt\mathsurround0pt}
+ $\Bigg( 1 + x\Bigg) \quad \Bigg( \frac{1}{x}\Bigg)$}
+ {\tttf 0pt with reset at end}
+ {\showboxes
+ \nulldelimiterspace10pt
+ \def\nomathspacing{\nulldelimiterspace0pt\mathsurround0pt}
+ $\Bigg( 1 + x\Bigg) \quad \Bigg( \frac{1}{x}\Bigg)$}
+ {\tttf 10pt with reset at end}
+ {\showboxes
+ \nulldelimiterspace10pt
+ \def\nomathspacing{\mathsurround0pt}
+ $\Bigg( 1 + x\Bigg) \quad \Bigg( \frac{1}{x}\Bigg)$}
+ {\tttf 10pt without reset at end}
+ \stopcombination
+\stoplinecorrection
+
+\stopsubject
+
+\startsubject[title=Radicals]
+
+In traditional \TEX\ a radical with degree is defined as macro. That macro does
+some measurements and typesets the result in four sizes for a choice. The macro
+typesets the degree in a box that contains the degree as formula. There is a less
+guesswork going on than with respect to how the radical symbol is shaped but as
+we're talking plain \TEX\ here it works out okay because the default font is well
+known.
+
+Radicals are a nice example of a two dimensional \quote {extender} but only the
+vertical dimension uses the extension mechanism, which itself operates either
+horizontally or vertically, although in principle it could go both ways. The
+horizontal extension is a rule and the fact that the shape is below the baseline
+(as are other large symbols) will make the rule connect well: the radical shape
+sticks out a little, so one can think of the height reflecting the rule height.
+\footnote {When you zoom in you will notice that this is not always optimal
+because of the way the slope touched the rule.} In \OPENTYPE\ fonts there is a
+parameter and in \LUATEX\ we use the default rule thickness for traditional
+fonts, which is correct for Latin Modern. There are more places in the fonts
+where the design relates to this thickness, for instance fraction rules are
+supposed to match the minus, but this is a bit erratic if you compare fonts. This
+is one of the corrections we apply in the goodie files.
+
+In \OPENTYPE\ the specification of the radical also includes spacing properties
+of the degree and that is why we have a primitive in \LUATEX\ that also handles
+the degree. It is what we used in \CONTEXT\ \MKIV. But \unknown\ we actually end
+up with a situation that compares to the already discussed fraction: there is
+space added before a radical when there is a degree. However, because we now have
+a radical atom class, we can avoid using that one and use the new pairwise
+spacing. Some fuzzy spacing logic in the engine could therefore be removed and we
+assume that \type {\Umathradicaldegreebefore} is zero. For the record: the \type
+{\Umathradicaldegreeafter} sort of tells how much space there is above the low
+part of the root, which means that we can compensate for multi|-|digit degrees.
+
+Zeroing a parameter is something that relates to a font which means that it has
+to happen for each math font which in turn can mean a family|-|style combination. In
+order to avoid that complication (or better: to avoid tracing clutter) we have a
+way to disable a parameter:
+
+\startbuffer
+\ruledhbox{$x + \sqrt[123]{b}^1_2$}
+\ruledhbox{$x + \sqrt[12] {b}^1_2$}
+\ruledhbox{$x + \sqrt[1] {b}^1_2$}
+\ruledhbox{$x + \sqrt {b}^1_2$}
+\stopbuffer
+
+\typebuffer
+
+\startlinecorrection
+\startcombination[1*4]
+ {\switchtobodyfont[modern]\scale[height=10mm]{\showglyphs\setmathignore\Umathradicaldegreebefore0\getbuffer}}{}
+ {\type {\setmathignore \Umathradicaldegreebefore 0}}{}
+ {\switchtobodyfont[modern]\scale[height=10mm]{\showglyphs\setmathignore\Umathradicaldegreebefore1\getbuffer}}{}
+ {\type {\setmathignore \Umathradicaldegreebefore 1}}{Latin Modern}
+\stopcombination
+\stoplinecorrection
+
+One problem with these spacing parameters is that they are inconsistent across
+fonts. The Latin Modern has a rather large space before the degree, while Cambria
+and Pagella have little. That means that when you prototype a mechanism the
+chosen solution can look great but not so much when at some point you use another
+font.
+
+\startlinecorrection
+\startcombination[1*4]
+ {\switchtobodyfont[pagella]\scale[height=10mm]{\showglyphs\setmathignore\Umathradicaldegreebefore0\getbuffer}}{}
+ {\type {\setmathignore \Umathradicaldegreebefore 0}}{}
+ {\switchtobodyfont[pagella]\scale[height=10mm]{\showglyphs\setmathignore\Umathradicaldegreebefore1\getbuffer}}{}
+ {\type {\setmathignore \Umathradicaldegreebefore 1}}{Cambria}
+\stopcombination
+\stoplinecorrection
+
+\stopsubject
+
+\startsubject[title=More fences]
+
+One of the reasons why the \MKII\ and \MKIV\ fence related mechanism is somewhat
+complex is that we want a clean solution for filtering fences like parenthesis by
+size, something that in the traditional happens via a fake fence pair that
+encapsulates a strut of a certain size. In \LMTX\ we use the same approach but
+have made the sequence more configurable. In practice that means that the values
+1 up to 4 are just that but for some fonts we use the sequence \type {1 3 5 7}.
+There was no need to adapt the engine as it already worked quite well.
+
+\stopsubject
+
+\startsubject[title=Integrals]
+
+The Latin Modern fonts have only one size of big operators and one reason can be
+that there is no need for more. Another reason can be that there was just no
+space in the font. However, an \OPENTYPE\ font has plenty slots available and the
+reference font Cambria has integral signs in sizes as well as extensibles.
+
+In \LUATEX\ we already have generic vertical extensibles but that only works well
+with specified sizes. And, cheating with delimiters has the side effect that we
+get the wrong spacing. In \LUAMETATEX\ however we have ways to adapt the size to
+what came or what comes. In fact, it is a mechanism that is available for any atom
+that we support. However, it doesn't play well with script and this whole \type {\limits}
+and \type {\nolimits} is a bit clumsy so Mikael and I decided that different route had
+to be followed. For adaptive large operators we provide this interface:
+
+\startbuffer[sample-1]
+$ x + \integral [color=darkred,top={t},bottom={b}] {\frac{1}{x}} = 10 $
+\stopbuffer
+
+\startbuffer[sample-2]
+$ x + \startintegral [color=darkblue,top={t},bottom={b}]
+ \frac{1}{x}
+\stopintegral = 10 $
+\stopbuffer
+
+\startbuffer[sample-3]
+$ x + \startintegral [color=darkgreen,top={t},bottom={b},method=vertical]
+ \frac{1}{x}
+\stopintegral= 10 $
+\stopbuffer
+
+\typebuffer [sample-1,sample-2,sample-3]
+
+This text is not about the user interface so we won't discuss how to define additional
+large operators using one|-|liners.
+
+\startlinecorrection
+\startcombination[nx=3,ny=1,distance=2em]
+ {\scale[s=2]{\getbuffer[sample-1]}} {}
+ {\scale[s=2]{\getbuffer[sample-2]}} {}
+ {\scale[s=2]{\getbuffer[sample-3]}} {}
+\stopcombination
+\stoplinecorrection
+
+The low level \LUAMETATEX\ implementation handles this input:
+
+\starttyping
+\Uoperator \Udelimiter "0 \fam "222B {top} {bottom} {...}
+\Uoperator limits \Udelimiter "0 \fam "222B {top} {bottom} {...}
+\Uoperator nolimits \Udelimiter "0 \fam "222B {top} {bottom} {...}
+\stoptyping
+
+plus the usual keywords that fenced accept, because after all, this is just a
+special case of fencing.
+
+Currently these special left operators are implemented as a special case of
+fences because that mechanism does the scaling. It means that we need a (bogus)
+right fence, or need to brace the content (basically create an atom). When no
+right fence is found one is added automatically. Because there is no real
+fencing, right fences are removed when processing takes place. When you specify a
+\type {class} that one will be used for the left and right spacing, otherwise we
+have open|/|close spacing.
+
+\stopsubject
+
+\startsubject[title=Going details]
+
+When the next feature was explored Mikael tagged it as math micro typography and
+the reason is that you need not only to set up the engine for it but also need to
+be aware of this kind of spacing. Because we wanted to get rid of this script spacing
+that the font imposes we configured \CONTEXT\ with:
+
+\starttyping
+\setmathignore\Umathspacebeforescript\plusone
+\setmathignore\Umathspaceafterscript \plusone
+\stoptyping
+
+This basically nils all these tiny spaces. But the latest configuration has this
+instead:
+
+\starttyping
+% \setmathignore \Umathspacebeforescript\zerocount % default
+% \setmathignore \Umathspaceafterscript \zerocount % default
+
+\mathslackmode \plusone
+
+\setmathoptions\mathopcode \plusthree
+\setmathoptions\mathbinarycode \plusthree
+\setmathoptions\mathrelationcode\plusthree
+\setmathoptions\mathopencode \plusthree
+\setmathoptions\mathclosecode \plusthree
+\setmathoptions\mathpunctcode \plusthree
+\stoptyping
+
+This tells the engine to convert these spaces into what we call slack: disposable
+kerns at the edges. But it also converts these kerns into a glue component when
+possible. As with all these extensions it complicates the machinery but users
+will never see that. Now, the last six lines do the magic that made us return to
+honoring the spaces: we can tell the engine to ignore this slack when there are
+specific classes at the edges. These options are a bitset and \type {1} means
+\quotation {no slack left} and \type {2} means \quotation {no slack right} so
+\type {3} sets both.
+
+\startbuffer
+\def\TestSlack#1%
+ {\vbox\bgroup
+ \mathslackmode\zerocount
+ \hbox\bgroup
+ \setmathignore\Umathspacebeforescript\zerocount
+ \setmathignore\Umathspaceafterscript \zerocount
+ #1
+ \egroup
+ \vskip-.9\lineheight
+ \hbox\bgroup\red
+ \setmathignore\Umathspacebeforescript\plusone
+ \setmathignore\Umathspaceafterscript \plusone
+ #1
+ \egroup
+ \egroup}
+
+\startcombination[nx=3]
+ {\showglyphs\TestSlack{$f^2 > $}} {}
+ {\showglyphs\TestSlack{$ > f^^2$}} {}
+ {\showglyphs\TestSlack{$f^2 > f^^2$}} {}
+\stopcombination
+\stopbuffer
+
+\typebuffer
+
+\startlinecorrection
+\scale[width=\textwidth]{\getbuffer}
+\stoplinecorrection
+
+Because this overall removal of slack is not granular enough a while later we
+introduced a way to set this per class, as is demonstrated in the following
+example.
+
+\startbuffer
+\def\TestSlack#1%
+ {\vbox\bgroup
+ \mathslackmode\plusone
+ \hbox\bgroup\red
+ \setmathignore\Umathspacebeforescript\zerocount
+ \setmathignore\Umathspaceafterscript \zerocount
+ #1
+ \egroup
+ \vskip-.9\lineheight
+ \hbox\bgroup\green
+ \setmathoptions\mathrelationcode \zerocount
+ #1
+ \egroup
+ \vskip-.9\lineheight
+ \hbox\bgroup\blue
+ \setmathoptions\mathrelationcode \plusthree
+ #1
+ \egroup
+ \egroup}
+
+\startcombination[nx=3]
+ {\showglyphs\TestSlack{$f^2 > $}} {}
+ {\showglyphs\TestSlack{$ > f^^2$}} {}
+ {\showglyphs\TestSlack{$f^2 > f^^2$}} {}
+\stopcombination
+\stopbuffer
+
+\typebuffer
+
+\startlinecorrection
+\scale[width=\textwidth]{\getbuffer}
+\stoplinecorrection
+
+Of course we need to experiment a lot with real documents and it might take a
+while before all this is stable (in the engine and in \CONTEXT). And as we don't
+need to conform to the decades old golden \TEX\ math standards we have some
+degrees of freedom in this: for Mikael and me it is pretty much a visual thing
+where we look closely at large samples. Of course in practice details get lost
+when we print at 10 point but that doesn't mean we can't provide the best
+experience. \footnote {Whenever I look at (my) old (math) school books I realize
+that Don Knuth had very good reasons to come up with \TEX\ and, it being hard to
+beat, \TEX\ still sets the standard!}
+
+As we mention class specific options, we also need to mention the special case
+where we have for instance simple formulas like single atoms (for instance
+digits) are preceded by a sign (binary). These special spacing cases are handled
+by a lookahead flag that can be set \typ {\setmathoptions <class>}, like the
+slack flags. More options might become available in due time. When set the
+lookahead will check for the automatically injected end class atom and use that
+for spacing when found. The mentioned lookahead is one of the hard coded
+heuristics in the traditional engine but here we need to explicitly configure it.
+
+\stopsubject
+
+\startsubject[title=Ghosts]
+
+As plain \TEX\ has macros like \type {\vphantom} you also find them in macro
+packages that came later. These create a boxes that have their content removed
+after the dimensions are set. They take space and are invisible but there's also
+nothing there.
+
+A variant in the upgraded math machinery are ghosts: these are visible in the
+sense that they show up but ignored when it comes to spacing. Here is an example.
+The option bit set here tells the engine that we ghost at the right, so we have
+ghosts around the relation (it controls where the spacing ends up).
+
+\startbuffer
+$
+ x
+ \mathatom class \mathghostcode {!!}
+ >
+ \mathatom class \mathghostcode options "00000020 {!!}
+ 1
+ \quad
+ x
+ \mathatom class \mathghostcode {\hbox{\smallinfofont ord}}
+ >
+ \mathatom class \mathghostcode options "00000020 {\hbox{\smallinfofont dig}}
+ 1
+$
+\stopbuffer
+
+\typebuffer
+
+You never know when this comes in handy but it fits in the new, more granular
+approach to spacing. The code above shows that it's just a class, this time with
+number \number\mathghostcode.
+
+\startlinecorrection
+ \scale[width=\textwidth]{\showglyphs\showmakeup[mathglue]\getbuffer}
+\stoplinecorrection
+
+\stopsubject
+
+\startsubject[title=Struts]
+
+In order to get consistent spacing the \CONTEXT\ macro package makes extensive
+use of struts in text mode as well as math mode. The normal way to implement that is
+either an empty box or a zero width rule, both with a specifically set height
+and depth. In \CONTEXT\ \MKII\ and \MKIV\ (and for a long time in \LMTX\ too) they
+were rules so that we could visualize them: they get some width and kerns
+around them to compensate for that.
+
+In order to not let them interfere with spacing we could wrap them into a ghost
+atom but it is kind of ugly. Anyway, before we had these ghost atoms an
+alternative to struts was already implemented: a special kind of rule. The reason is
+that I wanted a cleaner and more predictable way to adapt struts to the math style
+uses and sometimes predicting that is fragile. What we want is a delayed assignment of
+dimensions.
+
+We have two solutions. The first one uses two math parameters that themselves
+adapt to the style, as do other parameters: \type {\Umathruleheight} and \type
+{\Umathruledepth}. The other solution relates a font (or family) and character
+with the strut rule which is then used as measure for the height and depth. Just
+for the record: this also works in text mode, which is why a recent \LMTX\ also
+does use that for struts now. The optional visualization is just part of the
+regular visualization mechanism in \CONTEXT\ which already had provisions for
+struts. A side effect of this is that the rule primitives now accept three more
+keywords: \type {font}, \type {fam} and \type {char}, in addition to the already
+present traditional ones \type {width}, \type {height} and \type {depth}, the
+(backend) margin ones \type {left} (or \type {top}) and \type {right} (or \type
+{bottom}) options, as well as \type {xoffset} and \type {yoffset}). The command
+that creates a rule with subtype \type {strut} is simply \type {\srule}. Because
+struts are rather macro package specific I leave it to this.
+
+One positive side effect is that we could simplify the \CONTEXT\ fraction mechanism
+a bit. Over time control over the (font driven) gaps was introduced but that is
+not really needed because we zero the gaps anyway. There was also a tolerance
+mechanism which again was not used. However, for skewed fractions we do use the new
+tolerance mechanism as well as gap control.
+
+\stopsubject
+
+\startsubject[title=Atoms]
+
+Now that we have generic atoms (\type {\mathatom}) another, sometimes confusing aspect
+of the math parsing can be solved. Take this:
+
+\starttyping
+\def\MyBin{\mathbin{\tt mybin}}
+$ x ^ \MyBin _ \MyBin $
+\stoptyping
+
+The parser just doesn't like that which means that one has to use
+
+\starttyping
+\def\MyBin{\mathbin{\tt mybin}}
+$ x ^ {\MyBin} _ {\MyBin} $
+\stoptyping
+
+or:
+
+\starttyping
+\def\MyBin{{\mathbin{\tt mybin}}}
+$ x ^ \MyBin _ \MyBin $
+\stoptyping
+
+But the later has side effects: it creates a list that can influence spacing. It
+is for that reason that we do accept atoms where they were not accepted before.
+Of course that itself can have side effects but at least we don't get an error
+message. It fits well into the additional (user) classes model. And, given that
+in \CONTEXT\ the \type {\frac} command is actually wrapped as \type {\mathfrac}
+the next will work too:
+
+\starttyping
+$ x^\frac{1}{2} + x^{\frac{1}{2}} $
+\stoptyping
+
+but in practice you should probably use the braced version here for clarity.
+
+\stopsubject
+
+\startsubject[title=The \type {vcenter} primitive]
+
+Traditionally this primitive is bound to math but it had already been adapted to also
+work in text mode. As part of the upgrade of math we can now also pass all the options
+that normal boxed take and we can also cheat with the axis. Here is an example:
+
+\startbuffer
+\def\TEST{\hbox\bgroup
+ \darkred \vrule width 2pt height 4pt
+ \darkgreen \vrule width 10pt depth 2pt
+\egroup}
+$
+ x - \mathatom \mathvcentercode {!!!} -
+ + \ruledvcenter {\TEST}
+ + \ruledvcenter {\TEST}
+ + \ruledvcenter axis 1 {\TEST}
+ + \ruledvcenter xoffset 2pt yoffset 2pt {\TEST}
+ + \ruledvcenter xoffset -2pt yoffset -2pt {\TEST}
+ + x
+$
+\stopbuffer
+
+\typebuffer
+
+There was already a vcenter class available before we did this:
+
+\startlinecorrection
+ \scale[width=\textwidth]{\showglyphs\showmakeup[mathglue]\getbuffer}
+\stoplinecorrection
+
+\stopsubject
+
+\startsubject[title=Text]
+
+Sometimes you want text in math, for instance \type {sin} or \type {cos} but
+text in math is not really text:
+
+\startbuffer
+$ \setmathspacing\mathordinarycode\mathordinarycode\textstyle 10mu fin(x) $
+\stopbuffer
+
+\typebuffer
+
+The result demonstrates that what looks like a word actually becomes three
+math atoms:
+
+\startlinecorrection
+ \scale[width=\textwidth]{\showglyphs\showmakeup[mathglue]\getbuffer}
+\stoplinecorrection
+
+Okay, so how about then wrapping it into a text box:
+
+\startbuffer
+$
+ \setmathspacing\mathordinarycode\mathordinarycode\textstyle 10mu
+ fin(x) \quad \hbox{fin}(x)
+$
+\stopbuffer
+
+\typebuffer
+
+Here we get:
+
+\startlinecorrection
+ \scale[width=\textwidth]{\showglyphs\showmakeup[mathglue]\getbuffer}
+\stoplinecorrection
+
+We even get a ligature which might be an indication that we're not using a math
+font which indeed is the case: the box is typeset in the regular text font.
+
+\startbuffer
+\def\Test#1%
+ {\setmathspacing\mathordinarycode\mathordinarycode\textstyle 5mu
+ $\showglyphs
+ #1% style
+ {\tf fin} \quad
+ \hbox{fin} \quad
+ \mathatom class \mathordinarycode textfont {fin}
+ \mathatom class \mathordinarycode textfont {\tf fin}
+ \mathatom class \mathordinarycode textfont {\hbox{fin}}
+ \mathatom class \mathordinarycode mathfont {\hbox{fin}}
+ $}
+\stopbuffer
+
+\typebuffer \getbuffer
+
+When we feed this macro with the \type {\textstyle}, \type {\scriptstyle} and \type
+{\scriptscriptstyle} we get:
+
+\startlinecorrection
+ \startcombination[1*3]
+ {\scale[scale=3000]{\Test\textstyle }} {text}
+ {\scale[scale=3000]{\Test\scriptstyle }} {script}
+ {\scale[scale=3000]{\Test\scriptscriptstyle}} {scriptscript}
+ \stopcombination
+\stoplinecorrection
+
+Here you see a new atom option action: \type {textfont} which does as much as
+setting the font to the current family font and the size to the one used in the
+style. For the record: you only get ligatures when they are configured and
+provided by the font (and as math is a script itself it is unlikely to work).
+\footnote {The existing mechanisms in \CONTEXT\ already dealt with this but it is
+nevertheless nice to have it as a clean engine feature.}
+
+\stopsubject
+
+\startsubject[title=Tracing]
+
+I won't discuss the tracing features in \CONTEXT\ here but for sure the
+visualizer helps a lot in figuring out all this. In \LUAMETATEX\ we carry a bit
+more information with the resulting nodes so we can provide more details, for
+instance about the applied spacing and penalties. Some is shown in the examples.
+A more recent tracing feature is this:
+
+\starttyping
+\tracingmath 1
+\tracingonline 1
+$
+ \mathord (
+ \mathord {(}
+ \mathord \Udelimiter"4 0 `(
+ \Udelimiter"4 0 `(
+$
+\stoptyping
+
+That gives us on the console (the dots represent detailed attribute info that we
+omit here):
+
+\starttyping
+7:3: > \inlinemath=
+7:3: \noad[ord][...]
+7:3: .\nucleus
+7:3: ..\mathchar[open] family "0, character "28
+7:3: \noad[ord][...]
+7:3: .\nucleus
+7:3: ..\mathlist
+7:3: ...\noad[open][...]
+7:3: ....\nucleus
+7:3: .....\mathchar[open] family "0, character "28
+7:3: \noad[ord][...]
+7:3: .\nucleus
+7:3: ..\mathchar[open] family "0, character "28
+7:3: \noad[open][...]
+7:3: .\nucleus
+7:3: ..\mathchar[open] family "0, character "28
+\stoptyping
+
+A tracing level of 2 will spit out some information about applied spacing and
+penalties between atoms (when set) and level 3 will show the math list before the
+first and second pass (a mix of nodes and noads) we well as the result (nodes) plus
+return some details about rules, spacing and penalties applied.
+
+\stopsubject
+
+\startsubject[title=Is there more?]
+
+The engine already provides the option to circumvent the side effect of a change
+in a parameter acting sort of global: the last value given is also the one that a
+second pass starts with. The \type {\frozen} prefix will turn settings into local
+ones but that's another (already old) topic. There are many such improvements and
+options not mentioned here but you can find them mentioned and explained in older
+development stories. A lot has been around for a while but not been applied in
+\CONTEXT\ yet.
+
+When \TEX\ was written one important property (likely related to memory
+consumption) is that node lists have only forward pointers. That means that the
+state of preceding material has to be kept track of: there is no going (or
+looking) back. In \LUATEX\ we have double linked lists so in principle we can try
+to be more clever but so far I decided not to touch the math machinery in that
+way. But who knows what comes next.
+
+\stopsubject
+
+\startsubject[title=Those italics]
+
+Right from the start of \LUATEX\ it became clear that the fact that \TEX\ assumes
+the actual width of glyphs to be incremented by the italic correction that then
+selectively is removed has been an issue. It made for successive attempts to
+improve spacing in \CONTEXT\ by providing pseudo features. But, when we moved
+from assembled \UNICODE\ math fonts to \quote {real} ones that became messy: what
+trick to apply when and even worse where? In the end there are only a very few
+shapes that actually are affected in the sense that when we don't deal with them
+it looks bad. It also happens that one of those shapes is the italic \quote {f},
+a letter that is used frequently in math. It might even be safe to say that the
+simple fact that the math italic f has this excessively wrong width and thereby
+pretty large italic correction is the cause of many problems.
+
+In the \LMTX\ approach Mikael and I settled on patching shapes in the so called
+font goodie files, aka \type {lfg} files and only a handful of entries needed a
+treatment. This makes a good case for removing the traditional font code path
+from \LUAMETATEX.
+
+\startbuffer
+ \dontleavehmode {\tt\fontclass}:
+ \start
+ \showglyphs \setupinterlinespace[1.2]
+ \dostepwiserecurse{`a}{`z}{1}{$\Uchar#1^1_2$ }
+ \dostepwiserecurse{`a}{`z}{1}{$\bi\Uchar#1^1_2$ }
+ \par
+ \stop
+\stopbuffer
+
+\start
+ \switchtobodyfont[modern] \getbuffer\blank
+ \switchtobodyfont[cambria] \getbuffer\blank
+ \switchtobodyfont[pagella] \getbuffer\blank
+ \switchtobodyfont[termes] \getbuffer\blank
+ \switchtobodyfont[bonum] \getbuffer\blank
+\stop
+
+One of the other very sloped symbol is the integral, although most fonts have
+them more upright than tex has. Of course there are many variants of these
+integrals in a math font. Here we also have some font parameters that we can
+tune, which is what we do.
+
+\stopsubject
+
+\startsubject[title=Accents]
+
+Accents are common in languages other than English and it's English that \TEX\
+was made for. Although the seven bit variant became eight bit handling accents
+never was sophisticated and one of the main reasons is of course that one could
+use pre|-|built composed characters. The \OPENTYPE\ format brought proper
+anchoring (aka marks) to font formats and when \LUATEX\ deals with text those
+kick in. In \OPENTYPE\ math however, anchoring is kind of limited to the top
+position only. Because the \TEXGYRE\ fonts are based on traditional \TEX\ fonts,
+their accents have not become better suited.
+
+\startbuffer
+$ \hat{x} \enspace \widehat{x} \enspace \widehat{xx} \enspace \widehat{xxx}
+ \enspace \hat{f} \enspace \widehat{f} $
+\stopbuffer
+
+\typebuffer
+
+When looking at examples you need to be aware of the fact hat fonts can have been
+adapted in the goodie files. \footnote {Extreme examples can be found for Lucida
+Bright where we not only have to fix the extensible parts of horizontal braces
+but also have to provide horizontal brackets.} So, for instance bounding boxes
+and such can differ from the original. Anyway, the previous code in Cambria looks
+as follows.
+
+\startlinecorrection
+\scale[height=18mm]{\showglyphs\switchtobodyfont[cambria]\inlinebuffer}
+\stoplinecorrection
+
+With Latin Modern we get:
+
+\startlinecorrection
+\scale[height=18mm]{\showglyphs\switchtobodyfont[modern]\inlinebuffer}
+\stoplinecorrection
+
+And Dejavu comes out as:
+
+\startlinecorrection
+\scale[height=18mm]{\showglyphs\switchtobodyfont[dejavu]\inlinebuffer}
+\stoplinecorrection
+
+As you can see there are some differences. In for instance Latin Modern the shape
+of the hat and smallest wide hat are different and the first wide one has zero
+dimensions combined with a negative anchor. When an accented character is
+followed by a superscript or prime the italic correction of the base kicks in but
+that cannot be enough to not let this small wide hat overflow into the script. We
+could compensate for it but then we need to know the dimensions. Of course we can
+consult the bounding box but it makes no sense to let heuristics enter the
+machinery here while we're in the process generalization. One option is to have
+two extra parameters that can be used when the width of the accent comes close to
+the width of the base (we then assume that zero accent width means that it has
+base width) we add an additional kern. In the end we settled for a (semi automatic)
+correction option in the goodie files.
+
+There are actually three categories of extensible accents to consider: those that
+resemble the ones used in text (like tildes and hats), those wrapping something
+(like braces and bracket but also arrows) and rules (that in traditional \TEX\
+indeed are rules). In \CONTEXT\ we have different interfaces for each of these
+in order to have a more extensive control. The text related ones are the
+simplest and closest to what the engine supports out of the box but even there we
+use tweaked glyphs to get better spacing because (of course) fonts have different
+and inconsistent spacing in the boundingbox above and below the real shape. This
+is again some tweak that we moved from being {\em automatic} to being {\em under
+goodie file control}. But this is all too \CONTEXT\ specific to discuss here in
+more detail.
+
+\stopsubject
+
+\startsubject[title=Decision time]
+
+After lots of tests Mikael and I came to the conclusion that we're facing the
+following situation. When typesetting math most single characters are italic and
+we already knew from the start of the \LUATEX\ project that the italics shapes
+are problematic when it comes to typesetting math. But it looks like even some
+upright characters can have italic correction: in TexGyreBonum for instance the
+bold upright \type {f} has italic correction, probably because it then can
+(somehow) kern with a following \type {i}. It anyhow assumes no italic correction
+to be applied between these characters.
+
+In the end the mixed math font model model got more and more stressed so one
+decision was to simply assume fonts to be used that are either Cambria like
+\OPENTYPE, or mostly traditional in metrics, or a hybrid of both. It then made
+more sense to change the engine control options that we have into ones that
+simply enable certain code paths, independent of the fact if a font is \OPENTYPE\
+or not. It then become a bit \quotation {crap in, crap out}, but because we
+already tweak fonts in the goodie files it's quite okay. Some fonts have bad
+metrics anyway or miss characters and it makes no sense to support abandoned
+fonts either. Also, when a traditional font is assembled one can set up the
+engine with different flags and we can deal with it as we wish. In the end it is
+all up to the macro package to configure things right, which is what we tried to
+do for months when rooting out all the artifacts that fonts bring. \footnote {In
+previous versions one could configure this per font but that has been dropped.}
+
+That said, the reason why some (fuzzy) mixed model works out okay (also in
+\LUATEX) is that proper \OPENTYPE\ fonts use staircase kerns instead of italic
+correction. They also have no ligatures and kerns. We also suspect that not that
+much attention is paid to the rendering. It's a bit like these \quotation {How
+many f's do you count in this sentence?} tests where people tend to overlook
+\type {of}, \type {if} and similar short words. Mathematicians loves \type {f}'s
+but probably also overlook the occasionally weird spacing and kerning.
+
+A side effect is that mixing \OPENTYPE\ and traditional fonts is also no longer
+assumed which in turn made a few (newly introduced) state variables obsolete. Once
+everything is stable (including extensions discussed before) some further cleanup
+can happen. Another side effect is that one needs to tell the engine what to apply
+and where, like this:
+
+\starttyping
+\mathfontcontrol\numexpr \zerocount
+ +\overrulemathcontrolcode
+ +\underrulemathcontrolcode
+ +\fractionrulemathcontrolcode
+ +\radicalrulemathcontrolcode
+ +\accentskewhalfmathcontrolcode
+ +\accentskewapplymathcontrolcode
+ % + checkligatureandkernmathcontrolcode
+ +\applyverticalitalickernmathcontrolcode
+ +\applyordinaryitalickernmathcontrolcode
+ +\staircasekernmathcontrolcode
+ % +\applycharitalickernmathcontrolcode
+ % +\reboxcharitalickernmathcontrolcode
+ +\applyboxeditalickernmathcontrolcode
+ +\applytextitalickernmathcontrolcode
+ +\checktextitalickernmathcontrolcode
+ % +\checkspaceitalickernmathcontrolcode
+ +\applyscriptitalickernmathcontrolcode
+ +\italicshapekernmathcontrolcode
+\relax
+\stoptyping
+
+There might be more control options (also for tracing purposes) and some of the
+symbolic (\CONTEXT) names might change for the better. As usual it will take some
+years before all is stable but because most users use the latest greatest version
+it will be tested well.
+
+After this was decided and effective I also decided to drop the mapping from
+traditional font parameters to the \OPENTYPE\ derives engine ones: we now assume
+that the latter ones are set. After all, we already did that in \CONTEXT\ for the
+virtual assemblies that we started out with in the beginning of \LUATEX\ and
+\MKIV.
+
+\stopsubject
+
+\startsubject[title=Dirty tricks]
+
+Once you start playing with edge cases you also start wondering if some otherwise
+complex things can be done easier. The next macro brings together a couple of
+features discussed in previous sections. It also uses two state variables:
+\type {\lastleftclass} and \type {\lastrightclass} that hold the most recent
+edge classes.
+
+\startbuffer
+\tolerant\permanent\protected\def\NiceHack[#1]#:#2% special argument parsing
+ {\begingroup
+ \setmathatomrule
+ \mathbegincode\mathbincode % context constants
+ \allmathstyles
+ \mathbegincode\mathbincode
+ \normalexpanded
+ {\setbox\scratchbox\hpack
+ ymove \Umathaxis\Ustyle\mathstyle % an additional box property
+ \bgroup
+ \framed % a context macro
+ [location=middle,#1]
+ {$\Ustyle\mathstyle#2$}%
+ \egroup}%
+ \mathatom
+ class 32 % an unused class
+ \ifnum\lastleftclass <\zerocount\else leftclass \lastleftclass\fi
+ \ifnum\lastrightclass<\zerocount\else rightclass \lastrightclass\fi
+ \bgroup
+ \box\scratchbox
+ \egroup
+ \endgroup}
+\stopbuffer
+
+\typebuffer \getbuffer
+
+\startbuffer
+\def\MyTest#1%
+ {$ x #1 x $\quad
+ $ x \NiceHack[offset=0pt]{#1} x $\quad
+ $\displaystyle x #1 x $\quad
+ $\displaystyle x \NiceHack[offset=0pt]{#1} x $}
+
+\scale[scale=2000]{\MyTest{>}} \blank
+\scale[scale=2000]{\MyTest{+}} \blank
+\scale[scale=2000]{\MyTest{!}} \blank
+\scale[scale=2000]{\MyTest{+\frac{1}{2}+}}\blank
+\scale[scale=2000]{\MyTest{\frac{1}{2}}} \blank
+\stopbuffer
+
+\typebuffer
+
+Of course this is not code you immediately come up with after reading this text,
+also because you need to know a bit of \CONTEXT.
+
+\startlinecorrection
+\showmakeup[mathglue]\getbuffer
+\stoplinecorrection
+
+There are a few control options, like \type {\noatomruling} that can be used to
+prevent rules being applied to the next atom. We can use these in order to
+achieve more advanced alignment results, but discussing math alignments would
+demand many more pages than make sense here.
+
+\stopsubject
+
+\startsubject[title=Tuned kerning]
+
+The \CONTEXT\ distribution has dedicated code for typesetting units that dates
+back to the mid nineties of the previous century but was (code wise) upgraded
+from \MKII\ to \MKIV\ which made it end up in the physics name space. There is
+not much reason to redo that code but when we talk new spacing classes it might
+make sense at some point to see if we can use less code for spacing by using a
+\quote {unit} class. When Mikael pointed out that, for instance in Pagella:
+
+\startlinecorrection
+\switchtobodyfont[pagella]\showglyphs
+\scale[height=1cm]{\setmathoptions\mathdivisioncode\zerocount\m{m^3/s__2}}
+\stoplinecorrection
+
+doesn't space well the obvious answer is: use the units mechanism because this
+kind of rendering was why it was made in the first place. However, the question
+is of course, can we do better anyway. The chosen solution uses a combination
+of class options and tweaked shape kerning:
+
+\startlinecorrection
+\switchtobodyfont[pagella]\showglyphs
+\scale[height=1cm]{\m{m^3/s__2}}
+\stoplinecorrection
+
+An example of a class setup in \CONTEXT\ is:
+
+\starttyping
+\setmathoptions\mathdivisioncode\numexpr
+ \nopreslackclassoptioncode +\nopostslackclassoptioncode
+ +\lefttopkernclassoptioncode +\righttopkernclassoptioncode
+ +\leftbottomkernclassoptioncode +\rightbottomkernclassoptioncode
+\relax
+\stoptyping
+
+and, although we don't go into the details of tweaking here, this is the kind
+if code you will find in the goodie file:
+
+\starttyping
+{
+ tweak = "kerns",
+ list = {
+ [0x2F] = {
+ topleft = -0.3,
+ bottomright = 0.2,
+ }
+ }
+}
+\stoptyping
+
+where the numbers are a percentage of the width. This specification translates in
+a math staircase kerning recipe.
+
+\stopsubject
+
+\startsubject[title=More font tweaks]
+
+Once you start looking into the details of these fonts you are likely to notice
+more issues. For instance, in the nice looking Lucida math fonts the relations
+have inconsistent widths and even shapes. This can partially be corrected by
+using a stylistic alternate but even that forced us to come up with a mechanism
+to selectively replace \quote {bad} shapes because there is not that much
+granularity in the alternates. And once we looked at these alternates we noticed
+that the definition of of script versus calligraphic is also somewhat fuzzy and
+font dependent. That made for yet another tweak where we can swap alphabets and
+let the math machinery choose the expected shape. In \UNICODE\ this is handled by
+variant selectors which is rather cumbersome. Because these two styles are used
+mixed in the same document, a proper additional alphabet would have made more
+sense. As we already support variant selectors it was no big deal to combine that
+mechanism with a variant selector features over a range of calligraphic or script
+characters, which indeed is what mathematicians use (Mikael can be very
+convincing). With this kind of tweaks the engine doesn't really play a role: we
+always could and did deal with it. It's just that upgrading the engine made us
+look again at this.
+
+\stopsubject
+
+\startsubject[title=Normalization]
+
+Once we had all these spacing related features upgraded it was time to move to
+other aspects math typesetting. Most of that is not handled in the engine but at
+the macro level. Examples of this are making sure that math spacing obeys the
+rules across alignment cells, breaking long formulas into lines with various
+alignment schemes. The first is accommodated by using the primitives that set the
+states at the beginning and end of a formula so that is definitely something that
+the engine facilitates. The second was already possible in \MKIV\ but is somewhat
+more transparent now by using tagged boundary nodes.
+
+But for this summary we stick to discussing the more low level features and where
+most of what we discussed here concerns horizontal spacing we also have some
+vertical magic like the mentioned scaled fences and operators but they sort of
+behave as expected given the traditional \TEX\ approach. We have some more:
+
+\startbuffer
+\definemathradical[esqrt][sqrt][height=\maxdimen,depth=\maxdimen]
+\definemathradical[ssqrt][sqrt][height=3ex,depth=2ex]
+
+\def\TestSqrt#1%
+ {test $ #1{x} + #1{\sin(x)} $ test\quad
+ test $ #1{x} + #1{\sin(x)} + #1{\frac{1}{x}} $ test\quad
+ test $ #1{x} + #1{x^2} $ test\quad
+ test $ \left(#1{x} + #1{x^2} \right) $ test\par}
+
+\TestSqrt \sqrt \blank
+\TestSqrt \esqrt \blank
+\TestSqrt \ssqrt \blank
+\stopbuffer
+
+\typebuffer \getbuffer
+
+In the above example you see that square roots can be made to adapt themselves to
+other such roots. For this we had to add an additional pass. Originally there are
+just two passes: a first typesetting pass where the maximum height and depth are
+collected so that in the second pass the fences can be generated and injected.
+That second pass also handles the spacing and penalties. In \LUAMETATEX\ we now
+have (1) radical body typesetting, (2) radical typesetting, (3) atom typesetting
+with height and depth analysis, (4) fence typesetting, and finally (5) inject
+spacing, penalties, remove slack, etc.
+
+In the examples above we set the height and depth and these are passed by
+keywords to the radical primitive (most atoms and math structures accept keywords
+that control rendering). Here the special values \type {\maxdimen} signal that we
+have to make radicals of equal height and depth.
+
+In \MKII\ we had ways to snap formulas so that we got consistent line spacing.
+For a while I wondered if the engine could help with that but in the end no
+specific engine features are needed, but is is definitely an area that I keep an
+eye on because consistent spacing is important. After all one has to draw aline
+somewhere and we always have the \LUA\ callback mechanism available.
+
+\stopsubject
+
+\startsubject[title=More goodies]
+
+This summary will never be complete because we keep improving the rendering of
+math. For instance, when Mikael checked some less used math alphabets of Latin
+Modern and Bonum, as part of the goodie file completion, we were a bit horrified
+by the weird top accent anchoring, inconsistent dimensions and stale italic
+correction present in some glyphs. For instance there was a italic correction
+after an upright blackboard lowercase \quote {f}, the upright digits had somewhat
+random top accent anchors, and due to the lack of granularity in for instance
+wide hats, characters that are often seen together got inconsistent wide hats.
+Also clashing with scripts was possible. All this resulted in yet another bunch
+of features:
+
+\startitemize
+\startitem
+ In the goodie files we added efficient options to remove anchors from
+ alphabets (or individual characters).
+\stopitem
+\startitem
+ In the goodie files we added similar options to remove italic correction.
+\stopitem
+\startitem
+ Characters got a few extra fields: margins that can be used to cheat with
+ dimensions so that we can get more consistent wide accents.
+\stopitem
+\startitem
+ The engine also got the possibility to compensate for accents when
+ superscripts need to be anchored (by diminishing the height of accents as
+ well as via an offsets).
+\stopitem
+\stopitemize
+
+We expect to add (and use) some more options like this when we run into other
+persistent issues. For sure there are some already that are not discussed here.
+Of course one can argue why we spend time on this: in 15 years of \UNICODE\ math
+usage in the \TEX\ community no one ever bothered about a wide hat over the
+digit~7 and no one wondered about the bad spacing after a lowercase blackboard~f,
+but as we go on we do run into these phenomena and it has become a bit of an
+obsession to get it all right. \footnote {Of course all this puts the usual
+bashing of Microsoft Word by users in a different perspective: limited control in
+the \TEX\ engine, faulty fonts that come with \TEX\ distributions, lack of
+testing and quality control, and probably the believe that all gets done well
+automatically plays a role here.}
+
+By closely looking at default positioning of accents on top of characters Mikael
+noticed that the anchor points are actually always in the middle of the topmost
+left and right points of shapes. It looks like these points are calculates
+automatically and therefore you end up with an anchor on top of the highest part
+of the seven in Latin Modern Serif but in the middle of a seven with a flat top.
+You also get anchors at the top of the vertical line in b, d, and on the sticky
+bit of the g. It is a good example of being careful with automating font design.
+In our case, removing most anchors and adding a few later on was the solution.
+\footnote {In the original fonts and traditional \TEX\ engine a kerning pair
+between a so called skew char and the character at hand is used.}
+
+\stopsubject
+
+\startsubject[title=Untold stories]
+
+There are of course more features but not all make sense to discuss here. For instance,
+all hard coded properties are now configurable. Take for instance:
+
+\startbuffer
+\Umathsuperscriptvariant\textstyle 1
+\Umathsubscriptvariant \textstyle 1
+
+$ 1_2^3 \quad {\scriptstyle 1_2^3} \quad {\displaystyle 1_2^3}$
+\stopbuffer
+
+\typebuffer
+
+This gives us:
+
+\startlinecorrection
+\scale[scale=3000]{\getbuffer}
+\stoplinecorrection
+
+Here the number refers to one of the build in variants, that themselves are a
+range of styles. In the next table the narrow variants are cramped:
+
+\def\Cramped#1{{\glyphyscale\numexpr6*\glyphyscale/10\relax#1}}
+
+\starttabulate[|c|l|c|c|c|c|c|c|c|c|]
+\BC 0 \BC normal \NC
+ D \NC \Cramped{D} \NC
+ T \NC \Cramped{T} \NC
+ S \NC \Cramped{S} \NC
+ SS \NC \Cramped{SS} \NC
+\NR
+\BC 1 \BC cramped \NC
+ \Cramped{D} \NC \Cramped{D} \NC
+ \Cramped{T} \NC \Cramped{T} \NC
+ \Cramped{S} \NC \Cramped{S} \NC
+ \Cramped{SS} \NC \Cramped{SS} \NC
+\NR
+\BC 2 \BC subscript \NC
+ \Cramped{S} \NC \Cramped{S} \NC
+ \Cramped{S} \NC \Cramped{S} \NC
+ \Cramped{SS} \NC \Cramped{SS} \NC
+ \Cramped{SS} \NC \Cramped{SS} \NC
+\NR
+\BC 3 \BC superscript \NC
+ S \NC S \NC
+ S \NC S \NC
+ SS \NC SS \NC
+ SS \NC SS \NC
+\NR
+\BC 4 \BC small \NC
+ S \NC S \NC
+ S \NC S \NC
+ SS \NC SS \NC
+ SS \NC SS \NC
+\NR
+\BC 5 \BC smaller \NC
+ S \NC \Cramped{S} \NC
+ S \NC \Cramped{S} \NC
+ SS \NC \Cramped{SS} \NC
+ SS \NC \Cramped{SS} \NC
+\NR
+\BC 6 \BC numerator \NC
+ S \NC \Cramped{S} \NC
+ S \NC \Cramped{S} \NC
+ SS \NC \Cramped{SS} \NC
+ SS \NC \Cramped{SS} \NC
+\NR
+\BC 7 \BC denominator \NC
+ \Cramped{S} \NC \Cramped{S} \NC
+ \Cramped{S} \NC \Cramped{S} \NC
+ \Cramped{SS} \NC \Cramped{SS} \NC
+ \Cramped{SS} \NC \Cramped{SS} \NC
+\NR
+\BC 8 \BC double (superscript) \NC
+ S \NC \Cramped{S} \NC
+ S \NC \Cramped{S} \NC
+ SS \NC \Cramped{SS} \NC
+ SS \NC \Cramped{SS} \NC
+\NR
+\stoptabulate
+
+If you want you can change these values but of course we're then basically
+changing some of logic behind math rendering and for sure Don Knuth had good
+reasons for these defaults.
+
+Another untold story relates to multi scripts. When a double script is seen,
+\TEX\ injects an ordinary recovery atom, issues an error message, and when told
+so just continues. In order to always continue \LUAMETATEX\ introduces a mode
+variable that default to minus one, as negative values will trigger the error.
+Zero of positive values are interpreted as a class and bypass the error. Here is
+an example of usage:
+
+\startbuffer
+\mathdoublescriptmode
+ "\tohexadecimal\mathexperimentalcode % experimental class
+ \tohexadecimal\mathexperimentalcode % we have to set both left and right
+
+\setmathspacing \mathexperimentalcode \mathexperimentalcode \allmathstyles 20mu
+\setmathspacing \mathordinarycode \mathexperimentalcode \allmathstyles 20mu
+
+$x^1_2^3_4^^5__6^^7__8$
+\stopbuffer
+
+\typebuffer
+
+We get this:
+
+\startlinecorrection
+\scale[scale=3000]{\getbuffer}
+\stoplinecorrection
+
+\stopsubject
+
+\startsubject[title=Final words]
+
+One can argue that all these new features can make a document look better. But
+you only have to look at what Don Knuth produces himself to see that one always
+could do a good job with \TEX, although maybe at the cost of some extra spacing
+directives. It is the fact that \OPENTYPE\ showed up as well as many more math
+fonts, all with their own (sometimes surprising) special effects, that made us
+adapt the engine. Of course there are also new possibilities that permit better
+and more robust macro support. The \TEX book has a chapter on \quotation {the
+fine points of mathematics typesetting} for a reason.
+
+There has never been an excuse to produce bad looking documents. It is all
+about care. For sure there is a category of users who are forced to use \TEX, so
+they are excused. There are also those who have no eye for typography and rely on
+the macro package, so there we can to some extent blame the authors of those
+packages. And there are of course the sloppy users, those who don't enter a
+revision loop at all. They could as well use any system that in some way can
+handle math. One can also wonder in what way massive remote editing as well as
+collaborative working on documents make things better. It probably becomes less
+personal. At meetings and platforms \TEX\ users like to bash the alternatives but
+in the end they are part of the same landscape and when it comes to math they
+dominate. Maybe there is less to brag about then we like: just do your thing and
+try to do it as good as possible. Rely on your eyes and pay attention to the
+details, which is possible because the engine provided the means. The previous
+text shows a few things to pay attention to.
+
+Now that all the basics that have to do with proper dimensions, spacing,
+penalties and logic are dealt with, we moved on to the more high level
+constructs. We also haven't applied some features in the \CONTEXT\ code base yet
+and are now experimenting with the more high level constructs. For instance the
+frequently used math alignment mechanism has been overhauled to support advanced
+inter atom spacing across rows, and in practice one will now more often not even
+use this alignment mechanism and use the alignment features in multi|-|line
+display math, if only because they offer advanced annotation. As a nice side
+effect some of the mechanism that we use for this (like the improved \type
+{\vadjust} primitive engine feature) also became somewhat more powerful in
+regular text mode and we'll see where that brings us.
+
+Given the time we spend on this and given the numerous new features it will take
+a while before all that got added to the engine will be documented. Of course the
+usage in \CONTEXT\ also serves as documentation. This is not really a problem
+because most users will happily rely on the goodie files being okay and
+maintained, and usage other than \CONTEXT\ is unlikely to use these new features,
+if only because it will break away from the established long term standards and
+habits.
+
+\stopsubject
+
+% \setdefaultmathcodes
+% $\blackrule\mathatomskip \mathdigitcode \mathdigitcode\textstyle\blackrule$
+
+\stopchapter
+
+\stopcomponent
+
+% \showframe
+%
+% \showmakeup[penalty]
+%
+% \startbuffer
+% \dorecurse {50} {
+% test $\darkblue a + #1 + b > 2$
+% test $\darkred a + b + #1 + c + d > 2$
+% test $\darkgreen a + b + c + #1 + d + e + f > 2$
+% }
+% \stopbuffer
+%
+% \setuptolerance[verytolerant,stretch]
+%
+% \setuplayout[width=11cm]
+%
+% \starttext
+% \start
+% \mathforwardpenalties 0
+% \mathbackwardpenalties 0
+% \getbuffer
+% \par
+% \stop
+% \page
+% \start
+% \mathforwardpenalties 2 -200 -100
+% \mathbackwardpenalties 2 -100 -50
+% \getbuffer
+% \par
+% \stop
+% \page
+% \start
+% \mathforwardpenalties 2 200 100
+% \mathbackwardpenalties 2 100 50
+% \getbuffer
+% \par
+% \stop
+% \page
+% \stoptext
+
+% example:
+%
+% $ \left( x + 1 \right )^1_2^^3__4 $
+% \blank
+% $ ( x + 1 )^1_2^^3__4 $
+% \blank
+% $ (^^3__4 x + 1 )^1_2 $
+
+% example:
+%
+% \registerengineclass[digits][dgs]
+%
+% \newconstant \mathdigitscode \mathdigitscode \mathclassvalue digits
+%
+% \protected\def\mathdigits{\mathatom\mathdigitscode}
+%
+% \copymathspacing \mathdigitscode \mathdigitcode
+%
+% \setmathspacing \mathdigitscode \mathdigitscode \allmathstyles 3mu
+% \setmathspacing \mathdigitscode \mathpunctuationcode \allmathstyles 1mu
+% \setmathspacing \mathpunctuationcode \mathdigitscode \allmathstyles 1mu
+%
+% \startTEXpage[offset=1dk,width=20dk]
+% \showboxes\showmakeup[math]
+% $
+% x
+% =
+% \mathdigits {123}
+% \mathdigits {456} ,
+% \mathdigits {78}
+% =
+% \mathdigits {123} .
+% \mathdigits {456} ,
+% \mathdigits {78}
+% $
+% \stopTEXpage
+
+% \starttext
+% \showmakeup[math]
+% $ x \neq x $ \quad $ x \not x $ \quad $ x \eq\not x $ \quad $ x \not\eq x $\par
+% \pushoverloadmode
+% \let\normalnot\not
+% \permanent\protected\def\not#1{#1\normalnot}
+% \popoverloadmode
+% $ x \neq x $ \quad $ x \not x $ \quad $ x \eq\not x $ \quad $ x \not\eq x $\par
+% \stoptext
+
+% $ \not \eq $\par
+% $ \eq \not $\par % gets collapsed
+
+% example: a_1=b_1+c_1 (for spacing)
+
+
+% \startbuffer
+% We test \dorecurse{20}{$x^{#1}$ and $\frac{1}{#1}^x$ and $\sqrt[#1]{x}$ and }that's it.
+% \stopbuffer
+%
+% \startpostponing
+% \startcombination[nx=2,ny=3,location=top]
+% {\ruledvbox{\hsize.45\textwidth \setupformula[snap=no] \showboxes \enabletrackers [math.snapping=darkred] \getbuffer}} {}
+% {\ruledvbox{\hsize.45\textwidth \setupformula[snap=no] \disabletrackers[math.snapping] \getbuffer}} {}
+% {\ruledvbox{\hsize.45\textwidth \setupformula[snap=yes,snapstep=small] \showboxes \darkgreen \enabletrackers [math.snapping=darkred] \getbuffer}} {}
+% {\ruledvbox{\hsize.45\textwidth \setupformula[snap=yes,snapstep=small] \darkgreen \disabletrackers[math.snapping] \getbuffer}} {}
+% {\ruledvbox{\hsize.45\textwidth \setupformula[snap=yes,snapstep=big] \showboxes \darkblue \enabletrackers [math.snapping=darkred] \getbuffer}} {}
+% {\ruledvbox{\hsize.45\textwidth \setupformula[snap=yes,snapstep=big] \darkblue \disabletrackers[math.snapping] \getbuffer}} {}
+% \stopcombination
+% \stoppostponing
+
+
+% https://yurichev.com/mirrors/knuth1989.pdf .. DEK:
+%
+% I too had trouble with numerators and denominators: change no. 229 increased the
+% amount of space surrounding the bar line in displayed fractions, and I should have
+% made a similar change to fractions in text. (Page 68 of the new Volume 2 turned out
+% to be extremely ugly because of badly spaced fractions.) T~x82 was able to improve
+% the situation because of my experiences with T~x78, but even today I must take
+% special precautions in my TEX documents to get certain square roots to look right.
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/ontarget/ontarget-metapost.tex b/Master/texmf-dist/doc/context/sources/general/manuals/ontarget/ontarget-metapost.tex
new file mode 100644
index 00000000000..521b90b63ad
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/ontarget/ontarget-metapost.tex
@@ -0,0 +1,755 @@
+% language=us runpath=texruns:manuals/ontarget
+
+% Musical timestamp: while adding this to the engine and I listened to many John
+% Medeski (Martin and Wood) concert videos, many several times ... it kept me in
+% the flow!
+%
+% This wrapup was written with Dave Matthews Band - Seek Up - LIVE, 12/2/2018 in
+% the background, as I like these live acts.
+%
+% This is just a summary from my point of view. A real article is written by
+% Mikael Sundqvist who also explains how arctime and its companions actually
+% work.
+
+\startcomponent ontarget-metapost
+
+\environment ontarget-style
+
+\startchapter[title={To the point}]
+
+In the 2022 \NTG\ \MAPS\ 53 there is a visual very attractive article about
+generative graphics with \METAPOST\ by Fabrice Larribe. These graphics actually
+use very little \METAPOST\ code that use randomized paths and points and the
+magic is in getting the parameters right. This means that one has to process them
+a lot to figure out what looks best. Here is an example of such a graphic
+definition. I will show more variants so a rendering happens later on.
+
+\startbuffer
+\startMPdefinitions
+ vardef agitate_a(expr thepath, S, n, fn, t, ft) =
+ save R, nbpoints, noiselevel, rlength ;
+ path R ; nbpoints := n ; noiselevel := t ;
+ R := thepath ;
+ for s=1 upto S :
+ nbpoints := nbpoints * fn ;
+ noiselevel := noiselevel * ft ;
+ R := for i=1 upto nbpoints:
+ point (i/nbpoints) along R
+ randomized noiselevel
+ ..
+ endfor cycle ;
+ endfor ;
+ R
+ enddef ;
+\stopMPdefinitions
+\stopbuffer
+
+\typebuffer[option=tex] \getbuffer
+
+I will not explain the working of this because there is the article. Instead, I
+will focus on something that came up when the \MAPS\ was prepared: performance.
+Not only are these graphics large (which is no real problem) but they also take a
+while to render (which is something that does matter when one wants to find the
+best a parameters). For the first few variants we keep the same names of
+variables as in the article.
+
+\startbuffer[final:definition]
+\startMPdefinitions
+ vardef agitator(expr pth, iterations, points, pointfactor, noise, noisefactor) =
+ save currentpath, currentpoints, currentnoise ; path currentpath ;
+ currentpath := pth ;
+ currentpoints := points ;
+ currentnoise := noise ;
+ for step = 1 upto iterations :
+ currentpath := arcpointlist currentpoints of currentpath ;
+ if currentnoise <> 0 :
+ currentpath :=
+ for i within currentpath :
+ pathpoint
+ randomized currentnoise
+ ..
+ endfor
+ cycle ;
+ fi
+ currentnoise := currentnoise * noisefactor ;
+ currentpoints := currentpoints * pointfactor ;
+ endfor ;
+ currentpath
+ enddef ;
+\stopMPdefinitions
+\stopbuffer
+
+\startbuffer[final:graphic]
+\startMPcode
+ path pth ;
+ nofcircles := 15 ; iterations := 10 ;
+ points := 10 ; pointfactor := 1.3 ;
+ noise := 5 ; noisefactor := 0.8 ;
+
+ nofcircles := 5 ; iterations := 10 ;
+ points := 5 ; pointfactor := 1.3 ;
+
+% for c = nofcircles downto 1 :
+% pth := fullcircle scaled (c * 6.5) scaled 3 ;
+% points := floor(arclength(pth) * 0.5) ;
+% pth := agitator(pth, iterations, points, pointfactor, noise, noisefactor) ;
+% eofill pth
+% withcolor darkred
+% withtransparency(1,4/nofcircles) ;
+% draw pth
+% withpen pencircle scaled 0.1
+% withtransparency(1,4/nofcircles) ;
+% endfor ;
+
+% currentpicture := currentpicture xsized TextWidth ;
+
+ for c = nofcircles downto 1 :
+ pth := fullcircle scaled (c * 6.5) scaled 3 ;
+ points := floor(arclength(pth) * 0.5) ;
+ pth := agitator(pth, iterations, points, pointfactor, noise, noisefactor) ;
+ draw pth
+ withpen pencircle scaled 1
+ withcolor (c/nofcircles)[darkgreen,darkred] ;
+ endfor ;
+
+ currentpicture := currentpicture xsized .5TextWidth ;
+\stopMPcode
+\stopbuffer
+
+\startplacefigure
+ [title={Fabrice's agitated circles, with reduced properties to keep this file small (see source).},
+ reference=fig:agitated]
+ \getbuffer[final:definition,final:graphic]
+\stopplacefigure
+
+In \in {figure} [fig:agitated] we show the (kind of) graphic that we are dealing
+with. Such an agitator is used in a loop so that we agitate multiple circles,
+where we go from large to small with for instance 4868, 4539, 4221, 3892, 3564,
+3245, 2917, 2599, 2270, 1941, 1623, 1294, 966, 647 and 319 points. The article
+uses a definition like below for the graphic where you can see the agitator being
+applied to each of the circles.
+
+\starttyping[option=mp,color=]
+path P ; numeric NbCircles, S, nzero, fn, tzero, ft ;
+
+randomseed := 10 ;
+defaultscale := .05 ;
+
+NbCircles := 15 ; S := 10 ; nzero := 10 ; fn := 1.3 ; tzero := 5 ; ft := 0.8 ;
+
+for c = NbCircles downto 1 :
+ P := fullcircle scaled (c*6.5) scaled 3 ;
+ P := agitate_a(P, S, nzero, fn, tzero, ft) ;
+ eofill P
+ withcolor transparent(1,4/NbCircles,col) ;
+ draw P
+ withpen pencircle scaled 0.1
+ transparent(1,4/NbCircles,.90[black,col]) ;
+endfor ;
+\stoptyping
+
+The first we noticed is that the graphics processes faster when double mode is
+used: we gain 40--50\percent\ and the reason for this is that modern processors
+are very good at handling doubles while \METAPOST\ in scaled mode has to do a lot
+of juggling with pseudo fractions. In the timings shown later we leave that
+improvement out. Also, because of this observation \CONTEXT\ \LMTX\ now defaults
+its \METAPOST\ instances to method double.
+
+When I stared at the agitator code I noticed that the \type {along} macro was
+used. That macro returns a point at given percentage along a path. In order to do
+that the macro calculates the length of the path and then locates that point. The
+primitive operations involved are \type {arclength}, \type {arctime of} and \type
+{point of} and each these takes some time to complete. A first improvement is to
+inline the \type {along} and hoist the length calculation outside the loop.
+
+\startbuffer
+\startMPdefinitions
+ vardef agitate_b(expr thepath, S, n, fn, t, ft) =
+ save R, nbpoints, noiselevel, rlength ;
+ path R ; nbpoints := n ; noiselevel := t ;
+ R := thepath ;
+ for s=1 upto S :
+ nbpoints := nbpoints * fn ;
+ noiselevel := noiselevel * ft ;
+ rlength := (arclength R) / nbpoints;
+ R := for i=1 upto nbpoints:
+ (point (arctime (i * rlength) of R) of R)
+ randomized noiselevel
+ ..
+ endfor cycle ;
+ endfor ;
+ R
+ enddef ;
+\stopMPdefinitions
+\stopbuffer
+
+\typebuffer[option=tex] \getbuffer
+
+There is not that much that we can improve here but because Mikael Sundqvist and
+I had just extended \METAPOST\ with some intersection improvements, it made sense
+to see what we could do in the engine. In the next variant the \type {arcpoint}
+combines \type {arctime of} and \type {point of}. The reason this is much
+faster is that we are already on the right spot when we got the time, and we save
+a sequential \type {point of} lookup, something that takes more time when paths
+are longer.
+
+\startbuffer
+\startMPdefinitions
+ vardef agitate_c(expr thepath, S, n, fn, t, ft) =
+ save R, nbpoints, noiselevel, rlength ;
+ path R ; nbpoints := n ; noiselevel := t ;
+ R := thepath ;
+ for s=1 upto S :
+ nbpoints := nbpoints * fn ;
+ noiselevel := noiselevel * ft ;
+ rlength := (arclength R) / nbpoints;
+ R := for i=1 upto nbpoints:
+ (arcpoint (i * rlength) of R)
+ randomized noiselevel
+ ..
+ endfor cycle ;
+ endfor ;
+ R
+ enddef ;
+\stopMPdefinitions
+\stopbuffer
+
+\typebuffer[option=tex] \getbuffer
+
+At that stage we wondered if we could come up with a primitive like \typ
+{intersectiontimelist} for these points; here a list refers to a path in which we
+collect the points. Now, as with the intersection primitives, \METAPOST\ loops
+over the segments of a path and works within such a segment. That is why the
+following variant has an explicit start at point zero: we can now use offsets
+(discrete points).
+
+\startbuffer
+\startMPdefinitions
+ vardef agitate_d(expr thepath, S, n, fn, t, ft) =
+ save R, nbpoints, noiselevel, rlength ;
+ path R ; nbpoints := n ; noiselevel := t ;
+ R := thepath ;
+ for s=1 upto S :
+ nbpoints := nbpoints * fn ;
+ noiselevel := noiselevel * ft ;
+ rlength := (arclength R) / nbpoints;
+ R := for i=1 upto nbpoints:
+ (arcpoint (0, i * rlength) of R)
+ randomized noiselevel
+ ..
+ endfor cycle ;
+ endfor ;
+ R
+ enddef ;
+\stopMPdefinitions
+\stopbuffer
+
+\typebuffer[option=tex] \getbuffer
+
+During an evening zooming Mikael and I figured out, by closely looking at the
+source, how the arc functions work and how we could indeed come up with a list
+primitive. The main issue was to use the right information. Mikael sat down to
+make a pure \METAPOST\ variant and I hacked the engine. Mikael came up with a
+first variant similar to the following, where we use a new primitive \typ
+{subarclength}.
+
+\startbuffer
+\startMPdefinitions
+ vardef arcpoints_a(expr thepath, cnt) =
+ save len, seg, tot, tim, stp, acc ;
+ numeric len ; len := length thepath ;
+ numeric seg ; seg := 0 ;
+ numeric tot ; tot := 0 ;
+ numeric tim ; tim := 0 ;
+ %
+ numeric acc[] ; acc[0] := 0 ;
+ for i = 1 upto len:
+ acc[i] := acc[i-1] + subarclength (i-1,i) of thepath ;
+ endfor;
+ %
+ numeric stp ; stp := acc[len] / cnt;
+ %
+ point 0 of thepath
+ for tot = stp step stp until acc[len] :
+ hide(
+ forever :
+ exitif ((tim < tot) and (tot < acc[seg+1])) ;
+ seg := seg + 1 ;
+ tim := acc[seg] ;
+ endfor ;
+ )
+ -- (arcpoint (seg,tot-tim) of thepath)
+ endfor if cycle thepath : -- cycle fi
+ enddef ;
+\stopMPdefinitions
+\stopbuffer
+
+\typebuffer[option=tex] \getbuffer
+
+Getting points of a path is somewhat complicated by the fact that the length of a
+closed path is different from that of an open path even if they have the same
+number of so-called knots. Internally a path is always a closed loop. That way,
+when \METAPOST\ runs over a path, it can easily access the first point when it's
+at the end, something that is handy when that point has to be taken into account.
+Therefore, the end condition of a loop over a path is the arrival at the
+beginning. In the next graphic we show a bit how these first (zero) and last
+points are located. One reason why the previous macros start at point one and not
+at zero is that \type {arclength} can overflow due to the randomly growing path
+otherwise.
+
+\startlinecorrection
+\startMPcode
+ path p ; p := ((0,0) -- (1,0) -- (1,1) -- (0,1)) xyscaled (20EmWidth,5LineHeight) ;
+ path q ; q := p -- cycle ;
+
+ draw p withpen pencircle scaled 4mm withcolor .2white ;
+ draw q withpen pencircle scaled 2mm withcolor .6white ;
+
+ draw point length(p) of p withpen pencircle scaled 6mm withcolor green;
+ draw point length(q) of q withpen pencircle scaled 6mm withcolor blue ;
+
+ draw point 0 of p withpen pencircle scaled 4mm withcolor red ;
+ draw point 0 of q withpen pencircle scaled 2mm withcolor yellow ;
+
+ draw textext.lft("\strut\tttf point length of p") shifted (point length(p) of p) shifted (-6mm,0) ;
+ draw textext.lft("\strut\tttf point length of q") shifted (point length(q) of q) shifted (-6mm,LineHeight) ;
+ draw textext.lft("\strut\tttf point 0 of p") shifted (point 0 of p) shifted (-6mm,0) ;
+ draw textext.lft("\strut\tttf point 0 of q") shifted (point 0 of q) shifted (-6mm,-LineHeight) ;
+
+ draw textext("\strut\tttf p is open (dark)") shifted (center p) shifted (0, LineHeight/2) ;
+ draw textext("\strut\tttf q is closed (light)") shifted (center q) shifted (0,-LineHeight/2) ;
+\stopMPcode
+\stoplinecorrection
+
+The difference between starting at zero or one for a cycle is show below, we get
+more and more points!
+
+\startlinecorrection
+\startMPcode
+ path p ; p := fullsquare ; path q ;
+
+ for i=1 upto 100 :
+ q := for j=1 upto length(p) : (point j of p) -- endfor cycle ;
+ p := q ;
+ endfor ;
+
+ draw p scaled 2cm withpen pencircle scaled 1mm withcolor "darkred" ;
+ drawpointlabels p scaled 2cm ;
+
+ path p ; p := fullsquare shifted (3/2,0) ; path q ;
+
+ for i=1 upto 100 :
+ q := for j=0 upto length(p) : (point j of p) -- endfor cycle ;
+ p := q ;
+ endfor ;
+
+ draw p scaled 2cm withpen pencircle scaled 1mm withcolor "darkred" ;
+ drawpointlabels p scaled 2cm ;
+\stopMPcode
+\stoplinecorrection
+
+% point of
+%
+% if (mp_left_type(p) == mp_endpoint_knot) {
+% set_number_to_unity(n);
+% number_negate(n);
+% } else {
+% set_number_to_zero(n);
+% }
+% do {
+% p = mp_next_knot(p);
+% number_add(n, unity_t);
+% } while (p != cur_exp_knot);
+
+% length:
+%
+% mp_knot p = cur_exp_knot;
+% int l = mp_left_type(p) == mp_endpoint_knot ? -1 : 0;
+% do {
+% p = mp_next_knot(p);
+% ++l;
+% } while (p != cur_exp_knot);
+% set_number_from_int(*n, l);
+
+In the next variants we will not loop over points but step to the \type
+{arclength}. Watch the new \type {subarclength} primitive that starts at an
+offset. This is much faster than taking a \type {subpath of}. We can move the
+accumulator loop into the main loop:
+
+\startbuffer
+\startMPdefinitions
+ vardef arcpoints_b(expr thepath, cnt) =
+ save len, aln, seg, tot, tim, stp, acc ;
+ numeric len ; len := length thepath ;
+ numeric aln ; aln := arclength thepath ;
+ numeric seg ; seg := 0 ;
+ numeric tot ; tot := 0 ;
+ numeric tim ; tim := 0 ;
+ numeric stp ; stp := aln / cnt;
+ numeric acc ; acc := subarclength (0,1) of thepath ;
+ %
+ point 0 of thepath
+ for tot = stp step stp until aln :
+ hide(
+ forever :
+ exitif tot < acc ;
+ seg := seg + 1 ;
+ tim := acc ;
+ acc := acc + subarclength (seg,seg+1) of thepath ;
+ endfor ;
+ )
+ -- (arcpoint (seg,tot-tim) of thepath)
+ endfor if cycle thepath : -- cycle fi
+ enddef ;
+\stopMPdefinitions
+\stopbuffer
+
+\typebuffer[option=tex] \getbuffer
+
+If you don't like the \type {hide} the next variant also works okay:
+
+\startbuffer
+\startMPdefinitions
+ vardef mfun_arc_point(text tot)(text thepath) =
+ forever :
+ exitif tot < acc ;
+ seg := seg + 1 ;
+ tim := acc ;
+ acc := acc + subarclength (seg,seg+1) of thepath ;
+ endfor ;
+ (arcpoint (seg,tot-tim) of thepath)
+ enddef ;
+
+ vardef arcpoints_c(expr thepath, cnt) =
+ save len, aln, seg, tot, tim, stp, acc ;
+ numeric len ; len := length thepath ;
+ numeric aln ; aln := arclength thepath ;
+ numeric seg ; seg := 0 ;
+ numeric tot ; tot := 0 ;
+ numeric tim ; tim := 0 ;
+ numeric stp ; stp := aln / cnt;
+ numeric acc ; acc := subarclength (0,1) of thepath ;
+ %
+ point 0 of thepath
+ for tot = stp step stp until aln :
+ -- mfun_arc_point(tot)(thepath)
+ endfor if cycle thepath : -- cycle fi
+ enddef ;
+\stopMPdefinitions
+\stopbuffer
+
+\typebuffer[option=tex] \getbuffer
+
+This got applied in three test agitators
+
+\startbuffer
+\startMPdefinitions
+ vardef agitate_e_a(expr thepath, S, n, fn, t, ft) =
+ save R, nbpoints, noiselevel ;
+ path R ; nbpoints := n ; noiselevel := t ;
+ R := thepath ;
+ for s=1 upto S :
+ nbpoints := nbpoints * fn ;
+ noiselevel := noiselevel * ft ;
+ R := arcpoints_a(R, nbpoints) ; % original Mikael
+ R := for i=0 upto length R:
+ (point i of R)
+ randomized noiselevel
+ ..
+ endfor cycle ;
+ endfor ;
+ R
+ enddef ;
+
+ vardef agitate_e_b(expr thepath, S, n, fn, t, ft) =
+ save R, nbpoints, noiselevel ;
+ path R ; nbpoints := n ; noiselevel := t ;
+ R := thepath ;
+ for s=1 upto S :
+ nbpoints := nbpoints * fn ;
+ noiselevel := noiselevel * ft ;
+ R := arcpoints_b(R, nbpoints) ; % merged Mikael
+ R := for i=0 upto length R:
+ (point i of R)
+ randomized noiselevel
+ ..
+ endfor cycle ;
+ endfor ;
+ R
+ enddef ;
+
+ vardef agitate_e_c(expr thepath, S, n, fn, t, ft) =
+ save R, nbpoints, noiselevel ;
+ path R ; nbpoints := n ; noiselevel := t ;
+ R := thepath ;
+ for s=1 upto S :
+ nbpoints := nbpoints * fn ;
+ noiselevel := noiselevel * ft ;
+ R := arcpoints_c(R, nbpoints) ; % split Mikael
+ R := for i=0 upto length R:
+ (point i of R)
+ randomized noiselevel
+ ..
+ endfor cycle ;
+ endfor ;
+ R
+ enddef ;
+\stopMPdefinitions
+\stopbuffer
+
+\typebuffer[option=tex] \getbuffer
+
+The new engine primitive shortens these agitators:
+
+\startbuffer
+\startMPdefinitions
+ vardef agitate_e_d(expr thepath, S, n, fn, t, ft) =
+ save R, nbpoints, noiselevel ;
+ path R ; nbpoints := n ; noiselevel := t ;
+ R := thepath ;
+ for s=1 upto S :
+ nbpoints := nbpoints * fn ;
+ noiselevel := noiselevel * ft ;
+ R := arcpointlist nbpoints of R;
+ R := for i=0 upto length R:
+ (point i of R)
+ randomized noiselevel
+ ..
+ endfor cycle ;
+ endfor ;
+ R
+ enddef ;
+\stopMPdefinitions
+\stopbuffer
+
+\typebuffer[option=tex] \getbuffer
+
+So are we done? Did we get rid of all bottlenecks? The answer is no! We still
+loop over the list in order to randomize the points. For each point we start at
+the beginning of the list. Let's first rewrite the agitator a little:
+
+\startbuffer
+\startMPdefinitions
+ vardef agitate_f_a(expr pth, iterations, points, pointfactor, noise, noisefactor) =
+ save currentpath, currentpoints, currentnoise ; path currentpath ;
+ currentpath := pth ;
+ currentpoints := points ;
+ currentnoise := noise ;
+ for step = 1 upto iterations :
+ currentpath := arcpointlist currentpoints of currentpath ;
+ currentnoise := currentnoise * noisefactor ;
+ currentpoints := currentpoints * pointfactor ;
+ if currentnoise <> 0 :
+ currentpath :=
+ for i = 0 upto length currentpath:
+ (point i of currentpath) randomized currentnoise ..
+ endfor
+ cycle ;
+ fi
+ endfor ;
+ currentpath
+ enddef ;
+\stopMPdefinitions
+\stopbuffer
+
+\typebuffer[option=tex] \getbuffer
+
+One of the \LUAMETAFUN\ extensions is a fast path iterator. In the next variant
+the \type {inpath} macro sets up an iterator (regular loop) with the length as
+final value. In the process the given path gets passed to \LUA\ where we can
+access it as array. The \type {pointof} macro (again a \LUA\ call) injects a
+pair. You will be surprised that even with passing the path to \LUA\ and calling
+out to \LUA\ to inject the pair this is way faster than the built|-|in \type
+{point of}.
+
+\startbuffer
+\startMPdefinitions
+ vardef agitate_f_b(expr pth, iterations, points, pointfactor, noise, noisefactor) =
+ save currentpath, currentpoints, currentnoise ; path currentpath ;
+ currentpath := pth ;
+ currentpoints := points ;
+ currentnoise := noise ;
+ for step = 1 upto iterations :
+ currentnoise := currentnoise * noisefactor ;
+ currentpoints := currentpoints * pointfactor ;
+ currentpath := arcpointlist currentpoints of currentpath ;
+ if currentnoise <> 0 :
+ currentpath :=
+ for i inpath currentpath :
+ (pointof i) randomized currentnoise ..
+ endfor
+ cycle ;
+ fi
+ endfor ;
+ currentpath
+ enddef ;
+\stopMPdefinitions
+\stopbuffer
+
+\typebuffer[option=tex] \getbuffer
+
+It was tempting to see if a more native solution pays of. One problem there is
+that a path is not really suitable for that as we currently don't have a data
+type that represents a point. Okay, actually we sort of have because we can use
+the transform record that has six points but that is something I will look into
+later (it just got added to the todo list).
+
+The \typ {i within pth} iterator is no conceptual beauty but does the job. Just
+keep in mind that it is just means for this kind of applications: run over a path
+point by point. The \type {i} has the current point number. Because we run over a
+path following the links we only run forward.
+
+\startbuffer
+\startMPdefinitions
+ vardef agitate_f_c(expr pth, iterations, points, pointfactor, noise, noisefactor) =
+ save currentpath, currentpoints, currentnoise ; path currentpath ;
+ currentpath := pth ;
+ currentpoints := points ;
+ currentnoise := noise ;
+ for step = 1 upto iterations :
+ currentnoise := currentnoise * noisefactor ;
+ currentpoints := currentpoints * pointfactor ;
+ currentpath := arcpointlist currentpoints of currentpath ;
+ if currentnoise <> 0 :
+ currentpath :=
+ for i within currentpath :
+ pathpoint
+ randomized currentnoise
+ ..
+ endfor
+ cycle ;
+ fi
+ endfor ;
+ currentpath
+ enddef ;
+\stopMPdefinitions
+\stopbuffer
+
+\typebuffer[option=tex] \getbuffer
+
+Any primitive solution more complex than this, like first creating a fast access
+data structure, of having a double linked list, or using some iterator larger
+than a simple numeric is very likely to have no gain over the super fast \LUA\
+variant.
+
+\startMPdefinitions
+ vardef agitate_x(expr thepath, S, n, fn, t, ft) =
+ save R, nbpoints ;
+ path R ; nbpoints := n ;
+ R := thepath ;
+ for s=1 upto S :
+ nbpoints := nbpoints * fn ;
+ R := arcpointlist nbpoints of R ;
+ endfor ;
+ R
+ enddef ;
+\stopMPdefinitions
+
+\startMPdefinitions
+ def TestMe (expr method, col, justtest) =
+ path P ;
+
+ randomseed := 10;
+ % maxknotpool := 20000; % default is 1000
+ defaultscale := .05;
+
+ % NbCircles := 1 ; S := 1 ; nzero := 10 ; fn := 1.3 ; tzero := 5 ; ft := 0.8 ;
+ % NbCircles := 2 ; S := 10 ; nzero := 10 ; fn := 1.3 ; tzero := 5 ; ft := 0.8 ;
+ % NbCircles := 10 ; S := 5 ; nzero := 10 ; fn := 1.3 ; tzero := 5 ; ft := 0.8 ;
+ % NbCircles := 10 ; S := 10 ; nzero := 20 ; fn := 1.3 ; tzero := 5 ; ft := 0.8 ;
+ NbCircles := 15 ; S := 10 ; nzero := 10 ; fn := 1.3 ; tzero := 5 ; ft := 0.8 ;
+
+ for c = NbCircles downto 1 :
+ P := fullcircle scaled (c*6.5) scaled 3 ;
+ nzero := floor(arclength(P)*0.5);
+ if method == 0 : P := agitate_x (P, S, nzero, fn, tzero, ft) ;
+ elseif method == 1 : P := agitate_a (P, S, nzero, fn, tzero, ft) ;
+ elseif method == 2 : P := agitate_b (P, S, nzero, fn, tzero, ft) ;
+ elseif method == 3 : P := agitate_c (P, S, nzero, fn, tzero, ft) ;
+ elseif method == 4 : P := agitate_d (P, S, nzero, fn, tzero, ft) ;
+ elseif method == 51 : P := agitate_e_a(P, S, nzero, fn, tzero, ft) ;
+ elseif method == 52 : P := agitate_e_b(P, S, nzero, fn, tzero, ft) ;
+ elseif method == 53 : P := agitate_e_c(P, S, nzero, fn, tzero, ft) ;
+ elseif method == 54 : P := agitate_e_d(P, S, nzero, fn, tzero, ft) ;
+ elseif method == 61 : P := agitate_f_a(P, S, nzero, fn, tzero, ft) ;
+ elseif method == 62 : P := agitate_f_b(P, S, nzero, fn, tzero, ft) ;
+ elseif method == 63 : P := agitate_f_c(P, S, nzero, fn, tzero, ft) ;
+ else :
+ fi ;
+ if justtest :
+ % do nothing
+ elseif method == 0 :
+ draw textext("no draw") ;
+ else :
+ eofill P withcolor transparent(1,4/NbCircles,col) ;
+ draw P withpen pencircle scaled 0.1 transparent(1,4/NbCircles,.90[black,col]) ;
+ % drawpoints P withpen pencircle scaled 0.2 withcolor white ;
+ % drawpointlabels P withcolor white;
+ fi ;
+ endfor ;
+ enddef ;
+\stopMPdefinitions
+
+We show the average runtime for three runs. Here we don't render the paths, which
+takes about one second, including conversion to \PDF. Of course measurements like
+this can change a bit over time. To these times you need to add about a second
+for the draw and fill operations as well as conversion to a \PDF\ stream with
+transparencies. The improvement in runtime makes it possible to use agitators like
+this at runtime especially because normally one will not use such (combinations
+of) large paths.
+
+\starttabulate[|T|r|i2T|r|i2T|r|]
+ \BC agitate_a \NC 776.26 \BC agitate_e_a \NC 291.99 \BC agitate_f_a \NC 10.82 \NC \NR % 1 51 61
+ \BC agitate_b \NC 276.43 \BC agitate_e_b \NC 76.06 \BC agitate_f_b \NC 2.55 \NC \NR % 2 52 62
+ \BC agitate_c \NC 259.89 \BC agitate_e_c \NC 77.27 \BC agitate_f_c \NC 2.17 \NC \NR % 3 53 63
+ \BC agitate_d \NC 260.41 \BC agitate_e_d \NC 18.67 \BC \NC \NC \NR % 4 54
+\stoptabulate
+
+The final version of the agitator is slightly different because it depends if we
+start at zero or one but gives similar results and adapt the noise before or
+after the loop.
+
+\typebuffer[final:definition][option=tex]
+
+We use a similar example as in the mentioned article but coded a bit differently:
+
+\typebuffer[final:graphic][option=tex]
+
+For Mikael and me, who both like \METAPOST, it was a nice distraction from
+working months on extending math in \LUAMETATEX, but it also opens up the
+possibilities to do more with rendering (math) functions and graphics, so in the
+end we get paid back anyway.
+
+\stopchapter
+
+\stopcomponent
+
+% see agitate-002.tex
+
+% \startluacode
+% local t = {
+% 0, -- also initialization
+% 1, 2, 3, 4,
+% 51, 52, 53, 54,
+% 61, 62, 63,
+% }
+% for i=1,#t do
+% context.writestatus("TEST RUN",t[i])
+% context("\\testfeatureonce{3}{\\startMPcalculation TestMe (%i, blue, true) ; \\stopMPcalculation}",t[i])
+% end
+% \stopluacode
+
+% \testfeatureonce{1}{\startMPpage TestMe ( 0, \MPcolor{darkblue} , false) ; \stopMPpage}
+% \testfeatureonce{1}{\startMPpage TestMe ( 1, \MPcolor{darkblue} , false) ; \stopMPpage}
+% \testfeatureonce{1}{\startMPpage TestMe ( 2, \MPcolor{darkblue} , false) ; \stopMPpage}
+% \testfeatureonce{1}{\startMPpage TestMe ( 3, \MPcolor{darkred} , false) ; \stopMPpage}
+% \testfeatureonce{1}{\startMPpage TestMe ( 4, \MPcolor{darkgreen} , false) ; \stopMPpage}
+% \testfeatureonce{1}{\startMPpage TestMe (51, \MPcolor{darkred} , false) ; \stopMPpage}
+% \testfeatureonce{1}{\startMPpage TestMe (52, \MPcolor{darkgreen} , false) ; \stopMPpage}
+% \testfeatureonce{1}{\startMPpage TestMe (53, \MPcolor{darkblue} , false) ; \stopMPpage}
+% \testfeatureonce{1}{\startMPpage TestMe (54, \MPcolor{darkblue} , false) ; \stopMPpage}
+% \testfeatureonce{1}{\startMPpage TestMe (61, \MPcolor{darkyellow}, false) ; \stopMPpage}
+% \testfeatureonce{1}{\startMPpage TestMe (62, \MPcolor{darkyellow}, false) ; \stopMPpage}
+% \testfeatureonce{1}{\startMPpage TestMe (63, \MPcolor{darkyellow}, false) ; \stopMPpage}
+
+% \stoptext
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/ontarget/ontarget-registers.tex b/Master/texmf-dist/doc/context/sources/general/manuals/ontarget/ontarget-registers.tex
new file mode 100644
index 00000000000..e5e03fbda29
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/ontarget/ontarget-registers.tex
@@ -0,0 +1,164 @@
+% language=us runpath=texruns:manuals/ontarget
+
+\startcomponent ontarget-registers
+
+\environment ontarget-style
+
+\startchapter[title={Gaining performance}]
+
+In the meantime (2022) the \LUAMETATEX\ engine has touched many aspects of the
+original \TEX\ implementation. This has resulted in less memory consumption than
+for instance \LUATEX\ when we talk tokens, more efficient macro handing,
+additional storage options and numerous new features and optimizations. Of course
+one can disagree about all of this, but what matters to us is that it facilitates
+\CONTEXT\ well. That macro package went from \MKII\ to \MKIV\ to \MKXL\ (aka
+\LMTX).
+
+Although over the years the macros evolved the basic ideas haven't changed: it is
+a keyword driven macro package that is set up in a way that makes it possible to
+move forward. In spite of what one might think, the fundamentals didn't change
+much. It looks like we made the right decisions at the start, which means that we
+can change low level implementations to match the engine without users noticing
+much. Of course in the area of fonts, input encoding and languages things have
+changed simply because the environment in which we operate changes.
+
+A fundamental difference between \PDFTEX\ and \LUAMETATEX\ is that the later is
+in many aspects 32 and even 64 bit all over the place. That comes with a huge
+performance hit but also with possibilities (that I won't discuss here now)! On a
+simple document nothing can beat \PDFTEX, even with the optimizations that we can
+apply when using the modern engines. However, on more complex documents reality
+is that \LUAMETATEX\ can outperform \PDFTEX, and documents (read: user demands)
+have become more complex indeed.
+
+So, how does that work in practice? One can add some features to an engine but
+then the macro package has to be adapted. Due to the way \CONTEXT\ is organized
+it was not that hard to keep it in sync with new features, although not all are
+applied yet to full extend. Some new features improved performance, others made
+the machinery (or its usage) a bit slower. The first versions of \LUAMETATEX\
+were some 25\percent\ slower than \LUATEX, simply because the backend is written
+in \LUA. But, end 2022 we can safely say that \LUAMETATEX\ can be 50\percent\
+faster than its ancestor. This is due to a mix of the already mentioned
+optimizations and new features, for instance a more powerful macro parser. The
+backend has become more complex too, but also benefits from a few more helpers.
+
+Because we spend a lot of time in \LUA\ the interfaces to \TEX\ have been
+extended and improved too. Of course we depend on the \LUA\ interpreter being
+kept in optimum state by its authors. It must be said that quite some of the
+interfaces might look obscure but these are not really meant for the average user
+anyway. Also, as soon as one messes with tokens and nodes at that level one
+definitely need to know what one's doing!
+
+The more stable the engine becomes, the less there is to improve. Occasionally it
+was possible to squeeze our a few more milliseconds on run but it depends a lot
+of what one does. And \TEX\ is already quite fast anyway. Of course 0.005 seconds
+on a 5 second run is not much but hundred times such an improvement is
+noticeable, especially when there are multiple runs or when one processes a batch
+of 10.000 documents (each needing two runs).
+
+One interesting aspect of \TEX\ that it can surprise you every now and then. End
+2022 I decided to play a bit more with a feature that has been around for a
+while:
+
+\starttyping
+\integerdef \fooA 123
+\dimensiondef\fooB 123pt
+\stoptyping
+
+These primitives create a counter and a dimen where the value is stored in the hash
+table. The original reason was that I didn't want to spoil registers. But although
+these are basically constants there is more to it now.
+
+\starttyping
+\countdef\fooC 27
+\dimendef\fooD 56
+\stoptyping
+
+These primitives create a command that stores the register number (here 27 and
+56) with the name. In this case a \quote {variable} is accessed in two steps: the
+\type {\fooC} macro expands to an register accessor with value 27. Next that
+accessor will kick in and fetch (or set) the value in slot 27 of the memory range
+bound to (in total 65K) counters. All these registers sit a the lower end of
+\TEX's memory which is definitely not next to the meaning of \type {\fooC}. So we
+have two memory accesses to get to the number. Contrary to that once we are at
+\type {\fooA} we are also at the value. Although memory access can be fast when
+the relevant slots are cached in practice it can give delays, especially in a
+program like \TEX\ where most data is spread all over the place. And imagine other
+processes competing for access too.
+
+It is for that reason that I decided to replace the more or less \quote
+{constant} property of \type {\fooA} by one that also supports assignments As
+well as the arithmic commands like \type {\advance}. This was not that hard due
+to the way the \LUAMETATEX\ source is organized. After that using these pseudo
+constants proved to be more efficient than registers, but of course I then had to
+adapt the source. Interestingly that should have been easy because one only needs
+to change the definitions of for instance \type {\newcount} but in practice that
+doesn't work because it will|/|can break for instance generic packages like Tikz.
+
+So, in the end a new allocator was added and just over 1000 lines in some 120
+files (with some overlap) had to be adapted to this. In addition some precautions
+had to be made for access from \LUA\ because the quantities were no longer
+registers. But it was rewarding in the sense that the test suite now ran some
+5\percent\ faster and processing the \LUAMETATEX\ manual went from 8.7 seconds on
+my laptop down to around 8.5, which is not bad.
+
+Now why do we bother so much about performance? If I really want a faster run
+using a decent desktop is of more help. But even then there can be reasons. When
+Mikael and I were discussing math engine developments at some point we noticed
+that a run took twice as much time as a result of (supposedly idle) background
+tasks. Now keep in mind that \TEX\ uses a single core so with plenty cores it
+should not be that bad. However, when the video chat program takes half of the
+CPU power, or when a mathematical manipulation program idles in the background
+taking 80 percent of a modern machine, or when a popular editor keeps all kind of
+plug ins busy for no reason, or when a supposedly closed a browser consumes
+gigabytes of memory and keeps dozens of supposedly idle threads busy, it becomes
+clear that we should not let \TEX\ put a large burden on memory access (and
+cache).
+
+It can get even worse when one runs on virtual machines where the host suggests
+that you get 16 cores so that you can run a dozen \TEX\ jobs in parallel but
+simple measurements show that these shared cores report a much higher ideal
+performance than the one you measure. So, the less demanding a \CONTEXT\ run
+becomes, the better: we're not so much after the .2 seconds on a 8 second run,
+but more after 3 seconds for that same run when using shared resources where it
+became 15 seconds. And this is what observations with respect to the performance
+of the test suite seem to indicate.
+
+In the end it's mostly about comfort: when you process a document of 300 pages,
+10 seconds is quite okay for a few changes, because one can relate time to
+output, but 20 seconds \unknown\ And when processing a a few page document the
+waiting time of a second is often less than what one needs to move the mouse
+around to the viewer. Also, when a user starts \TEX\ on the console and
+afterwards opens a browser from there that second is even less noticeable.
+
+Now let's go back to improvements. A related addition was \type {\advanceby} that
+doesn't check for the \type {by} keyword. When there is no such keyword we can
+avoid pushing back the non|-|matching next token which is also noticeable. Here
+about 680 changes were needed. Changes like these only make a difference in
+performance for some very demanding mechanisms in \CONTEXT. Again one cannot
+overload an existing primitive because generic packages can fail (as the test
+suite proved). There were also a few places where a dirty trick had to be changed
+because we cannot alias these constants.
+
+We can give similar stories about other improvements but this one sort of stands
+out because it is so noticeable. Also, other changes involve more drastic low
+level adaptations of \CONTEXT\ so these happen over a longer period of time. Of
+course all has to happen in ways that don't impact users. An example of a
+performance primitive is \typ {\advancebyplusone} which is actually implemented
+but still disabled because the gain is in hundreds of seconds range and I need to
+(again) adapt the source in order to benefit.
+
+The mentioned register variants are implemented for count (integer), dimen
+(dimension), skip (gluespec) and muskip (mugluespec). Token registers are more
+complex as they have reference counters as well as more manipulator primitives.
+The same is true for boxes (although it is tempting to come up with some faster
+access mechanism) and attributes, that also have more diverse accessors. Also,
+token lists and boxes involve way more than a simple assignment or access so any
+gain will drown in other actions. That said, it really makes sense now to drop
+the maximum of 64K registers to some more reasonable 8K (or even less for mu
+skips). That will save a couple of megabytes which sounds like little but still
+puts less burden on the system.
+
+\stopchapter
+
+\stopcomponent
+
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/ontarget/ontarget-ridofjit.tex b/Master/texmf-dist/doc/context/sources/general/manuals/ontarget/ontarget-ridofjit.tex
new file mode 100644
index 00000000000..e26e9bb7e08
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/ontarget/ontarget-ridofjit.tex
@@ -0,0 +1,111 @@
+% language=us runpath=texruns:manuals/ontarget
+
+\startcomponent ontarget-dk
+
+\environment ontarget-style
+
+\startchapter[title={Getting rid of jit}]
+
+At the \NTG\ meeting there was a short discussion about performance of the
+\OPENTYPE\ font machinery. Currently we still support \LUAJITTEX\ and although
+the \MKIV\ code base is mostly separated from the \LMTX\ one there is still some
+compromise going on, as some \LUA\ code is shared and needs to adapt to the fact
+that \LUAJIT\ is stuck to \LUA 5.2 (sort of). One reason why we still support
+\LUAJITTEX\ is that there are users who like the performance gain. However, if
+these can switch to \CONTEXT\ we could get rid of \LUAJITTEX\ support. After all,
+\LUAJIT\ is stalled as is \FFI. Of course a plain \TEX\ users can object to using
+\CONTEXT\ but one can just use the basics and be as plain as possible.
+
+Performance of \LUAMETATEX\ is quite okay and it often performs better than
+\LUATEX\ or even \LUAJITTEX. One border case is for instance the somewhat
+overdone in terms of split feature steps is the Brill font. So, I decided to do
+some tests on my 2017 laptop that had replaced the 2013 one (Windows 10). We use
+cross compiled binaries. Here is the test:
+
+\starttyping
+% \enableexperiments[fonts.compact]
+
+\definefont[Fa][brill*default @ 10pt]
+\definefont[Fb][brill*default @ 12pt]
+\definefont[Fc][brill-bf*default @ 10pt]
+\definefont[Fd][brill-bf*default @ 12pt]
+
+\start \testfeatureonce{1000}{
+ \Fa \samplefile{tufte} \samplefile{tufte}\par
+}\stop \page \edef\TimeA{\elapsedtime}
+\start \testfeatureonce{1000}{
+ \Fa \samplefile{tufte}\par\Fb\samplefile{tufte}\par
+}\stop \page \edef\TimeB{\elapsedtime}
+\start \testfeatureonce{1000}{
+ \Fa \samplefile{tufte} \Fb\samplefile{tufte}\par
+}\stop \page \edef\TimeC{\elapsedtime}
+\start \testfeatureonce{1000}{
+ \Fa \samplefile{tufte} \Fd\samplefile{tufte}\par
+ \Fb \samplefile{tufte} \Fc\samplefile{tufte}\par
+}\stop \page \edef\TimeD{\elapsedtime}
+
+\startTEXpage[offset=10pt]
+ \strut\infofont
+ 2 par 1 font : \TimeA\par
+ 2 par 2 font : \TimeB\par
+ 1 par 2 font : \TimeC\par
+ 1 par 4 font : \TimeD\par
+\stopTEXpage
+\stoptyping
+
+The next table shows the best times from three tests where each one produces 1693
+pages in the default layout. We're talking of one run as normally \CONTEXT\ will
+run till a two pass stable state is reached (unless it is forced to one run),
+although in practice fixing a few typos will not for an extra run. Keep in mind
+that in \LUAMETATEX\ we have a \LUA\ driven backend that is more flexible with
+respect to fonts but therefore also adds some extra overhead. Also keep in mind
+that four different fonts per paragraph is a rare case.
+
+\starttabulate[|lT|c|c|c|c|]
+\NC
+ \BC 2 pars 1 font
+ \BC 2 pars 2 fonts
+ \BC 1 par 2 fonts
+ \BC 1 par 4 fonts
+\NC \NR
+\ML
+\BC luametatex \NC 8.9 \NC 9.4 \NC 12.1 \NC 24.6 \NC \NR
+\BC luametatex compact \NC 8.9 \NC 9.3 \NC 9.3 \NC 23.9 \NC \NR
+\BC luatex \NC 10.0 \NC 10.3 \NC 14.5 \NC 31.2 \NC \NR
+\BC luajittex \NC 8.0 \NC 8.1 \NC 11.4 \NC 23.2 \NC \NR
+\stoptabulate
+
+One should take these measurements with a grain of salt because it also depends
+on the system load, but it shows that there is no real need to favor a
+\LUAJITTEX\ setup over a \LUAMETATEX\ one. In the meantime the default \LUATEX\
+binaries exceed 7~MB (and the hb variant adds quite a bit more) which
+\LUAMETATEX\ stays around 3~MB which is nice for high performance setups with
+thousands of (small) runs.
+
+Just for the record, when we use Dejavu Serif we get 2767 pages and the following
+timings. Again, the differences between \LUAMETATEX\ and \LUAJITTEX\ is not that
+significant, especially when you realize that we're not doing anything fancy that
+more runtime. In practice fonts are only part of the story.
+
+\starttabulate[|lT|c|c|c|c|]
+\NC
+ \BC 2 pars 1 font
+ \BC 2 pars 2 fonts
+ \BC 1 par 2 fonts
+ \BC 1 par 4 fonts
+\NC \NR
+\ML
+\BC luametatex \NC 4.2 \NC 4.4 \NC 5.0 \NC 10.8 \NC \NR
+\BC luametatex compact \NC 4.2 \NC 4.5 \NC 4.5 \NC 10.5 \NC \NR
+\BC luatex \NC 4.9 \NC 5.0 \NC 6.2 \NC 13.3 \NC \NR
+\BC luajittex \NC 4.0 \NC 4.0 \NC 5.0 \NC 10.3 \NC \NR
+\stoptabulate
+
+% I tried to run \XETEX\ on the same file but that failed for some reason (it looks
+% like it got stuck in updating the font database; some 50~MB binaries are needed
+% so I guess I messed up somewhere).
+
+\stopchapter
+
+\stopcomponent
+
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/ontarget/ontarget-style.tex b/Master/texmf-dist/doc/context/sources/general/manuals/ontarget/ontarget-style.tex
new file mode 100644
index 00000000000..eac3ffe3183
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/ontarget/ontarget-style.tex
@@ -0,0 +1,68 @@
+% language=us runpath=texruns:manuals/ontarget
+
+\startenvironment ontarget-style
+
+\usemodule[abbreviations-smallcaps]
+\usemodule[scite]
+
+\enableexperiments[fonts.compact]
+
+\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]
+ [darkred]
+
+\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/ontarget/ontarget-titlepage.tex b/Master/texmf-dist/doc/context/sources/general/manuals/ontarget/ontarget-titlepage.tex
new file mode 100644
index 00000000000..516955f7e8e
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/ontarget/ontarget-titlepage.tex
@@ -0,0 +1,73 @@
+% language=us runpath=texruns:manuals/ontarget
+
+\startcomponent ontarget-titlepage
+
+\environment ontarget-style
+
+\startMPpage[pagestate=stop]
+
+StartPage ;
+
+ picture p ; p := image (
+
+ numeric d ; d := 6.5 ;
+
+ path c ; c := fullcircle scaled 40 shifted (2,7) ;
+
+ path e ; e :=
+ (0,0) -- (3,0) --
+ (3,1) -- (1,1) --
+ (1,2) -- (3,2) --
+ (3,3) -- (1,3) --
+ (1,4) -- (3,4) --
+ (3,4) -- (3,4) --
+ (3,5) -- (0,5) -- cycle ;
+
+ path r ; r := ((0,0) -- (3,0) -- (3,5) -- (0,5)) -- reverse e -- cycle;
+
+ path q ; q := fullsquare xyscaled (3,60) shifted (3/2,0) ;
+
+ fill c withcolor "lightgray" ;
+
+ fill q withpen pencircle scaled 1/5 withcolor "white" ;
+
+ for i=-25 step 5 until 35 :
+ fill (if (i mod 10) = 0 : e else : r fi) shifted (0,i - d) withcolor "darkred" ;
+ endfor ;
+
+ draw q withpen pencircle scaled 1/5 withcolor "darkgray" ;
+
+ for i=-25 step 10 until 30 :
+ draw textext.lft("\tttf " & decimal ((i/10)+21.5)) ysized 3
+ shifted (9,19 + i-6.5 - d) withcolor "darkgray" ;
+ endfor ;
+
+ draw ((-25, 0) -- (25, 0)) shifted center c withpen pencircle scaled 2/10 withcolor "yellow" ;
+ draw (( 0,-25) -- ( 0,25)) shifted center c withpen pencircle scaled 2/10 withcolor "yellow" ;
+
+ clip currentpicture to c ;
+ draw c withpen pencircle scaled 4/10 withcolor "yellow" ;
+ ) ;
+
+ fill Page withcolor "darkred" ;
+
+ p := p shifted - center p ;
+
+ draw p scaled 6mm
+ shifted center Page
+ shifted (0mm,50mm) ;
+
+ draw image (draw textext ("\tt\bf on\thinspace target") xsized (16cm) withcolor "yellow")
+ shifted center bottomboundary Page
+ shifted (0mm,45mm) ;
+
+ draw image (draw textext ("\tttf luametatex & context lmtx") xsized (13cm) withcolor "yellow")
+ shifted center bottomboundary Page
+ shifted (0mm,20mm) ;
+
+StopPage ;
+
+\stopMPpage
+
+\stopcomponent
+
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/ontarget/ontarget.tex b/Master/texmf-dist/doc/context/sources/general/manuals/ontarget/ontarget.tex
new file mode 100644
index 00000000000..ba79a09bdbc
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/ontarget/ontarget.tex
@@ -0,0 +1,30 @@
+% language=us runpath=texruns:manuals/ontarget
+
+\environment ontarget-style
+
+\dontcomplain
+
+\startdocument
+
+ \component ontarget-titlepage
+
+ \startfrontmatter
+ \component ontarget-contents
+ \stopfrontmatter
+
+ \startbodymatter
+ \component ontarget-introduction
+ \component ontarget-eventually
+ \component ontarget-dk
+ \component ontarget-anchoring
+ \component ontarget-math
+ \component ontarget-binary
+ \component ontarget-metapost
+ \component ontarget-makesnosense
+ \component ontarget-makessense
+ \component ontarget-alsomath
+ \component ontarget-ridofjit
+ \component ontarget-gettingridof
+ \stopbodymatter
+
+\stopdocument
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/pagecolumns/pagecolumns-000.tex b/Master/texmf-dist/doc/context/sources/general/manuals/pagecolumns/pagecolumns-000.tex
index 418595aa1a5..92ce66618cb 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/pagecolumns/pagecolumns-000.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/pagecolumns/pagecolumns-000.tex
@@ -1,7 +1,3 @@
-% content=tex
-%
-% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa
-
\startenvironment pagecolumns-000
\usemodule[visual,simulate]
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/pagecolumns/pagecolumns-001.tex b/Master/texmf-dist/doc/context/sources/general/manuals/pagecolumns/pagecolumns-001.tex
index afdca49aa24..6aaeda19886 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/pagecolumns/pagecolumns-001.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/pagecolumns/pagecolumns-001.tex
@@ -1,7 +1,3 @@
-% content=tex
-%
-% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa
-
\environment pagecolumns-000
\definepagecolumns
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/pagecolumns/pagecolumns-002.tex b/Master/texmf-dist/doc/context/sources/general/manuals/pagecolumns/pagecolumns-002.tex
index d425d3b8278..23892cac175 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/pagecolumns/pagecolumns-002.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/pagecolumns/pagecolumns-002.tex
@@ -1,7 +1,3 @@
-% content=tex
-%
-% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa
-
\environment pagecolumns-000
\definepagecolumns
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/pagecolumns/pagecolumns-003.tex b/Master/texmf-dist/doc/context/sources/general/manuals/pagecolumns/pagecolumns-003.tex
index 544458b34e4..2173bd5b9f0 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/pagecolumns/pagecolumns-003.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/pagecolumns/pagecolumns-003.tex
@@ -1,7 +1,3 @@
-% content=tex
-%
-% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa
-
\environment pagecolumns-000
\definepagecolumns
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/pagecolumns/pagecolumns-004.tex b/Master/texmf-dist/doc/context/sources/general/manuals/pagecolumns/pagecolumns-004.tex
index 2144d399b89..c53fd39f754 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/pagecolumns/pagecolumns-004.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/pagecolumns/pagecolumns-004.tex
@@ -1,7 +1,3 @@
-% content=tex
-%
-% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa
-
\environment pagecolumns-000
\definepagecolumns
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/pagecolumns/pagecolumns-005.tex b/Master/texmf-dist/doc/context/sources/general/manuals/pagecolumns/pagecolumns-005.tex
index c714879fd6b..66f99f8a74b 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/pagecolumns/pagecolumns-005.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/pagecolumns/pagecolumns-005.tex
@@ -1,7 +1,3 @@
-% content=tex
-%
-% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa
-
\environment pagecolumns-000
\definepagecolumns
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/pagecolumns/pagecolumns-006.tex b/Master/texmf-dist/doc/context/sources/general/manuals/pagecolumns/pagecolumns-006.tex
index b56470bbcd7..b37a19307a0 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/pagecolumns/pagecolumns-006.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/pagecolumns/pagecolumns-006.tex
@@ -1,7 +1,3 @@
-% content=tex
-%
-% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa
-
\environment pagecolumns-000
\definepagecolumns
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/pagecolumns/pagecolumns-007.tex b/Master/texmf-dist/doc/context/sources/general/manuals/pagecolumns/pagecolumns-007.tex
index aefa62588d3..f0c2aec5ebe 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/pagecolumns/pagecolumns-007.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/pagecolumns/pagecolumns-007.tex
@@ -1,7 +1,3 @@
-% content=tex
-%
-% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa
-
\environment pagecolumns-000
\definepagecolumns[example][n=2,distance=\emwidth]
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/pagecolumns/pagecolumns.tex b/Master/texmf-dist/doc/context/sources/general/manuals/pagecolumns/pagecolumns.tex
index 40a396e1bc8..3b103939299 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/pagecolumns/pagecolumns.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/pagecolumns/pagecolumns.tex
@@ -1,4 +1,4 @@
-% macros=mkvi language=uk
+% macros=mkvi language=us
\definemeasure[onecolumn] [\columnwidth]
\definemeasure[twocolumns] [\dimexpr\plustwo \columnwidth+ \columndistance\relax]
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/primitives/primitives.tex b/Master/texmf-dist/doc/context/sources/general/manuals/primitives/primitives.tex
index 81b42c5b6c2..f759b79b84d 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/primitives/primitives.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/primitives/primitives.tex
@@ -1,4 +1,4 @@
-% language=us
+% language=us runpath=texruns:manuals/primitives
% The usual time stamp. This written while listening intermized to Fish (just ran
% into), Lazulli (some yt videos too, looking forward to a next live act) and
@@ -49,8 +49,19 @@
[oldprimitive]
[textcolor=nonecolor]
+% We use the next one because we want to check what has been done. In a document
+% like this using \type {\foo} makes more sense.
+
+\protected\def\prm#1{\doifmode{*bodypart}{\index{\tex{#1}}}\tex{#1}}
+
+% This is why we need to tag bodymatter.
+
\starttext
+\startbodymatter
+
+\pushoverloadmode
+
\startMPpage
fill Page
withcolor "darkgray" ;
@@ -103,6 +114,69 @@ In this document the section titles that discuss the \color [nonecolor] {origina
\TEX\ and \ETEX\ primitives} have a different color those explaining the \color
[primcolor] {\LUATEX\ and \LUAMETATEX\ primitives}.
+Primitives that extend typesetting related functionality, provide control over
+subsystems (like math), allocate additional datatypes and resources, deal with
+fonts and languages, manipulate boxes and glyphs, etc.\ are not discussed here.
+In this document we concentrate on the programming aspects.
+
+% \startalign[verytolerant,stretch]
+% To be described here: \typ {enforced}, \typ {immutable}, \typ {instance},
+% \typ {aliased}, \typ {mutable}, \typ {overloaded}, \typ {overloadmode}, \typ
+% {tolerant}, \typ {permanent}, \typ {ifflags}, \typ {ifinsert}, \typ
+% {ifmathparameter}, \typ {ifmathstyle}, \typ {ifparameter}, \typ
+% {ifparameters}, \typ {ignorearguments}, \typ {ignorepars}, \typ
+% {parametercount}, \typ {lastchkdim}, \typ {lastchknum}.
+%
+% Of a different order: \typ {adjustspacing}, \typ {adjustspacingshrink}, \typ
+% {adjustspacingstep}, \typ {adjustspacingstretch}, \typ {attribute}, \typ
+% {attributedef}, \typ {automaticdiscretionary}, \typ {automatichyphenpenalty},
+% \typ {automigrationmode}, \typ {boundary}, \typ {boxattribute}, \typ
+% {boxdirection}, \typ {boxorientation}, \typ {boxtotal}, \typ {boxxmove}, \typ
+% {boxxoffset}, \typ {boxymove}, \typ {boxyoffset}, \typ {catcodetable}, \typ
+% {clearmarks}, \typ {crampeddisplaystyle}, \typ {crampedscriptscriptstyle}, \typ
+% {crampedscriptstyle}, \typ {crampedtextstyle}, \typ {directlua}, \typ {efcode},
+% \typ {everybeforepar}, \typ {everytab}, \typ {exceptionpenalty}, \typ
+% {explicitdiscretionary}, \typ {explicithyphenpenalty}, \typ {firstvalidlanguage},
+% \typ {fontid}, \typ {fontmathcontrol}, \typ {fontspecifiedsize}, \typ
+% {fonttextcontrol}, \typ {formatname}, \typ {gleaders}, \typ {gluespecdef}, \typ
+% {glyphdatafield}, \typ {glyphoptions}, \typ {glyphscale}, \typ
+% {glyphscriptfield}, \typ {glyphscriptscale}, \typ {glyphscriptscriptscale}, \typ
+% {glyphstatefield}, \typ {glyphtextscale}, \typ {glyphxoffset}, \typ
+% {glyphxscale}, \typ {glyphyoffset}, \typ {glyphyscale}, \typ {hccode}, \typ
+% {hjcode}, \typ {hpack}, \typ {hyphenationmin}, \typ {hyphenationmode}, \typ
+% {initcatcodetable}, \typ {insertbox},\typ {insertcopy}, \typ {insertdepth}, \typ
+% {insertdistance}, \typ {insertheight}, \typ {insertheights}, \typ {insertlimit},
+% \typ {insertmode}, \typ {insertmultiplier}, \typ {insertprogress}, \typ
+% {insertunbox}, \typ {insertuncopy}, \typ {insertwidth}, \typ {lastnodesubtype},
+% \typ {leftmarginkern}, \typ {letcharcode}, \typ {linedirection}, \typ {linepar},
+% \typ {localbrokenpenalty}, \typ {localinterlinepenalty}, \typ {lpcode}, \typ
+% {luabytecode}, \typ {luabytecodecall}, \typ {luacopyinputnodes}, \typ {luadef},
+% \typ {luaescapestring}, \typ {luafunction}, \typ {luafunctioncall}, \typ
+% {luatexbanner}, \typ {luatexrevision}, \typ {luatexversion}, \typ
+% {mathcontrolmode}, \typ {mathdelimitersmode}, \typ {mathdirection}, \typ
+% {mathdisplayskipmode}, \typ {matheqnogapstep}, \typ {mathflattenmode}, \typ
+% {mathfontcontrol}, \typ {mathitalicsmode}, \typ {mathnolimitsmode}, \typ
+% {mathpenaltiesmode}, \typ {mathrulesfam}, \typ {mathrulesmode}, \typ
+% {mathrulethicknessmode}, \typ {mathscale}, \typ {mathscriptboxmode}, \typ
+% {mathscriptcharmode}, \typ {mathscriptsmode}, \typ {mathstyle}, \typ
+% {mathsurroundmode}, \typ {mathsurroundskip}, \typ {mugluespecdef}, \typ
+% {noaligned}, \typ {noboundary}, \typ {nohrule}, \typ {normalizelinemode}, \typ
+% {nospaces}, \typ {novrule}, \typ {numericscale}, \typ {numexpression}, \typ
+% {outputbox}, \typ {parattribute}, \typ {pardirection}, \typ {postexhyphenchar},
+% \typ {posthyphenchar}, \typ {prebinoppenalty}, \typ {predisplaygapfactor}, \typ
+% {preexhyphenchar}, \typ {prehyphenchar}, \typ {prerelpenalty}, \typ
+% {protrudechars}, \typ {protrusionboundary}, \typ {pxdimen}, \typ {quitvmode},
+% \typ {retokenize}, \typ {rightmarginkern}, \typ {rpcode}, \typ
+% {savecatcodetable}, \typ {scantextokens}, \typ {semiexpanded}, \typ {setfontid},
+% \typ {snapshotpar}, \typ {supmarkmode}, \typ {textdirection}, \typ
+% {thewithoutunit}, \typ {tpack}, \typ {tracingexpressions}, \typ {tracingfonts},
+% \typ {tracinghyphenation}, \typ {tracingmath}, \typ {undent}, \typ {vpack}, \typ
+% {wordboundary}, \typ {wrapuppar}.
+% \stopalign
+%
+% {\em Some new primitives in this list might be forgotten or already became
+% obsolete. Let me know if you run into one.}
+
\stopsubject
\page
@@ -111,18 +185,67 @@ In this document the section titles that discuss the \color [nonecolor] {origina
% code so that it dealt a bit more natural with the newer features. A usual side
% effects if writing manuals.
-% \startoldprimitive[title={\tex {meaning}}]
-% \stopoldprimitive
-%
-% \startoldprimitive[title={\tex {par}}]
+\startoldprimitive[title={\prm {meaning}}]
+
+We start with a primitive that will be used in the following sections. The
+reported meaning can look a bit different than the one reported by other engines
+which is a side effect of additional properties and more extensive argument
+parsing.
+
+\startbuffer
+\tolerant\permanent\protected\gdef\foo[#1]#*[#2]{(#1)(#2)} \meaning\foo
+\stopbuffer
+
+\typebuffer \getbuffer
+
+\stopoldprimitive
+
+\startnewprimitive[title={\prm {meaningless}}]
+
+This one reports a bit less than \prm {meaning}.
+
+\startbuffer
+\tolerant\permanent\protected\gdef\foo[#1]#*[#2]{(#1)(#2)} \meaningless\foo
+\stopbuffer
+
+\typebuffer \getbuffer
+
+\stopnewprimitive
+
+\startnewprimitive[title={\prm {meaningfull}}]
+
+This one reports a bit more than \prm {meaning}.
+
+\startbuffer
+\tolerant\permanent\protected\gdef\foo[#1]#*[#2]{(#1)(#2)} \meaningfull\foo
+\stopbuffer
+
+\typebuffer \getbuffer
+
+\stopnewprimitive
+
+\startnewprimitive[title={\prm {meaningasis}}]
+
+Although it is not really round trip with the original due to information
+being lost this primitive tries to return an equivalent definition.
+
+\startbuffer
+\tolerant\permanent\protected\gdef\foo[#1]#*[#2]{(#1)(#2)} \meaningasis\foo
+\stopbuffer
+
+\typebuffer \getbuffer
+
+\stopnewprimitive
+
+% \startoldprimitive[title={\prm {par}}]
% \stopoldprimitive
%
-% \startoldprimitive[title={\tex {linepar}}]
+% \startoldprimitive[title={\prm {linepar}}]
% \stopoldprimitive
-\startoldprimitive[title={\tex {afterassignment}}]
+\startoldprimitive[title={\prm {afterassignment}}]
-The token following \type {\afterassignment}, a traditional \TEX\ primitive, is
+The token following \prm {afterassignment}, a traditional \TEX\ primitive, is
saved and gets injected (and then expanded) after a following assignment took
place.
@@ -136,18 +259,18 @@ place.
\typebuffer
-The \type {\afterassignment}s are not accumulated, the last one wins:
+The \prm {afterassignment}s are not accumulated, the last one wins:
{\getbuffer}
\stopoldprimitive
-\startnewprimitive[title={\tex {afterassigned}}]
+\startnewprimitive[title={\prm {afterassigned}}]
-The \type {\afterassignment} primitive stores a token to be injected (and thereby
-expanded) after an assignment has happened. Unlike \type {\aftergroup}, multiple
+The \prm {afterassignment} primitive stores a token to be injected (and thereby
+expanded) after an assignment has happened. Unlike \prm {aftergroup}, multiple
calls are not accumulated, and changing that would be too incompatible. This is
-why we have \type {\afterassigned}, which can be used to inject a bunch of
+why we have \prm {afterassigned}, which can be used to inject a bunch of
tokens. But in order to be consistent this one is also not accumulative.
\startbuffer
@@ -162,16 +285,16 @@ results in: \inlinebuffer\ being typeset.
\stopnewprimitive
-\startoldprimitive[title={\tex {aftergroup}}]
+\startoldprimitive[title={\prm {aftergroup}}]
-The traditional \TEX\ \type {\aftergroup} primitive stores the next token and
+The traditional \TEX\ \prm {aftergroup} primitive stores the next token and
expands that after the group has been closed.
\startbuffer
before{ ! \aftergroup a\aftergroup f\aftergroup t\aftergroup e\aftergroup r}
\stopbuffer
-Multiple \type {\aftergroup}s are combined:
+Multiple \prm {aftergroup}s are combined:
\typebuffer
@@ -179,9 +302,9 @@ Multiple \type {\aftergroup}s are combined:
\stopoldprimitive
-\startnewprimitive[title={\tex {aftergrouped}}]
+\startnewprimitive[title={\prm {aftergrouped}}]
-The in itself powerful \type {\aftergroup} primitives works quite well, even
+The in itself powerful \prm {aftergroup} primitives works quite well, even
if you need to do more than one thing: you can either use it multiple times, or
you can define a macro that does multiple things and apply that after the group.
However, you can avoid that by using this primitive which takes a list of tokens.
@@ -202,7 +325,7 @@ Because it happens after the group, we're no longer typesetting in bold.
\stopnewprimitive
-\startnewprimitive[title={\tex {atendofgroup}}]
+\startnewprimitive[title={\prm {atendofgroup}}]
The token provided will be injected just before the group ends. Because
these tokens are collected, you need to be aware of possible interference
@@ -219,14 +342,14 @@ between them. However, normally this is managed by the macro package.
\typebuffer
Of course these effects can also be achieved by combining (extra) grouping with
-\type {\aftergroup} calls, so this is more a convenience primitives than a real
+\prm {aftergroup} calls, so this is more a convenience primitives than a real
necessity: {\inlinebuffer}, as proven here.
\stopnewprimitive
-\startnewprimitive[title={\tex {atendofgrouped}}]
+\startnewprimitive[title={\prm {atendofgrouped}}]
-This is the multi token variant of \type {\atendofgroup}. Of course the next
+This is the multi token variant of \prm {atendofgroup}. Of course the next
example is somewhat naive when it comes to spacing and so, but it shows the
purpose.
@@ -244,7 +367,7 @@ Multiple invocations are accumulated: {\inlinebuffer}.
\stopnewprimitive
-\startnewprimitive[title={\tex {toksapp}}]
+\startnewprimitive[title={\prm {toksapp}}]
One way to append something to a token list is the following:
@@ -269,9 +392,9 @@ times.
\stopnewprimitive
-\startnewprimitive[title={\tex {etoksapp}}]
+\startnewprimitive[title={\prm {etoksapp}}]
-A variant of \type {\toksapp} is the following: it expands the to be appended
+A variant of \prm {toksapp} is the following: it expands the to be appended
content.
\starttyping
@@ -281,9 +404,9 @@ content.
\stopnewprimitive
-\startnewprimitive[title={\tex {tokspre}}]
+\startnewprimitive[title={\prm {tokspre}}]
-Where appending something is easy because of the possible \type {\expandafter}
+Where appending something is easy because of the possible \prm {expandafter}
trickery a prepend would involve more work, either using temporary token
registers and|/|or using a mixture of the (no)expansion added by \ETEX, but all
are kind of inefficient and cumbersome.
@@ -297,9 +420,9 @@ This prepends the token list that is provided.
\stopnewprimitive
-\startnewprimitive[title={\tex {etokspre}}]
+\startnewprimitive[title={\prm {etokspre}}]
-A variant of \type {\tokspre} is the following: it expands the to be prepended
+A variant of \prm {tokspre} is the following: it expands the to be prepended
content.
\starttyping
@@ -309,35 +432,35 @@ content.
\stopnewprimitive
-\startnewprimitive[title={\tex {gtoksapp}}]
+\startnewprimitive[title={\prm {gtoksapp}}]
-This is the global variant of \type {\toksapp}.
+This is the global variant of \prm {toksapp}.
\stopnewprimitive
-\startnewprimitive[title={\tex {xtoksapp}}]
+\startnewprimitive[title={\prm {xtoksapp}}]
-This is the global variant of \type {\etoksapp}.
+This is the global variant of \prm {etoksapp}.
\stopnewprimitive
-\startnewprimitive[title={\tex {gtokspre}}]
+\startnewprimitive[title={\prm {gtokspre}}]
-This is the global variant of \type {\tokspre}.
+This is the global variant of \prm {tokspre}.
\stopnewprimitive
-\startnewprimitive[title={\tex {xtokspre}}]
+\startnewprimitive[title={\prm {xtokspre}}]
-This is the global variant of \type {\etokspre}.
+This is the global variant of \prm {etokspre}.
\stopnewprimitive
-\startoldprimitive[title={\tex {csname}}]
+\startoldprimitive[title={\prm {csname}}]
This original \TEX\ primitive starts the construction of a control sequence
reference. It does a lookup and when no sequence with than name is found, it will
-create a hash entry and defaults its meaning to \type {\relax}.
+create a hash entry and defaults its meaning to \prm {relax}.
\starttyping
\csname letters and other characters\endcsname
@@ -345,15 +468,15 @@ create a hash entry and defaults its meaning to \type {\relax}.
\stopoldprimitive
-\startoldprimitive[title={\tex {endcsname}}]
+\startoldprimitive[title={\prm {endcsname}}]
-This primitive is used in combination with \type {\csname}, \type {\ifcsname} and
-\type {\begincsname} where its end the scanning for the to be constructed control
+This primitive is used in combination with \prm {csname}, \prm {ifcsname} and
+\prm {begincsname} where its end the scanning for the to be constructed control
sequence token.
\stopoldprimitive
-\startnewprimitive[title={\tex {begincsname}}]
+\startnewprimitive[title={\prm {begincsname}}]
The next code creates a control sequence token from the given serialized tokens:
@@ -362,7 +485,7 @@ The next code creates a control sequence token from the given serialized tokens:
\stoptyping
When \type {\mymacro} is not defined a control sequence will be created with the
-meaning \type {\relax}. A side effect is that a test for its existence might fail
+meaning \prm {relax}. A side effect is that a test for its existence might fail
because it now exists. The next sequence will {\em not} create an controil
sequence:
@@ -380,7 +503,7 @@ This actually is kind of equivalent to:
\stopnewprimitive
-\startnewprimitive[title={\tex {lastnamedcs}}]
+\startnewprimitive[title={\prm {lastnamedcs}}]
The example code in the previous section has some redundancy, in the sense that
there to be looked up control sequence name \type {mymacro} is assembled twice.
@@ -407,9 +530,9 @@ less tokens and parsing. It might even look nicer.
\stopnewprimitive
-\startnewprimitive[title={\tex {futureexpand}}]
+\startnewprimitive[title={\prm {futureexpand}}]
-This primitive can be used as an alternative to a \type {\futurelet} approach,
+This primitive can be used as an alternative to a \prm {futurelet} approach,
which is where the name comes from. \footnote {In the engine primitives
that have similar behavior are grouped in commands that are then dealt with
together, code wise.}
@@ -449,7 +572,7 @@ This gives us:
\stopnewprimitive
-\startnewprimitive[title={\tex {futureexpandis}}]
+\startnewprimitive[title={\prm {futureexpandis}}]
We assume that the previous section is read. This variant will not push back
spaces, which permits a consistent approach i.e.\ the user can assume that macro
@@ -470,21 +593,21 @@ always gobbles the spaces.
So, here no spaces are pushed back. This \type {is} in the name of this primitive
means \quote {ignore spaces}, but having that added to the name would have made
the primitive even more verbose (after all, we also don't have \type
-{\expandeddef} but \type {\edef} and no \type {\globalexpandeddef} but \type
-{\xdef}.
+{\expandeddef} but \prm {edef} and no \type {\globalexpandeddef} but \prm
+{xdef}.
{\getbuffer}
\stopnewprimitive
-\startnewprimitive[title={\tex {futureexpandisap}}]
+\startnewprimitive[title={\prm {futureexpandisap}}]
This primitive is like the one in the previous section but also ignores par
tokens, so \type {isap} means \quote {ignore spaces and paragraphs}.
\stopnewprimitive
-\startoldprimitive[title={\tex {expandafter}}]
+\startoldprimitive[title={\prm {expandafter}}]
This original \TEX\ primitive stores the next token, does a one level expansion
of what follows it, which actually can be an not expandable token, and
@@ -494,15 +617,15 @@ reinjects the stored token in the input. Like:
\expandafter\let\csname my weird macro name\endcsname{m w m n}
\stoptyping
-Without \type {\expandafter} the \type {\csname} primitive would have been let to
+Without \prm {expandafter} the \prm {csname} primitive would have been let to
the left brace (effectively then a begin group). Actually in this particular case
the control sequence with the weird name is injected and when it didn't yet exist
-it will get the meaning \type {\relax} so we sort of have two assignments in a
+it will get the meaning \prm {relax} so we sort of have two assignments in a
row then.
\stopoldprimitive
-\startnewprimitive[title={\tex {expandafterspaces}}]
+\startnewprimitive[title={\prm {expandafterspaces}}]
This is a gobbler: the next token is reinjected after following spaces have been
read. Here is a simple example:
@@ -523,7 +646,7 @@ a space (and leading spaces in a line are normally being ingored anyway).
\stopnewprimitive
-\startnewprimitive[title={\tex {expandafterpars}}]
+\startnewprimitive[title={\prm {expandafterpars}}]
Here is another gobbler: the next token is reinjected after following spaces
and par tokens have been read. So:
@@ -539,27 +662,27 @@ and par tokens have been read. So:
\typebuffer
-gives us: \inlinebuffer, because empty lines are like \type {\par} and therefore
+gives us: \inlinebuffer, because empty lines are like \prm {par} and therefore
ignored.
\stopnewprimitive
-\startnewprimitive[title={\tex {expandtoken}}]
+\startnewprimitive[title={\prm {expandtoken}}]
This primitive creates a token with a specific combination of catcode and
character code. Because it assumes some knowledge of \TEX\ we can show it
-using some \type {\expandafter} magic:
+using some \prm {expandafter} magic:
\startbuffer
-\expandafter\let\expandafter\temp\expandtoken 11 `X \meaning\temp\crlf
-\expandafter\let\expandafter\temp\expandtoken 12 `X \meaning\temp\crlf
+\expandafter\let\expandafter\temp\expandtoken 11 `X \meaning\temp
+\expandafter\let\expandafter\temp\expandtoken 12 `X \meaning\temp
\stopbuffer
\typebuffer
The meanings are:
-{\getbuffer}
+\startlines \tttf \getbuffer \stoplines
Using other catcodes is possible but the results of injecting them into the input
directly (or here by injecting \type {\temp}) can be unexpected because of what
@@ -569,9 +692,9 @@ catcode|/|character combinations as signals and there is no reason to change
those internals. That said:
\startbuffer
-\edef\tempA{\expandtoken 9 `X} \meaning\tempA\crlf
-\edef\tempB{\expandtoken 10 `X} \meaning\tempB\crlf
-\edef\tempC{\expandtoken 11 `X} \meaning\tempC\crlf
+\edef\tempA{\expandtoken 9 `X} \meaning\tempA
+\edef\tempB{\expandtoken 10 `X} \meaning\tempB
+\edef\tempC{\expandtoken 11 `X} \meaning\tempC
\edef\tempD{\expandtoken 12 `X} \meaning\tempD
\stopbuffer
@@ -579,7 +702,7 @@ those internals. That said:
are all valid and from the meaning you cannot really deduce what's in there:
-{\getbuffer}
+\startlines \tttf \getbuffer \stoplines
But you can be assured that:
@@ -599,15 +722,16 @@ characters with catcode 10 are spaces, while those with code 9 are ignored.
\stopnewprimitive
-\startnewprimitive[title={\tex {expandcstoken}}]
+\startnewprimitive[title={\prm {expandcstoken}}]
-The rationale behind this primitive is that when we \type {\let} a single token
+The rationale behind this primitive is that when we \prm {let} a single token
like a character it is hard to compare that with something similar, stored in a
-macro. This primitive pushes back a single token alias created by \type {\let}
+macro. This primitive pushes back a single token alias created by \prm {let}
into the input.
\startbuffer
-\let\tempA + \meaning\tempA \crlf
+\let\tempA + \meaning\tempA
+
\let\tempB X \meaning\tempB \crlf
\let\tempC $ \meaning\tempC \par
@@ -626,7 +750,7 @@ into the input.
\typebuffer
-The meaning of the \type {\let} macros shows that we have a shortcut to a
+The meaning of the \prm {let} macros shows that we have a shortcut to a
character with (in this case) catcode letter, other (here \quote {other
character} gets abbreviated to \quote {character}), math shift etc.
@@ -638,16 +762,16 @@ content of the two arguments is compared.
\stopnewprimitive
-\startnewprimitive[title={\tex {expand}}]
+\startnewprimitive[title={\prm {expand}}]
-Normally a protected macro will not be expanded inside for instance an \type
-{\edef} but there is a way out: \footnote {This primitive is dedicated to Hans vd
+Normally a protected macro will not be expanded inside for instance an \prm
+{edef} but there is a way out: \footnote {This primitive is dedicated to Hans vd
Meer who was playing with the unprotected version of \type {\doifelse} and
wondered about the reason for it not being expandable in the first place.}
\startbuffer
\edef\temp {\doifelse{a}{b}{c}{d}} \meaning\temp \crlf
-\edef\temp{\expand\doifelse{a}{b}{c}{d}} \meaning\temp
+\edef\temp{\expand\doifelse{a}{b}{c}{d}} \meaning\temp \par
\stopbuffer
\typebuffer
@@ -660,16 +784,16 @@ case in \CONTEXT\ \LMTX, but not in \MKIV.
\stopnewprimitive
-\startoldprimitive[title={\tex {ignorespaces}}]
+\startoldprimitive[title={\prm {ignorespaces}}]
This traditional \TEX\ primitive signals the scanner to ignore the following
spaces, if any. We mention it because we show a companion in the next section.
\stopoldprimitive
-\startnewprimitive[title={\tex {ignorepars}}]
+\startnewprimitive[title={\prm {ignorepars}}]
-This is a variant of \type {\ignorespaces}: following spaces {\em and} \type
+This is a variant of \prm {ignorespaces}: following spaces {\em and} \type
{\par} equivalent tokens are ignored, so for instance:
\startbuffer
@@ -681,16 +805,16 @@ three
\typebuffer
-renders as: \inlinebuffer. Traditionally \TEX\ has been sensitive to \type {\par}
+renders as: \inlinebuffer. Traditionally \TEX\ has been sensitive to \prm {par}
tokens in some of its building blocks. This has to do with the fact that it could
indicate a runaway argument which in the times of slower machines and terminals
was best to catch early. In \LUAMETATEX\ we no longer have long macros and the
-mechanisms that are sensitive can be told to accept \type {\par} tokens (and
+mechanisms that are sensitive can be told to accept \prm {par} tokens (and
\CONTEXT\ set them such that this is the case).
\stopnewprimitive
-\startnewprimitive[title={\tex {ignorearguments}}]
+\startnewprimitive[title={\prm {ignorearguments}}]
This primitive will quit argument scanning and start expansion of the body of a
macro. The number of grabbed arguments can be tested as follows:
@@ -702,7 +826,7 @@ macro. The number of grabbed arguments can be tested as follows:
\MyMacro \ignorearguments \quad
\MyMacro [1]\ignorearguments \quad
\MyMacro [1][2]\ignorearguments \quad
-\MyMacro [1][2][3]\ignorearguments \crlf
+\MyMacro [1][2][3]\ignorearguments \par
\stopbuffer
\typebuffer
@@ -713,41 +837,41 @@ macro. The number of grabbed arguments can be tested as follows:
\stopnewprimitive
-\startnewprimitive[title={\tex {lastarguments}}]
+\startnewprimitive[title={\prm {lastarguments}}]
\startbuffer
\def\MyMacro #1{\the\lastarguments (#1) } \MyMacro{1} \crlf
\def\MyMacro #1#2{\the\lastarguments (#1) (#2)} \MyMacro{1}{2} \crlf
-\def\MyMacro#1#2#3{\the\lastarguments (#1) (#2) (#3)} \MyMacro{1}{2}{3} \crlf
+\def\MyMacro#1#2#3{\the\lastarguments (#1) (#2) (#3)} \MyMacro{1}{2}{3} \par
\def\MyMacro #1{(#1) \the\lastarguments} \MyMacro{1} \crlf
\def\MyMacro #1#2{(#1) (#2) \the\lastarguments} \MyMacro{1}{2} \crlf
-\def\MyMacro#1#2#3{(#1) (#2) (#3) \the\lastarguments} \MyMacro{1}{2}{3} \crlf
+\def\MyMacro#1#2#3{(#1) (#2) (#3) \the\lastarguments} \MyMacro{1}{2}{3} \par
\stopbuffer
\typebuffer
-The value of \type {\lastarguments} can only be trusted in the expansion until
+The value of \prm {lastarguments} can only be trusted in the expansion until
another macro is seen and expanded. For instance in these examples, as soon as a
character (like the left parenthesis) is seen, horizontal mode is entered and
-\type {\everypar} is expanded which in turn can involve macros. You can see that
-in the second block (that is: unless we changed \type {\everypar} in the
+\prm {everypar} is expanded which in turn can involve macros. You can see that
+in the second block (that is: unless we changed \prm {everypar} in the
meantime).
{\getbuffer}
\stopnewprimitive
-\startoldprimitive[title={\tex {scantokens}}]
+\startoldprimitive[title={\prm {scantokens}}]
Just forget about this \ETEX\ primnitive, just take the one in the next section.
\stopoldprimitive
-\startnewprimitive[title={\tex {scantextokens}}]
+\startnewprimitive[title={\prm {scantextokens}}]
This primitive scans the input as if it comes from a file. In the next examples
-the \type {\detokenize} primitive turns tokenized code into verbatim code that is
+the \prm {detokenize} primitive turns tokenized code into verbatim code that is
similar to what is read from a file.
\startbuffer
@@ -755,19 +879,19 @@ similar to what is read from a file.
\detokenize {This is {\bf bold} and this is not.}\crlf
\scantextokens{This is {\bf bold} and this is not.}\crlf
\scantextokens{\whatever}\crlf
-\scantextokens\expandafter{\whatever}
+\scantextokens\expandafter{\whatever}\par
\stopbuffer
\typebuffer
This primitive does not have the end|-|of|-|file side effects of its precursor
-\type {\scantokens}.
+\prm {scantokens}.
{\getbuffer}
\stopnewprimitive
-\startoldprimitive[title={\tex {number}}]
+\startoldprimitive[title={\prm {number}}]
This \TEX\ primitive serializes the next token into a number, assuming that it
is indeed a number, like
@@ -778,13 +902,116 @@ is indeed a number, like
\number\scratchcounter
\stoptyping
-For counters and such the \type {\the} primitive does the same, but when you're
+For counters and such the \prm {the} primitive does the same, but when you're
not sure if what follows is a verbose number or (for instance) a counter the
-\type {\number} primitive is a safer bet, because \type {\the 65} will not work.
+\prm {number} primitive is a safer bet, because \type {\the 65} will not work.
\stopoldprimitive
-\startoldprimitive[title={\tex {string}}]
+\startnewprimitive[title={\prm {tointeger}}]
+
+\startbuffer
+\scratchcounter = 1234 \tointeger\scratchcounter
+\stopbuffer
+
+The following code gives this: {\nospacing\inlinebuffer} and is equivalent to
+\prm {number}.
+
+\typebuffer
+
+\stopnewprimitive
+
+\startnewprimitive[title={\prm {tohexadecimal}}]
+
+\startbuffer
+\scratchcounter = 1234 \tohexadecimal\scratchcounter
+\stopbuffer
+
+The following code gives this: {\nospacing\inlinebuffer} with uppercase letters.
+
+\typebuffer
+
+\stopnewprimitive
+
+\startnewprimitive[title={\prm {todimension}}]
+
+\startbuffer
+\scratchdimen = 1234pt \todimension\scratchdimen
+\stopbuffer
+
+The following code gives this: {\nospacing\inlinebuffer} and like its numeric
+counterparts accepts anything that resembles a number this one goes beyond
+(user, internal or pseudo) registers values too.
+
+\typebuffer
+
+\stopnewprimitive
+
+\startnewprimitive[title={\prm {toscaled}}]
+
+\startbuffer
+\scratchdimen = 1234pt \toscaled\scratchdimen
+\stopbuffer
+
+The following code gives this: {\nospacing\inlinebuffer} is similar to \prm
+{todimension} but omits the \type {pt} so that we don't need to revert to some
+nasty stripping code.
+
+\typebuffer
+
+\stopnewprimitive
+
+\startnewprimitive[title={\prm {tosparsedimension}}]
+
+\startbuffer
+\scratchdimen = 1234pt \tosparsedimension\scratchdimen
+\stopbuffer
+
+The following code gives this: {\nospacing\inlinebuffer} where \quote {sparse}
+indicates that redundant trailing zeros are not shown.
+
+\typebuffer
+
+\stopnewprimitive
+
+\startnewprimitive[title={\prm {tosparsescaled}}]
+
+\startbuffer
+\scratchdimen = 1234pt \tosparsescaled\scratchdimen
+\stopbuffer
+
+The following code gives this: {\nospacing\inlinebuffer} where \quote {sparse}
+means that redundant trailing zeros are omitted.
+
+\typebuffer
+
+\stopnewprimitive
+
+\startoldprimitive[title={\prm {numericscale}}]
+
+This primitive can best be explained by a few examples:
+
+\startbuffer
+\the\numericscale 1323
+\the\numericscale 1323.0
+\the\numericscale 1.323
+\the\numericscale 13.23
+\stopbuffer
+
+\typebuffer
+
+In several places \TEX\ uses a scale but due to the lack of floats it then uses
+1000 as 1.0 replacement. This primitive can be used for \quote {real} scales and
+the period signals this:
+
+\startlines \getbuffer \stoplines
+
+When there is a period (indicating the fraction) the result is an integer (count)
+that has the multiplier 1000 applied.
+
+\stopnewprimitive
+
+\startoldprimitive[title={\prm {string}}]
We mention this original primitive because of the one in the next section. It
expands the next token or control sequence as if it was just entered, so normally
@@ -792,7 +1019,7 @@ a control sequence becomes a backslash followed by characters and a space.
\stopoldprimitive
-\startnewprimitive[title={\tex {csstring}}]
+\startnewprimitive[title={\prm {csstring}}]
This primitive returns the name of the control sequence given without the leading
escape character (normally a backslash). Of course you could strip that character
@@ -808,59 +1035,60 @@ We get the name, not the meaning: {\tt \inlinebuffer}.
\stopnewprimitive
-\startoldprimitive[title={\tex {unexpanded}}]
+\startoldprimitive[title={\prm {unexpanded}}]
This is an \ETEX\ enhancement. The content will not be expanded in a context
-where expansion is happening, like in an \type {\edef}. In \CONTEXT\ you need to
+where expansion is happening, like in an \prm {edef}. In \CONTEXT\ you need to
use \type {\normalunexpanded} because we already had a macro with that name.
\startbuffer
-\def\A{!}
-\def\B{?}
-
-\edef\C{\A\B} \meaning\C \crlf
-\edef\C{\normalunexpanded{\A}\B} \meaning\C \crlf
+\def \A{!} \meaning\A
+\def \B{?} \meaning\B
+\edef\C{\A\B} \meaning\C
+\edef\C{\normalunexpanded{\A}\B} \meaning\C
\stopbuffer
-\typebuffer {\getbuffer}
+\typebuffer
+
+\startlines \tttf \getbuffer \stoplines
\stopoldprimitive
-\startoldprimitive[title={\tex {detokenize}}]
+\startoldprimitive[title={\prm {detokenize}}]
This \ETEX\ primitive turns the content of the provides list will become
characters, kind of verbatim.
\startbuffer
-\expandafter\let\expandafter\temp\detokenize{1} \meaning\temp \crlf
-\expandafter\let\expandafter\temp\detokenize{A} \meaning\temp \crlf
+\expandafter\let\expandafter\temp\detokenize{1} \meaning\temp
+\expandafter\let\expandafter\temp\detokenize{A} \meaning\temp
\stopbuffer
-\typebuffer {\getbuffer}
+\typebuffer
+
+\startlines \tttf \getbuffer \stoplines
\stopoldprimitive
-\startnewprimitive[title={\tex {tokenized}}]
+\startnewprimitive[title={\prm {tokenized}}]
-Just as \type {\expanded} has a counterpart \type {\unexpanded}, it makes sense to give
-\type {\detokenize} a companion:
+Just as \prm {expanded} has a counterpart \prm {unexpanded}, it makes sense to give
+\prm {detokenize} a companion:
\startbuffer
\edef\foo{\detokenize{\inframed{foo}}}
\edef\oof{\detokenize{\inframed{oof}}}
-\meaning\foo \crlf
-\dontleavehmode\foo
+\meaning\foo \crlf \dontleavehmode\foo
\edef\foo{\tokenized{\foo\foo}}
-\meaning\foo \crlf
-\dontleavehmode\foo
+\meaning\foo \crlf \dontleavehmode\foo
\dontleavehmode\tokenized{\foo\oof}
\stopbuffer
-\typebuffer {\getbuffer}
+\typebuffer {\tttf \getbuffer}
This primitive is similar to:
@@ -873,7 +1101,7 @@ much (if at all).
\stopnewprimitive
-\startnewprimitive[title={\tex {expanded}}]
+\startnewprimitive[title={\prm {expanded}}]
This primitive complements the two expansion related primitives mentioned in the
previous two sections. This time the content will be expanded and then pushed
@@ -886,65 +1114,82 @@ examples:
\def\A{!}
\def\B#1{\string#1} \B{\A} \crlf
\def\B#1{\string#1} \normalexpanded{\noexpand\B{\A}} \crlf
-\protected\def\B#1{\string#1} \B{\A} \crlf
+\protected\def\B#1{\string#1} \B{\A} \par
\stopbuffer
\typebuffer {\getbuffer}
\stopnewprimitive
-\startnewprimitive[title={\tex {immediateassignment}}]
-
-Assignments are not expandable which means that you cannot define fully
-expandable macros that have assignments. But, there is a way out of this:
-
-\startbuffer
-\scratchcounter = 10
-\edef\whatever{%
- (\the\scratchcounter)
- \immediateassignment\scratchcounter\numexpr\scratchcounter+10\relax
- \immediateassignment\advance\scratchcounter -5
- (\the\scratchcounter)
-}
-\meaning\whatever
-\stopbuffer
-
-\typebuffer
+\startnewprimitive[title={\prm {numexpression}}]
+
+The normal \prm {numexpr} primitive understands the \type {+}, \type {-}, \type
+{*} and \type {/} operators but in \LUAMETATEX\ we also can use \type {:} for a
+non rounded integer division (think of \LUA's \type {//}). if you want more than
+that, you can use the new expression primitive where you can use the following
+operators.
+
+\starttabulate[||cT|cT|]
+\BC add \NC + \NC \NC \NR
+\BC subtract \NC - \NC \NC \NR
+\BC multiply \NC * \NC \NC \NR
+\BC divide \NC / : \NC \NC \NR
+\BC mod \NC \letterpercent \NC mod \NC \NR
+\BC band \NC & \NC band \NC \NR
+\BC bxor \NC ^ \NC bxor \NC \NR
+\BC bor \NC \letterbar \space v \NC bor \NC \NR
+\BC and \NC && \NC and \NC \NR
+\BC or \NC \letterbar\letterbar \NC or \NC \NR
+\BC setbit \NC <undecided> \NC bset \NC \NR
+\BC resetbit \NC <undecided> \NC breset \NC \NR
+\BC left \NC << \NC \NC \NR
+\BC right \NC >> \NC \NC \NR
+\BC less \NC < \NC \NC \NR
+\BC lessequal \NC <= \NC \NC \NR
+\BC equal \NC = == \NC \NC \NR
+\BC moreequal \NC >= \NC \NC \NR
+\BC more \NC > \NC \NC \NR
+\BC unequal \NC <> != \lettertilde = \NC \NC \NR
+\BC not \NC ! \lettertilde \NC not \NC \NR
+\stoptabulate
+
+An example of the verbose bitwise operators is:
-Don't expect miracles: you can't mix|-|in content or unexpandable tokens as they
-will either show up or quit the scanning.
+\starttyping
+\scratchcounter = \numexpression
+ "00000 bor "00001 bor "00020 bor "00400 bor "08000 bor "F0000
+\relax
+\stoptyping
-{\getbuffer}
+In the table you might have notices that some operators have equivalents. This
+makes the scanner a bit less sensitive for catcode regimes.
-\stopnewprimitive
+When \prm {tracingexpressions} is set to one or higher the intermediate \quote
+{reverse polish notation} stack that is used for the calculation is shown, for
+instance:
-\startnewprimitive[title={\tex {immediateassigned}}]
+\starttyping
+4:8: {numexpression rpn: 2 5 > 4 5 > and}
+\stoptyping
-This is the multi|-|token variant of the primitive mentioned in the previous
-section.
+When you want the output on your console, you need to say:
-\startbuffer
-\scratchcounter = 10
-\edef\whatever{%
- (\the\scratchcounter)
- \immediateassigned{
- \scratchcounter\numexpr\scratchcounter+10\relax
- \advance\scratchcounter -5
- }%
- (\the\scratchcounter)
-}
-\meaning\whatever
-\stopbuffer
+\starttyping
+\tracingexpressions 1
+\tracingonline 1
+\stoptyping
-\typebuffer
+\stopnewprimitive
-The results are the same as in the previous section:
+\startnewprimitive[title={\prm {dimexpression}}]
-{\getbuffer}
+This command is like \prm {numexpression} but results in a dimension instead of
+an integer. Where \prm {dimexpr} doesn't like \typ {2 * 10pt} this expression
+primitive is quite happy with it.
\stopnewprimitive
-\startoldprimitive[title={\tex {if}}]
+\startoldprimitive[title={\prm {if}}]
This traditional \TEX\ conditional checks if two character codes are the same. In
order to understand unexpanded results it is good to know that internally \TEX\
@@ -972,7 +1217,7 @@ we get the extra \type {A}:
\stopoldprimitive
-\startoldprimitive[title={\tex {ifcat}}]
+\startoldprimitive[title={\prm {ifcat}}]
Another traditional \TEX\ primitive: what happens with what gets read in depends
on the catcode of a character, think of characters marked to start math mode, or
@@ -1000,7 +1245,7 @@ need to compare characters.
\stopoldprimitive
-\startoldprimitive[title={\tex {ifnum}}]
+\startoldprimitive[title={\prm {ifnum}}]
This is a frequently used conditional: it compares two numbers where a number is
anything that can be seen as such.
@@ -1015,15 +1260,44 @@ anything that can be seen as such.
\typebuffer
-Unless a number is an unexpandable token it ends with a space or \type {\relax},
+Unless a number is an unexpandable token it ends with a space or \prm {relax},
so when you end up in the true branch, you'd better check if \TEX\ could
determine where the number ends.
{\getbuffer}
+% When comparing integers, definitions (for instance characters) that can be seen
+% as such, or any converter that produces a number (like the \type {`} or \prm
+% {number} the usual \type {=}, \type {<} or \type {>} can be used. However, in
+% \LUAMETATEX\ you can negate such a comparison by \type {!}: \type {!=}, \type
+% {!<} or \type {!>}. Successive \type {!} toggle the negation state.
+
+On top of these \ASCII\ combinations, the engine also accepts some \UNICODE\
+characters. This brings the full repertoire to:
+
+\starttabulate[|l|cT|cT|l|]
+\FL
+\BC character \BC \BC \BC operation \NC \NR
+\ML
+\NC \type {0x003C} \NC $\Uchar"003C$ \NC \NC less \NC \NR
+\NC \type {0x003D} \NC $\Uchar"003D$ \NC \NC equal \NC \NR
+\NC \type {0x003E} \NC $\Uchar"003E$ \NC \NC more \NC \NR
+\NC \type {0x2208} \NC $\Uchar"2208$ \NC \NC element of \NC \NR
+\NC \type {0x2209} \NC $\Uchar"2209$ \NC \NC not element of \NC \NR
+\NC \type {0x2260} \NC $\Uchar"2260$ \NC != \NC not equal \NC \NR
+\NC \type {0x2264} \NC $\Uchar"2264$ \NC !> \NC less equal \NC \NR
+\NC \type {0x2265} \NC $\Uchar"2265$ \NC !< \NC greater equal \NC \NR
+\NC \type {0x2270} \NC $\Uchar"2270$ \NC \NC not less equal \NC \NR
+\NC \type {0x2271} \NC $\Uchar"2271$ \NC \NC not greater equal \NC \NR
+\LL
+\stoptabulate
+
+This also applied to \prm {ifdim} although in the case of element we discard the
+fractional part (read: divide the numeric representation by 65536).
+
\stopoldprimitive
-\startoldprimitive[title={\tex {ifdim}}]
+\startoldprimitive[title={\prm {ifdim}}]
Dimensions can be compared with this traditional \TEX\ primitive.
@@ -1042,7 +1316,7 @@ The units are mandate:
\stopoldprimitive
-\startoldprimitive[title={\tex {ifodd}}]
+\startoldprimitive[title={\prm {ifodd}}]
One reason for this condition to be around is that in a double sided layout we
need test for being on an odd or even page. It scans for a number the same was
@@ -1059,36 +1333,36 @@ So: {\inlinebuffer}
\stopoldprimitive
-\startoldprimitive[title={\tex {ifvmode}}]
+\startoldprimitive[title={\prm {ifvmode}}]
This traditional conditional checks we are in (internal) vertical mode.
\stopoldprimitive
-\startoldprimitive[title={\tex {ifhmode}}]
+\startoldprimitive[title={\prm {ifhmode}}]
This traditional conditional checks we are in (restricted) horizontal mode.
\stopoldprimitive
-\startoldprimitive[title={\tex {ifmmode}}]
+\startoldprimitive[title={\prm {ifmmode}}]
This traditional conditional checks we are in (inline or display) math mode mode.
\stopoldprimitive
-\startoldprimitive[title={\tex {ifinner}}]
+\startoldprimitive[title={\prm {ifinner}}]
This traditional one can be confusing. It is true when we are in restricted
horizontal mode (a box), internal vertical mode (a box), or inline math mode.
\startbuffer
test \ifhmode \ifinner INNER\fi HMODE\fi\crlf
-\hbox{test \ifhmode \ifinner INNER \fi HMODE\fi} \crlf
+\hbox{test \ifhmode \ifinner INNER \fi HMODE\fi} \par
\ifvmode \ifinner INNER\fi VMODE \fi\crlf
\vbox{\ifvmode \ifinner INNER \fi VMODE\fi} \crlf
-\vbox{\ifinner INNER \ifvmode VMODE \fi \fi} \crlf
+\vbox{\ifinner INNER \ifvmode VMODE \fi \fi} \par
\stopbuffer
\typebuffer
@@ -1099,48 +1373,48 @@ Watch the last line: because we typeset \type {INNER} we enter horizontal mode:
\stopoldprimitive
-\startoldprimitive[title={\tex {ifvoid}}]
+\startoldprimitive[title={\prm {ifvoid}}]
This traditional conditional checks if a given box register or internal box
variable has any content.
\stopoldprimitive
-\startoldprimitive[title={\tex {ifhbox}}]
+\startoldprimitive[title={\prm {ifhbox}}]
This traditional conditional checks if a given box register or internal box
variable represents a horizontal box,
\stopoldprimitive
-\startoldprimitive[title={\tex {ifvbox}}]
+\startoldprimitive[title={\prm {ifvbox}}]
This traditional conditional checks if a given box register or internal box
variable represents a vertical box,
\stopoldprimitive
-\startoldprimitive[title={\tex {ifx}}]
+\startoldprimitive[title={\prm {ifx}}]
-We use this traditional \TEX\ conditional a lot in \CONTEXT. Contrary to \type {\if}
+We use this traditional \TEX\ conditional a lot in \CONTEXT. Contrary to \prm {if}
the two tokens that are compared are not expanded. This makes it possible to compare
the meaning of two macros. Depending on the need, these macros can have their content
expanded or not. A different number of parameters results in false.
Control sequences are identical when they have the same command code and
-character code. Because a \type {\let} macro is just a reference, both let macros
-are the same and equal to \type {\relax}:
+character code. Because a \prm {let} macro is just a reference, both let macros
+are the same and equal to \prm {relax}:
\starttyping
\let\one\relax \let\two\relax
\stoptyping
The same is true for other definitions that result in the same (primitive) or
-meaning encoded in the character field (think of \type {\chardef}s and so).
+meaning encoded in the character field (think of \prm {chardef}s and so).
\stopoldprimitive
-\startoldprimitive[title={\tex {ifeof}}]
+\startoldprimitive[title={\prm {ifeof}}]
This traditional conditional checks if current pointer into the the file bound to
the given index is past the end of file. The read and write channels are not
@@ -1149,21 +1423,21 @@ data, and in \MKIV\ all file related stuff is dealt with in \LUATEX.
\stopoldprimitive
-\startoldprimitive[title={\tex {iftrue}}]
+\startoldprimitive[title={\prm {iftrue}}]
Here we have a traditional \TEX\ conditional that is always true (therefore the
-same is true for any macro that is \type {\let} to this primitive).
+same is true for any macro that is \prm {let} to this primitive).
\stopoldprimitive
-\startoldprimitive[title={\tex {iffalse}}]
+\startoldprimitive[title={\prm {iffalse}}]
Here we have a traditional \TEX\ conditional that is always false (therefore the
-same is true for any macro that is \type {\let} to this primitive).
+same is true for any macro that is \prm {let} to this primitive).
\stopoldprimitive
-\startoldprimitive[title={\tex {ifcase}}]
+\startoldprimitive[title={\prm {ifcase}}]
This numeric \TEX\ conditional takes a counter (literal, register, shortcut to a
character, internal quantity) and goes to the branch that matches.
@@ -1175,11 +1449,11 @@ character, internal quantity) and goes to the branch that matches.
\typebuffer
Indeed: \inlinebuffer\ equals three. In later sections we will see some
-\LUAMETATEX\ primitives that behave like an \type {\ifcase}.
+\LUAMETATEX\ primitives that behave like an \prm {ifcase}.
\stopoldprimitive
-\startoldprimitive[title={\tex {ifdefined}}]
+\startoldprimitive[title={\prm {ifdefined}}]
In traditional \TEX\ checking for a macro to exist was a bit tricky and therefore
\ETEX\ introduced a convenient conditional. We can do this:
@@ -1195,13 +1469,13 @@ seen was this:
\expandafter\ifx\csname MyMacro\endcsname\relax ... \else ... \fi
\stoptyping
-Instead of comparing with \type {\undefined} we need to check with \type {\relax}
+Instead of comparing with \type {\undefined} we need to check with \prm {relax}
because the control sequence is defined when not yet present and defaults to
-\type {\relax}. This is not pretty.
+\prm {relax}. This is not pretty.
\stopoldprimitive
-\startoldprimitive[title={\tex {ifcsname}}]
+\startoldprimitive[title={\prm {ifcsname}}]
This is an \ETEX\ conditional that complements the one on the previous section:
@@ -1211,18 +1485,18 @@ This is an \ETEX\ conditional that complements the one on the previous section:
\stoptyping
Here the first one has the side effect of defining the macro and defaulting it to
-\type {\relax}, while the second one doesn't do that. Juts think of checking a
+\prm {relax}, while the second one doesn't do that. Juts think of checking a
few million different names: the first one will deplete the hash table and
probably string space too.
In \LUAMETATEX\ the construction stops when there is no letter or other character
seen (\TEX\ expands on the go so expandable macros are dealt with). Instead of an
-error message, the match is simply false and all tokens till the \type
-{\endcsname} are gobbled.
+error message, the match is simply false and all tokens till the \prm
+{endcsname} are gobbled.
\stopoldprimitive
-\startoldprimitive[title={\tex {iffontchar}}]
+\startoldprimitive[title={\prm {iffontchar}}]
This is an \ETEX\ conditional. It takes a font identifier and a character number.
In modern fonts simply checking could not be enough because complex font features
@@ -1232,14 +1506,14 @@ just reports true when the font passed to the frontend has a slot filled.
\stopoldprimitive
-\startnewprimitive[title={\tex {ifincsname}}]
+\startnewprimitive[title={\prm {ifincsname}}]
This conditional is sort of obsolete and can be used to check if we're inside a
-\type {\csname} or \type {\ifcsname} construction. It's not used in \CONTEXT.
+\prm {csname} or \prm {ifcsname} construction. It's not used in \CONTEXT.
\stopnewprimitive
-\startnewprimitive[title={\tex {ifabsnum}}]
+\startnewprimitive[title={\prm {ifabsnum}}]
This test will negate negative numbers before comparison, as in:
@@ -1249,7 +1523,7 @@ This test will negate negative numbers before comparison, as in:
\TestA {10}\quad\TestA {150}\quad\TestA {210}\crlf
\TestB {10}\quad\TestB {150}\quad\TestB {210}\crlf
-\TestB{-10}\quad\TestB{-150}\quad\TestB{-210}\crlf
+\TestB{-10}\quad\TestB{-150}\quad\TestB{-210}\par
\stopbuffer
\typebuffer
@@ -1260,7 +1534,7 @@ Here we get the same result each time:
\stopnewprimitive
-\startnewprimitive[title={\tex {ifabsdim}}]
+\startnewprimitive[title={\prm {ifabsdim}}]
This test will negate negative dimensions before comparison, as in:
@@ -1270,7 +1544,7 @@ This test will negate negative dimensions before comparison, as in:
\TestA {1pt}\quad\TestA {3pt}\quad\TestA {5pt}\crlf
\TestB {1pt}\quad\TestB {3pt}\quad\TestB {5pt}\crlf
-\TestB{-1pt}\quad\TestB{-3pt}\quad\TestB{-5pt}\crlf
+\TestB{-1pt}\quad\TestB{-3pt}\quad\TestB{-5pt}\par
\stopbuffer
\typebuffer
@@ -1281,7 +1555,31 @@ So we get this:
\stopnewprimitive
-\startnewprimitive[title={\tex {ifchknum}}]
+\startnewprimitive[title={\prm {ifzerodim}}]
+
+This tests for a dimen (dimension) being zero so we have:
+
+\starttyping
+\ifdim<dimension>=0pt
+\ifzerodim<dimension>
+\ifcase<dimension register>
+\stoptyping
+
+\stopnewprimitive
+
+\startnewprimitive[title={\prm {ifzeronum}}]
+
+This tests for a number (integer) being zero so we have these variants now:
+
+\starttyping
+\ifnum<integer or equivalent>=0pt
+\ifzeronum<integer or equivalent>
+\ifcase<integer or equivalent>
+\stoptyping
+
+\stopnewprimitive
+
+\startnewprimitive[title={\prm {ifchknum}}]
In \CONTEXT\ there are quite some cases where a variable can have a number or a
keyword indicating a symbolic name of a number or maybe even some special
@@ -1302,7 +1600,7 @@ The result is as expected:
\stopnewprimitive
-\startnewprimitive[title={\tex {ifchkdim}}]
+\startnewprimitive[title={\prm {ifchkdim}}]
A variant on the checker in the previous section is a dimension checker:
@@ -1320,9 +1618,9 @@ We get:
\stopnewprimitive
-\startnewprimitive[title={\tex {ifcmpnum}}]
+\startnewprimitive[title={\prm {ifcmpnum}}]
-This conditional compares two numbers and the resulting \type {\ifcase} reflects
+This conditional compares two numbers and the resulting \prm {ifcase} reflects
their relation:
\startbuffer
@@ -1339,9 +1637,9 @@ This gives:
\stopnewprimitive
-\startnewprimitive[title={\tex {ifcmpdim}}]
+\startnewprimitive[title={\prm {ifcmpdim}}]
-This conditional compares two dimensions and the resulting \type {\ifcase}
+This conditional compares two dimensions and the resulting \prm {ifcase}
reflects their relation:
\startbuffer
@@ -1358,9 +1656,9 @@ This gives:
\stopnewprimitive
-\startnewprimitive[title={\tex {ifnumval}}]
+\startnewprimitive[title={\prm {ifnumval}}]
-This conditional is a variant on \type {\ifchknum}. This time we get
+This conditional is a variant on \prm {ifchknum}. This time we get
some more detail about the value:
\startbuffer
@@ -1378,9 +1676,9 @@ This gives:
\stopnewprimitive
-\startnewprimitive[title={\tex {ifdimval}}]
+\startnewprimitive[title={\prm {ifdimval}}]
-This conditional is a variant on \type {\ifchkdim} and provides some more
+This conditional is a variant on \prm {ifchkdim} and provides some more
detailed information about the value:
\startbuffer
@@ -1398,7 +1696,7 @@ This gives:
\stopnewprimitive
-\startnewprimitive[title={\tex {iftok}}]
+\startnewprimitive[title={\prm {iftok}}]
When you want to compare two arguments, the usual way to do this is the
following:
@@ -1448,7 +1746,7 @@ This:
\stopnewprimitive
-\startnewprimitive[title={\tex {ifcstok}}]
+\startnewprimitive[title={\prm {ifcstok}}]
A variant on the primitive mentioned in the previous section is one that
operates on lists and macros:
@@ -1474,7 +1772,7 @@ This:
\stopnewprimitive
-\startnewprimitive[title={\tex {ifcondition}}]
+\startnewprimitive[title={\prm {ifcondition}}]
The conditionals in \TEX\ are hard coded as primitives and although it might
look like \type {\newif} creates one, it actually just defined three macros.
@@ -1484,10 +1782,10 @@ look like \type {\newif} creates one, it actually just defined three macros.
\meaning\MyTesttrue \crlf
\meaning\MyTestfalse \crlf
\meaning\ifMyTest \crlf \MyTesttrue
-\meaning\ifMyTest \crlf
+\meaning\ifMyTest \par
\stopbuffer
-\typebuffer {\getbuffer}
+\typebuffer {\tttf \getbuffer}
This means that when you say:
@@ -1517,7 +1815,7 @@ will work out well too. This is not true for macros, so for instance:
\stoptyping
will make a run fail with an error (or simply loop forever, depending on your
-code). This is where \type {\ifcondition} enters the picture:
+code). This is where \prm {ifcondition} enters the picture:
\starttyping
\def\MyTest{\iftrue} \scratchcounter0
@@ -1542,7 +1840,7 @@ is also okay. Now, is that neat or not?
\stopnewprimitive
-\startnewprimitive[title={\tex {iffrozen}}]
+\startnewprimitive[title={\prm {iffrozen}}]
This conditional checks if a control sequence is frozen:
@@ -1552,7 +1850,7 @@ is \iffrozen\MyMacro \else not \fi frozen
\stopnewprimitive
-\startnewprimitive[title={\tex {ifprotected}}]
+\startnewprimitive[title={\prm {ifprotected}}]
This conditional checks if a control sequence is protected:
@@ -1562,7 +1860,7 @@ is \ifprotected\MyMacro \else not \fi protected
\stopnewprimitive
-\startnewprimitive[title={\tex {ifusercmd}}]
+\startnewprimitive[title={\prm {ifusercmd}}]
This conditional checks if a control sequence is not one of the primitives:
@@ -1575,7 +1873,14 @@ macros, register allocations and character definitions.
\stopnewprimitive
-\startnewprimitive[title={\tex {ifempty}}]
+\startnewprimitive[title={\prm {ifrelax}}]
+
+This is a convenient shortcut for \typ {\ifx\relax} and the motivation for adding
+this one is (as with some others) to get less tracing.
+
+\stopnewprimitive
+
+\startnewprimitive[title={\prm {ifempty}}]
This conditional checks if a control sequence is empty:
@@ -1603,16 +1908,16 @@ Of course this is not empty at all:
\stopnewprimitive
-\startnewprimitive[title={\tex {ifboolean}}]
+\startnewprimitive[title={\prm {ifboolean}}]
This tests a number (register or equivalent) and any nonzero value represents
\type {true}, which is nicer than using an \type {\unless \ifcase}.
\stopnewprimitive
-\startnewprimitive[title={\tex {ifmathparameter}}]
+\startnewprimitive[title={\prm {ifmathparameter}}]
-This is an \type {\ifcase} where the value depends on if the given math parameter
+This is an \prm {ifcase} where the value depends on if the given math parameter
is zero, (\type {0}), set (\type {1}), or unset (\type {2}).
\starttyping
@@ -1624,9 +1929,9 @@ is zero, (\type {0}), set (\type {1}), or unset (\type {2}).
\stopnewprimitive
-\startnewprimitive[title={\tex {ifmathstyle}}]
+\startnewprimitive[title={\prm {ifmathstyle}}]
-This is a variant of \type {\ifcase} were the number is one of the seven possible
+This is a variant of \prm {ifcase} were the number is one of the seven possible
styles: display, text, cramped text, script, cramped script, script script,
cramped script script.
@@ -1644,27 +1949,27 @@ cramped script script.
\stopnewprimitive
-\startnewprimitive[title={\tex {ifarguments}}]
+\startnewprimitive[title={\prm {ifarguments}}]
-This is a variant of \type {\ifcase} were the selector is the number of arguments
+This is a variant of \prm {ifcase} were the selector is the number of arguments
picked up. For example:
\startbuffer
\def\MyMacro#1#2#3{\ifarguments\0\or1\or2\or3\else ?\fi} \MyMacro{A}{B}{C}
\def\MyMacro#1#0#3{\ifarguments\0\or1\or2\or3\else ?\fi} \MyMacro{A}{B}{C}
-\def\MyMacro#1#-#2{\ifarguments\0\or1\or2\or3\else ?\fi} \MyMacro{A}{B}{C}\crlf
+\def\MyMacro#1#-#2{\ifarguments\0\or1\or2\or3\else ?\fi} \MyMacro{A}{B}{C}\par
\stopbuffer
\typebuffer
Watch the non counted, ignored, argument in the last case. Normally this test will
-be used in combination with \type {\ignorearguments}.
+be used in combination with \prm {ignorearguments}.
{\getbuffer}
\stopnewprimitive
-\startnewprimitive[title={\tex {ifhastok}}]
+\startnewprimitive[title={\prm {ifhastok}}]
This conditional looks for occurrences in token lists where each argument has to
be a proper list.
@@ -1684,7 +1989,7 @@ We get:
\stopnewprimitive
-\startnewprimitive[title={\tex {ifhastoks}}]
+\startnewprimitive[title={\prm {ifhastoks}}]
This test compares two token lists. When a macro is passed it's meaning
gets used.
@@ -1705,7 +2010,7 @@ gets used.
\stopnewprimitive
-\startnewprimitive[title={\tex {ifhasxtoks}}]
+\startnewprimitive[title={\prm {ifhasxtoks}}]
This primitive is like the one in the previous section but this time the
given lists are expanded.
@@ -1760,27 +2065,73 @@ ok:
\stopnewprimitive
-\startoldprimitive[title={\tex {else}}]
+\startnewprimitive[title={\prm {ifhaschar}}]
+
+This one is a simplified variant of the above:
+
+\startbuffer
+\ifhaschar !{this ! works} yes \else no \fi
+\stopbuffer
+
+\typebuffer
+
+and indeed we get: \inlinebuffer ! Of course the spaces in this this example
+code are normally not present in such a test.
+
+\stopnewprimitive
+
+\startnewprimitive[title={\prm {ifnumexpression}}]
+
+Here is an example of a conditional using expressions:
+
+\startbuffer
+\ifnumexpression (\scratchcounterone > 5) and (\scratchcountertwo > 5) \relax
+ do-something
+\fi
+\stopbuffer
+
+This matches when the result is non zero, and you can mix calculations and tests
+as with normal expressions.
+
+\stopnewprimitive
+
+\startnewprimitive[title={\prm {ifdimexpression}}]
+
+The companion of the previous primitive is:
+
+\startbuffer
+\ifdimexpression 10pt > 10bp \relax
+ do-something
+\fi
+\stopbuffer
+
+This matches when the result is non zero, and you can mix calculations and tests
+as with normal expressions. Contrary to the number variant units can be used and
+precision kicks in.
+
+\stopnewprimitive
+
+\startoldprimitive[title={\prm {else}}]
This traditional primitive is part of the condition testing mechanism. When a
-condition matches, \TEX\ will continue till it sees an \type {\else} or \type
-{\or} or \type {\orelse} (to be discussed later). It will then do a fast skipping
-pass till it sees an \type {\fi}.
+condition matches, \TEX\ will continue till it sees an \prm {else} or \prm
+{or} or \prm {orelse} (to be discussed later). It will then do a fast skipping
+pass till it sees an \prm {fi}.
\stopoldprimitive
-\startoldprimitive[title={\tex {or}}]
+\startoldprimitive[title={\prm {or}}]
This traditional primitive is part of the condition testing mechanism and relates
-to an \type {\ifcase} test (or a similar test to be introduced in later
+to an \prm {ifcase} test (or a similar test to be introduced in later
sections). Depending on the value, \TEX\ will do a fast scanning till the right
-\type {\or} is seen, then it will continue expanding till it sees a \type {\or}
-or \type {\else} or \type {\orelse} (to be discussed later). It will then do a
-fast skipping pass till it sees an \type {\fi}.
+\prm {or} is seen, then it will continue expanding till it sees a \prm {or}
+or \prm {else} or \prm {orelse} (to be discussed later). It will then do a
+fast skipping pass till it sees an \prm {fi}.
\stopoldprimitive
-\startoldprimitive[title={\tex {fi}}]
+\startoldprimitive[title={\prm {fi}}]
This traditional primitive is part of the condition testing mechanism and ends a
test. So, we have:
@@ -1792,12 +2143,12 @@ test. So, we have:
\ifsomething ... \or ... \orelse \ifsometing ... \else ... \fi
\stoptyping
-The \type {\orelse} is new in \LUAMETATEX\ and a continuation like we find in
+The \prm {orelse} is new in \LUAMETATEX\ and a continuation like we find in
other programming languages (see later section).
\stopoldprimitive
-\startoldprimitive[title={\tex {unless}}]
+\startoldprimitive[title={\prm {unless}}]
This \ETEX\ prefix will negate the test (when applicable).
@@ -1811,7 +2162,7 @@ few cases.
\stopoldprimitive
-\startnewprimitive[title={\tex {orelse}}]
+\startnewprimitive[title={\prm {orelse}}]
This primitive provides a convenient way to flatten your conditional tests. So
instead of
@@ -1893,16 +2244,23 @@ masters \TEX\ might hurt.
\stopnewprimitive
-\startoldprimitive[title={\tex {futurelet}}]
+\startnewprimitive[title={\prm {orunless}}]
+
+This is the negated variant of \prm {orelse} (prefixing that one with \tex
+{unless} doesn't work well.
+
+\stopnewprimitive
+
+\startoldprimitive[title={\prm {futurelet}}]
-The original \TEX\ primitive \type {\futurelet} can be used to create an alias to a next token,
+The original \TEX\ primitive \prm {futurelet} can be used to create an alias to a next token,
push it back into the input and then expand a given token.
\startbuffer
\let\MySpecialToken[
\def\DoWhatever{\ifx\NextToken\MySpecialToken YES\else NOP\fi : }
\futurelet\NextToken\DoWhatever [A]\crlf
-\futurelet\NextToken\DoWhatever (A)
+\futurelet\NextToken\DoWhatever (A)\par
\stopbuffer
\typebuffer
@@ -1915,16 +2273,16 @@ related to user interfacing.
\stopoldprimitive
-\startnewprimitive[title={\tex {futuredef}}]
+\startnewprimitive[title={\prm {futuredef}}]
-We elaborate on the example of using \type {\futurelet} in the previous section.
+We elaborate on the example of using \prm {futurelet} in the previous section.
Compare that one with the next:
\startbuffer
\def\MySpecialToken{[}
\def\DoWhatever{\ifx\NextToken\MySpecialToken YES\else NOP\fi : }
\futurelet\NextToken\DoWhatever [A]\crlf
-\futurelet\NextToken\DoWhatever (A)
+\futurelet\NextToken\DoWhatever (A)\par
\stopbuffer
\typebuffer
@@ -1933,13 +2291,13 @@ This time we get:
{\getbuffer}
-It is for that reason that we now also have \type {\futuredef}:
+It is for that reason that we now also have \prm {futuredef}:
\startbuffer
\def\MySpecialToken{[}
\def\DoWhatever{\ifx\NextToken\MySpecialToken YES\else NOP\fi : }
\futuredef\NextToken\DoWhatever [A]\crlf
-\futuredef\NextToken\DoWhatever (A)
+\futuredef\NextToken\DoWhatever (A)\par
\stopbuffer
\typebuffer
@@ -1950,7 +2308,18 @@ So we're back to what we want:
\stopnewprimitive
-\startnewprimitive[title={\tex {letcharcode}}]
+\startnewprimitive[title={\prm {futurecsname}}]
+
+In order to make the repertoire of \type {def}, \type {let} and \type {futurelet}
+primitives complete we also have:
+
+\starttyping
+\futurecsname MyMacro:1\endcsname\MyAction
+\stoptyping
+
+\stopnewprimitive
+
+\startnewprimitive[title={\prm {letcharcode}}]
Assigning a meaning to an active character can sometimes be a bit cumbersome;
think of using some documented uppercase magic that one tends to forget as it's
@@ -1958,7 +2327,7 @@ used only a few times and then never looked at again. So we have this:
\startbuffer
{\letcharcode 65 1 \catcode 65 13 A : \meaning A}\crlf
-{\letcharcode 65 2 \catcode 65 13 A : \meaning A}\crlf
+{\letcharcode 65 2 \catcode 65 13 A : \meaning A}\par
\stopbuffer
\typebuffer
@@ -1966,24 +2335,24 @@ used only a few times and then never looked at again. So we have this:
here we define \type {A} as an active charcter with meaning \type {1} in the
first line and \type {2} in the second.
-{\getbuffer}
+{\tttf \getbuffer}
Normally one will assign a control sequence:
\startbuffer
-{\letcharcode 66 \bf \catcode 66 13 {B bold}: \meaning B}\crlf
-{\letcharcode 73 \it \catcode 73 13 {I italic}: \meaning I}\crlf
+{\letcharcode 66 \bf \catcode 66 13 {B bold}: \meaning B}\crlf
+{\letcharcode 73 \it \catcode 73 13 {I italic}: \meaning I}\par
\stopbuffer
\typebuffer
Of course \type {\bf} and \type {\it} are \CONTEXT\ specific commands:
-{\getbuffer}
+{\tttf \getbuffer}
\stopnewprimitive
-\startoldprimitive[title={\tex {global}}]
+\startoldprimitive[title={\prm {global}}]
This is one of the original prefixes that can be used when we define a macro of
change some register.
@@ -2001,10 +2370,10 @@ second and third definition are both global and these definitions are retained.
\stopoldprimitive
-\startoldprimitive[title={\tex {long}}]
+\startoldprimitive[title={\prm {long}}]
This original prefix gave the macro being defined the property that it could not
-have \type {\par} (or the often equivalent empty lines) in its arguments. It was
+have \prm {par} (or the often equivalent empty lines) in its arguments. It was
mostly a protection against a forgotten right curly brace, resulting in a so called
run|-|away argument. That mattered on a paper terminal or slow system where such a
situation should be catched early. In \LUATEX\ it was already optional, and in
@@ -2012,28 +2381,88 @@ situation should be catched early. In \LUATEX\ it was already optional, and in
\stopoldprimitive
-\startoldprimitive[title={\tex {outer}}]
+\startoldprimitive[title={\prm {outer}}]
An outer macro is one that can only be used at the outer level. This property is
-no longer supported. Like \type {\long}, the \type {\outer} prefix is now an
+no longer supported. Like \prm {long}, the \prm {outer} prefix is now an
no|-|op (and we don't expect this to have unfortunate side effects).
\stopoldprimitive
-\startoldprimitive[title={\tex {protected}}]
+\startoldprimitive[title={\prm {protected}}]
A protected macro is one that doesn't get expanded unless it is time to do so.
-For instance, inside an \type {\edef} it just stays what it is. It often makes
+For instance, inside an \prm {edef} it just stays what it is. It often makes
sense to pass macros as|-|is to (multi|-|pass) file (for tables of contents).
-In \CONTEXT\ we use either \type {\protected} or \type {\unexpanded} because the
+In \CONTEXT\ we use either \prm {protected} or \prm {unexpanded} because the
later was the command we used to achieve the same results before \ETEX\
-introduced this protection primitive. Originally the \type {\protected} macro was
+introduced this protection primitive. Originally the \prm {protected} macro was
also defined but it has been dropped.
\stopoldprimitive
-\startnewprimitive[title={\tex {frozen}}]
+\startnewprimitive[title={\prm {expand}}]
+
+Beware, this is not a prefix but a directive to ignore the protected characters of
+the following macro.
+
+\startbuffer
+\protected \def \testa{\the\scratchcounter}
+ \edef\testb{\testa}
+ \edef\testc{\expand\testa}
+\stopbuffer
+
+\typebuffer
+
+The meaning of the three macros is:
+
+\startlines \getbuffer \tttf
+\meaningfull\testa
+\meaningfull\testb
+\meaningfull\testc
+\stoplines
+
+\stopnewprimitive
+
+\startnewprimitive[title={\prm {untraced}}]
+
+Related to the meaning providers is the \prm {untraced} prefix. It marks a macro
+as to be reported by name only. It makes the macro look like a primitive.
+
+\starttyping
+ \def\foo{}
+\untraced\def\oof{}
+
+\scratchtoks{\foo\foo\oof\oof}
+
+\tracingall \the\scratchtoks \tracingnone
+\stoptyping
+
+This will show up in the log as follows:
+
+\starttyping
+1:4: {\the}
+1:5: \foo ->
+1:5: \foo ->
+1:5: \oof
+1:5: \oof
+\stoptyping
+
+This is again a trick to avoid too much clutter in a log. Often it doesn't matter
+to users what the meaning of a macro is (if they trace at all). \footnote {An
+earlier variant could also hide the expansion completely but that was just
+confusing.}
+
+\startoldprimitive[title={\prm {immediate}}]
+
+This one has no effect unless you intercept it at the \LUA\ end and act upon it.
+In original \TEX\ immediate is used in combination with read from and write to
+file operations. So, this is an old primitive with a new meaning.
+
+\stopoldprimitive
+
+\startnewprimitive[title={\prm {frozen}}]
You can define a macro as being frozen:
@@ -2047,13 +2476,13 @@ When you redefine this macro you get an error:
! You can't redefine a frozen macro.
\stoptyping
-This is a prefix like \type {\global} and it can be combined with other prefixes.
-\footnote {The \type {\outer} and \type {\long} prefixes are no|-|ops in
+This is a prefix like \prm {global} and it can be combined with other prefixes.
+\footnote {The \prm {outer} and \prm {long} prefixes are no|-|ops in
\LUAMETATEX\ and \LUATEX\ can be configured to ignore them.}
\stopnewprimitive
-\startnewprimitive[title={\tex {letfrozen}}]
+\startnewprimitive[title={\prm {letfrozen}}]
You can explicitly freeze an unfrozen macro:
@@ -2070,7 +2499,7 @@ A redefinition will now give:
\stopnewprimitive
-\startnewprimitive[title={\tex {unletfrozen}}]
+\startnewprimitive[title={\prm {unletfrozen}}]
A frozen macro cannot be redefined: you get an error. But as nothing in \TEX\ is set
in stone, you can do this:
@@ -2085,7 +2514,7 @@ undecided to what extend \CONTEXT\ will use this feature.
\stopnewprimitive
-\startnewprimitive[title={\tex {letprotected}}]
+\startnewprimitive[title={\prm {letprotected}}]
Say that you have these definitions:
@@ -2096,7 +2525,7 @@ Say that you have these definitions:
\letprotected \MyMacroA
\edef \MyMacroD{\MyMacroA\MyMacroB}
\meaning \MyMacroC\crlf
-\meaning \MyMacroD
+\meaning \MyMacroD\par
\stopbuffer
\typebuffer
@@ -2107,9 +2536,9 @@ The typeset meaning in this example is:
\stopnewprimitive
-\startnewprimitive[title={\tex {unletprotected}}]
+\startnewprimitive[title={\prm {unletprotected}}]
-The complementary operation of \type {\letprotected} can be used to unprotect
+The complementary operation of \prm {letprotected} can be used to unprotect
a macro, so that it gets expandable.
\startbuffer
@@ -2119,7 +2548,7 @@ a macro, so that it gets expandable.
\unletprotected \MyMacroB
\edef \MyMacroD{\MyMacroA\MyMacroB}
\meaning \MyMacroC\crlf
-\meaning \MyMacroD
+\meaning \MyMacroD\par
\stopbuffer
\typebuffer
@@ -2130,11 +2559,11 @@ Compare this with the example in the previous section:
\stopnewprimitive
-% \startnewprimitive[title={\tex {letdatacode}}]
+% \startnewprimitive[title={\prm {letdatacode}}]
% {\em Todo.}
% \stopnewprimitive
-\startnewprimitive[title={\tex {beginlocalcontrol}}]
+\startnewprimitive[title={\prm {beginlocalcontrol}}]
Once \TEX\ is initialized it will enter the main loop. In there certain commands
trigger a function that itself can trigger further scanning and functions. In
@@ -2169,34 +2598,528 @@ A bit of close reading probably gives an impression of what happens here:
{\getbuffer}
The local loop can actually result in material being injected in the current node
-list. However, where normally assignments are not taking place in an \type
-{\edef}, here they are applied just fine. Basically we have a local \TEX\ job, be
+list. However, where normally assignments are not taking place in an \prm
+{edef}, here they are applied just fine. Basically we have a local \TEX\ job, be
it that it shares all variables with the parent loop.
\stopnewprimitive
-\startnewprimitive[title={\tex {endlocalcontrol}}]
+\startnewprimitive[title={\prm {endlocalcontrol}}]
See previous section.
\stopnewprimitive
-\startnewprimitive[title={\tex {alignmark}}]
+\startnewprimitive[title={\prm {localcontrolled}}]
+
+The previously described local control feature comes with two extra helpers. The
+\prm {localcontrolled} primitive takes a token list and wraps this into a local
+control sidetrack. For example:
+
+\startbuffer
+\edef\testa{\scratchcounter123 \the\scratchcounter}
+\edef\testb{\localcontrolled{\scratchcounter123}\the\scratchcounter}
+\stopbuffer
+
+\typebuffer
-When you have the \type{#} not set up as macro parameter character cq.\ align
+The two meanings are:
+
+\start \getbuffer
+\starttabulate[|T|T|]
+\NC \string\testa \NC \meaningfull\testa \NC \NR
+\NC \string\testb \NC \meaningfull\testb \NC \NR
+\stoptabulate
+\stop
+
+The assignment is applied immediately in the expanded definition.
+
+\stopnewprimitive
+
+\startnewprimitive[title={\prm {localcontrol}}]
+
+This primitive takes a single token:
+
+\startbuffer
+\edef\testa{\scratchcounter123 \the\scratchcounter}
+\edef\testc{\testa \the\scratchcounter}
+\edef\testd{\localcontrol\testa \the\scratchcounter}
+\stopbuffer
+
+\typebuffer
+
+The three meanings are:
+
+\start \getbuffer
+\starttabulate[|T|T|]
+\NC \string\testa \NC \meaning\testa \NC \NR
+\NC \string\testc \NC \meaning\testc \NC \NR
+\NC \string\testd \NC \meaning\testd \NC \NR
+\stoptabulate
+\stop
+
+The \prm {localcontrol} makes that the following token gets expanded so we don't
+see the yet to be expanded assignment show up in the macro body.
+
+\stopnewprimitive
+
+\startnewprimitive[title={\prm {alignmark}}]
+
+When you have the \type {#} not set up as macro parameter character cq.\ align
mark, you can use this primitive instead. The same rules apply with respect to
multiple such tokens in (nested) macros and alignments.
\stopnewprimitive
-\startnewprimitive[title={\tex {aligntab}}]
+\startnewprimitive[title={\prm {aligntab}}]
-When you have the \type{&} not set up as align tab, you can use this primitive
+When you have the \type {&} not set up as align tab, you can use this primitive
instead. The same rules apply with respect to multiple such tokens in (nested)
macros and alignments.
\stopnewprimitive
+\startnewprimitive[title={\prm {defcsname}}]
+
+We now get a series of log clutter avoidance primitives. It's fine if you argue
+that they are not really needed, just don't use them.
+
+\starttyping
+\expandafter\def\csname MyMacro:1\endcsname{...}
+ \defcsname MyMacro:1\endcsname{...}
+\stoptyping
+
+The fact that \TEX\ has three (expanded and global) companions can be seen as a
+signal that less verbosity makes sense. It's just that macro packages use plenty
+of \prm {csname}'s.
+
+\stopnewprimitive
+
+\startnewprimitive[title={\prm {edefcsname}}]
+
+This is the companion of \prm {edef}:
+
+\starttyping
+\expandafter\edef\csname MyMacro:1\endcsname{...}
+ \edefcsname MyMacro:1\endcsname{...}
+\stoptyping
+
+\stopnewprimitive
+
+\startnewprimitive[title={\prm {gdefcsname}}]
+
+As with standard \TEX\ we also define global ones:
+
+\starttyping
+\expandafter\gdef\csname MyMacro:1\endcsname{...}
+ \gdefcsname MyMacro:1\endcsname{...}
+\stoptyping
+
+\stopnewprimitive
+
+\startnewprimitive[title={\prm {xdefcsname}}]
+
+This is the companion of \prm {xdef}:
+
+\starttyping
+\expandafter\xdef\csname MyMacro:1\endcsname{...}
+ \xdefcsname MyMacro:1\endcsname{...}
+\stoptyping
+
+\stopnewprimitive
+
+\startnewprimitive[title={\prm {glet}}]
+
+This is the global companion of \prm {let}. The fact that it is not an original
+primitive is probably due to the expectation for it not it not being used (as)
+often (as in \CONTEXT).
+
+\stopnewprimitive
+
+\startnewprimitive[title={\prm {letcsname}}]
+
+It is easy to see that we save two tokens when we use this primitive. As with the
+\type {..defcs..} variants it also saves a push back of the composed macro name.
+
+\starttyping
+\expandafter\let\csname MyMacro:1\endcsname\relax
+ \letcsname MyMacro:1\endcsname\relax
+\stoptyping
+
+\stopnewprimitive
+
+\startnewprimitive[title={\prm {gletcsname}}]
+
+Naturally \LUAMETATEX\ also provides a global variant:
+
+\starttyping
+\expandafter\global\expandafter\let\csname MyMacro:1\endcsname\relax
+\expandafter \glet\csname MyMacro:1\endcsname\relax
+ \gletcsname MyMacro:1\endcsname\relax
+\stoptyping
+
+So, here we save even more.
+
+\stopnewprimitive
+
+\startnewprimitive[title={\prm {cdef}}]
+
+This primitive is like \prm {edef} but in some usage scenarios is slightly
+more efficient because (delayed) expansion is ignored which in turn saves
+building a temporary token list.
+
+\startbuffer
+\edef\FooA{this is foo} \meaningfull\FooA\crlf
+\cdef\FooB{this is foo} \meaningfull\FooB\par
+\stopbuffer
+
+\typebuffer {\tttf \getbuffer}
+
+\stopnewprimitive
+
+\startnewprimitive[title={\prm {cdefcsname}}]
+
+This primitive is like \prm {edefcsame} but in some usage scenarios is slightly
+more efficient because (delayed) expansion is ignored which in turn saves
+building a temporary token list.
+
+\startbuffer
+\edefcsname FooA\endcsname{this is foo} \meaningasis\FooA\crlf
+\cdefcsname FooB\endcsname{this is foo} \meaningasis\FooB\par
+\stopbuffer
+
+\typebuffer {\tttf \getbuffer}
+
+\stopnewprimitive
+
+\startnewprimitive[title={\prm {lettonothing}}]
+
+This one let's a control sequence to nothing. Assuming that \tex {empty}
+is indeed empty, these two lines are equivalent.
+
+\starttyping
+\let \foo\empty
+\lettonothing\oof
+\stoptyping
+
+\stopnewprimitive
+
+\startnewprimitive[title={\prm {glettonothing}}]
+
+This is the global companion of \prm {lettonothing}.
+
+\stopnewprimitive
+
+\startnewprimitive[title={\prm {norelax}}]
+
+The rationale for this command can be shown by a few examples:
+
+\startbuffer
+\dimen0 1pt \dimen2 1pt \dimen4 2pt
+\edef\testa{\ifdim\dimen0=\dimen2\norelax N\else Y\fi}
+\edef\testb{\ifdim\dimen0=\dimen2\relax N\else Y\fi}
+\edef\testc{\ifdim\dimen0=\dimen4\norelax N\else Y\fi}
+\edef\testd{\ifdim\dimen0=\dimen4\relax N\else Y\fi}
+\edef\teste{\norelax}
+\stopbuffer
+
+\typebuffer
+
+The five meanings are:
+
+\start \getbuffer \starttabulate[|T|T|]
+\NC \string\testa \NC \meaning\testa \NC \NR
+\NC \string\testb \NC \meaning\testb \NC \NR
+\NC \string\testc \NC \meaning\testc \NC \NR
+\NC \string\testd \NC \meaning\testd \NC \NR
+\NC \string\teste \NC \meaning\teste \NC \NR
+\stoptabulate \stop
+
+So, the \prm {norelax} acts like \prm {relax} but is not pushed back as
+usual (in some cases).
+
+\stopnewprimitive
+
+\startnewprimitive[title={\prm {swapcsvalues}}]
+
+Because we mention some \type {def} and \type {let} primitives here, it makes
+sense to also mention a primitive that will swap two values (meanings). This one
+has to be used with care. Of course that what gets swapped has to be of the same
+type (or at least similar enough not to cause issues). Registers for instance
+store their values in the token, but as soon as we are dealing with token lists
+we also need to keep an eye on reference counting. So, to some extend this is
+an experimental feature.
+
+\stopnewprimitive
+
+\startnewprimitive[title={\prm {integerdef}}]
+
+You can alias to a count (integer) register with \prm {countdef}:
+
+\starttyping
+\countdef\MyCount134
+\stoptyping
+
+Afterwards the next two are equivalent:
+
+\starttyping
+\MyCount = 99
+\count1234 = 99
+\stoptyping
+
+where \type {\MyCount} can be a bit more efficient because no index needs to be
+scanned. However, in terms of storage the value (here 99) is always in the register
+so \type {\MyCount} has to get there. This indirectness has the benefit that directly
+setting the value is reflected in the indirect accessor.
+
+\starttyping
+\integerdef\MyCount = 99
+\stoptyping
+
+This primitive also defines a numeric equivalent but this time the number is stored
+with the equivalent. This means that:
+
+\starttyping
+\let\MyCopyOfCount = \MyCount
+\stoptyping
+
+will store the {\em current} value of \type {\MyCount} in \type {\MyCopyOfCount} and
+changing either of them is not reflected in the other.
+
+The usual \prm {advance}, \prm {multiply} and \prm {divide} can be used with these
+integers and they behave like any number. But compared to registers they are actually
+more a constant.
+
+\stopnewprimitive
+
+\startnewprimitive[title={\prm {dimensiondef}}]
+
+A variant of \prm {integerdef} is:
+
+\starttyping
+\dimensiondef\MyDimen = 1234pt
+\stoptyping
+
+The properties are comparable to the ones described in the section \prm
+{integerdef}.
+
+\stopnewprimitive
+
+\startnewprimitive[title={\prm {gluespecdef}}]
+
+A variant of \prm {integerdef} and \prm {dimensiondef} is:
+
+\starttyping
+\gluespecdef\MyGlue = 3pt plus 2pt minus 1pt
+\stoptyping
+
+The properties are comparable to the ones described in the previous sections.
+
+\stopnewprimitive
+
+\startnewprimitive[title={\prm {mugluespecdef}}]
+
+A variant of \prm {gluespecdef} that expects \type {mu} units is:
+
+\starttyping
+\mugluespecdef\MyGlue = 3mu plus 2mu minus 1mu
+\stoptyping
+
+The properties are comparable to the ones described in the previous sections.
+
+\stopnewprimitive
+
+\startnewprimitive[title={\prm {advanceby}}]
+
+This is slightly more efficient variant of \prm {advance} that doesn't look for
+\type {by} and therefore, if one is missing, doesn't need to push back the last
+seen token. Using \prm {advance} with \type {by} is nearly as efficient but takes
+more tokens.
+
+\stopnewprimitive
+
+\startnewprimitive[title={\prm {multiplyby}}]
+
+This is slightly more efficient variant of \prm {multiply} that doesn't look for
+\type {by}. See previous section.
+
+\stopnewprimitive
+
+\startnewprimitive[title={\prm {divideby}}]
+
+This is slightly more efficient variant of \prm {divide} that doesn't look for
+\type {by}. See previous section.
+
+\stopnewprimitive
+
+\startnewprimitive[title={\prm {localcontrolledloop}}]
+
+As with more of the primitives discussed here, there is a manual in the \quote
+{lowlevel} subset that goes into more detail. So, here a simple example has to
+do:
+
+\startbuffer
+\localcontrolledloop 1 100 1 {%
+ \ifnum\currentloopiterator>6\relax
+ \quitloop
+ \else
+ [\number\currentloopnesting:\number\currentloopiterator]
+ \localcontrolledloop 1 8 1 {%
+ (\number\currentloopnesting:\number\currentloopiterator)
+ }\par
+ \fi
+}
+\stopbuffer
+
+\typebuffer
+
+Here we see the main loop primitive being used nested. The code shows how we can
+\prm {quitloop} and have access to the \prm {currentloopiterator} as well as the
+nesting depth \prm {currentloopnesting}.
+
+\startpacked \getbuffer \stoppacked
+
+Be aware of the fact that \prm {quitloop} will end the loop at the {\em next}
+iteration so any content after it will show up. Normally this one will be issued
+in a condition and we want to end that properly. Also keep in mind that because
+we use local control (a nested \TEX\ expansion loop) anything you feed back can
+be injected out of order.
+
+The three numbers can be separated by an equal sign which is a trick to avoid
+look ahead issues that can result from multiple serialized numbers without spaces
+that indicate the end of sequence of digits.
+
+\stopnewprimitive
+
+\startnewprimitive[title={\prm {expandedloop}}]
+
+This variant of the previously introduced \prm {localcontrolledloop} doesn't
+enter a local branch but immediately does its work. This means that it can be
+used inside an expansion context like \prm {edef}.
+
+\startbuffer
+\edef\whatever
+ {\expandedloop 1 10 1
+ {\scratchcounter=\the\currentloopiterator\relax}}
+
+\meaningasis\whatever
+\stopbuffer
+
+\typebuffer
+
+\start \veryraggedright \tt\tfx \getbuffer \stop \blank
+
+The next section shows a companion primitive.
+
+\stopnewprimitive
+
+\startnewprimitive[title={\prm {unexpandedloop}}]
+
+As follow up on \prm {expandedloop} we now show its counterpart:
+
+\startbuffer
+\edef\whatever
+ {\unexpandedloop 1 10 1
+ {\scratchcounter=\the\currentloopiterator\relax}}
+
+\meaningasis\whatever
+\stopbuffer
+
+\typebuffer
+
+\start \veryraggedright \tt\tfx \getbuffer \stop \blank
+
+The difference between the (un)expanded loops and a local controlled
+one is shown here. Watch the out of order injection of \type {A}'s.
+
+\startbuffer
+\edef\TestA{\localcontrolledloop 1 5 1 {A}} % out of order
+\edef\TestB{\expandedloop 1 5 1 {B}}
+\edef\TestC{\unexpandedloop 1 5 1 {C\relax}}
+\stopbuffer
+
+\typebuffer \getbuffer
+
+We show the effective definition as well as the outcome of using them
+
+\startbuffer
+\meaningasis\TestA
+\meaningasis\TestB
+\meaningasis\TestC
+
+A: \TestA
+B: \TestB
+C: \TestC
+\stopbuffer
+
+\typebuffer \startlines \tttf \getbuffer \stoplines
+
+Watch how because it is empty \type {\TestA} has become a constant macro because
+that's what deep down empty boils down to.
+
+\stopnewprimitive
+
+\startsubject[title=Obsolete]
+
+The \LUAMETATEX\ engine has more than its \LUATEX\ ancestor but it also has less.
+Because in the end the local control mechanism performed quite okay I decided to
+drop the \prm {immediateassignment} and \prm {immediateassigned} variants. They
+sort of used the same trick so there isn't much to gain and it was less generic
+(read: error prone).
+
+% \startnewprimitive[title={\prm {immediateassignment}}]
+%
+% Assignments are not expandable which means that you cannot define fully
+% expandable macros that have assignments. But, there is a way out of this:
+%
+% \startbuffer
+% \scratchcounter = 10
+% \edef\whatever{%
+% (\the\scratchcounter)
+% \immediateassignment\scratchcounter\numexpr\scratchcounter+10\relax
+% \immediateassignment\advance\scratchcounter -5
+% (\the\scratchcounter)
+% }
+% \meaning\whatever
+% \stopbuffer
+%
+% \typebuffer
+%
+% Don't expect miracles: you can't mix|-|in content or unexpandable tokens as they
+% will either show up or quit the scanning.
+%
+% {\getbuffer}
+%
+% \stopnewprimitive
+%
+% \startnewprimitive[title={\prm {immediateassigned}}]
+%
+% This is the multi|-|token variant of the primitive mentioned in the previous
+% section.
+%
+% \startbuffer
+% \scratchcounter = 10
+% \edef\whatever{%
+% (\the\scratchcounter)
+% \immediateassigned{
+% \scratchcounter\numexpr\scratchcounter+10\relax
+% \advance\scratchcounter -5
+% }%
+% (\the\scratchcounter)
+% }
+% \meaning\whatever
+% \stopbuffer
+%
+% \typebuffer
+%
+% The results are the same as in the previous section:
+%
+% {\getbuffer}
+%
+% \stopnewprimitive
+
+\stopsubject
+
\page
% % It doesn't make sense to typeset this, also because it makes me feel old.
@@ -2375,4 +3298,87 @@ Hans Hagen \crlf Hasselt NL
\stopsubject
+\popoverloadmode
+
+\startluacode
+ local match = string.match
+ local find = string.match
+
+ function document.CheckCompleteness()
+ local primitives = token.getprimitives()
+ local luametatex = { }
+ local indexed = { }
+
+ for i=1,#primitives do
+ local p = primitives[i]
+ if p[4] == 4 then
+ local name = p[3]
+ if find(name,"U") or find (name,"math") then
+ -- ignore
+ luametatex[name] = nil
+ else
+ luametatex[name] = false
+ end
+ end
+ end
+
+ local function collect(index)
+ if index then
+ local data = index.entries
+ for i=1,#data do
+ local name = match(data[i].list[1][1],"\\tex%s*{(.-)}") or ""
+ if luametatex[name] == false then
+ luametatex[name] = true
+ end
+ indexed[name] = true
+ end
+ end
+ end
+
+ collect(structures.registers.collected and structures.registers.collected.index)
+
+ context("To be checked primitives:")
+
+ context.blank()
+ context.startcolumns { n = 2 }
+ for k, v in table.sortedhash(luametatex) do
+ if not v then
+ context.dontleavehmode()
+ context.type(k)
+ context.crlf()
+ end
+ end
+ context.stopcolumns()
+ context.blank()
+
+ context("Indexed primitives:")
+
+ context.blank()
+ context.startcolumns { n = 2 }
+ for k, v in table.sortedhash(indexed) do
+ context.dontleavehmode()
+ if luametatex[k] == true then
+ context("\\color[darkgreen]{\\tttf %s}",k)
+ elseif luametatex[k] == false then
+ context("\\color[darkred]{\\tttf %s}",k)
+ else
+ context("{\\tttf %s}",k)
+ end
+ context.crlf()
+ end
+ context.stopcolumns()
+ context.blank()
+
+ end
+\stopluacode
+
+% \startmode[atpragma]
+% \startluacode
+% context.page()
+% document.CheckCompleteness()
+% \stopluacode
+% \stopmode
+
+\stopbodymatter
+
\stoptext
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/readme/mreadme.tex b/Master/texmf-dist/doc/context/sources/general/manuals/readme/mreadme.tex
index 950f4a64c0f..cf257f5f4b7 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/readme/mreadme.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/readme/mreadme.tex
@@ -1,7 +1,7 @@
-% interface=en language=uk
+% language=us runpath=texruns:manuals/readme
% author : Hans Hagen
-% copyright : PRAGMA ADE & ConTeXt Development Team
+% copyright : ConTeXt Development Team
% license : Creative Commons Attribution ShareAlike 4.0 International
% reference : pragma-ade.nl | contextgarden.net | texlive (related) distributions
% origin : the ConTeXt distribution
@@ -54,8 +54,8 @@
\startsubject[title={Introduction}]
-What licence suits best for a \TEX\ like system is a matter of taste. Personally
-we dislike any licence that needs more than a few pages of dense legal code to
+What license suits best for a \TEX\ like system is a matter of taste. Personally
+we dislike any license that needs more than a few pages of dense legal code to
get the message across. A \TEX\ related system like \CONTEXT\ is a hybrid of
programs, scripts and|/|or macro code as well as documentation and sample code,
including graphics. \TEX\ related systems also have a long standing tradition of
@@ -64,12 +64,12 @@ providing support structures for users. In order to make support feasible, a
way the related files are named and organized in a tree structure. Even a small
change in one of the elements may let such a system behave differently than
manuals suggest. Swap a font, change some style defaults, leave out some pieces,
-and users may end up in confusion. A licence does not give a user any guarantees!
+and users may end up in confusion. A license does not give a user any guarantees!
In order to satisfy those responsible for distributing \CONTEXT, we need to
-choose a licence that makes them feel comfortable. Unfortunately we don't feel
-that comfortable with a licence that does not provide the guarantees that a
-system will not be adapted in such ways that the advertised behaviour changes. On
+choose a license that makes them feel comfortable. Unfortunately we don't feel
+that comfortable with a license that does not provide the guarantees that a
+system will not be adapted in such ways that the advertised behavior changes. On
the other hand, it is the responsibility of those distributing and extending the
system to make sure that this does not happen. However, users should not
automatically assume that what they get shipped is the same as the original,
@@ -103,9 +103,9 @@ The documentation can be downloaded from our website or the Wiki. Some manuals
ship with source code. We might ship more source code but only when the source is
stable and clean and can serve as an example.
-That said, what licence does apply? We need to distinguish between things that
+That said, what license does apply? We need to distinguish between things that
resemble a program on the one hand and documentation on the other hand. We
-(currently) use a different licence for either of them.
+(currently) use a different license for either of them.
\stopsubject
@@ -118,8 +118,8 @@ distributed under the
\goto{Creative Commons GNU GPL}[url(gpl-simple)]
\stopnarrower
-For practical purposes distributers may also choose the \LATEX\ project licence,
-which is considered to be a bit more \TEX\ friendly. (BSD alike licences also
+For practical purposes distributors may also choose the \LATEX\ project license,
+which is considered to be a bit more \TEX\ friendly. (BSD alike licenses also
apply well for \CONTEXT.)
In practice, users may forget about the legal part, if only because I haven't
@@ -138,7 +138,7 @@ license, it grants to you the four following freedoms:
The freedom to study how the program works and adapt it to your needs.
\stopitem
\startitem
- The freedom to redistribute copies so you can help your neighbour.
+ The freedom to redistribute copies so you can help your neighbor.
\stopitem
\startitem
The freedom to improve the program and release your improvements to the
@@ -195,7 +195,7 @@ Here are a few recommendations in case you want to distribute, extend of embed
\stopitem
\startitem
- Put your own code in the right subpaths, i.e.\ modules approved by the
+ Put your own code in the right sub paths, i.e.\ modules approved by the
development team under \type {.../third}, and styles and whatever else under
\type {.../user}. This way your code will not interfere with existing code
and updating will give less problems. Keep in mind that \TEX\ systems have
@@ -245,7 +245,7 @@ Here are a few recommendations in case you want to distribute, extend of embed
\startsubject[title={Documents}]
-The documentation is provided under another Creative Commons licence:
+The documentation is provided under another Creative Commons license:
\startnarrower
\goto{Attribution ShareAlike}[url(bysa-simple)]
@@ -370,7 +370,7 @@ The developers can be met at:
\startsubject[title={Disclaimer}]
-To play safe we include a disclaimer here, taken from the BSD style licence. For
+To play safe we include a disclaimer here, taken from the BSD style license. For
some reason such a text is always in unreadable capitals, so \unknown
\start \txx \blue
@@ -386,8 +386,8 @@ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
\stop
-\unknown\ and don't bother discussing licence issues and related things with us
-for the mere sake of discussing licence stuff.
+\unknown\ and don't bother discussing license issues and related things with us
+for the mere sake of discussing license stuff.
\stopsubject
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/rules/rules-mkiv.tex b/Master/texmf-dist/doc/context/sources/general/manuals/rules/rules-mkiv.tex
index e1d8acfaac6..5571a345ad3 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/rules/rules-mkiv.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/rules/rules-mkiv.tex
@@ -1,7 +1,7 @@
-% interface=en engine=luatex language=uk
+% language=us runpath=texruns:manuals/rules
% author : Hans Hagen
-% copyright : PRAGMA ADE & ConTeXt Development Team
+% copyright : ConTeXt Development Team
% license : Creative Commons Attribution ShareAlike 4.0 International
% reference : pragma-ade.nl | contextgarden.net | texlive (related) distributions
% origin : the ConTeXt distribution
@@ -294,6 +294,20 @@ Sapolsky : \xbartwo{\samplefile{sapolsky}\removeunwantedspaces}\par
\typebuffer \getbuffer
+As a reminder that one can keep things simple, here are a few more examples that
+use defaults (and no colors):
+
+\startbuffer
+\underbar {\underbar {\samplefile{ward}}}\blank
+\underbar {\underdot {\samplefile{ward}}}\blank
+\underbar {\underdot {\samplefile{ward}}}\blank
+\underdot {\underbar {\samplefile{ward}}}\blank
+\underbars{\underdot {\samplefile{ward}}}\blank
+\underbar {\underdots{\samplefile{ward}}}\blank
+\underdots{\underdots{\samplefile{ward}}}\blank
+\stopbuffer
+
+\typebuffer {\setupbars[foregroundcolor=,color=]\getbuffer}
\stopsubject
@@ -752,6 +766,81 @@ Or rendered:
\getbuffer
\stoplinecorrection
+% \frule
+% width 10cm
+% height 2cm
+% depth 1cm
+% line 1pt
+% radius 3mm
+% \relax x
+
+The primitive \type {\leaders} can also be used with these \type {\frule}s so
+here is an example with and without:
+
+\startbuffer
+test \leaders \hrule height 1mm \hfill test \par
+test \leaders \frule height 6mm depth 3mm radius 1mm\hfill test \par
+\stopbuffer
+
+\typebuffer
+
+As you can see, the leader basically stretches the rule. That operation happens
+in the backend code; the frontend is only interested in the height and depth
+while the width is glue that can stretch.
+
+\startlinecorrection
+\getbuffer
+\stoplinecorrection
+
+Here are two more:
+
+\startbuffer
+\startuseMPgraphic{demoleader}
+ fill
+ unitcircle xysized (RuleWidth,RuleHeight+RuleDepth)
+ withcolor RuleColor ;
+\stopuseMPgraphic
+
+test {\red \leaders \frule
+ height 6mm
+ depth 3mm
+ type mp
+ data {\includeMPgraphic{demoleader}}
+\hfill} test
+\stopbuffer
+
+\typebuffer
+
+\startlinecorrection
+\getbuffer
+\stoplinecorrection
+
+And:
+
+\startbuffer
+\startuseMPgraphic{demoleader}
+ drawdblarrow (0,RuleHeight) -- (RuleWidth,RuleHeight)
+ withpen pencircle scaled RuleThickness
+ withcolor RuleColor ;
+\stopuseMPgraphic
+
+test {\red \leaders \frule
+ height 1mm % we need at least some dimensions
+ type mp
+ line 1mm
+ data {\includeMPgraphic{demoleader}}
+\hfill} test
+\stopbuffer
+
+\typebuffer
+
+\startlinecorrection
+\getbuffer
+\stoplinecorrection
+
+The combination of \TEX\ and \METAPOST\ driven by \LUA\ (which is hidden from the
+user here) is quite powerful and has a pretty good performance too.
+
The \type {\blackrule} command is the more high level way to inject a rule.
\startbuffer
@@ -1003,6 +1092,98 @@ The auto variants will switch between colors:
\typebuffer \start\getbuffer[setup]\getbuffer\stop
+\stopsubject
+
+\startsubject[title=Framing]
+
+The \TEX\ engine only has text and rules and all things other graphic has to come
+from elsewhere. However, as \quote {elsewhere} is rather integrated in \CONTEXT\
+users won't notice this limitation. It does however means that for historic
+reasons we have some interesting low level phenomena. One of the oldest commands
+in \CONTEXT\ is \type {\framed} which as the name indicates can draw a frame
+around something. This command is demonstrated in many places so here we stick to
+some remarks about the rules. Watch the following:
+
+\startbuffer
+\definecolor[t-one][r=.6,t=.5,a=1]
+\definecolor[t-two][g=.6,t=.5,a=1]
+\stopbuffer
+
+\typebuffer \getbuffer
+
+\startbuffer
+\startoverlay
+ {\framed
+ [framecolor=t-one,rulethickness=3mm,offset=3mm,frame=closed]
+ {Just a bit of text!}}
+ {\framed
+ [framecolor=t-two,rulethickness=3mm,offset=8mm,frame=on]
+ {Just a bit of text!}}
+\stopoverlay
+\stopbuffer
+
+\typebuffer
+
+When you look closely you will notice the difference: check out the corners.
+
+\startlinecorrection
+\getbuffer
+\stoplinecorrection
+
+The normal rule drawing happens with overlaps and the reason for that is that
+\TEX\ can only draw vertical and horizontal rules. We can of course avoid overlap
+but quite often (and certainly in the past) viewers would show small white
+stripes due to rounding errors and rendering artifacts. So, overlaps were a safe
+bet. However, as nowadays we have better control over the backend the additional
+\type {closed} option will draw the path as one.
+
+\startbuffer
+\dontleavehmode
+\framed
+ [width=4cm,height=15mm,rulethickness=3mm,framecolor=t-one,frame=off,
+ rightframe=on,leftframe=on,topframe=on,bottomframe=on]
+ {one}\quad
+\framed
+ [width=4cm,height=15mm,rulethickness=3mm,framecolor=t-two,frame=off,
+ rightframe=small,leftframe=small,topframe=small,bottomframe=small]
+ {two}\quad
+\framed
+ [width=4cm,height=15mm,rulethickness=3mm,framecolor=t-two,frame=off,
+ rightframe=small,leftframe=small,topframe=small,bottomframe=on]
+ {three}
+\stopbuffer
+
+\typebuffer
+
+This example shows another variant of frames, probably unknown (and not needed)
+to many users:
+
+\startlinecorrection
+\getbuffer
+\stoplinecorrection
+
+\stopsubject
+
+\startsubject[title=Examples]
+
+There are quite some examples in the test suite, mailing list archive and wiki,
+so here only a few are given for you to run:
+
+% example by WS on the list:
+
+\starttyping
+\definefiller
+ [dots]
+ [left=\dontleavehmode,
+ right=\hskip\zeropoint\par]
+
+\samplefile{knuth} \dorecurse{5}{\filler[dots]}
+\samplefile{knuth} \dorecurse{5}{\hairline}
+\samplefile{knuth} \thinrules[n=5]
+\stoptyping
+
+All of these produce the text plus some visual cure where to fill in
+something.
\stopsubject
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/spacing/spacing-contents.tex b/Master/texmf-dist/doc/context/sources/general/manuals/spacing/spacing-contents.tex
index d7c709e2ec8..51d5eba6fe0 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/spacing/spacing-contents.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/spacing/spacing-contents.tex
@@ -1,3 +1,5 @@
+% language=us runpath=texruns:manuals/spacing
+
\startcomponent spacing-contents
\starttitle[title=Contents]
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/spacing/spacing-introduction.tex b/Master/texmf-dist/doc/context/sources/general/manuals/spacing/spacing-introduction.tex
index d4d385c5e72..8ac41cd54de 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/spacing/spacing-introduction.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/spacing/spacing-introduction.tex
@@ -1,3 +1,5 @@
+% language=us runpath=texruns:manuals/spacing
+
\environment spacing-style
\startcomponent spacing-introduction
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/spacing/spacing-linecorrection.tex b/Master/texmf-dist/doc/context/sources/general/manuals/spacing/spacing-linecorrection.tex
index 525dd74901b..dcbe4a06b33 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/spacing/spacing-linecorrection.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/spacing/spacing-linecorrection.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us runpath=texruns:manuals/spacing
\environment spacing-style
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/spacing/spacing-mkiv.tex b/Master/texmf-dist/doc/context/sources/general/manuals/spacing/spacing-mkiv.tex
index 0f32e4d30a0..406e3eb7571 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/spacing/spacing-mkiv.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/spacing/spacing-mkiv.tex
@@ -1,5 +1,7 @@
+% language=us runpath=texruns:manuals/spacing
+
% author : Hans Hagen
-% copyright : PRAGMA ADE & ConTeXt Development Team
+% copyright : ConTeXt Development Team
% license : Creative Commons Attribution ShareAlike 4.0 International
% reference : pragma-ade.nl | contextgarden.net | texlive (related) distributions
% origin : the ConTeXt distribution
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/spacing/spacing-periods.tex b/Master/texmf-dist/doc/context/sources/general/manuals/spacing/spacing-periods.tex
index 8d493b9a987..312e5eadb36 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/spacing/spacing-periods.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/spacing/spacing-periods.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us runpath=texruns:manuals/spacing
\environment spacing-style
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/spacing/spacing-spaces.tex b/Master/texmf-dist/doc/context/sources/general/manuals/spacing/spacing-spaces.tex
index 0d7f64379d0..7184c10dc02 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/spacing/spacing-spaces.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/spacing/spacing-spaces.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us runpath=texruns:manuals/spacing
\environment spacing-style
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/spacing/spacing-style.tex b/Master/texmf-dist/doc/context/sources/general/manuals/spacing/spacing-style.tex
index 5514df72963..f8b2ea997d4 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/spacing/spacing-style.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/spacing/spacing-style.tex
@@ -1,3 +1,5 @@
+% language=us runpath=texruns:manuals/spacing
+
\startenvironment spacing-style
\usemodule[abbreviations-words,typesetting]
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/spacing/spacing-titlepage.tex b/Master/texmf-dist/doc/context/sources/general/manuals/spacing/spacing-titlepage.tex
index 1f21d769a8d..74c42d77ce0 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/spacing/spacing-titlepage.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/spacing/spacing-titlepage.tex
@@ -1,3 +1,5 @@
+% language=us runpath=texruns:manuals/spacing
+
\environment spacing-style
\startcomponent spacing-titlepage
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/spreadsheets/spreadsheets-mkiv.tex b/Master/texmf-dist/doc/context/sources/general/manuals/spreadsheets/spreadsheets-mkiv.tex
index a95ddfd7994..70de1f70b30 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/spreadsheets/spreadsheets-mkiv.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/spreadsheets/spreadsheets-mkiv.tex
@@ -1,7 +1,7 @@
-% language=uk
+% language=us
% author : Hans Hagen
-% copyright : PRAGMA ADE & ConTeXt Development Team
+% copyright : ConTeXt Development Team
% license : Creative Commons Attribution ShareAlike 4.0 International
% reference : pragma-ade.nl | contextgarden.net | texlive (related) distributions
% origin : the ConTeXt distribution
@@ -752,7 +752,7 @@ will be added in the future but it all depends on usage.
\NC author \NC \documentvariable{author}, \documentvariable{affiliation}, \documentvariable{location} \NC \NR
\NC version \NC \currentdate \NC \NR
\NC website \NC \documentvariable{website} \endash\ \documentvariable{support} \NC \NR
-\NC copyright \NC \symbol[cc][cc-by-sa-nc] \NC \NR
+\NC copyright \NC \symbol[cc][cc-by-sa] \NC \NR
\stoptabulate
\stopsubject
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 27be160f7e7..bc020288068 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
@@ -1,7 +1,7 @@
-% language=uk
+% language=us runpath=texruns:manuals/sql
% author : Hans Hagen
-% copyright : PRAGMA ADE & ConTeXt Development Team
+% copyright : ConTeXt Development Team
% license : Creative Commons Attribution ShareAlike 4.0 International
% reference : pragma-ade.nl | contextgarden.net | texlive (related) distributions
% origin : the ConTeXt distribution
@@ -583,7 +583,7 @@ In this example we typeset the (small) table):
\NC author \NC \documentvariable{author}, \documentvariable{affiliation}, \documentvariable{location} \NC \NR
\NC version \NC \currentdate \NC \NR
\NC website \NC \documentvariable{website} \endash\ \documentvariable{support} \NC \NR
-\NC copyright \NC \symbol[cc][cc-by-sa-nc] \NC \NR
+\NC copyright \NC \symbol[cc][cc-by-sa] \NC \NR
\stoptabulate
\stopsection
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/start/en/hasseltbook.tex b/Master/texmf-dist/doc/context/sources/general/manuals/start/en/hasseltbook.tex
index 9c0d319f57b..1e25ba7fd29 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/start/en/hasseltbook.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/start/en/hasseltbook.tex
@@ -1,4 +1,3 @@
-
\starttext
\startstandardmakeup
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/start/en/ma-cb-en-commands.tex b/Master/texmf-dist/doc/context/sources/general/manuals/start/en/ma-cb-en-commands.tex
index df0d2a29315..a3328575065 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/start/en/ma-cb-en-commands.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/start/en/ma-cb-en-commands.tex
Binary files differ
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/start/en/ma-cb-en-usersetups.tex b/Master/texmf-dist/doc/context/sources/general/manuals/start/en/ma-cb-en-usersetups.tex
index 2d89e937a46..1d63688fb1a 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/start/en/ma-cb-en-usersetups.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/start/en/ma-cb-en-usersetups.tex
@@ -46,7 +46,7 @@ sign in this first line not as a comment.
The preamble can have a meaning for both \CONTEXT\ and \SCITE:
\starttyping
-% engine=pdftex interface=en modes=screen language=uk
+% engine=pdftex interface=en modes=screen language=us
\starttext
Hello Hasselt.
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/start/en/ma-cb-en.tex b/Master/texmf-dist/doc/context/sources/general/manuals/start/en/ma-cb-en.tex
index 2e7f7eac4b8..723e5a46f21 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/start/en/ma-cb-en.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/start/en/ma-cb-en.tex
@@ -1,4 +1,4 @@
-% interface=english language=uk modes=screen,bound
+% interface=english language=us modes=screen,bound
% \showframe
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/steps/steps-mkiv.tex b/Master/texmf-dist/doc/context/sources/general/manuals/steps/steps-mkiv.tex
index f0ca51613d4..90c22c69a25 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/steps/steps-mkiv.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/steps/steps-mkiv.tex
@@ -1,5 +1,7 @@
+% language=us runpath=texruns:manuals/steps
+
% author : Hans Hagen
-% copyright : PRAGMA ADE & ConTeXt Development Team
+% copyright : ConTeXt Development Team
% license : Creative Commons Attribution ShareAlike 4.0 International
% reference : pragma-ade.nl | contextgarden.net | texlive (related) distributions
% origin : the ConTeXt distribution
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/still/still-backend.tex b/Master/texmf-dist/doc/context/sources/general/manuals/still/still-backend.tex
index d3e5e14d132..1b1371bed84 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/still/still-backend.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/still/still-backend.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
\environment still-environment
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/still/still-expanding.tex b/Master/texmf-dist/doc/context/sources/general/manuals/still/still-expanding.tex
index 4b21a22cb66..f7ec4a97a8e 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/still/still-expanding.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/still/still-expanding.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
\environment still-environment
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/still/still-math.tex b/Master/texmf-dist/doc/context/sources/general/manuals/still/still-math.tex
index 9918b5c79e3..759aeb6233b 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/still/still-math.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/still/still-math.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
\environment still-environment
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/still/still-one.tex b/Master/texmf-dist/doc/context/sources/general/manuals/still/still-one.tex
index 7d0c392c748..7c830291b9a 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/still/still-one.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/still/still-one.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
\usemodule[art-01,abr-02] \setupbodyfont[11pt]
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/still/still-opentypemath.tex b/Master/texmf-dist/doc/context/sources/general/manuals/still/still-opentypemath.tex
index 43a34086644..33c35da331e 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/still/still-opentypemath.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/still/still-opentypemath.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
\environment still-environment
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/still/still-profiling.tex b/Master/texmf-dist/doc/context/sources/general/manuals/still/still-profiling.tex
index 8950864d6a3..cfd0cd232eb 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/still/still-profiling.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/still/still-profiling.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
\environment still-environment
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/still/still-simple.tex b/Master/texmf-dist/doc/context/sources/general/manuals/still/still-simple.tex
index 9416dd0289d..c4bad3770e5 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/still/still-simple.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/still/still-simple.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
\environment still-environment
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/still/still-tokens.tex b/Master/texmf-dist/doc/context/sources/general/manuals/still/still-tokens.tex
index 34784cdf332..e01c5f377a1 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/still/still-tokens.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/still/still-tokens.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us
\environment still-environment
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/still/still.tex b/Master/texmf-dist/doc/context/sources/general/manuals/still/still.tex
index d7a7ff447ae..5436a0e0a3d 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/still/still.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/still/still.tex
@@ -1,5 +1,5 @@
% author : Hans Hagen
-% copyright : PRAGMA ADE & ConTeXt Development Team
+% copyright : ConTeXt Development Team
% license : Creative Commons Attribution ShareAlike 4.0 International
% reference : pragma-ade.nl | contextgarden.net | texlive (related) distributions
% origin : the ConTeXt distribution
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
index 802efcf3d4a..e0575fee339 100644
--- 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
@@ -362,4 +362,148 @@ return {
<circle cx="60" cy="110" r="3" fill="red" />
</svg>
]],
+ -- https://developer.mozilla.org/en-US/docs/Web/SVG/Tutorial/Gradients
+ [[
+ <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 width="120" height="240" version="1.1" xmlns="http://www.w3.org/2000/svg">
+ <defs>
+ <linearGradient id="Gradient1">
+ <stop class="stop1" offset="0%"/>
+ <stop class="stop2" offset="50%"/>
+ <stop class="stop3" offset="100%"/>
+ </linearGradient>
+ <linearGradient id="Gradient2" x1="0" x2="0" y1="0" y2="1">
+ <stop offset="0%" stop-color="red"/>
+ <stop offset="50%" stop-color="black" stop-opacity="0"/>
+ <stop offset="100%" stop-color="blue"/>
+ </linearGradient>
+ <style type="text/css">
+ #rect1 { fill: url(#Gradient1); }
+ .stop1 { stop-color: red; }
+ .stop2 { stop-color: black; stop-opacity: 0; }
+ .stop3 { stop-color: blue; }
+ </style>
+ </defs>
+ <rect id="rect1" x="10" y="10" rx="15" ry="15" width="100" height="100"/>
+ <rect x="10" y="120" rx="15" ry="15" width="100" height="100" fill="url(#Gradient2)"/>
+ </svg>
+ ]==],
+ [[
+ <svg width="120" height="240" version="1.1" xmlns="http://www.w3.org/2000/svg">
+ <defs>
+ <radialGradient id="RadialGradient1">
+ <stop offset="0%" stop-color="red"/>
+ <stop offset="100%" stop-color="blue"/>
+ </radialGradient>
+ <radialGradient id="RadialGradient2" cx="0.25" cy="0.25" r="0.25">
+ <stop offset="0%" stop-color="red"/>
+ <stop offset="100%" stop-color="blue"/>
+ </radialGradient>
+ </defs>
+ <rect x="10" y="10" rx="15" ry="15" width="100" height="100" fill="url(#RadialGradient1)"/>
+ <rect x="10" y="120" rx="15" ry="15" width="100" height="100" fill="url(#RadialGradient2)"/>
+ </svg>
+ ]],
+ [[
+ <svg width="120" height="120" version="1.1"
+ xmlns="http://www.w3.org/2000/svg">
+ <defs>
+ <radialGradient id="Gradient"
+ cx="0.5" cy="0.5" r="0.5" fx="0.25" fy="0.25">
+ <stop offset="0%" stop-color="red"/>
+ <stop offset="100%" stop-color="blue"/>
+ </radialGradient>
+ </defs>
+ <rect x="10" y="10" rx="15" ry="15" width="100" height="100" fill="url(#Gradient)" stroke="black" stroke-width="2"/>
+ <circle cx="60" cy="60" r="50" fill="transparent" stroke="white" stroke-width="2"/>
+ <circle cx="35" cy="35" r="2" fill="white" stroke="white"/>
+ <circle cx="60" cy="60" r="2" fill="white" stroke="white"/>
+ <text x="38" y="40" fill="white" font-family="sans-serif" font-size="10pt">(fx,fy)</text>
+ <text x="63" y="63" fill="white" font-family="sans-serif" font-size="10pt">(cx,cy)</text>
+ </svg>
+ ]],
+ [[
+ <svg width="220" height="220" version="1.1" xmlns="http://www.w3.org/2000/svg">
+ <defs>
+ <radialGradient id="GradientPad"
+ cx="0.5" cy="0.5" r="0.4" fx="0.75" fy="0.75"
+ spreadMethod="pad">
+ <stop offset="0%" stop-color="red"/>
+ <stop offset="100%" stop-color="blue"/>
+ </radialGradient>
+ <radialGradient id="GradientRepeat"
+ cx="0.5" cy="0.5" r="0.4" fx="0.75" fy="0.75"
+ spreadMethod="repeat">
+ <stop offset="0%" stop-color="red"/>
+ <stop offset="100%" stop-color="blue"/>
+ </radialGradient>
+ <radialGradient id="GradientReflect"
+ cx="0.5" cy="0.5" r="0.4" fx="0.75" fy="0.75"
+ spreadMethod="reflect">
+ <stop offset="0%" stop-color="red"/>
+ <stop offset="100%" stop-color="blue"/>
+ </radialGradient>
+ </defs>
+ <rect x="10" y="10" rx="15" ry="15" width="100" height="100" fill="url(#GradientPad)"/>
+ <rect x="10" y="120" rx="15" ry="15" width="100" height="100" fill="url(#GradientRepeat)"/>
+ <rect x="120" y="120" rx="15" ry="15" width="100" height="100" fill="url(#GradientReflect)"/>
+ <text x="15" y="30" fill="white" font-family="sans-serif" font-size="12pt">Pad</text>
+ <text x="15" y="140" fill="white" font-family="sans-serif" font-size="12pt">Repeat</text>
+ <text x="125" y="140" fill="white" font-family="sans-serif" font-size="12pt">Reflect</text>
+ </svg>
+ ]],
+ [[
+ <svg viewBox="0 0 80 20" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <symbol id="myDot" width="10" height="10" viewBox="0 0 2 2">
+ <circle cx="1" cy="1" r="1" />
+ </symbol>
+ <path d="M0,10 h80 M10,0 v20 M25,0 v20 M40,0 v20 M55,0 v20 M70,0 v20" fill="none" stroke="pink" />
+ <use xlink:href="#myDot" x="5" y="5" style="opacity:1.0" />
+ <use xlink:href="#myDot" x="20" y="5" style="opacity:0.8" />
+ <use xlink:href="#myDot" x="35" y="5" style="opacity:0.6" />
+ <use xlink:href="#myDot" x="50" y="5" style="opacity:0.4" />
+ <use xlink:href="#myDot" x="65" y="5" style="opacity:0.2" />
+ </svg>
+ ]],
+ [[
+ <svg width="200" height="250" version="1.1" xmlns="http://www.w3.org/2000/svg">
+ <rect x="10" y="10" width="30" height="30" stroke="black" fill="transparent" stroke-width="5"/>
+ <rect x="60" y="10" rx="10" ry="10" width="30" height="30" stroke="black" fill="transparent" stroke-width="5"/>
+ <circle cx="25" cy="75" r="20" stroke="red" fill="transparent" stroke-width="5"/>
+ <ellipse cx="75" cy="75" rx="20" ry="5" stroke="red" fill="transparent" stroke-width="5"/>
+ <line x1="10" x2="50" y1="110" y2="150" stroke="orange" stroke-width="5"/>
+ <polyline points="60 110 65 120 70 115 75 130 80 125 85 140 90 135 95 150 100 145" stroke="orange" fill="transparent" stroke-width="5"/>
+ <polygon points="50 160 55 180 70 180 60 190 65 205 50 195 35 205 40 190 30 180 45 180" stroke="green" fill="transparent" stroke-width="5"/>
+ <path d="M20,230 Q40,205 50,230 T90,230" fill="none" stroke="blue" stroke-width="5"/>
+ </svg>
+ ]],
+ [[
+ <svg viewBox="0 0 420 200" xmlns="http://www.w3.org/2000/svg">
+ <radialGradient id="gradient1" gradientUnits="userSpaceOnUse" cx="100" cy="100" r="100" fx="100" fy="100">
+ <stop offset="0%" stop-color="darkblue" />
+ <stop offset="50%" stop-color="skyblue" />
+ <stop offset="100%" stop-color="darkblue" />
+ </radialGradient>
+ <radialGradient id="gradient2" gradientUnits="userSpaceOnUse" cx="100" cy="100" r="100" fx="100" fy="100" gradientTransform="skewX(20) translate(-35, 0)">
+ <stop offset="0%" stop-color="darkblue" />
+ <stop offset="50%" stop-color="skyblue" />
+ <stop offset="100%" stop-color="darkblue" />
+ </radialGradient>
+ <rect x="0" y="0" width="200" height="200" fill="url(#gradient1)" />
+ <xrect x="0" y="0" width="200" height="200" fill="url(#gradient2)" style="transform: translateX(220px);" />
+ <rect x="0" y="0" width="200" height="200" fill="url(#gradient2)" transform="translateX(220px)" />
+ </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
index 11cf338957b..38e589b72e9 100644
--- 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
@@ -1,37 +1,13 @@
-% language=us
+% language=us runpath=texruns:manuals/svg
% \enabletrackers[metapost.svg.result]
% \enabletrackers[metapost.svg.path]
-\enabledirectives[pdf.compact]
+% \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[svg]
\usemodule[abbreviations-logos]
\usemodule[scite]
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/swiglib/swiglib-mkiv.tex b/Master/texmf-dist/doc/context/sources/general/manuals/swiglib/swiglib-mkiv.tex
index 6d9d8af9aea..2545b1173f7 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/swiglib/swiglib-mkiv.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/swiglib/swiglib-mkiv.tex
@@ -1,7 +1,7 @@
-% language=uk
+% language=us
% author : Hans Hagen
-% copyright : PRAGMA ADE & ConTeXt Development Team
+% copyright : ConTeXt Development Team
% license : Creative Commons Attribution ShareAlike 4.0 International
% reference : pragma-ade.nl | contextgarden.net | texlive (related) distributions
% origin : the ConTeXt distribution
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/templates/templates-mkiv.tex b/Master/texmf-dist/doc/context/sources/general/manuals/templates/templates-mkiv.tex
index e46b1de8ab8..6c64485fcda 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/templates/templates-mkiv.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/templates/templates-mkiv.tex
@@ -1,7 +1,7 @@
-% language=uk
+% language=us runpath=texruns:manuals/templates
% author : Hans Hagen
-% copyright : PRAGMA ADE & ConTeXt Development Team
+% copyright : ConTeXt Development Team
% license : Creative Commons Attribution ShareAlike 4.0 International
% reference : pragma-ade.nl | contextgarden.net | texlive (related) distributions
% origin : the ConTeXt distribution
@@ -66,8 +66,8 @@
for j=1 upto m :
fill
unitsquare
- xysized (w,h)
- shifted ((i-1)*w,(j-1)*h)
+ xysized (w+1/5,h+1/5) % a little overlap to get rid of viewer inaccuracies
+ shifted ((i-1)*w-1/10,(j-1)*h-1/10)
withcolor (.5[red,blue] randomized(.75,.75,.75))
;
endfor ;
@@ -279,7 +279,7 @@ possibility is provided.
\NC author \NC \documentvariable{author}, \documentvariable{affiliation}, \documentvariable{location} \NC \NR
\NC version \NC \currentdate \NC \NR
\NC website \NC \documentvariable{website} \endash\ \documentvariable{support} \NC \NR
-\NC copyright \NC \symbol[cc][cc-by-sa-nc] \NC \NR
+\NC copyright \NC \symbol[cc][cc-by-sa] \NC \NR
\stoptabulate
\stopsubject
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/tiptrick/tiptrick.tex b/Master/texmf-dist/doc/context/sources/general/manuals/tiptrick/tiptrick.tex
index 03af8e806a5..67f9da0960b 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/tiptrick/tiptrick.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/tiptrick/tiptrick.tex
@@ -1,5 +1,7 @@
+% language=us runpath=texruns:manuals/tiptrick
+
% author : Hans Hagen
-% copyright : PRAGMA ADE & ConTeXt Development Team
+% copyright : ConTeXt Development Team
% license : Creative Commons Attribution ShareAlike 4.0 International
% reference : pragma-ade.nl | contextgarden.net | texlive (related) distributions
% origin : the ConTeXt distribution
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/tools/tools-mkiv.tex b/Master/texmf-dist/doc/context/sources/general/manuals/tools/tools-mkiv.tex
index b26145d3724..4459648acfb 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/tools/tools-mkiv.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/tools/tools-mkiv.tex
@@ -1,7 +1,7 @@
-% language=uk
+% language=us runpath=texruns:manuals/tools
% author : Hans Hagen
-% copyright : PRAGMA ADE & ConTeXt Development Team
+% copyright : ConTeXt Development Team
% license : Creative Commons Attribution ShareAlike 4.0 International
% reference : pragma-ade.nl | contextgarden.net | texlive (related) distributions
% origin : the ConTeXt distribution
@@ -1414,7 +1414,7 @@ be the shell return value of your script.
\NC version \NC \currentdate \NC \NR
\NC website \NC \documentvariable{website} \endash\
\documentvariable{support} \NC \NR
- \NC copyright \NC \symbol[cc][cc-by-sa-nc] \NC \NR
+ \NC copyright \NC \symbol[cc][cc-by-sa] \NC \NR
\stoptabulate
\stopsubject
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/units/units-mkiv.tex b/Master/texmf-dist/doc/context/sources/general/manuals/units/units-mkiv.tex
index 66338497ac6..d70c7221f06 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/units/units-mkiv.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/units/units-mkiv.tex
@@ -1,7 +1,7 @@
-% language=uk
+% language=us runpath=texruns:manuals/units
% author : Hans Hagen
-% copyright : PRAGMA ADE & ConTeXt Development Team
+% copyright : ConTeXt Development Team
% license : Creative Commons Attribution ShareAlike 4.0 International
% reference : pragma-ade.nl | contextgarden.net | texlive (related) distributions
% origin : the ConTeXt distribution
@@ -583,7 +583,7 @@ These are also special:
\NC author \NC \documentvariable{author}, \documentvariable{affiliation}, \documentvariable{location} \NC \NR
\NC version \NC \currentdate \NC \NR
\NC website \NC \documentvariable{website} \endash\ \documentvariable{support} \NC \NR
-\NC copyright \NC \symbol[cc][cc-by-sa-nc] \NC \NR
+\NC copyright \NC \symbol[cc][cc-by-sa] \NC \NR
\stoptabulate
\stopsection
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/workflows/workflows-contents.tex b/Master/texmf-dist/doc/context/sources/general/manuals/workflows/workflows-contents.tex
index a32f4737dcc..0e3c18a3895 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/workflows/workflows-contents.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/workflows/workflows-contents.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us runpath=texruns:manuals/workflows
\environment workflows-style
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 2cff143f41f..2246c1c885d 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
@@ -1,4 +1,4 @@
-% language=uk
+% language=us runpath=texruns:manuals/workflows
\environment workflows-style
@@ -8,12 +8,13 @@
\startsection[title=Bad names]
-After many years of using \CONTEXT\ in workflows where large amounts of source files
-as well as graphics were involved we can safely say that it's hard for publishers to
-control the way these are named. This is probably due to the fact that in a
-click|-|and|-|point based desktop publishing workflow names don't matter as one stays on
-one machine, and names are only entered once (after that these names become abstractions and
-get cut and pasted). Proper consistent resource managament is simply not part of the flow.
+After many years of using \CONTEXT\ in workflows where large amounts of source
+files as well as graphics were involved we can safely say that it's hard for
+publishers to control the way these are named. This is probably due to the fact
+that in a click|-|and|-|point based desktop publishing workflow names don't
+matter as one stays on one machine, and names are only entered once (after that
+these names become abstractions and get cut and pasted). Proper consistent
+resource managament is simply not part of the flow.
This means that you get names like:
@@ -29,19 +30,20 @@ like one. In fancy screen fonts upper and lowercase usage might get obscured. It
really makes one wonder if copy|-|editing or adding labels to graphics isn't
suffering from the same problem.
-Anyhow, as in an automated rendering workflow the rendering is often the last step you
-can imagine that when names get messed up it's that last step that gets blamed. It's not
-that hard to sanitize names of files on disk as well as in the files that refer to them,
-and we normally do that we have complete control. This is no option when all the resources
-are synchronzied from elsewhere. In that case the only way out is signaling potential
-issues. Say that in the source file there is a reference:
+Anyhow, as in an automated rendering workflow the rendering is often the last
+step you can imagine that when names get messed up it's that last step that gets
+blamed. It's not that hard to sanitize names of files on disk as well as in the
+files that refer to them, and we normally do that we have complete control. This
+is no option when all the resources are synchronzied from elsewhere. In that case
+the only way out is signaling potential issues. Say that in the source file there
+is a reference:
\starttyping
foo_Bar_01_03-a.EPS
\stoptyping
-and that the graphic on disk has the same name, but for some reason after an update
-has become:
+and that the graphic on disk has the same name, but for some reason after an
+update has become:
\starttyping
foo-Bar_01_03-a.EPS
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/workflows/workflows-hashed.tex b/Master/texmf-dist/doc/context/sources/general/manuals/workflows/workflows-hashed.tex
new file mode 100644
index 00000000000..250376c456d
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/workflows/workflows-hashed.tex
@@ -0,0 +1,160 @@
+% language=us runpath=texruns:manuals/workflows
+
+% Musical timestamp: Welcome 2 America by Prince, with a pretty good lineup,
+% August 2021.
+
+\environment workflows-style
+
+\startcomponent workflows-hashed
+
+\startchapter[title=Hashed files]
+
+In a (basically free content) project we had to deal with tens of thousands of
+files. Most are in \XML\ format, but there are also thousands of \PNG, \JPG\ and
+\SVG\ images. In a large project like this, which covers a large part of Dutch
+school math, images can be shared. All the content is available for schools as
+\HTML\ but can also be turned into printable form and because schools want to
+have stable content over specified periods one has to make a regular snapshot of
+this corpus. Also, distributing a few gigabytes of data is not much fun.
+
+So, in order to bring the amount down a dedicated mechanism for handling files
+has been introduced. After playing with a \SQLITE\ database we finally settled on
+just \LUA, simply because it was faster and it also makes the solution
+independent.
+
+The process comes down to creating a file database once in a while, loading a
+relatively small hash mapping at runtime and accessing files from a large
+data file on demand. Optionally files can be compressed, which makes sense for
+the textual files.
+
+A database is created with one of the \CONTEXT\ extras, for instance:
+
+\starttyping
+context --extra=hashed --database=m4 --pattern=m4all/**.xml --compress
+context --extra=hashed --database=m4 --pattern=m4all/**.svg --compress
+context --extra=hashed --database=m4 --pattern=m4all/**.jpg
+context --extra=hashed --database=m4 --pattern=m4all/**.png
+\stoptyping
+
+The database uses two files: a small \type {m4.lua} file (some 11 megabytes) and
+a large \type {m4.dat} (about 820 megabytes, coming from 1850 megabytes
+originals). Alternatively you can use a specification, say \type {m4all.lua}:
+
+\starttyping
+return {
+ { pattern = "m4all/**.xml$", compress = true },
+ { pattern = "m4all/**.svg$", compress = true },
+ { pattern = "m4all/**.jpg$", compress = false },
+ { pattern = "m4all/**.png$", compress = false },
+}
+\stoptyping
+
+\starttyping
+context --extra=hashed --database=m4 --patterns=m4all.lua
+\stoptyping
+
+You should see something like this on the console:
+
+\starttyping
+hashed > database 'hasheddata', 1627 paths, 46141 names,
+ 36935 unique blobs, 29674 compressed blobs
+\stoptyping
+
+So here we share some ten thousand files (all images). In case you wonder why we
+keep the duplicates: they have unique names (copies) so that when a section is
+updated there is no interference with other sections. The tree structure is
+mostly six deep (sometimes there is an additional level).
+
+% \startluacode
+% if not resolvers.finders.helpers.validhashed("hasheddata") then
+% resolvers.finders.helpers.createhashed {
+% database = "hasheddata",
+% pattern = "m4all/**.jpg$",
+% compress = false,
+% }
+% resolvers.finders.helpers.createhashed {
+% database = "hasheddata",
+% pattern = "m4all/**.png$",
+% compress = false,
+% }
+% resolvers.finders.helpers.createhashed {
+% database = "hasheddata",
+% pattern = "m4all/**.xml$",
+% compress = true,
+% }
+% end
+% \stopluacode
+
+% \startluacode
+% if not resolvers.finders.helpers.validhashed("hasheddata") then
+% resolvers.finders.helpers.createhashed {
+% database = "hasheddata",
+% patterns = {
+% { pattern = "m4all/**.jpg$", compress = false },
+% { pattern = "m4all/**.png$", compress = false },
+% { pattern = "m4all/**.svg$", compress = true },
+% { pattern = "m4all/**.xml$", compress = true },
+% },
+% }
+% end
+% \stopluacode
+
+Accessing files is the same as with files on the system, but one has to register
+a database first:
+
+\starttyping
+\registerhashedfiles[m4]
+\stoptyping
+
+A fully qualified specifier looks like this (not too different from other
+specifiers):
+
+\starttyping
+\externalfigure
+ [hashed:///m4all/books/chapters/h3/h3-if1/images/casino.jpg]
+\externalfigure
+ [hashed:///m4all/books/chapters/ha/ha-c4/images/ha-c44-ex2-s1.png]
+\stoptyping
+
+but nicer would be :
+
+\starttyping
+\externalfigure
+ [m4all/books/chapters/h3/h3-if1/images/casino.jpg]
+\externalfigure
+ [m4all/books/chapters/ha/ha-c4/images/ha-c44-ex2-s1.png]
+\stoptyping
+
+This is possible when we also specify:
+
+\starttyping
+\registerfilescheme[hashed]
+\stoptyping
+
+This makes the given scheme based resolver kick in first, while the normal
+file lookup is used as last resort.
+
+This mechanism is written on top of the infrastructure that has been part of
+\CONTEXT\ \MKIV\ right from the start but this particular feature is only
+available in \LMTX\ (backporting is likely a waste of time).
+
+Just for the record: this mechanism is kept simple, so the database has no update
+and replace features. One can just generate a new one. You can test for a valid database
+and act upon the outcome:
+
+\starttyping
+\doifelsevalidhashedfiles {m4} {
+ \writestatus{hashed}{using hashed data}
+ \registerhashedfiles[m4]
+ \registerfilescheme[hashed]
+} {
+ \writestatus{hashed}{no hashed data}
+}
+\stoptyping
+
+Future versions might introduce filename normalization (lowercase, cleanup) so
+consider this as a first step. First we need test it for a while.
+
+\stopchapter
+
+\stopcomponent
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/workflows/workflows-injectors.tex b/Master/texmf-dist/doc/context/sources/general/manuals/workflows/workflows-injectors.tex
index 5bd9bf057a1..e2d46f060f3 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/workflows/workflows-injectors.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/workflows/workflows-injectors.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us runpath=texruns:manuals/workflows
\environment workflows-style
@@ -108,7 +108,7 @@ automated \XML\ workflows where last minute control is needed.
\stopcomponent
-% some day to be described:
+% Some day to be described (check Willis tests):
%
% \showinjector
%
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/workflows/workflows-introduction.tex b/Master/texmf-dist/doc/context/sources/general/manuals/workflows/workflows-introduction.tex
index a88640b27e8..a2d7c0cc091 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/workflows/workflows-introduction.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/workflows/workflows-introduction.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us runpath=texruns:manuals/workflows
\environment workflows-style
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 dffc7d65cd2..e11d0ac787e 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
@@ -1,5 +1,7 @@
+% language=us runpath=texruns:manuals/workflows
+
% author : Hans Hagen
-% copyright : PRAGMA ADE & ConTeXt Development Team
+% copyright : ConTeXt Development Team
% license : Creative Commons Attribution ShareAlike 4.0 International
% reference : pragma-ade.nl | contextgarden.net | texlive (related) distributions
% origin : the ConTeXt distribution
@@ -47,6 +49,7 @@
\component workflows-setups
\component workflows-synctex
\component workflows-parallel
+ \component workflows-hashed
\stopbodymatter
\stopdocument
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/workflows/workflows-parallel.tex b/Master/texmf-dist/doc/context/sources/general/manuals/workflows/workflows-parallel.tex
index 632d2e3e666..006088c2cb0 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/workflows/workflows-parallel.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/workflows/workflows-parallel.tex
@@ -1,4 +1,4 @@
-% language=us
+% language=us runpath=texruns:manuals/workflows
\startcomponent workflows-parallel
@@ -88,7 +88,7 @@ provides.
Again, caching the input file as above saves a little bit: 10 seconds, so we get
250 seconds. When you run these tests on the machine that you normally work on,
waiting for that many jobs to finish is no fun, so what if we (as I then normally
-do) watch some music video? With a fullscreen high resolution video shown in the
+do) watch some music video? With a full screen high resolution video shown in the
foreground the runtime didn't change: still 250 seconds for 1000 jobs with eight
parallel runs. On the other hand, a test with Firefox, which is quite demanding,
running a video in the background, made the runtime going up by 30 seconds to
@@ -118,6 +118,3 @@ is still there, the management script can decide when a next run can be started.
\stopchapter
\stopcomponent
-
-% downloaded video : Jojo Mayer's 2019 TED talk: https://www.youtube.com/watch?v=Npq-bhz1ll0}
-% realtime video : Andrew Cuomo's daily press conference on dealing with Covid 19
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/workflows/workflows-resources.tex b/Master/texmf-dist/doc/context/sources/general/manuals/workflows/workflows-resources.tex
index cbed648640f..323bf8209a3 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/workflows/workflows-resources.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/workflows/workflows-resources.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us runpath=texruns:manuals/workflows
\environment workflows-style
@@ -6,10 +6,10 @@
\startchapter[title=Accessing resources]
-One of the benefits of \TEX\ is that you can use it in automated workflows
-where large quantities of data is involved. A document can consist of
-several files and normally also includes images. Of course there are styles
-involved too. At \PRAGMA\ normally put styles and fonts in:
+One of the benefits of \TEX\ is that you can use it in automated workflows where
+large quantities of data is involved. A document can consist of several files and
+normally also includes images. Of course there are styles involved too. At
+\PRAGMA\ normally put styles and fonts in:
\starttyping
/data/site/context/tex/texmf-project/tex/context/user/<project>/...
@@ -37,11 +37,12 @@ The processing happens in:
Putting styles (and resources like logos and common images) and fonts (if the
project has specific ones not present in the distribution) in the \TEX\ tree
makes sense because that is where such files are normally searched. Of course you
-need to keep the distributions file database upto|-|date after adding files there.
+need to keep the distributions file database upto|-|date after adding files
+there.
Processing has to happen isolated from other runs so there we use unique
-locations. The services responsible for running also deal with regular cleanup
-of these temporary files.
+locations. The services responsible for running also deal with regular cleanup of
+these temporary files.
Resources are somewhat special. They can be stable, i.e.\ change seldom, but more
often they are updated or extended periodically (or even daily). We're not
@@ -55,7 +56,7 @@ resource tree. In the 100K case there is a deeper structure which is in itself
predictable but because many authors are involved the references to these files
are somewhat instable (and undefined). It is surprising to notice that publishers
don't care about filenames (read: cannot control all the parties involved) which
-means that we have inconsist use of mixed case in filenames, and spaces,
+means that we have inconsistent use of mixed case in filenames, and spaces,
underscores and dashes creeping in. Because typesetting for paper is always at
the end of the pipeline (which nowadays is mostly driven by (limitations) of web
products) we need to have a robust and flexible lookup mechanism. It's a side
@@ -67,7 +68,7 @@ get it fixed. \footnote {From what we normally receive we often conclude that
copy|-|editing and image production companies don't impose any discipline or
probably simply lack the tools and methods to control this. Some of our workflows
had checkers and fixers, so that when we got 5000 new resources while only a few
-needed to be replaced we could filter the right ones. It was not uncommon to find
+needed to be replaced we could filter the right ones. It was not uncommon to find
duplicates for thousands of pictures: similar or older variants.}
\starttyping
@@ -151,6 +152,9 @@ When you add, remove or move files the tree, you need to remove the \type
{dirlist.*} files in the root because these are used for locating files. A new
file will be generated automatically. Don't forget this!
+When content doesn't change an alternative discussed in in a later chapter can be
+considered: hashed databases of files.
+
\stopchapter
\stopcomponent
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/workflows/workflows-running.tex b/Master/texmf-dist/doc/context/sources/general/manuals/workflows/workflows-running.tex
index 6d3e9f5c43b..7107149205c 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/workflows/workflows-running.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/workflows/workflows-running.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us runpath=texruns:manuals/workflows
\environment workflows-style
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/workflows/workflows-setups.tex b/Master/texmf-dist/doc/context/sources/general/manuals/workflows/workflows-setups.tex
index e9d120f7b91..9ecc4635409 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/workflows/workflows-setups.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/workflows/workflows-setups.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us runpath=texruns:manuals/workflows
\environment workflows-style
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/workflows/workflows-style.tex b/Master/texmf-dist/doc/context/sources/general/manuals/workflows/workflows-style.tex
index f29129fcdd1..364755443ca 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/workflows/workflows-style.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/workflows/workflows-style.tex
@@ -1,3 +1,5 @@
+% language=us runpath=texruns:manuals/workflows
+
\startenvironment workflows-style
\usemodule
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/workflows/workflows-suspects.tex b/Master/texmf-dist/doc/context/sources/general/manuals/workflows/workflows-suspects.tex
index 621fd6f5975..d2054bd1fdf 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/workflows/workflows-suspects.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/workflows/workflows-suspects.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us runpath=texruns:manuals/workflows
\environment workflows-style
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/workflows/workflows-synctex.tex b/Master/texmf-dist/doc/context/sources/general/manuals/workflows/workflows-synctex.tex
index 8f1fac632ab..4349461f0e5 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/workflows/workflows-synctex.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/workflows/workflows-synctex.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us runpath=texruns:manuals/workflows
\environment workflows-style
@@ -82,10 +82,10 @@ editor} are the following:
\stopitemize
-It is unavoidable that we get more run time but I assume that for the average user
-that is no big deal. It pays off when you have a workflow when a book (or even a
-chapter in a book) is generated from hundreds of small \XML\ files. There is no
-overhead when \SYNCTEX\ is not used.
+It is unavoidable that we get more run time but I assume that for the average
+user that is no big deal. It pays off when you have a workflow when a book (or
+even a chapter in a book) is generated from hundreds of small \XML\ files. There
+is no overhead when \SYNCTEX\ is not used.
In \CONTEXT\ we don't use the built|-|in \SYNCTEX\ features, that is: we let
filename and line numbers be set but often these are overloaded explicitly. The
@@ -120,10 +120,10 @@ A third method is to put this at the top of your file:
Often an \XML\ files is very structured and although probably the main body of
text is flushed as a stream, specific elements can be flushed out of order. In
-educational documents flushing for instance answers to exercises can happen out of
-order. In that case we still need to make sure that we go to the right spot in
-the file. It will never be 100\% perfect but it's better than nothing. The
-above command will also enable \XML\ support.
+educational documents flushing for instance answers to exercises can happen out
+of order. In that case we still need to make sure that we go to the right spot in
+the file. It will never be 100\% perfect but it's better than nothing. The above
+command will also enable \XML\ support.
If you don't want a file to be accessed, you can block it:
@@ -131,8 +131,8 @@ If you don't want a file to be accessed, you can block it:
\blocksynctexfile[foo.tex]
\stoptyping
-Of course you need to configure the viewer to respond to the request for
-editing. In Sumatra combined with SciTE the magic command is:
+Of course you need to configure the viewer to respond to the request for editing.
+In Sumatra combined with \SCITE\ the magic command is:
\starttyping
c:\data\system\scite\wscite\scite.exe "%f" "-goto:%l"
@@ -202,6 +202,23 @@ as described here.
\stopsection
+\startsection[title=Two-way]
+
+In for instance the \TEX shop editor, there is a two way connection. The nice
+thing about this editor is, is that it is also the first one to use the \type
+{mtx-synctex} script to resolve these links, instead of relying on a library. You
+can also use this script to inspect a \SYNCTEX\ file yourself, The help into
+shows the possible directives.
+
+\starttyping
+mtxrun --script synctex
+\stoptyping
+
+You can resolve positions in the \PDF\ as well as in the sources and list all the
+known areas in the log.
+
+\stopsection
+
\stopchapter
\stopcomponent
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/workflows/workflows-titlepage.tex b/Master/texmf-dist/doc/context/sources/general/manuals/workflows/workflows-titlepage.tex
index f184152b34a..00071a5eb4e 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/workflows/workflows-titlepage.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/workflows/workflows-titlepage.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us runpath=texruns:manuals/workflows
\environment workflows-style
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/workflows/workflows-xml.tex b/Master/texmf-dist/doc/context/sources/general/manuals/workflows/workflows-xml.tex
index 0f29f5f5533..95a6f71b66a 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/workflows/workflows-xml.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/workflows/workflows-xml.tex
@@ -1,4 +1,4 @@
-% language=uk
+% language=us runpath=texruns:manuals/workflows
\environment workflows-style
@@ -15,9 +15,9 @@
\startchapter[title={XML}]
When you have an \XML\ project with many files involved, finding the right spot
-of something that went wrong can be a pain. In one of our project the production of
-some 50 books involves 60.000 \XML\ files and 20.000 images. Say that we have the
-following file:
+of something that went wrong can be a pain. In one of our project the production
+of some 50 books involves 60.000 \XML\ files and 20.000 images. \footnote {In the
+meantime we could trim this down a lot.} Say that we have the following file:
\startbuffer[demo]
<?xml version='1.0'?>
@@ -32,9 +32,9 @@ following file:
\typebuffer[demo]
-Before we process this file we will merge the content of the files defined
-as includes into it. When this happens the filename is automatically
-registered so it can be accessed later.
+Before we process this file we will merge the content of the files defined as
+includes into it. When this happens the filename is automatically registered so
+it can be accessed later.
\startbuffer
\startxmlsetups xml:initialize
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/xml/xml-mkiv-03.xml b/Master/texmf-dist/doc/context/sources/general/manuals/xml/xml-mkiv-03.xml
new file mode 100644
index 00000000000..f565c50b59a
--- /dev/null
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/xml/xml-mkiv-03.xml
@@ -0,0 +1,11 @@
+<?xml version='1.0' standalone='yes?>
+
+<document>
+ <section>
+ <title>Some title</title>
+ <content>
+ <p>a paragraph of text</p>
+ <p>another paragraph of text</p>
+ </content>
+ </section>
+</document>
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/xml/xml-mkiv-commands.tex b/Master/texmf-dist/doc/context/sources/general/manuals/xml/xml-mkiv-commands.tex
index 8d9e9ef47ca..b9659a4c27e 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/xml/xml-mkiv-commands.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/xml/xml-mkiv-commands.tex
@@ -1,3 +1,5 @@
+% language=us runpath=texruns:manuals/xml
+
\environment xml-mkiv-style
\startcomponent xml-mkiv-commands
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/xml/xml-mkiv-contents.tex b/Master/texmf-dist/doc/context/sources/general/manuals/xml/xml-mkiv-contents.tex
index e0787ec5fe9..18cda18de63 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/xml/xml-mkiv-contents.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/xml/xml-mkiv-contents.tex
@@ -1,3 +1,5 @@
+% language=us runpath=texruns:manuals/xml
+
\environment xml-mkiv-style
\startcomponent xml-mkiv-contents
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/xml/xml-mkiv-converter.tex b/Master/texmf-dist/doc/context/sources/general/manuals/xml/xml-mkiv-converter.tex
index a457f962be8..e3464a57c98 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/xml/xml-mkiv-converter.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/xml/xml-mkiv-converter.tex
@@ -1,3 +1,5 @@
+% language=us runpath=texruns:manuals/xml
+
\environment xml-mkiv-style
\startcomponent xml-mkiv-converter
@@ -12,7 +14,7 @@ style with complex chapter openings using data coming from all kind of places,
different styling of sections with the same name, selectively (out of order)
flushed content, special formatting, etc.
-\typefile{manual-demo-1.xml}
+\typefile{xml-mkiv-03.xml}
Say that this document is stored in the file \type {demo.xml}, then the following
code can be used as starting point:
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/xml/xml-mkiv-examples.tex b/Master/texmf-dist/doc/context/sources/general/manuals/xml/xml-mkiv-examples.tex
index 064510d6dd1..bb3c2518714 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/xml/xml-mkiv-examples.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/xml/xml-mkiv-examples.tex
@@ -1,3 +1,5 @@
+% language=us runpath=texruns:manuals/xml
+
\environment xml-mkiv-style
\startcomponent xml-mkiv-examples
@@ -778,7 +780,7 @@ The \XML\ parser is also available outside \TEX. Here is an example of its usage
We pipe the result to \TEX\ but you can do with \type {t} whatever you like.
\startbuffer
-local x = xml.load("manual-demo-1.xml")
+local x = xml.load("xml-mkiv-03.xml")
local t = { }
for c in xml.collected(x,"//*") do
@@ -848,7 +850,7 @@ end
Usage is as follows:
\startbuffer
-local x = xml.load("manual-demo-1.xml")
+local x = xml.load("xml-mkiv-03.xml")
local t = xml.applylpath(x,"//*/taglist()")
context.tocontext(t)
@@ -863,7 +865,7 @@ And indeed we get:
But we can also say:
\startbuffer
-local x = xml.load("manual-demo-1.xml")
+local x = xml.load("xml-mkiv-03.xml")
local t = xml.applylpath(x,"//*/taglist(true)")
context.tocontext(t)
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/xml/xml-mkiv-expressions.tex b/Master/texmf-dist/doc/context/sources/general/manuals/xml/xml-mkiv-expressions.tex
index b063cab5408..fe2670f86c7 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/xml/xml-mkiv-expressions.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/xml/xml-mkiv-expressions.tex
@@ -1,3 +1,5 @@
+% language=us runpath=texruns:manuals/xml
+
\environment xml-mkiv-style
\startcomponent xml-mkiv-expressions
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/xml/xml-mkiv-filtering.tex b/Master/texmf-dist/doc/context/sources/general/manuals/xml/xml-mkiv-filtering.tex
index 5bb5a35dee9..e751435acaf 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/xml/xml-mkiv-filtering.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/xml/xml-mkiv-filtering.tex
@@ -1,3 +1,5 @@
+% language=us runpath=texruns:manuals/xml
+
\environment xml-mkiv-style
\startcomponent xml-mkiv-filtering
@@ -35,11 +37,11 @@ conform the indentation in the whole \XML\ file. \footnote {The (probably
outdated) \XML\ file contains the collection stores on my slimserver instance.
You can use the \type {mtxrun --script flac} to generate such files.}
-\doifmodeelse {atpragma} {
- \getbuffer
-} {
+% \doifmodeelse {atpragma} {
+% \getbuffer
+% } {
\typefile{xml-mkiv-01.xml}
-}
+% }
An alternative written in \LUA\ looks as follows:
@@ -56,11 +58,11 @@ An alternative written in \LUA\ looks as follows:
This produces:
-\doifmodeelse {atpragma} {
- \getbuffer
-} {
+% \doifmodeelse {atpragma} {
+% \getbuffer
+% } {
\typefile{xml-mkiv-02.xml}
-}
+% }
You can use both methods mixed but in practice we will use the \TEX\ commands in
regular styles and the mixture in modules, for instance in those dealing with
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/xml/xml-mkiv-introduction.tex b/Master/texmf-dist/doc/context/sources/general/manuals/xml/xml-mkiv-introduction.tex
index e7f0124daab..9fb8f646272 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/xml/xml-mkiv-introduction.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/xml/xml-mkiv-introduction.tex
@@ -1,3 +1,5 @@
+% language=us runpath=texruns:manuals/xml
+
\environment xml-mkiv-style
\startcomponent xml-mkiv-introduction
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/xml/xml-mkiv-lookups.tex b/Master/texmf-dist/doc/context/sources/general/manuals/xml/xml-mkiv-lookups.tex
index e6afaa9488b..9711fc7eb53 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/xml/xml-mkiv-lookups.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/xml/xml-mkiv-lookups.tex
@@ -1,3 +1,5 @@
+% language=us runpath=texruns:manuals/xml
+
\environment xml-mkiv-style
\startcomponent xml-mkiv-lookups
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/xml/xml-mkiv-lpath.tex b/Master/texmf-dist/doc/context/sources/general/manuals/xml/xml-mkiv-lpath.tex
deleted file mode 100644
index 9c8b853c8f3..00000000000
--- a/Master/texmf-dist/doc/context/sources/general/manuals/xml/xml-mkiv-lpath.tex
+++ /dev/null
@@ -1,207 +0,0 @@
-\input lxml-ctx.mkiv
-
-\ctxlua{dofile("t:/sources/lxml-lpt.lua")}
-
-\startbuffer[xmltest]
-<?xml version='1.0'?>
-
-<!-- this is a test file -->
-
-<something id='1'>
- <x:whatever id='1.1'>
- <whocares id='1.1.1'>
- test a
- </whocares>
- <whocaresnot id='1.1.2'>
- test b
- </whocaresnot>
- </x:whatever>
- <whatever id='2'>
- <whocares id='2.1'>
- test c
- </whocares>
- <whocaresnot id='2.2'>
- test d
- </whocaresnot>
- </whatever>
- <whatever id='3'>
- test e
- </whatever>
- <whatever id='4' test="xxx">
- <whocares id='4.1'>
- test f
- </whocares>
- <whocares id='4.2'>
- test g
- </whocares>
- </whatever>
- <whatever id='5' test="xxx">
- <whoknows id='5.1'>
- <whocares id='5.1.1'>
- test h
- </whocares>
- </whoknows>
- <whoknows id='5.2'>
- <whocaresnot id='5.2.1'>
- test i
- </whocaresnot>
- </whoknows>
- <whoknows id='5.3'>
- <whocares id='5.3.1'>
- test j
- </whocares>
- </whoknows>
- </whatever>
-</something>
-\stopbuffer
-
-% \enabletrackers[xml.lparse]
-
-\setuplayout[width=middle,height=middle,header=1cm,footer=1cm,topspace=2cm,backspace=2cm]
-\setupbodyfont[10pt]
-
-\setfalse\xmllshowbuffer
-
-\starttext
-
-\xmllshow{/(*:library|figurelibrary)/*:figure/*:label}
-\xmllshow{/(*:library|figurelibrary)/figure/*:label}
-\xmllshow{/(*:library|figurelibrary)/figure/label}
-\xmllshow{/(*:library|figurelibrary)/figure:*/label}
-
-% \xmllshow{collection[@version='all']/resources/manual[match()==1]/paper/command(xml:overview)}
-% \xmllshow{collection/resources/manual[match()=1]/paper/command(xml:overview)}
-
-% \xmllshow{answer//oeps}
-% \xmllshow{answer/*/oeps}
-% \xmllshow{answer/**/oeps}
-% \xmllshow{answer/***/oeps}
-% \xmllshow{answer/x//oeps}
-% \xmllshow{answer//x/oeps}
-% \xmllshow{//x/oeps}
-% \xmllshow{answer/test/*}
-% \xmllshow{answer/test/child::}
-% \xmllshow{answer/*}
-% \xmllshow{ oeps / answer / .. / * [tag()='p' and position()=1 and text()!=''] / oeps()}
-
-% \xmllshow{ artist / name [text()='Randy Newman'] / .. / albums / album [position()=3] / command(first:demo:two)}
-% \xmllshow{/exa:selectors/exa:selector/exa:list/component[count()>1]}
-
-\stoptext
-
-\xmllshow{/*}
-\xmllshow{child::}
-\xmllshow{child::test}
-\xmllshow{/test/test}
-\xmllshow{../theory/sections/section/exercises}
-\xmllshow{../training/practicalassignments}
-\xmllshow{../../Outcome[position()=rootposition()]/Condition/command(xml:answer:mc:condition)}
-
-% \stoptext
-
-% \typebuffer[xmltest] \page
-
-\xmllshowbuffer{xmltest}{**}{id}
-\xmllshowbuffer{xmltest}{*}{id}
-\xmllshowbuffer{xmltest}{..}{id}
-\xmllshowbuffer{xmltest}{.}{id}
-\xmllshowbuffer{xmltest}{//}{id}
-\xmllshowbuffer{xmltest}{/}{id}
-
-\xmllshowbuffer{xmltest}{**/}{id}
-\xmllshowbuffer{xmltest}{**/*}{id}
-\xmllshowbuffer{xmltest}{**/.}{id}
-\xmllshowbuffer{xmltest}{**//}{id}
-
-\xmllshowbuffer{xmltest}{*/}{id}
-\xmllshowbuffer{xmltest}{*/*}{id}
-\xmllshowbuffer{xmltest}{*/.}{id}
-\xmllshowbuffer{xmltest}{*//}{id}
-
-\xmllshowbuffer{xmltest}{/**/}{id}
-\xmllshowbuffer{xmltest}{/**/*}{id}
-\xmllshowbuffer{xmltest}{/**/.}{id}
-\xmllshowbuffer{xmltest}{/**//}{id}
-
-\xmllshowbuffer{xmltest}{/*/}{id}
-\xmllshowbuffer{xmltest}{/*/*}{id}
-\xmllshowbuffer{xmltest}{/*/.}{id}
-\xmllshowbuffer{xmltest}{/*//}{id}
-
-\xmllshowbuffer{xmltest}{./}{id}
-\xmllshowbuffer{xmltest}{./*}{id}
-\xmllshowbuffer{xmltest}{./.}{id}
-\xmllshowbuffer{xmltest}{.//}{id}
-
-\xmllshowbuffer{xmltest}{../}{id}
-\xmllshowbuffer{xmltest}{../*}{id}
-\xmllshowbuffer{xmltest}{../.}{id}
-\xmllshowbuffer{xmltest}{..//}{id}
-
-\xmllshowbuffer{xmltest}{descendant::whocares/ancestor::whoknows}{id}
-\xmllshowbuffer{xmltest}{descendant::whocares/ancestor::whoknows/parent::}{id}
-\xmllshowbuffer{xmltest}{descendant::whocares/ancestor::}{id}
-\xmllshowbuffer{xmltest}{child::something/child::whatever/child::whocares}{id}
-\xmllshowbuffer{xmltest}{child::something/child::whatever/child::whocares|whoknows}{id}
-\xmllshowbuffer{xmltest}{child::something/child::whatever/child::(whocares|whoknows)}{id}
-\xmllshowbuffer{xmltest}{child::something/child::whatever/child::!(whocares|whoknows)}{id}
-\xmllshowbuffer{xmltest}{child::something/child::whatever/child::(whocares)}{id}
-\xmllshowbuffer{xmltest}{child::something/child::whatever/child::(whocares)[position()>2]}{id}
-\xmllshowbuffer{xmltest}{child::something/child::whatever[position()>2][position()=1]}{id}
-\xmllshowbuffer{xmltest}{child::something/child::whatever[whocares][whocaresnot]}{id}
-\xmllshowbuffer{xmltest}{child::something/child::whatever[whocares][not(whocaresnot)]}{id}
-\xmllshowbuffer{xmltest}{child::something/child::whatever/self::whatever}{id}
-\xmllshowbuffer{xmltest}{/something/whatever}{id}
-\xmllshowbuffer{xmltest}{something/whatever}{id}
-\xmllshowbuffer{xmltest}{/**/whocares}{id}
-\xmllshowbuffer{xmltest}{whoknows/whocares}{id}
-\xmllshowbuffer{xmltest}{whoknows}{id}
-\xmllshowbuffer{xmltest}{whocares[contains(text(),'f') or contains(text(),'g')]}{id}
-\xmllshowbuffer{xmltest}{whocares/first()}{id}
-\xmllshowbuffer{xmltest}{whocares/last()}{id}
-\xmllshowbuffer{xmltest}{whatever/all()}{id}
-\xmllshowbuffer{xmltest}{whocares/position(2)}{id}
-\xmllshowbuffer{xmltest}{whocares/position(-2)}{id}
-\xmllshowbuffer{xmltest}{whocares[1]}{id}
-\xmllshowbuffer{xmltest}{whocares[-1]}{id}
-\xmllshowbuffer{xmltest}{whocares[2]}{id}
-\xmllshowbuffer{xmltest}{whocares[-2]}{id}
-\xmllshowbuffer{xmltest}{whatever[3]/attribute(id)}{id}
-\xmllshowbuffer{xmltest}{whatever[2]/attribute('id')}{id}
-\xmllshowbuffer{xmltest}{whatever[3]/text()}{id}
-\xmllshowbuffer{xmltest}{/whocares/first()}{id}
-\xmllshowbuffer{xmltest}{/whocares/last()}{id}
-
-\xmllshowbuffer{xmltest}{xml://whatever/all()}{id}
-\xmllshowbuffer{xmltest}{whatever/all()}{id}
-\xmllshowbuffer{xmltest}{//whocares}{id}
-\xmllshowbuffer{xmltest}{..[2]}{id}
-\xmllshowbuffer{xmltest}{../*[2]}{id}
-
-\xmllshowbuffer{xmltest}{/(whocares|whocaresnot)}{id}
-\xmllshowbuffer{xmltest}{/!(whocares|whocaresnot)}{id}
-\xmllshowbuffer{xmltest}{/!whocares}{id}
-
-% \page
-
-% \xmllshow{/interface/command/command(xml:setups:register)}
-% \xmllshow{/interface/command[@name='xxx']/command(xml:setups:typeset)}
-% \xmllshow{/arguments/*}
-% \xmllshow{/sequence/first()}
-% \xmllshow{/arguments/text()}
-% \xmllshow{/sequence/variable/first()}
-% \xmllshow{/interface/define[@name='xxx']/first()}
-% \xmllshow{/parameter/command(xml:setups:parameter:measure)}
-
-% \page
-
-% \xmllshow{interface/command/command(xml:setups:register)}
-% \xmllshow{interface/command[@name='xxx']/command(xml:setups:typeset)}
-% \xmllshow{arguments/*}
-% \xmllshow{sequence/first()}
-% \xmllshow{arguments/text()}
-% \xmllshow{sequence/variable/first()}
-% \xmllshow{interface/define[@name='xxx']/first()}
-% \xmllshow{parameter/command(xml:setups:parameter:measure)}
-
-\stoptext
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/xml/xml-mkiv-style.tex b/Master/texmf-dist/doc/context/sources/general/manuals/xml/xml-mkiv-style.tex
index 8bcd7408649..1b4ce995e0b 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/xml/xml-mkiv-style.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/xml/xml-mkiv-style.tex
@@ -1,9 +1,12 @@
+% language=us runpath=texruns:manuals/xml
+
\startenvironment xml-mkiv-style
\input lxml-ctx.mkiv
-\settrue \xmllshowtitle
-\setfalse\xmllshowwarning
+\settrue \xmllshowtitletoo
+\settrue \xmllshowbuffertoo
+\setfalse\xmllshowwarningtoo
\usemodule[set-11]
@@ -138,10 +141,6 @@
rulethickness=1pt,
corner=round]
-\usemodule[punk]
-
-\usetypescript[punk]
-
\definelayer
[page]
[width=\paperwidth,
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/xml/xml-mkiv-titlepage.tex b/Master/texmf-dist/doc/context/sources/general/manuals/xml/xml-mkiv-titlepage.tex
index 4275572140e..db36c93491c 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/xml/xml-mkiv-titlepage.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/xml/xml-mkiv-titlepage.tex
@@ -1,18 +1,42 @@
+% language=us runpath=texruns:manuals/xml
+
\environment xml-mkiv-style
\startcomponent xml-mkiv-titlepage
\setuplayout[page]
+\ifcase\contextlmtxmode
+
+ \usemodule[punk]
+
+ \usetypescript[punk]
+
+ \definefont[PunkSmall][demo@punk at 18pt]
+ \definefont[PunkLarge][demo@punk at 90pt]
+
+\else
+
+ \useMPlibrary[punk]
+
+ \definefont[PunkSmall][Serif*punkrandom @ 18pt]
+ \definefont[PunkLarge][Serif*punkrandom @ 90pt]
+
+\fi
+
\startstandardmakeup
\startfontclass[none] % nil the current fontclass since it may append its features
- \EnableRandomPunk
+ \ifcase\contextlmtxmode
+ \EnableRandomPunk
+ \else
+ \enablerandomvariants
+ \fi
\setlayerframed
[page]
[width=\paperwidth,height=\paperheight,
background=color,backgroundcolor=colorone,backgroundoffset=1ex,frame=off]
{}
- \definedfont[demo@punk at 18pt]
+ \PunkSmall
\setbox\scratchbox\vbox {
\hsize\dimexpr\paperwidth+2ex\relax
\setupinterlinespace
@@ -24,14 +48,14 @@
[page]
[preset=middle]
{\vsplit\scratchbox to \dimexpr\paperheight+2ex\relax}
- \definedfont[demo@punk at 90pt]
+ \PunkLarge
\setstrut
\setlayerframed
[page]
[preset=rightbottom,offset=10mm]
[foregroundcolor=colorthree,align=flushright,offset=overlay,frame=off]
{Dealing\\with XML in\\Con\TeX t MkIV}
- \definedfont[demo@punk at 18pt]
+ \PunkSmall
\setstrut
\setlayerframed
[page]
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/xml/xml-mkiv-tricks.tex b/Master/texmf-dist/doc/context/sources/general/manuals/xml/xml-mkiv-tricks.tex
index f8c65ecc93d..b6905491c68 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/xml/xml-mkiv-tricks.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/xml/xml-mkiv-tricks.tex
@@ -1,3 +1,5 @@
+% language=us runpath=texruns:manuals/xml
+
\environment xml-mkiv-style
\startcomponent xml-mkiv-tricks
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/xml/xml-mkiv.tex b/Master/texmf-dist/doc/context/sources/general/manuals/xml/xml-mkiv.tex
index 77054e79c53..bf3df9c2d35 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/xml/xml-mkiv.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/xml/xml-mkiv.tex
@@ -1,7 +1,7 @@
-% language=uk
+% language=us runpath=texruns:manuals/xml
% author : Hans Hagen
-% copyright : PRAGMA ADE & ConTeXt Development Team
+% copyright : ConTeXt Development Team
% license : Creative Commons Attribution ShareAlike 4.0 International
% reference : pragma-ade.nl | contextgarden.net | texlive (related) distributions
% origin : the ConTeXt distribution
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/xtables/xtables-mkiv.tex b/Master/texmf-dist/doc/context/sources/general/manuals/xtables/xtables-mkiv.tex
index d79c14aceaf..bee0e4f24cc 100644
--- a/Master/texmf-dist/doc/context/sources/general/manuals/xtables/xtables-mkiv.tex
+++ b/Master/texmf-dist/doc/context/sources/general/manuals/xtables/xtables-mkiv.tex
@@ -1,7 +1,7 @@
-% language=uk
+% language=us runpath=texruns:manuals/xtables
% author : Hans Hagen
-% copyright : PRAGMA ADE & ConTeXt Development Team
+% copyright : ConTeXt Development Team
% license : Creative Commons Attribution ShareAlike 4.0 International
% reference : pragma-ade.nl | contextgarden.net | texlive (related) distributions
% origin : the ConTeXt distribution
@@ -131,7 +131,7 @@ pages.
\startxcell[settings] ... \stopxcell
\stopxcellgroup
\stopxrow
- \startxrowgroup
+ \stopxrowgroup
\stopxtablehead|next|body|foot
\stopxtable
\stoptyping
@@ -954,7 +954,7 @@ The setups themselves are rather simple as we don't capture any attributes.
We now process the example. Of course it will also work for files.
\startbuffer
- \xmlprocessbuffer{main}{test}{}
+\xmlprocessbuffer{main}{test}{}
\stopbuffer
\typebuffer
@@ -990,7 +990,6 @@ After that:
\eTR
\eTABLE
\stopbuffer
-\stopbuffer
\typebuffer
@@ -1614,6 +1613,8 @@ in the distribution.
\typebuffer \getbuffer
+\stopsection
+
\page
% \ruledhbox{\getbuffer[normal,demo]}
@@ -1624,7 +1625,7 @@ in the distribution.
\NC author \NC \documentvariable{author}, \documentvariable{affiliation}, \documentvariable{location} \NC \NR
\NC version \NC \currentdate \NC \NR
\NC website \NC \documentvariable{website} \endash\ \documentvariable{support} \NC \NR
-\NC copyright \NC \symbol[cc][cc-by-sa-nc] \NC \NR
+\NC copyright \NC \symbol[cc][cc-by-sa] \NC \NR
\stoptabulate
\stopsection
diff --git a/Master/texmf-dist/doc/context/third/context-notes-zh-cn/README b/Master/texmf-dist/doc/context/third/context-notes-zh-cn/README
deleted file mode 100644
index eb41b59ff07..00000000000
--- a/Master/texmf-dist/doc/context/third/context-notes-zh-cn/README
+++ /dev/null
@@ -1,12 +0,0 @@
-This is an introductory tutorial on ConTeXt in Chinese written by Yanrui Li.
-
-ConTeXt installation, fonts, layout design, cross-reference, project structure, metafun are covered in this tutorial.
-
-This package is licensed in GFDL (GNU Free Documentation License).
-
-If you are interested in the process of development you may observe
-
- http://code.google.com/p/ctex-doc/updates/list
-
-Report feedback in the Issues section of ctex-doc project,
-or in http://bbs.ctex.org forum.
diff --git a/Master/texmf-dist/doc/context/third/context-notes-zh-cn/ctxnotes.pdf b/Master/texmf-dist/doc/context/third/context-notes-zh-cn/ctxnotes.pdf
deleted file mode 100644
index 5b13416d1ee..00000000000
--- a/Master/texmf-dist/doc/context/third/context-notes-zh-cn/ctxnotes.pdf
+++ /dev/null
Binary files differ
diff --git a/Master/texmf-dist/doc/context/third/context-notes-zh-cn/src/Makefile b/Master/texmf-dist/doc/context/third/context-notes-zh-cn/src/Makefile
deleted file mode 100644
index f49149b0dc4..00000000000
--- a/Master/texmf-dist/doc/context/third/context-notes-zh-cn/src/Makefile
+++ /dev/null
@@ -1,22 +0,0 @@
-PRODUCT=ctxnotes
-READER=evince
-
-all:
- context --mode=screen $(PRODUCT)
-
-print:
- context --mode=print $(PRODUCT)
- context --purge
-
-bib:
- context --mode=screen --once $(PRODUCT) \
- && bibtex $(PRODUCT) \
- && context --mode=screen $(PRODUCT)
-
-pdf:
- $(READER) $(PRODUCT).pdf &
-
-clean:
- context --purge
- rm -f *.aux *.bbl *.blg
- rm -f *.pdf
diff --git a/Master/texmf-dist/doc/context/third/context-notes-zh-cn/src/basis.tex b/Master/texmf-dist/doc/context/third/context-notes-zh-cn/src/basis.tex
deleted file mode 100644
index 6d1e46590b4..00000000000
--- a/Master/texmf-dist/doc/context/third/context-notes-zh-cn/src/basis.tex
+++ /dev/null
@@ -1,242 +0,0 @@
-\startcomponent basis
-\product ctxnotes
-
-\chapter{让 \CONTEXT\ 工作起来}
-\bookmark{让 ConTeXt 工作起来}
-
-目前,只有 \ConTeXt\ Minimals(\ConTeXt\ 最小包)提供了最新的 ConTeXt 版本并且可以使之与系统所安装的其它 TeX 发行版友好共存。本章介绍 \ConTeXt\ Minimals 的安装、基本使用以及 MkIV 的中文支持等知识,目的在于让你多快好省地拥有一个 \CONTEXT\ 文档编译环境。本章的最后介绍了一些初学者应当阅读的文档以及一些学习资源。
-
-\section[installmkiv]{\ConTeXt\ Minimals}
-\bookmark{ConTeXt Minimals}
-
-首先,在本地机器上创建一个 \ConTeXt\ 安装目录,该目录的位置与名字视个人嗜好而定,我喜欢用 \type{/opt/context}。为了不引起混乱,下文提及 \ConTeXt\ 安装目录皆以如下设定的 Bash 变量 \type{$CTXDIR} 代替:
-
-\starttyping
-$ export CTXDIR=/opt/context
-$ mkdir -p $CTXDIR
-\stoptyping
-
-然后下载 ConTeXt 最小包安装脚本,将其存放于 \type{$CTXDIR} 目录并执行:
-
-\starttyping
-$ cd $CTXDIR
-$ rsync -ptv \
-rsync://contextgarden.net/minimals/setup/linux/first-setup.sh .
-$ ./first-setup.sh
-\stoptyping
-
-由于安装脚本需要联网下载 \ConTeXt\ Minimals,需要等待一段时间才可以完成安装。这段时间,你可以做点自己喜欢做的事情。
-
-\ConTeXt\ Minimals 安装完毕后,就开始进行 \ConTeXt\ 运行环境的配置,这需要设置许多的系统环境变量。不过莫要担心,\ConTeXt\ Minimals 提供了一个配置脚本,使用 source(亦称点命令)命令加载该文件即可完成所有 \ConTeXt\ 所需环境变量的设定。
-
-\starttyping
-$ . $CTXDIR/tex/setuptex $CTXDIR/tex
-\stoptyping
-
-上述命令行可将 setuptex 配置文件中的诸多环境变量的设定在当前终端环境中保持有效性。这意味着,每次使用 \ConTeXt\ Minimals,可以开一个终端窗口,然后执行一次上述命令,之后就可以在该终端中使用 \ConTeXt\ 环境。如果需要使用系统所安装的其它 \TeX\ 发行套件,可另建一个未开启 \ConTeXt\ 环境的终端即可。
-
-虽然每次启用 \ConTeXt\ Minimals 所输入的命令行并不复杂,但是尽力让命令行简约且易于输入一向是 Unix-like 系统的光荣传统,因此我在 \type{$HOME/myscript} 目录下建立了一个配置文件 ctx,该文件内容如下:
-
-\starttyping
-export TEXDIR=/opt/context/tex
-source $TEXDIR/setuptex $TEXDIR
-export OSFONTDIR="/usr/share/fonts/{adobe,winfonts}"
-\stoptyping
-
-然后将 \type{$HOME/myscript} 目录添加到系统环境变量 \type{$PATH} 并使之生效:
-
-\starttyping
-$ echo "PATH=$PATH:$HOME/myscript" >> ~/.bashrc
-$ . ~/.bashrc
-\stoptyping
-
-这样,以后每次启用 \ConTeXt\ 环境时,只需执行以下命令:
-
-\starttyping
-$ . ctx
-\stoptyping
-
-注意,在 ctx 文件中设置了 \type{$OSFONTDIR} 变量,该变量的意义在下一章讲述 MkIV 中文排版时会进行详细阐述,现在可不予理会。
-
-使用 \type{ctxtools} 命令并配合 \type{-updatecontext} 参数可对所安装的 \ConTeXt\ Minimals 进行在线升级,不过前提是要建立 \type{$TEXMFLOCAL} 目录。因为 \ConTeXt\ Minimals 升级包是一个 zip 压缩档,升级时会将该压缩档下载到 \type{$TEXMFLOCAL} 目录并进行解压缩。
-
-\CONTEXT\ Minimals 的升级很简单,那就是再重装一遍。
-
-\section{若需要 \TeX\ 与 \LaTeX}
-\bookmark{若需要 TeX 与 LaTeX}
-
-\ConTeXt\ Minimals 可以与其它 \TeX\ 发行套件友好共存。最近,我打算使用 \XeTeX\ + plain \TeX\ 格式写一份文档,但是 \ConTeXt\ Minimals 默认未提供 \XeTeX\ 的 plain \TeX\ 格式并且缺乏一些 plain \TEX\ 必须的字体,因此基于 \XeTeX\ 的 plain \TEX\ 及 \LATEX\ 环境均无法正常运行。对于这个问题,我能想到的比较轻省的解决方案是安装一个 \TeX\ Live 2008,使用它所包含的 plain \TeX\ 环境,另外再安装一个 \LATEX\ 环境以备不时之需。
-
-首先从清华的 CTAN 镜像 FTP 服务器下载 \TEX\ Live 2008 的网络安装程序并解包:
-
-\starttyping
-$ wget ftp://ftp.tsinghua.edu.cn/mirror/CTAN/systems/texlive/\
-tlnet/tldev/install-tl-unx.tar.gz
-$ tar -zxvf install-tl-unx.tar.gz && cd install-tl-unx
-\stoptyping
-
-\TEX\ Live 2008 的安装程序兼顾了不同用户的软件使用习惯,同时提供了文本界面与图形界面两种安装模式:
-
-\starttyping
-$ install-tl # 文本界面安装
-$ install-tl --gui # 图形界面安装模式
-\stoptyping
-
-\type{install-tl} 程序在运行时会自动访问预设定的 CTAN 镜像 FTP 服务器,如果连接失败,安装过程也就终止了。对于国内用户,可以通过 \type{--location} 参数将 CTAN 镜像服务器设为清华的 FTP:
-
-\starttyping
-$ install-tl --location=ftp://ftp.tsinghua.edu.cn/\
-mirror/CTAN/systems/texlive/tlnet/tldev
-\stoptyping
-
-如果网速足够,那么应当很快就可以在终端中显示文本安装界面了,具体的安装过程应当参考 \TEX\ Live 2008 中文指南\footnote{http://tug.org/texlive/doc/texlive-zh-cn/}。\TEX\ Live 2008 成功安装后,只要不在终端中开启 \ConTeXt\ Minimals 的 \ConTeXt\ 环境,就不会影响它的使用。
-
-\section[helloworld]{Hello World}
-
-将下面代码使用文本编辑器保存为 hello-world.tex 文件,这就是一个最简单的 \ConTeXt\ 源文档。
-
-\starttyping
-% hello-world.tex
-\starttext
-Hello World.
-\stoptext
-\stoptyping
-
-我们可以在终端中使用 \type{context} 命令将这份源文档编译、输出为 PDF 文档:
-
-\starttyping
-$ . ctx
-$ context hello-world
-\stoptyping
-
-上述命令将在当前目录产生 hello-world.pdf 文档,使用 PDF 阅读器查看它,可以看到文档中除了“Hello World.”字串之外,就剩下一个置于顶端的页码了。
-
-在编译 hello-world.tex 时,生成了许多中间文件,如果你不喜欢看到它们,可以使用以下命令将其清除:
-
-\starttyping
-$ context --purge
-\stoptyping
-
-\section{\TeX\ 与 \ConTeXt\ 的关系}
-\bookmark{TeX 与 ConTeXt 的关系}
-
-在上一节 hello-world.tex 文档的编译过程中,我们可以获得的直观认识如下图所示:
-
-\setupFLOWcharts[nx=3,ny=1,
- dx=2\bodyfontsize,dy=4\bodyfontsize,
- width=8\bodyfontsize, height=4\bodyfontsize,
- maxwidth=.8\textwidth]
-
-\startFLOWchart[context-flow]
-
-\startFLOWcell
-\name{texfile}\location{1,1}\shape{singledocument}
-\text{\ConTeXt\ 源文档}
-\connection[rl]{context}
-\stopFLOWcell
-
-\startFLOWcell
-\name{context}\location{2,1}\shape{}
-\text{\ConTeXt\ 程序}
-\connection[rl]{pdf}
-\stopFLOWcell
-
-\startFLOWcell
-\name{pdf}\location{3,1}\shape{singledocument}
-\text{PDF 文档}
-\stopFLOWcell
-
-\stopFLOWchart
-
-\placefigure[force][fig:context-flow]{\ConTeXt\ 文档编译过程的直观认识}
- {\FLOWchart[context-flow]}
-
-实际上是没有所谓的“\ConTeXt\ 程序”的,真正实现 \TeX\ 文档编译的的是 \TeX\ 引擎。在 \ConTeXt\ MkIV 中,\type{context} 程序只是一个脚本文件,只有一行代码:
-
-\starttyping
-mtxrun --script context "$@"
-\stoptyping
-
-\type{mtxrun} 是一个 Lua 脚本,它需要调用 Lua\TEX\ 引擎并读入 cont-en.fmt 文件才可以对 \ConTeXt\ 文档进行编译处理。cont-en.fmt 是 \ConTeXt\ 的格式文件,可以将它理解为一本词典,当编译 \ConTeXt\ 文档时,Lua\TeX\ 引擎遇到文档中的排版命令时,就去 cont-en.fmt 文件中查找这些排版命令的定义并依命行事。可还记得 2.3 节中使用 \type{context --make} 命令么?这个命令就是用于产生 cont-en.fmt 之类的格式文件的。这就是为什么我们经常说 \ConTeXt\ 或 \LaTeX\ 是 \TeX\ 的一种格式的原因。
-
-\section{让 MkIV 讲中文}
-
-要让 \ConTeXt\ MkIV 讲中文,首先要让它能够找到中文字体所在。还记得 \in{}[installmkiv]\ 节中我们写的那个 \ConTeXt\ 环境配置文件 ctx 么?其中有一行代码如下:
-
-\starttyping
-export OSFONTDIR="/usr/share/fonts/{adobe,winfonts}"
-\stoptyping
-
-\type{$OSFONTDIR} 可以让 Lua\TeX\ 知道系统所安装的字体所在。
-
-我在 \type{/usr/share/fonts/adobe} 目录中存放了 4 款 Adobe OTF 中文字体,在 \type{/usr/share/fonts/winfonts} 目录中存放了一些从 Windows XP 中复制过来的一些中文字体。
-
-有了中文字体,还需要一份字体配置文件。\ConTeXt\ 提供了一套比较高级的字体机制,叫做 Typescript,它可以设置三种字型:衬线 (Serif)、非衬线 (Sans)与等宽 (Mono) 字型。这三种字型均为英文字体机制中的术语,就像我们中文字体有楷体、宋体、黑体等类型一样。\ConTeXt\ 的 Typescript 机制牵涉太多的字体知识,对它们的详细描述已超出我之所能,这里仅给出一份我照猫画虎搞出来的的一份字体配置文件——\type{zhfonts.tex},它是随这份文档一起发布的,只需将它放到 \type{TEX} 目录树中,譬如:
-
-\startniceTEX
-$ mkdir -p $TEXMFLLOCAL/tex/context/third
-$ mv zhfonts.tex $TEXMFLLOCAL/tex/context/third
-\stopniceTEX
-
-\noindent 然后执行:
-
-\starttyping
-$ context --generate
-\stoptyping
-
-\noindent 刷新一下文档数据库,就可以使用该字体配置文件了。
-
-在 zhfonts.tex 中,我使用了 Adobe 宋、黑、楷体作为主要的中文字体。如果你没有这些字体,可以将其替换为其它 TTF 或 OpenType 中文字体,但是要保证 Lua\TEX\ 可以找到它们。由于中文字体所包含的英文字形通常比较丑陋,因此在 zhfonts.tex 文件中利用了 MkIV 的混合字体机制,将 lmroman、lmsans、lmmono 以及它们的粗体的英文字形区域分别注入到相应的中文字体中。
-
-现在,将 \in[helloworld] 节中的 hello-world.tex 文档修改为:
-
-\startTEX
-\usetypescriptfile[zhfonts]
-\usetypescript[myfont]
-\setupbodyfont[myfont,rm,11pt]
-\starttext
-世界,你好!
-\stoptext
-\stopTEX
-
-重新编译这份文档,即可得到中文版的 hello-world.pdf 文档。
-
-\tex{usetypescriptfile} 命令用于加载 typescript 文件,要求 typescript 文件与 helloworld.tex 文件均在同一目录或者前者位于 \ConTeXt\ Minimals 的某个可以检索到的目录中。
-
-\tex{usetypescript} 命令表示使用 typescript 文件中定义的 typeface。所谓 typeface,就是一个字型族。在 zhfonts.tex 文件中所定义的 typeface为 myfont,该字型族包含了 3 种字型:Serif、Sans 与 Mono。\tex{setupbodyfont} 命令是用于定义 hello-world.tex 文档的默认字体,也就是正文字体,这里是将 myfont 字型族中的 Serif 字型作为文档的默认字体,并且默认尺寸为 11pt。
-
-现在,MkIV 基本上已经解决了中文排版问题,我们应当为此感谢 Hans、Taco 等开发者的辛勤劳动。另外,还要感谢 Wang Yue、SDE 诸位同学,他们提出了许多有关 \ConTeXt\ 中文支持的要求并报告了许多 bug。特别是 Wang Yue 同学,自去年始,一直在关注 Lua\TeX\ \& \ConTeXt\ MkIV 等项目的发展,并积极地与开发者们沟通,使得开发者认真考虑了有关中文处理的诸多需求。
-
-\section{开始 \ConTeXt\ 的旅程}
-\bookmark{开始 ConTeXt 的旅程}
-
-\ConTeXt\ MkIV 中文支持的成功尝试,奠定了我开始学习 \ConTeXt\ 的信心。\CONTEXT\ 的文档非常丰富,不过大部分都是英文的,这多少让我有点沮丧。虽然读英文文档不是什么大障碍,但是总没有中文文档来得亲切。现状如此,只好忍了。
-
-目前,\ConTeXt\ 的大多数文档是针对 MkII 版本的,除了 MkIV 手册之外,似乎再也没有其它文档来讲述 MkIV 的应用。不过,由于 MkIV 改变的主要是 \CONTEXT\ 底层,用户界面基本上没有改变,对于中文用户而言,基本上只需将 MkII 的中文字体支持机制改换为 MkIV 的即可,这样原来适用于 MkII 的文档基本上也适用于 MkIV。现在,\ConTeXt\ 项目组现在正在组织进行新的 \ConTeXt\ 文档撰写,这个工程非常浩大,其意在于将这么多年零散的文档汇总到一起,并追随 \CONTEXT\ 的最新进展,估计要到明年方能竣工。远水解不了近渴,现在学习 \CONTEXT,还是要从 MKII 版本的文档开始。
-
-作为初学者,{\it\ConTeXt, an excursion}\cite[ms-cb-en]文档是官方制作的新手入门必读文档。\ConTeXt\ 的官方文档通常是分为屏幕阅读版本与打印版本,我读的 {\it\ConTeXt, an excursion} 是屏幕阅读版本,第一次打开这份文档,就惊愕了一下,没想到 PDF 文档居然可以做得如此精致。内容浅显易懂,文档版面美观,我觉得 \ConTeXt\ 是非常礼遇初学者的。
-
-当读过 {\it\ConTeXt, an excursion} 时\footnote{实际上我是用到什么就去看什么,现在大概看了有一半内容。},就可以使用 \ConTeXt\ 排版手头上正在写作的一些文档,其实这才是真正的开始学习 \CONTEXT。对于其它任何一种 \TEX\ 都是如此,只有真正开始使用它,才有可能掌握它。一开始,文档的版面丑点没关系,毕竟内容是最重要的。随着对 \CONTEXT\ 的认识日益深刻,你的文档便会愈发具备可观赏性。在实践的过程中,\CONTEXT\ 用户手册\cite[cont-eni]是主要的参考书。当你遇到不解的命令/参数,或者想了解一些命令更多的细节,都可以使用 PDF 阅读器打开 \CONTEXT\ 用户手册,利用阅读器提供的查询功能找到你所感兴趣的内容,并掌握它们。
-
-字体在排版中是决定版面美观的重要因素,阅读 \CONTEXT\ 新手册中已经基本完工的 {\it fonts}\mycite{fonts} 部分,便可以理解 \CONTEXT\ 的字体机制,你将获得可以在 \CONTEXT\ 自如使用你喜欢的字体的能力;同时,我制作的那份 MkIV 中文字体配置文件也不再会令你感到困惑。
-
-若使用 \ConTeXt\ 排版时存在矢量图绘制需求,推荐使用 \METAPOST。不过,在 \ConTeXt\ 中,我们要面对的不是 \METAPOST,而是 \METAFUN\mycite{metafun},后者对前者进行了封装,实现了 \CONTEXT\ 与 \METAPOST\ 的完美结合。{\it\ConTeXt, an excursion} 文档版面之所以美观,是因为在排版中大量使用 \METAFUN 来美化版面布局的结果。
-
-若你对 \ConTeXt\ 已经有所认识,那么 \ConTeXt\ Wiki\footnote{\type{http://wiki.contextgarden.net/Main_Page}} 是非常好的网络学习资源。若有能力,可以在该 Wiki 上与整个世界的 \ConTeXt\ 用户分享你的学习经验;若暂时没能力,可以选择潜水。目前,我是这个 Wiki 众多潜水员中的一名。
-
-目前,\CONTEXT\ MkIV 也许还存在许多的 bug,当你发现它们,应当提交 \CONTEXT\ 邮件列表\footnote{http://archive.contextgarden.net/list/context.en.html}中;当你使用 \CONTEXT\ 时有不解的问题,也可以去邮件列表中寻找答案。说来惭愧,我英文不好,并且不熟悉邮件列表的交流规则,所以一直都胆怯于邮件列表上的交流。
-
-介绍了以上学习资源之后,我开始如释重负。以后再在这份文档上折腾,心里就不会总是想着自己在写一本 \CONTEXT\ 教程,那样子很累,并且很容易丧失乐趣。这份笔记的真正的意图是自我备忘,将它投放到网络上,是希望我的经验能够对他人有所帮助并且能够一同学习、讨论 \CONTEXT\ 排版知识。
-
-\section{更多阅读……}
-
-如果上述内容有误或者你认为讲述的不够细致,那么请阅读以下文档:
-
-\startitemize
-\item “序幕有些长”,介绍了 \TEX\ 与 \CONTEXT\ MkIV 的背景知识:\crlf \hbox{\tt http://garfileo.is-programmer.com/2011/1/10/zhfonts-usage.23740.html}
-\item “这就是 \CONTEXT\ Minimals”,讲述了 \CONTEXT\ Minimals 的安装方法:\crlf\hbox{\tt http://liyanrui.is-programmer.com/2009/10/7/this-is-context-minimals.11971.html}
-\stopitemize
-
-我计划今年年底将这些外部文档归整到这份文档中。
-
-\stopcomponent
diff --git a/Master/texmf-dist/doc/context/third/context-notes-zh-cn/src/bibl-lyr.tex b/Master/texmf-dist/doc/context/third/context-notes-zh-cn/src/bibl-lyr.tex
deleted file mode 100644
index 6e30f437813..00000000000
--- a/Master/texmf-dist/doc/context/third/context-notes-zh-cn/src/bibl-lyr.tex
+++ /dev/null
@@ -1,77 +0,0 @@
-\setupcite[num][inbetween={, }, lastpubsep={, },compress=yes]
-
-\def\withbrackets#1{[#1]~~}
-\setuppublications
- [sorttype=,
- criterium=,
- refcommand=num,
- numbering=yes,
- numbercommand=\withbrackets,
- autohang=yes]
-
-\setuppublicationlist
- [artauthor=\normalauthor,
- editor=\normalauthor,
- author=\normalauthor,
- namesep={,},
- lastnamesep={ and },
- finalnamesep={ and },
- firstnamesep={ },
- juniorsep={ },
- vonsep={ },
- surnamesep={ },
- authoretallimit=5,
- editoretallimit=5,
- artauthoretallimit=5,
- authoretaldisplay=5,
- editoretaldisplay=5,
- artauthoretaldisplay=5,
- authoretaltext={ etc},
- editoretaltext={ etc},
- artauthoretaltext={ etc},
-]
-
-\setuppublicationlayout[article]{%
- \insertartauthors{}{\unskip.}{}%
- \insertarttitle{\bgroup }{\egroup[J].}{}%
- \insertjournal{\bgroup }{\egroup}{}%
- \insertpubyear{,}{}{}%
- \insertvolume{,}{}{}%
- \insertissue{(}{)}{}%
- \insertpages{:}{.}{}%
-}
-
-\setuppublicationlayout[phdthesis]{%
- \insertauthors{}{\unskip.}{}%
- \inserttitle{}{\unskip[D].}{}%
- \insertpubname{}{,}{}%
- \insertpubyear{}{.}{}%
-}
-
-\setuppublicationlayout[techreport]{%
- \insertauthors{}{.}{}%
- \inserttitle{}{[R].}{}%
- \insertpubname{}{}{}%
- \insertpubyear{,}{.}{}%
-}
-
-\setuppublicationlayout[inproceedings]{%
- \insertauthors{}{.}{}%
- \insertarttitle{}{[C].}{}%%
- \inserttitle{}{}{}%
- \insertpubyear{,}{.}{}%
-}
-
-\setuppublicationlayout[book]{%
- \insertauthors{}{.}{}%
- \inserttitle{}{[M].}{}%
- \insertpubname{}{}{}%
- \insertpubyear{,}{.}{}%
- \insertnote{}{}{}%
-}
-
-\setuppublicationlayout[unpublished]{%
- \insertauthors{}{.}{}%
- \inserttitle{}{.}{}%
- \inserturl{}{}{}%
-}
diff --git a/Master/texmf-dist/doc/context/third/context-notes-zh-cn/src/bibliography.bib b/Master/texmf-dist/doc/context/third/context-notes-zh-cn/src/bibliography.bib
deleted file mode 100644
index 0203a2de9ac..00000000000
--- a/Master/texmf-dist/doc/context/third/context-notes-zh-cn/src/bibliography.bib
+++ /dev/null
@@ -1,53 +0,0 @@
-@unpublished{bibtex,
- title = {{Tame the BeaST: The B to X of Bib\TeX}},
- author = {Nicolas Markey},
- url = {http://www.ctan.org/tex-archive/info/bibtex/tamethebeast/},
-}
-
-@unpublished{fonts,
- title = {{Fonts in \ConTeXt}},
- author = {PRAGMA},
- url = {http://context.aanhet.net/svn/contextman/context-reference/en/co-fonts.pdf},
-}
-
-@unpublished{Taco,
- title = {{Bibliographies}},
- author = {Taco Hoekwater},
- url = {http://modules.contextgarden.net/bib},
-}
-
-@unpublished{TacoCTXWiki,
- title = {{Bibliography}},
- author = {Taco Hoekwater},
- url = {http://wiki.contextgarden.net/Bibliography},
-}
-
-@unpublished{widgets,
- title = {{WIDGETS uncovered}},
- author = {PRAGMA},
- url = {http://pragma-ade.com/general/manuals/mwidget-s.pdf},
-}
-
-@unpublished{cont-eni,
- title = {{\ConTeXt the manual}},
- author = {PRAGMA},
- url = {http://www.pragma-ade.com/general/manuals/cont-eni.pdf},
-}
-
-@unpublished{ms-cb-en,
- title = {{\ConTeXt an excursion}},
- author = {PRAGMA},
- url = {http://www.pragma-ade.com/general/manuals/ms-cb-en.pdf},
-}
-
-@unpublished{metafun,
- title = {{METAFUN}},
- author = {Hans Hagen},
- url = {http://www.pragma-ade.com/general/manuals/metafun-s.pdf},
-}
-
-@unpublished{lnotes,
- title = {{\LATEX 学习笔记}},
- author = {Alpha Huang},
- url = {http://www.ctan.org/tex-archive/info/lnotes/lnotes.pdf},
-}
diff --git a/Master/texmf-dist/doc/context/third/context-notes-zh-cn/src/ctxnotes.tex b/Master/texmf-dist/doc/context/third/context-notes-zh-cn/src/ctxnotes.tex
deleted file mode 100644
index 87059cd3f56..00000000000
--- a/Master/texmf-dist/doc/context/third/context-notes-zh-cn/src/ctxnotes.tex
+++ /dev/null
@@ -1,88 +0,0 @@
-\environment doc-env
-%\startproduct ctxnotes
-\starttext
-
-% 封面
-\startMPinclusions
- def random_hash_frame (expr width, height, offset, linewidth ) =
-
- def delta = ((uniformdeviate .5offset) + .25offset) enddef ;
- x1 := offset ; y1 := offset ; x2 := width-offset ; y2 := height-offset ;
-
- drawoptions(withpen pencircle scaled linewidth withcolor transparent(1,.8,\MPcolor{BackgroundColor})) ;
- fill z1--(x2,y1)--z2--(x1,y2)--cycle ;
-
- drawoptions(withpen pencircle scaled linewidth withcolor \MPcolor{OrnamentColor}) ;
- draw (x1-delta,y1)--(x2+delta,y1) ;
- draw (x2,y1-delta)--(x2,y2+delta) ;
- draw (x2+delta,y2)--(x1-delta,y2) ;
- draw (x1,y2+delta)--(x1,y1-delta) ;
-
- drawoptions();
- setbounds currentpicture to unitsquare xscaled width yscaled height ;
- enddef ;
-\stopMPinclusions
-
-\startuseMPgraphic{TitleGraphic}
- for i=1 upto 400 :
- offset := uniformdeviate 10pt ;
- width := 2*offset + 40pt + uniformdeviate 30pt ;
- height := 2*offset + 30pt + uniformdeviate 10pt ;
- addto currentpicture also
- image(random_hash_frame(width,height,offset,1pt)) shifted
- (uniformdeviate OverlayWidth, uniformdeviate OverlayHeight) ;
- endfor ;
-\stopuseMPgraphic
-
-\defineoverlay [TitleGraphic] [\useMPgraphic{TitleGraphic}]
-
-% 前文
-\startfrontmatter
-\setupbackgrounds [page][background=TitleGraphic]
-\startstandardmakeup
- \startcolor[white]
- \startframedtext[middle][width=.8\textwidth,height=5cm]
- \dontleavehmode
- \blank[.5cm]
- \hfil\bfd\ConTeXt\ 学习笔记\hfil
- \blank[.5cm]
- \hfil\bfc Using MkIV\hfil
- \blank[1cm]
- \hfil\bfa Li Yanrui (liyanrui.m2@gmail.com)\hfil
- \stopframedtext
- \stopcolor
- \blank[14cm]
-\stopstandardmakeup
-\setupbackgrounds [page][background=]
-\setuppagenumbering[conversion=romannumerals]
-\setuppagenumber[number=1]
-\title{目\;\;录}\blank
-\placecontent
-\stopfrontmatter
-
-% 正文
-\startbodymatter
-\setuppagenumbering[conversion=number]
-\setuppagenumber[number=1]
-\setups{HeaderFooter}
-\component basis
-\component fonts
-\component layout
-\component references
-\component project
-\component metafun
-\stopbodymatter
-
-% 附录
-\startappendices
-\title{参考文献}
-\placepublications[criterium=all]
-\stopappendices
-
-% 后文
-\startbackmatter
-未完成……
-\stopbackmatter
-
-%\stopproduct
-\stoptext
diff --git a/Master/texmf-dist/doc/context/third/context-notes-zh-cn/src/doc-env.tex b/Master/texmf-dist/doc/context/third/context-notes-zh-cn/src/doc-env.tex
deleted file mode 100644
index 138b60d565c..00000000000
--- a/Master/texmf-dist/doc/context/third/context-notes-zh-cn/src/doc-env.tex
+++ /dev/null
@@ -1,153 +0,0 @@
-\startenvironment doc-env
-
-\usemodule[zhfonts]
-
-\usemodule[chart]
-\usemodule[t][layout]
-
-\setupcolor[hex]
-\definecolor [BackgroundColor] [h=cccccc]
-\definecolor [OrnamentColor] [h=99ccff]
-\definecolor [TitleColor] [h=336699]
-
-\setupinteraction
- [state=start,
- focus=standard,
- color=darkblue,
- title={ConTeXt 学习笔记},
- subtitle={Using MkIV},
- author={Li Yanrui},
- keyword={TeX, ConTeXt, MkIV, LuaTeX}]
-
-%\setupinteractionscreen[option=max]
-
-\setuppapersize[A4][A4]
-\setuplayout[width=fit,height=middle,
- leftmargin=2cm,rightmargin=2cm,
- backspace=2.5cm,topspace=2cm,
- headerdistance=.5cm,footerdistance=.5cm,
- leftmargindistance=.5cm,rightmargindistance=.5cm,
- header=1cm,footer=1cm]
-\setuppagenumbering[style=\tfx,location=]
-
-\setuptolerance[horizontal, stretch]
-
-% 图片目录
-\setupexternalfigures[directory={./figures}]
-
-%-------- 标题设置 --------
-\setupheads[indentnext=yes]
-
-\setuphead[title][style=\bfb,align={broad,middle},header=empty,foote=empty]
-\setuphead[chapter][style=\bfb,header=empty,footer=empty]
-\setuphead[section][style=\bfa]
-\setuphead[subsubject][style=\bf]
-
-% 代码环境
-\setuplinenumbering[color=darkgray,style=small]
-\setuptyping[option=color,palet=graypretty,
- before={\blank[.5em]\setupinterlinespace[line=1.2em]},
- after={\blank[.5em]}]
-
-\definetyping[niceTEX][option=TEX]
-
-%-------- 中文化 --------
-\setuplabeltext [en] [chapter={第\;,\;章}]
-\setuplabeltext [en] [figure=图\;]
-\setuplabeltext [en] [table=表\;]
-\setupheadtext[en][pubs={\bfc 参考文献}]
-\setupheadtext[en][content={\bfc 目录}]
-
-%% 目录 %%
-\def\ChapterNumber#1{\doiftext{#1}{第\;#1\;章\quad}}
-\setuplist
- [chapter]
- [alternative=a,
- before=\blank,
- after=\blank,
- style=\bf,
- width=fit,
- pagestyle=boldslanted,
- pagenumber=no,
- numbercommand=\ChapterNumber]
-
-\def\PageNumber#1{\underbars{#1}.}
-\setuplist
- [section]
- [alternative=d,
- style=normal,
- pagecommand=\PageNumber,
- pagestyle=\itx]
-
-% 页眉页脚
-\startsetups HeaderFooter
- \def\CurrentChapter{%
- 第 \headnumber[chapter]\ 章%
- \hbox to 2em{}%
- \getmarking[chapter]%
- }
- \def\CurrentSection{%
- \headnumber[section]%
- \hbox to 2em{}%
- \getmarking[section]%
- }
- \setupheadertexts
- [\CurrentChapter][pagenumber]
- [pagenumber][\CurrentSection]
- \setupheader[style=\bfx,color=darkgray]
-\stopsetups
-
-% 书签
-\setupinteractionscreen[option=bookmark]
-\placebookmarks[chapter,section][chapter]
-
-% 参考文献
-\setupbibtex[database=bibliography]
-\setuppublications[alternative=lyr]
-
-%---- 其它一些零碎设置 ----
-\setupinterlinespace[line=1.5em]
-\setupwhitespace[big]
-
-\setupfloats[indentnext=yes]
-\setupcaptions[style=\tfx, headstyle=\normal]
-
-\setupitemize[each][packed,serried,inmargin][margin=2em]
-
-\setupfootnotes[way=bychapter]
-
-\setupinmargin[left,right][style=\tfx]
-
-\definedescription[definition]
- [location=top,hang=20,width=broad,indenting=always,style=\ss,headstyle=\bf]
-
-\def\mycite#1{\cite[#1]}
-
-%% 阴影盒
-
-\startuniqueMPgraphic{shade box}
- path p;
- u := 1cm; w := \overlaywidth; h := \overlayheight;
- roundcorner := 8pt; offset := 12pt;
-
- color shade;
- shade := (.6,.6,.6);
-
- for i = 0 step .02 until 1:
- fill unitsquare xyscaled (w-i*u,h-i*u) squeezed (8pt,6pt)
- shifted (offset+i*u/2,-offset+i*u/2)
- withcolor transparent (1,.1,shade);
- endfor;
-
- p := unitsquare xyscaled (w, h);
- draw p withcolor transparent (1,0,white);
-
- p := p shifted (offset/2, -offset/2) squeezed (8pt,6pt);
- fill p withcolor \MPcolor{darkgray};
- draw p withcolor \MPcolor{OrnamentColor};
-\stopuniqueMPgraphic
-
-\defineoverlay[shade box][\uniqueMPgraphic{shade box}]
-\setupframedtexts[frame=off,background={shade box}]
-
-\stopenvironment
diff --git a/Master/texmf-dist/doc/context/third/context-notes-zh-cn/src/figures/bookmark.png b/Master/texmf-dist/doc/context/third/context-notes-zh-cn/src/figures/bookmark.png
deleted file mode 100644
index 7dc8c6f060f..00000000000
--- a/Master/texmf-dist/doc/context/third/context-notes-zh-cn/src/figures/bookmark.png
+++ /dev/null
Binary files differ
diff --git a/Master/texmf-dist/doc/context/third/context-notes-zh-cn/src/figures/cow.pdf b/Master/texmf-dist/doc/context/third/context-notes-zh-cn/src/figures/cow.pdf
deleted file mode 100644
index 2441faf74e7..00000000000
--- a/Master/texmf-dist/doc/context/third/context-notes-zh-cn/src/figures/cow.pdf
+++ /dev/null
Binary files differ
diff --git a/Master/texmf-dist/doc/context/third/context-notes-zh-cn/src/figures/gardeninglion.jpg b/Master/texmf-dist/doc/context/third/context-notes-zh-cn/src/figures/gardeninglion.jpg
deleted file mode 100644
index 262d8e4c7fc..00000000000
--- a/Master/texmf-dist/doc/context/third/context-notes-zh-cn/src/figures/gardeninglion.jpg
+++ /dev/null
Binary files differ
diff --git a/Master/texmf-dist/doc/context/third/context-notes-zh-cn/src/figures/header.png b/Master/texmf-dist/doc/context/third/context-notes-zh-cn/src/figures/header.png
deleted file mode 100644
index 04cd4ec1951..00000000000
--- a/Master/texmf-dist/doc/context/third/context-notes-zh-cn/src/figures/header.png
+++ /dev/null
Binary files differ
diff --git a/Master/texmf-dist/doc/context/third/context-notes-zh-cn/src/fonts.tex b/Master/texmf-dist/doc/context/third/context-notes-zh-cn/src/fonts.tex
deleted file mode 100644
index c597b23ee57..00000000000
--- a/Master/texmf-dist/doc/context/third/context-notes-zh-cn/src/fonts.tex
+++ /dev/null
@@ -1,219 +0,0 @@
-\startcomponent fonts
-\environment doc-env
-\product ctxnotes
-
-\chapter{在字体中挣扎}
-
-当我刚开始学用 \LATEX\ 时,就患上了字体恐惧症。如果只是写英文文档,那么对于初学者而言实在是太简单了,基本上不需要怎么关心字体的问题;但是对于中文或者其它非西语文字而言,\TEX\ 的易用性依然很弱,以至于用户不得不去弄清楚诸多有关字体方面的知识及其配置方法。我很憎恶这些东西,但是也没有办法,排版本来就不是一件易事,只好秉承“为之,则难者易易也”的精神去摸索一下。我开始阅读 \CONTEXT\ Fonts 文档\mycite{fonts},这一章内容就是我的阅读笔记。
-
-\section{字体、别名与特征}
-
-为字体文件取个别名,这是 \CONTEXT\ 字体机制推荐的做法。比如,我们可以将 AdobeSongStd-Light.otf 字体取名为 Song:
-
-\startniceTEX
-\definefontsynonym
- [Song][AdobeSongStd-Light][features=zh]
-\stopniceTEX
-
-\noindent \type{features=zh} 参数是用来告诉 \CONTEXT\ MkIV 应当采用中文 (zh) 方式来处理这款字体。\type{features} 的值并非 \CONTEXT\ 提供的标准值,而是要用户自己定义:
-
-\startniceTEX
-\definefontfeature
- [zh][mode=node,script=hang,lang=zhs]
-\stopniceTEX
-
-\noindent \type{zh} 这个 font feature 名字可根据自己的嗜好来定;至于第二组参数,对于简体中文用户,通常这样设置就可以。
-
-\tex{definefontfeature} 与 \tex{definefontsynonym} 命令的用法在与本文档一同发布的 zhfonts.tex 文件中均有体现,可参照理解。
-
-这里需要注意一下字体别名定义中的字体名称。上面的示例中,我直接使用 \type{AdobeSongStd-Light} 告诉 MkIV:我使用的是 AdobeSongStd-Light.otf 字体。实际上,这样的效率会有点低。因为 MkIV 有两种搜索字体的方式,第一种是根据字体开发商给出的字体名 (name),第二种是字体的文件名 (file)。字体名可以使用 \type{fc-list} 命令来查,譬如查询搜索 AdobeSongStd-Light.otf 的字体名:
-
-\starttyping
-> fc-list | grep Song
-Adobe 宋体 Std L,Adobe Song Std,Adobe 宋体 Std,
-Adobe Song Std L:style=L,Regular
-\stoptyping
-
-\noindent 我们可以得到许多字体名,推荐从中选择一个纯英文的供给 MkIV,譬如:
-
-\startniceTEX
-\definefontsynonym
- [Song][name:Adobe Song Std][features=zh]
-\stopniceTEX
-
-如果想使用字体文件名,可以为其冠以 \type{file} 前缀:
-
-\startniceTEX
-\definefontsynonym
- [Song][file:AdobeSongStd-Light][features=zh]
-\stopniceTEX
-
-在本节最初的那个例子中,既没有 \type{name} 前缀,也没有 \type{file} 前缀,那么 MkIV 就只好先尝试字体名;如果找不到字体,再去尝试字体文件名。
-
-我觉得使用字体名比较正规一些,因为字体的文件名很容易被改掉;字体名是由开发商设定的,一般用户不会想到去修改它,因此使用它可以提高文档的可移植性。
-
-\CONTEXT\ 预定义了一些标准的字体别名,我们常用的是\crlf\type{[Serif|Sans|Mono][Bold|Italic|BoldItalic]},它们在 zhfonts.tex 中均出现了。
-
-还值得注意的一个问题就是:我们可以定义字体别名的别名。
-
-\section{简单的字体定义}
-
-使用 \tex{definefont} 命令可以实现最快捷、最容易理解的字体定义与使用。比如我想定义 Adobe 宋体并使用它:
-
-\startniceTEX
-\definefont
- [Song]
- [{name:Adobe Song Std*zh} at 14pt]
-
-\starttext
-\Song 我使用的是 Adobe 宋体
-\stoptext
-\stopniceTEX
-
-或许上面这个例子看起来有点古怪,我将字体定义的部分改写一下,或许就会清楚一些:
-
-\startniceTEX
-\definefontsynonym
- [SongTi][name:Adobe Song Std][features=zh]
-
-\definefont
- [Song][SongTi at 14pt]
-\stopniceTEX
-
-如果在定义字体时,不去硬性地设定字体尺寸,那么 \CONTEXT\ 可以根据具体的排版环境自动为字体设定合适的尺寸。
-
-\section{Typescript 与 typeface}
-
-说实在的,typescript 的中文意思我真的说不出来,词典上可以查到的解释是“用打字机打的文件”。我在中文里也实在找不出简洁、准确的翻译,所以还是直称 typescript 为好。
-
-简单来说,typescript 是 \CONTEXT\ 的最上层的字体配置文件。目前,MkIV 没有提供面向中文用户的 typescript 文件,这就需要我们自行去实现,因此掌握 typescript 文件的写法非常重要。
-
-在只针对 MkIV 的 typescript 配置与使用中,常用命令如下:
-
-\startitemize
-\item typescript 环境
-\item \tex{definefontsynonym}
-\item \tex{definetypeface}
-\item \tex{usetypescriptfile}
-\item \tex{usetypescript}
-\stopitemize
-
-\noindent 下面我将结合 zhfonts.tex 中的部分内容来理解这些命令的用法。
-
-在 zhfonts.tex 文件中可以看到,typescript 文件内容是被 typescript 环境分为多个小节的,每个小节实现了一组字体的配置:
-
-\startniceTEX
-\definefontfeature
- [zh][mode=node,script=hang,lang=zhs]
-
-\starttypescript[serif] [zhfont]
- ... ...
-\stoptypescript
-
-\starttypescript[sans][zhfont]
- ... ...
-\stoptypescript
-
-\starttypscript[mono][zhfont]
- ... ...
-\stoptypescript
-
-\starttypescript[myfont]
- ... ...
-\stoptypescript
-\stopniceTEX
-
-上述代码,我设置了三种字样 (typeface):衬线 (serif)、非衬线 (sans) 与等宽 (mono)。最后的那个 typescript 环境是打算用来定义字样集合的。有关这里的字样的概念,可参考黄老师的《\LATEX\ 学习笔记》\mycite{lnotes}的第 8 章来理解,同时你也可以从中额外获得一些 \TEX\ 字体的常识。
-
-我们是在 typescript 环境中定义具体的字体,比如下面定义衬线字样的一组字体:
-
-\startniceTEX
-\starttypescript[serif] [zhfont]
- \definefontsynonym
- [Serif][name:adobesongstd]
- \definefontsynonym
- [SerifBold][name:adobeheitistd]
- \definefontsynonym
- [SerifItalic][name:adobekaitistd]
- \definefontsynonym
- [SerifBoldItalic][name:adobeheitistd]
-\stoptypescript
-\stopniceTEX
-
-\noindent 因为已经知道了 \tex{definefontsynonym} 命令的作用,因此上述字体的定义看起来就非常简单了,就是用我们所指定的一组字体去替换 \ConTeXt\ 标准字体别名默认所使用的字体而已。我们可以按照这样的方式完成非衬线与等宽字样的字体定义,不再赘述。
-
-下面来看一下字样的定义:
-
-\startniceTEX
-\starttypescript[myfont]
- \definetypeface[myfont][rm][serif][zhfont][features=zh]
- \definetypeface[myfont][ss][sans][zhfont][features=zh]
- \definetypeface[myfont][tt][mono][zhfont]
-\stoptypescript
-\stopniceTEX
-
-\noindent \tex{definetypeface} 命令的第三个参数与第四个参数是与前面的 typescript 环境参数对应一致的,比如:
-
-\startniceTEX
-\definetypeface
- [adobe][rm][serif][zhfont]
-\stopniceTEX
-\noindent 对应:
-\startniceTEX
-\starttypescript[serif][zhfont]
- ... ... ...
-\stoptypescript
-\stopniceTEX
-\noindent 其中含义就是将 adobe 字样集合的衬线 (rm) 字样设为该 typescript 文件中具有 \type{[serif][zhfont]} 参数的 typescript 环境所定义的字体集;也就是说,\CONTEXT\ 可以根据 \tex{definetypeface} 的第三、四个参数来匹配对应的 typescript 环境。不知我有没有说明白。总之,在此要认真体会一下 typescript 环境参数的作用,姑且可以将其当作是对应 typescript 环境唯一的标识符号。至于 \tex{definetypeface} 前两个参数,其实也是作为一个标识符来用的,这在使用 typescript 文件时就可以看到。
-
-将上述的知识汇在一起,就可以写出类似 zhfonts.tex 这样的 typescript 文件,若将其投入到 \TEX\ 目录树中,就可以在排版时使用它了,譬如:
-
-\startniceTEX
-\usetypescriptfile[zhfonts]
-\usetypescript[myfont]
-\setupbodyfont[adobe,rm,11pt]
-\stopniceTEX
-
-\noindent 首先 \tex{usetypescriptfile} 命令驱使 \CONTEXT\ 在 \TEX\ 目录树中找到 zhfonts.tex 这个 typescript 文件;然后 \tex{usetypescript} 命令可以在 zhfonts.tex 文件中匹配含有一个参数为 myfont 的 typescript 环境,并读取该环境所定义的字样信息;最后使用 \tex{setupbodyfont} 命令将 typescript 文件中所定义的某种字样其定位文档的默认字体集,\tex{definetypeface} 命令的前两个参数的用途再次便得以体现出来。
-
-\section{混合字体}
-
-从概念上讲,混合字体就是将两种或更多的字体的不同编码部分合成到一起,形成一种新的字体。比如,中文字体往往也会包含了英文部分,偏偏这部分字体设计的又太差。所以,目前对于中文用户而言,混合字体机制实在是重之又重,因为我们可以利用这套机制来实现将一部分好看的英文字体注入到中文字体中,以此来实现美观的中英文混合文本排版。
-
-下面展示一个小例子,用以说明如何使用 MkIV 的混合字体机制:
-
-\startniceTEX
-\definefontsynonym
- [zhserif][name:adobesongstd]
-\definefontfallback
- [serifwhatever][lmroman10-regular][0x0000-0x0400][force=yes]
-\definefontsynonym
- [ZhSerif][zhserif][fallbacks=serifwhatever]
-\definefont[FbSong][ZhSerif at 12pt]
-\definefont[Song][name:adobesongstd at 12pt]
-
-\starttext
-\FbSong
-中英文混合:To do or not to do, this is the question!
-
-\Song
-中英文混合:To do or not to do, this is the question!
-\stoptext
-\stopniceTEX
-
-字体切换命令 \tex{ZhSerif} 使用的是混合字体,是 Adobe 宋体的 \type{0x0000-0x0400} 区域中掺入了 lmroman10 字体的对应区域;而 \tex{Song} 命令使用的则是纯的 Adobe 宋体。上面的例子也许看不出来混合字体的优势所在,这主要是因为 Adobe 宋体中的英文部分设计的还算不错。如果将 Adobe 宋体换成 SimSun,对比效果会更明显一些。
-
-我们可以将这种混合字体机制与 MkIV 的 typescript 机制相结合,在不同风格的中文字体中掺入类似风格的英文字符,这样中英文混合排版的问题就能够得到较好的解决。
-
-\section{更多阅读……}
-
-如果上述内容有误或者你认为讲述的不够细致,那么请阅读以下文档:
-
-\startitemize
-\item “不仅仅是为了中文”,详细介绍了 \CONTEXT\ 的 Typescript 机制:\crlf \hbox{\tt http://liyanrui.is-programmer.com/2009/10/21/not-just-for-chinese.12264.html}
-\item “zhfonts 模块的用法”,zhfonts 模块可支持中文字体加载、标点间距调整等功能:\crlf \hbox{\tt http://garfileo.is-programmer.com/2011/1/10/zhfonts-usage.23740.html}
-\stopitemize
-
-我计划今年年底将这些外部文档归整到这份文档中。
-
-\stopcomponent
diff --git a/Master/texmf-dist/doc/context/third/context-notes-zh-cn/src/layout.tex b/Master/texmf-dist/doc/context/third/context-notes-zh-cn/src/layout.tex
deleted file mode 100644
index 52691d16d8a..00000000000
--- a/Master/texmf-dist/doc/context/third/context-notes-zh-cn/src/layout.tex
+++ /dev/null
@@ -1,233 +0,0 @@
-\startcomponent layout
-\product ctxnotes
-
-\chapter{版面设计}
-
-其实我不懂排版,我只是希望这份文档的版面看上去不那么丑陋,所以我经常留意有关排版的知识,并乐于使用 \CONTEXT\ 来实践。我将这个实践的过程整理出来,就是本章所记述的内容,并且每当我修改本文档的版面风格时,这一章的内容也会适应性的变动。可以将本章看作是这份笔记版面设计的说明书。
-
-\section{页面与纸张}
-
-页面尺寸就是文档的版面尺寸,而纸张尺寸是指文档印刷用纸的规格,它们的取值一般是相同的;只有在要求每张印刷用纸上实现多页排版时,二者的取值才不一样。这份笔记的屏幕阅读文档页面与纸张尺寸设定如下:
-
-\startniceTEX
-\definepapersize[SCREEN][width=24cm,height=18cm]
-\setuppapersize[SCREEN][SCREEN]
-\stopniceTEX
-
-\noindent 其意是指页面与纸张的尺寸的宽高分别为 24cm 与 18cm,这是考虑到显示屏幕尺寸的宽高比一般为 4:3,这样可以充分利用屏幕区域,并且翻页方便。
-
-页面与纸张的规格可以采用 \CONTEXT\ 已经预定义好的国际标准规格,如 A0~A10、B0~B5 等;也可以采用自定义尺寸:
-
-\startniceTEX
-\definepapersize[I18][width=18.5cm,height=23cm]
-\setuppapersize[I18][I18]
-\stopniceTEX
-
-\noindent 这里定义的 I18 规格的页面与纸张尺寸,是近年来计算机技术书籍排版常用的纸张规格。
-
-\section{版面布局}
-
-\CONTEXT\ 将版面划分为 25 个区域,具体的区域划分在 {\it\CONTEXT, an excursion}\cite[ms-cb-en]文档的第 32 章 {\it Page Layout} 中可以看到,也可以在 \CONTEXT\ Wiki 的 {\it Layout} 页面看到\footnote{http://wiki.contextgarden.net/Layout}。
-
-我为这份文档所规划的版面布局如下:
-
-\startmode[print]
-\startniceTEX
-\setuplayout
- [leftmargin=2cm,
- rightmargin=3cm,
- width=fit,
- height=fit,
- topspace=1cm,
- header=1.5cm,
- footer=1.5cm]
-\stopniceTEX
-\stopmode
-
-\startmode[screen]
-\startniceTEX
-\setuplayout
- [width=fit,
- height=middle,
- leftmargin=3cm,
- rightmargin=3cm,
- backspace=4cm,
- topspace=.5cm,
- headerdistance=.4cm,
- footerdistance=.4cm,
- header=1cm,
- footer=1cm]
-\stopniceTEX
-\stopmode
-
-\noindent 下一页的插图显示了这些参数的布局效果,这里交代一下,那幅插图是利用了 Patrick 写的一个模块 (Module)\footnote{\type{http://modules.contextgarden.net/t-layout}}绘制的。
-
-\type{\setuplayout} 命令所具有的参数,在数量上堪称是 \ConTeXt\ 命令之最,如果我没有数错,应该是 44 个,常用的参数也就是下一页插图中所示的那些了。通过这些参数,\ConTeXt\ 可实现各种复杂的版面布局。
-
-说点闲话。如果我没记错的话,MS Word 用来设置版面布局的参数不超过 10 个。在 \LATEX\ 中,需要借助一些宏包才可以比较方便地实现版面布局控制。复杂与统一,也许这是 \CONTEXT\ 的一个很重要的特征,复杂是追求功能强大的必然结果,而统一可以让用户只需一份官方提供的技术手册就可以毫无争议地使用这些功能。
-
-注意,将 \type{\setuplayout} 的 \type{width} 与 \type{height} 参数设为 \type{fit} 或 \type{middle} 都可以让 \CONTEXT\ 自动为我们确定它们的值。\type{fit} 参数的确定是根据周边邻域参数计算出来的,而 \type{middle} 不是很关心周边参数,它只需要将 \type{width} 或 \type{height} 所确定的尺度相对于同一维向的页面尺度是居中的。
-
-\type{location} 这个参数让我费解了许久,历经多次尝试,总算知道一点所以然。当我们将版面尺寸与纸张尺寸设为相同时,\type{location} 这个参数无论如何设定都是看不到效果的。当纸张尺寸大于版面尺寸时,\type{location} 的值可以表示版面在纸张的位置,譬如 left、right、middle、singlesided 以及 doublesided。
-
-\page
-\ShowLayout[digit=1,showmore=0]
-\page
-
-\section[HFer]{页眉、页脚}
-
-对于这份文档的页眉,我将奇数页的页眉设为当前章标题(左)+ 页码(右);偶数页的页眉设为当前节标题(左)+ 页码(右):
-
-\startniceTEX
-\def\CurrentChapter{%
- 第 \headnumber[chapter]\ 章%
- \hbox to wem{}%
- \getmarking[chapter]%
-}
-
-\def\CurrentSection{%
- \headnumber[section]%
- \hbox to 2em{}%
- \getmarking[section]%
-}
-
- \setupheadertexts
- [\CurrentChapter][pagenumber]
- [pagenumber][\CurrentSection]
-\stopniceTEX
-
-\tex{setupheadertexts} 命令的参数设置的有些古怪,按手册上讲的,前两个参数分别用于设置奇数页的页眉左侧与右侧内容,后两个参数则用于设置偶数页的页眉左侧与右侧内容,但是在上述的页眉设置语句中,我只有将偶数页的页眉内容的左右位置掉换过来才可以得到这份文档的页眉结构。我并不知道为什么要这样设置,只是多次尝试才知道只有如此才能实现我的要求。
-
-由于设置在页眉中显示页码,所以应当引去 \CONTEXT\ 自动为页面添加的页码,顺便把页码的字号也设置一下:
-
-\startniceTEX
-\setuppagenumbering
- [style=\tfx,location=]
-\stopniceTEX
-
-我感觉 \CONTEXT\ 是有点另类,居然让 \tex{setuppagenumbering} 来设置双面打印文档模式。如果,我想将本文档的页眉结构变成:奇数页的页眉设为当前章标题(左)+ 页码(右);偶数页的页眉设为当前节标题(右)+ 页码(左),只需在 \tex{setuppagenumbering} 命令中设定 \type{alternative} 参数即可:
-
-\startniceTEX
-\setuppagenumbering
- [alternative=doublesided,style=\tfx,location=]
-\stopniceTEX
-
-\noindent 感觉有点莫名其妙,也许因为我还未发现正确的页眉设置方法的缘故。
-
-页脚的设定方法与页眉类似,我在页脚的左侧设置了显示这份文档的名称,在其右侧显示可以跳往目录页的链接:
-
-\startniceTEX
-\startmode[screen]
-\setupfootertexts
- [{\ConTeXt\ MkIV 学习笔记}][{\goto{回目录}[content]}]
- [{\goto{回目录}[content]}][{\ConTeXt\ MkIV 学习笔记}]
-\stopmode
-\stopniceTEX
-
-\noindent 用到了 \CONTEXT\ 的 mode 环境,这就像 C 语言中的编译宏。只有在 \CONTEXT\ 编译命令中设定对应的 mode 值,对应 mode 环境中的语句才是有效的。要让 screen mode 环境生效,可:
-
-\starttyping
-$ context --mode=screen ctxnotes
-\stoptyping
-
-\noindent \CONTEXT\ 的 mode 环境非常有用,许多 \CONTEXT\ 官方制作的文档都是利用 mode 环境同时产生屏幕阅读版本与打印版本。将来,我打算将这一环境用于制作演示文档与讲稿。
-
-在页脚右侧显示的“回目录”的链接需要设置目录代码的支持,因为这需要利用 \ConTeXt\ 的引用机制:
-
-\startniceTEX
-% 我的目录页
-\title[content]{目录}
-\placecontent
-\stopniceTEX
-
-\noindent 有关文档目录设置的细节,准备单独开一个章节来记述。
-
-\section{封面设计}
-
-\CONTEXT\ 没有像 \LATEX\ 那样提供了专用于封面制作的命令,只是提供了一个 \type{standardmakeup} 环境,该环境的作用就是建立一个不增加页码计数的页面,使得用户可以在其中排版封面、扉页之类的页面。这份文档的封面的具体设计如下:
-
-\startniceTEX
-\startstandardmakeup
- \startcolor[mydarkred]
- \switchtobodyfont[14pt]
- \hfil\bfd\ConTeXt 学习笔记\hfil
- \blank[1.5cm]
- \hfil\bfc Using MkIV\hfil
- \blank[12cm]
-
- \startalignment[flushright]
- \ssa
- \bTABLE
- \setupTABLE[r][each][frame=off]
- \bTR \bTD Athor: Li Yanrui\eTD \eTR
- \bTR \bTD Email: lyanry@gmail.com\eTD \eTR
- \bTR \bTD \date \eTD \eTR
- \eTABLE
- \stopalignment
- \stopcolor
-\stopstandardmakeup
-\stopniceTEX
-
-请宽恕我在上述语句中很可耻地使用了 1.5cm、12cm 这样确定的长度。因为我还不怎么会驾驭 \CONTEXT,还无法灵活地实现可根据版面的变化自适应调整的封面设计。
-
-要设计一个美观的封面真得很难,而且这也不是我所擅长的。现在,拥有这样一个简单的封面,我已经心满意足。也许等我以后渐渐熟悉 \METAFUN\ 之时,会让它再美观一些。
-
-\section{标题样式}
-
-惯见的文档章、节标题一般都是采用黑体,字号通常也比正文字号大一些,另外标题前后也留出了一些垂直间距。这些设置无非是为了告诉读者,它们是标题,而不是正文。这份文档的标题样式设置如下:
-
-\startniceTEX
-\setupheads[indentnext=yes]
-\setuphead
- [chapter]
- [style=\bfc,header=empty,footer=empty]
-\setuphead
- [section]
- [style=\bfa]
-\setuphead
- [title]
- [style=\bfb,header=empty,foote=empty]
-\setuphead
- [subsubject]
- [style=\bf]
-\stopniceTEX
-
-\noindent\tex{setupheads} 命令可以设置所有类型的章节标题默认状态。在设置章标题时,由于其所在页面通常不需要页眉与页脚,所以 \type{header} 与 \type{footer} 都应设为 \type{empty}。
-
-现在使用 MkIV 排版中文,要想实现章节的编号格式为“第 x 章”、“第 x 节”,或者实现图、表标题格式为“图 x”、“表 x”,可能需要自己来做一些有些 dirty 工作。\ConTeXt\ 提供了 \tex{setuplabeltext} 命令,可用于设置表格、图、章节、附录的编号格式。譬如,要设置中文的章节编号:
-
-\startniceTEX
-\setuplabeltext [en] [chapter={第\;,\;章}]
-\setuplabeltext [en] [section={第\;,\;节}]
-\stopniceTEX
-
-\noindent 遗憾的是,我不知道怎样将编号中的数字也使用中文来表示,这在 MkII 中是可以的。
-
-\section{段落与行}
-
-中文排版,段落间距通常等于行间距,因为中文段落是通过首行缩进来标示的,下面代码可将段落文本首行缩进 2 个汉字距离:
-
-\startniceTEX
-\setupindenting[always,2em,first]
-\stopniceTEX
-
-\ConTeXt\ 默认是将段间距设置为 0,这碰巧符合中文的排版规范。如果有设定段间距的需求,就查一下 \tex{setupwhitespace} 命令的用法。
-
-对文档正文而言,行间距的设置对于排版的美观性是至关重要的:行间距过小则阅读困难;行间距过大又显得版面稀疏,浪费纸张。\ConTeXt\ 默认的文本行间距的值对于中文排版而言过小,可通过 \tex{setupinterlinespace} 命令结合自己的审美嗜好对行间距进行调整。我习惯将行高设为 1.5em:
-
-\startniceTEX
-\setupinterlinespace[line=1.5em]
-\stopniceTEX
-
-\section{更多阅读……}
-
-如果上述内容有误或者你认为讲述的不够细致,那么请阅读以下文档:
-
-\startitemize
-\item “页面布局控制”:\crlf \hbox{\tt http://garfileo.is-programmer.com/2011/1/19/layout-control.23895.html}
-\item “\CONTEXT\ 文稿的逻辑结构”:\crlf \hbox{\tt http://garfileo.is-programmer.com/2011/1/16/context-manuscript-logic-structure.23826.html}
-\stopitemize
-
-我计划今年年底将这些外部文档归整到这份文档中。
-
-\stopcomponent
diff --git a/Master/texmf-dist/doc/context/third/context-notes-zh-cn/src/metafun.tex b/Master/texmf-dist/doc/context/third/context-notes-zh-cn/src/metafun.tex
deleted file mode 100644
index c7a121d47bc..00000000000
--- a/Master/texmf-dist/doc/context/third/context-notes-zh-cn/src/metafun.tex
+++ /dev/null
@@ -1,463 +0,0 @@
-\startcomponent metafun
-\product ctxnotes
-
-\chapter{我是这样学习 MetaFun 的}
-
-其实,我本来是想尽快制作一份有关 \CONTEXT\ 演示文档的学习笔记,尝试了几次之后,都铩羽而归。我渐渐意识到如果不了解 \METAFUN,那么使用 \CONTEXT\ 是很痛苦的,就像拿到了一座金山却无处消费它一般。我开始认真学习 \METAFUN,并且也很后悔当初没有学习 \METAPOST,而在 PGF/TikZ 上却曾经浪费了很多时间。
-
-\section{从画一个矩形开始}
-
-在这份这份文档的封面上,画有许多形态各异的矩形,它们不是我画的,而是我从一份 \CONTEXT\ 演示文档模板中扣出来的一段代码。我从现在开始逐步研究它们是如何绘制出来的。
-
-先进行一个矩形区域的填充:
-
-\startniceTEX[numbering=line]
-\setupcolors[state=start]
-\setupcolor[hex]
-\definecolor[BackgroundColor][h=cccccc]
-
-\starttext
-\startuseMPgraphic{box}
-offset := uniformdeviate 10pt;
-width := 2*offset + 30pt + uniformdeviate 30pt;
-height := 2*offset + 20pt + uniformdeviate 10pt;
-x1 := offset ; y1 := offset; x2 := width-offset; y2 := height-offset;
-fill z1--(x2,y1)--z2--(x1,y2)--cycle
- withcolor \MPcolor{BackgroundColor};
-\stopuseMPgraphic
-
-\useMPgraphic{box}
-\stoptext
-\stopniceTEX
-
-\definecolor[BackgroundColor][h=cccccc]
-\startuseMPgraphic{box}
-offset := uniformdeviate 10pt;
-
-width := 2*offset + 30pt + uniformdeviate 30pt;
-height := 2*offset + 20pt + uniformdeviate 10pt;
-x1 := offset ; y1 := offset;
-x2 := width-offset; y2 := height-offset;
-
-fill z1--(x2,y1)--z2--(x1,y2)--cycle
- withcolor \MPcolor{BackgroundColor};
-\stopuseMPgraphic
-
-这个小例子可在页面中绘制一个灰色的矩形填充域\;\useMPgraphic{box}\;\;。实际上,单单要完成这个例子所实现的目标,没必要去定义那么多的变量,这里之所以如此,不妨认为我想借此来熟悉一下 \METAPOST\ 的变量赋值与运算语法。
-
-代码第 1-3 行的大意是启用颜色环境,并将颜色描述格式设为 16 进制码形式,最后使用灰色定义了一种名曰 BackgroundColor 的颜色;在 \METAFUN\ 中,我们可以使用 \tex{MPcolor} 命令将 \CONTEXT\ 中定义的颜色转换为 \METAFUN\ 所使用的颜色值,详见代码第 12 行。这多少可以体现出 \METAFUN\ 的一些特点,它实现了 \CONTEXT\ 与 \METAPOST\ 的沟通。
-
-代码第 7 行演示了 uniformdeviate 命令的用法,它的作用就是从 \type{[0pt - 10pt]} 这个尺寸区间中随机取一个尺寸。
-
-代码第 11-12 行演示了如何填充一条路径,比较值得注意的是路径构成中的 \type{z1} 与 \type{z2} 的含意,这似乎是 \METAPOST\ 约定的,它们分别表示 \type{(x1,y1)} 与 \type{(x2,y2)},但愿我没有理解错。
-
-代码第 6-13 行构造了一幅 \METAFUN\ 图形,第 15 行代码将该图形插入至文档中。这就是 \METAFUN\ 图形嵌入于 \CONTEXT\ 的一般方式。另外,也可以像插入普通图片那样:
-
-\startniceTEX
-\placefigure
- [here,force][fig:box]
- {嵌入 \METAFUN\ 图形}{\useMPgraphic{box}}
-\stopniceTEX
-
-\placefigure
- [here,force][fig:box]
- {嵌入 \METAFUN\ 图形}{\useMPgraphic{box}}
-
-下面为这个矩形填充域绘制边框。如果只是绘制一个矩形框,这比较简单,以下示例便可以:
-
-\startniceTEX
-\setupcolors[state=start]
-\setupcolor[hex]
-\definecolor[BackgroundColor][h=cccccc]
-\definecolor[OrnamentColor][h=99ccff]
-
-\starttext
-\startuseMPgraphic{box-ornament}
-offset := uniformdeviate 10pt;
-width := 2*offset + 30pt + uniformdeviate 30pt;
-height := 2*offset + 20pt + uniformdeviate 10pt;
-x1 := offset ; y1 := offset; x2 := width-offset; y2 := height-offset;
-fill z1--(x2,y1)--z2--(x1,y2)--cycle
- withcolor \MPcolor{BackgroundColor};
-draw z1--(x2,y1)--z2--(x1,y2)--cycle
- withcolor \MPcolor{OrnamentColor};
-\stopuseMPgraphic
-
-\useMPgraphic{box-ornament}
-\stoptext
-\stopniceTEX
-
-\definecolor[BackgroundColor][h=cccccc]
-\definecolor[OrnamentColor][h=99ccff]
-\startuseMPgraphic{box-ornament}
-offset := uniformdeviate 10pt;
-width := 2*offset + 30pt + uniformdeviate 30pt;
-height := 2*offset + 20pt + uniformdeviate 10pt;
-x1 := offset ; y1 := offset; x2 := width-offset; y2 := height-offset;
-fill z1--(x2,y1)--z2--(x1,y2)--cycle
- withcolor \MPcolor{BackgroundColor};
-draw z1--(x2,y1)--z2--(x1,y2)--cycle
- withpen pencircle scaled 2pt withcolor \MPcolor{OrnamentColor};
-\stopuseMPgraphic
-
-\noindent 得到\;\useMPgraphic{box-ornament}\;,但是它无法实现本文档封面页上的那些小矩形框的效果,它们是无法采用一条路径来实现,而是要四个边框逐个的画:
-
-\startniceTEX[numbering=line]
-... ...
-def delta = ((uniformdeviate .5offset) + .25offset) enddef;
-drawoptions(withpen pencircle scaled 2pt
- withcolor \MPcolor{OrnamentColor});
-draw (x1-delta,y1)--(x2+delta,y1);
-draw (x2,y1-delta)--(x2,y2+delta);
-draw (x2+delta,y2)--(x1-delta,y2);
-draw (x1,y2+delta)--(x1,y1-delta);
-
-drawoptions();
-setbounds currentpicture to unitsquare xyscaled (width,height);
-\stopniceTEX
-
-\startuseMPgraphic{box-random-ornament}
-offset := uniformdeviate 10pt;
-def delta = ((uniformdeviate offset) + .25offset) enddef;
-width := 2*offset + 30pt + uniformdeviate 30pt;
-height := 2*offset + 20pt + uniformdeviate 10pt;
-x1 := offset ; y1 := offset; x2 := width-offset; y2 := height-offset;
-fill z1--(x2,y1)--z2--(x1,y2)--cycle
- withcolor \MPcolor{BackgroundColor};
-drawoptions(withpen pencircle scaled 2pt
- withcolor \MPcolor{OrnamentColor});
-draw (x1-delta,y1)--(x2+delta,y1);
-draw (x2,y1-delta)--(x2,y2+delta);
-draw (x2+delta,y2)--(x1-delta,y2);
-draw (x1,y2+delta)--(x1,y1-delta);
-
-drawoptions();
-setbounds currentpicture to unitsquare xyscaled (width,height);
-\stopuseMPgraphic
-
-\noindent 这样才可以得到那种类似于手绘矩形框的效果\;\useMPgraphic{box-random-ornament}\;\;。注意,第 2 行代码所定义的 \type{delta} 似乎是一个变量,实际它是一个宏,一个不带任何参数的宏。宏可以避免许多重复的输入,并且使得代码更为易读;\type{drawoptions} 也具有类似作用。在上述代码片段中,宏还起到了让 \type{delta} 返回的尺寸大小居于随机变化的效果,因为宏在被 \METAPOST\ 处理时要被其定义替换,因为 \type{delta} 定义中的 \type{uniformdeviate} 运算符就被反复调用,生成不同的随机数。\type{setbounds} 语句用于设置图形的边界,这样可以保证将所绘制的图形完全地显示出来(其实我觉得这有点多余)。
-
-下面,来看一下带参数的宏该如何写。带参数的宏,可将它理解为可重复调用的函数。对于前面的示例,可以将这一系列的绘制过程定义为下面的宏:
-
-\startniceTEX
-def random_box (expr width, height, offset, linewidth ) =
- def delta = ((uniformdeviate .5offset) + .25offset) enddef;
-
- x1 := offset; y1 := offset; x2 := width-offset; y2 := height-offset;
-
- drawoptions(withcolor transparent(1,.8,\MPcolor{BackgroundColor}));
- fill z1--(x2,y1)--z2--(x1,y2)--cycle;
-
- drawoptions(withpen pencircle scaled linewidth
- withcolor \MPcolor{OrnamentColor});
- draw (x1-delta,y1)--(x2+delta,y1);
- draw (x2,y1-delta)--(x2,y2+delta);
- draw (x2+delta,y2)--(x1-delta,y2);
- draw (x1,y2+delta)--(x1,y1-delta);
-
- drawoptions();
- setbounds currentpicture to unitsquare xyscaled (width,height);
-enddef;
-\stopniceTEX
-
-\type{random_box} 宏是可以接受传入参数的。\METAPOST\ 宏所支持的参数类型有:
-\type{expr}、\type{text} 与 \type{suffix}。\type{expr} 参数类型的用法正如上例 \type{random_box} 宏定义所示,它表示宏的使用者可以向其传入表达式的值。至于 \type{text} 与 \type{suffix} 参数类型,由于现在尚未用到它们,所以我可以暂时不理睬它们的功用。
-
-下面演示如何使用上述定义的 \type{random_box} 宏:
-
-\startniceTEX
-offset := uniformdeviate 10pt ;
-width := 2*offset + 40pt + uniformdeviate 30pt ;
-height := 2*offset + 30pt + uniformdeviate 10pt ;
-
-random_box (width,height,offset,1pt);
-\stopniceTEX
-
-\section[ordinary-repeat]{平凡的重复}
-
-一个士兵会踢正步,实在太平凡了;一群士兵会踢同样节奏的正步,就开始不平凡起来了。平凡的重复,往往是不平凡的。现在,我们开始重复上一节所绘制的那个 Box。先来看下面这个可编译的示例:
-
-\startniceTEX[numbering=line]
-\startuseMPgraphic{random-box}
-def random_box (expr width, height, offset, linewidth ) =
- def delta = ((uniformdeviate .5offset) + .25offset) enddef;
-
- x1 := offset; y1 := offset; x2 := width-offset; y2 := height-offset;
-
- drawoptions(withcolor \MPcolor{BackgroundColor});
- fill z1--(x2,y1)--z2--(x1,y2)--cycle;
-
- drawoptions(withpen pencircle scaled linewidth
- withcolor \MPcolor{OrnamentColor});
- draw (x1-delta,y1)--(x2+delta,y1);
- draw (x2,y1-delta)--(x2,y2+delta);
- draw (x2+delta,y2)--(x1-delta,y2);
- draw (x1,y2+delta)--(x1,y1-delta);
-
- drawoptions();
- setbounds currentpicture to unitsquare xyscaled (width,height);
-enddef;
-
-for i=1 upto 400 :
- offset := uniformdeviate 4pt ;
- width := 2*offset + 10pt + uniformdeviate 10pt ;
- height := 2*offset + 5pt + uniformdeviate 4pt ;
-
- addto currentpicture also
- image(random_box (width,height,offset,1pt)) shifted
- (uniformdeviate 8cm, uniformdeviate 6cm) ;
-endfor ;
-\stopuseMPgraphic
-\stopniceTEX
-
-\startuseMPgraphic{random-box}
-def random_box (expr width, height, offset, linewidth ) =
- def delta = ((uniformdeviate .5offset) + .25offset) enddef;
-
- x1 := offset; y1 := offset; x2 := width-offset; y2 := height-offset;
-
- drawoptions(withcolor \MPcolor{BackgroundColor});
- fill z1--(x2,y1)--z2--(x1,y2)--cycle;
-
- drawoptions(withpen pencircle scaled linewidth
- withcolor \MPcolor{OrnamentColor});
- draw (x1-delta,y1)--(x2+delta,y1);
- draw (x2,y1-delta)--(x2,y2+delta);
- draw (x2+delta,y2)--(x1-delta,y2);
- draw (x1,y2+delta)--(x1,y1-delta);
-
- drawoptions();
- setbounds currentpicture to unitsquare xyscaled (width,height);
-enddef;
-
-for i=1 upto 400 :
- offset := uniformdeviate 4pt ;
- width := 2*offset + 10pt + uniformdeviate 10pt ;
- height := 2*offset + 5pt + uniformdeviate 4pt ;
-
- addto currentpicture also
- image(random_box (width,height,offset,1pt)) shifted
- (uniformdeviate 8cm, uniformdeviate 6cm) ;
-endfor ;
-\stopuseMPgraphic
-
-\noindent 我得到如下图所示的图形:
-
-\placefigure
- [here,force][fig:random-box]
- {平凡的重复}{\useMPgraphic{random-box}}
-
-第 26-28 行是解决 \type{random_box} 重复绘制的核心代码。\type{addto ... also} 是 \METAPOST\ 内部定义的宏,它可以将一幅图形 (picture) 添加到另一幅图形中。图形是 \METAPOST\ 中的一个数据结构,它可以存储多条已被绘制的路径,并且图形与图形之间是可以包容的。\type{image} 也是 \METAPOST\ 内部定义的宏,它可以将某一被绘制的路径转变为图形。至于 \type{shifted},顾名思义,它是用来进行几何平移变换的,而且变换的位置是随机坐标来确定的。
-
-\section{Overlay 与背景}
-
-Overlay 这是 \CONTEXT\ 的一个术语,它的名字取的不是很正确,其本意是“覆盖,覆盖图”,但是在 \CONTEXT\ 中,它通常是位于文本之下的图形,或者说它是被文本覆盖。不过,overlay 可以分为许多个层次,因此这个术语的名字取得也不是完全不正确。
-
-很多时候,我都是将 overlay 作为一个背景层来对待的,下面的这个例子便可以说明这个问题:
-
-\startniceTEX[numbering=line]
-\setupcolors[state=start]
-
-\starttext
-\defineoverlay[tea][{\darkgreen\ss\bfc 绿茶}]
-\framed[background=tea, align=middle]{今\\天\\出\\售}
-\stoptext
-\stopniceTEX
-
-\defineoverlay[tea][{\darkgreen\ss\bfd 绿\;茶}]
-
-\noindent 这个例子可以将“绿茶”作为“今天出售”的背景:\framed[background=tea, align=middle]{今\\天\\出\\售}\;\;。
-
-\tex{defineoverlay} 的命令使用起来很简单,第一个参数是 overlay 名,第二个参数是 overlay 的内容,通常是一组排版或绘图命令的集合,推荐使用 \type{{}} 将其括起来。
-
-在上述示例中,已经演示了使用文本作为 overlay 内容,下面来看一下使用图片的例子:
-
-\startniceTEX
-\defineoverlay[cow][{\externalfigure[cow]%
- [width=\overlaywidth,height=\overlayheight]}]
-\framed[width=3cm,height=2cm,background=cow,align=right]
- {\vfill\color[darkred]{这是一头奶牛}}
-\stopniceTEX
-
-\defineoverlay[cow][{\externalfigure[cow][width=\overlaywidth,height=\overlayheight]}]
-
-\noindent 于是我们便拥有了一头漂亮的奶牛 \framed[width=3cm,height=2cm,background=cow,align=right]{\vfill\color[darkred]{这是一头奶牛}} 。
-
-上述以图片作为 overlay 的代码没必要多费口舌,多看几遍,动手尝试一下便可以明了。值得注意的倒是 \tex{framed} 命令的 \type{align} 参数,它的取值有些另类,明明是左对齐,但是它的值却是 right;如果你想让文本右对齐,就不得不将其设为 left。这实际上是 Hans 犯得一个错误,因为他当年在写 \CONTEXT\ 时,满脑子是 ragged left(左边不齐) 与 ragged right(右边不齐)。这样的错误一旦犯下了,便不好再改,主要是因为无法兼容过去的文档,后来 Hans 又加入了 flushleft 与 flushright 参数值,这是与我们普遍的习惯是相符的。
-
-我们还可以将 \METAFUN\ 绘制的图形作为 overlay,这也是本章一个非常重要的内容,它是 \METAFUN\ 与 \CONTEXT\ 集成的基础,来看这个示例:
-
-\startniceTEX
-\startuseMPgraphic{demo circle}
- path p ;
- p := fullcircle xscaled \overlaywidth yscaled \overlayheight ;
- fill p withcolor \MPcolor{BackgroundColor};
- draw p withpen pencircle scaled 2pt withcolor \MPcolor{OrnamentColor};
-\stopuseMPgraphic
-
-\defineoverlay[demo circle][\useMPgraphic{demo circle}]
-\framed[background=demo circle,frame=off]{被椭圆包围的文本}
-\stopniceTEX
-
-\startuseMPgraphic{demo circle}
- path p ;
- p := fullcircle xscaled \overlaywidth yscaled \overlayheight ;
- fill p withcolor \MPcolor{BackgroundColor};
- draw p withpen pencircle scaled 2pt withcolor \MPcolor{OrnamentColor};
-\stopuseMPgraphic
-\defineoverlay[demo circle][\useMPgraphic{demo circle}]
-
-\noindent 我们可以得到 \framed[background=demo circle,frame=off,height=22pt]{被椭圆包围的文本}\;。
-
-由上例可见,我们发现 \METAFUN\ 可以将 \CONTEXT\ 中的一些尺寸,比如 \tex{overlaywidth} 与 \tex{overlayheight} 等参数传入 \METAFUN\ 环境中。在本章开始的时候,还用过一个 \tex{MPcolor} 宏,可以将 \CONTEXT\ 的颜色定义转换为 \METAPOST\ 的颜色定义。我们还可以通过使用 \tex{the} 作为前缀,实现在 \METAFUN\ 环境中访问诸如 \tex{textwidth}、\tex{textheight}、\tex{topspace} 等尺寸参数。
-
-前面说过,overlay 是可以叠加的,下面再来用一个例子演示一下:
-
-\startniceTEX
-\startuseMPgraphic{demo ellipse}
- path p ;
- p := fullcircle xscaled (.95*\overlaywidth) yscaled (.95*\overlayheight);
- fill p withcolor \MPcolor{BackgroundColor};
- draw p withpen pencircle scaled 2pt withcolor \MPcolor{OrnamentColor};
-\stopuseMPgraphic
-
-\startuseMPgraphic{demo square}
- path p ;
- p := fullsquare xscaled \overlaywidth yscaled \overlayheight;
- fill p withcolor \MPcolor{OrnamentColor};
-\stopuseMPgraphic
-
-\defineoverlay[demo ellipse][\useMPgraphic{demo ellipse}]
-\defineoverlay[demo square][\useMPgraphic{demo square}]
-
-\framed[background={demo square,demo ellipse},frame=off]{被矩形与椭圆包围的文本}
-\stopniceTEX
-
-\startuseMPgraphic{demo ellipse}
- path p ;
- p := fullcircle xscaled \overlaywidth yscaled \overlayheight;
- fill p withcolor \MPcolor{BackgroundColor};
- draw p withpen pencircle scaled 2pt withcolor \MPcolor{OrnamentColor};
-\stopuseMPgraphic
-
-\startuseMPgraphic{demo square}
- path p ;
- p := fullsquare xyscaled (1.1*\overlaywidth,1.1*\overlayheight);
- fill p withcolor \MPcolor{OrnamentColor};
-\stopuseMPgraphic
-
-\defineoverlay[demo ellipse][\useMPgraphic{demo ellipse}]
-\defineoverlay[demo square][\useMPgraphic{demo square}]
-
-\noindent 我们可以得到\quad\framed[background={demo square,demo ellipse},frame=off,height=22pt]{被矩形与椭圆包围的文本} 。这其实没什么技巧,只需多定义几个 overlay,然后将它们作为 \tex{framed} 的 \type{background} 的参数列表并按照先后的显示次序排列即可。
-
-本节所举的例子,只是使用 \tex{framed} 命令来演示。事实上,\CONTEXT\ 有许多命令都支持 overlay,只要它具备 \type{background} 参数。
-
-\section{代码的分离}
-
-有时候,会希望能够在多个 \METAFUN\ 图形环境中引用同样的一段代码,在我不知道存在 \type{MPinclusions} 环境时,我写过下面这般风格的代码:
-
-\startniceTEX
-\startuseMPgraphic{TitlePage}
-def random_box (expr width, height, offset, linewidth ) =
- ... ... ...
-enddef
-
-for i=1 upto 400 :
- ... ... ...
- addto currentpicture also
- image(random_hash_frame(width,height,offset,1pt)) shifted
- (uniformdeviate OverlayWidth, uniformdeviate OverlayHeight) ;
-endfor ;
-\stopuseMPgraphic
-
-\startuseMPgraphic{PageNumberBox}
-def random_box (expr width, height, offset, linewidth ) =
- ... ... ...
-enddef
-
-offset := uniformdeviate 10pt ;
-random_box (\overlaywidth, \overlayheight, offset, 1pt);
-\stopuseMPgraphic
-\stopniceTEX
-
-\noindent 虽然这样的代码可以用,但是它很脏。比如,如果我想修改 \type{random_box} 宏的定义,就意味着这两个图形环境中的 \type{random_box} 都要修改。当我我在 \METAFUN\ 手册中发现了 \type{MPinclusions} 这个环境时,立刻就将上述的代码格式修改为:
-
-\startniceTEX
-
-\startMPinclusions
-def random_box (expr width, height, offset, linewidth ) =
- ... ... ...
-enddef
-\stopMPinclusions
-
-\startuseMPgraphic{TitlePage}
-for i=1 upto 400 :
- ... ... ...
- addto currentpicture also
- image(random_hash_frame(width,height,offset,1pt)) shifted
- (uniformdeviate OverlayWidth, uniformdeviate OverlayHeight) ;
-endfor ;
-\stopuseMPgraphic
-
-\startuseMPgraphic{PageNumberBox}
-offset := uniformdeviate 10pt ;
-random_box (\overlaywidth, \overlayheight, offset, 1pt);
-\stopuseMPgraphic
-\stopniceTEX
-
-\noindent 可以看出,\type{MPinclusions} 环境的作用就是用于存放各 \METAFUN\ 图形的公共代码,类似于 C 程序的 .h 文件。
-
-我们还可以在 \METAFUN\ 图形环境中使用 \tex{includeMPgraphic} 来引用其它的 \METAFUN\ 图形:
-
-\startniceTEX
-\setupcolors[state=start]
-
-\starttext
-\startuseMPgraphic{test}
- fill fullsquare rotated 45 scaled 4cm withcolor \MPcolor{yellow} ;
-\stopuseMPgraphic
-
-\startuseMPgraphic{demo}
- \includeMPgraphic{test}
- fill fullsquare scaled 2cm withcolor \MPcolor{red} ;
-\stopuseMPgraphic
-
-\useMPgraphic{demo}
-\stoptext
-\stopniceTEX
-
-\section{还有一些图形环境}
-
-除了 \type{useMPgraphic} 环境之外,还有 \type{uniqueMPgraphic}、\type{MPpage} 图形环境,当然还有其它类型的,只是我目前认为掌握这三种,基本上够用了。
-
-\type{uniqueMPgrahpic} 环境与 \type{useMPgraphic} 环境的区别是:前者只生成一份图形,可供多次使用;后者是在每一次使用时,都要生成图形。如果是要实现随机图形效果,也就是说多次使用同一份绘图代码生成的图形却不相同,这就只好使用 \type{useMPgraphic} 环境,这个问题在 \in[ordinary-repeat] 节中有所体现。
-
-\type{MPpage} 环境可专门用于生成单独的矢量图形,试验一下这个例子便可体验其用处:
-
-\startniceTEX
-\setupcolors[state=start]
-\setupMPpage
- [offset=1pt,
- background=color,
- backgroundcolor=gray]
-
-\startuseMPgraphic{test}
- fill fullsquare rotated 45 scaled 4cm withcolor \MPcolor{yellow} ;
-\stopuseMPgraphic
-
-\starttext
-\startMPpage
- \includeMPgraphic{test}
- fill fullsquare scaled 2.5cm withcolor \MPcolor{red} ;
-\stopMPpage
-\stoptext
-\stopniceTEX
-
-\section{后记}
-
-这篇文章的内容,支离破碎。这是自然的。因为 \METAFUN\ 所涵括的内容远非我这一篇小文所能覆盖得了的。我以为 \METAFUN\ 手册最好是能通读一遍,不过我现在做不到,只好用什么,看什么。在这用与看的过程中,我想尽量地建立系统的认识。这是一个长期的过程。我唯一能做的就是尽量寻找可以使用 \METAFUN\ 的机会。
-
-我觉得使用 \CONTEXT\ 排版文档,如果能够充分结合 \METAFUN\ 图形环境来设计文档版面的外观,这是非常具有挑战性的。个人的审美观以及绘制图形的能力决定了文档样式能否体现出个性。
-
-\stopcomponent \ No newline at end of file
diff --git a/Master/texmf-dist/doc/context/third/context-notes-zh-cn/src/project.tex b/Master/texmf-dist/doc/context/third/context-notes-zh-cn/src/project.tex
deleted file mode 100644
index 861c51f1794..00000000000
--- a/Master/texmf-dist/doc/context/third/context-notes-zh-cn/src/project.tex
+++ /dev/null
@@ -1,67 +0,0 @@
-\startcomponent project
-\environment doc-env
-\product ctxnotes
-
-\chapter{大文档项目}
-
-对于规模比较大的文档项目而言,采用 \TEX\ 的优越性要高于 WYSIWYG 的字处理器 (MS Word)。众人谓之曰字处理器使用起来比较方便,实际这只不过表面现象,在其背后是文档更新方面的困难——难以进行多人协同撰写与版本维护。本章主要介绍 \CONTEXT\ 所提供的文档项目管理功能,探讨如何在文档项目中布置版本控制系统,建立一种比较稳定的大文档项目撰写模式。
-
-\section{项目的部署}
-
-一个 \TeX\ 文档项目,通常可以将文档结构分为:环境、宏、文档主体内容。这样划分的意图就是让文档的样式与内容分离开。环境,主要用于定制版面样式。宏,主要是封装一些排版命令,实现一些特定的排版功能。在 \CONTEXT\ 中,环境或宏可以由一份或多份专门的环境文件来定义,环境文件的格式如下:
-
-\startniceTEX
-\startenvironment 环境文件名
-... 环境内容 ...
-\stopenvironment
-\stopniceTEX
-
-如果不对文档的主体内容进行划分的话,那么它就与普通的 \CONTEXT\ 文档无异,只是多了加载环境文件的命令:
-
-\startniceTEX
-\environment 环境文档名
-... ... ...
-\starttext
-... 文档内容
-\stoptext
-\stopniceTEX
-
-如果对文档的主体内容细分下去,可以有封面、前言、正文章节、附录、封底等。文档结构划分的深浅程度,这个主要由用户来把握,主要视文档的规模而定。对于 \CONTEXT\ 而言,文档的主体内容实际上只有产品 (product) 与 组件 (component) 这两种划分\footnote{事实上还有比产品更高层的结构,就是项目 (project),不过我们写文档一般用不到它,如果是出版期刊杂志倒是有可能用到它。}\;。对于产品与组件之间的关系,这在产品文档中便可以直观地看到,譬如:
-
-\startniceTEX
-\startproduct 产品文档名
-\environment 环境文档名
-
-\component 组件文档 1
-\component 组件文档 2
-... ... ...
-\stopproduct
-\stopniceTEX
-
-产品文档将环境与组件的信息都记录了下来,因此当我们在使用 \CONTEXT\ 编译一个文档项目时,只需要编译产品文档即可。
-
-组件文档的格式如下:
-
-\startniceTEX
-\startcomponent 组件文档名
-\environment 环境文档名
-\product 所属产品名
-
-... 组件内容 ...
-
-\stopcomponent
-\stopniceTEX
-
-也可以直接编译组件文档,因为在组件文档中已经记录了所使用的环境文档信息;在撰写文档的过程中,推荐使用编译组件文档的方式来查看排版效果。
-
-\section{更多阅读……}
-
-如果上述内容有误或者你认为讲述的不够细致,那么请阅读以下文档:
-
-\startitemize
-\item “\CONTEXT\ 文稿的物理结构”:\crlf \hbox{\tt http://garfileo.is-programmer.com/2011/1/12/project-structure.23773.html}
-\stopitemize
-
-我计划今年年底将这些外部文档归整到这份文档中。
-
-\stopcomponent
diff --git a/Master/texmf-dist/doc/context/third/context-notes-zh-cn/src/references.tex b/Master/texmf-dist/doc/context/third/context-notes-zh-cn/src/references.tex
deleted file mode 100644
index 2fe85785d9a..00000000000
--- a/Master/texmf-dist/doc/context/third/context-notes-zh-cn/src/references.tex
+++ /dev/null
@@ -1,362 +0,0 @@
-\startcomponent bibliography
-\product ctxnotes
-\chapter{引用}
-
-当我用我这个代号来进行对话的同时,你的代号也是我,这意味着什么呢?这是否意味着你就是我,而我也就是你?
-
-\section{目录}
-
-如果不那么在乎目录的样式,可以在期望插入目录之处添加:
-
-\startniceTEX
-\completecontent
-% 或者
-\placecontent
-\stopniceTEX
-
-\noindent \tex{completecontent} 与 \tex{placecontent} 的区别就是前者是生成的目录列表页面是带有标题的;而后者只生成目录列表,如果需要页面带有标题,可以使用 \tex{title} 之类的无编号的标题命令实现:
-
-\startniceTEX
-\title{目录}
-\placecontent
- [alternative=a,
- style=normal,
- numberstyle=bold]
-\stopniceTEX
-
-在章标题之后使用 \tex{placecontent}:
-
-\startniceTEX
-\chapter{引用}
-\placecontent
- [alternative=a,
- style=normal,
- pagenumber=no,
- margin=2em]
-\stopniceTEX
-
-\noindent 可以实现在当前章标题下面显示出这一章所有小节的列表。
-
-由于我比较喜欢 \CONTEXT\ 手册的那种目录样式,便从手册的源码中找到了该样式的具体设置,然后照虎画猫一番,并添加了一些小创意:
-
-\startniceTEX
-\def\ChapterNumber#1{\doiftext{#1}{第\;#1\;章\quad}}
-\setuplist
- [chapter]
- [alternative=a,
- before={\page[preference]\blank},
- after=\blank,
- style=bold,
- width=fit,
- pagestyle=boldslanted,
- pagenumber=no,
- numbercommand=\ChapterNumber]
-
-\def\PageNumber#1{\color[darkgray]{#1}.}
-\setuplist
- [section]
- [alternative=d,
- style=small,
- pagecommand=\PageNumber,
- pagestyle=\itx]
-\stopniceTEX
-
-\noindent
-
-\noindent 结果便是这份文档目录页中所显示的那个样子。我所说得小创意,实际上就是让章节编号变成半中文化(因为还夹着阿拉伯语呢);另外就是让目录列表中各小节的页码显示为灰色,不那么抢眼。
-
-\section[cross references]{交叉引用}
-
-交叉引用实在是太有用了,即便也不怎么经常用到它,也还可以借此嘲笑一下 Word 交叉引用功能的孱弱,赢得一次口水战的胜利。
-
-这份文档的页脚的右侧的“回目录”链接就是通过交叉引用来实现的,在\in[HFer]{} 节(瞧,这就是一个交叉引用)中的页脚设置:
-
-\startniceTEX
-\setupfootertexts
- [{\ConTeXt\ MkIV 学习笔记}][{\goto{回目录}[content]}]
- [{\goto{回目录}[content]}][{\ConTeXt\ MkIV 学习笔记}]
-\stopniceTEX
-
-\noindent 其中,\tex{goto} 这个命令可以跳到任何设置了引用的文档位置。这里,它要跳到 \type{content} 引用所在的位置,由于这个引用我是在设置目录页面时设定的:
-
-\startniceTEX
-\startfrontmatter
- \setuppagenumbering
- [conversion=romannumerals]
- \title[Content]{目录} % 在此设定了引用
- \placecontent
-\stopfrontmatter
-\stopniceTEX
-
-\noindent 因此 \tex{goto} 会带你跳到目录页。目录页面的引用是通过 \type{content} 这个名称标识的,\tex{goto} 命令可以根据这个标识确定所要跳往的页面位置。
-
-\CONTEXT\ 许多排版命令都支持引用设置,譬如章节标题、插图、表格等命令。一定要记住,文档中只要出现诸如“第 xxx 章”、“xxx 节”、“图 xxx”、“表 xxx”之类的内容时,这就意味着您应当使用交叉引用机制了。比如,我要引用当前这一节,首先要为节标题命令设定引用名称:
-
-\startniceTEX
-\section[cross references]{交叉引用}
-\stopniceTEX
-
-\noindent 然后在需要引用本节之处,通过 \tex{in} 命令即可获取节号;如果是屏幕阅读文档,还可以让节号作为一个链接,指向本节所在页面位置。同类的命令还有 \tex{at} 与 \tex{about},前者可以获取引用所在的页面,后者可以得到引用的内容。下面仿照 \CONTEXT\ 手册中的例子,演示这三个命令的用法:
-
-\startniceTEX
-我引用了第 \at[cross references] 页的 \in[cross references] 节\about[corss references]的一些内容。
-\stopniceTEX
-
-\noindent 效果:{\ss 我引用了第 \at[cross references] 页的 \in[cross references] 节 \about[cross references]的一些内容。}
-
-现在,MkIV 还未能实现引用在页面的准确定位,所以在屏幕阅读文档中的一些链接只是将你带往这些引用所在的页面而不是将准确的位置展示在你眼前。
-
-\section{索引}
-
-在阅读 {\it \CONTEXT\ 手册}或者 {\it \CONTEXT, an excursion} 之类的文档时,在附录中可以看到许多命令的索引,这些索引会告诉你那些命令在哪些页面出现了;如果是屏幕阅读文档,还可以将页码变成指向对应页面的链接。利用这些索引功能,我可以快速找到这些命令的细节知识。这在写技术文档时非常重要。在这份文档中,我没有使用索引的功能,因为很少有人会为了一份学习笔记如此大动干戈。将它记述于此,仅仅是为了将来有可能使用到它。
-
-要定义索引很简单,使用\tex{index} \index[index]{\tex{index}} 这个命令就可以:
-
-\startniceTEX
-我在这里演示 index\index[index]{\tex{index}} 与
- placeindex\index[placeindex]{\tex{placeindex}} 命令的用法。
-
-\placeindex
-\stopniceTEX
-
-\noindent 然后使用 \tex{placeindex}\index[placeindex]{\tex{placeindex}} 或 \tex{completeindex}\index[completeindex]{\tex{completeindex}} 命令在需要放置索引的页面显示索引。
-
-索引列表默认是以字母进行分组与排序的,这对于西文文档排版很适用,但是没法处理中文。可以采用汉语拼音\index[HYPY]{汉语拼音}来解决这个问题。譬如:
-
-\startniceTEX
-……可以采用汉语拼音\index[HYPY]{汉语拼音}来解决这个问题……
-\stopniceTEX
-
-\noindent 生成的索引列表如下:
-
-\placeindex
-
-索引与目录的用法很相似。实际上这一章中所有的内容都是基于 \CONTEXT\ 的引用机制实现的。索引与目录存在着更为高级的用法,但是我没有那么多兴趣和精力去折腾它们,以后若有这方面的需要再下手也不迟。
-
-\section{参考文献}
-
-写科技文档必然离不开参考文献 (Bibliography) 的支撑,所以要评价一个文档排版软件的优劣,其参考文献管理功能是一项非常重要的指标。与 \LaTeX\ 类似,\ConTeXt\ 主要是基于 Bib\TeX\ 维护参考文献,这是借助 Taco Hoekwater 写的 t-bib.tex 模块来实现的。
-
-\subsubject{Bib\TEX}
-
-Bib\TeX\ 的主要功能是管理参考文献信息并提供排版格式。在使用 Bib\TeX\ 之前,用户需要建立参考文献数据库,不要害怕,这里的数据库实际上就是一个扩展名为 .bib 的文本文件,我们在其中记录文献信息。下面是一份 .bib 文件示例:
-
-\startTEX
-@book{诸葛专著2008,
- author = "诸葛亮",
- year = "2008",
- title = "木牛流马制造工艺 [M]",
- publisher = "蜀国机械工业出版社"
-};
-
-@article{诸葛论文2008,
- author = "诸葛亮",
- title = "论伐魏的必要性与可行性 [J]",
- journal = "蜀国军事",
- volume = "13",
- number = "110",
- year = "2007"
-}
-\stopTEX
-
-在文献数据库中,可以存储许多种文献类别,常用条目类型有 article、book、conference、manual、misc、techreport 等。每种参考文献类别由多个域组成,有些是必须写得,没写会给出警告,而有些是可选。譬如 book 类别中,不可省略的域有 author, title, journal, year,可省略的域有 volume, number, pages, month, note。推荐做法是在参考文献数据库中尽可能地提供文献的详细信息。关于 .bib 文件的格式说明,请参考 Bib\TeX\ 文档\cite[bibtex]。
-
-Bib\TeX\ 为便于用户管理参考文献列表的排版风格,提供了 .bst 文件。.bib 文件与 .bst 文件之间的关系宛若 HTML 与 CSS 之间的关系,它们都遵守内在数据与外在表现分离的游戏规则。用户在 .bst 文件中可使用 Bib\TeX\ 定义的一种微型语言来实现对参考文献列表风格的控制,但是在 \ConTeXt\ 的 bib 模块中,仅使用 .bst 文件控制参考文献条目的排列次序。一般情况下,用户不需要制作 .bst,所以这个了解一下就可以了。
-
-Bib\TeX\ 与 \ConTeXt\ 的协同工作时,需要 \ConTeXt\ 文档编译命令输出 .aux 文件。基于 .aux 文件,Bib\TeX\ 在 .bib 检索所需的文献信息,并结合 .bst 文件实现参考文献列表外观控制,最终输出 .bbl 文件。一旦我们得到了 .bbl 文件(实际是 \TeX\ 文档),那么就可以继续进行 \ConTeXt\ 文档编译过程,最终输出带有参考文献信息的文档,这一工作流程如下图所示。
-
-\setupFLOWcharts[nx=4,ny=4,
- dx=\bodyfontsize,dy=\bodyfontsize,
- width=7.5\bodyfontsize, height=4\bodyfontsize,
- maxwidth=.8\textwidth]
-
-\startFLOWchart[bibtex-flow]
-
-\startFLOWcell
-\name{texfile}\location{1,2}\shape{singledocument}
-\text{\ConTeXt\ 源文档}\connection[rl]{ctx}
-\stopFLOWcell
-
-\startFLOWcell
-\name{ctx}\location{2,2}\shape{action}
-\text{编译 \ConTeXt\ 文档}\connection[rl]{aux}
-\stopFLOWcell
-
-\startFLOWcell
-\name{aux}\location{3,3}\shape{singledocument}
-\text{.aux 文档}\connection[rln]{bibtex}
-\stopFLOWcell
-
-\startFLOWcell
-\name{bib}\location{3,1}\shape{singledocument}
-\text{.bib 文档}\connection[rlp]{bibtex}
-\stopFLOWcell
-
-\startFLOWcell
-\name{bst}\location{3,2}\shape{singledocument}
-\text{.bst 文档}\connection[rl]{bibtex}
-\stopFLOWcell
-
-\startFLOWcell
-\name{bibtex}\location{4,2}\shape{action}
-\text{Bib\TeX}\connection[bt]{bbl}
-\stopFLOWcell
-
-\startFLOWcell
-\name{bbl}\location{4,4}\shape{singledocument}
-\text{.bbl 文档}\connection[lr]{ctxagain}
-\stopFLOWcell
-
-\startFLOWcell
-\name{ctxagain}\location{3,4}\shape{action}
-\text{编译 \ConTeXt\ 文档}\connection[lr]{pdf}
-\stopFLOWcell
-
-\startFLOWcell
-\name{pdf}\location{2,4}\shape{singledocument}
-\text{含参考文献的 PDF 文档}
-\stopFLOWcell
-
-\stopFLOWchart
-\placefigure[here][fig:bibtex-flow]{Bib\TeX\ 工作过程}
- {\FLOWchart[bibtex-flow]}
-
-\subsubject{\ConTeXt\ 的 bib 模块}
-
-\ConTeXt\ 是通过 Taco 写的 bib 模块取得 Bib\TeX\ 的协同(现已集成至 \CONTEXT\ 中),用户可以在 \ConTeXt\ 文档中实现参考文献列表排版样式的设置。下面是一份最为简单的 \ConTeXt\ 参考文献示例文档 \type{example/ex-4.tex}:
-
-\startTEX
-\setupbibtex[database=example]
-
-\starttext
-这一年,诸葛亮同学出版了一本专著\cite[诸葛专著2008],并在核心学术期刊上发表了一篇论文\cite[诸葛论文2008],因此深得刘备的赏识。
-\completepublications
-\stoptext
-\stopTEX
-
-上例中 \tex{setupbibtex} 命令的 \type{database} 参数的值为 .bib 文件名,我是将上一节中的那个 .bib 文件命名为 example.bib,然后在此使用。\tex{completepublications} 命令会在所排版的文档中插入参考文献列表。
-
-编译上述示例文档的过程正如图 \in[fig:bibtex-flow] 所示的那样,需要三个处理步骤,如下:
-
-\starttyping
-$ context --once ex-4 # 产生 .aux 文档
-$ bibtex ex-4 # 产生 .bbl 文档
-$ context ex-4 # 完成文档编译
-\stoptyping
-
-如果嫌每次编译文档都要重复输入三次命令过于繁琐,花上 20 分钟学习一下 Makefile 的简单用法会让我们更轻松一些。
-
-查看一下带有参考文献的 PDF 文档,可能你会发现参考文献并非是我们常见的那种风格,不要着慌,\ConTeXt\ 提供了一些用于设置参考文献风格的命令供我们使用。下面对 \type{ex-4.tex} 文件略作修改,添加了 \tex{setuppublications} 代码:
-
-\startTEX
-...
-\setupbibtex[database=example]
-\setuppublications[alternative=num]
-...
-\stopTEX
-
-重新编译一次 \type{ex-4.tex} 文档\footnote{若是未有改动 .bib 文档或者未引用新的文献,只需使用常规 \ConTeXt\ 文档编译方式即可。},现在参考文献的样式基本符合我们常见的风格了。有关 \tex{setuppublications} 命令的详细用法请参考 bib 模块文档\mycite{Taco}。
-
-\subsubject{Zotero}
-
-Zotero 是 Firefox 的一款扩展 (Extension),号称是下一代研究工具\footnote{至于上一代是谁,不可考,也许是那些脱离网络环境的文献管理软件吧。},我使用它来管理参考文献数据。除 Zotero 之外,还有许多其它文献管理软件,比如 Endnote、RefWorks、jabref 等,与它们相比,Zotero 将我们进行文献管理的整个过程──搜集、整理、阅读和引用等步骤都很好地集成在一起,并且与 Firefox 取得完美的结合,莫要忘记我们通常要在网上寻找文献的。关于 Zotero 的详情见其项目主页\footnote{\type{http://www.zotero.org/}}。
-
-大多数情况下,使用 Zotero 的流程可以归纳为:在互联网上发现文献──利用导入功能得到文件信息和有关附件──制作文献阅读笔记、tag 以及相关文件链接──搜索文献──输出有关文献为其他软件格式──在 TeX 或字处理软件中引用。除最后一步外都不需要打开任何其他软件。
-
-关于 Zotero 的具体用法……咳咳……实在不知道该如何用文字来讲述一款 GUI 工具的使用,又不胜一副一副配图介绍的那般繁琐。自我开脱一下,毕竟这是一份个人学习笔记,而不是一份教材,所以推荐去看 Zotero 的操作视频教程\footnote{\type{http://www.zotero.org/videos/tour/zotero_tour.htm}}。
-
-\subsubject{设置参考文献列表的样式}
-
-在制作这份学习笔记的参考文献时,因为有一些文献来自于网络,我希望在参考文献列表中提供它们的网址 (URL) 并且要求是超级链接格式的,这样便于读者直接驱动网页浏览器去下载它们。按照 Bib\TeX\ 的 .bib 文档语法,我采用以下文献条目格式提供此类文献的信息:
-
-\startTEX
-@booklet{Taco,
- title = {{Bibliographies}},
- author = {Taco Hoekwater},
- url = {http://modules.contextgarden.net/bib}
-}
-\stopTEX
-
-但是在文档中去引用上述文献时,其 URL 信息无法在参考文献列表中显示,更谈不上超级链接格式了。在 \ConTeXt\ Wiki 中的 Bibliography 文档\mycite{TacoCTXWiki}中讲述了如何在参考文献中启用 URL 的方法,并提供了一个示例。我对这个示例进行了一些简化,贵在于理解其要义。将以下代码添加到文档导言区,位于 bib 模块加载及其设置代码区域的下面:
-
-\startTEX
-\unprotect
-\setuppublicationlayout[booklet]{%
- \insertauthors{}{\unskip.}{}%
- \inserttitle{ \bgroup\it }{\/\egroup\unskip.}{}%
- \insertbiburl{ URL: }{\unskip.}{}%
- \insertnote{ }{\unskip.}{}}
-\protect
-\stopTEX
-
-\tex{setuppublicationlayout} 命令是用于设置参考文献列表的排版布局的,上例中,其参数我设为 booklet,这是因为我在 .bib 文档中将将网络文档类型定义为 booklet(小册子)类型,它是 Bib\TeX\ 的标准文献条目类型之一,将其作为 \tex{setuppublicationlayout} 的参数,表示这里要设置该类型文献条目的排版风格。
-
-在这份笔记中,我只需要 booklet 条目由 author(作者)、title(标题)、URL(文献网址)以及 note(文献注解)附加注释信息构成,因此在设置 booklet 文献条目的排版风格时,对于每一条目要素都对应一个 \tex{insertxxx} 命令。\tex{insertxxx} 命令有三个参数,可用于设定每一文献条目构成要素的排版环境,前两个参数分别用于设置对应排版文献条目构成要素的前后排版命令,第三个参数用于设置对应的文献条目构成要素缺省状态。以 \type{\insertauthors{}{\unskip.}{}} 为例,第一个参数是空的,表示采用默认排版环境;第二个参数为 \type{\unskip.},表示消除 booklet 文献条目中作者信息之后的空格,并且添加句点,第三个参数为空,表示当 .bib 文件中的 booklet 条目未提供作者信息时不作任何处理。
-
-注意,在上述示例中,\tex{insertbiburl} 命令是启来 .bib 中所提供的文献 URL 信息的。如果你希望文档中的 URL 是超级链接格式,那么还需要在 \ConTeXt\ 文档导言区添加以下代码:
-
-\startTEX
-\setupinteraction[state=start] % 启用文档的可交互功能
-\stopTEX
-
-利用上述方法并配合 \ConTeXt\ 各种排版命令可以灵活地控制参考文献列表的排版格式,这就是为什么 \ConTeXt\ 的 bib 模块只是将 Bib\TeX\ 的 .bst 文档用来实现参考文献列表排序的主要原因。
-
-\section{书签}
-
-在阅读很长的 PDF 文档时,书签 (Bookmark) 是很有用的,它们通常显示于 PDF 阅读器的侧栏,用户用鼠标点击书签就可以快速打开书签所指向的页面。对于如何使用 \CONTEXT\ 实现书签,由于我是没有耐心的人,所以看到 \ConTeXt\ Wiki 上提供了适合没耐心的人对文档书签的生成快速建立初步认识的代码,便直接抄过来:
-
-\startniceTEX
-% 启用书签功能
-\setupinteraction[state=start]
-\setupinteractionscreen[option=bookmark]
-\placebookmarks[chapter][chapter]
-
-\starttext
-\chapter{飞刀与快剑}
-冷风如刀,以大地为砧板,视众生为鱼肉。\par
-万里飞雪,将穹庐作洪炉,熔万物为白银。\par
-……
-\chapter{海内存知己}
-马车里堆着好几坛酒,这酒是那少年买的,
-所以他一碗又一碗地喝着,而且喝得很快。\par
-……
-\stoptext
-\stopniceTEX
-
-\noindent 用常规的 PDF 阅读器打开所生成的文档,若开启侧栏面板,应当可以看到书签了。如果你看不到,那么就见识一下图 \in{}[fig:bookmark]\quad。
-
-\placefigure[here][fig:bookmark]
- {带书签的 PDF 文档}
- {\externalfigure[bookmark][bookmark][width=.6\textwidth]}
-
-要开启 \ConTeXt\ 的书签功能,必须 \tex{setupinteraction[state=start]}。另外,PDF 阅读器的侧栏的书签窗口默认是隐藏的,要让阅读器打开文档时自动开启书签窗口,那就是上例中 \tex{setupinteractionscreen} 命令所做的。
-
-将章、节标题作为书签的想法很好,这样在书签窗口中,可以通过章节标题对文档的大致内容有所了解。在上例中,我通过 \tex{placebookmarks} 命令设置 chapter 标题作为书签。\tex{placebookmarks} 的第一个参数是设定各层次的章节类型作为书签,第二个参数是设置默认可见的书签。看下面一个更复杂的示例:
-
-\startTEX
-\placebookmarks[chapter,section,subsection][chapter]
-\stopTEX
-
-\noindent 这个示例的含义是:将章、节、小节的标题作为书签,默认只在书签窗口中显示由章标题生成的书签。
-
-在 MkIV 中,不知是特性还是缺陷,在将章节标题作为书签时,若标题中出现了格式化文本,譬如 \type{\ConTeXt} 这样的文本,那么书签中就会将 \type{\ConTeXt} 的 \TeX\ 定义显示出来,而不是显示 \type{ConTeXt} 或者 \ConTeXt。现在,我未能找到解决这一问题的好方法,笨方法是有的。在撰写某章节标题时,若是需要使用格式化文本,那么就在章节命令之后使用 \tex{bookmark} 命令手动设定书签标题:
-
-\startTEX
-\section{安装 \ConTeXt\ Minimals}
-\bookmark{安装 ConTeXt Minimals}
-\stopTEX
-
-\noindent 本文档目前正是使用这种方法去除书签中出现的格式化文本,勉强对付过去。
-
-\section{更多阅读……}
-
-如果上述内容有误或者你认为讲述的不够细致,那么请阅读以下文档:
-
-\startitemize
-\item “\CONTEXT\ 对参考文献的处理”:\crlf \hbox{\tt http://liyanrui.is-programmer.com/2009/12/17/bibliographic-in-ConTeXt.14078.html}
-\item “\CONTEXT\ 对参考文献的处理——整容篇”,讲述了 \CONTEXT\ Minimals 的安装方法:\crlf\hbox{\tt http://liyanrui.is-programmer.com/2009/12/18/bibliographic-style-in-ConTeXt.14103.html}
-\stopitemize
-
-我计划今年年底将这些外部文档归整到这份文档中。
-
-\stopcomponent
diff --git a/Master/texmf-dist/doc/context/third/context-notes-zh-cn/src/t-layout.tex b/Master/texmf-dist/doc/context/third/context-notes-zh-cn/src/t-layout.tex
deleted file mode 100644
index 7ca9d6e1b6f..00000000000
--- a/Master/texmf-dist/doc/context/third/context-notes-zh-cn/src/t-layout.tex
+++ /dev/null
@@ -1,411 +0,0 @@
-%% Last Change: Fri Apr 22 11:06:09 2005
-
-%D \module
-%D [ file=t-layout,
-%D version=2003.03.26,
-%D title=\CONTEXT\ User Module,
-%D subtitle=show layout,
-%D author=Patrick Gundlach,
-%D date=\currentdate,
-%D copyright={Patrick Gundlach}]
-
-
-%C filename: t-layout.tex
-%C module layout, shows layout of current page
-
-
-%C copyright 2003,2007 Patrick Gundlach, patrick@gundla.ch
-%C may be distributed under the terms of the GNU General Public License
-%C URL: http://levana.de/context/
-
-%D \subject{Introduction}
-%D This third-party module \quote{layout} draws a representation of
-%D the of the layout of the
-%D current page and displays the sizes of the widths and heights of the
-%D margins, header, footer and text body.
-
-%D \subject{Usage}
-%D Include this module into your ConTeXt files:
-%D \type{\usemodule[t][layout]} and show the layout with \type{\ShowLayout}.
-
-%D You can set some parameters using \type{\SetupShowLayout}. The
-%D parameters are: units, digits, round, showmore and graphonly.
-%D If graphonly (0/1) is 0, this module shows the lenghts of some text areas.
-%D units (cm, mm, in or pt) sets the unit in which the lengths will be
-%D displayed, digits (any number $\geq 0$)
-%D sets the number of digits after the decimal period, round (any
-%D number $\neq 0$) states
-%D the place where rounding of the displayed numbers should occur
-%D (\TeX\ is bad at calculating such things) and showmore (0/1) tells
-%D this module to display information about the edge and top/bottom.
-
-%D Example:
-%D \starttyping
-%D \ShowLayout
-%D [units=cm,
-%D digits=2,
-%D round=0.1,
-%D showmore=1,
-%D graphonly=1]
-%D
-%D \stoptyping
-
-%D The idea was taken from the \type{\layout} command from the layout LaTeX
-%D package. (Kent McPherson and others)
-
-%C the following settings will be recognized:
-%C units = cm, mm, in or pt
-%C digits = any number >= 0, those are the digits after the decimal period
-%C round = any number != 0, just play with it, example 0.1 or 0.01.
-%C Explanation will be done later
-
-%D \subject{The code}
-
-%D This section is not meant as documentation
-
-\newdimen\ShowLayoutdimen
-
-\setvalue{Layoutmm}{0.351459804} % 2.54/72.27 * 10
-\setvalue{Layoutcm}{0.0351459804} % 2.54/72.27
-\setvalue{Layoutin}{0.0138370001} % 1/72.27
-\setvalue{Layoutpt}{1}
-
-\def\ShowLayoutB(#1.#2)#3{%
- \counttokens #2\to\scratchcounter
- #1\ifnum#3>0%
- \ifnum#3 > \the\scratchcounter \else \scratchcounter=#3 \fi
- \splitofftokens \scratchcounter \from #2 \to\test .\test \fi}
-
-% taken from ConTeXt source
-\def\LayoutConvert#1#2#3%
- {\ShowLayoutdimen=\getvalue{ShowLayoutround}pt
- \begingroup
- \scratchdimen#1\relax
- \scratchdimen\getvalue{Layout#2}\scratchdimen
- \advance\scratchdimen by 0.5\ShowLayoutdimen
- \divide\scratchdimen by \ShowLayoutdimen
- \multiply\scratchdimen by \ShowLayoutdimen
- \expandafter\ShowLayoutB\expandafter(\number\withoutpt{\the\scratchdimen}){#3}\thinspace #2
- \endgroup}
-
-\def\ShowLayoutA#1{%
- \LayoutConvert{#1}%
- {\getvalue{ShowLayoutunits}}%
- {\getvalue{ShowLayoutdigits}}}%
-
-\startuniqueMPgraphic{ShowLayout}{showmore}
-% make sure that the label is on the same side as the posa
-vardef swapifnecessary (suffix posa, posb)(expr labelpos) =
- if ( (labelpos < posa) and (posa > posb))
- or ( (labelpos > posa) and (posa < posb)) :
- save c; %swap 'em
- c:=posa;
- posa:=posb;
- posb:= c;
- fi
-enddef;
-% num: labelnumber
-% vertical: horizontal or vertical label?
-% pos: for horizontal the y coord, for vertical the x corrd
-% posa, posb: positions of the borders (x coord for horizontal)
-% labelpos: position for label, only for outer labels, given in the
-% same direction as posa, posb
-def layoutshowmark(expr num, vertical, pos, posa, posb, labelpos) =
- save b,e,c,p,arrow;
- numeric b,e; pair p[]; path arrow[],c;
-
- b:=posa;
- e:=posb;
-
- % p0 is labelposition
- % p1 is from
- % p2 is to
- % p3 is opposite arrow in outer marking
-
- if labelpos = 0 : % inner label |<----(n)---->|
- p0 := (.5[b,e], pos);
- else: % outer label --->| |<----(n)
- swapifnecessary (b,e, labelpos);
- p0 := (labelpos, pos);
- p3 := ( if b < labelpos: e-5mm else: e+5mm fi ,pos);
- fi
-
- p1 := (b,pos);
- p2 := (e,pos);
-
- if vertical:
- p0:=(ypart p0,xpart p0);
- p1:=(ypart p1,xpart p1);
- p2:=(ypart p2,xpart p2);
- p3:=(ypart p3,xpart p3);
- fi
- c:= fullcircle scaled .7cm shifted p0;
-
- if (center(c) -- p1) intersectiontimes c = (-1,-1):
- % don't draw the arrows, because there is not enough room for them.
- else:
- arrow1 :=center(c) -- p1 cutbefore (center(c) -- p1) intersectionpoint c ;
- arrow2 :=
- if labelpos = 0 : % inner
- center(c) -- p2 cutbefore (center(c) -- p2) intersectionpoint c
- else:
- p3 -- p2
- fi;
-
- label (decimal (num), center(c));
- draw c;
- drawarrow arrow1;
- drawarrow arrow2;
- fi
-
-enddef;
-
-
-
-StartPage;
-numeric xpos,ypos;
-
-path body,leftmargin,header,footer,rightmargin;
-
-
-% backspace:
-draw llcorner Page shifted (BackSpace,0) --
- ulcorner Page shifted (BackSpace,0) dashed evenly;
-
-%topspace
-draw urcorner Page shifted (0,-TopSpace) --
- ulcorner Page shifted (0,-TopSpace) dashed evenly;
-
-
-header := Field [Header] [Text];
-footer := Field [Footer] [Text];
-leftmargin := Field [LeftMargin] [Text];
-rightmargin:= Field [RightMargin][Text];
-body := Field [Text] [Text];
-
-pickup pencircle scaled 2pt;
-
-draw Page;
-draw leftmargin;
-draw rightmargin;
-draw header;
-draw footer;
-draw body;
-
-
-
-label ("Body", center (body));
-label ("Header",center (header));
-label ("Left Margin", center (leftmargin));
-label ("Right Margin", center (rightmargin));
-label ("Footer", center (footer));
-%% label (textext("\tfb Body"), center (body));
-%% label (textext("\tfa Header"),center (header));
-%% label (textext("Left Margin"), center (leftmargin));
-%% label (textext("Right Margin"), center (rightmargin));
-%% label (textext("\tfa Footer"), center (footer));
-
-
-if \MPvar{showmore}=1:
- path top, bot, leftedge, rightedge;
-
- top := Field [Top] [Text];
- bot := Field [Bottom] [Text];
- leftedge := Field [LeftEdge] [Text];
- rightedge := Field [RightEdge][Text];
-
- draw top;
- draw bot;
- draw leftedge;
- draw rightedge;
-fi
-
-pickup pencircle scaled 1pt;
-
-% (num, vertical, pos, from, to, labelpos)
-
-%backspace
-layoutshowmark (1, false, .5[ypart(ulcorner Page),Vstep[Top]], 0,BackSpace,0)
-
-
-ypos := Vstep[HeaderSeparator] -1cm;
-
-% leftmargin
-layoutshowmark (2, false, ypos,
- Hstep[LeftMargin],
- Hstep[LeftMargin]+Hsize[LeftMargin],0);
-
-% leftmargindistance
-layoutshowmark (3, false, ypos -1cm,
- Hstep[LeftMarginSeparator],
- Hstep[Text],
- Hstep[Text]+1cm);
-
-% makeupwidth
-layoutshowmark (4, false, Vstep[Text]+2cm,
- Hstep[Text], Hstep[Text]+Hsize[Text],0);
-
-% rightmargin
-layoutshowmark (5, false, ypos,
- Hstep[RightMargin],
- Hstep[RightMargin]+Hsize[RightMargin],0);
-
-% rightmargindistance
-layoutshowmark (6, false, ypos-1cm,
- Hstep[RightMargin],
- Hstep[RightMarginSeparator],
- Hstep[RightMarginSeparator] -1cm);
-
-
-%topspace
-
-xpos:=xpart(ulcorner Page)+BackSpace+1cm;
-layoutshowmark (7, true, xpos, PaperHeight,PaperHeight-TopSpace,0)
-
-%header
-xpos:=xpos+1cm;
-ypos:=.5[PaperHeight,PaperHeight-TopSpace];
-layoutshowmark (8, true, xpos ,
- Vstep[Header],
- Vstep[Header]+Vsize[Header],ypos);
-
-%headerseparator
-xpos:=xpos+1cm;
-layoutshowmark (9, true,xpos,
- Vstep[HeaderSeparator],
- Vstep[HeaderSeparator]+Vsize[HeaderSeparator],ypos);
-
-xpos:=xpos+1cm;
-
-if \MPvar{showmore}=1:
- % top
- layoutshowmark (17, true, xpos,
- Vstep[Top],
- Vstep[Top]+Vsize[Top], ypos);
-
- xpos:=xpos+1cm;
- layoutshowmark (18, true, xpos,
- Vstep[TopSeparator],
- Vstep[TopSeparator]+Vsize[TopSeparator], ypos);
-
-fi
-
-% makeupheight
-layoutshowmark (10, true,Hstep[RightMarginSeparator]-2cm,
- Vstep[Header]+Vsize[Header],
- Vstep[Footer],0);
-
-
-%footerseparator
-xpos:=xpart(ulcorner Page)+BackSpace+2cm;
-ypos:=.5(Vstep[Footer]);
-
-layoutshowmark (11, true,xpos,
- Vstep[FooterSeparator],
- Vstep[FooterSeparator]+Vsize[FooterSeparator],ypos);
-
-%footer
-xpos:=xpos+1cm;
-layoutshowmark (12, true,xpos,
- Vstep[Footer],Vstep[Footer]+Vsize[Footer],ypos);
-
-xpos:=xpos+1cm;
-
-if \MPvar{showmore}=1:
- % bottom
- layoutshowmark (19, true, xpos,
- Vstep[Bottom],
- Vstep[Bottom]+Vsize[Bottom], ypos);
- xpos:=xpos+1cm;
- layoutshowmark (20, true, xpos,
- Vstep[BottomSeparator],
- Vstep[BottomSeparator]+Vsize[BottomSeparator], ypos);
-
-fi
-
-if \MPvar{showmore}=1:
-
- ypos := Vstep[HeaderSeparator] -3cm;
-
- % LeftEdge
- layoutshowmark (13, false, ypos,
- Hstep[LeftEdge],
- Hstep[LeftEdge]+Hsize[LeftEdge],Hstep[Text]+1cm);
- ypos := ypos-1cm;
- % LeftEdgeSeparator
- layoutshowmark (14, false, ypos,
- Hstep[LeftEdgeSeparator],
- Hstep[LeftEdgeSeparator]+Hsize[LeftEdgeSeparator],
- Hstep[Text]+1cm);
-
- ypos := Vstep[HeaderSeparator] -3cm;
-
- layoutshowmark (15, false, ypos,
- Hstep[RightEdge],
- Hstep[RightEdge]+Hsize[RightEdge],
- Hstep[RightMarginSeparator] -1cm);
-
- ypos := ypos-1cm;
-
- layoutshowmark (16, false, ypos,
- Hstep[RightEdge],
- Hstep[RightEdgeSeparator],
- Hstep[RightMarginSeparator] -1cm);
-
-
-
-fi
-
-currentpicture := currentpicture scaled .5;
-
-\stopuniqueMPgraphic
-\defineoverlay[ShowLayout][\uniqueMPgraphic{ShowLayout}]
-
-\def\SetupShowLayout{\dosingleempty\getparameters[ShowLayout]}
-\SetupShowLayout[units=pt,digits=1,round=0.1,showmore=0,graphonly=0]
-
-\def\ShowLayout{\dosingleempty\doShowLayout}
-
-
-\def\doShowLayout[#1]{%
- \getparameters[ShowLayout][#1]
- \setMPvariables[ShowLayout][showmore=\getvalue{ShowLayoutshowmore}]
- \framed[width=.5\paperwidth,
- height=.5\paperheight,
- background=ShowLayout,
- frame=off,
-% frame=on,
- ]{}%
-\ifnum\getvalue{ShowLayoutgraphonly}=0
- \bgroup\tfxx
-\startcolumns[n=2]
-\starttabulate[|r|l|]
-\NC 1 \NC backspace \ShowLayoutA{\the\backspace} \NR
-\NC 2 \NC leftmargin \ShowLayoutA{\the\leftmarginwidth}\NR
-\NC 3 \NC leftmargindistance \ShowLayoutA{\the\leftmargindistance}\NR
-\NC 4 \NC width \ShowLayoutA{\the\makeupwidth}\NR
-\NC 5 \NC rightmargin \ShowLayoutA{\the\rightmarginwidth}\NR
-\NC 6 \NC rightmargindistance \ShowLayoutA{\the\rightmargindistance}\NR
-\NC 7 \NC topspace \ShowLayoutA{\the\topspace}\NR
-\NC 8 \NC header \ShowLayoutA{\the\headerheight}\NR
-\NC 9 \NC headerdistance \ShowLayoutA{\the\headerdistance}\NR
-\NC 10\NC height \ShowLayoutA{\the\makeupheight}\NR
-\NC 11\NC footerdistance \ShowLayoutA{\the\footerdistance}\NR
-\NC 12\NC footer \ShowLayoutA{\the\footerheight}\NR
-\ifnum\getvalue{ShowLayoutshowmore}=1%
-\NC 13\NC leftedge \ShowLayoutA{\the\leftedgewidth}\NR
-\NC 14\NC leftedgedistance \ShowLayoutA{\the\leftedgedistance}\NR
-\NC 15\NC rightedge \ShowLayoutA{\the\rightedgewidth}\NR
-\NC 16\NC rightedgedistance \ShowLayoutA{\the\rightedgedistance}\NR
-\NC 17\NC top \ShowLayoutA{\the\topheight}\NR
-\NC 18\NC topdistance \ShowLayoutA{\the\topdistance}\NR
-\NC 19\NC bottom \ShowLayoutA{\the\bottomheight}\NR
-\NC 20\NC bottomdistance \ShowLayoutA{\the\bottomdistance}\NR
-\fi
-\NC \NC paperwidth \ShowLayoutA{\the\paperwidth}\NR
-\NC \NC paperheight \ShowLayoutA{\the\paperheight}\NR
-\stoptabulate
-\stopcolumns
-\egroup
-\fi
-}
diff --git a/Master/texmf-dist/doc/context/third/context-notes-zh-cn/src/t-zhfonts.lua b/Master/texmf-dist/doc/context/third/context-notes-zh-cn/src/t-zhfonts.lua
deleted file mode 100644
index c40219febfb..00000000000
--- a/Master/texmf-dist/doc/context/third/context-notes-zh-cn/src/t-zhfonts.lua
+++ /dev/null
@@ -1,272 +0,0 @@
-zhfonts = {}
-
-local function init_fonts_table ()
- local f = {}
- f.serif, f.sans, f.mono = {}, {}, {}
- for k in pairs (f) do
- f[k] = {regular = {},bold = {}, italic = {}, bolditalic = {}}
- end
- return f
-end
-
-local cjkfonts, latinfonts = init_fonts_table (), init_fonts_table ()
-
-cjkfonts.serif.regular = {name = 'adobesongstd', rscale = '1.0'}
-cjkfonts.serif.bold = {name = 'adobeheitistd', rscale = '1.0'}
-cjkfonts.serif.italic = {name = 'adobesongstd', rscale = '1.0'}
-cjkfonts.serif.bolditalic = {name = 'adobeheitistd', rscale = '1.0'}
-cjkfonts.sans.regular = {name = 'adobeheitistd', rscale = '1.0'}
-cjkfonts.sans.bold = {name = 'adobeheitistd', rscale = '1.0'}
-cjkfonts.sans.italic = {name = 'adobeheitistd', rscale = '1.0'}
-cjkfonts.sans.bolditalic = {name = 'adobeheitistd', rscale = '1.0'}
-cjkfonts.mono.regular = {name = 'adobesongstd', rscale = '1.0'}
-cjkfonts.mono.bold = {name = 'adobesongstd', rscale = '1.0'}
-cjkfonts.mono.italic = {name = 'adobesongstd', rscale = '1.0'}
-cjkfonts.mono.bolditalic = {name = 'adobesongstd', rscale = '1.0'}
-
-latinfonts.serif.regular = {name = 'texgyrepagellaregular'}
-latinfonts.serif.bold = {name = 'texgyrepagellabold'}
-latinfonts.serif.italic = {name = 'texgyrepagellaitalic'}
-latinfonts.serif.bolditalic = {name = 'texgyrepagellabolditalic'}
-latinfonts.sans.regular = {name = 'texgyreherosregular'}
-latinfonts.sans.bold = {name = 'texgyreherosbold'}
-latinfonts.sans.italic = {name = 'texgyreherositalic'}
-latinfonts.sans.bolditalic = {name = 'texgyreherosbolditalic'}
-latinfonts.mono.regular = {name = 'lmmono10regular'}
-latinfonts.mono.bold = {name = 'lmmonolt10bold'}
-latinfonts.mono.italic = {name = 'lmmono10italic'}
-latinfonts.mono.bolditalic = {name = 'lmmonolt10boldoblique'}
-
-local mathfonts = {roman = {}}
-mathfonts.roman.name = 'xitsmathregular'
-mathfonts.roman.feature = 'math\mathsizesuffix'
-mathfonts.roman.goodies = 'xits-math'
-
-local function strsplit(str, sep)
- local start_pos = 1
- local split_pos = 1
- local result = {}
- local stop_pos = nil
- while true do
- stop_pos = string.find (str, sep, start_pos)
- if not stop_pos then
- result[split_pos] = string.sub (str, start_pos, string.len(str))
- break
- end
- result[split_pos] = string.sub (str, start_pos, stop_pos - 1)
- start_pos = stop_pos + string.len(sep)
- split_pos = split_pos + 1
- end
- return result
-end
-
-local function strtrim (str)
- return string.gsub (str, "^%s*(.-)%s*$", "%1")
-end
-
-local function str_split_and_trim (str, sep)
- local strlist = strsplit (str, sep)
- local result = {}
- for i, v in ipairs (strlist) do
- result[i] = strtrim (v)
- end
- return result
-end
-
-local function gen_cjk_typescript (ft)
- local fb = '\\definefontfallback'
- local fb_area = '[0x00400-0x2FA1F]'
- local s1 = nil
-
- context ('\\starttypescript[serif][zhfonts]')
- context ('\\setups[font:fallbacks:serif]')
- s = ft.serif.regular
- context (fb..'[zhSerif][name:'..s.name..']'..fb_area..'[rscale='..s.rscale..']')
- s = ft.serif.bold
- context (fb..'[zhSerifBold][name:'..s.name..']'..fb_area..'[rscale='..s.rscale..']')
- s = ft.serif.italic
- context (fb..'[zhSerifItalic][name:'..s.name..']'..fb_area..'[rscale='..s.rscale..']')
- s = ft.serif.bolditalic
- context (fb..'[zhSerifBoldItalic][name:'..s.name..']'..fb_area..'[rscale='..s.rscale..']')
- context ('\\stoptypescript')
-
- context ('\\starttypescript[sans][zhfonts]')
- context ('\\setups[font:fallbacks:sans]')
- s = ft.sans.regular
- context (fb..'[zhSans][name:'..s.name..']'..fb_area..'[rscale='..s.rscale..']')
- s = ft.sans.bold
- context (fb..'[zhSansBold][name:'..s.name..']'..fb_area..'[rscale='..s.rscale..']')
- s = ft.sans.italic
- context (fb..'[zhSansItalic][name:'..s.name..']'..fb_area..'[rscale='..s.rscale..']')
- s = ft.sans.bolditalic
- context (fb..'[zhSansBoldItalic][name:'..s.name..']'..fb_area..'[rscale='..s.rscale..']')
- context ('\\stoptypescript')
-
- context ('\\starttypescript[mono][zhfonts]')
- context ('\\setups[font:fallbacks:mono]')
- s = ft.mono.regular
- context (fb..'[zhMono][name:'..s.name..']'..fb_area..'[rscale='..s.rscale..']')
- s = ft.mono.bold
- context (fb..'[zhMonoBold][name:'..s.name..']'..fb_area..'[rscale='..s.rscale..']')
- s = ft.mono.italic
- context (fb..'[zhMonoItalic][name:'..s.name..']'..fb_area..'[rscale='..s.rscale..']')
- s = ft.mono.bolditalic
- context (fb..'[zhMonoBoldItalic][name:'..s.name..']'..fb_area..'[rscale='..s.rscale..']')
- context ('\\stoptypescript')
-end
-
-local function gen_latin_typescript (ft)
- local la = '\\definefontsynonym[latin'
-
- context ('\\starttypescript[serif][zhfonts]')
- context (la..'Serif][name:' .. ft.serif.regular.name .. ']')
- context (la..'SerifBold][name:' .. ft.serif.bold.name .. ']')
- context (la..'SerifItalic][name:' .. ft.serif.italic.name .. ']')
- context (la..'SerifBoldItalic][name:' .. ft.serif.bolditalic.name .. ']')
- context ('\\stoptypescript')
-
- context ('\\starttypescript[sans][zhfonts]')
- context (la..'Sans][name:' .. ft.sans.regular.name .. ']')
- context (la..'SansBold][name:' .. ft.sans.bold.name .. ']')
- context (la..'SansItalic][name:' .. ft.sans.italic.name .. ']')
- context (la..'SansBoldItalic][name:' .. ft.sans.bolditalic.name .. ']')
- context ('\\stoptypescript')
-
- context ('\\starttypescript[mono][zhfonts]')
- context (la..'Mono][name:' .. ft.mono.regular.name .. ']')
- context (la..'MonoBold][name:' .. ft.mono.bold.name .. ']')
- context (la..'MonoItalic][name:' .. ft.mono.italic.name .. ']')
- context (la..'MonoBoldItalic][name:' .. ft.mono.bolditalic.name .. ']')
- context ('\\stoptypescript')
-end
-
-local function gen_fallback_typescript ()
- context ('\\starttypescript[serif][zhfonts]')
- context ('\\setups[font:fallbacks:serif]')
- context ('\\definefontsynonym[zhSeriffallback][latinSerif][fallbacks=zhSerif]')
- context ('\\definefontsynonym[Serif][zhSeriffallback]')
- context ('\\definefontsynonym[zhSerifBoldfallback][latinSerifBold][fallbacks=zhSerifBold]')
- context ('\\definefontsynonym[SerifBold][zhSerifBoldfallback]')
- context ('\\definefontsynonym[zhSerifItalicfallback][latinSerifItalic][fallbacks=zhSerifItalic]')
- context ('\\definefontsynonym[SerifItalic][zhSerifItalicfallback]')
- context ('\\definefontsynonym[zhSerifBoldItalicfallback][latinSerifBoldItalic][fallbacks=zhSerifBoldItalic]')
- context ('\\definefontsynonym[SerifBoldItalic][zhSerifBoldItalicfallback]')
- context ('\\stoptypescript')
-
- context ('\\starttypescript[sans][zhfonts]')
- context ('\\setups[font:fallbacks:sans]')
- context ('\\definefontsynonym[zhSansfallback][latinSans][fallbacks=zhSans]')
- context ('\\definefontsynonym[Sans][zhSansfallback]')
- context ('\\definefontsynonym[zhSansBoldfallback][latinSansBold][fallbacks=zhSansBold]')
- context ('\\definefontsynonym[SansBold][zhSansBoldfallback]')
- context ('\\definefontsynonym[zhSansItalicfallback][latinSansItalic][fallbacks=zhSansItalic]')
- context ('\\definefontsynonym[SansItalic][zhSansItalicfallback]')
- context ('\\definefontsynonym[zhSansBoldItalicfallback][latinSansBoldItalic][fallbacks=zhSansBoldItalic]')
- context ('\\definefontsynonym[SansBoldItalic][zhSansBoldItalicfallback]')
- context ('\\stoptypescript')
-
- context ('\\starttypescript[mono][zhfonts]')
- context ('\\setups[font:fallbacks:mono]')
- context ('\\definefontsynonym[zhMonofallback][latinMono][fallbacks=zhMono]')
- context ('\\definefontsynonym[Mono][zhMonofallback]')
- context ('\\definefontsynonym[zhMonoBoldfallback][latinMonoBold][fallbacks=zhMonoBold]')
- context ('\\definefontsynonym[MonoBold][zhMonoBoldfallback]')
- context ('\\definefontsynonym[zhMonoItalicfallback][latinMonoItalic][fallbacks=zhMonoItalic]')
- context ('\\definefontsynonym[MonoItalic][zhMonoItalicfallback]')
- context ('\\definefontsynonym[zhMonoBoldItalicfallback][latinMonoBoldItalic][fallbacks=zhMonoBoldItalic]')
- context ('\\definefontsynonym[MonoBoldItalic][zhMonoBoldItalicfallback]')
- context ('\\stoptypescript')
-end
-
-local function gen_math_typescript (ft)
- if mathfonts.roman.name then
- local s = ft.roman
- context ('\\starttypescript[math][zhfonts]')
- context ('\\setups[font:fallbacks:math]')
- context ('\\definefontsynonym[MathRoman][name:'..s.name..'][features='..s.feature..', goodies='..s.goodies..']')
- context ('\\stoptypescript')
- end
-end
-
-local function gen_typeface ()
- context ('\\starttypescript[zhfonts]')
- context ('\\definetypeface[zhfonts][rm][serif][zhfonts][default][features=zh]')
- context ('\\definetypeface[zhfonts][ss][sans][zhfonts][default][features=zh]')
- context ('\\definetypeface[zhfonts][tt][mono][zhfonts][default]')
- if mathfonts.roman.name then
- context ('\\definetypeface[zhfonts][mm][math][zhfonts]')
- end
- context ('\\stoptypescript')
-end
-
-function zhfonts.gen_typescript ()
- gen_cjk_typescript (cjkfonts)
- gen_latin_typescript (latinfonts)
- gen_fallback_typescript ()
- gen_math_typescript (mathfonts)
- gen_typeface ()
-end
-
-local function setup_cjkfonts (meta, fontlist)
- local f, g = nil, nil
- for i, v in ipairs (fontlist) do
- f = str_split_and_trim (v, '=')
- g = str_split_and_trim (f[2], '@')
- if g[1] ~= '' then cjkfonts[meta][f[1]].name = g[1] end
- if g[2] then cjkfonts[meta][f[1]].rscale = g[2] end
- end
-end
-
-local function setup_latinfonts (meta, fontlist)
- local f, g = nil, nil
- for i, v in ipairs (fontlist) do
- f = str_split_and_trim (v, '=')
- latinfonts[meta][f[1]].name = f[2]
- end
-end
-
-local function setup_mathfonts (fontlist)
- local f, g = nil, nil
- for i, v in ipairs (fontlist) do
- f = str_split_and_trim (v, '=')
- if f[2] ~= '' then
- mathfonts[f[1]].name = f[2]
- else
- mathfonts[f[1]].name = nil
- end
- end
-end
-
-
-local fontfeatures = "mode=node,protrusion=myvector,liga=yes,"
-local function setup_fontfeatures (s)
- fontfeatures = fontfeatures .. s
- print (fontfeatures)
-end
-
-function zhfonts.setup (metainfo, fontinfo)
- local m = str_split_and_trim (metainfo, ',')
- local f = str_split_and_trim (fontinfo, ',')
- if #m == 1 and m[1] == 'feature' then setup_fontfeatures (fontinfo) end
- if #m == 1 and cjkfonts[m[1]] then setup_cjkfonts (m[1], f) end
- if #m == 1 and m[1] == 'math' then setup_mathfonts (f) end
- if #m == 2 then
- if m[1] == 'latin' and latinfonts[m[2]] then setup_latinfonts (m[2], f) end
- if m[2] == 'latin' and latinfonts[m[1]] then setup_latinfonts (m[1], f) end
- end
-end
-
-function zhfonts.use (param)
- context ('\\setscript[hanzi]')
- zhspuncs.opt ()
- context ('\\definefontfeature[zh][default][' .. fontfeatures .. ']')
- context ('\\setupalign[hz,hanging]')
- local f = strtrim (param)
- if f ~= "none" then
- zhfonts.gen_typescript ()
- if f ~= "hack" then
- context ('\\usetypescript[zhfonts]')
- context ('\\setupbodyfont[zhfonts, ' .. param .. ']')
- end
- end
-end
diff --git a/Master/texmf-dist/doc/context/third/context-notes-zh-cn/src/t-zhfonts.mkiv b/Master/texmf-dist/doc/context/third/context-notes-zh-cn/src/t-zhfonts.mkiv
deleted file mode 100644
index 5549845cce5..00000000000
--- a/Master/texmf-dist/doc/context/third/context-notes-zh-cn/src/t-zhfonts.mkiv
+++ /dev/null
@@ -1,37 +0,0 @@
-%D \module
-%D [ file=t-zhfonts,
-%D version=2010.01.06,
-%D title=\CONTEXT\ User Module,
-%D subtitle=zhfonts,
-%D author=Li Yanrui,
-%D date=\currentdate,
-%D copyright=Li Yanrui,
-%D email=liyanrui.m2@gmail.com,
-%D license=Public Domain]
-
-\writestatus{loading}{ConTeXt User Module / zhfonts}
-\startmodule[zhfonts]
-\unprotect
-\setupmodule[style=rm,size=11pt]
-
-%D Lua code
-\ctxloadluafile{t-zhfonts}
-\ctxloadluafile{t-zhspuncs}
-
-\def\setupzhfonts{\dodoubleempty\dosetupzhfonts}
-\def\dosetupzhfonts[#1][#2]{%
- \ctxlua{zhfonts.setup ('#1', '#2')}
-}
-
-\def\zhfonts[#1]{%
- \ctxlua{zhfonts.use ("#1")}
-}
-
-\edef\@@@@??style{\currentmoduleparameter{style}}
-\edef\@@@@??size{\currentmoduleparameter{size}}
-\prependtoks \zhfonts[\@@@@??style, \@@@@??size] \to \everystarttext
-
-\protect
-\stopmodule
-\endinput
-
diff --git a/Master/texmf-dist/doc/context/third/context-notes-zh-cn/src/t-zhspuncs.lua b/Master/texmf-dist/doc/context/third/context-notes-zh-cn/src/t-zhspuncs.lua
deleted file mode 100644
index a739bf4c03d..00000000000
--- a/Master/texmf-dist/doc/context/third/context-notes-zh-cn/src/t-zhspuncs.lua
+++ /dev/null
@@ -1,178 +0,0 @@
-zhspuncs = zhspuncs or {}
-
-local glyph = nodes.pool.register (node.new ("glyph", 0))
-
-local glyph_flag = node.id ('glyph')
-local glue_flag = node.id ('glue')
-local hlist_flag = node.id ('hlist')
-local kern_flag = node.id ('kern')
-local penalty_flag = node.id ('penalty')
-local math_flag = node.id ('math')
-
-local fonthashes = fonts.hashes
-local fontdata = fonthashes.identifiers
-local quaddata = fonthashes.quads
-
-local node_count = node.count
-local node_dimensions = node.dimensions
-local node_traverse_id = node.traverse_id
-local node_slide = node.slide
-local list_tail = node.tail
-local insert_before = node.insert_before
-local insert_after = node.insert_after
-local new_glue = nodes.pool.glue
-local new_kern = nodes.pool.kern
-local new_glue_spec = nodes.pool.glue_spec
-local new_penalty = nodes.pool.penalty
-local new_rule = nodes.pool.rule
-
-local tasks = nodes.tasks
-
-
-local puncs = {
- [0x2018] = {0.5, 0.1, 1.0, 1.0}, -- ‘
- [0x201C] = {0.5, 0.1, 0.5, 1.0}, -- “
- [0x3008] = {0.5, 0.1, 1.0, 1.0}, -- 〈
- [0x300A] = {0.5, 0.1, 1.0, 1.0}, -- 《
- [0x300C] = {0.5, 0.1, 1.0, 1.0}, -- 「
- [0x300E] = {0.5, 0.1, 1.0, 1.0}, -- 『
- [0x3010] = {0.5, 0.1, 1.0, 1.0}, -- 【
- [0x3014] = {0.5, 0.1, 1.0, 1.0}, -- 〔
- [0x3016] = {0.5, 0.1, 1.0, 1.0}, -- 〖
- [0xFF08] = {0.5, 0.1, 1.0, 1.0}, -- (
- [0xFF3B] = {0.5, 0.1, 1.0, 1.0}, -- [
- [0xFF5B] = {0.5, 0.1, 1.0, 1.0}, -- {
- [0x2019] = {0.1, 0.5, 1.0, 0.0}, -- ’
- [0x201D] = {0.1, 0.5, 1.0, 0.0}, -- ”
- [0x3009] = {0.1, 0.5, 1.0, 0.5}, -- 〉
- [0x300B] = {0.1, 0.5, 1.0, 0.5}, -- 》
- [0x300D] = {0.1, 0.5, 1.0, 0.5}, -- 」
- [0x300F] = {0.1, 0.5, 1.0, 0.5}, -- 』
- [0x3011] = {0.1, 0.5, 1.0, 0.5}, -- 】
- [0x3015] = {0.1, 0.5, 1.0, 0.5}, -- 〕
- [0x3017] = {0.1, 0.5, 1.0, 0.5}, -- 〗
- [0xFF09] = {0.1, 0.5, 1.0, 0.5}, -- )
- [0xFF3D] = {0.1, 0.5, 1.0, 0.5}, -- ]
- [0xFF5D] = {0.1, 0.5, 1.0, 0.5}, -- }
- -- 需要特殊处理
- [0x2014] = {0.0, 0.0, 1.0, 1.0}, -- —
- [0x2026] = {0.1, 0.1, 1.0, 1.0}, -- …
- [0x2500] = {0.0, 0.0, 1.0, 1.0}, -- ─
- [0x3001] = {0.15, 0.5, 1.0, 0.5}, -- 、
- [0x3002] = {0.15, 0.6, 1.0, 0.3}, -- 。
- [0xFF01] = {0.15, 0.5, 1.0, 0.5}, -- !
- [0xFF05] = {0.0, 0.0, 1.0, 0.5}, -- %
- [0xFF0C] = {0.15, 0.5, 1.0, 0.3}, -- ,
- [0xFF0E] = {0.15, 0.5, 1.0, 0.5}, -- .
- [0xFF1A] = {0.15, 0.5, 1.0, -0.1}, -- :
- [0xFF1B] = {0.15, 0.5, 1.0, 0.5}, -- ;
- [0xFF1F] = {0.15, 0.5, 1.0, 0.5}, -- ?
-}
-
-local function is_zhcnpunc_node (n)
- local n_is_punc = 0
- if puncs[n.char] then
- return true
- end
- return false
-end
-
-local function is_zhcnpunc_node_group (n)
- local n_is_punc = 0
- if puncs[n.char] then
- n_is_punc = 1
- end
- local nn = n.next
- local nn_is_punc = 0
- -- 还需要穿越那些非 glyph 结点
- while nn_is_punc == 0 and nn and n_is_punc == 1 do
- if nn.id == glyph_flag then
- if puncs[nn.char] then nn_is_punc = 1 end
- break
- end
- nn = nn.next
- end
- return n_is_punc + nn_is_punc
-end
-
-local function is_cjk_ideo (n)
- -- CJK Ext A
- if n.char >= 13312 and n.char <= 19893 then
- return true
- -- CJK
- elseif n.char >= 19968 and n.char <= 40891 then
- return true
- -- CJK Ext B
- elseif n.char >= 131072 and n.char <= 173782 then
- return true
- else
- return false
- end
-end
-
-local function quad_multiple (font, r)
- local quad = quaddata[font]
- return r * quad
-end
-
-local function process_punc (head, n, punc_flag, punc_table)
- local desc = fontdata[n.font].descriptions[n.char]
- if not desc then return end
- local quad = quad_multiple (n.font, 1)
-
- -- 像 $\ldots$ 这样的符号竟然没有边界盒,只好忽略并返回
- -- if desc.boundingbox == nil then return end
-
- local l_space = desc.boundingbox[1] / desc.width
- local r_space = (desc.width - desc.boundingbox[3]) / desc.width
- local l_kern, r_kern = 0.0, 0.0
-
- if punc_flag == 1 then
- l_kern = (punc_table[n.char][1] - l_space) * quad
- r_kern = (punc_table[n.char][2] - r_space) * quad
- elseif punc_flag == 2 then
- l_kern = (punc_table[n.char][1] * punc_table[n.char][3] - l_space) * quad
- r_kern = (punc_table[n.char][2] * punc_table[n.char][4] - r_space) * quad
- end
-
- insert_before (head, n, new_kern (l_kern))
- insert_after (head, n, new_kern (r_kern))
-end
-
-local function compress_punc (head)
- for n in node_traverse_id (glyph_flag, head) do
- local n_flag = is_zhcnpunc_node_group (n)
- if n_flag ~= 0 then
- process_punc (head, n, n_flag, puncs)
- end
- end
-end
-
-function zhspuncs.my_linebreak_filter (head, is_display)
- compress_punc (head)
- return head, true
-end
-
-function zhspuncs.opt ()
- tasks.appendaction("processors","after","zhspuncs.my_linebreak_filter")
-end
-
-fonts.protrusions.vectors['myvector'] = {
- [0xFF0c] = { 0, 0.60 }, -- ,
- [0x3002] = { 0, 0.60 }, -- 。
- [0x2018] = { 0.60, 0 }, -- ‘
- [0x2019] = { 0, 0.60 }, -- ’
- [0x201C] = { 0.60, 0 }, -- “
- [0x201D] = { 0, 0.60 }, -- ”
- [0xFF1F] = { 0, 0.60 }, -- ?
- [0x300A] = { 0.60, 0 }, -- 《
- [0x300B] = { 0, 0.60 }, -- 》
- [0xFF08] = { 0.50, 0 }, -- (
- [0xFF09] = { 0, 0.50 }, -- )
- [0x3001] = { 0, 0.50 }, -- 、
- [0xFF0E] = { 0, 0.50 }, -- .
-}
-fonts.protrusions.classes['myvector'] = {
- vector = 'myvector', factor = 1
-}
-
diff --git a/Master/texmf-dist/doc/context/third/inifile/VERSION b/Master/texmf-dist/doc/context/third/inifile/VERSION
deleted file mode 100644
index 53ed26412b2..00000000000
--- a/Master/texmf-dist/doc/context/third/inifile/VERSION
+++ /dev/null
@@ -1 +0,0 @@
-2008.07.15
diff --git a/Master/texmf-dist/doc/context/third/inifile/inifile-demo.pdf b/Master/texmf-dist/doc/context/third/inifile/inifile-demo.pdf
deleted file mode 100644
index 94ee02ad2fb..00000000000
--- a/Master/texmf-dist/doc/context/third/inifile/inifile-demo.pdf
+++ /dev/null
Binary files differ
diff --git a/Master/texmf-dist/doc/context/third/inifile/inifile-doc.pdf b/Master/texmf-dist/doc/context/third/inifile/inifile-doc.pdf
deleted file mode 100644
index 2dc6a2a5ec7..00000000000
--- a/Master/texmf-dist/doc/context/third/inifile/inifile-doc.pdf
+++ /dev/null
Binary files differ