diff options
Diffstat (limited to 'tex/context/base/mkxl/math-noa.lmt')
-rw-r--r-- | tex/context/base/mkxl/math-noa.lmt | 144 |
1 files changed, 98 insertions, 46 deletions
diff --git a/tex/context/base/mkxl/math-noa.lmt b/tex/context/base/mkxl/math-noa.lmt index e035a9f68..02f425542 100644 --- a/tex/context/base/mkxl/math-noa.lmt +++ b/tex/context/base/mkxl/math-noa.lmt @@ -458,7 +458,15 @@ local checked = { } -- simple case local tracked = false trackers.register("fonts.missing", function(v) tracked = v end) local cached = setmetatableindex("table") -- complex case +local variantselectors = { + [0xFE00] = true, + [0xFE01] = true +} + local function errorchar(font,char) + if variantselectors[char] then + return char + end local done = unknowns[char] if done then unknowns[char] = done + 1 @@ -1810,7 +1818,7 @@ end do - -- is validpair stil needed? + -- is validpair stil needed? why not always now? local a_mathcollapsing = privateattribute("mathcollapsing") local collapse = { } @@ -2011,61 +2019,86 @@ do end --- variants +-- variants (upgraded for script too) do - local variants = { } - local validvariants = { -- fast check on valid - [0x2229] = 0xFE00, [0x222A] = 0xFE00, - [0x2268] = 0xFE00, [0x2269] = 0xFE00, - [0x2272] = 0xFE00, [0x2273] = 0xFE00, - [0x228A] = 0xFE00, [0x228B] = 0xFE00, - [0x2293] = 0xFE00, [0x2294] = 0xFE00, - [0x2295] = 0xFE00, - [0x2297] = 0xFE00, - [0x229C] = 0xFE00, - [0x22DA] = 0xFE00, [0x22DB] = 0xFE00, - [0x2A3C] = 0xFE00, [0x2A3D] = 0xFE00, - [0x2A9D] = 0xFE00, [0x2A9E] = 0xFE00, - [0x2AAC] = 0xFE00, [0x2AAD] = 0xFE00, - [0x2ACB] = 0xFE00, [0x2ACC] = 0xFE00, - } + local variants = { } + local chardata = characters.data + local a_variant = privateattribute("mathvariant") + + local function setvariant(pointer,selector,char) + local tfmdata = fontdata[getfont(pointer)] + local mathvariants = tfmdata.resources.variants -- and variantdata / can be a hash + if mathvariants then + mathvariants = mathvariants[selector] + if mathvariants then + local variant = mathvariants[char] + if variant then + setchar(pointer,variant) + setattr(pointer,a_exportstatus,char) -- we don't export the variant as it's visual markup + if trace_variants then + report_variants("variant (%U,%U) replaced by %U",char,selector,variant) + end + else + if trace_variants then + report_variants("no variant (%U,%U)",char,selector) + end + end + end + end + end variants[mathchar_code] = function(pointer,what,n,parent) -- also set export value local char = getchar(pointer) - local selector = validvariants[char] - if selector then - local next = getnext(parent) - if next and getid(next) == noad_code then - local nucleus = getnucleus(next) - if nucleus and getid(nucleus) == mathchar_code and getchar(nucleus) == selector then - local variant - local tfmdata = fontdata[getfont(pointer)] - local mathvariants = tfmdata.resources.variants -- and variantdata - if mathvariants then - mathvariants = mathvariants[selector] - if mathvariants then - variant = mathvariants[char] + local data = chardata[char] + if data then + local variants = data.variants + if variants then + local next = getnext(parent) + if next and getid(next) == noad_code then + local nucleus = getnucleus(next) + if nucleus and getid(nucleus) == mathchar_code then + local selector = getchar(nucleus) + if variants[selector] then + setvariant(pointer,selector,char) + setprev(next,pointer) + setnext(parent,getnext(next)) + flushnode(next) end end - if variant then - setchar(pointer,variant) - setattr(pointer,a_exportstatus,char) -- we don't export the variant as it's visual markup - if trace_variants then - report_variants("variant (%U,%U) replaced by %U",char,selector,variant) - end - else - if trace_variants then - report_variants("no variant (%U,%U)",char,selector) - end + end + local selector = getattr(pointer,a_variant) + if selector and variants[selector] then + setvariant(pointer,selector,char) + end + end + end + end + + function mathematics.addvariant(tfmdata,char,variant,selector) + if char and variant and selector then + local data = chardata[char] + if data then + local variants = data.variants + if variants and variants[selector] then + local resources = tfmdata.resources + local variants = resources.variants -- and variantdata + if not variants then + variants = { } + resources.variants = variants end - setprev(next,pointer) - setnext(parent,getnext(next)) - flushnode(next) + local selectors = variants[selector] + if not selectors then + selectors = { } + variants[selector] = selectors + end + selectors[char] = variant + return true end end end + return false end function handlers.variants(head,style,penalties) @@ -2073,6 +2106,25 @@ do return true -- not needed end + local valid = { + calligraphic = 0xFE00, + calligraphy = 0xFE00, + script = 0xFE01, + handwriting = 0xFE01, + } + + function mathematics.setvariant(s) + texsetattribute(a_variant,valid[s] or unsetvalue) + end + + implement { + name = "setmathvariant", + public = true, + protected = true, + arguments = "string", + actions = mathematics.setvariant, + } + end -- for manuals @@ -2335,9 +2387,9 @@ local actions = tasks.actions("math") -- head, style, penalties local starttiming, stoptiming = statistics.starttiming, statistics.stoptiming -function processors.mlisttohlist(head,style,penalties) +function processors.mlisttohlist(head,style,penalties,beginclass,endclass) starttiming(noads) - head = actions(head,style,penalties) + head = actions(head,style,penalties,beginclass,endclass) stoptiming(noads) return head end |