diff options
Diffstat (limited to 'otfl-math-ext.lua')
-rw-r--r-- | otfl-math-ext.lua | 155 |
1 files changed, 155 insertions, 0 deletions
diff --git a/otfl-math-ext.lua b/otfl-math-ext.lua new file mode 100644 index 0000000..fd65592 --- /dev/null +++ b/otfl-math-ext.lua @@ -0,0 +1,155 @@ +if not modules then modules = { } end modules ['math-ext'] = { + version = 1.001, + comment = "companion to math-ini.mkiv", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +local trace_virtual = false trackers.register("math.virtual", function(v) trace_virtual = v end) + +mathematics = mathematics or { } +characters = characters or { } + +mathematics.extras = mathematics.extras or { } +characters.math = characters.math or { } + +local chardata = characters.data +local mathdata = characters.math + +function mathematics.extras.add(unicode,t) + local min, max = mathematics.extrabase, mathematics.privatebase - 1 + if unicode >= min and unicode <= max then + mathdata[unicode], chardata[unicode] = t, t + else + logs.report("math extra","extra U+%04X should be in range U+%04X - U+%04X",unicode,min,max) + end +end + +function mathematics.extras.copy(tfmdata) + local math_parameters = tfmdata.math_parameters + local MathConstants = tfmdata.MathConstants + if (math_parameters and next(math_parameters)) or (MathConstants and next(MathConstants)) then + local characters = tfmdata.characters + for unicode, extradesc in next, mathdata do + -- always, because in an intermediate step we can have a non math font + local extrachar = characters[unicode] + local nextinsize = extradesc.nextinsize + if nextinsize then + for i=1,#nextinsize do + local nextslot = nextinsize[i] + local nextbase = characters[nextslot] + if nextbase then + local nextnext = nextbase and nextbase.next + if nextnext then + local nextchar = characters[nextnext] + if nextchar then + if trace_virtual then + logs.report("math extra","extra U+%04X in %s at %s maps on U+%04X (class: %s, name: %s)",unicode,file.basename(tfmdata.fullname),tfmdata.size,nextslot,extradesc.mathclass or "?",extradesc.mathname or "?") + end + characters[unicode] = nextchar + break + end + end + end + end + if not characters[unicode] then + for i=1,#nextinsize do + local nextbase = characters[nextinsize[i]] + if nextbase then + characters[unicode] = nextchar + break + end + end + end + end + end + else + -- let's not waste time on non-math + end +end + +table.insert(fonts.tfm.mathactions,mathematics.extras.copy) + +-- 0xFE302 -- 0xFE320 for accents + +mathematics.extras.add(0xFE302, { + category="mn", + description="WIDE MATHEMATICAL HAT", + direction="nsm", + linebreak="cm", + mathclass="accent", + mathname="widehat", + mathstretch="h", + unicodeslot=0xFE302, + nextinsize={ 0x00302, 0x0005E }, +} ) + +mathematics.extras.add(0xFE303, { + category="mn", + cjkwd="a", + description="WIDE MATHEMATICAL TILDE", + direction="nsm", + linebreak="cm", + mathclass="accent", + mathname="widetilde", + mathstretch="h", + unicodeslot=0xFE303, + nextinsize={ 0x00303, 0x0007E }, +} ) + +-- 0xFE321 -- 0xFE340 for missing characters + +mathematics.extras.add(0xFE321, { + category="sm", + description="MATHEMATICAL SHORT BAR", +-- direction="on", +-- linebreak="nu", + mathclass="relation", + mathname="mapstochar", + unicodeslot=0xFE321, +} ) + +mathematics.extras.add(0xFE322, { + category="sm", + description="MATHEMATICAL LEFT HOOK", + mathclass="relation", + mathname="lhook", + unicodeslot=0xFE322, +} ) + +mathematics.extras.add(0xFE323, { + category="sm", + description="MATHEMATICAL RIGHT HOOK", + mathclass="relation", + mathname="rhook", + unicodeslot=0xFE323, +} ) + +--~ mathematics.extras.add(0xFE304, { +--~ category="sm", +--~ description="TOP AND BOTTOM PARENTHESES", +--~ direction="on", +--~ linebreak="al", +--~ mathclass="doubleaccent", +--~ mathname="doubleparent", +--~ unicodeslot=0xFE304, +--~ accents={ 0x023DC, 0x023DD }, +--~ } ) + +--~ mathematics.extras.add(0xFE305, { +--~ category="sm", +--~ description="TOP AND BOTTOM BRACES", +--~ direction="on", +--~ linebreak="al", +--~ mathclass="doubleaccent", +--~ mathname="doublebrace", +--~ unicodeslot=0xFE305, +--~ accents={ 0x023DE, 0x023DF }, +--~ } ) + +--~ \Umathchardef\braceld="0 "1 "FF07A +--~ \Umathchardef\bracerd="0 "1 "FF07B +--~ \Umathchardef\bracelu="0 "1 "FF07C +--~ \Umathchardef\braceru="0 "1 "FF07D + |