From 5e668aa418d6d082446e9369ae06625b50e49943 Mon Sep 17 00:00:00 2001 From: Hans Hagen Date: Tue, 6 Jun 2017 13:57:28 +0200 Subject: 2017-06-06 13:28:00 --- tex/context/base/mkii/cont-new.mkii | 2 +- tex/context/base/mkii/context.mkii | 2 +- tex/context/base/mkiv/cont-new.mkiv | 2 +- tex/context/base/mkiv/context.mkiv | 2 +- tex/context/base/mkiv/font-con.lua | 26 ++- tex/context/base/mkiv/font-ctx.lua | 66 +------- tex/context/base/mkiv/font-def.lua | 5 - tex/context/base/mkiv/font-ext.lua | 7 +- tex/context/base/mkiv/font-fbk.lua | 10 +- tex/context/base/mkiv/font-mat.mkvi | 2 + tex/context/base/mkiv/font-vf.lua | 4 +- tex/context/base/mkiv/math-act.lua | 1 + tex/context/base/mkiv/math-ali.mkiv | 90 +++++++--- tex/context/base/mkiv/math-fbk.lua | 184 +++++++++++---------- tex/context/base/mkiv/math-ini.mkiv | 5 + tex/context/base/mkiv/math-noa.lua | 100 ++++++----- tex/context/base/mkiv/mult-prm.lua | 4 + tex/context/base/mkiv/status-files.pdf | Bin 25706 -> 25675 bytes tex/context/base/mkiv/status-lua.pdf | Bin 424698 -> 424652 bytes tex/context/base/mkiv/supp-mat.mkiv | 5 + tex/context/base/mkiv/syst-aux.mkiv | 6 + tex/context/interface/mkiv/context-en.xml | 3 + tex/context/interface/mkiv/i-context.pdf | Bin 847214 -> 847693 bytes tex/context/interface/mkiv/i-mathalignment.xml | 3 + tex/context/interface/mkiv/i-readme.pdf | Bin 60769 -> 60769 bytes tex/generic/context/luatex/luatex-fonts-merged.lua | 26 ++- tex/generic/context/luatex/luatex-math.tex | 82 ++++++++- 27 files changed, 395 insertions(+), 242 deletions(-) (limited to 'tex') diff --git a/tex/context/base/mkii/cont-new.mkii b/tex/context/base/mkii/cont-new.mkii index f1f1b7b54..1935fc5e2 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{2017.06.04 16:55} +\newcontextversion{2017.06.06 13:22} %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 ed6e5657a..c000f8918 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{2017.06.04 16:55} +\edef\contextversion{2017.06.06 13:22} %D For those who want to use this: diff --git a/tex/context/base/mkiv/cont-new.mkiv b/tex/context/base/mkiv/cont-new.mkiv index cd928701d..6f78ecbb8 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{2017.06.04 16:55} +\newcontextversion{2017.06.06 13:22} %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 f586f8706..48bd46739 100644 --- a/tex/context/base/mkiv/context.mkiv +++ b/tex/context/base/mkiv/context.mkiv @@ -39,7 +39,7 @@ %D up and the dependencies are more consistent. \edef\contextformat {\jobname} -\edef\contextversion{2017.06.04 16:55} +\edef\contextversion{2017.06.06 13:22} \edef\contextkind {beta} %D For those who want to use this: diff --git a/tex/context/base/mkiv/font-con.lua b/tex/context/base/mkiv/font-con.lua index e328d56d2..5a19d84ee 100644 --- a/tex/context/base/mkiv/font-con.lua +++ b/tex/context/base/mkiv/font-con.lua @@ -345,10 +345,6 @@ function constructors.scale(tfmdata,specification) local defaultdepth = resources.defaultdepth or 0 local units = parameters.units or 1000 -- - if target.fonts then - target.fonts = fastcopy(target.fonts) -- maybe we virtualize more afterwards - end - -- -- boundary keys are no longer needed as we now have a string 'right_boundary' -- that can be used in relevant tables (kerns and ligatures) ... not that I ever -- used them @@ -453,6 +449,13 @@ function constructors.scale(tfmdata,specification) local writingmode = properties.writingmode or "horizontal" local identity = properties.identity or "horizontal" -- + local vfonts = target.fonts + if vfonts and #vfonts > 0 then + target.fonts = fastcopy(vfonts) -- maybe we virtualize more afterwards + elseif isvirtual then + target.fonts = { { id = 0 } } -- catch error + end + -- if changed and not next(changed) then changed = false end @@ -806,6 +809,21 @@ function constructors.scale(tfmdata,specification) -- constructors.trytosharefont(target,tfmdata) -- + -- catch incosnistencies + -- + local vfonts = target.fonts + if isvirtual then + if not vfonts or #vfonts == 0 then + target.fonts = { { id = 0 } } + end + elseif vfonts then + properties.virtualized = true + target.type = "virtual" + if #vfonts == 0 then + target.fonts = { { id = 0 } } + end + end + -- return target end diff --git a/tex/context/base/mkiv/font-ctx.lua b/tex/context/base/mkiv/font-ctx.lua index e13da7f8a..39a579253 100644 --- a/tex/context/base/mkiv/font-ctx.lua +++ b/tex/context/base/mkiv/font-ctx.lua @@ -1262,7 +1262,6 @@ do -- else too many locals -- -- characters[0x2007] = { width = characters[0x0030] and characters[0x0030].width or parameters.space } -- figure -- -- characters[0x2008] = { width = characters[0x002E] and characters[0x002E].width or parameters.space } -- period -- -- --- -- constructors.checkvirtualids(tfmdata) -- experiment, will become obsolete when slots can selfreference -- local id = definefont(tfmdata) -- csnames[id] = specification.cs -- tfmdata.properties.id = id @@ -1429,7 +1428,6 @@ do -- else too many locals -- characters[0x2007] = { width = characters[0x0030] and characters[0x0030].width or parameters.space } -- figure -- characters[0x2008] = { width = characters[0x002E] and characters[0x002E].width or parameters.space } -- period -- - -- constructors.checkvirtualids(tfmdata) -- experiment, will become obsolete when slots can selfreference local fallbacks = specification.fallbacks local mathsize = (mathsize == 1 or mathsize == 2 or mathsize == 3) and mathsize or nil -- can be unset so we test 1 2 3 if fallbacks and fallbacks ~= "" and mathsize and not busy then @@ -1476,7 +1474,6 @@ do -- else too many locals -- forget about it (can't happen here) elseif mathsize == 0 then -- can't happen (here) - lastmathids[1] = lastfontid else -- maybe only 1 2 3 (we already test for this) lastmathids[mathsize] = lastfontid @@ -1532,8 +1529,9 @@ do -- else too many locals if not mathsize then -- forget about it elseif mathsize == 0 then - lastmathids[1] = lastfontid - else -- maybe only 1 2 3 + -- can't happen (here) + else + -- maybe only 1 2 3 lastmathids[mathsize] = lastfontid end -- @@ -1612,7 +1610,6 @@ do -- else too many locals end return tfmdata, fontdata[tfmdata] else - constructors.checkvirtualids(tfmdata) -- experiment, will become obsolete when slots can selfreference local id = definefont(tfmdata) tfmdata.properties.id = id definers.register(tfmdata,id) @@ -2383,63 +2380,6 @@ dimenfactors.pct = nil to scale virtual characters.

--ldx]]-- --- function constructors.checkvirtualids(tfmdata) --- -- begin of experiment: we can use { "slot", 0, number } in virtual fonts --- local fonts = tfmdata.fonts --- local selfid = font.nextid() --- if fonts and #fonts > 0 then --- for i=1,#fonts do --- local fi = fonts[i] --- if fi[2] == 0 then --- fi[2] = selfid --- elseif fi.id == 0 then --- fi.id = selfid --- end --- end --- else --- -- tfmdata.fonts = { "id", selfid } -- conflicts with other next id's (vf math), too late anyway --- end --- -- end of experiment --- end - --- function constructors.getvirtualid(tfmdata) --- -- since we don't know the id yet, we use 0 as signal --- local tf = tfmdata.fonts --- if not tf then --- local properties = tfmdata.properties --- if properties then --- properties.virtualized = true --- else --- tfmdata.properties = { virtualized = true } --- end --- tf = { } --- tfmdata.fonts = tf --- end --- local ntf = #tf + 1 --- tf[ntf] = { id = 0 } --- return ntf --- end --- --- function constructors.checkvirtualid(tfmdata, id) -- will go --- local properties = tfmdata.properties --- if tfmdata and tfmdata.type == "virtual" or (properties and properties.virtualized) then --- local vfonts = tfmdata.fonts --- if not vffonts or #vfonts == 0 then --- if properties then --- properties.virtualized = false --- end --- tfmdata.fonts = nil --- else --- for f=1,#vfonts do --- local fnt = vfonts[f] --- if fnt.id and fnt.id == 0 then --- fnt.id = id --- end --- end --- end --- end --- end - do local setmacro = tokens.setters.macro diff --git a/tex/context/base/mkiv/font-def.lua b/tex/context/base/mkiv/font-def.lua index a362d8967..19d980e48 100644 --- a/tex/context/base/mkiv/font-def.lua +++ b/tex/context/base/mkiv/font-def.lua @@ -415,10 +415,6 @@ function definers.loadfont(specification) return tfmdata end -function constructors.checkvirtualids() - -- dummy in plain version -end - function constructors.readanddefine(name,size) -- no id -- maybe a dummy first local specification = definers.analyze(name,size) local method = specification.method @@ -432,7 +428,6 @@ function constructors.readanddefine(name,size) -- no id -- maybe a dummy first local tfmdata = definers.loadfont(specification) if tfmdata then tfmdata.properties.hash = hash - constructors.checkvirtualids(tfmdata) -- experiment, will become obsolete when slots can selfreference id = font.define(tfmdata) definers.register(tfmdata,id) else diff --git a/tex/context/base/mkiv/font-ext.lua b/tex/context/base/mkiv/font-ext.lua index 965b6e6dc..da629c045 100644 --- a/tex/context/base/mkiv/font-ext.lua +++ b/tex/context/base/mkiv/font-ext.lua @@ -671,6 +671,7 @@ local function manipulatedimensions(tfmdata,key,value) local commands = { { "right", (width - oldwidth) / 2 }, { "slot", 1, private }, + -- { "slot", 0, private }, } if height > 0 then if depth > 0 then @@ -803,6 +804,7 @@ local function showboundingbox(tfmdata,key,value) black, pop, { "slot", 1, private }, + -- { "slot", 0, private }, } } else @@ -818,6 +820,7 @@ local function showboundingbox(tfmdata,key,value) black, pop, { "slot", 1, private }, + -- { "slot", 0, private }, } } end @@ -1271,7 +1274,9 @@ do -- another hack for a crappy font height = old_c.height, depth = old_c.depth, commands = { - { "slot", 1, private }, + -- { "slot", 1, private }, + -- { "slot", 0, private }, + { "char", private }, { "right", olditalic }, }, } diff --git a/tex/context/base/mkiv/font-fbk.lua b/tex/context/base/mkiv/font-fbk.lua index 3734e8071..60f1a1fdf 100644 --- a/tex/context/base/mkiv/font-fbk.lua +++ b/tex/context/base/mkiv/font-fbk.lua @@ -106,8 +106,9 @@ local function composecharacters(tfmdata) end local chr_t = cache[chr] if not chr_t then - chr_t = { "slot", 1, chr } - -- will be: chr_t = { "slot", 0, chr } + -- chr_t = { "slot", 1, chr } + -- chr_t = { "slot", 0, chr } + chr_t = { "char", chr } cache[chr] = chr_t end if charsacc then @@ -116,8 +117,9 @@ local function composecharacters(tfmdata) end local acc_t = cache[acc] if not acc_t then - acc_t = { "slot", 1, acc } - -- will be: acc_t = { "slot", 0, acc } + -- acc_t = { "slot", 1, acc } + -- acc_t = { "slot", 0, acc } + acc_t = { "char", acc } cache[acc] = acc_t end local cb = descriptions[chr].boundingbox diff --git a/tex/context/base/mkiv/font-mat.mkvi b/tex/context/base/mkiv/font-mat.mkvi index 6ce782ee3..0134f3fe6 100644 --- a/tex/context/base/mkiv/font-mat.mkvi +++ b/tex/context/base/mkiv/font-mat.mkvi @@ -21,6 +21,8 @@ \ifdefined\??fontinstancebasic \else \installcorenamespace{fontinstancebasic} \fi \ifdefined\??fontinstanceclass \else \installcorenamespace{fontinstanceclass} \fi +%D The order 3 2 1 of siuze matters: needed for math-fbk relative size storage! + %D \macros %D {textonly} %D diff --git a/tex/context/base/mkiv/font-vf.lua b/tex/context/base/mkiv/font-vf.lua index 401e84956..ded992850 100644 --- a/tex/context/base/mkiv/font-vf.lua +++ b/tex/context/base/mkiv/font-vf.lua @@ -117,7 +117,7 @@ local function combine_assign(g, name, from, to, start, force) for i=from,to do if fc[i] and (force or not gc[i]) then gc[i] = fastcopy(fc[i],true) -- can be optimized - gc[i].commands = { { 'slot', hn, start } } + gc[i].commands = { { "slot", hn, start } } gd[i] = fd[i] end start = start + 1 @@ -144,7 +144,7 @@ local function combine_names(g,name,force) for k, v in next, fc do if force or not gc[k] then gc[k] = fastcopy(v,true) - gc[k].commands = { { 'slot', hn, k } } + gc[k].commands = { { "slot", hn, k } } gd[i] = fd[i] end end diff --git a/tex/context/base/mkiv/math-act.lua b/tex/context/base/mkiv/math-act.lua index 69d85d01f..0aeca5106 100644 --- a/tex/context/base/mkiv/math-act.lua +++ b/tex/context/base/mkiv/math-act.lua @@ -272,6 +272,7 @@ target.properties.virtualized = true insert(character.commands,1,xoffset) end else + -- local slot = { "slot", 1, addprivate(target,nil,fastcopy(character)) } local slot = { "slot", 0, addprivate(target,nil,fastcopy(character)) } if xoffset and yoffset then character.commands = { xoffset, yoffset, slot } diff --git a/tex/context/base/mkiv/math-ali.mkiv b/tex/context/base/mkiv/math-ali.mkiv index 49a343ba0..1333b4770 100644 --- a/tex/context/base/mkiv/math-ali.mkiv +++ b/tex/context/base/mkiv/math-ali.mkiv @@ -33,20 +33,51 @@ \newtoks\t_math_align_b \newtoks\t_math_align_c +\newskip\d_math_eqalign_distance + +% \unexpanded\def\math_eqalign_distance +% {\tabskip\d_math_eqalign_distance} + +\unexpanded\def\math_eqalign_distance + {\relax + \ifdim\d_math_eqalign_distance>\zeropoint + \hskip\d_math_eqalign_distance + \fi + \mathalignmentparameter\c!separator + \relax} + \def\displayopenupvalue{.25\bodyfontsize} +% \def\math_build_eqalign +% {\scratchtoks\emptytoks +% \d_math_eqalign_distance\mathalignmentparameter\c!distance +% \dorecurse{\mathalignmentparameter\c!m}\math_build_eqalign_step +% \normalexpanded{\scratchtoks{\the\scratchtoks\the\t_math_align_c}}} + +% \unexpanded\def\math_build_eqalign_step % make sure no expansion in tracing +% {\ifnum\recurselevel>\plusone +% \scratchtoks\expandafter{\the\scratchtoks\math_eqalign_distance\aligntab\tabskip\zeropoint}% +% \fi +% \normalexpanded{\scratchtoks{\the\scratchtoks\the\t_math_align_a}}% +% \dorecurse{\numexpr\mathalignmentparameter\c!n-\plusone\relax} +% {\normalexpanded{\scratchtoks{\the\scratchtoks\the\t_math_align_b}}}} + \def\math_build_eqalign {\scratchtoks\emptytoks - \dorecurse{\mathalignmentparameter\c!m}\math_build_eqalign_step - \normalexpanded{\scratchtoks{\the\scratchtoks\the\t_math_align_c}}} - -\unexpanded\def\math_build_eqalign_step % make sure no expansion in tracing - {\ifnum\recurselevel>\plusone - \scratchtoks\expandafter{\the\scratchtoks\tabskip\mathalignmentparameter\c!distance\aligntab\tabskip\zeropoint}% - \fi + \d_math_eqalign_distance\mathalignmentparameter\c!distance + \scratchcounterone\mathalignmentparameter\c!m + \scratchcountertwo\mathalignmentparameter\c!n \normalexpanded{\scratchtoks{\the\scratchtoks\the\t_math_align_a}}% - \dorecurse{\numexpr\mathalignmentparameter\c!n-\plusone\relax} - {\normalexpanded{\scratchtoks{\the\scratchtoks\the\t_math_align_b}}}} + \scratchcounter\plusone + \dorecurse{\numexpr\scratchcounterone*\scratchcountertwo-\plusone\relax} + {\ifnum\scratchcounter=\scratchcountertwo + \scratchcounter\plusone + \scratchtoks\expandafter{\the\scratchtoks\math_eqalign_distance}% + \else + \advance\scratchcounter\plusone + \fi + \normalexpanded{\scratchtoks{\the\scratchtoks\the\t_math_align_b}}}% + \normalexpanded{\scratchtoks{\the\scratchtoks\the\t_math_align_c}}} \def\math_math_in_eqalign#1% {\startforceddisplaymath @@ -239,36 +270,50 @@ \newcount\c_math_eqalign_column \newtoks \everymathalignment +\newtoks \everymathalignmentdone -\def\math_alignment_NC_first#1\NR - {\glet\math_alignment_NC\math_alignment_NC_rest - \scratchtoks{\math_number_left_of_eqalign\aligntab#1\NR}% \math_number_left_of_eqalign not used yet - \dodoubleempty\math_alignment_NC_first_indeed} +\def\math_alignment_NN + {\dodirectdoubleempty\math_alignment_NN_indeed} -\def\math_alignment_NC_first_indeed[#1][#2]% - {\strc_formulas_place_number_nested{#1}{#2}\the\scratchtoks} +\def\math_alignment_NN_indeed[#1][#2]% + {\aligntab + \strc_formulas_place_number_nested{#1}{#2}} \def\math_alignment_NR + {\dodirectdoubleempty\math_alignment_NR_indeed} + +\def\math_alignment_NR_indeed[#1][#2]% {\aligntab \dostoptagged % finish cell + \strc_formulas_place_number_nested{#1}{#2}% \math_number_right_of_eqalign \crcr - \dostoptagged % finish row - \noalign{\glet\math_alignment_NC\math_alignment_NC_first}} % noalign used for change state, conditional does not work here + \dostoptagged} % finish row -\def\math_alignment_NC_rest +\def\math_alignment_NC {\aligntab} \def\math_alignment_EQ {\NC=} \appendtoks - \glet\math_alignment_NC\math_alignment_NC_first - \unexpanded\def\NC{\math_alignment_NC}% messy, due to lookahead (we cannot use a flag) - \let\EQ\math_alignment_EQ - \let\NR\math_alignment_NR + \pushmacro\NC + \pushmacro\NN + \pushmacro\EQ + \pushmacro\NR + \let\NC\math_alignment_NC + \let\NN\math_alignment_NN + \let\EQ\math_alignment_EQ + \let\NR\math_alignment_NR \to \everymathalignment +\appendtoks + \popmacro\NR + \popmacro\EQ + \popmacro\NN + \popmacro\NC +\to \everymathalignmentdone + \let\math_alignment_snap_start\relax \let\math_alignment_snap_stop \relax @@ -310,6 +355,7 @@ {\math_finish_eqalign_no \dostoptagged \dostoptagged + \the\everymathalignmentdone \math_alignment_snap_stop} \installcorenamespace{mathalignment} diff --git a/tex/context/base/mkiv/math-fbk.lua b/tex/context/base/mkiv/math-fbk.lua index 5a6a42e26..c8843ff1d 100644 --- a/tex/context/base/mkiv/math-fbk.lua +++ b/tex/context/base/mkiv/math-fbk.lua @@ -26,17 +26,13 @@ local lastmathids = fonts.hashes.lastmathids -- that order we could use their id's .. i.e. we could always add a font -- table with those id's .. in fact, we could also add a whole lot more -- as it doesn't hurt --- --- todo: use index 'true when luatex provides that feature (on the agenda) --- to be considered: --- --- in luatex provide reserve_id (and pass id as field of tfmdata) --- in context define three sizes but pass them later i.e. do virtualize afterwards +local scripscriptdelayed = { } -- 1.005 : add characters later +local scriptdelayed = { } -- 1.005 : add characters later function fallbacks.apply(target,original) local mathparameters = target.mathparameters - if not mathparameters then + if not mathparameters or not next(mathparameters) then return end -- we also have forcedsize ... at this moment we already passed through @@ -50,61 +46,53 @@ function fallbacks.apply(target,original) local size = parameters.size local usedfonts = target.fonts if not usedfonts then - usedfonts = { } + usedfonts = { { id = 0 } } -- we need at least one entry (automatically done anyway) target.fonts = usedfonts end - -- This is not okay yet ... we have no proper way to refer to 'self' - -- otherwise I will make my own id allocator). - local self = #usedfonts == 0 and font.nextid() or nil -- will be true + -- not used local textid, scriptid, scriptscriptid local textindex, scriptindex, scriptscriptindex local textdata, scriptdata, scriptscriptdata if mathsize == 3 then -- scriptscriptsize - -- textid = nil -- self - -- scriptid = nil -- no smaller - -- scriptscriptid = nil -- no smaller - textid = self - scriptid = self - scriptscriptid = self + textid = 0 + scriptid = 0 + scriptscriptid = 0 elseif mathsize == 2 then -- scriptsize - -- textid = nil -- self - textid = self - scriptid = lastmathids[3] - scriptscriptid = lastmathids[3] + textid = 0 + scriptid = lastmathids[3] or 0 + scriptscriptid = lastmathids[3] or 0 else -- textsize - -- textid = nil -- self - textid = self - scriptid = lastmathids[2] - scriptscriptid = lastmathids[3] + textid = 0 + scriptid = lastmathids[2] or 0 + scriptscriptid = lastmathids[3] or 0 end - if textid then + if textid and textid ~= 0 then textindex = #usedfonts + 1 + textdata = target usedfonts[textindex] = { id = textid } - -- textdata = identifiers[textid] or target - textdata = target else textdata = target end - if scriptid then + if scriptid and scriptid ~= 0 then scriptindex = #usedfonts + 1 + scriptdata = identifiers[scriptid] usedfonts[scriptindex] = { id = scriptid } - scriptdata = identifiers[scriptid] else scriptindex = textindex scriptdata = textdata end - if scriptscriptid then + if scriptscriptid and scriptscriptid ~= 0 then scriptscriptindex = #usedfonts + 1 + scriptscriptdata = identifiers[scriptscriptid] usedfonts[scriptscriptindex] = { id = scriptscriptid } - scriptscriptdata = identifiers[scriptscriptid] else scriptscriptindex = scriptindex scriptscriptdata = scriptdata end - -- report_fallbacks("used textid: %S, used script id: %S, used scriptscript id: %S",textid,scriptid,scriptscriptid) + -- report_fallbacks("used textid: %S, used script id: %S, used scriptscript id: %S",textid,scriptid,scriptscriptid) local data = { textdata = textdata, scriptdata = scriptdata, @@ -123,7 +111,7 @@ function fallbacks.apply(target,original) mathsize = mathsize, } target.mathrelation = data - -- inspect(usedfonts) + -- for k, v in next, virtualcharacters do if not characters[k] then local tv = type(v) @@ -166,7 +154,7 @@ end local function raised(data,down) local replacement = data.replacement - local character = data.scriptdata.characters[replacement] + local character = data.scriptdata.characters[replacement] if character then return { width = character.width, @@ -175,6 +163,7 @@ local function raised(data,down) commands = { { "down", down and data.size/4 or -data.size/2 }, -- maybe exheight reference(data.scriptindex,replacement) + -- { "slot", data.scriptindex or 0, char } -- hm, data.mathrelation.scriptindex } } end @@ -239,27 +228,27 @@ end local addextra = mathematics.extras.add addextra(0xFE350, { - category="sm", - description="MATHEMATICAL DOUBLE ARROW LEFT END", - mathclass="relation", - mathname="ctxdoublearrowfillleftend", - unicodeslot=0xFE350, + category = "sm", + description = "MATHEMATICAL DOUBLE ARROW LEFT END", + mathclass = "relation", + mathname = "ctxdoublearrowfillleftend", + unicodeslot = 0xFE350, } ) addextra(0xFE351, { - category="sm", - description="MATHEMATICAL DOUBLE ARROW MIDDLE PART", - mathclass="relation", - mathname="ctxdoublearrowfillmiddlepart", - unicodeslot=0xFE351, + category = "sm", + description = "MATHEMATICAL DOUBLE ARROW MIDDLE PART", + mathclass = "relation", + mathname = "ctxdoublearrowfillmiddlepart", + unicodeslot = 0xFE351, } ) addextra(0xFE352, { - category="sm", - description="MATHEMATICAL DOUBLE ARROW RIGHT END", - mathclass="relation", - mathname="ctxdoublearrowfillrightend", - unicodeslot=0xFE352, + category = "sm", + description = "MATHEMATICAL DOUBLE ARROW RIGHT END", + mathclass = "relation", + mathname = "ctxdoublearrowfillrightend", + unicodeslot = 0xFE352, } ) local push = { "push" } @@ -267,6 +256,9 @@ local pop = { "pop" } local leftarrow = { "char", 0x2190 } local relbar = { "char", 0x2212 } local rightarrow = { "char", 0x2192 } +-- local leftarrow = { "slot", 0, 0x2190 } +-- local relbar = { "slot", 0, 0x2212 } +-- local rightarrow = { "slot", 0, 0x2192 } virtualcharacters[0xFE350] = function(data) -- return combined(data,0x2190,0x2212) -- leftarrow relbar @@ -353,6 +345,7 @@ local function accent_to_extensible(target,newchr,original,oldchr,height,depth,s local correction = swap and { "down", (olddata.height or 0) - height } or { "down", olddata.height + (offset or 0)} local newdata = { commands = { correction, { "slot", 1, oldchr } }, + -- commands = { correction, { "slot", 0, oldchr } }, width = olddata.width, height = height, depth = depth, @@ -365,6 +358,7 @@ local function accent_to_extensible(target,newchr,original,oldchr,height,depth,s if oldnextdata then local newnextdata = { commands = { correction, { "slot", 1, nextglyph } }, + -- commands = { correction, { "slot", 0, nextglyph } }, width = oldnextdata.width, height = height, depth = depth, @@ -395,6 +389,7 @@ local function accent_to_extensible(target,newchr,original,oldchr,height,depth,s if olddata then local newdata = { commands = { correction, { "slot", 1, oldglyph } }, + -- commands = { correction, { "slot", 0, oldglyph } }, width = olddata.width, height = height, depth = depth, @@ -525,43 +520,64 @@ virtualcharacters[0xFE303] = function(data) return smashed(data,0x0303,0xFE303) -- these primes in fonts are a real mess .. kind of a dead end, so don't wonder about -- the values below --- local function smashed(data,unicode,optional) --- local oldchar = data.characters[unicode] --- if oldchar then --- local xheight = data.target.parameters.xheight --- local height = 1.25 * xheight --- local shift = oldchar.height - height --- local newchar = { --- commands = { --- { "down", shift }, +local function smashed(data,unicode,optional) + local oldchar = data.characters[unicode] + if oldchar then + -- local height = 1.25 * data.target.parameters.xheight + local height = 0.85 * data.target.mathparameters.AccentBaseHeight + local shift = oldchar.height - height + local newchar = { + commands = { + { "down", shift }, + { "slot", 0, unicode }, -- { "char", unicode }, --- }, --- height = height, --- width = oldchar.width, --- } --- return newchar --- elseif not optional then --- report_fallbacks("missing %U prime in font %a",unicode,data.target.properties.fullname) --- end --- end - --- addextra(0xFE932, { description = "SMASHED PRIME 0x02032", unicodeslot = 0xFE932 } ) --- addextra(0xFE933, { description = "SMASHED PRIME 0x02033", unicodeslot = 0xFE933 } ) --- addextra(0xFE934, { description = "SMASHED PRIME 0x02034", unicodeslot = 0xFE934 } ) --- addextra(0xFE957, { description = "SMASHED PRIME 0x02057", unicodeslot = 0xFE957 } ) - --- addextra(0xFE935, { description = "SMASHED BACKWARD PRIME 0x02035", unicodeslot = 0xFE935 } ) --- addextra(0xFE936, { description = "SMASHED BACKWARD PRIME 0x02036", unicodeslot = 0xFE936 } ) --- addextra(0xFE937, { description = "SMASHED BACKWARD PRIME 0x02037", unicodeslot = 0xFE937 } ) + }, + height = height, + width = oldchar.width, + } + return newchar + elseif not optional then + report_fallbacks("missing %U prime in font %a",unicode,data.target.properties.fullname) + end +end --- virtualcharacters[0xFE932] = function(data) return smashed(data,0x02032) end --- virtualcharacters[0xFE933] = function(data) return smashed(data,0x02033) end --- virtualcharacters[0xFE934] = function(data) return smashed(data,0x02034) end --- virtualcharacters[0xFE957] = function(data) return smashed(data,0x02057) end +addextra(0xFE932, { description = "SMASHED PRIME 0x02032", unicodeslot = 0xFE932 } ) +addextra(0xFE933, { description = "SMASHED PRIME 0x02033", unicodeslot = 0xFE933 } ) +addextra(0xFE934, { description = "SMASHED PRIME 0x02034", unicodeslot = 0xFE934 } ) +addextra(0xFE957, { description = "SMASHED PRIME 0x02057", unicodeslot = 0xFE957 } ) + +addextra(0xFE935, { description = "SMASHED BACKWARD PRIME 0x02035", unicodeslot = 0xFE935 } ) +addextra(0xFE936, { description = "SMASHED BACKWARD PRIME 0x02036", unicodeslot = 0xFE936 } ) +addextra(0xFE937, { description = "SMASHED BACKWARD PRIME 0x02037", unicodeslot = 0xFE937 } ) + +virtualcharacters[0xFE932] = function(data) return smashed(data,0x02032) end +virtualcharacters[0xFE933] = function(data) return smashed(data,0x02033) end +virtualcharacters[0xFE934] = function(data) return smashed(data,0x02034) end +virtualcharacters[0xFE957] = function(data) return smashed(data,0x02057) end + +virtualcharacters[0xFE935] = function(data) return smashed(data,0x02035,true) end +virtualcharacters[0xFE936] = function(data) return smashed(data,0x02036,true) end +virtualcharacters[0xFE937] = function(data) return smashed(data,0x02037,true) end + +function mathematics.getridofprime(target,original) +-- local mathsize = specification.mathsize +-- if mathsize == 1 or mathsize == 2 or mathsize == 3) then + local mathparameters = original.mathparameters + if mathparameters and next(mathparameters) then + local changed = original.changed + if changed then + changed[0x02032] = nil + changed[0x02033] = nil + changed[0x02034] = nil + changed[0x02057] = nil + changed[0x02035] = nil + changed[0x02036] = nil + changed[0x02037] = nil + end + end +end --- virtualcharacters[0xFE935] = function(data) return smashed(data,0x02035,true) end --- virtualcharacters[0xFE936] = function(data) return smashed(data,0x02036,true) end --- virtualcharacters[0xFE937] = function(data) return smashed(data,0x02037,true) end +utilities.sequencers.appendaction("beforecopyingcharacters","system","mathematics.getridofprime") -- actuarian (beware: xits has an ugly one) diff --git a/tex/context/base/mkiv/math-ini.mkiv b/tex/context/base/mkiv/math-ini.mkiv index 8c682bdcb..351b18044 100644 --- a/tex/context/base/mkiv/math-ini.mkiv +++ b/tex/context/base/mkiv/math-ini.mkiv @@ -1043,6 +1043,11 @@ \catcode\circumflexasciicode\activecatcode \catcode\ampersandasciicode \activecatcode + \unexpanded\gdef\obeymathcatcodes + {\let _\normalsubscript + \let ^\normalsuperscript + \let &\normalmathaligntab} + \doglobal \appendtoks \let _\normalsubscript \let ^\normalsuperscript diff --git a/tex/context/base/mkiv/math-noa.lua b/tex/context/base/mkiv/math-noa.lua index 8b1fa87fd..abc5337c6 100644 --- a/tex/context/base/mkiv/math-noa.lua +++ b/tex/context/base/mkiv/math-noa.lua @@ -1525,30 +1525,30 @@ mathpairs[0x222C] = { [0x222B] = 0x222D } mathpairs[0x007C] = { [0x007C] = 0x2016, [0x2016] = 0x2980 } -- bar+bar=double bar+double=triple mathpairs[0x2016] = { [0x007C] = 0x2980, [0x02B9] = 0x2016 } -- double+bar=triple --- local movesub = { --- -- primes --- [0x2032] = 0xFE932, --- [0x2033] = 0xFE933, --- [0x2034] = 0xFE934, --- [0x2057] = 0xFE957, --- -- reverse primes --- [0x2035] = 0xFE935, --- [0x2036] = 0xFE936, --- [0x2037] = 0xFE937, --- } - local movesub = { -- primes - [0x2032] = 0x2032, - [0x2033] = 0x2033, - [0x2034] = 0x2034, - [0x2057] = 0x2057, + [0x2032] = 0xFE932, + [0x2033] = 0xFE933, + [0x2034] = 0xFE934, + [0x2057] = 0xFE957, -- reverse primes - [0x2035] = 0x2035, - [0x2036] = 0x2036, - [0x2037] = 0x2037, + [0x2035] = 0xFE935, + [0x2036] = 0xFE936, + [0x2037] = 0xFE937, } +-- local movesub = { +-- -- primes +-- [0x2032] = 0x2032, +-- [0x2033] = 0x2033, +-- [0x2034] = 0x2034, +-- [0x2057] = 0x2057, +-- -- reverse primes +-- [0x2035] = 0x2035, +-- [0x2036] = 0x2036, +-- [0x2037] = 0x2037, +-- } + -- inner under over vcenter local validpair = { @@ -1563,38 +1563,48 @@ local validpair = { [noad_opnolimits] = true, } -local function movesubscript(parent,current_nucleus,current_char) +local options_supported = tokens.defined("Unosuperscript") + +local function fixsupscript(parent,current,current_char,new_char) + if new_char ~= current_char and new_char ~= true then + setchar(current,new_char) + if trace_collapsing then + report_collapsing("fixing subscript, replacing supscript %U by %U",current_char,new_char) + end + else + if trace_collapsing then + report_collapsing("fixing subscript, supscript %U",current_char) + end + end + if options_supported then + setfield(parent,"options",0x08+0x22) + end +end + +local function movesubscript(parent,current_nucleus,current_char,new_char) local prev = getprev(parent) if prev and getid(prev) == math_noad then local psup = getsup(prev) local psub = getsub(prev) if not psup and not psub then -- {f} {'}_n => f_n^' - -- setchar(current_nucleus,movesub[current_char or getchar(current_nucleus)]) + fixsupscript(prev,current_nucleus,current_char,new_char) local nucleus = getnucleus(parent) local sub = getsub(parent) - local sup = getsup(parent) setsup(prev,nucleus) setsub(prev,sub) local dummy = copy_node(nucleus) setchar(dummy,0) setnucleus(parent,dummy) setsub(parent) - if trace_collapsing then - report_collapsing("fixing subscript") - end elseif not psup then -- {f} {'}_n => f_n^' - -- setchar(current_nucleus,movesub[current_char or getchar(current_nucleus)]) + fixsupscript(prev,current_nucleus,current_char,new_char) local nucleus = getnucleus(parent) - local sup = getsup(parent) setsup(prev,nucleus) local dummy = copy_node(nucleus) setchar(dummy,0) setnucleus(parent,dummy) - if trace_collapsing then - report_collapsing("fixing subscript") - end end end end @@ -1605,7 +1615,9 @@ local function collapsepair(pointer,what,n,parent,nested) -- todo: switch to tur local current_nucleus = getnucleus(parent) if getid(current_nucleus) == math_char then local current_char = getchar(current_nucleus) - if not getsub(parent) and not getsup(parent) then + local p_sub = getsub(parent) + local p_sup = getsup(parent) + if not p_sub and not p_sup then local mathpair = mathpairs[current_char] if mathpair then local next_noad = getnext(parent) @@ -1642,24 +1654,26 @@ local function collapsepair(pointer,what,n,parent,nested) -- todo: switch to tur flush_node(next_noad) collapsepair(pointer,what,n,parent,true) end --- elseif not nested and movesub[current_char] then --- movesubscript(parent,current_nucleus,current_char) end end end --- elseif not nested and movesub[current_char] then --- movesubscript(parent,current_nucleus,current_char) end --- elseif not nested and movesub[current_char] then --- movesubscript(parent,current_nucleus,current_char) end --- elseif not nested and movesub[current_char] then --- movesubscript(parent,current_nucleus,current_char) + elseif p_sup then + if getid(p_sup) == math_char then + local current_char = getchar(p_sup) + local new_char = movesub[current_char] + if new_char then + fixsupscript(parent,p_sup,current_char,new_char) + end + end + return + end + local current_char = getchar(current_nucleus) + local new_char = movesub[current_char] + if new_char then + movesubscript(parent,current_nucleus,current_char,new_char) end -local current_char = getchar(current_nucleus) -if movesub[current_char] then - movesubscript(parent,current_nucleus,current_char) -end end end end diff --git a/tex/context/base/mkiv/mult-prm.lua b/tex/context/base/mkiv/mult-prm.lua index 956f83636..b55ac229d 100644 --- a/tex/context/base/mkiv/mult-prm.lua +++ b/tex/context/base/mkiv/mult-prm.lua @@ -226,6 +226,8 @@ return { "Ustopmath", "Usubscript", "Usuperscript", + "Unosubscript", + "Unosuperscript", "Uunderdelimiter", "Uvextensible", "adjustspacing", @@ -671,6 +673,8 @@ return { "Ustopmath", "Usubscript", "Usuperscript", + "Unosubscript", + "Unosuperscript", "Uunderdelimiter", "Uvextensible", "above", diff --git a/tex/context/base/mkiv/status-files.pdf b/tex/context/base/mkiv/status-files.pdf index eb8c1fec7..74381a37e 100644 Binary files a/tex/context/base/mkiv/status-files.pdf and b/tex/context/base/mkiv/status-files.pdf differ diff --git a/tex/context/base/mkiv/status-lua.pdf b/tex/context/base/mkiv/status-lua.pdf index 011c188be..13bb888c4 100644 Binary files a/tex/context/base/mkiv/status-lua.pdf and b/tex/context/base/mkiv/status-lua.pdf differ diff --git a/tex/context/base/mkiv/supp-mat.mkiv b/tex/context/base/mkiv/supp-mat.mkiv index b265a7c5a..176233ae5 100644 --- a/tex/context/base/mkiv/supp-mat.mkiv +++ b/tex/context/base/mkiv/supp-mat.mkiv @@ -314,4 +314,9 @@ % \def\startdisplay{\displaybreak\ignorespaces\startpacked} % \def\stopdisplay {\stoppacked\displaybreak\ignorespaces} +\let\superscript \Usuperscript +\let\subscript \Usubscript +\let\nosuperscript\Unosuperscript +\let\nosubscript \Unosubscript + \protect \endinput diff --git a/tex/context/base/mkiv/syst-aux.mkiv b/tex/context/base/mkiv/syst-aux.mkiv index eb5b3b90a..956cfa9f3 100644 --- a/tex/context/base/mkiv/syst-aux.mkiv +++ b/tex/context/base/mkiv/syst-aux.mkiv @@ -7476,3 +7476,9 @@ % \appendtovaluelist{mylist}{mies} % % \showvalue{mylist} + +% \unexpanded\def\showtokenlist#1% +% {\begingroup +% \edef\tempstring{\the#1}% +% \tx\ttbf\string#1: \tttf\meaning\tempstring +% \endgroup} diff --git a/tex/context/interface/mkiv/context-en.xml b/tex/context/interface/mkiv/context-en.xml index 7a861c30e..14845416f 100644 --- a/tex/context/interface/mkiv/context-en.xml +++ b/tex/context/interface/mkiv/context-en.xml @@ -21182,6 +21182,9 @@ + + + diff --git a/tex/context/interface/mkiv/i-context.pdf b/tex/context/interface/mkiv/i-context.pdf index 068bac6cb..d5f0fd8ac 100644 Binary files a/tex/context/interface/mkiv/i-context.pdf and b/tex/context/interface/mkiv/i-context.pdf differ diff --git a/tex/context/interface/mkiv/i-mathalignment.xml b/tex/context/interface/mkiv/i-mathalignment.xml index bae4d3d50..af70e3f17 100644 --- a/tex/context/interface/mkiv/i-mathalignment.xml +++ b/tex/context/interface/mkiv/i-mathalignment.xml @@ -27,6 +27,9 @@ + + + diff --git a/tex/context/interface/mkiv/i-readme.pdf b/tex/context/interface/mkiv/i-readme.pdf index 5c189abd8..7a90285ae 100644 Binary files a/tex/context/interface/mkiv/i-readme.pdf and b/tex/context/interface/mkiv/i-readme.pdf differ diff --git a/tex/generic/context/luatex/luatex-fonts-merged.lua b/tex/generic/context/luatex/luatex-fonts-merged.lua index 6c5a87a9d..69d39090e 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 : 06/04/17 16:55:09 +-- merge date : 06/06/17 13:22:11 do -- begin closure to overcome local limits and interference @@ -7783,9 +7783,6 @@ function constructors.scale(tfmdata,specification) local defaultheight=resources.defaultheight or 0 local defaultdepth=resources.defaultdepth or 0 local units=parameters.units or 1000 - if target.fonts then - target.fonts=fastcopy(target.fonts) - end targetproperties.language=properties.language or "dflt" targetproperties.script=properties.script or "dflt" targetproperties.mode=properties.mode or "base" @@ -7863,6 +7860,12 @@ function constructors.scale(tfmdata,specification) local realdimensions=properties.realdimensions local writingmode=properties.writingmode or "horizontal" local identity=properties.identity or "horizontal" + local vfonts=target.fonts + if vfonts and #vfonts>0 then + target.fonts=fastcopy(vfonts) + elseif isvirtual then + target.fonts={ { id=0 } } + end if changed and not next(changed) then changed=false end @@ -8175,6 +8178,18 @@ function constructors.scale(tfmdata,specification) properties.setitalics=hasitalics constructors.aftercopyingcharacters(target,tfmdata) constructors.trytosharefont(target,tfmdata) + local vfonts=target.fonts + if isvirtual then + if not vfonts or #vfonts==0 then + target.fonts={ { id=0 } } + end + elseif vfonts then + properties.virtualized=true + target.type="virtual" + if #vfonts==0 then + target.fonts={ { id=0 } } + end + end return target end function constructors.finalize(tfmdata) @@ -30953,8 +30968,6 @@ function definers.loadfont(specification) end return tfmdata end -function constructors.checkvirtualids() -end function constructors.readanddefine(name,size) local specification=definers.analyze(name,size) local method=specification.method @@ -30968,7 +30981,6 @@ function constructors.readanddefine(name,size) local tfmdata=definers.loadfont(specification) if tfmdata then tfmdata.properties.hash=hash - constructors.checkvirtualids(tfmdata) id=font.define(tfmdata) definers.register(tfmdata,id) else diff --git a/tex/generic/context/luatex/luatex-math.tex b/tex/generic/context/luatex/luatex-math.tex index 6edc6f74b..6669b5ffc 100644 --- a/tex/generic/context/luatex/luatex-math.tex +++ b/tex/generic/context/luatex/luatex-math.tex @@ -2,8 +2,8 @@ %D [ file=luatex-math, %D version=2013.04.29, %D title=\LUATEX\ Support Macros, -%D subtitle=An exmaple of math, -%D author=Hans Hagen, +%D subtitle=An example of math, +%D author={Hans Hagen & Bruno Voisin}, %D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] %D This module is in no way a complete plain math implementation. I made this file @@ -838,7 +838,69 @@ } \everymathtt {% - % not done + \Umathcode"0030="0"0"1D7F6% + \Umathcode"0031="0"0"1D7F7% + \Umathcode"0032="0"0"1D7F8% + \Umathcode"0033="0"0"1D7F9% + \Umathcode"0034="0"0"1D7FA% + \Umathcode"0035="0"0"1D7FB% + \Umathcode"0036="0"0"1D7FC% + \Umathcode"0037="0"0"1D7FD% + \Umathcode"0038="0"0"1D7FE% + \Umathcode"0039="0"0"1D7FF% + \Umathcode"0041="0"0"1D670% + \Umathcode"0042="0"0"1D671% + \Umathcode"0043="0"0"1D672% + \Umathcode"0044="0"0"1D673% + \Umathcode"0045="0"0"1D674% + \Umathcode"0046="0"0"1D675% + \Umathcode"0047="0"0"1D676% + \Umathcode"0048="0"0"1D677% + \Umathcode"0049="0"0"1D678% + \Umathcode"004A="0"0"1D679% + \Umathcode"004B="0"0"1D67A% + \Umathcode"004C="0"0"1D67B% + \Umathcode"004D="0"0"1D67C% + \Umathcode"004E="0"0"1D67D% + \Umathcode"004F="0"0"1D67E% + \Umathcode"0050="0"0"1D67F% + \Umathcode"0051="0"0"1D680% + \Umathcode"0052="0"0"1D681% + \Umathcode"0053="0"0"1D682% + \Umathcode"0054="0"0"1D683% + \Umathcode"0055="0"0"1D684% + \Umathcode"0056="0"0"1D685% + \Umathcode"0057="0"0"1D686% + \Umathcode"0058="0"0"1D687% + \Umathcode"0059="0"0"1D688% + \Umathcode"005A="0"0"1D689% + \Umathcode"0061="0"0"1D68A% + \Umathcode"0062="0"0"1D68B% + \Umathcode"0063="0"0"1D68C% + \Umathcode"0064="0"0"1D68D% + \Umathcode"0065="0"0"1D68E% + \Umathcode"0066="0"0"1D68F% + \Umathcode"0067="0"0"1D690% + \Umathcode"0068="0"0"1D691% + \Umathcode"0069="0"0"1D692% + \Umathcode"006A="0"0"1D693% + \Umathcode"006B="0"0"1D694% + \Umathcode"006C="0"0"1D695% + \Umathcode"006D="0"0"1D696% + \Umathcode"006E="0"0"1D697% + \Umathcode"006F="0"0"1D698% + \Umathcode"0070="0"0"1D699% + \Umathcode"0071="0"0"1D69A% + \Umathcode"0072="0"0"1D69B% + \Umathcode"0073="0"0"1D69C% + \Umathcode"0074="0"0"1D69D% + \Umathcode"0075="0"0"1D69E% + \Umathcode"0076="0"0"1D69F% + \Umathcode"0077="0"0"1D6A0% + \Umathcode"0078="0"0"1D6A1% + \Umathcode"0079="0"0"1D6A2% + \Umathcode"007A="0"0"1D6A3% + \relax } % Nothing special here: @@ -2234,6 +2296,20 @@ \def\k#1{#1^^^^0328} % not in plain \def\b#1{#1^^^^0331} +\def\*{\discretionary{\thinspace\the\textfont0\char"00D7}{}{}} + +\def\t#1% bruno's variant: + {\iffontchar\font"0361\relax + #1^^^^0361\relax + \else\iffontchar\font"2040\relax + \accent"2040 #1\relax + \else + \begingroup + \edef\next{\the\font}% + \the\textfont0\accent"2040\next#1\relax + \endgroup + \fi\fi} + % for Bruno, when he tests this file with xetex: \ifdefined\directlua \else -- cgit v1.2.3