diff options
Diffstat (limited to 'Master/texmf-dist/tex/context/base/mkiv/good-mth.lua')
-rw-r--r-- | Master/texmf-dist/tex/context/base/mkiv/good-mth.lua | 169 |
1 files changed, 158 insertions, 11 deletions
diff --git a/Master/texmf-dist/tex/context/base/mkiv/good-mth.lua b/Master/texmf-dist/tex/context/base/mkiv/good-mth.lua index 18a97976fd3..3473cc205c4 100644 --- a/Master/texmf-dist/tex/context/base/mkiv/good-mth.lua +++ b/Master/texmf-dist/tex/context/base/mkiv/good-mth.lua @@ -6,8 +6,9 @@ if not modules then modules = { } end modules ['good-mth'] = { license = "see context related readme files" } -local type, next = type, next +local type, next, tonumber, unpack = type, next, tonumber, unpack local ceil = math.ceil +local match = string.match local fonts = fonts @@ -20,6 +21,10 @@ local fontgoodies = fonts.goodies or { } local fontcharacters = fonts.hashes.characters +local trace_defining = false trackers.register("math.defining", function(v) trace_defining = v end) + +local report_math = logs.reporter("mathematics","initializing") + local nuts = nodes.nuts local setlink = nuts.setlink @@ -33,11 +38,149 @@ local new_vlist = nodepool.vlist local insert_node_after = nuts.insert_after +local helpers = fonts.helpers +local upcommand = helpers.commands.up +local rightcommand = helpers.commands.right +local charcommand = helpers.commands.char +local prependcommands = helpers.prependcommands + -- experiment, we have to load the definitions immediately as they precede -- the definition so they need to be initialized in the typescript +local function withscriptcode(tfmdata,unicode,data,action) + if type(unicode) == "string" then + local p, u = match(unicode,"^(.-):(.-)$") + if u then + u = tonumber(u) + if u then + local slots = fonts.helpers.mathscriptslots(tfmdata,u) + if slots then + if p == "*" then + action(u,data) + for i=1,#slots do + action(slots[i],data) + end + else + p = tonumber(p) + if p then + action(slots[p],data) + end + end + end + end + end + else + action(unicode,data) + end +end + local function finalize(tfmdata,feature,value) - mathematics.overloaddimensions(tfmdata,tfmdata,value) +-- if tfmdata.mathparameters then -- funny, cambria text has this + local goodies = tfmdata.goodies + if goodies then + local virtualized = mathematics.virtualized + for i=1,#goodies do + local goodie = goodies[i] + local mathematics = goodie.mathematics + local dimensions = mathematics and mathematics.dimensions + if dimensions then + if trace_defining then + report_math("overloading dimensions in %a @ %p",tfmdata.properties.fullname,tfmdata.parameters.size) + end + local characters = tfmdata.characters + local descriptions = tfmdata.descriptions + local parameters = tfmdata.parameters + local factor = parameters.factor + local hfactor = parameters.hfactor + local vfactor = parameters.vfactor + local function overloadone(unicode,data) + local character = characters[unicode] + if not character then + local c = virtualized[unicode] + if c then + character = characters[c] + end + end + if character then + local width = data.width + local height = data.height + local depth = data.depth + if trace_defining and (width or height or depth) then + report_math("overloading dimensions of %C, width %p, height %p, depth %p", + unicode,width or 0,height or 0,depth or 0) + end + if width then character.width = width * hfactor end + if height then character.height = height * vfactor end + if depth then character.depth = depth * vfactor end + -- + local xoffset = data.xoffset + local yoffset = data.yoffset + if xoffset == "llx" then + local d = descriptions[unicode] + if d then + xoffset = - d.boundingbox[1] * hfactor + character.width = character.width + xoffset + xoffset = rightcommand[xoffset] + else + xoffset = nil + end + elseif xoffset and xoffset ~= 0 then + xoffset = rightcommand[xoffset * hfactor] + else + xoffset = nil + end + if yoffset and yoffset ~= 0 then + yoffset = upcommand[yoffset * vfactor] + else + yoffset = nil + end + if xoffset or yoffset then + local commands = characters.commands + if commands then + prependcommands(commands,yoffset,xoffset) + else + local slot = charcommand[unicode] + if xoffset and yoffset then + character.commands = { xoffset, yoffset, slot } + elseif xoffset then + character.commands = { xoffset, slot } + else + character.commands = { yoffset, slot } + end + end + end + elseif trace_defining then + report_math("no overloading dimensions of %C, not in font",unicode) + end + end + local function overload(dimensions) + for unicode, data in next, dimensions do + withscriptcode(tfmdata,unicode,data,overloadone) + end + end + if value == nil then + value = { "default" } + end + if value == "all" or value == true then + for name, value in next, dimensions do + overload(value) + end + else + if type(value) == "string" then + value = utilities.parsers.settings_to_array(value) + end + if type(value) == "table" then + for i=1,#value do + local d = dimensions[value[i]] + if d then + overload(d) + end + end + end + end + end + end + end end registerotffeature { @@ -58,7 +201,7 @@ local function initialize(goodies) local maplines = mathgoodies.maplines if virtuals then for name, specification in next, virtuals do - -- beware, they are all constructed + -- beware, they are all constructed ... we should be more selective mathematics.makefont(name,specification,goodies) end end @@ -77,10 +220,11 @@ end fontgoodies.register("mathematics", initialize) -local enabled = false directives.register("fontgoodies.mathkerning",function(v) enabled = v end) +-- local enabled = false directives.register("fontgoodies.mathkerning",function(v) enabled = v end) local function initialize(tfmdata) - if enabled and tfmdata.mathparameters then -- funny, cambria text has this +-- if enabled and tfmdata.mathparameters then -- funny, cambria text has this + if tfmdata.mathparameters then -- funny, cambria text has this local goodies = tfmdata.goodies if goodies then local characters = tfmdata.characters @@ -91,12 +235,15 @@ local function initialize(tfmdata) if mathgoodies then local kerns = mathgoodies.kerns if kerns then - for unicode, specification in next, kerns do + local function kernone(unicode,data) local chardata = characters[unicode] - if chardata and (not chardata.mathkerns or specification.force) then - chardata.mathkerns = specification + if chardata and (not chardata.mathkerns or data.force) then + chardata.mathkerns = data end end + for unicode, data in next, kerns do + withscriptcode(tfmdata,unicode,data,kernone) + end return end end @@ -109,9 +256,9 @@ local function initialize(tfmdata) end registerotffeature { - name = "mathkerns", - description = "math kerns", - default = true, + name = "mathkerns", + description = "math kerns", + -- default = true, initializers = { base = initialize, node = initialize, |