diff options
55 files changed, 1264 insertions, 249 deletions
diff --git a/doc/context/documents/general/manuals/luametatex.pdf b/doc/context/documents/general/manuals/luametatex.pdf Binary files differnew file mode 100644 index 000000000..36a74997f --- /dev/null +++ b/doc/context/documents/general/manuals/luametatex.pdf diff --git a/doc/context/documents/general/qrcs/setup-cs.pdf b/doc/context/documents/general/qrcs/setup-cs.pdf Binary files differindex b887b4831..f673ee4aa 100644 --- a/doc/context/documents/general/qrcs/setup-cs.pdf +++ b/doc/context/documents/general/qrcs/setup-cs.pdf diff --git a/doc/context/documents/general/qrcs/setup-de.pdf b/doc/context/documents/general/qrcs/setup-de.pdf Binary files differindex 34e60e948..1af23a26b 100644 --- a/doc/context/documents/general/qrcs/setup-de.pdf +++ b/doc/context/documents/general/qrcs/setup-de.pdf diff --git a/doc/context/documents/general/qrcs/setup-en.pdf b/doc/context/documents/general/qrcs/setup-en.pdf Binary files differindex 70a537ece..3d5205666 100644 --- a/doc/context/documents/general/qrcs/setup-en.pdf +++ b/doc/context/documents/general/qrcs/setup-en.pdf diff --git a/doc/context/documents/general/qrcs/setup-fr.pdf b/doc/context/documents/general/qrcs/setup-fr.pdf Binary files differindex 3f93a0acb..5b95012b1 100644 --- a/doc/context/documents/general/qrcs/setup-fr.pdf +++ b/doc/context/documents/general/qrcs/setup-fr.pdf diff --git a/doc/context/documents/general/qrcs/setup-it.pdf b/doc/context/documents/general/qrcs/setup-it.pdf Binary files differindex fe1785cfa..f34275741 100644 --- a/doc/context/documents/general/qrcs/setup-it.pdf +++ b/doc/context/documents/general/qrcs/setup-it.pdf diff --git a/doc/context/documents/general/qrcs/setup-mapping-cs.pdf b/doc/context/documents/general/qrcs/setup-mapping-cs.pdf Binary files differindex 63bac99e1..07f1c20b0 100644 --- a/doc/context/documents/general/qrcs/setup-mapping-cs.pdf +++ b/doc/context/documents/general/qrcs/setup-mapping-cs.pdf diff --git a/doc/context/documents/general/qrcs/setup-mapping-de.pdf b/doc/context/documents/general/qrcs/setup-mapping-de.pdf Binary files differindex 3c42dfc12..b875ceda0 100644 --- a/doc/context/documents/general/qrcs/setup-mapping-de.pdf +++ b/doc/context/documents/general/qrcs/setup-mapping-de.pdf diff --git a/doc/context/documents/general/qrcs/setup-mapping-en.pdf b/doc/context/documents/general/qrcs/setup-mapping-en.pdf Binary files differindex 3c9cc5c91..90b48a548 100644 --- a/doc/context/documents/general/qrcs/setup-mapping-en.pdf +++ b/doc/context/documents/general/qrcs/setup-mapping-en.pdf diff --git a/doc/context/documents/general/qrcs/setup-mapping-fr.pdf b/doc/context/documents/general/qrcs/setup-mapping-fr.pdf Binary files differindex 0d3d3e5f4..cffb11e0a 100644 --- a/doc/context/documents/general/qrcs/setup-mapping-fr.pdf +++ b/doc/context/documents/general/qrcs/setup-mapping-fr.pdf diff --git a/doc/context/documents/general/qrcs/setup-mapping-it.pdf b/doc/context/documents/general/qrcs/setup-mapping-it.pdf Binary files differindex d71b622f8..6adbc87f9 100644 --- a/doc/context/documents/general/qrcs/setup-mapping-it.pdf +++ b/doc/context/documents/general/qrcs/setup-mapping-it.pdf diff --git a/doc/context/documents/general/qrcs/setup-mapping-nl.pdf b/doc/context/documents/general/qrcs/setup-mapping-nl.pdf Binary files differindex d5d39473b..64f60b163 100644 --- a/doc/context/documents/general/qrcs/setup-mapping-nl.pdf +++ b/doc/context/documents/general/qrcs/setup-mapping-nl.pdf diff --git a/doc/context/documents/general/qrcs/setup-mapping-ro.pdf b/doc/context/documents/general/qrcs/setup-mapping-ro.pdf Binary files differindex a2759e931..696e122fe 100644 --- a/doc/context/documents/general/qrcs/setup-mapping-ro.pdf +++ b/doc/context/documents/general/qrcs/setup-mapping-ro.pdf diff --git a/doc/context/documents/general/qrcs/setup-nl.pdf b/doc/context/documents/general/qrcs/setup-nl.pdf Binary files differindex 463d707ba..5edd20cc6 100644 --- a/doc/context/documents/general/qrcs/setup-nl.pdf +++ b/doc/context/documents/general/qrcs/setup-nl.pdf diff --git a/doc/context/documents/general/qrcs/setup-ro.pdf b/doc/context/documents/general/qrcs/setup-ro.pdf Binary files differindex a00eb0ca1..c335a9998 100644 --- a/doc/context/documents/general/qrcs/setup-ro.pdf +++ b/doc/context/documents/general/qrcs/setup-ro.pdf diff --git a/doc/context/sources/general/manuals/luametatex/luametatex-contents.tex b/doc/context/sources/general/manuals/luametatex/luametatex-contents.tex new file mode 100644 index 000000000..d55b7f15b --- /dev/null +++ b/doc/context/sources/general/manuals/luametatex/luametatex-contents.tex @@ -0,0 +1,19 @@ +\environment luametatex-style + +\startcomponent luametatex-contents + +\starttitle[title=Contents] + +\start + + \definecolor[maincolor][black] + + \placelist + [chapter,section,subsection] + [criterium=text] + +\stop + +\stoptitle + +\stopcomponent diff --git a/doc/context/sources/general/manuals/luametatex/luametatex-firstpage.tex b/doc/context/sources/general/manuals/luametatex/luametatex-firstpage.tex new file mode 100644 index 000000000..83fb40df1 --- /dev/null +++ b/doc/context/sources/general/manuals/luametatex/luametatex-firstpage.tex @@ -0,0 +1,36 @@ +\environment luametatex-style + +\startcomponent luametatex-firstpage + +\startstandardmakeup + + \start + \raggedleft + \definedfont[Bold*default at 48pt] + \setupinterlinespace + \blue \documentvariable{manual} \endgraf Reference \endgraf Manual \endgraf + \stop + + \vfill + + \definedfont[Bold*default at 12pt] + + \starttabulate[|l|l|] + \NC copyright \EQ Lua\TeX\ development team \NC \NR + \NC \EQ \CONTEXT\ development team \NC \NR + \NC more info \EQ www.luatex.org \NC \NR + \NC \EQ contextgarden.net \NC \NR + \NC version \EQ \currentdate \doifsomething{\documentvariable{snapshot}}{(snapshot \documentvariable{snapshot})} \NC \NR + \stoptabulate + +\stopstandardmakeup + +\setupbackgrounds + [leftpage] + [setups=pagenumber:left] + +\setupbackgrounds + [rightpage] + [setups=pagenumber:right] + +\stopcomponent diff --git a/doc/context/sources/general/manuals/luametatex/luametatex-introduction.tex b/doc/context/sources/general/manuals/luametatex/luametatex-introduction.tex new file mode 100644 index 000000000..5c68b3123 --- /dev/null +++ b/doc/context/sources/general/manuals/luametatex/luametatex-introduction.tex @@ -0,0 +1,82 @@ +% language=uk + +\environment luametatex-style + +\startcomponent luametatex-introduction + +\startchapter[title=Introduction] + +Around 2005 we started the \LUATEX\ projects and it took about a decade to reach +a state where we could consider the experiments to have reached a stable state. +Already for a while one could use \LUATEX\ in production but some of the +interfaces evolved. In 2018 the functionality was more or less frozen. Of course +we might add some features in due time but nothing fundamental will change as we +consider version 1.10 to be reasonable feature complete. Among the reasons is +that this engine is now used outside \CONTEXT\ too which means that we cannot +simply change much without affecting other macro packages. + +However, in reaching that state some decisions were delayed because they didn't +go well with a current stable version. This is why at the 2018 \CONTEXT\ meeting +those present agreed that we could move on with a follow up tagged \METATEX, a +name we already had in mind for a while, but as \LUA\ is an important component, +it got expanded to \LUAMETATEX. This follow up is a lightweight companion to +\LUATEX\ that will be maintained alongside. More about the reasons for this +follow up as well as the philosophy behind it can be found on the document(s) +describing the development. During \LUATEX\ development I kept track of what +happened in a series of documents, parts of which were published as articles in +user group journals, but all are in the \CONTEXT\ distribution. I did the same +with the development of \LUAMETATEX. + +The \LUAMETATEX\ engine is, as said, a lightweight version of \LUATEX, that for +now targets \CONTEXT. We will use it for possibly drastic experiments but without +affecting \LUATEX. As we can easily adapt \CONTEXT\ to support both, no other +macro package will be harmed when (for instance) interfaces change as part of an +experiment. Of course, when we consider something to be useful, it can be back +ported to \LUATEX, but only when there are good reasons for doing so. 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 have new primitives, this is not entirely true. + +This manual currently has quite a bit of overlap with the \LUATEX\ manual but +some chapters are removed, others added and the rest has been adapted. We also +discusses the (main) differences. Some of the new primitives or functions that +show up in \LUAMETATEX\ might show up in \LUATEX\ at some point, others might +not. For now it is an experimental engine in which we can change things at will +but with \CONTEXT\ in tandem so it will keep working. + +For \CONTEXT\ users the \LUAMETATEX\ engine will become the default. Because we +can keep both \LUAMETATEX\ and \CONTEXT\ in sync. The \CONTEXT\ variant 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. + +As this follow up is closely related to \CONTEXT\ development, and because we +expect stock \LUATEX\ to be used outside the \CONTEXT\ proper, there will be no +special mailing list nor coverage (or polution) on the \LUATEX\ related mailing +lists. We have the \CONTEXT\ mailing lists for that. In due time the source code +will be part of the regular \CONTEXT\ distribution. + +% \testpage[8] + +This manual refers to \LUATEX, when we talk of features common to both engine, as +well as \LUAMETATEX, when it is more specific to the follow up. + +\blank[big] + +Hans Hagen + +% \blank[2*big] +\page + +\starttabulate[|||] +\NC Version \EQ \currentdate \NC \NR +\NC \LUAMETATEX \EQ \cldcontext{LUATEXENGINE} % + \cldcontext{LUATEXVERSION} / % + \cldcontext{LUATEXFUNCTIONALITY} + \NC \NR +\NC \CONTEXT \EQ MkIV \contextversion \NC \NR +\NC \LUATEX\ Team \EQ Hans Hagen, Hartmut Henkel, Taco Hoekwater, Luigi Scarso \NC \NR +\stoptabulate + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/luametatex/luametatex-logos.tex b/doc/context/sources/general/manuals/luametatex/luametatex-logos.tex new file mode 100644 index 000000000..be75971d8 --- /dev/null +++ b/doc/context/sources/general/manuals/luametatex/luametatex-logos.tex @@ -0,0 +1,21 @@ +\startenvironment luametatex-logos + +\usemodule[abr-02] + +\logo[DFONT] {dfont} +\logo[CFF] {cff} +\logo[CMAP] {CMap} +\logo[PATGEN] {patgen} +\logo[MP] {MetaPost} +\logo[METAPOST] {MetaPost} +\logo[MPLIB] {MPlib} +\logo[COCO] {coco} +\logo[SUNOS] {SunOS} +\logo[BSD] {bsd} +\logo[SYSV] {sysv} +\logo[DPI] {dpi} +\logo[DLL] {dll} +\logo[OPENOFFICE]{OpenOffice} +\logo[OCP] {OCP} + +\stopenvironment diff --git a/doc/context/sources/general/manuals/luametatex/luametatex-style.tex b/doc/context/sources/general/manuals/luametatex/luametatex-style.tex new file mode 100644 index 000000000..ceb3f1a39 --- /dev/null +++ b/doc/context/sources/general/manuals/luametatex/luametatex-style.tex @@ -0,0 +1,451 @@ +\startenvironment luametatex-style + +% \environment luatex-style + +% \logo[LUAMETATEX] {\Lua Meta\TeX} + +% todo: use \useMPlibrary[lua] + +\enabletrackers[fonts.usage] + +\usemodule[fonts-statistics] + +\setuplayout + [height=middle, + width=middle, + backspace=2cm, + topspace=10mm, + bottomspace=10mm, + header=10mm, + footer=10mm, + footerdistance=10mm, + headerdistance=10mm] + +\setuppagenumbering + [alternative=doublesided] + +\setuptolerance + [stretch,tolerant] + +\setuptype + [lines=hyphenated] + +\setuptyping + [lines=hyphenated] + +\setupitemize + [each] + [packed] + +\definesymbol[1][\Uchar"2023] +\definesymbol[2][\endash] +\definesymbol[3][\wait] % we want to catch it + +\setupitemize + [each] + [headcolor=maincolor, + symbolcolor=maincolor, + color=maincolor] + +\setupwhitespace + [medium] + +\setuptabulate + [blank={small,samepage}, + headstyle=bold, + rulecolor=maincolor, + rulethickness=1pt, + foregroundcolor=white, + foregroundstyle=\ss\bfx\WORD, + backgroundcolor=maincolor] + +\setupcaptions + [headcolor=darkblue] + +\startluacode + local skipped = table.tohash { 'id', 'subtype', 'next', 'prev' } + + function document.functions.showfields(s) + local t = string.split(s,',') + local f = node.fields(t[1],t[2]) + if f then + local d = false + for i=1,#f do + local fi = f[i] + if skipped[fi] then + -- okay + elseif d then + context(', {\tttf %s}', fi) + else + context('{\tttf %s}', fi) + d = true + end + end + end + end + + function document.functions.showid(s) + local t = string.split(s,',') + context('{tttf %s}',node.id(t[1])) + if t[2] then + context(', {tttf %s}',node.subtype(t[2])) + end + end + + function document.functions.showsubtypes(s) + local s = node.subtypes(s) + local d = false + for k, v in table.sortedhash(s) do + if d then + context(', %s = {\\tttf %s}',k,v) + else + context('%s = {\\tttf %s}',k,v) + d = true + end + end + end +\stopluacode + +\unexpanded\def\showfields #1{\ctxlua{document.functions.showfields("#1")}} +\unexpanded\def\showid #1{\ctxlua{document.functions.showid("#1")}} +\unexpanded\def\showsubtypes#1{\ctxlua{document.functions.showsubtypes("#1")}} + +\definecolor[blue] [b=.5] +\definecolor[red] [r=.5] +\definecolor[green] [g=.5] +%definecolor[maincolor] [b=.5] +%definecolor[keptcolor] [b=.5] +%definecolor[othercolor][r=.5,g=.5] + +\definecolor[maincolor] [b=.5] +\definecolor[keptcolor] [b=.5] +\definecolor[othercolor][s=.5] + +\writestatus{luametatex manual}{} +\writestatus{luametatex manual}{defining lucodaot} \usebodyfont [lucidaot] +\writestatus{luametatex manual}{defining pagella} \usebodyfont [pagella] +\writestatus{luametatex manual}{defining cambria} \usebodyfont [cambria] +\writestatus{luametatex manual}{defining modern} \usebodyfont [modern] +\writestatus{luametatex manual}{defining dejavu} \setupbodyfont[dejavu,10pt] +\writestatus{luametatex manual}{} + +\setuphead [chapter] [align={flushleft,broad},style=\bfd] +\setuphead [section] [align={flushleft,broad},style=\bfb] +\setuphead [subsection] [align={flushleft,broad},style=\bfa] +\setuphead [subsubsection][align={flushleft,broad},style=\bf] + +\setuphead [chapter] [color=maincolor] +\setuphead [section] [color=maincolor] +\setuphead [subsection] [color=maincolor] +\setuphead [subsubsection][color=maincolor] + +\setupfloats + [ntop=4] + +\definehead + [remark] + [subsubsubject] + +\setupheadertexts + [] + +% \setuplayout +% [style=bold, +% color=maincolor] + +\definemixedcolumns + [twocolumns] + [n=2, + balance=yes, + before=\blank, + after=\blank] + +\definemixedcolumns + [threecolumns] + [twocolumns] + [n=3] + +\definemixedcolumns + [fourcolumns] + [threecolumns] + [n=4] + +% if we do this we also need to do it in table cells +% +% \setuptyping +% [color=maincolor] +% +% \setuptype +% [color=maincolor] + +\definetyping + [functioncall] + +\startMPdefinitions + + color luaplanetcolor ; luaplanetcolor := \MPcolor{maincolor} ; + color luaholecolor ; luaholecolor := white ; + numeric luaextraangle ; luaextraangle := 0 ; + numeric luaorbitfactor ; luaorbitfactor := .25 ; + + vardef lualogo = image ( + + % Graphic design by A. Nakonechnyj. Copyright (c) 1998, All rights reserved. + + save d, r, p ; numeric d, r, p ; + + d := sqrt(2)/4 ; r := 1/4 ; p := r/8 ; + + fill fullcircle scaled 1 + withcolor luaplanetcolor ; + draw fullcircle rotated 40.5 scaled (1+r) + dashed evenly scaled p + withpen pencircle scaled (p/2) + withcolor (luaorbitfactor * luaholecolor) ; + fill fullcircle scaled r shifted (d+1/8,d+1/8) + rotated - luaextraangle + withcolor luaplanetcolor ; + fill fullcircle scaled r shifted (d-1/8,d-1/8) + withcolor luaholecolor ; + luaorbitfactor := .25 ; + ) enddef ; + +\stopMPdefinitions + +\startuseMPgraphic{luapage} + StartPage ; + + fill Page withcolor \MPcolor{othercolor} ; + + luaorbitfactor := 1 ; + + picture p ; p := lualogo ysized (5*\measure{paperheight}/10) ; + draw p + shifted - center p + shifted ( + \measure{spreadwidth} - .5*\measure{paperwidth} + \measure{spinewidth}, + .375*\measure{paperheight} + ) + ; + + StopPage ; +\stopuseMPgraphic + +% \starttexdefinition luaextraangle +% % we can also just access the last page and so in mp directly +% \ctxlua { +% context(\lastpage == 0 and 0 or \realfolio*360/\lastpage) +% } +% \stoptexdefinition + +\startuseMPgraphic{luanumber} + % luaextraangle := \luaextraangle; + luaextraangle := if (LastPageNumber < 10) : 10 else : (RealPageNumber / LastPageNumber) * 360 fi; + luaorbitfactor := 0.25 ; + picture p ; p := lualogo ; + setbounds p to boundingbox fullcircle ; + draw p ysized 1cm ; +\stopuseMPgraphic + +\definelayer + [page] + [width=\paperwidth, + height=\paperheight] + +\setupbackgrounds + [leftpage] + [background=page] + +\setupbackgrounds + [rightpage] + [background=page] + +\definemeasure[banneroffset][\bottomspace-\footerheight-\footerdistance+2cm] + +\startsetups pagenumber:right + \setlayerframed + [page] + [preset=rightbottom,x=1.0cm,y=\measure{banneroffset}] + [frame=off,height=1cm,offset=overlay] + {\strut\useMPgraphic{luanumber}} + \setlayerframed + [page] + [preset=rightbottom,x=2.5cm,y=\measure{banneroffset}] + [frame=off,height=1cm,width=1cm,offset=overlay, + foregroundstyle=bold,foregroundcolor=maincolor] + {\strut\pagenumber} + \setlayerframed + [page] + [preset=rightbottom,x=3.5cm,y=\measure{banneroffset}] + [frame=off,height=1cm,offset=overlay, + foregroundstyle=bold,foregroundcolor=maincolor] + {\strut\getmarking[chapter]} +\stopsetups + +\startsetups pagenumber:left + \setlayerframed + [page] + [preset=leftbottom,x=3.5cm,y=\measure{banneroffset}] + [frame=off,height=1cm,offset=overlay, + foregroundstyle=bold,foregroundcolor=maincolor] + {\strut\getmarking[chapter]} + \setlayerframed + [page] + [preset=leftbottom,x=2.5cm,y=\measure{banneroffset}] + [frame=off,height=1cm,width=1cm,offset=overlay, + foregroundstyle=bold,foregroundcolor=maincolor] + {\strut\pagenumber} + \setlayerframed + [page] + [preset=leftbottom,x=1.0cm,y=\measure{banneroffset}] + [frame=off,height=1cm,offset=overlay] + {\strut\useMPgraphic{luanumber}} +\stopsetups + +\unexpanded\def\nonterminal#1>{\mathematics{\langle\hbox{\rm #1}\rangle}} + +% taco's brainwave -) .. todo: create a typing variant so that we can avoid the !crlf + +\newcatcodetable\syntaxcodetable + +\unexpanded\def\makesyntaxcodetable + {\begingroup + \catcode`\<=13 \catcode`\|=12 + \catcode`\!= 0 \catcode`\\=12 + \savecatcodetable\syntaxcodetable + \endgroup} + +\makesyntaxcodetable + +\unexpanded\def\startsyntax {\begingroup\catcodetable\syntaxcodetable \dostartsyntax} +\unexpanded\def\syntax {\begingroup\catcodetable\syntaxcodetable \dosyntax} + \let\stopsyntax \relax + +\unexpanded\def\syntaxenvbody#1% + {\par + \tt + \startnarrower + % \maincolor + #1 + \stopnarrower + \par} + +\unexpanded\def\syntaxbody#1% + {\begingroup + % \maincolor + \tt #1% + \endgroup} + +\bgroup \catcodetable\syntaxcodetable + +!gdef!dostartsyntax#1\stopsyntax{!let<!nonterminal!syntaxenvbody{#1}!endgroup} +!gdef!dosyntax #1{!let<!nonterminal!syntaxbody{#1}!endgroup} + +!egroup + +\definetyping + [texsyntax] +% [color=maincolor] + +% end of wave + +\setupinteraction + [state=start, + focus=standard, + style=, + color=, + contrastcolor=] + +\placebookmarks + [chapter,section,subsection] + +\setuplist + [chapter,section,subsection,subsubsection] + [interaction=all, + width=4em] + +\setuplist + [chapter] + [style=bold, + before={\testpage[4]\blank}, + color=keptcolor] + +\setuplist + [section] + [before={\testpage[3]}] + +\setuplist + [subsection,subsubsection] + [margin=4em, + width=5em] + +\definestartstop + [notabene] + [style=slanted] + +\definestartstop + [preamble] + [style=normal, + before=\blank, + after=\blank] + +% Hans doesn't like the bookmarks opening by default so we comment this: +% +% \setupinteractionscreen +% [option=bookmark] + +\startbuffer[stylecalculations] + + \normalexpanded{\definemeasure[spinewidth] [0pt]} + \normalexpanded{\definemeasure[paperwidth] [\the\paperwidth ]} + \normalexpanded{\definemeasure[paperheight][\the\paperheight]} + \normalexpanded{\definemeasure[spreadwidth][\measure{paperwidth}]} + +\stopbuffer + +\getbuffer[stylecalculations] + +\dontcomplain + +\environment luametatex-logos + +\defineregister[topicindex] +\defineregister[primitiveindex] +\defineregister[callbackindex] +\defineregister[nodeindex] +\defineregister[libraryindex] + +\unexpanded\def\lpr#1{\doifmode{*bodypart}{\primitiveindex[#1]{\bf\tex {#1}}}\tex {#1}} +\unexpanded\def\prm#1{\doifmode{*bodypart}{\primitiveindex[#1]{\tex {#1}}}\tex {#1}} +\unexpanded\def\orm#1{\doifmode{*bodypart}{\primitiveindex[#1]{\tex {#1}}}\tex {#1}} +\unexpanded\def\cbk#1{\doifmode{*bodypart}{\callbackindex [#1]{\type {#1}}}\type{#1}} +\unexpanded\def\nod#1{\doifmode{*bodypart}{\nodeindex [#1]{\bf\type{#1}}}\type{#1}} +\unexpanded\def\whs#1{\doifmode{*bodypart}{\nodeindex [#1]{\type {#1}}}\type{#1}} +\unexpanded\def\noa#1{\doifmode{*bodypart}{\nodeindex [#1]{\type {#1}}}\type{#1}} + +\hyphenation{sub-nodes} + +\def\currentlibraryindex{\namedstructureuservariable{section}{library}} + +\setupregister + [libraryindex] + [indicator=no,before=] + +\setupregister + [libraryindex] + [1] + [textstyle=\ttbf] + +\setupregister + [libraryindex] + [2] + [textstyle=\tttf] + +\unexpanded\def\lib #1{\doifmode{*bodypart}{\expanded{\libraryindex{\currentlibraryindex+#1}}\type{\currentlibraryindex.#1}}} +\unexpanded\def\libindex#1{\doifmode{*bodypart}{\expanded{\libraryindex{\currentlibraryindex+#1}}}} +\unexpanded\def\libidx#1#2{\doifmode{*bodypart}{\expanded{\libraryindex{#1+#2}}\type{#1.#2}}} +\unexpanded\def\lix #1#2{\doifmode{*bodypart}{\expanded{\libraryindex{#1+#2}}}} + +% \setstructurepageregister[][keys:1=,entries:1=] + +\stopenvironment diff --git a/doc/context/sources/general/manuals/luametatex/luametatex-titlepage.tex b/doc/context/sources/general/manuals/luametatex/luametatex-titlepage.tex new file mode 100644 index 000000000..6f7a6f9a5 --- /dev/null +++ b/doc/context/sources/general/manuals/luametatex/luametatex-titlepage.tex @@ -0,0 +1,53 @@ +\environment luametatex-style + +\startcomponent luametatex-titlepage + +\startstandardmakeup + + \switchtobodyfont + [mainfacemedium] + + \definedfont[Bold*default at \the\dimexpr.06\paperheight\relax] \setupinterlinespace + + \setlayer + [page] + {\useMPgraphic{luapage}} + + \setlayerframed + [page] + [preset=righttop, + location=middletop, + hoffset=.500\measured{paperwidth}, + voffset=.175\measured{paperheight}] + [align=middle, + foregroundcolor=white, + frame=off] + {\documentvariable{manual}\crlf Reference\crlf Manual} + + \definedfont[Bold*default at 14pt] \setupinterlinespace + + \setlayerframed + [page] + [preset=rightbottom, + offset=.025\measured{paperheight}] + [align=flushright, + foregroundcolor=white, + frame=off] + {\doifsomething{\documentvariable{status}}{\documentvariable{status}\par} + \currentdate[month,space,year]\par + Version \documentvariable{version}} + + \setlayerframed + [page] + [preset=middle, + hoffset=-.5\dimexpr\measured{paperwidth}-\measured{spinewidth}\relax] + [width=.7\measured{paperwidth}, + align=normal, + foregroundstyle=\bf, + foregroundcolor=white, + frame=off] + {\getbuffer[backpage]} + +\stopstandardmakeup + +\stopcomponent diff --git a/doc/context/sources/general/manuals/luametatex/luametatex.tex b/doc/context/sources/general/manuals/luametatex/luametatex.tex new file mode 100644 index 000000000..3021984f9 --- /dev/null +++ b/doc/context/sources/general/manuals/luametatex/luametatex.tex @@ -0,0 +1,51 @@ +% language=uk + +\environment luametatex-style +\environment luametatex-private + +\startdocument + [manual=LuaMeta\TeX, + status=experimental, + version=2.00] + +\component luametatex-titlepage +\component luametatex-firstpage + +\startfrontmatter + % \component luametatex-contents + \component luametatex-introduction +\stopfrontmatter + +\startbodymatter + + \startparagraph \em + This is a placholder for the \LUAMETATEX\ manual. On my system I already + have most of it wrapped up, but it will probably take till late 2019 or + sometime 2020 before I will decide to add the whole manual to the + \CONTEXT\ distribution. + \stopparagraph + + % \component luametatex-preamble + % \component luametatex-differences + % \component luametatex-modifications + % \component luametatex-lua + % \component luametatex-enhancements + % \component luametatex-fonts + % \component luametatex-math + % \component luametatex-nodes + % \component luametatex-callbacks + % \component luametatex-tex + % \component luametatex-metapost + % \component luametatex-pdf + % \component luametatex-libraries + % \component luametatex-additions + % \component luametatex-primitives + +\stopbodymatter + +\startbackmatter +% \component luametatex-registers +% \component luametatex-statistics +\stopbackmatter + +\stopdocument diff --git a/scripts/context/lua/mtxrun.lua b/scripts/context/lua/mtxrun.lua index 75e94efa0..b1b661066 100644 --- a/scripts/context/lua/mtxrun.lua +++ b/scripts/context/lua/mtxrun.lua @@ -13679,7 +13679,7 @@ do -- create closure to overcome 200 locals limit package.loaded["trac-inf"] = package.loaded["trac-inf"] or true --- original size: 9682, stripped down to: 6526 +-- original size: 9777, stripped down to: 6605 if not modules then modules={} end modules ['trac-inf']={ version=1.001, @@ -13824,7 +13824,8 @@ function statistics.show() end) if LUATEXENGINE=="luametatex" then register("used engine",function() - return format("%s version %s",LUATEXENGINE,LUATEXVERSION) + return format("%s version %s, functionality level %s, format id %s", + LUATEXENGINE,LUATEXVERSION,LUATEXFUNCTIONALITY,LUATEXFORMATID) end) else register("used engine",function() @@ -23900,7 +23901,7 @@ do -- create closure to overcome 200 locals limit package.loaded["data-use"] = package.loaded["data-use"] or true --- original size: 4434, stripped down to: 3180 +-- original size: 5203, stripped down to: 3765 if not modules then modules={} end modules ['data-use']={ version=1.001, @@ -23955,6 +23956,8 @@ function statistics.savefmtstatus(texname,formatbanner,sourcefile,kind,banner) sourcehash=md5.hex(io.loaddata(resolvers.findfile(sourcefile)) or "unknown"), sourcefile=sourcefile, luaversion=LUAVERSION, + formatid=LUATEXFORMATID, + functionality=LUATEXFUNCTIONALITY, } io.savedata(luvname,table.serialize(luvdata,true)) lua.registerfinalizer(function() @@ -23984,8 +23987,19 @@ function statistics.checkfmtstatus(texname) return format("source mismatch (luv: %s <> bin: %s)",luvhash,sourcehash) end local luvluaversion=luv.luaversion or 0 - if luvluaversion~=LUAVERSION then - return format("lua mismatch (luv: %s <> bin: %s)",luvluaversion,LUAVERSION) + local engluaversion=LUAVERSION or 0 + if luvluaversion~=engluaversion then + return format("lua mismatch (luv: %s <> bin: %s)",luvluaversion,engluaversion) + end + local luvfunctionality=luv.functionality or 0 + local engfunctionality=status.development_id or 0 + if luvfunctionality~=engfunctionality then + return format("functionality mismatch (luv: %s <> bin: %s)",luvfunctionality,engfunctionality) + end + local luvformatid=luv.formatid or 0 + local engformatid=status.format_id or 0 + if luvformatid~=engformatid then + return format("formatid mismatch (luv: %s <> bin: %s)",luvformatid,engformatid) end else return "invalid status file" @@ -25639,8 +25653,8 @@ end -- of closure -- used libraries : l-bit32.lua l-lua.lua l-macro.lua l-sandbox.lua l-package.lua l-lpeg.lua l-function.lua l-string.lua l-table.lua l-io.lua l-number.lua l-set.lua l-os.lua l-file.lua l-gzip.lua l-md5.lua l-sha.lua l-url.lua l-dir.lua l-boolean.lua l-unicode.lua l-math.lua util-str.lua util-tab.lua util-fil.lua util-sac.lua util-sto.lua util-prs.lua util-fmt.lua util-soc-imp-reset.lua util-soc-imp-socket.lua util-soc-imp-copas.lua util-soc-imp-ltn12.lua util-soc-imp-mime.lua util-soc-imp-url.lua util-soc-imp-headers.lua util-soc-imp-tp.lua util-soc-imp-http.lua util-soc-imp-ftp.lua util-soc-imp-smtp.lua trac-set.lua trac-log.lua trac-inf.lua trac-pro.lua util-lua.lua util-deb.lua util-tpl.lua util-sbx.lua util-mrg.lua util-env.lua luat-env.lua util-zip.lua lxml-tab.lua lxml-lpt.lua lxml-mis.lua lxml-aux.lua lxml-xml.lua trac-xml.lua data-ini.lua data-exp.lua data-env.lua data-tmp.lua data-met.lua data-res.lua data-pre.lua data-inp.lua data-out.lua data-fil.lua data-con.lua data-use.lua data-zip.lua data-tre.lua data-sch.lua data-lua.lua data-aux.lua data-tmf.lua data-lst.lua util-lib.lua luat-sta.lua luat-fmt.lua -- skipped libraries : - --- original bytes : 1022171 --- stripped bytes : 404918 +-- original bytes : 1023035 +-- stripped bytes : 405118 -- end library merge diff --git a/scripts/context/stubs/mswin/mtxrun.lua b/scripts/context/stubs/mswin/mtxrun.lua index 75e94efa0..b1b661066 100644 --- a/scripts/context/stubs/mswin/mtxrun.lua +++ b/scripts/context/stubs/mswin/mtxrun.lua @@ -13679,7 +13679,7 @@ do -- create closure to overcome 200 locals limit package.loaded["trac-inf"] = package.loaded["trac-inf"] or true --- original size: 9682, stripped down to: 6526 +-- original size: 9777, stripped down to: 6605 if not modules then modules={} end modules ['trac-inf']={ version=1.001, @@ -13824,7 +13824,8 @@ function statistics.show() end) if LUATEXENGINE=="luametatex" then register("used engine",function() - return format("%s version %s",LUATEXENGINE,LUATEXVERSION) + return format("%s version %s, functionality level %s, format id %s", + LUATEXENGINE,LUATEXVERSION,LUATEXFUNCTIONALITY,LUATEXFORMATID) end) else register("used engine",function() @@ -23900,7 +23901,7 @@ do -- create closure to overcome 200 locals limit package.loaded["data-use"] = package.loaded["data-use"] or true --- original size: 4434, stripped down to: 3180 +-- original size: 5203, stripped down to: 3765 if not modules then modules={} end modules ['data-use']={ version=1.001, @@ -23955,6 +23956,8 @@ function statistics.savefmtstatus(texname,formatbanner,sourcefile,kind,banner) sourcehash=md5.hex(io.loaddata(resolvers.findfile(sourcefile)) or "unknown"), sourcefile=sourcefile, luaversion=LUAVERSION, + formatid=LUATEXFORMATID, + functionality=LUATEXFUNCTIONALITY, } io.savedata(luvname,table.serialize(luvdata,true)) lua.registerfinalizer(function() @@ -23984,8 +23987,19 @@ function statistics.checkfmtstatus(texname) return format("source mismatch (luv: %s <> bin: %s)",luvhash,sourcehash) end local luvluaversion=luv.luaversion or 0 - if luvluaversion~=LUAVERSION then - return format("lua mismatch (luv: %s <> bin: %s)",luvluaversion,LUAVERSION) + local engluaversion=LUAVERSION or 0 + if luvluaversion~=engluaversion then + return format("lua mismatch (luv: %s <> bin: %s)",luvluaversion,engluaversion) + end + local luvfunctionality=luv.functionality or 0 + local engfunctionality=status.development_id or 0 + if luvfunctionality~=engfunctionality then + return format("functionality mismatch (luv: %s <> bin: %s)",luvfunctionality,engfunctionality) + end + local luvformatid=luv.formatid or 0 + local engformatid=status.format_id or 0 + if luvformatid~=engformatid then + return format("formatid mismatch (luv: %s <> bin: %s)",luvformatid,engformatid) end else return "invalid status file" @@ -25639,8 +25653,8 @@ end -- of closure -- used libraries : l-bit32.lua l-lua.lua l-macro.lua l-sandbox.lua l-package.lua l-lpeg.lua l-function.lua l-string.lua l-table.lua l-io.lua l-number.lua l-set.lua l-os.lua l-file.lua l-gzip.lua l-md5.lua l-sha.lua l-url.lua l-dir.lua l-boolean.lua l-unicode.lua l-math.lua util-str.lua util-tab.lua util-fil.lua util-sac.lua util-sto.lua util-prs.lua util-fmt.lua util-soc-imp-reset.lua util-soc-imp-socket.lua util-soc-imp-copas.lua util-soc-imp-ltn12.lua util-soc-imp-mime.lua util-soc-imp-url.lua util-soc-imp-headers.lua util-soc-imp-tp.lua util-soc-imp-http.lua util-soc-imp-ftp.lua util-soc-imp-smtp.lua trac-set.lua trac-log.lua trac-inf.lua trac-pro.lua util-lua.lua util-deb.lua util-tpl.lua util-sbx.lua util-mrg.lua util-env.lua luat-env.lua util-zip.lua lxml-tab.lua lxml-lpt.lua lxml-mis.lua lxml-aux.lua lxml-xml.lua trac-xml.lua data-ini.lua data-exp.lua data-env.lua data-tmp.lua data-met.lua data-res.lua data-pre.lua data-inp.lua data-out.lua data-fil.lua data-con.lua data-use.lua data-zip.lua data-tre.lua data-sch.lua data-lua.lua data-aux.lua data-tmf.lua data-lst.lua util-lib.lua luat-sta.lua luat-fmt.lua -- skipped libraries : - --- original bytes : 1022171 --- stripped bytes : 404918 +-- original bytes : 1023035 +-- stripped bytes : 405118 -- end library merge diff --git a/scripts/context/stubs/unix/mtxrun b/scripts/context/stubs/unix/mtxrun index 75e94efa0..b1b661066 100644 --- a/scripts/context/stubs/unix/mtxrun +++ b/scripts/context/stubs/unix/mtxrun @@ -13679,7 +13679,7 @@ do -- create closure to overcome 200 locals limit package.loaded["trac-inf"] = package.loaded["trac-inf"] or true --- original size: 9682, stripped down to: 6526 +-- original size: 9777, stripped down to: 6605 if not modules then modules={} end modules ['trac-inf']={ version=1.001, @@ -13824,7 +13824,8 @@ function statistics.show() end) if LUATEXENGINE=="luametatex" then register("used engine",function() - return format("%s version %s",LUATEXENGINE,LUATEXVERSION) + return format("%s version %s, functionality level %s, format id %s", + LUATEXENGINE,LUATEXVERSION,LUATEXFUNCTIONALITY,LUATEXFORMATID) end) else register("used engine",function() @@ -23900,7 +23901,7 @@ do -- create closure to overcome 200 locals limit package.loaded["data-use"] = package.loaded["data-use"] or true --- original size: 4434, stripped down to: 3180 +-- original size: 5203, stripped down to: 3765 if not modules then modules={} end modules ['data-use']={ version=1.001, @@ -23955,6 +23956,8 @@ function statistics.savefmtstatus(texname,formatbanner,sourcefile,kind,banner) sourcehash=md5.hex(io.loaddata(resolvers.findfile(sourcefile)) or "unknown"), sourcefile=sourcefile, luaversion=LUAVERSION, + formatid=LUATEXFORMATID, + functionality=LUATEXFUNCTIONALITY, } io.savedata(luvname,table.serialize(luvdata,true)) lua.registerfinalizer(function() @@ -23984,8 +23987,19 @@ function statistics.checkfmtstatus(texname) return format("source mismatch (luv: %s <> bin: %s)",luvhash,sourcehash) end local luvluaversion=luv.luaversion or 0 - if luvluaversion~=LUAVERSION then - return format("lua mismatch (luv: %s <> bin: %s)",luvluaversion,LUAVERSION) + local engluaversion=LUAVERSION or 0 + if luvluaversion~=engluaversion then + return format("lua mismatch (luv: %s <> bin: %s)",luvluaversion,engluaversion) + end + local luvfunctionality=luv.functionality or 0 + local engfunctionality=status.development_id or 0 + if luvfunctionality~=engfunctionality then + return format("functionality mismatch (luv: %s <> bin: %s)",luvfunctionality,engfunctionality) + end + local luvformatid=luv.formatid or 0 + local engformatid=status.format_id or 0 + if luvformatid~=engformatid then + return format("formatid mismatch (luv: %s <> bin: %s)",luvformatid,engformatid) end else return "invalid status file" @@ -25639,8 +25653,8 @@ end -- of closure -- used libraries : l-bit32.lua l-lua.lua l-macro.lua l-sandbox.lua l-package.lua l-lpeg.lua l-function.lua l-string.lua l-table.lua l-io.lua l-number.lua l-set.lua l-os.lua l-file.lua l-gzip.lua l-md5.lua l-sha.lua l-url.lua l-dir.lua l-boolean.lua l-unicode.lua l-math.lua util-str.lua util-tab.lua util-fil.lua util-sac.lua util-sto.lua util-prs.lua util-fmt.lua util-soc-imp-reset.lua util-soc-imp-socket.lua util-soc-imp-copas.lua util-soc-imp-ltn12.lua util-soc-imp-mime.lua util-soc-imp-url.lua util-soc-imp-headers.lua util-soc-imp-tp.lua util-soc-imp-http.lua util-soc-imp-ftp.lua util-soc-imp-smtp.lua trac-set.lua trac-log.lua trac-inf.lua trac-pro.lua util-lua.lua util-deb.lua util-tpl.lua util-sbx.lua util-mrg.lua util-env.lua luat-env.lua util-zip.lua lxml-tab.lua lxml-lpt.lua lxml-mis.lua lxml-aux.lua lxml-xml.lua trac-xml.lua data-ini.lua data-exp.lua data-env.lua data-tmp.lua data-met.lua data-res.lua data-pre.lua data-inp.lua data-out.lua data-fil.lua data-con.lua data-use.lua data-zip.lua data-tre.lua data-sch.lua data-lua.lua data-aux.lua data-tmf.lua data-lst.lua util-lib.lua luat-sta.lua luat-fmt.lua -- skipped libraries : - --- original bytes : 1022171 --- stripped bytes : 404918 +-- original bytes : 1023035 +-- stripped bytes : 405118 -- end library merge diff --git a/scripts/context/stubs/win64/mtxrun.lua b/scripts/context/stubs/win64/mtxrun.lua index 75e94efa0..b1b661066 100644 --- a/scripts/context/stubs/win64/mtxrun.lua +++ b/scripts/context/stubs/win64/mtxrun.lua @@ -13679,7 +13679,7 @@ do -- create closure to overcome 200 locals limit package.loaded["trac-inf"] = package.loaded["trac-inf"] or true --- original size: 9682, stripped down to: 6526 +-- original size: 9777, stripped down to: 6605 if not modules then modules={} end modules ['trac-inf']={ version=1.001, @@ -13824,7 +13824,8 @@ function statistics.show() end) if LUATEXENGINE=="luametatex" then register("used engine",function() - return format("%s version %s",LUATEXENGINE,LUATEXVERSION) + return format("%s version %s, functionality level %s, format id %s", + LUATEXENGINE,LUATEXVERSION,LUATEXFUNCTIONALITY,LUATEXFORMATID) end) else register("used engine",function() @@ -23900,7 +23901,7 @@ do -- create closure to overcome 200 locals limit package.loaded["data-use"] = package.loaded["data-use"] or true --- original size: 4434, stripped down to: 3180 +-- original size: 5203, stripped down to: 3765 if not modules then modules={} end modules ['data-use']={ version=1.001, @@ -23955,6 +23956,8 @@ function statistics.savefmtstatus(texname,formatbanner,sourcefile,kind,banner) sourcehash=md5.hex(io.loaddata(resolvers.findfile(sourcefile)) or "unknown"), sourcefile=sourcefile, luaversion=LUAVERSION, + formatid=LUATEXFORMATID, + functionality=LUATEXFUNCTIONALITY, } io.savedata(luvname,table.serialize(luvdata,true)) lua.registerfinalizer(function() @@ -23984,8 +23987,19 @@ function statistics.checkfmtstatus(texname) return format("source mismatch (luv: %s <> bin: %s)",luvhash,sourcehash) end local luvluaversion=luv.luaversion or 0 - if luvluaversion~=LUAVERSION then - return format("lua mismatch (luv: %s <> bin: %s)",luvluaversion,LUAVERSION) + local engluaversion=LUAVERSION or 0 + if luvluaversion~=engluaversion then + return format("lua mismatch (luv: %s <> bin: %s)",luvluaversion,engluaversion) + end + local luvfunctionality=luv.functionality or 0 + local engfunctionality=status.development_id or 0 + if luvfunctionality~=engfunctionality then + return format("functionality mismatch (luv: %s <> bin: %s)",luvfunctionality,engfunctionality) + end + local luvformatid=luv.formatid or 0 + local engformatid=status.format_id or 0 + if luvformatid~=engformatid then + return format("formatid mismatch (luv: %s <> bin: %s)",luvformatid,engformatid) end else return "invalid status file" @@ -25639,8 +25653,8 @@ end -- of closure -- used libraries : l-bit32.lua l-lua.lua l-macro.lua l-sandbox.lua l-package.lua l-lpeg.lua l-function.lua l-string.lua l-table.lua l-io.lua l-number.lua l-set.lua l-os.lua l-file.lua l-gzip.lua l-md5.lua l-sha.lua l-url.lua l-dir.lua l-boolean.lua l-unicode.lua l-math.lua util-str.lua util-tab.lua util-fil.lua util-sac.lua util-sto.lua util-prs.lua util-fmt.lua util-soc-imp-reset.lua util-soc-imp-socket.lua util-soc-imp-copas.lua util-soc-imp-ltn12.lua util-soc-imp-mime.lua util-soc-imp-url.lua util-soc-imp-headers.lua util-soc-imp-tp.lua util-soc-imp-http.lua util-soc-imp-ftp.lua util-soc-imp-smtp.lua trac-set.lua trac-log.lua trac-inf.lua trac-pro.lua util-lua.lua util-deb.lua util-tpl.lua util-sbx.lua util-mrg.lua util-env.lua luat-env.lua util-zip.lua lxml-tab.lua lxml-lpt.lua lxml-mis.lua lxml-aux.lua lxml-xml.lua trac-xml.lua data-ini.lua data-exp.lua data-env.lua data-tmp.lua data-met.lua data-res.lua data-pre.lua data-inp.lua data-out.lua data-fil.lua data-con.lua data-use.lua data-zip.lua data-tre.lua data-sch.lua data-lua.lua data-aux.lua data-tmf.lua data-lst.lua util-lib.lua luat-sta.lua luat-fmt.lua -- skipped libraries : - --- original bytes : 1022171 --- stripped bytes : 404918 +-- original bytes : 1023035 +-- stripped bytes : 405118 -- end library merge diff --git a/tex/context/base/mkii/cont-new.mkii b/tex/context/base/mkii/cont-new.mkii index 02e45fa51..9a66b4b07 100644 --- a/tex/context/base/mkii/cont-new.mkii +++ b/tex/context/base/mkii/cont-new.mkii @@ -11,7 +11,7 @@ %C therefore copyrighted by \PRAGMA. See mreadme.pdf for %C details. -\newcontextversion{2019.05.12 19:05} +\newcontextversion{2019.05.18 10:42} %D This file is loaded at runtime, thereby providing an %D excellent place for hacks, patches, extensions and new diff --git a/tex/context/base/mkii/context.mkii b/tex/context/base/mkii/context.mkii index 3c43d0529..e54769554 100644 --- a/tex/context/base/mkii/context.mkii +++ b/tex/context/base/mkii/context.mkii @@ -20,7 +20,7 @@ %D your styles an modules. \edef\contextformat {\jobname} -\edef\contextversion{2019.05.12 19:05} +\edef\contextversion{2019.05.18 10:42} %D For those who want to use this: diff --git a/tex/context/base/mkiv/buff-ini.mkiv b/tex/context/base/mkiv/buff-ini.mkiv index 4e12271dd..8e71c9865 100644 --- a/tex/context/base/mkiv/buff-ini.mkiv +++ b/tex/context/base/mkiv/buff-ini.mkiv @@ -185,6 +185,15 @@ {\processcommalist[#1]\buff_get_stored_indeed}% \namedbufferparameter\empty\c!after\relax} +% \installcommalistprocessorcommand \buff_get_stored_list \empty \buff_get_stored_indeed +% +% \unexpanded\def\buff_get[#1]% [name] +% {\namedbufferparameter\empty\c!before\relax +% \doifelsenothing{#1} +% {\buff_get_stored_indeed\empty} +% {\buff_get_stored_list[#1]}% +% \namedbufferparameter\empty\c!after\relax} + \unexpanded\def\buff_get_stored#1#2% {\namedbufferparameter{#1}\c!before\relax \buff_get_stored_indeed{#2}% diff --git a/tex/context/base/mkiv/catc-sym.mkiv b/tex/context/base/mkiv/catc-sym.mkiv index 64604ba35..5cda010fe 100644 --- a/tex/context/base/mkiv/catc-sym.mkiv +++ b/tex/context/base/mkiv/catc-sym.mkiv @@ -60,10 +60,10 @@ \catcode`_=\lettercatcode %xdef\_n_u_l_{\expandafter\string\Uchar1} % nul(l) -%xdef\_s_o_h_{\expandafter\string\Uchar1} % start of header -\xdef\_s_t_x_{\expandafter\string\Uchar2} % start of text -\xdef\_e_t_x_{\expandafter\string\Uchar3} % end of text -\xdef\_e_o_t_{\expandafter\string\Uchar4} % end of transmission +%xdef\_s_o_h_{\expandafter\string\Uchar1} % start of header ^^^^0001 +\xdef\_s_t_x_{\expandafter\string\Uchar2} % start of text ^^^^0002 +\xdef\_e_t_x_{\expandafter\string\Uchar3} % end of text ^^^^0003 +\xdef\_e_o_t_{\expandafter\string\Uchar4} % end of transmission ^^^^0004 %xdef\_e_n_q_{\expandafter\string\Uchar5} % enquiry %xdef\_a_c_k_{\expandafter\string\Uchar6} % aknowledgement diff --git a/tex/context/base/mkiv/cont-new.mkiv b/tex/context/base/mkiv/cont-new.mkiv index 91e76c307..fa1a405b7 100644 --- a/tex/context/base/mkiv/cont-new.mkiv +++ b/tex/context/base/mkiv/cont-new.mkiv @@ -11,7 +11,7 @@ %C therefore copyrighted by \PRAGMA. See mreadme.pdf for %C details. -\newcontextversion{2019.05.12 19:05} +\newcontextversion{2019.05.18 10:42} %D This file is loaded at runtime, thereby providing an excellent place for %D hacks, patches, extensions and new features. diff --git a/tex/context/base/mkiv/context.mkiv b/tex/context/base/mkiv/context.mkiv index 42af8904e..f05092fe9 100644 --- a/tex/context/base/mkiv/context.mkiv +++ b/tex/context/base/mkiv/context.mkiv @@ -42,7 +42,7 @@ %D has to match \type {YYYY.MM.DD HH:MM} format. \edef\contextformat {\jobname} -\edef\contextversion{2019.05.12 19:05} +\edef\contextversion{2019.05.18 10:42} \edef\contextkind {beta} %D Kind of special: diff --git a/tex/context/base/mkiv/data-use.lua b/tex/context/base/mkiv/data-use.lua index 5985a2eac..ccd44007c 100644 --- a/tex/context/base/mkiv/data-use.lua +++ b/tex/context/base/mkiv/data-use.lua @@ -61,11 +61,13 @@ function statistics.savefmtstatus(texname,formatbanner,sourcefile,kind,banner) - if formatbanner and enginebanner and sourcefile then local luvname = file.replacesuffix(texname,"luv") -- utilities.lua.suffixes.luv local luvdata = { - enginebanner = enginebanner, - formatbanner = formatbanner, - sourcehash = md5.hex(io.loaddata(resolvers.findfile(sourcefile)) or "unknown"), - sourcefile = sourcefile, - luaversion = LUAVERSION, + enginebanner = enginebanner, + formatbanner = formatbanner, + sourcehash = md5.hex(io.loaddata(resolvers.findfile(sourcefile)) or "unknown"), + sourcefile = sourcefile, + luaversion = LUAVERSION, + formatid = LUATEXFORMATID, + functionality = LUATEXFUNCTIONALITY, } io.savedata(luvname,table.serialize(luvdata,true)) lua.registerfinalizer(function() @@ -100,8 +102,19 @@ function statistics.checkfmtstatus(texname) return format("source mismatch (luv: %s <> bin: %s)",luvhash,sourcehash) end local luvluaversion = luv.luaversion or 0 - if luvluaversion ~= LUAVERSION then - return format("lua mismatch (luv: %s <> bin: %s)",luvluaversion,LUAVERSION) + local engluaversion = LUAVERSION or 0 + if luvluaversion ~= engluaversion then + return format("lua mismatch (luv: %s <> bin: %s)",luvluaversion,engluaversion) + end + local luvfunctionality = luv.functionality or 0 + local engfunctionality = status.development_id or 0 + if luvfunctionality ~= engfunctionality then + return format("functionality mismatch (luv: %s <> bin: %s)",luvfunctionality,engfunctionality) + end + local luvformatid = luv.formatid or 0 + local engformatid = status.format_id or 0 + if luvformatid ~= engformatid then + return format("formatid mismatch (luv: %s <> bin: %s)",luvformatid,engformatid) end else return "invalid status file" diff --git a/tex/context/base/mkiv/font-cff.lua b/tex/context/base/mkiv/font-cff.lua index 46deedb5f..86ae448cc 100644 --- a/tex/context/base/mkiv/font-cff.lua +++ b/tex/context/base/mkiv/font-cff.lua @@ -2428,8 +2428,8 @@ function readers.cff(f,fontdata,specification) if private then local data = private.data if type(data) == "table" then - cffinfo.defaultwidth = data.defaultwidth or cffinfo.defaultwidth - cffinfo.nominalwidth = data.nominalwidth or cffinfo.nominalwidth + cffinfo.defaultwidth = data.defaultwidthx or cffinfo.defaultwidth + cffinfo.nominalwidth = data.nominalwidthx or cffinfo.nominalwidth cffinfo.bluevalues = data.bluevalues cffinfo.otherblues = data.otherblues cffinfo.familyblues = data.familyblues diff --git a/tex/context/base/mkiv/font-dsp.lua b/tex/context/base/mkiv/font-dsp.lua index e6679fda2..79749741c 100644 --- a/tex/context/base/mkiv/font-dsp.lua +++ b/tex/context/base/mkiv/font-dsp.lua @@ -1478,6 +1478,118 @@ end -- [false] = { [true] = { false, true }, [false] = { false } }, -- } +-- function gposhandlers.pair(f,fontdata,lookupid,lookupoffset,offset,glyphs,nofglyphs) +-- local tableoffset = lookupoffset + offset +-- setposition(f,tableoffset) +-- local subtype = readushort(f) +-- local getdelta = fontdata.temporary.getdelta +-- if subtype == 1 then +-- local coverage = readushort(f) +-- local format1 = readushort(f) +-- local format2 = readushort(f) +-- local sets = readarray(f) +-- sets = readpairsets(f,tableoffset,sets,format1,format2,mainoffset,getdelta) +-- coverage = readcoverage(f,tableoffset + coverage) +-- local shared = { } -- partial sparse, when set also needs to be handled in the packer +-- for index, newindex in next, coverage do +-- local set = sets[newindex+1] +-- local hash = { } +-- for i=1,#set do +-- local value = set[i] +-- if value then +-- local other = value[1] +-- if shared then +-- local s = shared[value] +-- if s == nil then +-- local first = value[2] +-- local second = value[3] +-- if first or second then +-- s = { first, second or nil } -- needs checking +-- else +-- s = false +-- end +-- shared[value] = s +-- end +-- hash[other] = s or nil +-- else +-- local first = value[2] +-- local second = value[3] +-- if first or second then +-- hash[other] = { first, second or nil } -- needs checking +-- else +-- hash[other] = nil -- what if set, maybe warning +-- end +-- end +-- end +-- end +-- coverage[index] = hash +-- end +-- return { +-- shared = shared and true or nil, +-- format = "pair", +-- coverage = coverage, +-- } +-- elseif subtype == 2 then +-- local coverage = readushort(f) +-- local format1 = readushort(f) +-- local format2 = readushort(f) +-- local classdef1 = readushort(f) +-- local classdef2 = readushort(f) +-- local nofclasses1 = readushort(f) -- incl class 0 +-- local nofclasses2 = readushort(f) -- incl class 0 +-- local classlist = readpairclasssets(f,nofclasses1,nofclasses2,format1,format2,tableoffset,getdelta) +-- coverage = readcoverage(f,tableoffset+coverage) +-- classdef1 = readclassdef(f,tableoffset+classdef1,coverage) +-- classdef2 = readclassdef(f,tableoffset+classdef2,nofglyphs) +-- local usedcoverage = { } +-- local shared = { } -- partial sparse, when set also needs to be handled in the packer +-- for g1, c1 in next, classdef1 do +-- if coverage[g1] then +-- local l1 = classlist[c1] +-- if l1 then +-- local hash = { } +-- for paired, class in next, classdef2 do +-- local offsets = l1[class] +-- if offsets then +-- local first = offsets[1] +-- local second = offsets[2] +-- if first or second then +-- if shared then +-- local s1 = shared[first] +-- if s1 == nil then +-- s1 = { } +-- shared[first] = s1 +-- end +-- local s2 = s1[second] +-- if s2 == nil then +-- s2 = { first, second or nil } +-- s1[second] = s2 +-- end +-- hash[paired] = s2 +-- else +-- hash[paired] = { first, second or nil } +-- end +-- else +-- -- upto the next lookup for this combination +-- end +-- end +-- end +-- usedcoverage[g1] = hash +-- end +-- end +-- end +-- return { +-- shared = shared and true or nil, +-- format = "pair", +-- coverage = usedcoverage, +-- } +-- elseif subtype == 3 then +-- report("yet unsupported subtype %a in %a positioning",subtype,"pair") +-- else +-- report("unsupported subtype %a in %a positioning",subtype,"pair") +-- end +-- end + function gposhandlers.pair(f,fontdata,lookupid,lookupoffset,offset,glyphs,nofglyphs) local tableoffset = lookupoffset + offset setposition(f,tableoffset) @@ -1490,25 +1602,32 @@ function gposhandlers.pair(f,fontdata,lookupid,lookupoffset,offset,glyphs,nofgly local sets = readarray(f) sets = readpairsets(f,tableoffset,sets,format1,format2,mainoffset,getdelta) coverage = readcoverage(f,tableoffset + coverage) + local shared = { } -- partial sparse, when set also needs to be handled in the packer for index, newindex in next, coverage do local set = sets[newindex+1] local hash = { } for i=1,#set do local value = set[i] if value then - local other = value[1] - local first = value[2] - local second = value[3] - if first or second then - hash[other] = { first, second or nil } -- needs checking - else - hash[other] = nil -- what if set, maybe warning + local other = value[1] + local share = shared[value] + if share == nil then + local first = value[2] + local second = value[3] + if first or second then + share = { first, second or nil } -- needs checking + else + share = false + end + shared[value] = share end + hash[other] = share or nil -- really overload ? end end coverage[index] = hash end return { + shared = shared and true or nil, format = "pair", coverage = coverage, } @@ -1537,23 +1656,17 @@ function gposhandlers.pair(f,fontdata,lookupid,lookupoffset,offset,glyphs,nofgly local first = offsets[1] local second = offsets[2] if first or second then - if shared then - local s1 = shared[first] - if s1 == nil then - s1 = { } - shared[first] = s1 - end - local s2 = s1[second] - if s2 == nil then - s2 = { first, second or nil } - s1[second] = s2 - end - hash[paired] = s2 - else - hash[paired] = { first, second or nil } + local s1 = shared[first] + if s1 == nil then + s1 = { } + shared[first] = s1 end - else - -- upto the next lookup for this combination + local s2 = s1[second] + if s2 == nil then + s2 = { first, second or nil } + s1[second] = s2 + end + hash[paired] = s2 end end end diff --git a/tex/context/base/mkiv/font-shp.lua b/tex/context/base/mkiv/font-shp.lua index e14146c36..a6788bc62 100644 --- a/tex/context/base/mkiv/font-shp.lua +++ b/tex/context/base/mkiv/font-shp.lua @@ -17,7 +17,7 @@ local pfb = fonts.handlers.pfb local hashes = fonts.hashes local identifiers = hashes.identifiers -local version = 0.007 +local version = 0.008 local shapescache = containers.define("fonts", "shapes", version, true) local streamscache = containers.define("fonts", "streams", version, true) diff --git a/tex/context/base/mkiv/luat-cod.lua b/tex/context/base/mkiv/luat-cod.lua index b863bf9a4..6f79a54e1 100644 --- a/tex/context/base/mkiv/luat-cod.lua +++ b/tex/context/base/mkiv/luat-cod.lua @@ -152,6 +152,10 @@ if LUATEXFUNCTIONALITY == nil then LUATEXFUNCTIONALITY = status.development_id or 6346 end +if LUATEXFORMATID == nil then + LUATEXFORMATID = status.format_id or 0 +end + if JITSUPPORTED == nil then JITSUPPORTED = LUATEXENGINE == "luajittex" or jit end diff --git a/tex/context/base/mkiv/luat-ini.lua b/tex/context/base/mkiv/luat-ini.lua index 3d6df530e..332980013 100644 --- a/tex/context/base/mkiv/luat-ini.lua +++ b/tex/context/base/mkiv/luat-ini.lua @@ -33,6 +33,8 @@ LUATEXENGINE = status.luatex_engine and string.lower(status.luatex_engine LUATEXFUNCTIONALITY = status.development_id or 6346 +LUATEXFORMATID = status.format_id or 0 + JITSUPPORTED = LUATEXENGINE == "luajittex" or jit INITEXMODE = status.ini_version diff --git a/tex/context/base/mkiv/math-ali.mkiv b/tex/context/base/mkiv/math-ali.mkiv index 4ca713bbc..123fcda90 100644 --- a/tex/context/base/mkiv/math-ali.mkiv +++ b/tex/context/base/mkiv/math-ali.mkiv @@ -713,6 +713,8 @@ \let\math_cases_NR\math_align_NR_generic +\installmacrostack\math_cases_NC + \unexpanded\def\math_cases_start_indeed[#1]% {\iffirstargument \setupcurrentmathcases[#1]% @@ -725,7 +727,7 @@ \fi \mathcasesparameter\c!left \vcenter\bgroup - \pushmacro\math_cases_NC + \push_macro_math_cases_NC \let\endmath\relax \let\NC\math_cases_NC_zero \let\MC\math_cases_MC_zero @@ -744,7 +746,7 @@ \hfil \aligntab \hskip\mathcasesparameter\c!distance\relax - \popmacro\math_cases_NC + \pop_macro_math_cases_NC \math_cases_strut % looks better \alignmark\alignmark \hfil @@ -972,9 +974,11 @@ \newcount\c_math_eqalign_column_saved \newcount\c_math_eqalign_first_saved +% \installglobalmacrostack\c_math_matrix_first + \unexpanded\def\math_matrix_start#1% {\begingroup - \globalpushmacro\c_math_matrix_first + \globalpushmacro\c_math_matrix_first % hm, does that work? \c_math_eqalign_column_saved\c_math_eqalign_column \c_math_eqalign_first_saved \c_math_eqalign_first \edef\currentmathmatrix{#1}% diff --git a/tex/context/base/mkiv/mult-aux.mkiv b/tex/context/base/mkiv/mult-aux.mkiv index a0839d9f1..6a2fd9fef 100644 --- a/tex/context/base/mkiv/mult-aux.mkiv +++ b/tex/context/base/mkiv/mult-aux.mkiv @@ -101,7 +101,7 @@ \fi#2} \def\mult_interfaces_get_parameters_indeed#1]% namespace already set - {\mult_interfaces_get_parameters_item#1,],\_e_o_t_} + {\mult_interfaces_get_parameters_item#1,],^^^^0004} \def\mult_interfaces_get_parameters_item#1,#2% #2 takes space before , {\if,#1,% dirty trick for testing #1=empty @@ -109,7 +109,7 @@ \else\if]#1% \doubleexpandafter\gobbleoneargument \else - \mult_interfaces_get_parameters_assign#1==\empty\_e_o_t_ + \mult_interfaces_get_parameters_assign#1==\empty^^^^0004% % \doubleexpandafter\mult_interfaces_get_parameters_item % saves skipping when at end \fi\fi#2} @@ -120,7 +120,7 @@ \def\mult_interfaces_get_parameters_error_indeed#1#2% {\showassignerror{#2}{\the\inputlineno\space(#1)}} -\def\mult_interfaces_get_parameters_assign#1=#2=#3#4\_e_o_t_ +\def\mult_interfaces_get_parameters_assign#1=#2=#3#4^^^^0004% {\ifx\empty#1\empty \expandafter\mult_interfaces_get_parameters_error \else\ifx#3\empty @@ -143,7 +143,7 @@ \def\mult_interfaces_get_parameters_error_two#1\csname#2#3\endcsname#4% {\mult_interfaces_get_parameters_error_indeed{#2}{#3}} - \def\mult_interfaces_get_parameters_assign#1=#2=#3#4\_e_o_t_ + \def\mult_interfaces_get_parameters_assign#1=#2=#3#4^^^^0004% {\ifx\empty#1\empty \mult_interfaces_get_parameters_error_one \else\ifx#3\empty @@ -161,7 +161,7 @@ % \def\mult_interfaces_get_parameters_error_two#1\m_mult_interfaces_namespace#2\fi\fi% % {\mult_interfaces_get_parameters_error_indeed\m_mult_interfaces_namespace{#2}\m_mult_interfaces_namespace\s!dummy\fi\fi} % - % \def\mult_interfaces_get_parameters_assign#1=#2=#3#4\_e_o_t_ + % \def\mult_interfaces_get_parameters_assign#1=#2=#3#4^^^^0004% % {\expandafter\def\csname % \ifx\empty#1\empty % \mult_interfaces_get_parameters_error_one @@ -177,14 +177,14 @@ \newif\ifassignment -\def\mult_check_for_assignment_indeed#1=#2#3\_e_o_t_ - {\if#2\_e_t_x_\assignmentfalse\else\assignmenttrue\fi} +\def\mult_check_for_assignment_indeed#1=#2#3^^^^0004% + {\if#2^^^^0003\assignmentfalse\else\assignmenttrue\fi} -\def\mult_check_for_assignment_indeed_begin_#1=#2#3\_e_o_t_ - {\if#2\_e_t_x_} +\def\mult_check_for_assignment_indeed_begin_#1=#2#3^^^^0004% + {\if#2^^^^0003} \def\mult_check_for_assignment#1% - {\expandafter\mult_check_for_assignment_indeed\detokenize{#1}=\_e_t_x_\_e_t_x_\_e_o_t_} + {\expandafter\mult_check_for_assignment_indeed\detokenize{#1}=^^^^0003^^^^0003^^^^0004} % End of experimental code. @@ -373,7 +373,7 @@ % \mult_interfaces_get_parameters{#1#4:}[##3]% % \else\ifsecondargument % \the#6% predefine -% \expandafter\mult_check_for_assignment_indeed\detokenize{##2}=\_e_t_x_\_e_t_x_\_e_o_t_ +% \expandafter\mult_check_for_assignment_indeed\detokenize{##2}=^^^^0003^^^^0003^^^^0004% % \ifassignment % \let#8\empty % \expandafter\edef\csname#1#4:\s!chain\endcsname{##1}% @@ -411,7 +411,7 @@ \mult_interfaces_get_parameters{#1#4:}[##3]% \else\ifsecondargument \the#6% predefine - \ifcondition\expandafter\mult_check_for_assignment_indeed_begin_\detokenize{##2}=\_e_t_x_\_e_t_x_\_e_o_t_ + \ifcondition\expandafter\mult_check_for_assignment_indeed_begin_\detokenize{##2}=^^^^0003^^^^0003^^^^0004% \edef#8{##2}% \mult_check_for_parent{#1}{#3}#4#8% \expandafter\edef\csname#1#4:\s!chain\endcsname{\mult_interfaces_chain#1{##2}##1}% @@ -508,7 +508,7 @@ % \let#3#7% % \else\iffirstargument % % \mult_check_for_assignment{##1}% -% \expandafter\mult_check_for_assignment_indeed\detokenize{##1}=\_e_t_x_\_e_t_x_\_e_o_t_ +% \expandafter\mult_check_for_assignment_indeed\detokenize{##1}=^^^^0003^^^^0003^^^^0004% % \ifassignment % % \setuplayout[key=value] % \let#7#3% @@ -557,7 +557,7 @@ \let#3#7% \else\iffirstargument % \mult_check_for_assignment{##1}% - \ifcondition\expandafter\mult_check_for_assignment_indeed_begin_\detokenize{##1}=\_e_t_x_\_e_t_x_\_e_o_t_ + \ifcondition\expandafter\mult_check_for_assignment_indeed_begin_\detokenize{##1}=^^^^0003^^^^0003^^^^0004% % \setuplayout[whatever] \let#6#3% % previous becomes current \edef#3{##1}% this will catch reset so one needs to test for it @@ -829,7 +829,7 @@ \edef#2{##1}% #3[##2]% \else\iffirstargument - \ifcondition\expandafter\mult_check_for_assignment_indeed_begin_\detokenize{##1}=\_e_t_x_\_e_t_x_\_e_o_t_ + \ifcondition\expandafter\mult_check_for_assignment_indeed_begin_\detokenize{##1}=^^^^0003^^^^0003^^^^0004% \edef#2{##1}% \else \let#2\empty @@ -1347,23 +1347,23 @@ \unexpanded\def\syst_helpers_install_macro_stack#1#2#3% {\xdef\m_syst_helpers_push_macro{\csstring#1}% - \expandafter\newcount\csname#3\m_syst_helpers_push_macro\endcsname - \expandafter\edef\csname push_macro_\m_syst_helpers_push_macro\endcsname - {\noexpand\expandafter\glet - \noexpand\csname\m_syst_helpers_push_macro\noexpand\the\csname#3\m_syst_helpers_push_macro\endcsname\endcsname - \noexpand#1% - \global\advance\csname#3\m_syst_helpers_push_macro\endcsname\plusone}% - \expandafter\edef\csname pop_macro_\m_syst_helpers_push_macro\endcsname - {\global\advance\csname#3\m_syst_helpers_push_macro\endcsname\minusone - \noexpand\expandafter#2% - \noexpand\expandafter\noexpand#1% - \noexpand\csname\m_syst_helpers_push_macro\noexpand\the\csname#3\m_syst_helpers_push_macro\endcsname\endcsname}} + \ifcsname#3\m_syst_helpers_push_macro\endcsname\else + \expandafter\newcount\csname#3\m_syst_helpers_push_macro\endcsname + \expandafter\edef\csname push_macro_\m_syst_helpers_push_macro\endcsname + {\noexpand\expandafter\glet + \noexpand\csname\m_syst_helpers_push_macro\noexpand\the\csname#3\m_syst_helpers_push_macro\endcsname\endcsname + \noexpand#1% + \global\advance\csname#3\m_syst_helpers_push_macro\endcsname\plusone}% + \expandafter\edef\csname pop_macro_\m_syst_helpers_push_macro\endcsname + {\global\advance\csname#3\m_syst_helpers_push_macro\endcsname\minusone + \noexpand\expandafter#2% + \noexpand\expandafter\noexpand#1% + \noexpand\csname\m_syst_helpers_push_macro\noexpand\the\csname#3\m_syst_helpers_push_macro\endcsname\endcsname}% + \fi} \unexpanded\def\installmacrostack #1{\syst_helpers_install_macro_stack#1\let \??localpushedmacro } \unexpanded\def\installglobalmacrostack#1{\syst_helpers_install_macro_stack#1\glet\??globalpushedmacro} -\protect - % \unprotect % % \installcorenamespace {test} \installcommandhandler \??test {test} \??test @@ -1385,87 +1385,123 @@ % % \starttext % \definetest[foo] \definetest[bar][foo] \setuptest[bar][before=indeed] -% \resettimer \dorecurse{100000}{\TestMeA[bar]} A:\elapsedtime \par % 0.502 -% \resettimer \dorecurse{100000}{\TestMeB[bar]} B:\elapsedtime \par % 0.530 -% \resettimer \dorecurse{100000}{\TestMeC[bar]} C:\elapsedtime \par % 0.487 -% \resettimer \dorecurse{100000}{\TestMeD[bar]} D:\elapsedtime \par % 0.493 +% \testfeatureonce{100000}{\TestMeA[bar]} A:\elapsedtime \par % 0.502 +% \testfeatureonce{100000}{\TestMeB[bar]} B:\elapsedtime \par % 0.530 +% \testfeatureonce{100000}{\TestMeC[bar]} C:\elapsedtime \par % 0.487 +% \testfeatureonce{100000}{\TestMeD[bar]} D:\elapsedtime \par % 0.493 % \stoptext -% There is no real demand for this ... even if this is twice as fast we only gain -% a few milliseconds: -% -% \unexpanded\def\foo#1{[foo:#1]} +% There is no real demand for this ... even if this is two to three times as fast we +% only gain a few milliseconds: % -% \installcommalistprocessor {foo} \foo -% \installcommalistprocessorcommand \processfoolist {foo} \foo +% \starttyping +% \unexpanded\def\foo#1{[foo:#1]} % -% \commalistprocessor{foo}[a,b,c,d] -% \processfoolist [a, b, c, d] +% \installcommalistprocessor {foo} \foo +% \installcommalistprocessorcommand \processfoolist \foo % -% \testfeatureonce{30000}{} \elapsedtime\par % 0.01 -> 0.00 -% \testfeatureonce{30000}{\processfoolist [fixed,middle]} \elapsedtime\par % 0.07 -> 0.06 -% \testfeatureonce{30000}{\commalistprocessor{foo}[fixed,middle]} \elapsedtime\par % 0.09 -> 0.08 -% \testfeatureonce{30000}{\processcommalist [fixed,middle]\foo} \elapsedtime\par % 0.13 -> 0.12 +% \infofont % -% For instance the luatex manual only has some 3000 calls. But I keep this around as one -% never knows when we might need it. +% \commalistprocessor{foo}[a,b,c,{x,y,z},d]\par +% \processfoolist[a, b, c, {x,y,z}, d]\par +% \processcommalist[{x,y,z}]\foo\blank % -% \installcorenamespace{commalistprocessor} -% \installcorenamespace{commalistprocessorcheck} -% \installcorenamespace{commalistprocessorwrap} -% \installcorenamespace{commalistprocessorfirst} -% \installcorenamespace{commalistprocessorcheckspace} -% \installcorenamespace{commalistprocessorcheckfinish} -% \installcorenamespace{commalistprocessoraction} -% \installcorenamespace{commalistprocessorgobblespace} +% \commalistprocessor{foo}[{x,y,z},a]\par +% \commalistprocessor{foo}[{x,y,z}]\par +% \processfoolist[{x,y,z},a]\par +% \processfoolist[{x,y,z}]\par +% \processcommalist[{x,y,z}]\foo\blank % -% \unexpanded\def\installcommalistprocessor#1#2% 7 macro names overhead -% {\let\nexttoken\relax -% % -% \unexpanded\expandafter\edef\csname\??commalistprocessor#1\endcsname[% -% {\futurelet\nexttoken\csname\??commalistprocessorcheck#1\endcsname}% -% % -% \unexpanded\expandafter\edef\csname\??commalistprocessorcheck#1\endcsname -% {\noexpand\ifx\nexttoken]% -% \noexpand\expandafter\noexpand\gobblethreearguments -% \noexpand\else -% \noexpand\expandafter\csname\??commalistprocessorwrap#1\endcsname -% \noexpand\fi -% \relax}% this one preserved the next {} -% % -% \unexpanded\expandafter\edef\csname\??commalistprocessorwrap#1\endcsname##1]% -% {\csname\??commalistprocessorfirst#1\endcsname##1,]\relax}% -% % -% \unexpanded\expandafter\edef\csname\??commalistprocessorfirst#1\endcsname##1% picks up \relax -% {\csname\??commalistprocessorcheckspace#1\endcsname}% -% % -% \unexpanded\expandafter\edef\csname\??commalistprocessorcheckspace#1\endcsname -% {\noexpand\ifx\nexttoken\noexpand\blankspace -% \noexpand\expandafter\csname\??commalistprocessorgobblespace#1\endcsname -% \noexpand\else -% \noexpand\expandafter\csname\??commalistprocessorcheckfinish#1\endcsname -% \noexpand\fi}% -% % -% \unexpanded\expandafter\edef\csname\??commalistprocessorcheckfinish#1\endcsname -% {\noexpand\ifx\nexttoken]% -% \noexpand\expandafter\noexpand\gobbleoneargument -% \noexpand\else -% \noexpand\expandafter\csname\??commalistprocessoraction#1\endcsname -% \noexpand\fi}% -% % -% \unexpanded\expandafter\edef\csname\??commalistprocessoraction#1\endcsname##1,% -% {\noexpand#2{##1}% -% \futurelet\nexttoken\csname\??commalistprocessorcheckspace#1\endcsname}% -% % -% \let\next\:% -% \unexpanded\edef \:{\csname\??commalistprocessorgobblespace#1\endcsname}% -% \unexpanded\expandafter\edef\: {\futurelet\nexttoken\csname\??commalistprocessorcheckspace#1\endcsname}% -% \let\:\next -% % -% } +% \unexpanded\def\foo#1{} % -% \unexpanded\def\installcommalistprocessorcommand#1#2#3% -% {\installcommalistprocessor{#2}{#3}% -% \expandafter\let\expandafter#1\csname\??commalistprocessor#2\endcsname} +% \testfeatureonce{400000}{\processfoolist [fixed,middle,bar]} \elapsedtime\quad +%%\testfeatureonce{400000}{\commalistprocessor{foo}[fixed,middle,bar]} \elapsedtime\quad +% \testfeatureonce{400000}{\processcommalist [fixed,middle,bar]\foo} \elapsedtime\quad +% \stoptyping % -% \unexpanded\def\commalistprocessor#1{\csname\??commalistprocessor#1\endcsname} +% For instance the luatex manual only has some 3000 calls. But I keep this around as one +% never knows when we might need it. + +\installcorenamespace{commalistprocessor} +\installcorenamespace{commalistprocessorwrap} +\installcorenamespace{commalistprocessorfirst} +\installcorenamespace{commalistprocessornext} +\installcorenamespace{commalistprocessoraction} + +\startmkivmode + + \installcorenamespace{commalistprocessorcheck} + \installcorenamespace{commalistprocessorspace} + \installcorenamespace{commalistprocessorpickup} + \installcorenamespace{commalistprocessorfinish} + + \unexpanded\def\installcommalistprocessor#1#2% 8 macro names overhead + {\let\nexttoken\relax + \unexpanded\expandafter\edef\csname\??commalistprocessor#1\endcsname[% + {\futurelet\nexttoken\csname\??commalistprocessorcheck#1\endcsname}% + \unexpanded\expandafter\edef\csname\??commalistprocessorcheck#1\endcsname + {\noexpand\ifx\nexttoken]% + \noexpand\expandafter\noexpand\gobblethreearguments + \noexpand\else + \noexpand\expandafter\csname\??commalistprocessorwrap#1\endcsname + \noexpand\fi + \relax}% this one preserved the next {} + \unexpanded\expandafter\edef\csname\??commalistprocessorwrap#1\endcsname##1]% + {\csname\??commalistprocessorfirst#1\endcsname##1,]\relax}% + \unexpanded\expandafter\edef\csname\??commalistprocessorfirst#1\endcsname##1% picks up \relax + {\csname\??commalistprocessornext#1\endcsname}% + \unexpanded\expandafter\edef\csname\??commalistprocessornext#1\endcsname + {\noexpand\ifx\nexttoken\noexpand\blankspace + \noexpand\expandafter\csname\??commalistprocessorspace#1\endcsname + \noexpand\else + \noexpand\expandafter\csname\??commalistprocessorfinish#1\endcsname + \noexpand\fi}% + \unexpanded\expandafter\edef\csname\??commalistprocessorfinish#1\endcsname + {\noexpand\ifx\nexttoken]% + \noexpand\expandafter\noexpand\gobbleoneargument + \noexpand\else + \noexpand\expandafter\csname\??commalistprocessoraction#1\endcsname + \noexpand\fi}% + \unexpanded\expandafter\edef\csname\??commalistprocessoraction#1\endcsname##1,% + {\noexpand#2{##1}% + \futurelet\nexttoken\csname\??commalistprocessornext#1\endcsname}% + \let\next\:% + \unexpanded\edef \:{\csname\??commalistprocessorspace#1\endcsname}% + \unexpanded\expandafter\edef\: {\futurelet\nexttoken\csname\??commalistprocessornext#1\endcsname}% + \let\:\next} + +\stopmkivmode + +\startlmtxmode + + %installcorenamespace{commalistprocessorpickup} + + \unexpanded\def\installcommalistprocessor#1#2% 5 macro names overhead + {\unexpanded\expandafter\edef\csname\??commalistprocessor#1\endcsname[% + % {\noexpand\futureexpandis]% + % \noexpand\gobbleoneargument + % \csname\??commalistprocessorpickup#1\endcsname} + %\unexpanded\expandafter\edef\csname\??commalistprocessorpickup#1\endcsname + {\csname\??commalistprocessorwrap#1\endcsname\relax}% \relax preserves {} + \unexpanded\expandafter\edef\csname\??commalistprocessorwrap#1\endcsname##1]% + {\csname\??commalistprocessorfirst#1\endcsname##1,]} + \unexpanded\expandafter\edef\csname\??commalistprocessorfirst#1\endcsname\relax + {\csname\??commalistprocessornext#1\endcsname}% + \unexpanded\expandafter\edef\csname\??commalistprocessornext#1\endcsname + {\noexpand\futureexpandis]% + \noexpand\gobbleoneargument + \csname\??commalistprocessoraction#1\endcsname} + \unexpanded\expandafter\edef\csname\??commalistprocessoraction#1\endcsname##1,% + {\noexpand#2{##1}% + \csname\??commalistprocessornext#1\endcsname}} + +\stoplmtxmode + +\unexpanded\def\installcommalistprocessorcommand#1#2% \processor \action + {\edef\p_name{\csstring#2}% + \installcommalistprocessor\p_name{#2}% + \expandafter\let\expandafter#1\csname\??commalistprocessor\p_name\endcsname} + +\unexpanded\def\commalistprocessor#1{\csname\??commalistprocessor#1\endcsname} + +\protect \endinput diff --git a/tex/context/base/mkiv/mult-chk.mkiv b/tex/context/base/mkiv/mult-chk.mkiv index 8869f7dcb..83b82242e 100644 --- a/tex/context/base/mkiv/mult-chk.mkiv +++ b/tex/context/base/mkiv/mult-chk.mkiv @@ -62,7 +62,7 @@ \def\mult_checkers_get_checked_parameters_nop_indeed#1#2]% needs checking with adapted syst-aux.mkiv {\def\syst_helpers_get_parameters_assign{\syst_helpers_get_parameters_assign_indeed#1}% will change - \syst_helpers_process_comma_item#2,],\_e_o_t_} + \syst_helpers_process_comma_item#2,],^^^^0004} \unexpanded\def\disablecheckparameters{\let\getcheckedparameters\mult_checkers_get_checked_parameters_nop} \unexpanded\def\enablecheckparameters {\let\getcheckedparameters\mult_checkers_get_checked_parameters_yes} diff --git a/tex/context/base/mkiv/page-cst.lua b/tex/context/base/mkiv/page-cst.lua index 1c2f5fc0b..49a60c903 100644 --- a/tex/context/base/mkiv/page-cst.lua +++ b/tex/context/base/mkiv/page-cst.lua @@ -442,11 +442,13 @@ local function here(c,r,nr,nofcolumns,nofrows,cells,width,spans) return c, r, nc end +-- we use c/r as range limiters + local methods = { [v_here] = here, [v_fixed] = here, tblr = function(c,r,nr,nofcolumns,nofrows,cells,width,spans) - for j=1,nofrows-nr+1 do + for j=r,nofrows-nr+1 do for i=c,nofcolumns do if not cells[i][j] then local c, r, cc = here(i,j,nr,nofcolumns,nofrows,cells,width,spans) @@ -459,7 +461,7 @@ local methods = { end, lrtb = function(c,r,nr,nofcolumns,nofrows,cells,width,spans) for i=c,nofcolumns do - for j=1,nofrows-nr+1 do + for j=r,nofrows-nr+1 do if not cells[i][j] then local c, r, cc = here(i,j,nr,nofcolumns,nofrows,cells,width,spans) if c then @@ -470,7 +472,7 @@ local methods = { end end, tbrl = function(c,r,nr,nofcolumns,nofrows,cells,width,spans) - for j=1,nofrows-nr+1 do + for j=r,nofrows-nr+1 do for i=nofcolumns,c,-1 do if not cells[i][j] then local c, r, cc = here(i,j,nr,nofcolumns,nofrows,cells,width,spans) @@ -483,7 +485,7 @@ local methods = { end, rltb = function(c,r,nr,nofcolumns,nofrows,cells,width,spans) for i=nofcolumns,c,-1 do - for j=1,nofrows-nr+1 do + for j=r,nofrows-nr+1 do if not cells[i][j] then local c, r, cc = here(i,j,nr,nofcolumns,nofrows,cells,width,spans) if c then @@ -494,7 +496,8 @@ local methods = { end end, btlr = function(c,r,nr,nofcolumns,nofrows,cells,width,spans) - for j=nofrows-nr+1,1,-1 do + -- for j=nofrows-nr+1,1,-1 do + for j=nofrows-nr+1-r+1,1,-1 do for i=c,nofcolumns do if not cells[i][j] then local c, r, cc = here(i,j,nr,nofcolumns,nofrows,cells,width,spans) @@ -507,7 +510,8 @@ local methods = { end, lrbt = function(c,r,nr,nofcolumns,nofrows,cells,width,spans) for i=c,nofcolumns do - for j=nofrows-nr+1,1,-1 do + -- for j=nofrows-nr+1,1,-1 do + for j=nofrows-nr+1-r+1,1,-1 do if not cells[i][j] then local c, r, cc = here(i,j,nr,nofcolumns,nofrows,cells,width,spans) if c then @@ -518,7 +522,8 @@ local methods = { end end, btrl = function(c,r,nr,nofcolumns,nofrows,cells,width,spans) - for j=nofrows-nr+1,1,-1 do + -- for j=nofrows-nr+1,1,-1 do + for j=nofrows-nr+1-r+1,1,-1 do for i=nofcolumns,c,-1 do if not cells[i][j] then local c, r, cc = here(i,j,nr,nofcolumns,nofrows,cells,width,spans) @@ -531,7 +536,8 @@ local methods = { end, rlbt = function(c,r,nr,nofcolumns,nofrows,cells,width,spans) for i=nofcolumns,c,-1 do - for j=nofrows-nr+1,1,-1 do + -- for j=nofrows-nr+1,1,-1 do + for j=nofrows-nr+1-r+1,1,-1 do if not cells[i][j] then local c, r, cc = here(i,j,nr,nofcolumns,nofrows,cells,width,spans) if c then @@ -1318,6 +1324,7 @@ interfaces.implement { { "r", "integer" }, { "nc", "integer" }, { "nr", "integer" }, + { "method", "string" }, { "box", "integer" }, } } } @@ -1330,6 +1337,7 @@ interfaces.implement { { "method", "string" }, { "c", "integer" }, { "r", "integer" }, + { "method", "string" }, { "box", "integer" }, { "width", "dimension" }, { "height", "dimension" }, @@ -1344,6 +1352,7 @@ interfaces.implement { { "name", "string" }, { "c", "integer" }, { "r", "integer" }, + { "method", "string" }, { "box", "integer" }, } } } @@ -1415,6 +1424,7 @@ interfaces.implement { { "name", "string" }, { "c", "integer" }, { "r", "integer" }, + { "method", "string" }, { "box", "integer" }, } } } diff --git a/tex/context/base/mkiv/page-cst.mkiv b/tex/context/base/mkiv/page-cst.mkiv index 37df4e8b1..8fd02c870 100644 --- a/tex/context/base/mkiv/page-cst.mkiv +++ b/tex/context/base/mkiv/page-cst.mkiv @@ -221,6 +221,7 @@ {\begingroup \letdummyparameter\c!c\zerocount \letdummyparameter\c!r\zerocount + \letdummyparameter\c!method\v!here \letdummyparameter\c!option\v!none \getdummyparameters[#1]% \dowithnextboxcs\page_grd_set_indeed\hbox} @@ -231,6 +232,7 @@ c \dummyparameter\c!c r \dummyparameter\c!r box \nextbox + method {\dummyparameter\c!method} option {\dummyparameter\c!option} }% \ifcase\c_page_grd_reserved_state @@ -250,6 +252,7 @@ \fi \endgroup} + \unexpanded\def\page_grd_command_set_vsize {\clf_setvsizecolumnset{\currentpagegrid}% \ifdim\d_page_grd_gap_height<\lineheight @@ -640,11 +643,12 @@ \edef\currentpagegridspan{#1}% \clf_sethsizecolumnspan{\currentpagegrid}\pagegridspanparameter\c!n\relax \setbox\scratchbox\hbox\bgroup\inheritedpagegridspanframed\bgroup + \def\page_grd_span_stop{\page_grd_span_stop_indeed{#2}}% \usepagegridspanstyleandcolor\c!style\c!color \pagegridspanparameter\c!before \ignorespaces} -\unexpanded\def\stoppagegridspan +\unexpanded\def\page_grd_span_stop_indeed#1% {\removeunwantedspaces \par \verticalstrut @@ -653,11 +657,14 @@ \endgraf \pagegridspanparameter\c!after \egroup\egroup - \setpagegrid{\box\scratchbox}% + \setpagegrid[#1]{\box\scratchbox}% % todo: push into slot \egroup \endgraf} +\unexpanded\def\stoppagegridspan % indirectness permits aliasing + {\page_grd_span_stop} + \def\pagegridspanwidth#1% assumes equal distances {\the\dimexpr #1\d_page_grd_column_width diff --git a/tex/context/base/mkiv/status-files.pdf b/tex/context/base/mkiv/status-files.pdf Binary files differindex 24636e090..0547dc574 100644 --- a/tex/context/base/mkiv/status-files.pdf +++ b/tex/context/base/mkiv/status-files.pdf diff --git a/tex/context/base/mkiv/status-lua.pdf b/tex/context/base/mkiv/status-lua.pdf Binary files differindex 3a16e2d66..63e611ca1 100644 --- a/tex/context/base/mkiv/status-lua.pdf +++ b/tex/context/base/mkiv/status-lua.pdf diff --git a/tex/context/base/mkiv/strc-itm.mkvi b/tex/context/base/mkiv/strc-itm.mkvi index 13e400c0e..7895b7968 100644 --- a/tex/context/base/mkiv/strc-itm.mkvi +++ b/tex/context/base/mkiv/strc-itm.mkvi @@ -390,6 +390,11 @@ \unexpanded\def\strc_itemgroups_process_options#options% {\processcommacommand[#options]\strc_itemgroups_process_option} % expansion of options is handy for xml +% \installcommalistprocessorcommand \strc_itemgroups_process_option_list \strc_itemgroups_process_option +% +% \unexpanded\def\strc_itemgroups_process_options#options% +% {\normalexpanded{\strc_itemgroups_process_option_list[#options]}} % expansion of options is handy for xml + \def\strc_itemgroups_process_option#option% {\edef\itemgroupconstantvalue{#option}% \ifx\itemgroupconstantvalue\empty\else @@ -526,6 +531,11 @@ \def\strc_itemgroups_preset_stage_one#options% {\processcommacommand[#options]\strc_itemgroups_preset_stage_one_indeed} +% \installcommalistprocessorcommand \strc_itemgroups_preset_stage_one_list \strc_itemgroups_preset_stage_one_indeed +% +% \def\strc_itemgroups_preset_stage_one#options% +% {\normalexpanded{\strc_itemgroups_preset_stage_one_list[#options]}} + \def\strc_itemgroups_preset_stage_one_indeed#option% {\ifcsname\??itemgroupfirst#option\endcsname \lastnamedcs diff --git a/tex/context/base/mkiv/syst-aux.mkiv b/tex/context/base/mkiv/syst-aux.mkiv index 5decc5886..4fbcbd0e6 100644 --- a/tex/context/base/mkiv/syst-aux.mkiv +++ b/tex/context/base/mkiv/syst-aux.mkiv @@ -1606,8 +1606,8 @@ \unexpanded\def\syst_helpers_do_if_in_string_else#1#2% ##2 can be {abc} {\expandafter\def\expandafter\syst_helpers_do_do_if_in_string_else - \expandafter##\expandafter1#1##2##3\_e_o_s_{\unless\if##2@}% expand #1 here - \expandafter\syst_helpers_do_do_if_in_string_else\normalexpanded{#2#1}@@\_e_o_s_} % expand #2 here + \expandafter##\expandafter1#1##2##3^^^^0004{\unless\if##2@}% expand #1 here + \expandafter\syst_helpers_do_do_if_in_string_else\normalexpanded{#2#1}@@^^^^0004} % expand #2 here %D The next alternative proved to be upto twice as fast on tasks like checking %D reserved words in pretty verbatim typesetting! This is mainly due to the fact @@ -1621,9 +1621,9 @@ %D alternative does minimal (one level) expansion. \unexpanded\def\syst_helpers_do_if_in_csname_else#1#2% - {\def\syst_helpers_do_do_if_in_csname_else##1#1##2##3\_e_o_s_ + {\def\syst_helpers_do_do_if_in_csname_else##1#1##2##3^^^^0004% {\unless\if##2@}% - \expandafter\syst_helpers_do_do_if_in_csname_else#2#1@@\_e_o_s_} + \expandafter\syst_helpers_do_do_if_in_csname_else#2#1@@^^^^0004} \unexpanded\def\doifelseincsname#1#2% {\normalexpanded{\syst_helpers_do_if_in_csname_else{#1}}{#2}% @@ -1821,11 +1821,11 @@ %D Some more raw material: \def\syst_helpers_do_raw_process_action[#1][#2]% - {\def\syst_helpers_do_do_raw_process_action##1,#1=>##2,##3\_e_o_s_ + {\def\syst_helpers_do_do_raw_process_action##1,#1=>##2,##3^^^^0004% {\if##3@\else \def\m_syst_helpers_process_action{##2}% \fi}% - \syst_helpers_do_do_raw_process_action,#2,#1=>,@\_e_o_s_} + \syst_helpers_do_do_raw_process_action,#2,#1=>,@^^^^0004} \unexpanded\def\rawprocessaction[#1]#2[#3]% {\edef\m_syst_string_one{#1}% @@ -2014,7 +2014,7 @@ \fi#4} \def\syst_helpers_get_parameters#1]% - {\xprocesscommaitem#1,],\_e_o_t_} + {\xprocesscommaitem#1,],^^^^0004} \def\syst_helpers_process_comma_item#1,#2% #2 takes space before , {\if,#1,% dirty trick for testing #1=empty @@ -2022,14 +2022,14 @@ \else\if]#1% \doubleexpandafter\gobbleoneargument \else - \syst_helpers_get_parameters_assign\_e_o_t_#1==\empty\_e_o_t_ + \syst_helpers_get_parameters_assign^^^^0004#1==\empty^^^^0004% \doubleexpandafter\syst_helpers_process_comma_item \fi\fi#2} \def\syst_helpers_assign_error#1#2#3% {\showassignerror{#2}{\the\inputlineno\space(#1)}} -\def\syst_helpers_get_parameters_assign_normal#1\_e_o_t_#2=#3=#4#5\_e_o_t_ +\def\syst_helpers_get_parameters_assign_normal#1^^^^0004#2=#3=#4#5^^^^0004% {\ifx\empty#2\empty \expandafter\syst_helpers_assign_error \else\ifx#4\empty @@ -2039,7 +2039,7 @@ \fi\fi {#1}{#2}{#3}} -\def\syst_helpers_get_parameters_assign_error#1\_e_o_t_#2=#3=#4#5\_e_o_t_ +\def\syst_helpers_get_parameters_assign_error#1^^^^0004#2=#3=#4#5^^^^0004% {\ifx\empty#2\empty \expandafter\syst_helpers_assign_error \else\ifx#4\empty @@ -2056,9 +2056,9 @@ \let\syst_helpers_get_parameters_assign_indeed\syst_helpers_get_parameters_assign_normal -\unexpanded\def\doassign [#1][#2]{\let\setsomevalue\dosetvalue \syst_helpers_get_parameters_assign_indeed#1\_e_o_t_#2==\empty\_e_o_t_} -\unexpanded\def\doeassign [#1][#2]{\let\setsomevalue\dosetevalue \syst_helpers_get_parameters_assign_indeed#1\_e_o_t_#2==\empty\_e_o_t_} -\unexpanded\def\undoassign[#1][#2]{\let\setsomevalue\doresetvalue\syst_helpers_get_parameters_assign_indeed#1\_e_o_t_#2==\empty\_e_o_t_} +\unexpanded\def\doassign [#1][#2]{\let\setsomevalue\dosetvalue \syst_helpers_get_parameters_assign_indeed#1^^^^0004#2==\empty^^^^0004} +\unexpanded\def\doeassign [#1][#2]{\let\setsomevalue\dosetevalue \syst_helpers_get_parameters_assign_indeed#1^^^^0004#2==\empty^^^^0004} +\unexpanded\def\undoassign[#1][#2]{\let\setsomevalue\doresetvalue\syst_helpers_get_parameters_assign_indeed#1^^^^0004#2==\empty^^^^0004} %D \macros %D {processassignmentlist,processassignmentcommand, @@ -2124,14 +2124,14 @@ %D Here we hook in the code (beware, this is the optimized get **): \def\syst_helpers_get_parameters_normal#1]% - {\syst_helpers_process_comma_item#1,],\_e_o_t_} + {\syst_helpers_process_comma_item#1,],^^^^0004} \def\syst_helpers_get_parameters_expanded#1]% {\let\dosetnvalue\setsomevalue \let\setsomevalue\dosetevalue \let\syst_helpers_get_parameters_assign_indeed\syst_helpers_get_parameters_assign_error \let\setsomevalue\dosetevalue - \syst_helpers_process_comma_item#1,],\_e_o_t_ + \syst_helpers_process_comma_item#1,],^^^^0004% \let\syst_helpers_get_parameters_assign_indeed\syst_helpers_get_parameters_assign_normal \let\setsomevalue\dosetnvalue \let\syst_helpers_get_parameters\syst_helpers_get_parameters_normal @@ -2205,11 +2205,11 @@ \newif\ifparameters -\def\syst_helpers_check_parameters#1=#2#3\_e_o_s_ - {\if#2\_e_t_x_\parametersfalse\else\parameterstrue\fi} +\def\syst_helpers_check_parameters#1=#2#3^^^^0004% + {\if#2^^^^0003\parametersfalse\else\parameterstrue\fi} \unexpanded\def\checkparameters[#1]% - {\syst_helpers_check_parameters#1=\_e_t_x_\_e_t_x_\_e_o_s_} + {\syst_helpers_check_parameters#1=^^^^0003^^^^0003^^^^0004} %D \macros %D {getfromcommalist,getfromcommacommand, @@ -5366,18 +5366,18 @@ %D \doifassignmentelse {...} {then ...} {else ...} %D \stoptyping -\def\syst_helpers_check_if_assignment_else#1=#2#3\_e_o_t_{\if#2\_e_t_x_}% -\def\syst_helpers_check_else_assignment_if#1=#2#3\_e_o_t_{\unless\if#2\_e_t_x_}% +\def\syst_helpers_check_if_assignment_else#1=#2#3^^^^0004{\if#2^^^^0003}% +\def\syst_helpers_check_else_assignment_if#1=#2#3^^^^0004{\unless\if#2^^^^0003}% \unexpanded\def\doifelseassignment#1% - {\expandafter\syst_helpers_check_if_assignment_else\detokenize{#1}=\_e_t_x_\_e_t_x_\_e_o_t_ + {\expandafter\syst_helpers_check_if_assignment_else\detokenize{#1}=^^^^0003^^^^0003^^^^0004% \expandafter\secondoftwoarguments \else \expandafter\firstoftwoarguments \fi} \unexpanded\def\doifelseassignmentcs#1#2#3% - {\expandafter\syst_helpers_check_if_assignment_else\detokenize{#1}=\_e_t_x_\_e_t_x_\_e_o_t_ + {\expandafter\syst_helpers_check_if_assignment_else\detokenize{#1}=^^^^0003^^^^0003^^^^0004% \expandafter#3% \else \expandafter#2% @@ -5389,7 +5389,7 @@ \newif\ifassignment \unexpanded\def\docheckassignment#1% - {\expandafter\syst_helpers_check_if_assignment_else\detokenize{#1}=\_e_t_x_\_e_t_x_\_e_o_t_ + {\expandafter\syst_helpers_check_if_assignment_else\detokenize{#1}=^^^^0003^^^^0003^^^^0004% \assignmentfalse \else \assignmenttrue @@ -5398,10 +5398,10 @@ %D These can be used for cases where we want less tracing noise. \unexpanded\def\validassignment#1% - {\expandafter\syst_helpers_check_else_assignment_if\detokenize{#1}=\_e_t_x_\_e_t_x_\_e_o_t_} + {\expandafter\syst_helpers_check_else_assignment_if\detokenize{#1}=^^^^0003^^^^0003^^^^0004} \unexpanded\def\novalidassignment#1% - {\expandafter\syst_helpers_check_if_assignment_else\detokenize{#1}=\_e_t_x_\_e_t_x_\_e_o_t_} + {\expandafter\syst_helpers_check_if_assignment_else\detokenize{#1}=^^^^0003^^^^0003^^^^0004} %D In \ETEX\ we can use \type {\detokenize} and gain some speed, but in general far %D less that 1\% for \type {\convertargument} and nil for \type {\convertcommand}. @@ -6255,9 +6255,9 @@ \fi} \def\doifelsestringinstring#1#2% - {\expandafter\def\expandafter\syst_helpers_if_instring_else\expandafter##\expandafter1#1##2##3\_e_o_s_ + {\expandafter\def\expandafter\syst_helpers_if_instring_else\expandafter##\expandafter1#1##2##3^^^^0004% {\syst_helpers_if_instring_else_indeed##2}% - \expandafter\expandafter\expandafter\syst_helpers_if_instring_else\expandafter#2#1@@\_e_o_s_} + \expandafter\expandafter\expandafter\syst_helpers_if_instring_else\expandafter#2#1@@^^^^0004} \let\doifstringinstringelse\doifelsestringinstring @@ -6435,10 +6435,10 @@ % {\scratchtoks{a\relax b} \removetoks \relax\from\scratchtoks [\showthe\scratchtoks]} \unexpanded\def\removetoks#1\from#2% - {\def\syst_helpers_remove_toks##1#1##2\empty\empty\empty##3\_e_o_t_ + {\def\syst_helpers_remove_toks##1#1##2\empty\empty\empty##3^^^^0004% {\def\m_syst_string_one{##3}% \ifx\m_syst_string_one\empty#2{##1}\else#2{##1##2}\fi}% - \expandafter\syst_helpers_remove_toks\the#2\empty\empty\empty#1\empty\empty\empty\_e_o_t_} + \expandafter\syst_helpers_remove_toks\the#2\empty\empty\empty#1\empty\empty\empty^^^^0004} %D Also: @@ -7435,10 +7435,10 @@ %D Is this one still needed? -\def\syst_helpers_if_some_space_else#1 #2#3\_e_o_s_{\if\noexpand#2@} +\def\syst_helpers_if_some_space_else#1 #2#3^^^^0004{\if\noexpand#2@} \def\doifelsesomespace#1% % #2#3% - {\syst_helpers_if_some_space_else#1 @ @\_e_o_s_ % #3\else#2\fi} + {\syst_helpers_if_some_space_else#1 @ @^^^^0004% #3\else#2\fi} \expandafter\secondoftwoarguments \else \expandafter\firstoftwoarguments diff --git a/tex/context/base/mkiv/syst-ini.mkiv b/tex/context/base/mkiv/syst-ini.mkiv index 7c77ec97e..2a2d48311 100644 --- a/tex/context/base/mkiv/syst-ini.mkiv +++ b/tex/context/base/mkiv/syst-ini.mkiv @@ -720,6 +720,11 @@ \tracingcommands \zerocount \tracingonline \zerocount} +%D When we want to see a box we can as well show all of it. + +\showboxdepth \maxdimen +\showboxbreadth\maxdimen + %D Just for tracing purposes we set: \tracingstats\plusone diff --git a/tex/context/base/mkiv/tabl-ntb.mkiv b/tex/context/base/mkiv/tabl-ntb.mkiv index 4bc39da97..1cf5ad3dc 100644 --- a/tex/context/base/mkiv/tabl-ntb.mkiv +++ b/tex/context/base/mkiv/tabl-ntb.mkiv @@ -208,20 +208,23 @@ \newcount\c_tabl_level +\installglobalmacrostack\m_tabl_ntb_saved_row +\installglobalmacrostack\m_tabl_ntb_saved_col + \unexpanded\def\tabl_ntb_table_push {\ifnum\m_tabl_tbl_level>\plusone \tabl_ntb_parameters_reset % we need a proper count push/pop - \xdef\m_tabl_ntb_saved_row{\the\c_tabl_ntb_row}\globalpushmacro\m_tabl_ntb_saved_row - \xdef\m_tabl_ntb_saved_col{\the\c_tabl_ntb_col}\globalpushmacro\m_tabl_ntb_saved_col + \xdef\m_tabl_ntb_saved_row{\the\c_tabl_ntb_row}\push_macro_m_tabl_ntb_saved_row + \xdef\m_tabl_ntb_saved_col{\the\c_tabl_ntb_col}\push_macro_m_tabl_ntb_saved_col \else \global\intabletrue \fi} \unexpanded\def\tabl_ntb_table_pop {\ifnum\m_tabl_tbl_level>\plusone - \globalpopmacro\m_tabl_ntb_saved_row\global\c_tabl_ntb_row\m_tabl_ntb_saved_row - \globalpopmacro\m_tabl_ntb_saved_col\global\c_tabl_ntb_col\m_tabl_ntb_saved_col + \pop_macro_m_tabl_ntb_saved_row\global\c_tabl_ntb_row\m_tabl_ntb_saved_row + \pop_macro_m_tabl_ntb_saved_col\global\c_tabl_ntb_col\m_tabl_ntb_saved_col \else \global\intablefalse \fi} diff --git a/tex/context/base/mkiv/trac-inf.lua b/tex/context/base/mkiv/trac-inf.lua index d3e348ce4..0a4537e31 100644 --- a/tex/context/base/mkiv/trac-inf.lua +++ b/tex/context/base/mkiv/trac-inf.lua @@ -211,7 +211,8 @@ function statistics.show() -- end) if LUATEXENGINE == "luametatex" then register("used engine", function() - return format("%s version %s", LUATEXENGINE, LUATEXVERSION) + return format("%s version %s, functionality level %s, format id %s", + LUATEXENGINE, LUATEXVERSION, LUATEXFUNCTIONALITY, LUATEXFORMATID) end) else register("used engine", function() diff --git a/tex/context/base/mkiv/trac-tex.mkiv b/tex/context/base/mkiv/trac-tex.mkiv index d659f4bab..c69f3febb 100644 --- a/tex/context/base/mkiv/trac-tex.mkiv +++ b/tex/context/base/mkiv/trac-tex.mkiv @@ -39,4 +39,31 @@ \unexpanded\def\nomkivstatistics{\enabledirectives[system.nostatistics]} +%D This is not really a tracker but for decades it lived in my \type {cont-loc} +%D file. I moved it here because I wanted someone else to use it. This macro is not +%D really useful for users. I kept the \LUA\ variant in \type {cont-loc.mkiv}. + +\installcorenamespace{profilemacrocount} +\installcorenamespace{profilemacromacro} + +\newtoks\t_syst_profile + +\appendtoks + \the\t_syst_profile +\to \everystoptext + +\unexpanded\def\profilemacro#1% an oldie, but modernized a bit + {\edef\p_name{\csstring#1}% + \ifcsname\??profilemacrocount\p_name\endcsname \else + \expandafter\newcount\csname\??profilemacrocount\p_name\endcsname + \expandafter\let\csname\??profilemacromacro\p_name\endcsname#1% + \xtoksapp\t_syst_profile + {\writestatus + {profile}% + {\string#1: \noexpand\the\csname\??profilemacrocount\p_name\endcsname}}% + \unexpanded\xdef#1% + {\global\advance\csname\??profilemacrocount\p_name\endcsname\plusone + \expandafter\noexpand\csname\??profilemacromacro\p_name\endcsname}% + \fi} + \protect \endinput diff --git a/tex/context/interface/mkiv/i-context.pdf b/tex/context/interface/mkiv/i-context.pdf Binary files differindex 70a537ece..3d5205666 100644 --- a/tex/context/interface/mkiv/i-context.pdf +++ b/tex/context/interface/mkiv/i-context.pdf diff --git a/tex/context/interface/mkiv/i-readme.pdf b/tex/context/interface/mkiv/i-readme.pdf Binary files differindex 8fccc9173..7b6a077ef 100644 --- a/tex/context/interface/mkiv/i-readme.pdf +++ b/tex/context/interface/mkiv/i-readme.pdf diff --git a/tex/context/modules/common/s-abbreviations-logos.tex b/tex/context/modules/common/s-abbreviations-logos.tex index e394157d7..54a969593 100644 --- a/tex/context/modules/common/s-abbreviations-logos.tex +++ b/tex/context/modules/common/s-abbreviations-logos.tex @@ -164,10 +164,10 @@ \logo [LMX] {lmx} \logo [LPEG] {lpeg} \logo [LUA] {Lua} -\logo [LUAJIT] {LuaJIT} -\logo [LUAJITTEX] {Luajit\TeXsuffix} -\logo [LUAMETATEX] {\Lua Meta\TeXsuffix} -\logo [LUATEX] {Lua\TeXsuffix} +\logo [LUAJIT] {Lua\wordboundary JIT} +\logo [LUAJITTEX] {Lua\wordboundary jit\TeXsuffix} +\logo [LUAMETATEX] {\Lua\wordboundary Meta\wordboundary\TeXsuffix} +\logo [LUATEX] {Lua\wordboundary\TeXsuffix} \logo [LUATOOLS] {luatools} \logo [MACOSX] {MacOSX} %logo [MACROTEX] {Macro\TeXsuffix} diff --git a/tex/generic/context/luatex/luatex-fonts-merged.lua b/tex/generic/context/luatex/luatex-fonts-merged.lua index f5f9653de..8a940cc22 100644 --- a/tex/generic/context/luatex/luatex-fonts-merged.lua +++ b/tex/generic/context/luatex/luatex-fonts-merged.lua @@ -1,6 +1,6 @@ -- merged file : c:/data/develop/context/sources/luatex-fonts-merged.lua -- parent file : c:/data/develop/context/sources/luatex-fonts.lua --- merge date : 05/12/19 19:05:50 +-- merge date : 05/18/19 10:42:24 do -- begin closure to overcome local limits and interference @@ -15391,8 +15391,8 @@ function readers.cff(f,fontdata,specification) if private then local data=private.data if type(data)=="table" then - cffinfo.defaultwidth=data.defaultwidth or cffinfo.defaultwidth - cffinfo.nominalwidth=data.nominalwidth or cffinfo.nominalwidth + cffinfo.defaultwidth=data.defaultwidthx or cffinfo.defaultwidth + cffinfo.nominalwidth=data.nominalwidthx or cffinfo.nominalwidth cffinfo.bluevalues=data.bluevalues cffinfo.otherblues=data.otherblues cffinfo.familyblues=data.familyblues @@ -17881,6 +17881,7 @@ function gposhandlers.pair(f,fontdata,lookupid,lookupoffset,offset,glyphs,nofgly local sets=readarray(f) sets=readpairsets(f,tableoffset,sets,format1,format2,mainoffset,getdelta) coverage=readcoverage(f,tableoffset+coverage) + local shared={} for index,newindex in next,coverage do local set=sets[newindex+1] local hash={} @@ -17888,18 +17889,24 @@ function gposhandlers.pair(f,fontdata,lookupid,lookupoffset,offset,glyphs,nofgly local value=set[i] if value then local other=value[1] - local first=value[2] - local second=value[3] - if first or second then - hash[other]={ first,second or nil } - else - hash[other]=nil + local share=shared[value] + if share==nil then + local first=value[2] + local second=value[3] + if first or second then + share={ first,second or nil } + else + share=false + end + shared[value]=share end + hash[other]=share or nil end end coverage[index]=hash end return { + shared=shared and true or nil, format="pair", coverage=coverage, } @@ -17928,22 +17935,17 @@ function gposhandlers.pair(f,fontdata,lookupid,lookupoffset,offset,glyphs,nofgly local first=offsets[1] local second=offsets[2] if first or second then - if shared then - local s1=shared[first] - if s1==nil then - s1={} - shared[first]=s1 - end - local s2=s1[second] - if s2==nil then - s2={ first,second or nil } - s1[second]=s2 - end - hash[paired]=s2 - else - hash[paired]={ first,second or nil } + local s1=shared[first] + if s1==nil then + s1={} + shared[first]=s1 end - else + local s2=s1[second] + if s2==nil then + s2={ first,second or nil } + s1[second]=s2 + end + hash[paired]=s2 end end end |