if not modules then modules = { } end modules ['good-mth'] = { version = 1.000, comment = "companion to font-lib.mkiv", author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", copyright = "PRAGMA ADE / ConTeXt Development Team", license = "see context related readme files" } local type, next, tonumber, unpack = type, next, tonumber, unpack local ceil = math.ceil local match = string.match local fonts = fonts local trace_goodies = false trackers.register("fonts.goodies", function(v) trace_goodies = v end) local report_goodies = logs.reporter("fonts","goodies") local registerotffeature = fonts.handlers.otf.features.register 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 use_math_goodies = true directives.register("math.nogoodies", function(v) use_math_goodies = not v end) local report_math = logs.reporter("mathematics","initializing") local nuts = nodes.nuts local setlink = nuts.setlink local nodepool = nuts.pool local new_kern = nodepool.kern local new_glyph = nodepool.glyph local new_hlist = nodepool.hlist local new_vlist = nodepool.vlist local insertnodeafter = nuts.insertafter local function initialize(goodies) local mathgoodies = goodies.mathematics if mathgoodies then local virtuals = mathgoodies.virtuals local mapfiles = mathgoodies.mapfiles local maplines = mathgoodies.maplines if virtuals then for name, specification in next, virtuals do -- beware, they are all constructed ... we should be more selective mathematics.makefont(name,specification,goodies) end end if mapfiles then for i=1,#mapfiles do fonts.mappings.loadfile(mapfiles[i]) -- todo: backend function end end if maplines then for i=1,#maplines do fonts.mappings.loadline(maplines[i]) -- todo: backend function end end end end fontgoodies.register("mathematics", initialize) -- This is used in the koeieletters font: local function mathradicalaction(n,h,v,font,mchar,echar) local characters = fontcharacters[font] local mchardata = characters[mchar] local echardata = characters[echar] local ewidth = echardata.width local mwidth = mchardata.width local delta = h - ewidth local glyph = new_glyph(font,echar) local head = glyph if delta > 0 then local count = ceil(delta/mwidth) local kern = (delta - count * mwidth) / count for i=1,count do local k = new_kern(kern) local g = new_glyph(font,mchar) setlink(k,head) setlink(g,k) head = g end end local height = mchardata.height local list = new_hlist(head) local kern = new_kern(height-v) list = setlink(kern,list) local list = new_vlist(kern) insertnodeafter(n,n,list) end local function mathhruleaction(n,h,v,font,bchar,mchar,echar) local characters = fontcharacters[font] local bchardata = characters[bchar] local mchardata = characters[mchar] local echardata = characters[echar] local bwidth = bchardata.width local mwidth = mchardata.width local ewidth = echardata.width local delta = h - ewidth - bwidth local glyph = new_glyph(font,echar) local head = glyph if delta > 0 then local count = ceil(delta/mwidth) local kern = (delta - count * mwidth) / (count+1) for i=1,count do local k = new_kern(kern) local g = new_glyph(font,mchar) setlink(k,head) setlink(g,k) head = g end local k = new_kern(kern) setlink(k,head) head = k end local g = new_glyph(font,bchar) setlink(g,head) head = g local height = mchardata.height local list = new_hlist(head) local kern = new_kern(height-v) list = setlink(kern,list) local list = new_vlist(kern) insertnodeafter(n,n,list) end local function initialize(tfmdata) local goodies = tfmdata.goodies if goodies then local resources = tfmdata.resources local ruledata = { } for i=1,#goodies do local mathematics = goodies[i].mathematics if mathematics then local rules = mathematics.rules if rules then for tag, name in next, rules do ruledata[tag] = name end end end end if next(ruledata) then local characters = tfmdata.characters local unicodes = resources.unicodes if characters and unicodes then local mathruleactions = resources.mathruleactions if not mathruleactions then mathruleactions = { } resources.mathruleactions = mathruleactions end -- local mchar = unicodes[ruledata["radical.extender"] or false] local echar = unicodes[ruledata["radical.end"] or false] if mchar and echar then mathruleactions.radicalaction = function(n,h,v,font) mathradicalaction(n,h,v,font,mchar,echar) end end -- local bchar = unicodes[ruledata["hrule.begin"] or false] local mchar = unicodes[ruledata["hrule.extender"] or false] local echar = unicodes[ruledata["hrule.end"] or false] if bchar and mchar and echar then mathruleactions.hruleaction = function(n,h,v,font) mathhruleaction(n,h,v,font,bchar,mchar,echar) end end -- not that nice but we need to register it at the tex end -- context.enablemathrules("\\fontclass") end end end end registerotffeature { name = "mathrules", description = "check math rules", default = true, initializers = { base = initialize, node = initialize, } }