diff options
Diffstat (limited to 'Master/texmf-dist/tex/context/base/mkiv/math-ext.lua')
-rw-r--r-- | Master/texmf-dist/tex/context/base/mkiv/math-ext.lua | 197 |
1 files changed, 197 insertions, 0 deletions
diff --git a/Master/texmf-dist/tex/context/base/mkiv/math-ext.lua b/Master/texmf-dist/tex/context/base/mkiv/math-ext.lua new file mode 100644 index 00000000000..b00d6cde273 --- /dev/null +++ b/Master/texmf-dist/tex/context/base/mkiv/math-ext.lua @@ -0,0 +1,197 @@ +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) + +local basename = file.basename + +local mathematics = mathematics +local characters = characters + +local report_math = logs.reporter("mathematics") + +mathematics.extras = mathematics.extras or { } +local extras = mathematics.extras + +characters.math = characters.math or { } +local mathdata = characters.math +local chardata = characters.data + +function extras.add(unicode,t) -- todo: if already stored ... + local min, max = mathematics.extrabase, mathematics.privatebase - 1 + -- if mathdata[unicode] or chardata[unicode] then + -- report_math("extra %U overloads existing character",unicode) + -- end + if unicode >= min and unicode <= max then + mathdata[unicode], chardata[unicode] = t, t + else + report_math("extra %U should be in range %U - %U",unicode,min,max) + end +end + +function extras.copy(target,original) + local characters = target.characters + local properties = target.properties + local parameters = target.parameters + 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 + local first = 1 + local charused = unicode + if not extrachar then + for i=1,#nextinsize do + local slot = nextinsize[i] + extrachar = characters[slot] + if extrachar then + characters[unicode] = extrachar + first = i + 1 + charused = slot + break + end + end + end + if not extrachar then + if trace_virtual then + report_math("extra %U in %a at %p with class %a and name %a is not mapped", + unicode,basename(properties.fullname),parameters.size, + extradesc.mathclass,extradesc.mathname) + end + elseif not extrachar.next then + local nextused = false + for i=first,#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 + extrachar.next = nextchar + nextused = nextslot + break + end + end + end + end + if trace_virtual then + if nextused then + report_math("extra %U in %a at %p with class %a and name %a maps onto %U with next %U", + unicode,basename(properties.fullname),parameters.size,charused, + extradesc.mathclass,extradesc.mathname,nextused) + else + report_math("extra %U in %a at %p with class %a and name %a maps onto %U with no next", + unicode,basename(properties.fullname),parameters.size,charused, + extradesc.mathclass,extradesc.mathname) + end + end + else + if trace_virtual then + report_math("extra %U in %a at %p with class %a and name %a maps onto %U with no next", -- own next + unicode,basename(properties.fullname),parameters.size,charused, + extradesc.mathclass,extradesc.mathname) + end + end + end + end +end + +utilities.sequencers.appendaction(mathactions,"system","mathematics.extras.copy") + +-- 0xFE302 -- 0xFE320 for accents (gone with new lm/gyre) +-- +-- extras.add(0xFE302, { +-- category="mn", +-- description="WIDE MATHEMATICAL HAT", +-- direction="nsm", +-- linebreak="cm", +-- mathclass="topaccent", +-- mathname="widehat", +-- mathstretch="h", +-- unicodeslot=0xFE302, +-- nextinsize={ 0x00302, 0x0005E }, +-- } ) +-- +-- extras.add(0xFE303, { +-- category="mn", +-- cjkwd="a", +-- description="WIDE MATHEMATICAL TILDE", +-- direction="nsm", +-- linebreak="cm", +-- mathclass="topaccent", +-- mathname="widetilde", +-- mathstretch="h", +-- unicodeslot=0xFE303, +-- nextinsize={ 0x00303, 0x0007E }, +-- } ) + +-- 0xFE321 -- 0xFE340 for missing characters + +extras.add(0xFE321, { + category="sm", + description="MATHEMATICAL SHORT BAR", + -- direction="on", + -- linebreak="nu", + mathclass="relation", + mathname="mapstochar", + unicodeslot=0xFE321, +} ) + +extras.add(0xFE322, { + category="sm", + description="MATHEMATICAL LEFT HOOK", + mathclass="relation", + mathname="lhook", + unicodeslot=0xFE322, +} ) + +extras.add(0xFE323, { + category="sm", + description="MATHEMATICAL RIGHT HOOK", + mathclass="relation", + mathname="rhook", + unicodeslot=0xFE323, +} ) + +extras.add(0xFE324, { + category="sm", + description="MATHEMATICAL SHORT BAR MIRRORED", +-- direction="on", +-- linebreak="nu", + mathclass="relation", + mathname="mapsfromchar", + unicodeslot=0xFE324, +} ) + +--~ extras.add(0xFE304, { +--~ category="sm", +--~ description="TOP AND BOTTOM PARENTHESES", +--~ direction="on", +--~ linebreak="al", +--~ mathclass="doubleaccent", +--~ mathname="doubleparent", +--~ unicodeslot=0xFE304, +--~ accents={ 0x023DC, 0x023DD }, +--~ } ) + +--~ 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 |