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" },
} )
