if not modules then modules = { } end modules ['math-vfu'] = { version = 1.001, comment = "companion to math-ini.tex", author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", copyright = "PRAGMA ADE / ConTeXt Development Team", license = "see context related readme files" } -- All these math vectors .. thanks to Aditya and Mojca they become -- better and better. local type, next = type, next local trace_virtual = false trackers.register("math.virtual", function(v) trace_virtual = v end) local trace_timings = false trackers.register("math.timings", function(v) trace_timings = v end) fonts.enc.math = fonts.enc.math or { } local shared = { } fonts.vf.math = fonts.vf.math or { } fonts.vf.math.optional = false local push, pop, back = { "push" }, { "pop" }, { "slot", 1, 0x2215 } local function negate(main,unicode,basecode) local characters = main.characters if not characters[unicode] then local basechar = characters[basecode] if basechar then local ht, wd = basechar.height, basechar.width characters[unicode] = { width = wd, height = ht, depth = basechar.depth, italic = basechar.italic, kerns = basechar.kerns, commands = { { "slot", 1, basecode }, push, { "down", ht/5}, { "right", - wd/2}, back, push, } } end end end --~ \Umathchardef\braceld="0 "1 "FF07A --~ \Umathchardef\bracerd="0 "1 "FF07B --~ \Umathchardef\bracelu="0 "1 "FF07C --~ \Umathchardef\braceru="0 "1 "FF07D local function brace(main,unicode,first,rule,left,right,rule,last) local characters = main.characters if not characters[unicode] then characters[unicode] = { horiz_variants = { { extender = 0, glyph = first }, { extender = 1, glyph = rule }, { extender = 0, glyph = left }, { extender = 0, glyph = right }, { extender = 1, glyph = rule }, { extender = 0, glyph = last }, } } end end local function arrow(main,unicode,arrow,minus,isleft) if isleft then t = { { extender = 0, glyph = arrow }, { extender = 1, glyph = minus }, } else t = { { extender = 0, glyph = minus }, { extender = 1, glyph = arrow }, } end --~ main.characters[unicode] = { horiz_variants = t } main.characters[unicode].horiz_variants = t end local function parent(main,unicode,first,rule,last) local characters = main.characters if not characters[unicode] then characters[unicode] = { horiz_variants = { { extender = 0, glyph = first }, { extender = 1, glyph = rule }, { extender = 0, glyph = last }, } } end end local push, pop, step = { "push" }, { "pop" }, 0.2 -- 0.1 is nicer but gives larger files local function make(main,id,size,n,m) local characters = main.characters local xu = main.parameters.x_height + 0.3*size local xd = 0.3*size local old, upslot, dnslot, uprule, dnrule = 0xFF000+n, 0xFF100+n, 0xFF200+n, 0xFF300+m, 0xFF400+m local c = characters[old] if c then local w, h, d = c.width, c.height, c.depth local thickness = h - d local rulewidth = step*size -- we could use an overlap local slot = { "slot", id, old } local rule = { "rule", thickness, rulewidth } local up = { "down", -xu } local dn = { "down", xd } local ht, dp = xu + 3*thickness, 0 if not characters[uprule] then characters[uprule] = { width = rulewidth, height = ht, depth = dp, commands = { push, up, rule, pop } } end characters[upslot] = { width = w, height = ht, depth = dp, commands = { push, up, slot, pop } } local ht, dp = 0, xd + 3*thickness if not characters[dnrule] then characters[dnrule] = { width = rulewidth, height = ht, depth = dp, commands = { push, dn, rule, pop } } end characters[dnslot] = { width = w, height = ht, depth = dp, commands = { push, dn, slot, pop } } end end local function minus(main,id,size,unicode) local characters = main.characters local mu = size/18 local minus = characters[0x002D] local width = minus.width - 5*mu characters[unicode] = { width = width, height = minus.height, depth = minus.depth, commands = { push, { "right", -3*mu }, { "slot", id, 0x002D }, pop } } end local function dots(main,id,size,unicode) local characters = main.characters local c = characters[0x002E] local w, h, d = c.width, c.height, c.depth local mu = size/18 local right3mu = { "right", 3*mu } local right1mu = { "right", 1*mu } local up1size = { "down", -.1*size } local up4size = { "down", -.4*size } local up7size = { "down", -.7*size } local right2muw = { "right", 2*mu + w } local slot = { "slot", id, 0x002E } if unicode == 0x22EF then local c = characters[0x022C5] if c then local w, h, d = c.width, c.height, c.depth local slot = { "slot", id, 0x022C5 } characters[unicode] = { width = 3*w + 2*3*mu, height = h, depth = d, commands = { push, slot, right3mu, slot, right3mu, slot, pop } } end elseif unicode == 0x22EE then -- weird height ! characters[unicode] = { width = w, height = h+(1.4)*size, depth = 0, commands = { push, push, slot, pop, up4size, push, slot, pop, up4size, slot, pop } } elseif unicode == 0x22F1 then characters[unicode] = { width = 3*w + 6*size/18, height = 1.5*size, depth = 0, commands = { push, right1mu, push, up7size, slot, pop, right2muw, push, up4size, slot, pop, right2muw, push, up1size, slot, pop, right1mu, pop } } elseif unicode == 0x22F0 then characters[unicode] = { width = 3*w + 6*size/18, height = 1.5*size, depth = 0, commands = { push, right1mu, push, up1size, slot, pop, right2muw, push, up4size, slot, pop, right2muw, push, up7size, slot, pop, right1mu, pop } } else characters[unicode] = { width = 3*w + 2*3*mu, height = h, depth = d, commands = { push, slot, right3mu, slot, right3mu, slot, pop } } end end function fonts.vf.math.alas(main,id,size) for i=0x7A,0x7D do make(main,id,size,i,1) end brace (main,0x23DE,0xFF17A,0xFF301,0xFF17D,0xFF17C,0xFF301,0xFF17B) brace (main,0x23DF,0xFF27C,0xFF401,0xFF27B,0xFF27A,0xFF401,0xFF27D) parent(main,0x23DC,0xFF17A,0xFF301,0xFF17B) parent(main,0x23DD,0xFF27C,0xFF401,0xFF27D) negate(main,0x2260,0x003D) dots(main,id,size,0x2026) -- ldots dots(main,id,size,0x22EE) -- vdots dots(main,id,size,0x22EF) -- cdots dots(main,id,size,0x22F1) -- ddots dots(main,id,size,0x22F0) -- udots minus(main,id,size,0xFF501) arrow(main,0x2190,0xFE190,0xFF501,true) -- left arrow(main,0x2192,0xFE192,0xFF501,false) -- right end local reverse -- index -> unicode function fonts.basecopy(tfmtable) local t, c, p = { }, { }, { } for k, v in next, tfmtable do t[k] = v end for k, v in next, tfmtable.characters do c[k] = v end for k, v in next, tfmtable.parameters do p[k] = v end t.characters, t.parameters = c, p return t end local reported = { } function fonts.vf.math.define(specification,set) if not reverse then reverse = { } for k, v in next, fonts.enc.math do local r = { } for u, i in next, v do r[i] = u end reverse[k] = r end end local name = specification.name -- symbolic name local size = specification.size -- given size local fnt, lst, main = { }, { }, nil local start = (trace_virtual or trace_timings) and os.clock() --~ texio.write_nl("defining font " .. name .. " " .. size) local okset, n = { }, 0 for s=1,#set do local ss = set[s] local ssname = ss.name if ss.optional and fonts.vf.math.optional then if trace_virtual then logs.report("math virtual","loading font %s subfont %s with name %s at %s is skipped",name,s,ssname,size) end else if ss.features then ssname = ssname .. "*" .. ss.features end if ss.main then main = s end local f, id = fonts.tfm.read_and_define(ssname,size) if not f then logs.report("math virtual","loading font %s subfont %s with name %s at %s is skipped, not found",name,s,ssname,size) else n = n + 1 okset[n] = ss fnt[n] = f lst[n] = { id = id, size = size } if not shared[s] then shared[n] = { } end if trace_virtual then logs.report("math virtual","loading font %s subfont %s with name %s at %s as id %s using encoding %s",name,s,ssname,size,id,ss.vector or "none") end end end end -- beware, fnt[1] is already passed to tex (we need to make a simple copy then .. todo) main = fonts.basecopy(fnt[1]) main.name, main.fonts, main.virtualized, main.math_parameters = name, lst, true, { } local characters, descriptions = main.characters, main.descriptions main.parameters.x_height = main.parameters.x_height or 0 for s=1,n do local ss, fs = okset[s], fnt[s] if not fs then -- skip, error elseif ss.optional and fonts.vf.math.optional then -- skip, redundant else local mm, fp = main.math_parameters, fs.parameters if ss.extension then mm.math_x_height = fp.x_height or 0 -- math_x_height height of x mm.default_rule_thickness = fp[ 8] or 0 -- default_rule_thickness thickness of \over bars mm.big_op_spacing1 = fp[ 9] or 0 -- big_op_spacing1 minimum clearance above a displayed op mm.big_op_spacing2 = fp[10] or 0 -- big_op_spacing2 minimum clearance below a displayed op mm.big_op_spacing3 = fp[11] or 0 -- big_op_spacing3 minimum baselineskip above displayed op mm.big_op_spacing4 = fp[12] or 0 -- big_op_spacing4 minimum baselineskip below displayed op mm.big_op_spacing5 = fp[13] or 0 -- big_op_spacing5 padding above and below displayed limits -- logs.report("math virtual","loading and virtualizing font %s at size %s, setting ex parameters",name,size) elseif ss.parameters then main.parameters.x_height = fp.x_height or main.parameters.x_height mm.x_height = mm.x_height or fp.x_height or 0 -- x_height height of x mm.num1 = fp[ 8] or 0 -- num1 numerator shift-up in display styles mm.num2 = fp[ 9] or 0 -- num2 numerator shift-up in non-display, non-\atop mm.num3 = fp[10] or 0 -- num3 numerator shift-up in non-display \atop mm.denom1 = fp[11] or 0 -- denom1 denominator shift-down in display styles mm.denom2 = fp[12] or 0 -- denom2 denominator shift-down in non-display styles mm.sup1 = fp[13] or 0 -- sup1 superscript shift-up in uncramped display style mm.sup2 = fp[14] or 0 -- sup2 superscript shift-up in uncramped non-display mm.sup3 = fp[15] or 0 -- sup3 superscript shift-up in cramped styles mm.sub1 = fp[16] or 0 -- sub1 subscript shift-down if superscript is absent mm.sub2 = fp[17] or 0 -- sub2 subscript shift-down if superscript is present mm.sup_drop = fp[18] or 0 -- sup_drop superscript baseline below top of large box mm.sub_drop = fp[19] or 0 -- sub_drop subscript baseline below bottom of large box mm.delim1 = fp[20] or 0 -- delim1 size of \atopwithdelims delimiters in display styles mm.delim2 = fp[21] or 0 -- delim2 size of \atopwithdelims delimiters in non-displays mm.axis_height = fp[22] or 0 -- axis_height height of fraction lines above the baseline -- logs.report("math virtual","loading and virtualizing font %s at size %s, setting sy parameters",name,size) end local vectorname = ss.vector if vectorname then local offset = 0xFF000 local vector = fonts.enc.math[vectorname] local rotcev = reverse[vectorname] if vector then local fc, fd, si = fs.characters, fs.descriptions, shared[s] local skewchar = ss.skewchar for unicode, index in next, vector do local fci = fc[index] if not fci then local fontname = fs.name local rf = reported[fontname] if not rf then rf = { } reported[fontname] = rf end local rv = rf[vectorname] if not rv then rv = { } rf[vectorname] = rv end local ru = rv[unicode] if not ru then logs.report("math virtual", "unicode point U+%05X has no index %04X in vector %s for font %s",unicode,index,vectorname,fontname) rv[unicode] = true end else local ref = si[index] if not ref then ref = { { 'slot', s, index } } si[index] = ref end local kerns = fci.kerns if kerns then local width = fci.width local krn = { } for k=1,#kerns do local rk = rotcev[k] if rk then krn[rk] = kerns[k] end end if not next(krn) then krn = nil end local t = { width = width, height = fci.height, depth = fci.depth, italic = fci.italic, kerns = krn, commands = ref, } if skewchar and kerns then local k = kerns[skewchar] if k then t.top_accent = width/2 + k end end characters[unicode] = t else characters[unicode] = { width = fci.width, height = fci.height, depth = fci.depth, italic = fci.italic, commands = ref, } end end end if ss.extension then -- todo: if multiple ex, then 256 offsets per instance local extension = fonts.enc.math["large-to-small"] local variants_done = fs.variants_done for index, fci in next, fc do -- the raw ex file if type(index) == "number" then local ref = si[index] if not ref then ref = { { 'slot', s, index } } si[index] = ref end local t = { width = fci.width, height = fci.height, depth = fci.depth, italic = fci.italic, commands = ref, } local n = fci.next if n then t.next = offset + n elseif variants_done then local vv = fci.vert_variants if vv then t.vert_variants = vv end local hv = fci.horiz_variants if hv then t.horiz_variants = hv end else local vv = fci.vert_variants if vv then for i=1,#vv do local vvi = vv[i] vvi.glyph = vvi.glyph + offset end t.vert_variants = vv end local hv = fci.horiz_variants if hv then for i=1,#hv do local hvi = hv[i] hvi.glyph = hvi.glyph + offset end t.horiz_variants = hv end end characters[offset + index] = t end end fs.variants_done = true for unicode, index in next, extension do local cu = characters[unicode] if cu then cu.next = offset + index --~ local n, c, d = unicode, cu, { } --~ print("START", unicode) --~ while n do --~ n = c.next --~ if n then --~ print("NEXT", n) --~ c = characters[n] --~ if not c then --~ print("EXIT") --~ elseif d[n] then --~ print("LOOP") --~ break --~ end --~ d[n] = true --~ end --~ end else local fci = fc[index] local ref = si[index] if not ref then ref = { { 'slot', s, index } } si[index] = ref end local kerns = fci.kerns if kerns then local krn = { } for k=1,#kerns do krn[offset + k] = kerns[k] end characters[unicode] = { width = fci.width, height = fci.height, depth = fci.depth, italic = fci.italic, commands = ref, kerns = krn, next = offset + index, } else characters[unicode] = { width = fci.width, height = fci.height, depth = fci.depth, italic = fci.italic, commands = ref, next = offset + index, } end end end end end end mathematics.extras.copy(main) --not needed here (yet) end end lst[#lst+1] = { id = font.nextid(), size = size } fonts.vf.math.alas(main,#lst,size) if trace_virtual or trace_timings then logs.report("math virtual","loading and virtualizing font %s at size %s took %0.3f seconds",name,size,os.clock()-start) end main.has_italic = true main.type = "virtual" -- not needed mathematics.scaleparameters(main,main,1) main.nomath = false return main end function mathematics.make_font(name, set) fonts.define.methods[name] = function(specification) return fonts.vf.math.define(specification,set) end end -- varphi is part of the alphabet, contrary to the other var*s' fonts.enc.math["large-to-small"] = { [0x00028] = 0x00, -- ( [0x00029] = 0x01, -- ) [0x0005B] = 0x02, -- [ [0x0005D] = 0x03, -- ] [0x0230A] = 0x04, -- lfloor [0x0230B] = 0x05, -- rfloor [0x02308] = 0x06, -- lceil [0x02309] = 0x07, -- rceil [0x0007B] = 0x08, -- { [0x0007D] = 0x09, -- } [0x027E8] = 0x0A, -- < [0x027E9] = 0x0B, -- > [0x0007C] = 0x0C, -- | --~ [0x0] = 0x0D, -- lVert rVert Vert -- [0x0002F] = 0x0E, -- / [0x0005C] = 0x0F, -- \ --~ [0x0] = 0x3A, -- lgroup --~ [0x0] = 0x3B, -- rgroup --~ [0x0] = 0x3C, -- arrowvert --~ [0x0] = 0x3D, -- Arrowvert [0x02195] = 0x3F, -- updownarrow --~ [0x0] = 0x40, -- lmoustache --~ [0x0] = 0x41, -- rmoustache [0x0221A] = 0x70, -- sqrt [0x021D5] = 0x77, -- Updownarrow [0x02191] = 0x78, -- uparrow [0x02193] = 0x79, -- downarrow [0x021D1] = 0x7E, -- Uparrow [0x021D3] = 0x7F, -- Downarrow [0x0220F] = 0x59, -- prod [0x02210] = 0x61, -- coprod [0x02211] = 0x58, -- sum [0x0222B] = 0x5A, -- intop [0x0222E] = 0x49, -- ointop [0xFE302] = 0x62, -- widehat [0xFE303] = 0x65, -- widetilde [0x022C0] = 0x5E, -- bigwedge [0x022C1] = 0x5F, -- bigvee [0x022C2] = 0x5C, -- bigcap [0x022C3] = 0x5B, -- bigcup [0x02044] = 0x0E, -- / } fonts.enc.math["tex-ex"] = { [0x0220F] = 0x51, -- prod [0x0222B] = 0x52, -- intop [0x02210] = 0x60, -- coprod [0x02211] = 0x50, -- sum [0x022C0] = 0x56, -- bigwedge [0x022C1] = 0x57, -- bigvee [0x022C2] = 0x54, -- bigcap [0x022C3] = 0x53, -- bigcup [0x02A04] = 0x55, -- biguplus [0x02A02] = 0x4E, -- bigotimes [0x02A01] = 0x4C, -- bigoplus [0x02A03] = 0x4A, -- bigodot [0x0222E] = 0x48, -- ointop [0x02A06] = 0x46, -- bigsqcup } -- only math stuff is needed, since we always use an lm or gyre -- font as main font fonts.enc.math["tex-mr"] = { [0x00393] = 0x00, -- Gamma [0x00394] = 0x01, -- Delta [0x00398] = 0x02, -- Theta [0x0039B] = 0x03, -- Lambda [0x0039E] = 0x04, -- Xi [0x003A0] = 0x05, -- Pi [0x003A3] = 0x06, -- Sigma [0x003A5] = 0x07, -- Upsilon [0x003A6] = 0x08, -- Phi [0x003A8] = 0x09, -- Psi [0x003A9] = 0x0A, -- Omega -- [0x00060] = 0x12, -- [math]grave -- [0x000B4] = 0x13, -- [math]acute -- [0x002C7] = 0x14, -- [math]check -- [0x002D8] = 0x15, -- [math]breve -- [0x000AF] = 0x16, -- [math]bar -- [0x00021] = 0x21, -- ! -- [0x00028] = 0x28, -- ( -- [0x00029] = 0x29, -- ) -- [0x0002B] = 0x2B, -- + -- [0x0002F] = 0x2F, -- / -- [0x0003A] = 0x3A, -- : -- [0x02236] = 0x3A, -- colon -- [0x0003B] = 0x3B, -- ; -- [0x0003C] = 0x3C, -- < -- [0x0003D] = 0x3D, -- = -- [0x0003E] = 0x3E, -- > -- [0x0003F] = 0x3F, -- ? [0x00391] = 0x41, -- Alpha [0x00392] = 0x42, -- Beta [0x02145] = 0x44, [0x00395] = 0x45, -- Epsilon [0x00397] = 0x48, -- Eta [0x00399] = 0x49, -- Iota [0x0039A] = 0x4B, -- Kappa [0x0039C] = 0x4D, -- Mu [0x0039D] = 0x4E, -- Nu [0x0039F] = 0x4F, -- Omicron [0x003A1] = 0x52, -- Rho [0x003A4] = 0x54, -- Tau [0x003A7] = 0x58, -- Chi [0x00396] = 0x5A, -- Zeta -- [0x0005B] = 0x5B, -- [ -- [0x0005D] = 0x5D, -- ] -- [0x0005E] = 0x5E, -- [math]hat -- the text one [0x00302] = 0x5E, -- [math]hat -- the real math one -- [0x002D9] = 0x5F, -- [math]dot [0x02146] = 0x64, [0x02147] = 0x65, -- [0x002DC] = 0x7E, -- [math]tilde -- the text one [0x00303] = 0x7E, -- [math]tilde -- the real one -- [0x000A8] = 0x7F, -- [math]ddot } fonts.enc.math["tex-mi"] = { [0x1D6E4] = 0x00, -- Gamma [0x1D6E5] = 0x01, -- Delta [0x1D6E9] = 0x02, -- Theta [0x1D6F3] = 0x02, -- varTheta (not present in TeX) [0x1D6EC] = 0x03, -- Lambda [0x1D6EF] = 0x04, -- Xi [0x1D6F1] = 0x05, -- Pi [0x1D6F4] = 0x06, -- Sigma [0x1D6F6] = 0x07, -- Upsilon [0x1D6F7] = 0x08, -- Phi [0x1D6F9] = 0x09, -- Psi [0x1D6FA] = 0x0A, -- Omega [0x1D6FC] = 0x0B, -- alpha [0x1D6FD] = 0x0C, -- beta [0x1D6FE] = 0x0D, -- gamma [0x1D6FF] = 0x0E, -- delta [0x1D716] = 0x0F, -- epsilon TODO: 1D716 [0x1D701] = 0x10, -- zeta [0x1D702] = 0x11, -- eta [0x1D703] = 0x12, -- theta TODO: 1D703 [0x1D704] = 0x13, -- iota [0x1D705] = 0x14, -- kappa [0x1D718] = 0x14, -- varkappa, not in tex fonts [0x1D706] = 0x15, -- lambda [0x1D707] = 0x16, -- mu [0x1D708] = 0x17, -- nu [0x1D709] = 0x18, -- xi [0x1D70B] = 0x19, -- pi [0x1D70C] = 0x1A, -- rho [0x1D70E] = 0x1B, -- sigma [0x1D70F] = 0x1C, -- tau [0x1D710] = 0x1D, -- upsilon [0x1D719] = 0x1E, -- phi [0x1D712] = 0x1F, -- chi [0x1D713] = 0x20, -- psi [0x1D714] = 0x21, -- omega [0x1D700] = 0x22, -- varepsilon (the other way around) [0x1D717] = 0x23, -- vartheta [0x1D71B] = 0x24, -- varpi [0x1D71A] = 0x25, -- varrho [0x1D70D] = 0x26, -- varsigma [0x1D711] = 0x27, -- varphi (the other way around) [0x021BC] = 0x28, -- leftharpoonup [0x021BD] = 0x29, -- leftharpoondown [0x021C0] = 0x2A, -- righttharpoonup [0x021C1] = 0x2B, -- rightharpoondown -- 0x2C, -- lhook (hook for combining arrows) -- 0x2D, -- rhook (hook for combining arrows) [0x022B3] = 0x2E, -- triangleright (TODO: which one is right?) [0x022B2] = 0x2F, -- triangleleft (TODO: which one is right?) -- [0x00041] = 0x30, -- 0 -- [0x00041] = 0x31, -- 1 -- [0x00041] = 0x32, -- 2 -- [0x00041] = 0x33, -- 3 -- [0x00041] = 0x34, -- 4 -- [0x00041] = 0x35, -- 5 -- [0x00041] = 0x36, -- 6 -- [0x00041] = 0x37, -- 7 -- [0x00041] = 0x38, -- 8 -- [0x00041] = 0x39, -- 9 --~ [0x0002E] = 0x3A, -- . [0x0002C] = 0x3B, -- , [0x0003C] = 0x3C, -- < -- [0x0002F] = 0x3D, -- /, slash, solidus [0x02044] = 0x3D, -- / AM: Not sure [0x0003E] = 0x3E, -- > [0x022C6] = 0x3F, -- star [0x02202] = 0x40, -- partial -- [0x00041] = 0x41, -- A [0x1D6E2] = 0x41, -- Alpha -- [0x00042] = 0x42, -- B [0x1D6E3] = 0x42, -- Beta -- [0x00043] = 0x43, -- C -- [0x00044] = 0x44, -- D -- [0x00045] = 0x45, -- E [0x1D6E6] = 0x45, -- Epsilon -- [0x00046] = 0x46, -- F -- [0x00047] = 0x47, -- G -- [0x00048] = 0x48, -- H [0x1D6E8] = 0x48, -- Eta -- [0x00049] = 0x49, -- I [0x1D6EA] = 0x49, -- Iota -- [0x0004A] = 0x4A, -- J -- [0x0004B] = 0x4B, -- K [0x1D6EB] = 0x4B, -- Kappa -- [0x0004C] = 0x4C, -- L -- [0x0004D] = 0x4D, -- M [0x1D6ED] = 0x4D, -- Mu -- [0x0004E] = 0x4E, -- N [0x1D6EE] = 0x4E, -- Nu -- [0x0004F] = 0x4F, -- O [0x1D6F0] = 0x4F, -- Omicron -- [0x00050] = 0x50, -- P [0x1D6F2] = 0x50, -- Rho -- [0x00051] = 0x51, -- Q -- [0x00052] = 0x52, -- R -- [0x00053] = 0x53, -- S -- [0x00054] = 0x54, -- T [0x1D6F5] = 0x54, -- Tau -- [0x00055] = 0x55, -- U -- [0x00056] = 0x56, -- V -- [0x00057] = 0x57, -- W -- [0x00058] = 0x58, -- X [0x1D6F8] = 0x58, -- Chi -- [0x00059] = 0x59, -- Y -- [0x0005A] = 0x5A, -- Z [0x1D6E7] = 0x5A, -- Zeta [0x0266D] = 0x5B, -- flat [0x0266E] = 0x5C, -- natural [0x0266F] = 0x5D, -- sharp [0x02323] = 0x5E, -- smile [0x02322] = 0x5F, -- frown [0x02113] = 0x60, -- ell -- [0x00061] = 0x61, -- a -- [0x00062] = 0x62, -- b -- [0x00063] = 0x63, -- c -- [0x00064] = 0x64, -- d -- [0x00065] = 0x65, -- e -- [0x00066] = 0x66, -- f -- [0x00067] = 0x67, -- g -- [0x00068] = 0x68, -- h [0x0210E] = 0x68, -- plant constant -- [0x00069] = 0x69, -- i -- [0x0006A] = 0x6A, -- j -- [0x0006B] = 0x6B, -- k -- [0x0006C] = 0x6C, -- l -- [0x0006D] = 0x6D, -- m -- [0x0006E] = 0x6E, -- n -- [0x0006F] = 0x6F, -- o [0x1D70A] = 0x6F, -- omicron -- [0x00070] = 0x70, -- p -- [0x00071] = 0x71, -- q -- [0x00072] = 0x72, -- r -- [0x00073] = 0x73, -- s -- [0x00074] = 0x74, -- t -- [0x00075] = 0x75, -- u -- [0x00076] = 0x76, -- v -- [0x00077] = 0x77, -- w -- [0x00078] = 0x78, -- x -- [0x00079] = 0x79, -- y -- [0x0007A] = 0x7A, -- z [0x1D6A4] = 0x7B, -- imath (TODO: also 0131) [0x1D6A5] = 0x7C, -- jmath (TODO: also 0237) [0x02118] = 0x7D, -- wp [0x020D7] = 0x7E, -- vec (TODO: not sure) -- 0x7F, -- (no idea what that could be) } fonts.enc.math["tex-ss"] = { } fonts.enc.math["tex-tt"] = { } fonts.enc.math["tex-bf"] = { } fonts.enc.math["tex-bi"] = { } fonts.enc.math["tex-fraktur"] = { } fonts.enc.math["tex-fraktur-bold"] = { } function fonts.vf.math.set_letters(font_encoding, name, uppercase, lowercase) local enc = font_encoding[name] for i = 0,25 do enc[uppercase+i] = i + 0x41 enc[lowercase+i] = i + 0x61 end end function fonts.vf.math.set_digits(font_encoding, name, digits) local enc = font_encoding[name] for i = 0,9 do enc[digits+i] = i + 0x30 end end fonts.enc.math["tex-sy"] = { [0x0002D] = 0x00, -- - [0x02212] = 0x00, -- - -- [0x02201] = 0x00, -- complement -- [0x02206] = 0x00, -- increment -- [0x02204] = 0x00, -- not exists --~ [0x000B7] = 0x01, -- cdot [0x022C5] = 0x01, -- cdot [0x000D7] = 0x02, -- times [0x0002A] = 0x03, -- * [0x02217] = 0x03, -- * [0x000F7] = 0x04, -- div [0x022C4] = 0x05, -- diamond [0x000B1] = 0x06, -- pm [0x02213] = 0x07, -- mp [0x02295] = 0x08, -- oplus [0x02296] = 0x09, -- ominus [0x02297] = 0x0A, -- otimes [0x02298] = 0x0B, -- oslash [0x02299] = 0x0C, -- odot [0x025EF] = 0x0D, -- bigcirc, Orb (either 25EF or 25CB) -- todo [0x02218] = 0x0E, -- circ [0x02219] = 0x0F, -- bullet [0x02022] = 0x0F, -- bullet [0x0224D] = 0x10, -- asymp [0x02261] = 0x11, -- equiv [0x02286] = 0x12, -- subseteq [0x02287] = 0x13, -- supseteq [0x02264] = 0x14, -- leq [0x02265] = 0x15, -- geq [0x02AAF] = 0x16, -- preceq -- [0x0227C] = 0x16, -- preceq, AM:No see 2AAF [0x02AB0] = 0x17, -- succeq -- [0x0227D] = 0x17, -- succeq, AM:No see 2AB0 [0x0223C] = 0x18, -- sim [0x02248] = 0x19, -- approx [0x02282] = 0x1A, -- subset [0x02283] = 0x1B, -- supset [0x0226A] = 0x1C, -- ll [0x0226B] = 0x1D, -- gg [0x0227A] = 0x1E, -- prec [0x0227B] = 0x1F, -- succ [0x02190] = 0x20, -- leftarrow [0x02192] = 0x21, -- rightarrow --~ [0xFE190] = 0x20, -- leftarrow --~ [0xFE192] = 0x21, -- rightarrow [0x02191] = 0x22, -- uparrow [0x02193] = 0x23, -- downarrow [0x02194] = 0x24, -- leftrightarrow [0x02197] = 0x25, -- nearrow [0x02198] = 0x26, -- searrow [0x02243] = 0x27, -- simeq [0x021D0] = 0x28, -- Leftarrow [0x021D2] = 0x29, -- Rightarrow [0x021D1] = 0x2A, -- Uparrow [0x021D3] = 0x2B, -- Downarrow [0x021D4] = 0x2C, -- Leftrightarrow [0x02196] = 0x2D, -- nwarrow [0x02199] = 0x2E, -- swarrow [0x0221D] = 0x2F, -- propto [0x02032] = 0x30, -- prime [0x0221E] = 0x31, -- infty [0x02208] = 0x32, -- in [0x0220B] = 0x33, -- ni [0x025B3] = 0x34, -- triangle, bigtriangleup [0x025BD] = 0x35, -- bigtriangledown [0x00338] = 0x36, -- not -- 0x37, -- (beginning of arrow) [0x02200] = 0x38, -- forall [0x02203] = 0x39, -- exists [0x000AC] = 0x3A, -- neg, lnot [0x02205] = 0x3B, -- empty set [0x0211C] = 0x3C, -- Re [0x02111] = 0x3D, -- Im [0x022A4] = 0x3E, -- top [0x022A5] = 0x3F, -- bot, perp [0x02135] = 0x40, -- aleph [0x1D49C] = 0x41, -- script A [0x0212C] = 0x42, -- script B [0x1D49E] = 0x43, -- script C [0x1D49F] = 0x44, -- script D [0x02130] = 0x45, -- script E [0x02131] = 0x46, -- script F [0x1D4A2] = 0x47, -- script G [0x0210B] = 0x48, -- script H [0x02110] = 0x49, -- script I [0x1D4A5] = 0x4A, -- script J [0x1D4A6] = 0x4B, -- script K [0x02112] = 0x4C, -- script L [0x02133] = 0x4D, -- script M [0x1D4A9] = 0x4E, -- script N [0x1D4AA] = 0x4F, -- script O [0x1D4AB] = 0x50, -- script P [0x1D4AC] = 0x51, -- script Q [0x0211B] = 0x52, -- script R [0x1D4AE] = 0x53, -- script S [0x1D4AF] = 0x54, -- script T [0x1D4B0] = 0x55, -- script U [0x1D4B1] = 0x56, -- script V [0x1D4B2] = 0x57, -- script W [0x1D4B3] = 0x58, -- script X [0x1D4B4] = 0x59, -- script Y [0x1D4B5] = 0x5A, -- script Z [0x0222A] = 0x5B, -- cup [0x02229] = 0x5C, -- cap [0x0228E] = 0x5D, -- uplus [0x02227] = 0x5E, -- wedge, land [0x02228] = 0x5F, -- vee, lor [0x022A2] = 0x60, -- vdash [0x022A3] = 0x61, -- dashv [0x0230A] = 0x62, -- lfloor [0x0230B] = 0x63, -- rfloor [0x02308] = 0x64, -- lceil [0x02309] = 0x65, -- rceil [0x0007B] = 0x66, -- {, lbrace [0x0007D] = 0x67, -- }, rbrace [0x027E8] = 0x68, -- <, langle [0x027E9] = 0x69, -- >, rangle [0x0007C] = 0x6A, -- |, mid, lvert, rvert [0x02225] = 0x6B, -- parallel, Vert, lVert, rVert, arrowvert [0x02195] = 0x6C, -- updownarrow [0x021D5] = 0x6D, -- Updownarrow [0x0005C] = 0x6E, -- \, backslash, setminus [0x02216] = 0x6E, -- setminus [0x02240] = 0x6F, -- wr [0x0221A] = 0x70, -- sqrt. AM: Check surd?? [0x02A3F] = 0x71, -- amalg [0x1D6FB] = 0x72, -- nabla -- [0x0222B] = 0x73, -- smallint (TODO: what about intop?) [0x02294] = 0x74, -- sqcup [0x02293] = 0x75, -- sqcap [0x02291] = 0x76, -- sqsubseteq [0x02292] = 0x77, -- sqsupseteq [0x000A7] = 0x78, -- S [0x02020] = 0x79, -- dagger, dag [0x02021] = 0x7A, -- ddagger, ddag [0x000B6] = 0x7B, -- P [0x02663] = 0x7C, -- clubsuit [0x02662] = 0x7D, -- diamondsuit [0x02661] = 0x7E, -- heartsuit [0x02660] = 0x7F, -- spadesuit [0xFE321] = 0x37, -- mapstochar } -- The names in masm10.enc can be trusted best and are shown in the first -- column, while in the second column we show the tex/ams names. As usual -- it costs hours to figure out such a table. fonts.enc.math["tex-ma"] = { [0x022A1] = 0x00, -- squaredot \boxdot [0x0229E] = 0x01, -- squareplus \boxplus [0x022A0] = 0x02, -- squaremultiply \boxtimes [0x025A1] = 0x03, -- square \square \Box [0x025A0] = 0x04, -- squaresolid \blacksquare [0x000B7] = 0x05, -- squaresmallsolid \centerdot [0x022C4] = 0x06, -- diamond \Diamond \lozenge [0x029EB] = 0x07, -- diamondsolid \blacklozenge [0x021BA] = 0x08, -- clockwise \circlearrowright [0x021BB] = 0x09, -- anticlockwise \circlearrowleft [0x021CC] = 0x0A, -- harpoonleftright \rightleftharpoons [0x021CB] = 0x0B, -- harpoonrightleft \leftrightharpoons [0x0229F] = 0x0C, -- squareminus \boxminus [0x022A9] = 0x0D, -- forces \Vdash [0x022AA] = 0x0E, -- forcesbar \Vvdash [0x022A8] = 0x0F, -- satisfies \vDash [0x021A0] = 0x10, -- dblarrowheadright \twoheadrightarrow [0x0219E] = 0x11, -- dblarrowheadleft \twoheadleftarrow [0x021C7] = 0x12, -- dblarrowleft \leftleftarrows [0x021C9] = 0x13, -- dblarrowright \rightrightarrows [0x021C8] = 0x14, -- dblarrowup \upuparrows [0x021CA] = 0x15, -- dblarrowdwn \downdownarrows [0x021BE] = 0x16, -- harpoonupright \upharpoonright \restriction [0x021C2] = 0x17, -- harpoondownright \downharpoonright [0x021BF] = 0x18, -- harpoonupleft \upharpoonleft [0x021C3] = 0x19, -- harpoondownleft \downharpoonleft [0x021A3] = 0x1A, -- arrowtailright \rightarrowtail [0x021A2] = 0x1B, -- arrowtailleft \leftarrowtail [0x021C6] = 0x1C, -- arrowparrleftright \leftrightarrows -- [0x021C5] = 0x00, -- \updownarrows (missing in lm) [0x021C4] = 0x1D, -- arrowparrrightleft \rightleftarrows [0x021B0] = 0x1E, -- shiftleft \Lsh [0x021B1] = 0x1F, -- shiftright \Rsh [0x021DD] = 0x20, -- squiggleright \leadsto \rightsquigarrow [0x021AD] = 0x21, -- squiggleleftright \leftrightsquigarrow [0x021AB] = 0x22, -- curlyleft \looparrowleft [0x021AC] = 0x23, -- curlyright \looparrowright [0x02257] = 0x24, -- circleequal \circeq [0x0227F] = 0x25, -- followsorequal \succsim [0x02273] = 0x26, -- greaterorsimilar \gtrsim [0x02A86] = 0x27, -- greaterorapproxeql \gtrapprox [0x022B8] = 0x28, -- multimap \multimap [0x02234] = 0x29, -- therefore \therefore [0x02235] = 0x2A, -- because \because [0x02251] = 0x2B, -- equalsdots \Doteq \doteqdot [0x0225C] = 0x2C, -- defines \triangleq [0x0227E] = 0x2D, -- precedesorequal \precsim [0x02272] = 0x2E, -- lessorsimilar \lesssim [0x02A85] = 0x2F, -- lessorapproxeql \lessapprox [0x02A95] = 0x30, -- equalorless \eqslantless [0x02A96] = 0x31, -- equalorgreater \eqslantgtr [0x022DE] = 0x32, -- equalorprecedes \curlyeqprec [0x022DF] = 0x33, -- equalorfollows \curlyeqsucc [0x0227C] = 0x34, -- precedesorcurly \preccurlyeq [0x02266] = 0x35, -- lessdblequal \leqq [0x02A7D] = 0x36, -- lessorequalslant \leqslant [0x02276] = 0x37, -- lessorgreater \lessgtr [0x02035] = 0x38, -- primereverse \backprime -- [0x0] = 0x39, -- axisshort \dabar [0x02253] = 0x3A, -- equaldotrightleft \risingdotseq [0x02252] = 0x3B, -- equaldotleftright \fallingdotseq [0x0227D] = 0x3C, -- followsorcurly \succcurlyeq [0x02267] = 0x3D, -- greaterdblequal \geqq [0x02A7E] = 0x3E, -- greaterorequalslant \geqslant [0x02277] = 0x3F, -- greaterorless \gtrless [0x0228F] = 0x40, -- squareimage \sqsubset [0x02290] = 0x41, -- squareoriginal \sqsupset -- wrong: [0x022B3] = 0x42, -- triangleright \rhd \vartriangleright [0x022B2] = 0x43, -- triangleleft \lhd \vartriangleleft [0x022B5] = 0x44, -- trianglerightequal \unrhd \trianglerighteq [0x022B4] = 0x45, -- triangleleftequal \unlhd \trianglelefteq -- [0x02605] = 0x46, -- star \bigstar [0x0226C] = 0x47, -- between \between [0x025BC] = 0x48, -- triangledownsld \blacktriangledown [0x025B6] = 0x49, -- trianglerightsld \blacktriangleright [0x025C0] = 0x4A, -- triangleleftsld \blacktriangleleft -- [0x0] = 0x4B, -- arrowaxisright -- [0x0] = 0x4C, -- arrowaxisleft [0x025B2] = 0x4D, -- triangle \triangleup \vartriangle [0x025B2] = 0x4E, -- trianglesolid \blacktriangle [0x025BC] = 0x4F, -- triangleinv \triangledown [0x02256] = 0x50, -- ringinequal \eqcirc [0x022DA] = 0x51, -- lessequalgreater \lesseqgtr [0x022DB] = 0x52, -- greaterlessequal \gtreqless [0x02A8B] = 0x53, -- lessdbleqlgreater \lesseqqgtr [0x02A8C] = 0x54, -- greaterdbleqlless \gtreqqless [0x000A5] = 0x55, -- Yen \yen [0x021DB] = 0x56, -- arrowtripleright \Rrightarrow [0x021DA] = 0x57, -- arrowtripleleft \Lleftarrow [0x02713] = 0x58, -- check \checkmark [0x022BB] = 0x59, -- orunderscore \veebar [0x022BC] = 0x5A, -- nand \barwedge [0x02306] = 0x5B, -- perpcorrespond \doublebarwedge [0x02220] = 0x5C, -- angle \angle [0x02221] = 0x5D, -- measuredangle \measuredangle [0x02222] = 0x5E, -- sphericalangle \sphericalangle -- [0x0] = 0x5F, -- proportional \varpropto -- [0x0] = 0x60, -- smile \smallsmile -- [0x0] = 0x61, -- frown \smallfrown [0x022D0] = 0x62, -- subsetdbl \Subset [0x022D1] = 0x63, -- supersetdbl \Supset [0x022D3] = 0x64, -- uniondbl \doublecup \Cup [0x00100] = 0x65, -- intersectiondbl \doublecap \Cap [0x022CF] = 0x66, -- uprise \curlywedge [0x022CE] = 0x67, -- downfall \curlyvee [0x022CB] = 0x68, -- multiopenleft \leftthreetimes [0x022CC] = 0x69, -- multiopenright \rightthreetimes [0x02AC5] = 0x6A, -- subsetdblequal \subseteqq [0x02AC6] = 0x6B, -- supersetdblequal \supseteqq [0x0224F] = 0x6C, -- difference \bumpeq [0x0224E] = 0x6D, -- geomequivalent \Bumpeq [0x022D8] = 0x6E, -- muchless \lll \llless [0x022D9] = 0x6F, -- muchgreater \ggg \gggtr [0x0231C] = 0x70, -- rightanglenw \ulcorner [0x0231D] = 0x71, -- rightanglene \urcorner [0x024C7] = 0x72, -- circleR \circledR [0x024C8] = 0x73, -- circleS \circledS [0x022D4] = 0x74, -- fork \pitchfork [0x02245] = 0x75, -- dotplus \dotplus [0x0223D] = 0x76, -- revsimilar \backsim [0x022CD] = 0x77, -- revasymptequal \backsimeq -- AM: Check this! I mapped it to simeq. [0x0231E] = 0x78, -- rightanglesw \llcorner [0x0231F] = 0x79, -- rightanglese \lrcorner [0x02720] = 0x7A, -- maltesecross \maltese [0x02201] = 0x7B, -- complement \complement [0x022BA] = 0x7C, -- intercal \intercal [0x0229A] = 0x7D, -- circlering \circledcirc [0x0229B] = 0x7E, -- circleasterisk \circledast [0x0229D] = 0x7F, -- circleminus \circleddash } fonts.enc.math["tex-mb"] = { -- [0x0] = 0x00, -- lessornotequal \lvertneqq -- [0x0] = 0x01, -- greaterornotequal \gvertneqq [0x02270] = 0x02, -- notlessequal \nleq [0x02271] = 0x03, -- notgreaterequal \ngeq [0x0226E] = 0x04, -- notless \nless [0x0226F] = 0x05, -- notgreater \ngtr [0x02280] = 0x06, -- notprecedes \nprec [0x02281] = 0x07, -- notfollows \nsucc [0x02268] = 0x08, -- lessornotdbleql \lneqq [0x02269] = 0x09, -- greaterornotdbleql \gneqq -- [0x0] = 0x0A, -- notlessorslnteql \nleqslant -- [0x0] = 0x0B, -- notgreaterorslnteql \ngeqslant [0x02A87] = 0x0C, -- lessnotequal \lneq [0x02A88] = 0x0D, -- greaternotequal \gneq -- [0x0] = 0x0E, -- notprecedesoreql \npreceq -- [0x0] = 0x0F, -- notfollowsoreql \nsucceq [0x022E8] = 0x10, -- precedeornoteqvlnt \precnsim [0x022E9] = 0x11, -- followornoteqvlnt \succnsim [0x022E6] = 0x12, -- lessornotsimilar \lnsim [0x022E7] = 0x13, -- greaterornotsimilar \gnsim -- [0x0] = 0x14, -- notlessdblequal \nleqq -- [0x0] = 0x15, -- notgreaterdblequal \ngeqq [0x02AB5] = 0x16, -- precedenotslnteql \precneqq [0x02AB6] = 0x17, -- follownotslnteql \succneqq [0x02AB9] = 0x18, -- precedenotdbleqv \precnapprox [0x02ABA] = 0x19, -- follownotdbleqv \succnapprox [0x02A89] = 0x1A, -- lessnotdblequal \lnapprox [0x02A8A] = 0x1B, -- greaternotdblequal \gnapprox [0x02241] = 0x1C, -- notsimilar \nsim [0x02247] = 0x1D, -- notapproxequal \ncong -- [0x0] = 0x1E, -- upslope \diagup -- [0x0] = 0x1F, -- downslope \diagdown -- [0x0] = 0x20, -- notsubsetoreql \varsubsetneq -- [0x0] = 0x21, -- notsupersetoreql \varsupsetneq -- [0x0] = 0x22, -- notsubsetordbleql \nsubseteqq -- [0x0] = 0x23, -- notsupersetordbleql \nsupseteqq [0x02ACB] = 0x24, -- subsetornotdbleql \subsetneqq [0x02ACC] = 0x25, -- supersetornotdbleql \supsetneqq -- [0x0] = 0x26, -- subsetornoteql \varsubsetneqq -- [0x0] = 0x27, -- supersetornoteql \varsupsetneqq [0x0228A] = 0x28, -- subsetnoteql \subsetneq [0x0228B] = 0x29, -- supersetnoteql \supsetneq [0x02288] = 0x2A, -- notsubseteql \nsubseteq [0x02289] = 0x2B, -- notsuperseteql \nsupseteq [0x02226] = 0x2C, -- notparallel \nparallel [0x02224] = 0x2D, -- notbar \nmid \ndivides -- [0x0] = 0x2E, -- notshortbar \nshortmid -- [0x0] = 0x2F, -- notshortparallel \nshortparallel [0x022AC] = 0x30, -- notturnstile \nvdash [0x022AE] = 0x31, -- notforces \nVdash [0x022AD] = 0x32, -- notsatisfies \nvDash [0x022AF] = 0x33, -- notforcesextra \nVDash [0x022ED] = 0x34, -- nottriangeqlright \ntrianglerighteq [0x022EC] = 0x35, -- nottriangeqlleft \ntrianglelefteq [0x022EA] = 0x36, -- nottriangleleft \ntriangleleft [0x022EB] = 0x37, -- nottriangleright \ntriangleright [0x0219A] = 0x38, -- notarrowleft \nleftarrow [0x0219B] = 0x39, -- notarrowright \nrightarrow [0x021CD] = 0x3A, -- notdblarrowleft \nLeftarrow [0x021CF] = 0x3B, -- notdblarrowright \nRightarrow [0x021CE] = 0x3C, -- notdblarrowboth \nLeftrightarrow [0x021AE] = 0x3D, -- notarrowboth \nleftrightarrow [0x022C7] = 0x3E, -- dividemultiply \divideontimes [0x02300] = 0x3F, -- diametersign \varnothing [0x02204] = 0x40, -- notexistential \nexists [0x1D538] = 0x41, -- A (blackboard A) [0x1D539] = 0x42, -- B [0x02102] = 0x43, -- C [0x1D53B] = 0x44, -- D [0x1D53C] = 0x45, -- E [0x1D53D] = 0x46, -- F [0x1D53E] = 0x47, -- G [0x0210D] = 0x48, -- H [0x1D540] = 0x49, -- I [0x1D541] = 0x4A, -- J [0x1D542] = 0x4B, -- K [0x1D543] = 0x4C, -- L [0x1D544] = 0x4D, -- M [0x02115] = 0x4E, -- N [0x1D546] = 0x4F, -- O [0x02119] = 0x50, -- P [0x0211A] = 0x51, -- Q [0x0211D] = 0x52, -- R [0x1D54A] = 0x53, -- S [0x1D54B] = 0x54, -- T [0x1D54C] = 0x55, -- U [0x1D54D] = 0x56, -- V [0x1D54E] = 0x57, -- W [0x1D54F] = 0x58, -- X [0x1D550] = 0x59, -- Y [0x02124] = 0x5A, -- Z (blackboard Z) [0x02132] = 0x60, -- hatwide \Finv [0x02141] = 0x61, -- hatwider \Game -- [0x0] = 0x62, tildewide -- [0x0] = 0x63, tildewider -- [0x0] = 0x64, Finv -- [0x0] = 0x65, Gmir [0x02127] = 0x66, -- Omegainv \mho [0x000F0] = 0x67, -- eth \eth [0x02242] = 0x68, -- equalorsimilar \eqsim [0x02136] = 0x69, -- beth \beth [0x02137] = 0x6A, -- gimel \gimel [0x02138] = 0x6B, -- daleth \daleth [0x022D6] = 0x6C, -- lessdot \lessdot [0x022D7] = 0x6D, -- greaterdot \gtrdot [0x022C9] = 0x6E, -- multicloseleft \ltimes [0x022CA] = 0x6F, -- multicloseright \rtimes -- [0x0] = 0x70, -- barshort \shortmid -- [0x0] = 0x71, -- parallelshort \shortparallel -- [0x02216] = 0x72, -- integerdivide \smallsetminus (2216 already part of tex-sy -- [0x0] = 0x73, -- similar \thicksim -- [0x0] = 0x74, -- approxequal \thickapprox [0x0224A] = 0x75, -- approxorequal \approxeq [0x02AB8] = 0x76, -- followsorequal \succapprox [0x02AB7] = 0x77, -- precedesorequal \precapprox [0x021B6] = 0x78, -- archleftdown \curvearrowleft [0x021B7] = 0x79, -- archrightdown \curvearrowright [0x003DC] = 0x7A, -- Digamma \digamma [0x003F0] = 0x7B, -- kappa \varkappa [0x1D55C] = 0x7C, -- k \Bbbk (blackboard k) [0x0210F] = 0x7D, -- planckover2pi \hslash [0x00127] = 0x7E, -- planckover2pi1 \hbar [0x003F6] = 0x7F, -- epsiloninv \backepsilon } fonts.enc.math["tex-fraktur"] = { -- [0x1D504] = 0x41, -- A (fraktur A) -- [0x1D505] = 0x42, -- B [0x0212D] = 0x43, -- C -- [0x1D507] = 0x44, -- D -- [0x1D508] = 0x45, -- E -- [0x1D509] = 0x46, -- F -- [0x1D50A] = 0x47, -- G [0x0210C] = 0x48, -- H [0x02111] = 0x49, -- I -- [0x1D50D] = 0x4A, -- J -- [0x1D50E] = 0x4B, -- K -- [0x1D50F] = 0x4C, -- L -- [0x1D510] = 0x4D, -- M -- [0x1D511] = 0x4E, -- N -- [0x1D512] = 0x4F, -- O -- [0x1D513] = 0x50, -- P -- [0x1D514] = 0x51, -- Q [0x0211C] = 0x52, -- R -- [0x1D516] = 0x53, -- S -- [0x1D517] = 0x54, -- T -- [0x1D518] = 0x55, -- U -- [0x1D519] = 0x56, -- V -- [0x1D51A] = 0x57, -- W -- [0x1D51B] = 0x58, -- X -- [0x1D51C] = 0x59, -- Y [0x02128] = 0x5A, -- Z (fraktur Z) -- [0x1D51E] = 0x61, -- a (fraktur a) -- [0x1D51F] = 0x62, -- b -- [0x1D520] = 0x63, -- c -- [0x1D521] = 0x64, -- d -- [0x1D522] = 0x65, -- e -- [0x1D523] = 0x66, -- f -- [0x1D524] = 0x67, -- g -- [0x1D525] = 0x68, -- h -- [0x1D526] = 0x69, -- i -- [0x1D527] = 0x6A, -- j -- [0x1D528] = 0x6B, -- k -- [0x1D529] = 0x6C, -- l -- [0x1D52A] = 0x6D, -- m -- [0x1D52B] = 0x6E, -- n -- [0x1D52C] = 0x6F, -- o -- [0x1D52D] = 0x70, -- p -- [0x1D52E] = 0x71, -- q -- [0x1D52F] = 0x72, -- r -- [0x1D530] = 0x73, -- s -- [0x1D531] = 0x74, -- t -- [0x1D532] = 0x75, -- u -- [0x1D533] = 0x76, -- v -- [0x1D534] = 0x77, -- w -- [0x1D535] = 0x78, -- x -- [0x1D536] = 0x79, -- y -- [0x1D537] = 0x7A, -- z } -- now that all other vectors are defined ... fonts.vf.math.set_letters(fonts.enc.math, "tex-mi", 0x1D434, 0x1D44E) fonts.vf.math.set_letters(fonts.enc.math, "tex-ss", 0x1D5A0, 0x1D5BA) fonts.vf.math.set_letters(fonts.enc.math, "tex-tt", 0x1D670, 0x1D68A) fonts.vf.math.set_letters(fonts.enc.math, "tex-bf", 0x1D400, 0x1D41A) fonts.vf.math.set_letters(fonts.enc.math, "tex-bi", 0x1D468, 0x1D482) fonts.vf.math.set_letters(fonts.enc.math, "tex-fraktur", 0x1D504, 0x1D51E) fonts.vf.math.set_letters(fonts.enc.math, "tex-fraktur-bold", 0x1D56C, 0x1D586) fonts.vf.math.set_digits (fonts.enc.math, "tex-ss", 0x1D7E2) fonts.vf.math.set_digits (fonts.enc.math, "tex-tt", 0x1D7F6) fonts.vf.math.set_digits (fonts.enc.math, "tex-bf", 0x1D7CE) -- fonts.vf.math.set_digits (fonts.enc.math, "tex-bi", 0x1D7CE) -- todo: add ss, tt, bf etc vectors -- we can make ss tt etc an option -- rm-lmr5 : LMMathRoman5-Regular -- rm-lmbx5 : LMMathRoman5-Bold ] -- lmbsy5 : LMMathSymbols5-BoldItalic -- lmsy5 : LMMathSymbols5-Italic -- lmmi5 : LMMathItalic5-Italic -- lmmib5 : LMMathItalic5-BoldItalic mathematics.make_font ( "lmroman5-math", { { name = "lmroman5-regular.otf", features = "virtualmath", main = true }, -- { name = "rm-lmr5.tfm", vector = "tex-mr" } , { name = "lmmi5.tfm", vector = "tex-mi", skewchar=0x7F }, { name = "lmsy5.tfm", vector = "tex-sy", skewchar=0x30, parameters = true } , { name = "lmex10.tfm", vector = "tex-ex", extension = true } , { name = "msam5.tfm", vector = "tex-ma" }, { name = "msbm5.tfm", vector = "tex-mb" }, -- { name = "rm-lmbx5.tfm", vector = "tex-bf" } , { name = "lmroman5-bold", vector = "tex-bf" } , { name = "lmmib5.tfm", vector = "tex-bi", skewchar=0x7F } , { name = "lmsans8-regular.otf", vector = "tex-ss", optional=true }, { name = "lmmono8-regular.otf", vector = "tex-tt", optional=true }, { name = "eufm5.tfm", vector = "tex-fraktur", optional=true }, } ) -- rm-lmr6 : LMMathRoman6-Regular -- rm-lmbx6 : LMMathRoman6-Bold -- lmsy6 : LMMathSymbols6-Italic -- lmmi6 : LMMathItalic6-Italic mathematics.make_font ( "lmroman6-math", { { name = "lmroman6-regular.otf", features = "virtualmath", main = true }, -- { name = "rm-lmr6.tfm", vector = "tex-mr" } , { name = "lmmi6.tfm", vector = "tex-mi", skewchar=0x7F }, { name = "lmsy6.tfm", vector = "tex-sy", skewchar=0x30, parameters = true } , { name = "lmex10.tfm", vector = "tex-ex", extension = true } , { name = "msam5.tfm", vector = "tex-ma" }, { name = "msbm5.tfm", vector = "tex-mb" }, -- { name = "rm-lmbx6.tfm", vector = "tex-bf" } , { name = "lmroman6-bold.otf", vector = "tex-bf" } , { name = "lmmib5.tfm", vector = "tex-bi", skewchar=0x7F } , { name = "lmsans8-regular.otf", vector = "tex-ss", optional=true }, { name = "lmmono8-regular.otf", vector = "tex-tt", optional=true }, { name = "eufm5.tfm", vector = "tex-fraktur", optional=true }, { name = "eufb5.tfm", vector = "tex-fraktur-bold", optional=true }, } ) -- rm-lmr7 : LMMathRoman7-Regular -- rm-lmbx7 : LMMathRoman7-Bold -- lmbsy7 : LMMathSymbols7-BoldItalic -- lmsy7 : LMMathSymbols7-Italic -- lmmi7 : LMMathItalic7-Italic -- lmmib7 : LMMathItalic7-BoldItalic mathematics.make_font ( "lmroman7-math", { { name = "lmroman7-regular.otf", features = "virtualmath", main = true }, -- { name = "rm-lmr7.tfm", vector = "tex-mr" } , { name = "lmmi7.tfm", vector = "tex-mi", skewchar=0x7F }, { name = "lmsy7.tfm", vector = "tex-sy", skewchar=0x30, parameters = true } , { name = "lmex10.tfm", vector = "tex-ex", extension = true } , { name = "msam7.tfm", vector = "tex-ma" }, { name = "msbm7.tfm", vector = "tex-mb" }, -- { name = "rm-lmbx7.tfm", vector = "tex-bf" } , { name = "lmroman7-bold.otf", vector = "tex-bf" } , { name = "lmmib7.tfm", vector = "tex-bi", skewchar=0x7F } , { name = "lmsans8-regular.otf", vector = "tex-ss", optional=true }, { name = "lmmono8-regular.otf", vector = "tex-tt", optional=true }, { name = "eufm7.tfm", vector = "tex-fraktur", optional=true }, { name = "eufb7.tfm", vector = "tex-fraktur-bold", optional=true }, } ) -- rm-lmr8 : LMMathRoman8-Regular -- rm-lmbx8 : LMMathRoman8-Bold -- lmsy8 : LMMathSymbols8-Italic -- lmmi8 : LMMathItalic8-Italic mathematics.make_font ( "lmroman8-math", { { name = "lmroman8-regular.otf", features = "virtualmath", main = true }, -- { name = "rm-lmr8.tfm", vector = "tex-mr" } , { name = "lmmi8.tfm", vector = "tex-mi", skewchar=0x7F }, { name = "lmsy8.tfm", vector = "tex-sy", skewchar=0x30, parameters = true } , { name = "lmex10.tfm", vector = "tex-ex", extension = true } , { name = "msam7.tfm", vector = "tex-ma" }, { name = "msbm7.tfm", vector = "tex-mb" }, -- { name = "rm-lmbx8.tfm", vector = "tex-bf" } , { name = "lmroman8-bold.otf", vector = "tex-bf" } , { name = "lmmib7.tfm", vector = "tex-bi", skewchar=0x7F } , { name = "lmsans8-regular.otf", vector = "tex-ss", optional=true }, { name = "lmmono8-regular.otf", vector = "tex-tt", optional=true }, { name = "eufm7.tfm", vector = "tex-fraktur", optional=true }, { name = "eufb7.tfm", vector = "tex-fraktur-bold", optional=true }, } ) -- rm-lmr9 : LMMathRoman9-Regular -- rm-lmbx9 : LMMathRoman9-Bold -- lmsy9 : LMMathSymbols9-Italic -- lmmi9 : LMMathItalic9-Italic mathematics.make_font ( "lmroman9-math", { { name = "lmroman9-regular.otf", features = "virtualmath", main = true }, -- { name = "rm-lmr9.tfm", vector = "tex-mr" } , { name = "lmmi9.tfm", vector = "tex-mi", skewchar=0x7F }, { name = "lmsy9.tfm", vector = "tex-sy", skewchar=0x30, parameters = true } , { name = "lmex10.tfm", vector = "tex-ex", extension = true } , { name = "msam10.tfm", vector = "tex-ma" }, { name = "msbm10.tfm", vector = "tex-mb" }, -- { name = "rm-lmbx9.tfm", vector = "tex-bf" } , { name = "lmroman9-bold.otf", vector = "tex-bf" } , { name = "lmmib10.tfm", vector = "tex-bi", skewchar=0x7F } , { name = "lmsans9-regular.otf", vector = "tex-ss", optional=true }, { name = "lmmono9-regular.otf", vector = "tex-tt", optional=true }, { name = "eufm10.tfm", vector = "tex-fraktur", optional=true }, { name = "eufb10.tfm", vector = "tex-fraktur-bold", optional=true }, } ) -- rm-lmr10 : LMMathRoman10-Regular -- rm-lmbx10 : LMMathRoman10-Bold -- lmbsy10 : LMMathSymbols10-BoldItalic -- lmsy10 : LMMathSymbols10-Italic -- lmex10 : LMMathExtension10-Regular -- lmmi10 : LMMathItalic10-Italic -- lmmib10 : LMMathItalic10-BoldItalic mathematics.make_font ( "lmroman10-math", { { name = "lmroman10-regular.otf", features = "virtualmath", main = true }, -- { name = "rm-lmr10.tfm", vector = "tex-mr" } , { name = "lmmi10.tfm", vector = "tex-mi", skewchar=0x7F }, { name = "lmsy10.tfm", vector = "tex-sy", skewchar=0x30, parameters = true } , { name = "lmex10.tfm", vector = "tex-ex", extension = true } , { name = "msam10.tfm", vector = "tex-ma" }, { name = "msbm10.tfm", vector = "tex-mb" }, -- { name = "rm-lmbx10.tfm", vector = "tex-bf" } , { name = "lmroman10-bold.otf", vector = "tex-bf" } , { name = "lmmib10.tfm", vector = "tex-bi", skewchar=0x7F } , { name = "lmsans10-regular.otf", vector = "tex-ss", optional=true }, { name = "lmmono10-regular.otf", vector = "tex-tt", optional=true }, { name = "eufm10.tfm", vector = "tex-fraktur", optional=true }, { name = "eufb10.tfm", vector = "tex-fraktur-bold", optional=true }, } ) mathematics.make_font ( "lmroman10-boldmath", { { name = "lmroman10-bold.otf", features = "virtualmath", main = true }, -- { name = "rm-lmr10.tfm", vector = "tex-mr" } , { name = "lmmib10.tfm", vector = "tex-mi", skewchar=0x7F }, { name = "lmbsy10.tfm", vector = "tex-sy", skewchar=0x30, parameters = true } , { name = "lmex10.tfm", vector = "tex-ex", extension = true } , -- copied from roman: { name = "msam10.tfm", vector = "tex-ma" }, { name = "msbm10.tfm", vector = "tex-mb" }, -- { name = "rm-lmbx10.tfm", vector = "tex-bf" } , { name = "lmroman10-bold.otf", vector = "tex-bf" } , { name = "lmmib10.tfm", vector = "tex-bi", skewchar=0x7F } , { name = "lmsans10-regular.otf", vector = "tex-ss", optional=true }, { name = "lmmono10-regular.otf", vector = "tex-tt", optional=true }, { name = "eufm10.tfm", vector = "tex-fraktur", optional=true }, { name = "eufb10.tfm", vector = "tex-fraktur-bold", optional=true }, } ) -- rm-lmr12 : LMMathRoman12-Regular -- rm-lmbx12 : LMMathRoman12-Bold -- lmmi12 : LMMathItalic12-Italic mathematics.make_font ( "lmroman12-math", { { name = "lmroman12-regular.otf", features = "virtualmath", main = true }, -- { name = "rm-lmr12.tfm", vector = "tex-mr" } , { name = "lmmi12.tfm", vector = "tex-mi", skewchar=0x7F }, { name = "lmsy10.tfm", vector = "tex-sy", skewchar=0x30, parameters = true } , { name = "lmex10.tfm", vector = "tex-ex", extension = true } , { name = "msam10.tfm", vector = "tex-ma" }, { name = "msbm10.tfm", vector = "tex-mb" }, -- { name = "rm-lmbx12.tfm", vector = "tex-bf" } , { name = "lmroman12-bold.otf", vector = "tex-bf" } , { name = "lmmib10.tfm", vector = "tex-bi", skewchar=0x7F } , { name = "lmsans12-regular.otf", vector = "tex-ss", optional=true }, { name = "lmmono12-regular.otf", vector = "tex-tt", optional=true }, { name = "eufm10.tfm", vector = "tex-fraktur", optional=true }, { name = "eufb10.tfm", vector = "tex-fraktur-bold", optional=true }, } ) -- rm-lmr17 : LMMathRoman17-Regular mathematics.make_font ( "lmroman17-math", { { name = "lmroman17-regular.otf", features = "virtualmath", main = true }, -- { name = "rm-lmr12.tfm", vector = "tex-mr" } , { name = "lmmi12.tfm", vector = "tex-mi", skewchar=0x7F }, { name = "lmsy10.tfm", vector = "tex-sy", skewchar=0x30, parameters = true } , { name = "lmex10.tfm", vector = "tex-ex", extension = true } , { name = "msam10.tfm", vector = "tex-ma" }, { name = "msbm10.tfm", vector = "tex-mb" }, -- { name = "rm-lmbx12.tfm", vector = "tex-bf" } , { name = "lmroman12-bold.otf", vector = "tex-bf" } , { name = "lmmib10.tfm", vector = "tex-bi", skewchar=0x7F } , { name = "lmsans17-regular.otf", vector = "tex-ss", optional=true }, { name = "lmmono17-regular.otf", vector = "tex-tt", optional=true }, { name = "eufm10.tfm", vector = "tex-fraktur", optional=true }, { name = "eufb10.tfm", vector = "tex-fraktur-bold", optional=true }, } ) -- pxr/txr messes up the accents mathematics.make_font ( "px-math", { { name = "texgyrepagella-regular.otf", features = "virtualmath", main = true }, { name = "rpxr.tfm", vector = "tex-mr" } , { name = "rpxmi.tfm", vector = "tex-mi", skewchar=0x7F }, { name = "pxsy.tfm", vector = "tex-sy", skewchar=0x30, parameters = true } , { name = "pxex.tfm", vector = "tex-ex", extension = true } , { name = "pxsya.tfm", vector = "tex-ma" }, { name = "pxsyb.tfm", vector = "tex-mb" }, } ) mathematics.make_font ( "tx-math", { { name = "texgyretermes-regular.otf", features = "virtualmath", main = true }, { name = "rtxr.tfm", vector = "tex-mr" } , { name = "rtxmi.tfm", vector = "tex-mi", skewchar=0x7F }, { name = "txsy.tfm", vector = "tex-sy", skewchar=0x30, parameters = true } , { name = "txex.tfm", vector = "tex-ex", extension = true } , { name = "txsya.tfm", vector = "tex-ma" }, { name = "txsyb.tfm", vector = "tex-mb" }, } ) mathematics.make_font ( "iwona-math", { { name = "file:Iwona-Regular", features = "virtualmath", main = true }, { name = "mi-iwonari.tfm", vector = "tex-mi", skewchar=0x7F }, { name = "sy-iwonarz.tfm", vector = "tex-sy", skewchar=0x30, parameters = true } , { name = "ex-iwonar.tfm", vector = "tex-ex", extension = true } , { name = "msam10.tfm", vector = "tex-ma" }, { name = "msbm10.tfm", vector = "tex-mb" }, } ) mathematics.make_font ( "iwona-light-math", { { name = "file:IwonaLight-Regular", features = "virtualmath", main = true }, { name = "mi-iwonali.tfm", vector = "tex-mi", skewchar=0x7F }, { name = "sy-iwonalz.tfm", vector = "tex-sy", skewchar=0x30, parameters = true } , { name = "ex-iwonal.tfm", vector = "tex-ex", extension = true } , { name = "msam10.tfm", vector = "tex-ma" }, { name = "msbm10.tfm", vector = "tex-mb" }, } ) mathematics.make_font ( "iwona-medium-math", { { name = "file:IwonaMedium-Regular", features = "virtualmath", main = true }, { name = "mi-iwonami.tfm", vector = "tex-mi", skewchar=0x7F }, { name = "sy-iwonamz.tfm", vector = "tex-sy", skewchar=0x30, parameters = true } , { name = "ex-iwonam.tfm", vector = "tex-ex", extension = true } , { name = "msam10.tfm", vector = "tex-ma" }, { name = "msbm10.tfm", vector = "tex-mb" }, } ) mathematics.make_font ( "iwona-heavy-math", { { name = "file:IwonaHeavy-Regular", features = "virtualmath", main = true }, { name = "mi-iwonahi.tfm", vector = "tex-mi", skewchar=0x7F }, { name = "sy-iwonahz.tfm", vector = "tex-sy", skewchar=0x30, parameters = true } , { name = "ex-iwonah.tfm", vector = "tex-ex", extension = true } , { name = "msam10.tfm", vector = "tex-ma" }, { name = "msbm10.tfm", vector = "tex-mb" }, } ) -- not ok, we need adapted vectors ! mathematics.make_font ( "mathtimes-math", { { name = "file:texgyretermes-regular.otf", features = "virtualmath", main = true }, { name = "mtmiz.tfm", vector = "tex-mi", skewchar=0x7F }, { name = "mtsyn.tfm", vector = "tex-sy", skewchar=0x30, parameters = true }, { name = "mtex.tfm", vector = "tex-ex", extension = true }, { name = "msam10.tfm", vector = "tex-ma" }, { name = "msbm10.tfm", vector = "tex-mb" }, } ) mathematics.make_font ( "lucida-math", { { name = "lbr.afm", features = "virtualmath", main = true }, { name = "hlcrim.tfm", vector = "tex-mi", skewchar=0x7F }, { name = "hlcry.tfm", vector = "tex-sy", skewchar=0x30, parameters = true }, { name = "hlcrv.tfm", vector = "tex-ex", extension = true }, { name = "hlcra.tfm", vector = "tex-ma" }, { name = "hlcrm.tfm", vector = "tex-mb" }, } ) mathematics.make_font ( "charter-math", { { name = "file:bchr8a", features = "virtualmath", main = true }, -- { name = "md-chr7m.tfm", vector = "tex-mr" }, { name = "md-chri7m.tfm", vector = "tex-mi", skewchar=0x7F }, { name = "md-chr7y.tfm", vector = "tex-sy", skewchar=0x30, parameters = true }, { name = "md-chr7v.tfm", vector = "tex-ex", extension = true }, { name = "msam10.tfm", vector = "tex-ma" }, { name = "msbm10.tfm", vector = "tex-mb" }, } ) mathematics.make_font ( "garamond-math", { { name = "file:ugmr8y", features = "virtualmath", main = true }, -- { name = "md-gmr7m.tfm", vector = "tex-mr" }, { name = "md-gmri7m.tfm", vector = "tex-mi", skewchar=0x7F }, { name = "md-gmr7y.tfm", vector = "tex-sy", skewchar=0x30, parameters = true }, { name = "md-gmr7v.tfm", vector = "tex-ex", extension = true }, { name = "msam10.tfm", vector = "tex-ma" }, { name = "msbm10.tfm", vector = "tex-mb" }, } ) mathematics.make_font ( "utopia-math", { { name = "file:putr8y", features = "virtualmath", main = true }, -- { name = "md-utr7m.tfm", vector = "tex-mr" }, { name = "md-utri7m.tfm", vector = "tex-mi", skewchar=0x7F }, { name = "md-utr7y.tfm", vector = "tex-sy", skewchar=0x30, parameters = true }, { name = "md-utr7v.tfm", vector = "tex-ex", extension = true }, { name = "msam10.tfm", vector = "tex-ma" }, { name = "msbm10.tfm", vector = "tex-mb" }, } )