summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/generic/context/luatex
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2013-06-23 23:38:05 +0000
committerKarl Berry <karl@freefriends.org>2013-06-23 23:38:05 +0000
commit60f28f85f2707b6a48c3b5aec0ea68b8ee21e466 (patch)
treeab34d8d573457bea6a804ee3d5de48dd500bf028 /Master/texmf-dist/tex/generic/context/luatex
parentac5882d0cb115e11b5cc2e62107ef5822f3507f5 (diff)
context
git-svn-id: svn://tug.org/texlive/trunk@30865 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex/generic/context/luatex')
-rw-r--r--Master/texmf-dist/tex/generic/context/luatex/luatex-basics-gen.lua86
-rw-r--r--Master/texmf-dist/tex/generic/context/luatex/luatex-fonts-merged.lua1159
-rw-r--r--Master/texmf-dist/tex/generic/context/luatex/luatex-fonts-syn.lua43
-rw-r--r--Master/texmf-dist/tex/generic/context/luatex/luatex-fonts.lua22
-rw-r--r--Master/texmf-dist/tex/generic/context/luatex/luatex-math.lua53
-rw-r--r--Master/texmf-dist/tex/generic/context/luatex/luatex-math.tex1843
-rw-r--r--Master/texmf-dist/tex/generic/context/luatex/luatex-plain.tex1
-rw-r--r--Master/texmf-dist/tex/generic/context/luatex/luatex-test.tex10
8 files changed, 3067 insertions, 150 deletions
diff --git a/Master/texmf-dist/tex/generic/context/luatex/luatex-basics-gen.lua b/Master/texmf-dist/tex/generic/context/luatex/luatex-basics-gen.lua
index 288cfa2e15d..4a46fbb0782 100644
--- a/Master/texmf-dist/tex/generic/context/luatex/luatex-basics-gen.lua
+++ b/Master/texmf-dist/tex/generic/context/luatex/luatex-basics-gen.lua
@@ -11,9 +11,14 @@ if context then
os.exit()
end
-local dummyfunction = function() end
------ dummyreporter = function(c) return function(...) texio.write_nl(c .. " : " .. string.format(...)) end end
-local dummyreporter = function(c) return function(...) texio.write_nl(c .. " : " .. string.formatters(...)) end end
+local dummyfunction = function()
+end
+
+local dummyreporter = function(c)
+ return function(...)
+ (texio.reporter or texio.write_nl)(c .. " : " .. string.formatters(...))
+ end
+end
statistics = {
register = dummyfunction,
@@ -130,7 +135,9 @@ end
caches = { }
-local writable, readables = nil, { }
+local writable = nil
+local readables = { }
+local usingjit = jit
if not caches.namespace or caches.namespace == "" or caches.namespace == "context" then
caches.namespace = 'generic'
@@ -138,16 +145,24 @@ end
do
- local cachepaths = kpse.expand_path('$TEXMFCACHE') or ""
+ -- standard context tree setup
+
+ local cachepaths = kpse.expand_var('$TEXMFCACHE') or ""
+
+ -- quite like tex live or so
if cachepaths == "" then
- cachepaths = kpse.expand_path('$TEXMFVAR')
+ cachepaths = kpse.expand_var('$TEXMFVAR') or ""
end
+ -- this also happened to be used
+
if cachepaths == "" then
- cachepaths = kpse.expand_path('$VARTEXMF')
+ cachepaths = kpse.expand_var('$VARTEXMF') or ""
end
+ -- and this is a last resort
+
if cachepaths == "" then
cachepaths = "."
end
@@ -155,8 +170,15 @@ do
cachepaths = string.split(cachepaths,os.type == "windows" and ";" or ":")
for i=1,#cachepaths do
- if file.is_writable(cachepaths[i]) then
- writable = file.join(cachepaths[i],"luatex-cache")
+ local cachepath = cachepaths[i]
+ if not lfs.isdir(cachepath) then
+ lfs.mkdirs(cachepath) -- needed for texlive and latex
+ if lfs.isdir(cachepath) then
+ texio.write(string.format("(created cache path: %s)",cachepath))
+ end
+ end
+ if file.is_writable(cachepath) then
+ writable = file.join(cachepath,"luatex-cache")
lfs.mkdir(writable)
writable = file.join(writable,caches.namespace)
lfs.mkdir(writable)
@@ -203,8 +225,7 @@ end
local function makefullname(path,name)
if path and path ~= "" then
- name = "temp-" .. name -- clash prevention
- return file.addsuffix(file.join(path,name),"lua"), file.addsuffix(file.join(path,name),"luc")
+ return file.addsuffix(file.join(path,name),"lua"), file.addsuffix(file.join(path,name),usingjit and "lub" or "luc")
end
end
@@ -265,27 +286,36 @@ end
-- this) in which case one should limit the method to luac and enable support
-- for execution.
-caches.compilemethod = "both"
+-- function caches.compile(data,luaname,lucname)
+-- local d = io.loaddata(luaname)
+-- if not d or d == "" then
+-- d = table.serialize(data,true) -- slow
+-- end
+-- if d and d ~= "" then
+-- local f = io.open(lucname,'w')
+-- if f then
+-- local s = loadstring(d)
+-- if s then
+-- f:write(string.dump(s,true))
+-- end
+-- f:close()
+-- end
+-- end
+-- end
function caches.compile(data,luaname,lucname)
- local done = false
- if caches.compilemethod == "luac" or caches.compilemethod == "both" then
- done = os.spawn("texluac -o " .. string.quoted(lucname) .. " -s " .. string.quoted(luaname)) == 0
+ local d = io.loaddata(luaname)
+ if not d or d == "" then
+ d = table.serialize(data,true) -- slow
end
- if not done and (caches.compilemethod == "dump" or caches.compilemethod == "both") then
- local d = io.loaddata(luaname)
- if not d or d == "" then
- d = table.serialize(data,true) -- slow
- end
- if d and d ~= "" then
- local f = io.open(lucname,'w')
- if f then
- local s = loadstring(d)
- if s then
- f:write(string.dump(s,true))
- end
- f:close()
+ if d and d ~= "" then
+ local f = io.open(lucname,'wb')
+ if f then
+ local s = loadstring(d)
+ if s then
+ f:write(string.dump(s,true))
end
+ f:close()
end
end
end
diff --git a/Master/texmf-dist/tex/generic/context/luatex/luatex-fonts-merged.lua b/Master/texmf-dist/tex/generic/context/luatex/luatex-fonts-merged.lua
index c5ce7b5ce02..cf5862ca9f4 100644
--- a/Master/texmf-dist/tex/generic/context/luatex/luatex-fonts-merged.lua
+++ b/Master/texmf-dist/tex/generic/context/luatex/luatex-fonts-merged.lua
@@ -1,6 +1,6 @@
-- merged file : luatex-fonts-merged.lua
-- parent file : luatex-fonts.lua
--- merge date : 04/20/13 01:08:47
+-- merge date : 05/28/13 00:34:00
do -- begin closure to overcome local limits and interference
@@ -1986,7 +1986,7 @@ elseif not lfs.isfile then
end
end
local insert,concat=table.insert,table.concat
-local match,find=string.match,string.find
+local match,find,gmatch=string.match,string.find,string.gmatch
local lpegmatch=lpeg.match
local getcurrentdir,attributes=lfs.currentdir,lfs.attributes
local checkedsplit=string.checkedsplit
@@ -2017,11 +2017,21 @@ local pattern=(noslashes^0*slashes)^0*(noperiod^1*period)^1*C(noperiod^1)*-1
local function suffixonly(name)
return name and lpegmatch(pattern,name) or ""
end
+local pattern=(noslashes^0*slashes)^0*noperiod^1*((period*C(noperiod^1))^1)*-1+Cc("")
+local function suffixesonly(name)
+ if name then
+ return lpegmatch(pattern,name)
+ else
+ return ""
+ end
+end
file.pathpart=pathpart
file.basename=basename
file.nameonly=nameonly
file.suffixonly=suffixonly
file.suffix=suffixonly
+file.suffixesonly=suffixesonly
+file.suffixes=suffixesonly
file.dirname=pathpart
file.extname=suffixonly
local drive=C(R("az","AZ"))*colon
@@ -2046,7 +2056,11 @@ function file.splitname(str,splitdrive)
end
end
function file.splitbase(str)
- return str and lpegmatch(pattern_d,str)
+ if str then
+ return lpegmatch(pattern_d,str)
+ else
+ return "",str
+ end
end
function file.nametotable(str,splitdrive)
if str then
@@ -2295,6 +2309,13 @@ function file.strip(name,dir)
return a~="" and a or name
end
end
+function lfs.mkdirs(path)
+ local full=""
+ for sub in gmatch(path,"(/*[^\\/]+)") do
+ full=full..sub
+ lfs.mkdir(full)
+ end
+end
end -- closure
@@ -2896,8 +2917,13 @@ if context then
texio.write_nl("fatal error: this module is not for context")
os.exit()
end
-local dummyfunction=function() end
-local dummyreporter=function(c) return function(...) texio.write_nl(c.." : "..string.formatters(...)) end end
+local dummyfunction=function()
+end
+local dummyreporter=function(c)
+ return function(...)
+ (texio.reporter or texio.write_nl)(c.." : "..string.formatters(...))
+ end
+end
statistics={
register=dummyfunction,
starttiming=dummyfunction,
@@ -2978,25 +3004,34 @@ function resolvers.unresolve(s)
return s
end
caches={}
-local writable,readables=nil,{}
+local writable=nil
+local readables={}
+local usingjit=jit
if not caches.namespace or caches.namespace=="" or caches.namespace=="context" then
caches.namespace='generic'
end
do
- local cachepaths=kpse.expand_path('$TEXMFCACHE') or ""
+ local cachepaths=kpse.expand_var('$TEXMFCACHE') or ""
if cachepaths=="" then
- cachepaths=kpse.expand_path('$TEXMFVAR')
+ cachepaths=kpse.expand_var('$TEXMFVAR') or ""
end
if cachepaths=="" then
- cachepaths=kpse.expand_path('$VARTEXMF')
+ cachepaths=kpse.expand_var('$VARTEXMF') or ""
end
if cachepaths=="" then
cachepaths="."
end
cachepaths=string.split(cachepaths,os.type=="windows" and ";" or ":")
for i=1,#cachepaths do
- if file.is_writable(cachepaths[i]) then
- writable=file.join(cachepaths[i],"luatex-cache")
+ local cachepath=cachepaths[i]
+ if not lfs.isdir(cachepath) then
+ lfs.mkdirs(cachepath)
+ if lfs.isdir(cachepath) then
+ texio.write(string.format("(created cache path: %s)",cachepath))
+ end
+ end
+ if file.is_writable(cachepath) then
+ writable=file.join(cachepath,"luatex-cache")
lfs.mkdir(writable)
writable=file.join(writable,caches.namespace)
lfs.mkdir(writable)
@@ -3037,8 +3072,7 @@ function caches.getreadablepaths(category,subcategory)
end
local function makefullname(path,name)
if path and path~="" then
- name="temp-"..name
- return file.addsuffix(file.join(path,name),"lua"),file.addsuffix(file.join(path,name),"luc")
+ return file.addsuffix(file.join(path,name),"lua"),file.addsuffix(file.join(path,name),usingjit and "lub" or "luc")
end
end
function caches.is_writable(path,name)
@@ -3085,26 +3119,19 @@ function caches.savedata(path,name,data)
end
end
end
-caches.compilemethod="both"
function caches.compile(data,luaname,lucname)
- local done=false
- if caches.compilemethod=="luac" or caches.compilemethod=="both" then
- done=os.spawn("texluac -o "..string.quoted(lucname).." -s "..string.quoted(luaname))==0
+ local d=io.loaddata(luaname)
+ if not d or d=="" then
+ d=table.serialize(data,true)
end
- if not done and (caches.compilemethod=="dump" or caches.compilemethod=="both") then
- local d=io.loaddata(luaname)
- if not d or d=="" then
- d=table.serialize(data,true)
- end
- if d and d~="" then
- local f=io.open(lucname,'w')
- if f then
- local s=loadstring(d)
- if s then
- f:write(string.dump(s,true))
- end
- f:close()
+ if d and d~="" then
+ local f=io.open(lucname,'wb')
+ if f then
+ local s=loadstring(d)
+ if s then
+ f:write(string.dump(s,true))
end
+ f:close()
end
end
end
@@ -3223,7 +3250,7 @@ function containers.content(container,name)
return container.storage[name]
end
function containers.cleanname(name)
- return (gsub(lower(name),"[^%w%d]+","-"))
+ return (gsub(lower(name),"[^%w\128-\255]+","-"))
end
end -- closure
@@ -4592,7 +4619,7 @@ local floor=math.floor
local trace_loading=false trackers.register("fonts.loading",function(v) trace_loading=v end)
local trace_mapping=false trackers.register("fonts.mapping",function(v) trace_unimapping=v end)
local report_fonts=logs.reporter("fonts","loading")
-local fonts=fonts
+local fonts=fonts or {}
local mappings=fonts.mappings or {}
fonts.mappings=mappings
local function loadlumtable(filename)
@@ -4608,7 +4635,7 @@ local function loadlumtable(filename)
end
local hex=R("AF","09")
local hexfour=(hex*hex*hex*hex)/function(s) return tonumber(s,16) end
-local hexsix=(hex^1)/function(s) return tonumber(s,16) end
+local hexsix=(hex*hex*hex*hex*hex*hex)/function(s) return tonumber(s,16) end
local dec=(R("09")^1)/tonumber
local period=P(".")
local unicode=P("uni")*(hexfour*(period+P(-1))*Cc(false)+Ct(hexfour^1)*Cc(true))
@@ -4628,16 +4655,16 @@ local function makenameparser(str)
return p
end
end
-local function tounicode16(unicode)
+local function tounicode16(unicode,name)
if unicode<0x10000 then
return format("%04X",unicode)
elseif unicode<0x1FFFFFFFFF then
return format("%04X%04X",floor(unicode/1024),unicode%1024+0xDC00)
else
- report_fonts("can't convert %a into tounicode",unicode)
+ report_fonts("can't convert %a in %a into tounicode",unicode,name)
end
end
-local function tounicode16sequence(unicodes)
+local function tounicode16sequence(unicodes,name)
local t={}
for l=1,#unicodes do
local unicode=unicodes[l]
@@ -4646,7 +4673,7 @@ local function tounicode16sequence(unicodes)
elseif unicode<0x1FFFFFFFFF then
t[l]=format("%04X%04X",floor(unicode/1024),unicode%1024+0xDC00)
else
- report_fonts ("can't convert %a into tounicode",unicode)
+ report_fonts ("can't convert %a in %a into tounicode",unicode,name)
end
end
return concat(t)
@@ -4656,7 +4683,7 @@ local function fromunicode16(str)
return tonumber(str,16)
else
local l,r=match(str,"(....)(....)")
- return (tonumber(l,16)- 0xD800)*0x400+tonumber(r,16)-0xDC00
+ return (tonumber(l,16))*0x400+tonumber(r,16)-0xDC00
end
end
mappings.loadlumtable=loadlumtable
@@ -4664,9 +4691,9 @@ mappings.makenameparser=makenameparser
mappings.tounicode16=tounicode16
mappings.tounicode16sequence=tounicode16sequence
mappings.fromunicode16=fromunicode16
-local separator=S("_.")
-local other=C((1-separator)^1)
-local ligsplitter=Ct(other*(separator*other)^0)
+local ligseparator=P("_")
+local varseparator=P(".")
+local namesplitter=Ct(C((1-ligseparator-varseparator)^1)*(ligseparator*C((1-ligseparator-varseparator)^1))^0)
function mappings.addtounicode(data,filename)
local resources=data.resources
local properties=data.properties
@@ -4708,7 +4735,7 @@ function mappings.addtounicode(data,filename)
local unicode=lumunic and lumunic[name] or unicodevector[name]
if unicode then
originals[index]=unicode
- tounicode[index]=tounicode16(unicode)
+ tounicode[index]=tounicode16(unicode,name)
ns=ns+1
end
if (not unicode) and usedmap then
@@ -4717,7 +4744,7 @@ function mappings.addtounicode(data,filename)
unicode=cidcodes[foundindex]
if unicode then
originals[index]=unicode
- tounicode[index]=tounicode16(unicode)
+ tounicode[index]=tounicode16(unicode,name)
ns=ns+1
else
local reference=cidnames[foundindex]
@@ -4727,11 +4754,11 @@ function mappings.addtounicode(data,filename)
unicode=cidcodes[foundindex]
if unicode then
originals[index]=unicode
- tounicode[index]=tounicode16(unicode)
+ tounicode[index]=tounicode16(unicode,name)
ns=ns+1
end
end
- if not unicode then
+ if not unicode or unicode=="" then
local foundcodes,multiple=lpegmatch(uparser,reference)
if foundcodes then
originals[index]=foundcodes
@@ -4740,7 +4767,7 @@ function mappings.addtounicode(data,filename)
nl=nl+1
unicode=true
else
- tounicode[index]=tounicode16(foundcodes)
+ tounicode[index]=tounicode16(foundcodes,name)
ns=ns+1
unicode=foundcodes
end
@@ -4750,12 +4777,12 @@ function mappings.addtounicode(data,filename)
end
end
end
- if not unicode then
- local split=lpegmatch(ligsplitter,name)
- local nplit=split and #split or 0
- if nplit>=2 then
+ if not unicode or unicode=="" then
+ local split=lpegmatch(namesplitter,name)
+ local nsplit=split and #split or 0
+ if nsplit>=2 then
local t,n={},0
- for l=1,nplit do
+ for l=1,nsplit do
local base=split[l]
local u=unicodes[base] or unicodevector[base]
if not u then
@@ -4771,7 +4798,7 @@ function mappings.addtounicode(data,filename)
if n==0 then
elseif n==1 then
originals[index]=t[1]
- tounicode[index]=tounicode16(t[1])
+ tounicode[index]=tounicode16(t[1],name)
else
originals[index]=t
tounicode[index]=tounicode16sequence(t)
@@ -4781,17 +4808,17 @@ function mappings.addtounicode(data,filename)
else
end
end
- if not unicode then
+ if not unicode or unicode=="" then
local foundcodes,multiple=lpegmatch(uparser,name)
if foundcodes then
if multiple then
originals[index]=foundcodes
- tounicode[index]=tounicode16sequence(foundcodes)
+ tounicode[index]=tounicode16sequence(foundcodes,name)
nl=nl+1
unicode=true
else
originals[index]=foundcodes
- tounicode[index]=tounicode16(foundcodes)
+ tounicode[index]=tounicode16(foundcodes,name)
ns=ns+1
unicode=foundcodes
end
@@ -4834,22 +4861,35 @@ end
local fonts=fonts
fonts.names=fonts.names or {}
fonts.names.version=1.001
-fonts.names.basename="luatex-fonts-names.lua"
+fonts.names.basename="luatex-fonts-names"
fonts.names.new_to_old={}
fonts.names.old_to_new={}
+fonts.names.cache=containers.define("fonts","data",fonts.names.version,true)
local data,loaded=nil,false
local fileformats={ "lua","tex","other text files" }
+function fonts.names.reportmissingbase()
+ texio.write("<missing font database, run: mtxrun --script fonts --reload --simple>")
+ fonts.names.reportmissingbase=nil
+end
+function fonts.names.reportmissingname()
+ texio.write("<unknown font in database, run: mtxrun --script fonts --reload --simple>")
+ fonts.names.reportmissingname=nil
+end
function fonts.names.resolve(name,sub)
if not loaded then
local basename=fonts.names.basename
if basename and basename~="" then
- for i=1,#fileformats do
- local format=fileformats[i]
- local foundname=resolvers.findfile(basename,format) or ""
- if foundname~="" then
- data=dofile(foundname)
- texio.write("<font database loaded: ",foundname,">")
- break
+ data=containers.read(fonts.names.cache,basename)
+ if not data then
+ basename=file.addsuffix(basename,"lua")
+ for i=1,#fileformats do
+ local format=fileformats[i]
+ local foundname=resolvers.findfile(basename,format) or ""
+ if foundname~="" then
+ data=dofile(foundname)
+ texio.write("<font database loaded: ",foundname,">")
+ break
+ end
end
end
end
@@ -4865,9 +4905,12 @@ function fonts.names.resolve(name,sub)
else
return filename,false
end
- else
+ elseif fonts.names.reportmissingname then
+ fonts.names.reportmissingname()
return name,false
end
+ elseif fonts.names.reportmissingbase then
+ fonts.names.reportmissingbase()
end
end
fonts.names.resolvespec=fonts.names.resolve
@@ -5036,7 +5079,7 @@ local report_otf=logs.reporter("fonts","otf loading")
local fonts=fonts
local otf=fonts.handlers.otf
otf.glists={ "gsub","gpos" }
-otf.version=2.742
+otf.version=2.743
otf.cache=containers.define("fonts","otf",otf.version,true)
local fontdata=fonts.hashes.identifiers
local chardata=characters and characters.data
@@ -5055,6 +5098,7 @@ local usemetatables=false
local packdata=true
local syncspace=true
local forcenotdef=false
+local includesubfonts=false
local wildcard="*"
local default="dflt"
local fontloaderfields=fontloader.fields
@@ -5181,8 +5225,8 @@ local ordered_enhancers={
"check glyphs",
"check metadata",
"check extra features",
- "add duplicates",
"check encoding",
+ "add duplicates",
"cleanup tables",
}
local actions=allocate()
@@ -5526,7 +5570,7 @@ actions["prepare glyphs"]=function(data,filename,raw)
local duplicates=resources.duplicates
local variants=resources.variants
if rawsubfonts then
- metadata.subfonts={}
+ metadata.subfonts=includesubfonts and {}
properties.cidinfo=rawcidinfo
if rawcidinfo.registry then
local cidmap=fonts.cid.getmap(rawcidinfo)
@@ -5537,7 +5581,9 @@ actions["prepare glyphs"]=function(data,filename,raw)
for cidindex=1,#rawsubfonts do
local subfont=rawsubfonts[cidindex]
local cidglyphs=subfont.glyphs
- metadata.subfonts[cidindex]=somecopy(subfont)
+ if includesubfonts then
+ metadata.subfonts[cidindex]=somecopy(subfont)
+ end
for index=0,subfont.glyphcnt-1 do
local glyph=cidglyphs[index]
if glyph then
@@ -5546,6 +5592,10 @@ actions["prepare glyphs"]=function(data,filename,raw)
if not unicode or unicode==-1 or unicode>=criterium then
unicode=cidunicodes[index]
end
+ if unicode and descriptions[unicode] then
+ report_otf("preventing glyph %a at index %H to overload unicode %U",name or "noname",index,unicode)
+ unicode=-1
+ end
if not unicode or unicode==-1 or unicode>=criterium then
if not name then
name=format("u%06X",private)
@@ -5649,7 +5699,8 @@ actions["check encoding"]=function(data,filename,raw)
local resources=data.resources
local properties=data.properties
local unicodes=resources.unicodes
- local indices=resources.indices
+ local indices=resources.indices
+ local duplicates=resources.duplicates
local mapdata=raw.map or {}
local unicodetoindex=mapdata and mapdata.map or {}
local encname=lower(data.enc_name or mapdata.enc_name or "")
@@ -5661,10 +5712,35 @@ actions["check encoding"]=function(data,filename,raw)
for unicode,index in next,unicodetoindex do
if unicode<=criterium and not descriptions[unicode] then
local parent=indices[index]
- if parent then
- report_otf("weird, unicode %U points to %U with index %H",unicode,parent,index)
- else
+ if not parent then
report_otf("weird, unicode %U points to nowhere with index %H",unicode,index)
+ else
+ local parentdescription=descriptions[parent]
+ if parentdescription then
+ local altuni=parentdescription.altuni
+ if not altuni then
+ altuni={ { unicode=parent } }
+ parentdescription.altuni=altuni
+ duplicates[parent]={ unicode }
+ else
+ local done=false
+ for i=1,#altuni do
+ if altuni[i].unicode==parent then
+ done=true
+ break
+ end
+ end
+ if not done then
+ altuni[#altuni+1]={ unicode=parent }
+ table.insert(duplicates[parent],unicode)
+ end
+ end
+ if trace_loading then
+ report_otf("weird, unicode %U points to nowhere with index %H",unicode,index)
+ end
+ else
+ report_otf("weird, unicode %U points to %U with index %H",unicode,index)
+ end
end
end
end
@@ -6103,6 +6179,14 @@ actions["reorganize lookups"]=function(data,filename,raw)
local current=coverage.current
if current then
current=t_uncover(splitter,t_u_cache,current)
+ local lookups=rule.lookups
+ if lookups then
+ for i=1,#current do
+ if not lookups[i] then
+ lookups[i]=""
+ end
+ end
+ end
rule.current=t_hashed(current,t_h_cache)
end
local after=coverage.after
@@ -6749,7 +6833,7 @@ local function checkmathsize(tfmdata,mathsize)
end
registerotffeature {
name="mathsize",
- description="apply mathsize as specified in the font",
+ description="apply mathsize specified in the font",
initializers={
base=checkmathsize,
node=checkmathsize,
@@ -7354,8 +7438,8 @@ local function featuresinitializer(tfmdata,value)
end
end
end
- if basepositions then
- for feature,data in next,basepositions do
+ if basepositionings then
+ for feature,data in next,basepositionings do
local value=features[feature]
if value then
local validlookups,lookuplist=collectlookups(rawdata,feature,script,language)
@@ -7409,6 +7493,7 @@ nodes.injections=nodes.injections or {}
local injections=nodes.injections
local nodecodes=nodes.nodecodes
local glyph_code=nodecodes.glyph
+local kern_code=nodecodes.kern
local nodepool=nodes.pool
local newkern=nodepool.kern
local traverse_id=node.traverse_id
@@ -7502,7 +7587,7 @@ local function trace(head)
local cb=n[a_cursbase]
local cc=n[a_curscurs]
local char=n.char
- report_injections("font %s, char %U, glyph %c",char,n.font,char)
+ report_injections("font %s, char %U, glyph %c",n.font,char,char)
if kp then
local k=kerns[kp]
if k[3] then
@@ -7539,6 +7624,24 @@ local function trace(head)
end
report_injections("end run")
end
+local function show_result(head)
+ local current=head
+ local skipping=false
+ while current do
+ local id=current.id
+ if id==glyph_code then
+ report_injections("char: %C, width %p, xoffset %p, yoffset %p",current.char,current.width,current.xoffset,current.yoffset)
+ skipping=false
+ elseif id==kern_code then
+ report_injections("kern: %p",current.kern)
+ skipping=false
+ elseif not skipping then
+ report_injections()
+ skipping=true
+ end
+ current=current.next
+ end
+end
function injections.handler(head,where,keep)
local has_marks,has_cursives,has_kerns=next(marks),next(cursives),next(kerns)
if has_marks or has_cursives then
@@ -7677,17 +7780,26 @@ function injections.handler(head,where,keep)
local d=mrks[index]
if d then
local rlmode=d[3]
- if rlmode and rlmode>=0 then
- local k=wx[p]
- if k then
- n.xoffset=p.xoffset-p.width+d[1]-k[2]
+ local k=wx[p]
+ if k then
+ local x=k[2]
+ local w=k[4]
+ if w then
+ if rlmode and rlmode>=0 then
+ n.xoffset=p.xoffset-p.width+d[1]-(w-x)
+ else
+ n.xoffset=p.xoffset-d[1]-x
+ end
else
- n.xoffset=p.xoffset-p.width+d[1]
+ if rlmode and rlmode>=0 then
+ n.xoffset=p.xoffset-p.width+d[1]
+ else
+ n.xoffset=p.xoffset-d[1]-x
+ end
end
else
- local k=wx[p]
- if k then
- n.xoffset=p.xoffset-d[1]-k[2]
+ if rlmode and rlmode>=0 then
+ n.xoffset=p.xoffset-p.width+d[1]
else
n.xoffset=p.xoffset-d[1]
end
@@ -7714,27 +7826,28 @@ function injections.handler(head,where,keep)
end
if next(wx) then
for n,k in next,wx do
- local x,w=k[2] or 0,k[4]
+ local x=k[2]
+ local w=k[4]
if w then
local rl=k[1]
local wx=w-x
if rl<0 then
if wx~=0 then
- insert_node_before(head,n,newkern(wx))
+ insert_node_before(head,n,newkern(wx))
end
if x~=0 then
- insert_node_after (head,n,newkern(x))
+ insert_node_after (head,n,newkern(x))
end
else
if x~=0 then
- insert_node_before(head,n,newkern(x))
+ insert_node_before(head,n,newkern(x))
end
if wx~=0 then
- insert_node_after(head,n,newkern(wx))
+ insert_node_after (head,n,newkern(wx))
end
end
elseif x~=0 then
- insert_node_before(head,n,newkern(x))
+ insert_node_before(head,n,newkern(x))
end
end
end
@@ -7743,9 +7856,9 @@ function injections.handler(head,where,keep)
if k~=0 then
local rln=rl[n]
if rln and rln<0 then
- insert_node_before(head,n,newkern(-k))
+ insert_node_before(head,n,newkern(-k))
else
- insert_node_before(head,n,newkern(k))
+ insert_node_before(head,n,newkern(k))
end
end
end
@@ -8256,7 +8369,7 @@ local fonthashes=fonts.hashes
local fontdata=fonthashes.identifiers
local otffeatures=fonts.constructors.newfeatures("otf")
local registerotffeature=otffeatures.register
-local onetimemessage=fonts.loggers.onetimemessage
+local onetimemessage=fonts.loggers.onetimemessage or function() end
otf.defaultnodealternate="none"
local tfmdata=false
local characters=false
@@ -8421,16 +8534,18 @@ local function toligature(kind,lookupname,head,start,stop,char,markflag,discfoun
logwarning("%s: keep mark %s, gets index %s",pref(kind,lookupname),gref(char),start[a_ligacomp])
end
head,current=insert_node_after(head,current,copy_node(start))
+ elseif trace_marks then
+ logwarning("%s: delete mark %s",pref(kind,lookupname),gref(char))
end
start=start.next
end
- local start=components
- while start and start.id==glyph_code do
+ local start=current.next
+ while start and start.id==glyph_code do
local char=start.char
if marks[char] then
start[a_ligacomp]=baseindex+(start[a_ligacomp] or componentindex)
if trace_marks then
- logwarning("%s: keep mark %s, gets index %s",pref(kind,lookupname),gref(char),start[a_ligacomp])
+ logwarning("%s: set mark %s, gets index %s",pref(kind,lookupname),gref(char),start[a_ligacomp])
end
else
break
@@ -8651,7 +8766,7 @@ function handlers.gpos_mark2base(head,start,kind,lookupname,markanchors,sequence
logwarning("%s, no matching anchors for mark %s and base %s",pref(kind,lookupname),gref(markchar),gref(basechar))
end
end
- else
+ elseif trace_bugs then
onetimemessage(currentfont,basechar,"no base anchors",report_fonts)
end
elseif trace_bugs then
@@ -8704,6 +8819,10 @@ function handlers.gpos_mark2ligature(head,start,kind,lookupname,markanchors,sequ
pref(kind,lookupname),anchor,index,bound,gref(markchar),gref(basechar),index,dx,dy)
end
return head,start,true
+ else
+ if trace_bugs then
+ logwarning("%s: no matching anchors for mark %s and baselig %s with index %a",pref(kind,lookupname),gref(markchar),gref(basechar),index)
+ end
end
end
end
@@ -8713,7 +8832,7 @@ function handlers.gpos_mark2ligature(head,start,kind,lookupname,markanchors,sequ
end
end
end
- else
+ elseif trace_bugs then
onetimemessage(currentfont,basechar,"no base anchors",report_fonts)
end
elseif trace_bugs then
@@ -8766,7 +8885,7 @@ function handlers.gpos_mark2mark(head,start,kind,lookupname,markanchors,sequence
end
end
end
- else
+ elseif trace_bugs then
onetimemessage(currentfont,basechar,"no base anchors",report_fonts)
end
elseif trace_bugs then
@@ -8815,7 +8934,7 @@ function handlers.gpos_cursive(head,start,kind,lookupname,exitanchors,sequence)
end
end
end
- else
+ elseif trace_bugs then
onetimemessage(currentfont,startchar,"no entry anchors",report_fonts)
end
break
@@ -9363,7 +9482,7 @@ function chainprocs.gpos_cursive(head,start,stop,kind,chainname,currentcontext,l
end
end
end
- else
+ elseif trace_bugs then
onetimemessage(currentfont,startchar,"no entry anchors",report_fonts)
end
break
@@ -10022,6 +10141,8 @@ for s=1,#datasets do
if ok then
success=true
break
+ elseif not start then
+ break
end
end
else
@@ -10313,6 +10434,842 @@ end -- closure
do -- begin closure to overcome local limits and interference
+if not modules then modules={} end modules ['font-otp']={
+ version=1.001,
+ comment="companion to font-otf.lua (packing)",
+ author="Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright="PRAGMA ADE / ConTeXt Development Team",
+ license="see context related readme files"
+}
+local next,type=next,type
+local sort,concat=table.sort,table.concat
+local sortedhash=table.sortedhash
+local trace_packing=false trackers.register("otf.packing",function(v) trace_packing=v end)
+local trace_loading=false trackers.register("otf.loading",function(v) trace_loading=v end)
+local report_otf=logs.reporter("fonts","otf loading")
+fonts=fonts or {}
+local handlers=fonts.handlers or {}
+fonts.handlers=handlers
+local otf=handlers.otf or {}
+handlers.otf=otf
+local enhancers=otf.enhancers or {}
+otf.enhancers=enhancers
+local glists=otf.glists or { "gsub","gpos" }
+otf.glists=glists
+local criterium=1
+local threshold=0
+local function tabstr_normal(t)
+ local s={}
+ local n=0
+ for k,v in next,t do
+ n=n+1
+ if type(v)=="table" then
+ s[n]=k..">"..tabstr_normal(v)
+ elseif v==true then
+ s[n]=k.."+"
+ elseif v then
+ s[n]=k.."="..v
+ else
+ s[n]=k.."-"
+ end
+ end
+ if n==0 then
+ return ""
+ elseif n==1 then
+ return s[1]
+ else
+ sort(s)
+ return concat(s,",")
+ end
+end
+local function tabstr_flat(t)
+ local s={}
+ local n=0
+ for k,v in next,t do
+ n=n+1
+ s[n]=k.."="..v
+ end
+ if n==0 then
+ return ""
+ elseif n==1 then
+ return s[1]
+ else
+ sort(s)
+ return concat(s,",")
+ end
+end
+local function tabstr_mixed(t)
+ local s={}
+ local n=#t
+ if n==0 then
+ return ""
+ elseif n==1 then
+ local k=t[1]
+ if k==true then
+ return "++"
+ elseif k==false then
+ return "--"
+ else
+ return tostring(k)
+ end
+ else
+ for i=1,n do
+ local k=t[i]
+ if k==true then
+ s[i]="++"
+ elseif k==false then
+ s[i]="--"
+ else
+ s[i]=k
+ end
+ end
+ return concat(s,",")
+ end
+end
+local function tabstr_boolean(t)
+ local s={}
+ local n=0
+ for k,v in next,t do
+ n=n+1
+ if v then
+ s[n]=k.."+"
+ else
+ s[n]=k.."-"
+ end
+ end
+ if n==0 then
+ return ""
+ elseif n==1 then
+ return s[1]
+ else
+ sort(s)
+ return concat(s,",")
+ end
+end
+local function packdata(data)
+ if data then
+ local h,t,c={},{},{}
+ local hh,tt,cc={},{},{}
+ local nt,ntt=0,0
+ local function pack_normal(v)
+ local tag=tabstr_normal(v)
+ local ht=h[tag]
+ if ht then
+ c[ht]=c[ht]+1
+ return ht
+ else
+ nt=nt+1
+ t[nt]=v
+ h[tag]=nt
+ c[nt]=1
+ return nt
+ end
+ end
+ local function pack_flat(v)
+ local tag=tabstr_flat(v)
+ local ht=h[tag]
+ if ht then
+ c[ht]=c[ht]+1
+ return ht
+ else
+ nt=nt+1
+ t[nt]=v
+ h[tag]=nt
+ c[nt]=1
+ return nt
+ end
+ end
+ local function pack_boolean(v)
+ local tag=tabstr_boolean(v)
+ local ht=h[tag]
+ if ht then
+ c[ht]=c[ht]+1
+ return ht
+ else
+ nt=nt+1
+ t[nt]=v
+ h[tag]=nt
+ c[nt]=1
+ return nt
+ end
+ end
+ local function pack_indexed(v)
+ local tag=concat(v," ")
+ local ht=h[tag]
+ if ht then
+ c[ht]=c[ht]+1
+ return ht
+ else
+ nt=nt+1
+ t[nt]=v
+ h[tag]=nt
+ c[nt]=1
+ return nt
+ end
+ end
+ local function pack_mixed(v)
+ local tag=tabstr_mixed(v)
+ local ht=h[tag]
+ if ht then
+ c[ht]=c[ht]+1
+ return ht
+ else
+ nt=nt+1
+ t[nt]=v
+ h[tag]=nt
+ c[nt]=1
+ return nt
+ end
+ end
+ local function pack_final(v)
+ if c[v]<=criterium then
+ return t[v]
+ else
+ local hv=hh[v]
+ if hv then
+ return hv
+ else
+ ntt=ntt+1
+ tt[ntt]=t[v]
+ hh[v]=ntt
+ cc[ntt]=c[v]
+ return ntt
+ end
+ end
+ end
+ local function success(stage,pass)
+ if nt==0 then
+ if trace_loading or trace_packing then
+ report_otf("pack quality: nothing to pack")
+ end
+ return false
+ elseif nt>=threshold then
+ local one,two,rest=0,0,0
+ if pass==1 then
+ for k,v in next,c do
+ if v==1 then
+ one=one+1
+ elseif v==2 then
+ two=two+1
+ else
+ rest=rest+1
+ end
+ end
+ else
+ for k,v in next,cc do
+ if v>20 then
+ rest=rest+1
+ elseif v>10 then
+ two=two+1
+ else
+ one=one+1
+ end
+ end
+ data.tables=tt
+ end
+ if trace_loading or trace_packing then
+ report_otf("pack quality: stage %s, pass %s, %s packed, 1-10:%s, 11-20:%s, rest:%s (criterium: %s)",stage,pass,one+two+rest,one,two,rest,criterium)
+ end
+ return true
+ else
+ if trace_loading or trace_packing then
+ report_otf("pack quality: stage %s, pass %s, %s packed, aborting pack (threshold: %s)",stage,pass,nt,threshold)
+ end
+ return false
+ end
+ end
+ local function packers(pass)
+ if pass==1 then
+ return pack_normal,pack_indexed,pack_flat,pack_boolean,pack_mixed
+ else
+ return pack_final,pack_final,pack_final,pack_final,pack_final
+ end
+ end
+ local resources=data.resources
+ local lookuptypes=resources.lookuptypes
+ for pass=1,2 do
+ if trace_packing then
+ report_otf("start packing: stage 1, pass %s",pass)
+ end
+ local pack_normal,pack_indexed,pack_flat,pack_boolean,pack_mixed=packers(pass)
+ for unicode,description in next,data.descriptions do
+ local boundingbox=description.boundingbox
+ if boundingbox then
+ description.boundingbox=pack_indexed(boundingbox)
+ end
+ local slookups=description.slookups
+ if slookups then
+ for tag,slookup in next,slookups do
+ local what=lookuptypes[tag]
+ if what=="pair" then
+ local t=slookup[2] if t then slookup[2]=pack_indexed(t) end
+ local t=slookup[3] if t then slookup[3]=pack_indexed(t) end
+ elseif what~="substitution" then
+ slookups[tag]=pack_indexed(slookup)
+ end
+ end
+ end
+ local mlookups=description.mlookups
+ if mlookups then
+ for tag,mlookup in next,mlookups do
+ local what=lookuptypes[tag]
+ if what=="pair" then
+ for i=1,#mlookup do
+ local lookup=mlookup[i]
+ local t=lookup[2] if t then lookup[2]=pack_indexed(t) end
+ local t=lookup[3] if t then lookup[3]=pack_indexed(t) end
+ end
+ elseif what~="substitution" then
+ for i=1,#mlookup do
+ mlookup[i]=pack_indexed(mlookup[i])
+ end
+ end
+ end
+ end
+ local kerns=description.kerns
+ if kerns then
+ for tag,kern in next,kerns do
+ kerns[tag]=pack_flat(kern)
+ end
+ end
+ local math=description.math
+ if math then
+ local kerns=math.kerns
+ if kerns then
+ for tag,kern in next,kerns do
+ kerns[tag]=pack_normal(kern)
+ end
+ end
+ end
+ local anchors=description.anchors
+ if anchors then
+ for what,anchor in next,anchors do
+ if what=="baselig" then
+ for _,a in next,anchor do
+ for k=1,#a do
+ a[k]=pack_indexed(a[k])
+ end
+ end
+ else
+ for k,v in next,anchor do
+ anchor[k]=pack_indexed(v)
+ end
+ end
+ end
+ end
+ local altuni=description.altuni
+ if altuni then
+ for i=1,#altuni do
+ altuni[i]=pack_flat(altuni[i])
+ end
+ end
+ end
+ local lookups=data.lookups
+ if lookups then
+ for _,lookup in next,lookups do
+ local rules=lookup.rules
+ if rules then
+ for i=1,#rules do
+ local rule=rules[i]
+ local r=rule.before if r then for i=1,#r do r[i]=pack_boolean(r[i]) end end
+ local r=rule.after if r then for i=1,#r do r[i]=pack_boolean(r[i]) end end
+ local r=rule.current if r then for i=1,#r do r[i]=pack_boolean(r[i]) end end
+ local r=rule.replacements if r then rule.replacements=pack_flat (r) end
+ local r=rule.lookups if r then rule.lookups=pack_indexed(r) end
+ end
+ end
+ end
+ end
+ local anchor_to_lookup=resources.anchor_to_lookup
+ if anchor_to_lookup then
+ for anchor,lookup in next,anchor_to_lookup do
+ anchor_to_lookup[anchor]=pack_normal(lookup)
+ end
+ end
+ local lookup_to_anchor=resources.lookup_to_anchor
+ if lookup_to_anchor then
+ for lookup,anchor in next,lookup_to_anchor do
+ lookup_to_anchor[lookup]=pack_normal(anchor)
+ end
+ end
+ local sequences=resources.sequences
+ if sequences then
+ for feature,sequence in next,sequences do
+ local flags=sequence.flags
+ if flags then
+ sequence.flags=pack_normal(flags)
+ end
+ local subtables=sequence.subtables
+ if subtables then
+ sequence.subtables=pack_normal(subtables)
+ end
+ local features=sequence.features
+ if features then
+ for script,feature in next,features do
+ features[script]=pack_normal(feature)
+ end
+ end
+ end
+ end
+ local lookups=resources.lookups
+ if lookups then
+ for name,lookup in next,lookups do
+ local flags=lookup.flags
+ if flags then
+ lookup.flags=pack_normal(flags)
+ end
+ local subtables=lookup.subtables
+ if subtables then
+ lookup.subtables=pack_normal(subtables)
+ end
+ end
+ end
+ local features=resources.features
+ if features then
+ for _,what in next,glists do
+ local list=features[what]
+ if list then
+ for feature,spec in next,list do
+ list[feature]=pack_normal(spec)
+ end
+ end
+ end
+ end
+ if not success(1,pass) then
+ return
+ end
+ end
+ if nt>0 then
+ for pass=1,2 do
+ if trace_packing then
+ report_otf("start packing: stage 2, pass %s",pass)
+ end
+ local pack_normal,pack_indexed,pack_flat,pack_boolean,pack_mixed=packers(pass)
+ for unicode,description in next,data.descriptions do
+ local kerns=description.kerns
+ if kerns then
+ description.kerns=pack_normal(kerns)
+ end
+ local math=description.math
+ if math then
+ local kerns=math.kerns
+ if kerns then
+ math.kerns=pack_normal(kerns)
+ end
+ end
+ local anchors=description.anchors
+ if anchors then
+ description.anchors=pack_normal(anchors)
+ end
+ local mlookups=description.mlookups
+ if mlookups then
+ for tag,mlookup in next,mlookups do
+ mlookups[tag]=pack_normal(mlookup)
+ end
+ end
+ local altuni=description.altuni
+ if altuni then
+ description.altuni=pack_normal(altuni)
+ end
+ end
+ local lookups=data.lookups
+ if lookups then
+ for _,lookup in next,lookups do
+ local rules=lookup.rules
+ if rules then
+ for i=1,#rules do
+ local rule=rules[i]
+ local r=rule.before if r then rule.before=pack_normal(r) end
+ local r=rule.after if r then rule.after=pack_normal(r) end
+ local r=rule.current if r then rule.current=pack_normal(r) end
+ end
+ end
+ end
+ end
+ local sequences=resources.sequences
+ if sequences then
+ for feature,sequence in next,sequences do
+ sequence.features=pack_normal(sequence.features)
+ end
+ end
+ if not success(2,pass) then
+ end
+ end
+ for pass=1,2 do
+ local pack_normal,pack_indexed,pack_flat,pack_boolean,pack_mixed=packers(pass)
+ for unicode,description in next,data.descriptions do
+ local slookups=description.slookups
+ if slookups then
+ description.slookups=pack_normal(slookups)
+ end
+ local mlookups=description.mlookups
+ if mlookups then
+ description.mlookups=pack_normal(mlookups)
+ end
+ end
+ end
+ end
+ end
+end
+local unpacked_mt={
+ __index=function(t,k)
+ t[k]=false
+ return k
+ end
+}
+local function unpackdata(data)
+ if data then
+ local tables=data.tables
+ if tables then
+ local resources=data.resources
+ local lookuptypes=resources.lookuptypes
+ local unpacked={}
+ setmetatable(unpacked,unpacked_mt)
+ for unicode,description in next,data.descriptions do
+ local tv=tables[description.boundingbox]
+ if tv then
+ description.boundingbox=tv
+ end
+ local slookups=description.slookups
+ if slookups then
+ local tv=tables[slookups]
+ if tv then
+ description.slookups=tv
+ slookups=unpacked[tv]
+ end
+ if slookups then
+ for tag,lookup in next,slookups do
+ local what=lookuptypes[tag]
+ if what=="pair" then
+ local tv=tables[lookup[2]]
+ if tv then
+ lookup[2]=tv
+ end
+ local tv=tables[lookup[3]]
+ if tv then
+ lookup[3]=tv
+ end
+ elseif what~="substitution" then
+ local tv=tables[lookup]
+ if tv then
+ slookups[tag]=tv
+ end
+ end
+ end
+ end
+ end
+ local mlookups=description.mlookups
+ if mlookups then
+ local tv=tables[mlookups]
+ if tv then
+ description.mlookups=tv
+ mlookups=unpacked[tv]
+ end
+ if mlookups then
+ for tag,list in next,mlookups do
+ local tv=tables[list]
+ if tv then
+ mlookups[tag]=tv
+ list=unpacked[tv]
+ end
+ if list then
+ local what=lookuptypes[tag]
+ if what=="pair" then
+ for i=1,#list do
+ local lookup=list[i]
+ local tv=tables[lookup[2]]
+ if tv then
+ lookup[2]=tv
+ end
+ local tv=tables[lookup[3]]
+ if tv then
+ lookup[3]=tv
+ end
+ end
+ elseif what~="substitution" then
+ for i=1,#list do
+ local tv=tables[list[i]]
+ if tv then
+ list[i]=tv
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ local kerns=description.kerns
+ if kerns then
+ local tm=tables[kerns]
+ if tm then
+ description.kerns=tm
+ kerns=unpacked[tm]
+ end
+ if kerns then
+ for k,kern in next,kerns do
+ local tv=tables[kern]
+ if tv then
+ kerns[k]=tv
+ end
+ end
+ end
+ end
+ local math=description.math
+ if math then
+ local kerns=math.kerns
+ if kerns then
+ local tm=tables[kerns]
+ if tm then
+ math.kerns=tm
+ kerns=unpacked[tm]
+ end
+ if kerns then
+ for k,kern in next,kerns do
+ local tv=tables[kern]
+ if tv then
+ kerns[k]=tv
+ end
+ end
+ end
+ end
+ end
+ local anchors=description.anchors
+ if anchors then
+ local ta=tables[anchors]
+ if ta then
+ description.anchors=ta
+ anchors=unpacked[ta]
+ end
+ if anchors then
+ for tag,anchor in next,anchors do
+ if tag=="baselig" then
+ for _,list in next,anchor do
+ for i=1,#list do
+ local tv=tables[list[i]]
+ if tv then
+ list[i]=tv
+ end
+ end
+ end
+ else
+ for a,data in next,anchor do
+ local tv=tables[data]
+ if tv then
+ anchor[a]=tv
+ end
+ end
+ end
+ end
+ end
+ end
+ local altuni=description.altuni
+ if altuni then
+ local altuni=tables[altuni]
+ if altuni then
+ description.altuni=altuni
+ for i=1,#altuni do
+ local tv=tables[altuni[i]]
+ if tv then
+ altuni[i]=tv
+ end
+ end
+ end
+ end
+ end
+ local lookups=data.lookups
+ if lookups then
+ for _,lookup in next,lookups do
+ local rules=lookup.rules
+ if rules then
+ for i=1,#rules do
+ local rule=rules[i]
+ local before=rule.before
+ if before then
+ local tv=tables[before]
+ if tv then
+ rule.before=tv
+ before=unpacked[tv]
+ end
+ if before then
+ for i=1,#before do
+ local tv=tables[before[i]]
+ if tv then
+ before[i]=tv
+ end
+ end
+ end
+ end
+ local after=rule.after
+ if after then
+ local tv=tables[after]
+ if tv then
+ rule.after=tv
+ after=unpacked[tv]
+ end
+ if after then
+ for i=1,#after do
+ local tv=tables[after[i]]
+ if tv then
+ after[i]=tv
+ end
+ end
+ end
+ end
+ local current=rule.current
+ if current then
+ local tv=tables[current]
+ if tv then
+ rule.current=tv
+ current=unpacked[tv]
+ end
+ if current then
+ for i=1,#current do
+ local tv=tables[current[i]]
+ if tv then
+ current[i]=tv
+ end
+ end
+ end
+ end
+ local replacements=rule.replacements
+ if replacements then
+ local tv=tables[replacements]
+ if tv then
+ rule.replacements=tv
+ end
+ end
+ local fore=rule.fore
+ if fore then
+ local tv=tables[fore]
+ if tv then
+ rule.fore=tv
+ end
+ end
+ local back=rule.back
+ if back then
+ local tv=tables[back]
+ if tv then
+ rule.back=tv
+ end
+ end
+ local names=rule.names
+ if names then
+ local tv=tables[names]
+ if tv then
+ rule.names=tv
+ end
+ end
+ local lookups=rule.lookups
+ if lookups then
+ local tv=tables[lookups]
+ if tv then
+ rule.lookups=tv
+ end
+ end
+ end
+ end
+ end
+ end
+ local anchor_to_lookup=resources.anchor_to_lookup
+ if anchor_to_lookup then
+ for anchor,lookup in next,anchor_to_lookup do
+ local tv=tables[lookup]
+ if tv then
+ anchor_to_lookup[anchor]=tv
+ end
+ end
+ end
+ local lookup_to_anchor=resources.lookup_to_anchor
+ if lookup_to_anchor then
+ for lookup,anchor in next,lookup_to_anchor do
+ local tv=tables[anchor]
+ if tv then
+ lookup_to_anchor[lookup]=tv
+ end
+ end
+ end
+ local ls=resources.sequences
+ if ls then
+ for _,feature in next,ls do
+ local flags=feature.flags
+ if flags then
+ local tv=tables[flags]
+ if tv then
+ feature.flags=tv
+ end
+ end
+ local subtables=feature.subtables
+ if subtables then
+ local tv=tables[subtables]
+ if tv then
+ feature.subtables=tv
+ end
+ end
+ local features=feature.features
+ if features then
+ local tv=tables[features]
+ if tv then
+ feature.features=tv
+ features=unpacked[tv]
+ end
+ if features then
+ for script,data in next,features do
+ local tv=tables[data]
+ if tv then
+ features[script]=tv
+ end
+ end
+ end
+ end
+ end
+ end
+ local lookups=resources.lookups
+ if lookups then
+ for _,lookup in next,lookups do
+ local flags=lookup.flags
+ if flags then
+ local tv=tables[flags]
+ if tv then
+ lookup.flags=tv
+ end
+ end
+ local subtables=lookup.subtables
+ if subtables then
+ local tv=tables[subtables]
+ if tv then
+ lookup.subtables=tv
+ end
+ end
+ end
+ end
+ local features=resources.features
+ if features then
+ for _,what in next,glists do
+ local feature=features[what]
+ if feature then
+ for tag,spec in next,feature do
+ local tv=tables[spec]
+ if tv then
+ feature[tag]=tv
+ end
+ end
+ end
+ end
+ end
+ data.tables=nil
+ end
+ end
+end
+if otf.enhancers.register then
+ otf.enhancers.register("pack",packdata)
+ otf.enhancers.register("unpack",unpackdata)
+end
+otf.enhancers.unpack=unpackdata
+
+end -- closure
+
+do -- begin closure to overcome local limits and interference
+
if not modules then modules={} end modules ['luatex-fonts-lua']={
version=1.001,
comment="companion to luatex-*.tex",
diff --git a/Master/texmf-dist/tex/generic/context/luatex/luatex-fonts-syn.lua b/Master/texmf-dist/tex/generic/context/luatex/luatex-fonts-syn.lua
index 36a74d0f497..ea6e3cab5ee 100644
--- a/Master/texmf-dist/tex/generic/context/luatex/luatex-fonts-syn.lua
+++ b/Master/texmf-dist/tex/generic/context/luatex/luatex-fonts-syn.lua
@@ -23,8 +23,9 @@ end
-- The format of the file is as follows:
--
-- return {
--- ["version"] = 1.001,
--- ["mappings"] = {
+-- ["version"] = 1.001,
+-- ["cache_version"] = 1.001,
+-- ["mappings"] = {
-- ["somettcfontone"] = { "Some TTC Font One", "SomeFontA.ttc", 1 },
-- ["somettcfonttwo"] = { "Some TTC Font Two", "SomeFontA.ttc", 2 },
-- ["somettffont"] = { "Some TTF Font", "SomeFontB.ttf" },
@@ -35,26 +36,41 @@ end
local fonts = fonts
fonts.names = fonts.names or { }
-fonts.names.version = 1.001 -- not the same as in context
-fonts.names.basename = "luatex-fonts-names.lua"
+fonts.names.version = 1.001 -- not the same as in context but matches mtx-fonts --simple
+fonts.names.basename = "luatex-fonts-names"
fonts.names.new_to_old = { }
fonts.names.old_to_new = { }
+fonts.names.cache = containers.define("fonts","data",fonts.names.version,true)
local data, loaded = nil, false
local fileformats = { "lua", "tex", "other text files" }
+function fonts.names.reportmissingbase()
+ texio.write("<missing font database, run: mtxrun --script fonts --reload --simple>")
+ fonts.names.reportmissingbase = nil
+end
+
+function fonts.names.reportmissingname()
+ texio.write("<unknown font in database, run: mtxrun --script fonts --reload --simple>")
+ fonts.names.reportmissingname = nil
+end
+
function fonts.names.resolve(name,sub)
if not loaded then
local basename = fonts.names.basename
if basename and basename ~= "" then
- for i=1,#fileformats do
- local format = fileformats[i]
- local foundname = resolvers.findfile(basename,format) or ""
- if foundname ~= "" then
- data = dofile(foundname)
- texio.write("<font database loaded: ",foundname,">")
- break
+ data = containers.read(fonts.names.cache,basename)
+ if not data then
+ basename = file.addsuffix(basename,"lua")
+ for i=1,#fileformats do
+ local format = fileformats[i]
+ local foundname = resolvers.findfile(basename,format) or ""
+ if foundname ~= "" then
+ data = dofile(foundname)
+ texio.write("<font database loaded: ",foundname,">")
+ break
+ end
end
end
end
@@ -70,9 +86,12 @@ function fonts.names.resolve(name,sub)
else
return filename, false
end
- else
+ elseif fonts.names.reportmissingname then
+ fonts.names.reportmissingname()
return name, false -- fallback to filename
end
+ elseif fonts.names.reportmissingbase then
+ fonts.names.reportmissingbase()
end
end
diff --git a/Master/texmf-dist/tex/generic/context/luatex/luatex-fonts.lua b/Master/texmf-dist/tex/generic/context/luatex/luatex-fonts.lua
index 96f35012ff5..89592fcacf8 100644
--- a/Master/texmf-dist/tex/generic/context/luatex/luatex-fonts.lua
+++ b/Master/texmf-dist/tex/generic/context/luatex/luatex-fonts.lua
@@ -7,19 +7,25 @@ if not modules then modules = { } end modules ['luatex-fonts'] = {
}
-- The following code isolates the generic context code from already defined or to be defined
--- namespaces. This is the reference loader for plain, but the generic code is also used in
--- luaotfload (which is is a file meant for latex) and that used to be maintained by Khaled
--- Hosny. We do our best to keep the interface as clean as possible.
+-- namespaces. This is the reference loader for plain tex. This generic code is also used in
+-- luaotfload which is a low level lualatex opentype font loader but somehow has gotten a bit
+-- too generic name / prefix, originally set up and maintained by Khaled Hosny. Currently that
+-- set of derived files is maintained by a larger team lead by Philipp Gesang so when there are
+-- issues with this code in latex, you can best contact him. It might make sense then to first
+-- check if context has the same issue. We do our best to keep the interface as clean as possible.
--
-- The code base is rather stable now, especially if you stay away from the non generic code. All
-- relevant data is organized in tables within the main table of a font instance. There are a few
-- places where in context other code is plugged in, but this does not affect the core code. Users
-- can (given that their macro package provides this option) access the font data (characters,
--- descriptions, properties, parameters, etc) of this main table.
+-- descriptions, properties, parameters, etc) of this main table. The documentation is part of
+-- context. There is also a manual for the helper libraries (maintained as part of the cld manuals).
--
-- Future versions will probably have some more specific context code removed, like tracing and
-- obscure hooks, so that we have a more efficient version (and less files too). So, don't depend
--- too much on low level code that is meant for context as it can change without notice.
+-- too much on low level code that is meant for context as it can change without notice. We might
+-- also add more helper code here, but that depends to what extend metatex (sidetrack of context)
+-- evolves into a low level layer (depends on time, as usual).
utf = utf or unicode.utf8
@@ -185,8 +191,9 @@ if non_generic_context.luatex_fonts.skip_loading ~= true then
-- The font database file (if used at all) must be put someplace visible for kpse and is not shared
-- with context. The mtx-fonts script can be used to genate this file (using the --names option).
- -- in 2013/14 we will merge/move some generic files into luatex-fonts-* files (copies) so that
- -- intermediate updates of context not interfere; we can then also use the general merger
+ -- In 2013/14 I will merge/move some generic files into luatex-fonts-* files (copies) so that
+ -- intermediate updates of context not interfere. We can then also use the general merger and
+ -- consider stripping debug code.
loadmodule('font-ini.lua')
loadmodule('font-con.lua')
@@ -201,6 +208,7 @@ if non_generic_context.luatex_fonts.skip_loading ~= true then
loadmodule('node-inj.lua') -- will be replaced (luatex >= .70)
loadmodule('font-ota.lua')
loadmodule('font-otn.lua')
+ loadmodule('font-otp.lua') -- optional
----------('luatex-fonts-chr.lua')
loadmodule('luatex-fonts-lua.lua')
loadmodule('font-def.lua')
diff --git a/Master/texmf-dist/tex/generic/context/luatex/luatex-math.lua b/Master/texmf-dist/tex/generic/context/luatex/luatex-math.lua
new file mode 100644
index 00000000000..c316182ba32
--- /dev/null
+++ b/Master/texmf-dist/tex/generic/context/luatex/luatex-math.lua
@@ -0,0 +1,53 @@
+if not modules then modules = { } end modules ['luatex-math'] = {
+ version = 1.001,
+ comment = "companion to luatex-math.tex",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local gaps = {
+ [0x1D455] = 0x0210E,
+ [0x1D49D] = 0x0212C,
+ [0x1D4A0] = 0x02130,
+ [0x1D4A1] = 0x02131,
+ [0x1D4A3] = 0x0210B,
+ [0x1D4A4] = 0x02110,
+ [0x1D4A7] = 0x02112,
+ [0x1D4A8] = 0x02133,
+ [0x1D4AD] = 0x0211B,
+ [0x1D4BA] = 0x0212F,
+ [0x1D4BC] = 0x0210A,
+ [0x1D4C4] = 0x02134,
+ [0x1D506] = 0x0212D,
+ [0x1D50B] = 0x0210C,
+ [0x1D50C] = 0x02111,
+ [0x1D515] = 0x0211C,
+ [0x1D51D] = 0x02128,
+ [0x1D53A] = 0x02102,
+ [0x1D53F] = 0x0210D,
+ [0x1D545] = 0x02115,
+ [0x1D547] = 0x02119,
+ [0x1D548] = 0x0211A,
+ [0x1D549] = 0x0211D,
+ [0x1D551] = 0x02124,
+}
+
+
+local function fixmath(tfmdata,key,value)
+ if value then
+ local characters = tfmdata.characters
+ for gap, mess in pairs(gaps) do
+ characters[gap] = characters[mess]
+ end
+ end
+end
+
+fonts.handlers.otf.features.register {
+ name = "fixmath",
+ description = "math font fixing",
+ manipulators = {
+ base = fixmath,
+ node = fixmath,
+ }
+}
diff --git a/Master/texmf-dist/tex/generic/context/luatex/luatex-math.tex b/Master/texmf-dist/tex/generic/context/luatex/luatex-math.tex
new file mode 100644
index 00000000000..ab304b97486
--- /dev/null
+++ b/Master/texmf-dist/tex/generic/context/luatex/luatex-math.tex
@@ -0,0 +1,1843 @@
+%D \module
+%D [ file=luatex-math,
+%D version=2013.04.29,
+%D title=\LUATEX\ Support Macros,
+%D subtitle=An exmaple of math,
+%D author=Hans Hagen,
+%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
+
+%D This module is in no way a complete plain math implementation. I made this file
+%D because I needed it for a tutorial for (mostly) plain \TEX\ users. There are
+%D several ways to support math in \LUATEX, and this is just one of them. It was the
+%D quickest hack I could come up with and it stays somewhat close to the traditional
+%D approach (and thereby far from the \CONTEXT\ way). This file is mainly meant for
+%D Boguslaw Jackowski.
+
+% we provide a remap feature
+
+\directlua{dofile(kpse.find_file('luatex-math.lua'))}
+
+% a bunch of fonts:
+
+\font\tenrm = file:lmroman10-regular.otf:+liga;+kern;+tlig;+trep at 10pt
+\font\sevenrm = file:lmroman7-regular.otf:+liga;+kern;+tlig;+trep at 7pt
+\font\fiverm = file:lmroman5-regular.otf:+liga;+kern;+tlig;+trep at 5pt
+
+\font\tentt = file:lmmono10-regular.otf at 10pt
+\font\tensl = file:lmromanslant10-regular.otf:+liga;+kern;+tlig;+trep at 10pt
+\font\tenit = file:lmroman10-italic.otf:+liga;+kern;+tlig;+trep at 10pt
+\font\tenbi = file:lmroman10-bolditalic.otf:+liga;+kern;+tlig;+trep at 10pt
+
+\let \teni = \relax
+\let \seveni = \relax
+\let \fivei = \relax
+\let \tensy = \relax
+\let \sevensy = \relax
+\let \fivesy = \relax
+\let \tenex = \relax
+\let \tenbf = \relax
+\let \sevenbf = \relax
+\let \fivebf = \relax
+
+\tenrm
+
+\font\mathfonttextupright = file:latinmodern-math.otf:ssty=0;fixmath=yes at 10pt
+\font\mathfontscriptupright = file:latinmodern-math.otf:ssty=1;fixmath=yes at 7pt
+\font\mathfontscriptscriptupright = file:latinmodern-math.otf:ssty=2;fixmath=yes at 5pt
+
+\textfont 0 = \mathfonttextupright
+\scriptfont 0 = \mathfontscriptupright
+\scriptscriptfont 0 = \mathfontscriptscriptupright
+
+\newtoks\everymathrm
+\newtoks\everymathmit
+\newtoks\everymathcal
+\newtoks\everymathit
+\newtoks\everymathsl
+\newtoks\everymathbf
+\newtoks\everymathbi
+\newtoks\everymathtt
+
+\def\rm{\fam0\relax\the\everymathmrm\relax\tenrm\relax}
+\def\it{\fam0\relax\the\everymathit \relax\tenit\relax}
+\def\sl{\fam0\relax\the\everymathsl \relax\tensl\relax}
+\def\bf{\fam0\relax\the\everymathbf \relax\tenbf\relax}
+\def\bi{\fam0\relax\the\everymathbi \relax\tenbi\relax}
+\def\tt{\fam0\relax\the\everymathtt \relax\tentt\relax}
+
+\let\mit \relax % use names or \Uchar or define a vector
+\let\cal \relax % idem, i'm not in the mood for this now
+\let\oldstyle\relax % no longer misuse of math mode
+
+% tex is fast enough for this kind of assignments:
+
+\everymathrm {%
+ \Umathcode"0041="0"0"0041%
+ \Umathcode"0042="0"0"0042%
+ \Umathcode"0043="0"0"0043%
+ \Umathcode"0044="0"0"0044%
+ \Umathcode"0045="0"0"0045%
+ \Umathcode"0046="0"0"0046%
+ \Umathcode"0047="0"0"0047%
+ \Umathcode"0048="0"0"0048%
+ \Umathcode"0049="0"0"0049%
+ \Umathcode"004A="0"0"004A%
+ \Umathcode"004B="0"0"004B%
+ \Umathcode"004C="0"0"004C%
+ \Umathcode"004D="0"0"004D%
+ \Umathcode"004E="0"0"004E%
+ \Umathcode"004F="0"0"004F%
+ \Umathcode"0050="0"0"0050%
+ \Umathcode"0051="0"0"0051%
+ \Umathcode"0052="0"0"0052%
+ \Umathcode"0053="0"0"0053%
+ \Umathcode"0054="0"0"0054%
+ \Umathcode"0055="0"0"0055%
+ \Umathcode"0056="0"0"0056%
+ \Umathcode"0057="0"0"0057%
+ \Umathcode"0058="0"0"0058%
+ \Umathcode"0059="0"0"0059%
+ \Umathcode"005A="0"0"005A%
+ \Umathcode"0061="0"0"0061%
+ \Umathcode"0062="0"0"0062%
+ \Umathcode"0063="0"0"0063%
+ \Umathcode"0064="0"0"0064%
+ \Umathcode"0065="0"0"0065%
+ \Umathcode"0066="0"0"0066%
+ \Umathcode"0067="0"0"0067%
+ \Umathcode"0068="0"0"0068%
+ \Umathcode"0069="0"0"0069%
+ \Umathcode"006A="0"0"006A%
+ \Umathcode"006B="0"0"006B%
+ \Umathcode"006C="0"0"006C%
+ \Umathcode"006D="0"0"006D%
+ \Umathcode"006E="0"0"006E%
+ \Umathcode"006F="0"0"006F%
+ \Umathcode"0070="0"0"0070%
+ \Umathcode"0071="0"0"0071%
+ \Umathcode"0072="0"0"0072%
+ \Umathcode"0073="0"0"0073%
+ \Umathcode"0074="0"0"0074%
+ \Umathcode"0075="0"0"0075%
+ \Umathcode"0076="0"0"0076%
+ \Umathcode"0077="0"0"0077%
+ \Umathcode"0078="0"0"0078%
+ \Umathcode"0079="0"0"0079%
+ \Umathcode"007A="0"0"007A%
+ \Umathcode"0391="0"0"0391%
+ \Umathcode"0392="0"0"0392%
+ \Umathcode"0393="0"0"0393%
+ \Umathcode"0394="0"0"0394%
+ \Umathcode"0395="0"0"0395%
+ \Umathcode"0396="0"0"0396%
+ \Umathcode"0397="0"0"0397%
+ \Umathcode"0398="0"0"0398%
+ \Umathcode"0399="0"0"0399%
+ \Umathcode"039A="0"0"039A%
+ \Umathcode"039B="0"0"039B%
+ \Umathcode"039C="0"0"039C%
+ \Umathcode"039D="0"0"039D%
+ \Umathcode"039E="0"0"039E%
+ \Umathcode"039F="0"0"039F%
+ \Umathcode"03A0="0"0"03A0%
+ \Umathcode"03A1="0"0"03A1%
+ \Umathcode"03A3="0"0"03A3%
+ \Umathcode"03A4="0"0"03A4%
+ \Umathcode"03A5="0"0"03A5%
+ \Umathcode"03A6="0"0"03A6%
+ \Umathcode"03A7="0"0"03A7%
+ \Umathcode"03A8="0"0"03A8%
+ \Umathcode"03A9="0"0"03A9%
+ \Umathcode"03B1="0"0"03B1%
+ \Umathcode"03B2="0"0"03B2%
+ \Umathcode"03B3="0"0"03B3%
+ \Umathcode"03B4="0"0"03B4%
+ \Umathcode"03B5="0"0"03B5%
+ \Umathcode"03B6="0"0"03B6%
+ \Umathcode"03B7="0"0"03B7%
+ \Umathcode"03B8="0"0"03B8%
+ \Umathcode"03B9="0"0"03B9%
+ \Umathcode"03BA="0"0"03BA%
+ \Umathcode"03BB="0"0"03BB%
+ \Umathcode"03BC="0"0"03BC%
+ \Umathcode"03BD="0"0"03BD%
+ \Umathcode"03BE="0"0"03BE%
+ \Umathcode"03BF="0"0"03BF%
+ \Umathcode"03C0="0"0"03C0%
+ \Umathcode"03C1="0"0"03C1%
+ \Umathcode"03C2="0"0"03C2%
+ \Umathcode"03C3="0"0"03C3%
+ \Umathcode"03C4="0"0"03C4%
+ \Umathcode"03C5="0"0"03C5%
+ \Umathcode"03C6="0"0"03C6%
+ \Umathcode"03C7="0"0"03C7%
+ \Umathcode"03C8="0"0"03C8%
+ \Umathcode"03C9="0"0"03C9%
+ \Umathcode"03D1="0"0"03D1%
+ \Umathcode"03D5="0"0"03D5%
+ \Umathcode"03D6="0"0"03D6%
+ \Umathcode"03F0="0"0"03F0%
+ \Umathcode"03F1="0"0"03F1%
+ \Umathcode"03F4="0"0"03F4%
+ \Umathcode"03F5="0"0"03F5%
+ \Umathcode"2202="0"0"2202%
+ \Umathcode"2207="0"0"2207%
+ \relax
+}
+
+\everymathmit {%
+ % not done
+}
+
+\everymathcal {%
+ % not done
+}
+
+\everymathit {%
+ \Umathcode"0041="0"0"1D434%
+ \Umathcode"0042="0"0"1D435%
+ \Umathcode"0043="0"0"1D436%
+ \Umathcode"0044="0"0"1D437%
+ \Umathcode"0045="0"0"1D438%
+ \Umathcode"0046="0"0"1D439%
+ \Umathcode"0047="0"0"1D43A%
+ \Umathcode"0048="0"0"1D43B%
+ \Umathcode"0049="0"0"1D43C%
+ \Umathcode"004A="0"0"1D43D%
+ \Umathcode"004B="0"0"1D43E%
+ \Umathcode"004C="0"0"1D43F%
+ \Umathcode"004D="0"0"1D440%
+ \Umathcode"004E="0"0"1D441%
+ \Umathcode"004F="0"0"1D442%
+ \Umathcode"0050="0"0"1D443%
+ \Umathcode"0051="0"0"1D444%
+ \Umathcode"0052="0"0"1D445%
+ \Umathcode"0053="0"0"1D446%
+ \Umathcode"0054="0"0"1D447%
+ \Umathcode"0055="0"0"1D448%
+ \Umathcode"0056="0"0"1D449%
+ \Umathcode"0057="0"0"1D44A%
+ \Umathcode"0058="0"0"1D44B%
+ \Umathcode"0059="0"0"1D44C%
+ \Umathcode"005A="0"0"1D44D%
+ \Umathcode"0061="0"0"1D44E%
+ \Umathcode"0062="0"0"1D44F%
+ \Umathcode"0063="0"0"1D450%
+ \Umathcode"0064="0"0"1D451%
+ \Umathcode"0065="0"0"1D452%
+ \Umathcode"0066="0"0"1D453%
+ \Umathcode"0067="0"0"1D454%
+ \Umathcode"0068="0"0"0210E%
+ \Umathcode"0069="0"0"1D456%
+ \Umathcode"006A="0"0"1D457%
+ \Umathcode"006B="0"0"1D458%
+ \Umathcode"006C="0"0"1D459%
+ \Umathcode"006D="0"0"1D45A%
+ \Umathcode"006E="0"0"1D45B%
+ \Umathcode"006F="0"0"1D45C%
+ \Umathcode"0070="0"0"1D45D%
+ \Umathcode"0071="0"0"1D45E%
+ \Umathcode"0072="0"0"1D45F%
+ \Umathcode"0073="0"0"1D460%
+ \Umathcode"0074="0"0"1D461%
+ \Umathcode"0075="0"0"1D462%
+ \Umathcode"0076="0"0"1D463%
+ \Umathcode"0077="0"0"1D464%
+ \Umathcode"0078="0"0"1D465%
+ \Umathcode"0079="0"0"1D466%
+ \Umathcode"007A="0"0"1D467%
+ \Umathcode"0391="0"0"1D6E2%
+ \Umathcode"0392="0"0"1D6E3%
+ \Umathcode"0393="0"0"1D6E4%
+ \Umathcode"0394="0"0"1D6E5%
+ \Umathcode"0395="0"0"1D6E6%
+ \Umathcode"0396="0"0"1D6E7%
+ \Umathcode"0397="0"0"1D6E8%
+ \Umathcode"0398="0"0"1D6E9%
+ \Umathcode"0399="0"0"1D6EA%
+ \Umathcode"039A="0"0"1D6EB%
+ \Umathcode"039B="0"0"1D6EC%
+ \Umathcode"039C="0"0"1D6ED%
+ \Umathcode"039D="0"0"1D6EE%
+ \Umathcode"039E="0"0"1D6EF%
+ \Umathcode"039F="0"0"1D6F0%
+ \Umathcode"03A0="0"0"1D6F1%
+ \Umathcode"03A1="0"0"1D6F2%
+ \Umathcode"03A3="0"0"1D6F4%
+ \Umathcode"03A4="0"0"1D6F5%
+ \Umathcode"03A5="0"0"1D6F6%
+ \Umathcode"03A6="0"0"1D6F7%
+ \Umathcode"03A7="0"0"1D6F8%
+ \Umathcode"03A8="0"0"1D6F9%
+ \Umathcode"03A9="0"0"1D6FA%
+ \Umathcode"03B1="0"0"1D6FC%
+ \Umathcode"03B2="0"0"1D6FD%
+ \Umathcode"03B3="0"0"1D6FE%
+ \Umathcode"03B4="0"0"1D6FF%
+ \Umathcode"03B5="0"0"1D700%
+ \Umathcode"03B6="0"0"1D701%
+ \Umathcode"03B7="0"0"1D702%
+ \Umathcode"03B8="0"0"1D703%
+ \Umathcode"03B9="0"0"1D704%
+ \Umathcode"03BA="0"0"1D705%
+ \Umathcode"03BB="0"0"1D706%
+ \Umathcode"03BC="0"0"1D707%
+ \Umathcode"03BD="0"0"1D708%
+ \Umathcode"03BE="0"0"1D709%
+ \Umathcode"03BF="0"0"1D70A%
+ \Umathcode"03C0="0"0"1D70B%
+ \Umathcode"03C1="0"0"1D70C%
+ \Umathcode"03C2="0"0"1D70D%
+ \Umathcode"03C3="0"0"1D70E%
+ \Umathcode"03C4="0"0"1D70F%
+ \Umathcode"03C5="0"0"1D710%
+ \Umathcode"03C6="0"0"1D711%
+ \Umathcode"03C7="0"0"1D712%
+ \Umathcode"03C8="0"0"1D713%
+ \Umathcode"03C9="0"0"1D714%
+ \Umathcode"03D1="0"0"1D717%
+ \Umathcode"03D5="0"0"1D719%
+ \Umathcode"03D6="0"0"1D71B%
+ \Umathcode"03F0="0"0"1D718%
+ \Umathcode"03F1="0"0"1D71A%
+ \Umathcode"03F4="0"0"1D6F3%
+ \Umathcode"03F5="0"0"1D716%
+ \Umathcode"2202="0"0"1D715%
+ \Umathcode"2207="0"0"1D6FB%
+ \relax
+}
+
+\everymathsl {%
+ \the\everymathit
+}
+
+\everymathbf {%
+ \Umathcode"0030="0"0"1D7CE%
+ \Umathcode"0031="0"0"1D7CF%
+ \Umathcode"0032="0"0"1D7D0%
+ \Umathcode"0033="0"0"1D7D1%
+ \Umathcode"0034="0"0"1D7D2%
+ \Umathcode"0035="0"0"1D7D3%
+ \Umathcode"0036="0"0"1D7D4%
+ \Umathcode"0037="0"0"1D7D5%
+ \Umathcode"0038="0"0"1D7D6%
+ \Umathcode"0039="0"0"1D7D7%
+ \Umathcode"0041="0"0"1D400%
+ \Umathcode"0042="0"0"1D401%
+ \Umathcode"0043="0"0"1D402%
+ \Umathcode"0044="0"0"1D403%
+ \Umathcode"0045="0"0"1D404%
+ \Umathcode"0046="0"0"1D405%
+ \Umathcode"0047="0"0"1D406%
+ \Umathcode"0048="0"0"1D407%
+ \Umathcode"0049="0"0"1D408%
+ \Umathcode"004A="0"0"1D409%
+ \Umathcode"004B="0"0"1D40A%
+ \Umathcode"004C="0"0"1D40B%
+ \Umathcode"004D="0"0"1D40C%
+ \Umathcode"004E="0"0"1D40D%
+ \Umathcode"004F="0"0"1D40E%
+ \Umathcode"0050="0"0"1D40F%
+ \Umathcode"0051="0"0"1D410%
+ \Umathcode"0052="0"0"1D411%
+ \Umathcode"0053="0"0"1D412%
+ \Umathcode"0054="0"0"1D413%
+ \Umathcode"0055="0"0"1D414%
+ \Umathcode"0056="0"0"1D415%
+ \Umathcode"0057="0"0"1D416%
+ \Umathcode"0058="0"0"1D417%
+ \Umathcode"0059="0"0"1D418%
+ \Umathcode"005A="0"0"1D419%
+ \Umathcode"0061="0"0"1D41A%
+ \Umathcode"0062="0"0"1D41B%
+ \Umathcode"0063="0"0"1D41C%
+ \Umathcode"0064="0"0"1D41D%
+ \Umathcode"0065="0"0"1D41E%
+ \Umathcode"0066="0"0"1D41F%
+ \Umathcode"0067="0"0"1D420%
+ \Umathcode"0068="0"0"1D421%
+ \Umathcode"0069="0"0"1D422%
+ \Umathcode"006A="0"0"1D423%
+ \Umathcode"006B="0"0"1D424%
+ \Umathcode"006C="0"0"1D425%
+ \Umathcode"006D="0"0"1D426%
+ \Umathcode"006E="0"0"1D427%
+ \Umathcode"006F="0"0"1D428%
+ \Umathcode"0070="0"0"1D429%
+ \Umathcode"0071="0"0"1D42A%
+ \Umathcode"0072="0"0"1D42B%
+ \Umathcode"0073="0"0"1D42C%
+ \Umathcode"0074="0"0"1D42D%
+ \Umathcode"0075="0"0"1D42E%
+ \Umathcode"0076="0"0"1D42F%
+ \Umathcode"0077="0"0"1D430%
+ \Umathcode"0078="0"0"1D431%
+ \Umathcode"0079="0"0"1D432%
+ \Umathcode"007A="0"0"1D433%
+ \Umathcode"0391="0"0"1D6A8%
+ \Umathcode"0392="0"0"1D6A9%
+ \Umathcode"0393="0"0"1D6AA%
+ \Umathcode"0394="0"0"1D6AB%
+ \Umathcode"0395="0"0"1D6AC%
+ \Umathcode"0396="0"0"1D6AD%
+ \Umathcode"0397="0"0"1D6AE%
+ \Umathcode"0398="0"0"1D6AF%
+ \Umathcode"0399="0"0"1D6B0%
+ \Umathcode"039A="0"0"1D6B1%
+ \Umathcode"039B="0"0"1D6B2%
+ \Umathcode"039C="0"0"1D6B3%
+ \Umathcode"039D="0"0"1D6B4%
+ \Umathcode"039E="0"0"1D6B5%
+ \Umathcode"039F="0"0"1D6B6%
+ \Umathcode"03A0="0"0"1D6B7%
+ \Umathcode"03A1="0"0"1D6B8%
+ \Umathcode"03A3="0"0"1D6BA%
+ \Umathcode"03A4="0"0"1D6BB%
+ \Umathcode"03A5="0"0"1D6BC%
+ \Umathcode"03A6="0"0"1D6BD%
+ \Umathcode"03A7="0"0"1D6BE%
+ \Umathcode"03A8="0"0"1D6BF%
+ \Umathcode"03A9="0"0"1D6C0%
+ \Umathcode"03B1="0"0"1D6C2%
+ \Umathcode"03B2="0"0"1D6C3%
+ \Umathcode"03B3="0"0"1D6C4%
+ \Umathcode"03B4="0"0"1D6C5%
+ \Umathcode"03B5="0"0"1D6C6%
+ \Umathcode"03B6="0"0"1D6C7%
+ \Umathcode"03B7="0"0"1D6C8%
+ \Umathcode"03B8="0"0"1D6C9%
+ \Umathcode"03B9="0"0"1D6CA%
+ \Umathcode"03BA="0"0"1D6CB%
+ \Umathcode"03BB="0"0"1D6CC%
+ \Umathcode"03BC="0"0"1D6CD%
+ \Umathcode"03BD="0"0"1D6CE%
+ \Umathcode"03BE="0"0"1D6CF%
+ \Umathcode"03BF="0"0"1D6D0%
+ \Umathcode"03C0="0"0"1D6D1%
+ \Umathcode"03C1="0"0"1D6D2%
+ \Umathcode"03C2="0"0"1D6D3%
+ \Umathcode"03C3="0"0"1D6D4%
+ \Umathcode"03C4="0"0"1D6D5%
+ \Umathcode"03C5="0"0"1D6D6%
+ \Umathcode"03C6="0"0"1D6D7%
+ \Umathcode"03C7="0"0"1D6D8%
+ \Umathcode"03C8="0"0"1D6D9%
+ \Umathcode"03C9="0"0"1D6DA%
+ \Umathcode"03D1="0"0"1D6DD%
+ \Umathcode"03D5="0"0"1D6DF%
+ \Umathcode"03D6="0"0"1D6E1%
+ \Umathcode"03F0="0"0"1D6DE%
+ \Umathcode"03F1="0"0"1D6E0%
+ \Umathcode"03F4="0"0"1D6B9%
+ \Umathcode"03F5="0"0"1D6DC%
+ \Umathcode"2202="0"0"1D6DB%
+ \Umathcode"2207="0"0"1D6C1%
+ \relax
+}
+
+\everymathbi {%
+ \Umathcode"0030="0"0"1D7CE%
+ \Umathcode"0031="0"0"1D7CF%
+ \Umathcode"0032="0"0"1D7D0%
+ \Umathcode"0033="0"0"1D7D1%
+ \Umathcode"0034="0"0"1D7D2%
+ \Umathcode"0035="0"0"1D7D3%
+ \Umathcode"0036="0"0"1D7D4%
+ \Umathcode"0037="0"0"1D7D5%
+ \Umathcode"0038="0"0"1D7D6%
+ \Umathcode"0039="0"0"1D7D7%
+ \Umathcode"0041="0"0"1D468%
+ \Umathcode"0042="0"0"1D469%
+ \Umathcode"0043="0"0"1D46A%
+ \Umathcode"0044="0"0"1D46B%
+ \Umathcode"0045="0"0"1D46C%
+ \Umathcode"0046="0"0"1D46D%
+ \Umathcode"0047="0"0"1D46E%
+ \Umathcode"0048="0"0"1D46F%
+ \Umathcode"0049="0"0"1D470%
+ \Umathcode"004A="0"0"1D471%
+ \Umathcode"004B="0"0"1D472%
+ \Umathcode"004C="0"0"1D473%
+ \Umathcode"004D="0"0"1D474%
+ \Umathcode"004E="0"0"1D475%
+ \Umathcode"004F="0"0"1D476%
+ \Umathcode"0050="0"0"1D477%
+ \Umathcode"0051="0"0"1D478%
+ \Umathcode"0052="0"0"1D479%
+ \Umathcode"0053="0"0"1D47A%
+ \Umathcode"0054="0"0"1D47B%
+ \Umathcode"0055="0"0"1D47C%
+ \Umathcode"0056="0"0"1D47D%
+ \Umathcode"0057="0"0"1D47E%
+ \Umathcode"0058="0"0"1D47F%
+ \Umathcode"0059="0"0"1D480%
+ \Umathcode"005A="0"0"1D481%
+ \Umathcode"0061="0"0"1D482%
+ \Umathcode"0062="0"0"1D483%
+ \Umathcode"0063="0"0"1D484%
+ \Umathcode"0064="0"0"1D485%
+ \Umathcode"0065="0"0"1D486%
+ \Umathcode"0066="0"0"1D487%
+ \Umathcode"0067="0"0"1D488%
+ \Umathcode"0068="0"0"1D489%
+ \Umathcode"0069="0"0"1D48A%
+ \Umathcode"006A="0"0"1D48B%
+ \Umathcode"006B="0"0"1D48C%
+ \Umathcode"006C="0"0"1D48D%
+ \Umathcode"006D="0"0"1D48E%
+ \Umathcode"006E="0"0"1D48F%
+ \Umathcode"006F="0"0"1D490%
+ \Umathcode"0070="0"0"1D491%
+ \Umathcode"0071="0"0"1D492%
+ \Umathcode"0072="0"0"1D493%
+ \Umathcode"0073="0"0"1D494%
+ \Umathcode"0074="0"0"1D495%
+ \Umathcode"0075="0"0"1D496%
+ \Umathcode"0076="0"0"1D497%
+ \Umathcode"0077="0"0"1D498%
+ \Umathcode"0078="0"0"1D499%
+ \Umathcode"0079="0"0"1D49A%
+ \Umathcode"007A="0"0"1D49B%
+ \Umathcode"0391="0"0"1D71C%
+ \Umathcode"0392="0"0"1D71D%
+ \Umathcode"0393="0"0"1D71E%
+ \Umathcode"0394="0"0"1D71F%
+ \Umathcode"0395="0"0"1D720%
+ \Umathcode"0396="0"0"1D721%
+ \Umathcode"0397="0"0"1D722%
+ \Umathcode"0398="0"0"1D723%
+ \Umathcode"0399="0"0"1D724%
+ \Umathcode"039A="0"0"1D725%
+ \Umathcode"039B="0"0"1D726%
+ \Umathcode"039C="0"0"1D727%
+ \Umathcode"039D="0"0"1D728%
+ \Umathcode"039E="0"0"1D729%
+ \Umathcode"039F="0"0"1D72A%
+ \Umathcode"03A0="0"0"1D72B%
+ \Umathcode"03A1="0"0"1D72C%
+ \Umathcode"03A3="0"0"1D72E%
+ \Umathcode"03A4="0"0"1D72F%
+ \Umathcode"03A5="0"0"1D730%
+ \Umathcode"03A6="0"0"1D731%
+ \Umathcode"03A7="0"0"1D732%
+ \Umathcode"03A8="0"0"1D733%
+ \Umathcode"03A9="0"0"1D734%
+ \Umathcode"03B1="0"0"1D736%
+ \Umathcode"03B2="0"0"1D737%
+ \Umathcode"03B3="0"0"1D738%
+ \Umathcode"03B4="0"0"1D739%
+ \Umathcode"03B5="0"0"1D73A%
+ \Umathcode"03B6="0"0"1D73B%
+ \Umathcode"03B7="0"0"1D73C%
+ \Umathcode"03B8="0"0"1D73D%
+ \Umathcode"03B9="0"0"1D73E%
+ \Umathcode"03BA="0"0"1D73F%
+ \Umathcode"03BB="0"0"1D740%
+ \Umathcode"03BC="0"0"1D741%
+ \Umathcode"03BD="0"0"1D742%
+ \Umathcode"03BE="0"0"1D743%
+ \Umathcode"03BF="0"0"1D744%
+ \Umathcode"03C0="0"0"1D745%
+ \Umathcode"03C1="0"0"1D746%
+ \Umathcode"03C2="0"0"1D747%
+ \Umathcode"03C3="0"0"1D748%
+ \Umathcode"03C4="0"0"1D749%
+ \Umathcode"03C5="0"0"1D74A%
+ \Umathcode"03C6="0"0"1D74B%
+ \Umathcode"03C7="0"0"1D74C%
+ \Umathcode"03C8="0"0"1D74D%
+ \Umathcode"03C9="0"0"1D74E%
+ \Umathcode"03D1="0"0"1D751%
+ \Umathcode"03D5="0"0"1D753%
+ \Umathcode"03D6="0"0"1D755%
+ \Umathcode"03F0="0"0"1D752%
+ \Umathcode"03F1="0"0"1D754%
+ \Umathcode"03F4="0"0"1D72D%
+ \Umathcode"03F5="0"0"1D750%
+ \Umathcode"2202="0"0"1D74F%
+ \Umathcode"2207="0"0"1D735%
+ \relax
+}
+
+\everymathtt {%
+ % not done
+}
+
+\Udelcode "00021 = "0 "00021
+\Udelcode "00028 = "0 "00028
+\Udelcode "00028 = "0 "00028
+\Udelcode "00029 = "0 "00029
+\Udelcode "00029 = "0 "00029
+\Udelcode "0002F = "0 "0002F
+\Udelcode "0002F = "0 "0002F
+\Udelcode "0002F = "0 "02044
+\Udelcode "0003F = "0 "0003F
+\Udelcode "0005B = "0 "0005B
+\Udelcode "0005B = "0 "0005B
+\Udelcode "0005D = "0 "0005D
+\Udelcode "0005D = "0 "0005D
+\Udelcode "0007B = "0 "0007B
+\Udelcode "0007B = "0 "0007B
+\Udelcode "0007C = "0 "0007C
+\Udelcode "0007C = "0 "0007C
+\Udelcode "0007C = "0 "0007C
+\Udelcode "0007C = "0 "0007C
+\Udelcode "0007C = "0 "0007C
+\Udelcode "0007D = "0 "0007D
+\Udelcode "0007D = "0 "0007D
+\Udelcode "02016 = "0 "02016
+\Udelcode "02016 = "0 "02016
+\Udelcode "02016 = "0 "02016
+\Udelcode "02016 = "0 "02016
+\Udelcode "02016 = "0 "02016
+\Udelcode "02044 = "0 "02044
+\Udelcode "02044 = "0 "02044
+\Udelcode "02308 = "0 "02308
+\Udelcode "02308 = "0 "02308
+\Udelcode "02308 = "0 "02308
+\Udelcode "02308 = "0 "02308
+\Udelcode "02308 = "0 "02308
+\Udelcode "02309 = "0 "02309
+\Udelcode "02309 = "0 "02309
+\Udelcode "02309 = "0 "02309
+\Udelcode "02309 = "0 "02309
+\Udelcode "02309 = "0 "02309
+\Udelcode "0230A = "0 "0230A
+\Udelcode "0230A = "0 "0230A
+\Udelcode "0230B = "0 "0230B
+\Udelcode "0230B = "0 "0230B
+\Udelcode "0231C = "0 "0231C
+\Udelcode "0231C = "0 "0231C
+\Udelcode "0231D = "0 "0231D
+\Udelcode "0231D = "0 "0231D
+\Udelcode "0231E = "0 "0231E
+\Udelcode "0231E = "0 "0231E
+\Udelcode "0231F = "0 "0231F
+\Udelcode "0231F = "0 "0231F
+\Udelcode "023B0 = "0 "023B0
+\Udelcode "023B0 = "0 "023B0
+\Udelcode "023B1 = "0 "023B1
+\Udelcode "023B1 = "0 "023B1
+\Udelcode "027E6 = "0 "027E6
+\Udelcode "027E6 = "0 "027E6
+\Udelcode "027E7 = "0 "027E7
+\Udelcode "027E7 = "0 "027E7
+\Udelcode "027E8 = "0 "027E8
+\Udelcode "027E8 = "0 "027E8
+\Udelcode "027E9 = "0 "027E9
+\Udelcode "027E9 = "0 "027E9
+\Udelcode "027EA = "0 "027EA
+\Udelcode "027EA = "0 "027EA
+\Udelcode "027EB = "0 "027EB
+\Udelcode "027EB = "0 "027EB
+\Udelcode "027EE = "0 "027EE
+\Udelcode "027EE = "0 "027EE
+\Udelcode "027EF = "0 "027EF
+\Udelcode "027EF = "0 "027EF
+
+\Umathcode "00021 = "5 "0 "00021
+\Umathcode "00022 = "0 "0 "00022
+\Umathcode "00027 = "0 "0 "00027
+\Umathcode "00028 = "4 "0 "00028
+\Umathcode "00029 = "5 "0 "00029
+\Umathcode "0002A = "2 "0 "02217
+\Umathcode "0002B = "2 "0 "0002B
+\Umathcode "0002C = "6 "0 "0002C
+\Umathcode "0002D = "2 "0 "02212
+\Umathcode "0002E = "6 "0 "0002E
+\Umathcode "0002F = "4 "0 "02044
+\Umathcode "0003A = "3 "0 "0003A
+\Umathcode "0003B = "6 "0 "0003B
+\Umathcode "0003C = "3 "0 "0003C
+\Umathcode "0003D = "3 "0 "0003D
+\Umathcode "0003E = "3 "0 "0003E
+\Umathcode "0003F = "5 "0 "0003F
+\Umathcode "0005B = "4 "0 "0005B
+\Umathcode "0005C = "0 "0 "0005C
+\Umathcode "0005D = "5 "0 "0005D
+\Umathcode "0007B = "4 "0 "0007B
+\Umathcode "0007C = "0 "0 "0007C
+\Umathcode "0007D = "5 "0 "0007D
+\Umathcode "000A5 = "0 "0 "000A5
+\Umathcode "000A7 = "0 "0 "000A7
+\Umathcode "000AC = "0 "0 "000AC
+\Umathcode "000B1 = "2 "0 "000B1
+\Umathcode "000B6 = "0 "0 "000B6
+\Umathcode "000B7 = "2 "0 "000B7
+\Umathcode "000D7 = "2 "0 "000D7
+\Umathcode "000F0 = "0 "0 "000F0
+\Umathcode "000F7 = "2 "0 "000F7
+\Umathcode "00338 = "3 "0 "00338
+\Umathcode "003F0 = "0 "0 "003F0
+\Umathcode "02016 = "0 "0 "02016
+\Umathcode "02020 = "2 "0 "02020
+\Umathcode "02021 = "2 "0 "02021
+\Umathcode "02022 = "2 "0 "02022
+\Umathcode "02026 = "0 "0 "02026
+\Umathcode "02032 = "0 "0 "02032
+\Umathcode "02033 = "0 "0 "02033
+\Umathcode "02034 = "0 "0 "02034
+\Umathcode "02044 = "0 "0 "02044
+\Umathcode "0207A = "2 "0 "0207A
+\Umathcode "0207B = "2 "0 "0207B
+\Umathcode "020DD = "0 "0 "020DD
+\Umathcode "020DE = "0 "0 "020DE
+\Umathcode "020DF = "0 "0 "020DF
+\Umathcode "02111 = "0 "0 "02111
+\Umathcode "02113 = "0 "0 "02113
+\Umathcode "02118 = "0 "0 "02118
+\Umathcode "0211C = "0 "0 "0211C
+\Umathcode "02132 = "0 "0 "02132
+\Umathcode "02135 = "0 "0 "02135
+\Umathcode "02136 = "0 "0 "02136
+\Umathcode "02137 = "0 "0 "02137
+\Umathcode "02138 = "0 "0 "02138
+\Umathcode "02141 = "0 "0 "02141
+\Umathcode "02142 = "0 "0 "02142
+\Umathcode "02143 = "0 "0 "02143
+\Umathcode "02144 = "0 "0 "02144
+\Umathcode "02145 = "0 "0 "02145
+\Umathcode "02146 = "0 "0 "02146
+\Umathcode "02147 = "0 "0 "02147
+\Umathcode "02148 = "0 "0 "02148
+\Umathcode "02149 = "0 "0 "02149
+\Umathcode "0214A = "0 "0 "0214A
+\Umathcode "0214B = "2 "0 "0214B
+\Umathcode "02190 = "3 "0 "02190
+\Umathcode "02191 = "3 "0 "02191
+\Umathcode "02192 = "3 "0 "02192
+\Umathcode "02193 = "3 "0 "02193
+\Umathcode "02194 = "3 "0 "02194
+\Umathcode "02195 = "3 "0 "02195
+\Umathcode "02196 = "3 "0 "02196
+\Umathcode "02197 = "3 "0 "02197
+\Umathcode "02198 = "3 "0 "02198
+\Umathcode "02199 = "3 "0 "02199
+\Umathcode "0219A = "3 "0 "0219A
+\Umathcode "0219B = "3 "0 "0219B
+\Umathcode "0219C = "3 "0 "0219C
+\Umathcode "0219D = "3 "0 "0219D
+\Umathcode "0219E = "3 "0 "0219E
+\Umathcode "0219F = "3 "0 "0219F
+\Umathcode "021A0 = "3 "0 "021A0
+\Umathcode "021A1 = "3 "0 "021A1
+\Umathcode "021A2 = "3 "0 "021A2
+\Umathcode "021A3 = "3 "0 "021A3
+\Umathcode "021A4 = "3 "0 "021A4
+\Umathcode "021A5 = "3 "0 "021A5
+\Umathcode "021A6 = "3 "0 "021A6
+\Umathcode "021A7 = "3 "0 "021A7
+\Umathcode "021A8 = "0 "0 "021A8
+\Umathcode "021A9 = "3 "0 "021A9
+\Umathcode "021AA = "3 "0 "021AA
+\Umathcode "021AB = "3 "0 "021AB
+\Umathcode "021AC = "3 "0 "021AC
+\Umathcode "021AD = "3 "0 "021AD
+\Umathcode "021AE = "3 "0 "021AE
+\Umathcode "021AF = "3 "0 "021AF
+\Umathcode "021B0 = "3 "0 "021B0
+\Umathcode "021B1 = "3 "0 "021B1
+\Umathcode "021B2 = "3 "0 "021B2
+\Umathcode "021B3 = "3 "0 "021B3
+\Umathcode "021B4 = "0 "0 "021B4
+\Umathcode "021B5 = "0 "0 "021B5
+\Umathcode "021B6 = "3 "0 "021B6
+\Umathcode "021B7 = "3 "0 "021B7
+\Umathcode "021B8 = "3 "0 "021B8
+\Umathcode "021B9 = "3 "0 "021B9
+\Umathcode "021BA = "3 "0 "021BA
+\Umathcode "021BB = "3 "0 "021BB
+\Umathcode "021BC = "3 "0 "021BC
+\Umathcode "021BD = "3 "0 "021BD
+\Umathcode "021BE = "3 "0 "021BE
+\Umathcode "021BF = "3 "0 "021BF
+\Umathcode "021C0 = "3 "0 "021C0
+\Umathcode "021C1 = "3 "0 "021C1
+\Umathcode "021C2 = "3 "0 "021C2
+\Umathcode "021C3 = "3 "0 "021C3
+\Umathcode "021C4 = "3 "0 "021C4
+\Umathcode "021C5 = "3 "0 "021C5
+\Umathcode "021C6 = "3 "0 "021C6
+\Umathcode "021C7 = "3 "0 "021C7
+\Umathcode "021C8 = "3 "0 "021C8
+\Umathcode "021C9 = "3 "0 "021C9
+\Umathcode "021CA = "3 "0 "021CA
+\Umathcode "021CB = "3 "0 "021CB
+\Umathcode "021CC = "3 "0 "021CC
+\Umathcode "021CD = "3 "0 "021CD
+\Umathcode "021CE = "3 "0 "021CE
+\Umathcode "021CF = "3 "0 "021CF
+\Umathcode "021D0 = "3 "0 "021D0
+\Umathcode "021D1 = "3 "0 "021D1
+\Umathcode "021D2 = "3 "0 "021D2
+\Umathcode "021D3 = "3 "0 "021D3
+\Umathcode "021D4 = "3 "0 "021D4
+\Umathcode "021D5 = "3 "0 "021D5
+\Umathcode "021D6 = "3 "0 "021D6
+\Umathcode "021D7 = "3 "0 "021D7
+\Umathcode "021D8 = "3 "0 "021D8
+\Umathcode "021D9 = "3 "0 "021D9
+\Umathcode "021DA = "3 "0 "021DA
+\Umathcode "021DB = "3 "0 "021DB
+\Umathcode "021DC = "3 "0 "021DC
+\Umathcode "021DD = "3 "0 "021DD
+\Umathcode "021DE = "3 "0 "021DE
+\Umathcode "021DF = "3 "0 "021DF
+\Umathcode "021E0 = "3 "0 "021E0
+\Umathcode "021E1 = "3 "0 "021E1
+\Umathcode "021E2 = "3 "0 "021E2
+\Umathcode "021E3 = "3 "0 "021E3
+\Umathcode "021E4 = "3 "0 "021E4
+\Umathcode "021E5 = "3 "0 "021E5
+\Umathcode "021E6 = "0 "0 "021E6
+\Umathcode "021E7 = "0 "0 "021E7
+\Umathcode "021E8 = "0 "0 "021E8
+\Umathcode "021E9 = "0 "0 "021E9
+\Umathcode "021EB = "0 "0 "021EB
+\Umathcode "021F4 = "3 "0 "021F4
+\Umathcode "021F5 = "3 "0 "021F5
+\Umathcode "021F6 = "3 "0 "021F6
+\Umathcode "021F7 = "3 "0 "021F7
+\Umathcode "021F8 = "3 "0 "021F8
+\Umathcode "021F9 = "3 "0 "021F9
+\Umathcode "021FA = "3 "0 "021FA
+\Umathcode "021FB = "3 "0 "021FB
+\Umathcode "021FC = "3 "0 "021FC
+\Umathcode "021FD = "3 "0 "021FD
+\Umathcode "021FE = "3 "0 "021FE
+\Umathcode "021FF = "3 "0 "021FF
+\Umathcode "02200 = "0 "0 "02200
+\Umathcode "02201 = "0 "0 "02201
+\Umathcode "02202 = "0 "0 "02202
+\Umathcode "02203 = "0 "0 "02203
+\Umathcode "02204 = "0 "0 "02204
+\Umathcode "02205 = "0 "0 "02205
+\Umathcode "02208 = "3 "0 "02208
+\Umathcode "02209 = "3 "0 "02209
+\Umathcode "0220B = "3 "0 "0220B
+\Umathcode "0220C = "3 "0 "0220C
+\Umathcode "0220F = "1 "0 "0220F
+\Umathcode "02210 = "1 "0 "02210
+\Umathcode "02211 = "1 "0 "02211
+\Umathcode "02212 = "2 "0 "02212
+\Umathcode "02213 = "2 "0 "02213
+\Umathcode "02214 = "2 "0 "02214
+\Umathcode "02216 = "2 "0 "02216
+\Umathcode "02217 = "2 "0 "02217
+\Umathcode "02218 = "2 "0 "02218
+\Umathcode "02219 = "2 "0 "02219
+\Umathcode "0221D = "3 "0 "0221D
+\Umathcode "0221E = "0 "0 "0221E
+\Umathcode "0221F = "0 "0 "0221F
+\Umathcode "02220 = "0 "0 "02220
+\Umathcode "02221 = "0 "0 "02221
+\Umathcode "02222 = "0 "0 "02222
+\Umathcode "02223 = "2 "0 "02223
+\Umathcode "02224 = "2 "0 "02224
+\Umathcode "02225 = "3 "0 "02225
+\Umathcode "02226 = "3 "0 "02226
+\Umathcode "02227 = "2 "0 "02227
+\Umathcode "02228 = "2 "0 "02228
+\Umathcode "02229 = "2 "0 "02229
+\Umathcode "0222A = "2 "0 "0222A
+\Umathcode "0222B = "1 "0 "0222B
+\Umathcode "0222C = "1 "0 "0222C
+\Umathcode "0222D = "1 "0 "0222D
+\Umathcode "0222E = "1 "0 "0222E
+\Umathcode "0222F = "1 "0 "0222F
+\Umathcode "02230 = "1 "0 "02230
+\Umathcode "02231 = "1 "0 "02231
+\Umathcode "02232 = "1 "0 "02232
+\Umathcode "02233 = "1 "0 "02233
+\Umathcode "02234 = "3 "0 "02234
+\Umathcode "02235 = "3 "0 "02235
+\Umathcode "02236 = "6 "0 "02236
+\Umathcode "02237 = "3 "0 "02237
+\Umathcode "02238 = "2 "0 "02238
+\Umathcode "02239 = "3 "0 "02239
+\Umathcode "0223C = "3 "0 "0223C
+\Umathcode "0223D = "3 "0 "0223D
+\Umathcode "02240 = "2 "0 "02240
+\Umathcode "02241 = "3 "0 "02241
+\Umathcode "02242 = "3 "0 "02242
+\Umathcode "02243 = "3 "0 "02243
+\Umathcode "02244 = "3 "0 "02244
+\Umathcode "02245 = "3 "0 "02245
+\Umathcode "02246 = "3 "0 "02246
+\Umathcode "02247 = "3 "0 "02247
+\Umathcode "02248 = "3 "0 "02248
+\Umathcode "02249 = "3 "0 "02249
+\Umathcode "0224A = "3 "0 "0224A
+\Umathcode "0224C = "3 "0 "0224C
+\Umathcode "0224D = "3 "0 "0224D
+\Umathcode "0224E = "3 "0 "0224E
+\Umathcode "02250 = "3 "0 "02250
+\Umathcode "02251 = "3 "0 "02251
+\Umathcode "02252 = "3 "0 "02252
+\Umathcode "02253 = "3 "0 "02253
+\Umathcode "02254 = "3 "0 "02254
+\Umathcode "02255 = "3 "0 "02255
+\Umathcode "02256 = "3 "0 "02256
+\Umathcode "02257 = "3 "0 "02257
+\Umathcode "02259 = "3 "0 "02259
+\Umathcode "0225A = "3 "0 "0225A
+\Umathcode "0225B = "3 "0 "0225B
+\Umathcode "0225C = "3 "0 "0225C
+\Umathcode "0225D = "3 "0 "0225D
+\Umathcode "0225E = "3 "0 "0225E
+\Umathcode "0225F = "3 "0 "0225F
+\Umathcode "02260 = "3 "0 "02260
+\Umathcode "02261 = "3 "0 "02261
+\Umathcode "02262 = "3 "0 "02262
+\Umathcode "02263 = "3 "0 "02263
+\Umathcode "02264 = "3 "0 "02264
+\Umathcode "02265 = "3 "0 "02265
+\Umathcode "02266 = "3 "0 "02266
+\Umathcode "02267 = "3 "0 "02267
+\Umathcode "02268 = "3 "0 "02268
+\Umathcode "02269 = "3 "0 "02269
+\Umathcode "0226A = "3 "0 "0226A
+\Umathcode "0226B = "3 "0 "0226B
+\Umathcode "0226C = "3 "0 "0226C
+\Umathcode "0226D = "3 "0 "0226D
+\Umathcode "0226E = "3 "0 "0226E
+\Umathcode "0226F = "3 "0 "0226F
+\Umathcode "02270 = "3 "0 "02270
+\Umathcode "02271 = "3 "0 "02271
+\Umathcode "02272 = "3 "0 "02272
+\Umathcode "02273 = "3 "0 "02273
+\Umathcode "02274 = "3 "0 "02274
+\Umathcode "02275 = "3 "0 "02275
+\Umathcode "02276 = "3 "0 "02276
+\Umathcode "02277 = "3 "0 "02277
+\Umathcode "02278 = "3 "0 "02278
+\Umathcode "02279 = "3 "0 "02279
+\Umathcode "0227A = "3 "0 "0227A
+\Umathcode "0227B = "3 "0 "0227B
+\Umathcode "0227C = "3 "0 "0227C
+\Umathcode "0227D = "3 "0 "0227D
+\Umathcode "0227E = "3 "0 "0227E
+\Umathcode "0227F = "3 "0 "0227F
+\Umathcode "02280 = "3 "0 "02280
+\Umathcode "02281 = "3 "0 "02281
+\Umathcode "02282 = "3 "0 "02282
+\Umathcode "02283 = "3 "0 "02283
+\Umathcode "02284 = "3 "0 "02284
+\Umathcode "02285 = "3 "0 "02285
+\Umathcode "02286 = "3 "0 "02286
+\Umathcode "02287 = "3 "0 "02287
+\Umathcode "02288 = "3 "0 "02288
+\Umathcode "02289 = "3 "0 "02289
+\Umathcode "0228A = "3 "0 "0228A
+\Umathcode "0228B = "3 "0 "0228B
+\Umathcode "0228E = "2 "0 "0228E
+\Umathcode "0228F = "3 "0 "0228F
+\Umathcode "02290 = "3 "0 "02290
+\Umathcode "02291 = "2 "0 "02291
+\Umathcode "02292 = "2 "0 "02292
+\Umathcode "02293 = "2 "0 "02293
+\Umathcode "02294 = "2 "0 "02294
+\Umathcode "02295 = "2 "0 "02295
+\Umathcode "02296 = "2 "0 "02296
+\Umathcode "02297 = "2 "0 "02297
+\Umathcode "02298 = "2 "0 "02298
+\Umathcode "02299 = "2 "0 "02299
+\Umathcode "0229A = "2 "0 "0229A
+\Umathcode "0229B = "2 "0 "0229B
+\Umathcode "0229C = "2 "0 "0229C
+\Umathcode "0229D = "2 "0 "0229D
+\Umathcode "0229E = "2 "0 "0229E
+\Umathcode "0229F = "2 "0 "0229F
+\Umathcode "022A0 = "2 "0 "022A0
+\Umathcode "022A1 = "2 "0 "022A1
+\Umathcode "022A2 = "3 "0 "022A2
+\Umathcode "022A3 = "3 "0 "022A3
+\Umathcode "022A4 = "0 "0 "022A4
+\Umathcode "022A5 = "0 "0 "022A5
+\Umathcode "022A7 = "3 "0 "022A7
+\Umathcode "022A8 = "3 "0 "022A8
+\Umathcode "022A9 = "3 "0 "022A9
+\Umathcode "022AA = "3 "0 "022AA
+\Umathcode "022AB = "3 "0 "022AB
+\Umathcode "022AC = "3 "0 "022AC
+\Umathcode "022AD = "3 "0 "022AD
+\Umathcode "022AE = "3 "0 "022AE
+\Umathcode "022AF = "3 "0 "022AF
+\Umathcode "022B2 = "2 "0 "022B2
+\Umathcode "022B3 = "2 "0 "022B3
+\Umathcode "022B8 = "3 "0 "022B8
+\Umathcode "022BA = "2 "0 "022BA
+\Umathcode "022BB = "2 "0 "022BB
+\Umathcode "022BC = "2 "0 "022BC
+\Umathcode "022C0 = "1 "0 "022C0
+\Umathcode "022C1 = "1 "0 "022C1
+\Umathcode "022C2 = "1 "0 "022C2
+\Umathcode "022C3 = "1 "0 "022C3
+\Umathcode "022C4 = "2 "0 "022C4
+\Umathcode "022C5 = "2 "0 "022C5
+\Umathcode "022C6 = "2 "0 "022C6
+\Umathcode "022C7 = "2 "0 "022C7
+\Umathcode "022C8 = "3 "0 "022C8
+\Umathcode "022C9 = "2 "0 "022C9
+\Umathcode "022CA = "2 "0 "022CA
+\Umathcode "022CB = "2 "0 "022CB
+\Umathcode "022CC = "2 "0 "022CC
+\Umathcode "022CE = "2 "0 "022CE
+\Umathcode "022CF = "2 "0 "022CF
+\Umathcode "022D0 = "3 "0 "022D0
+\Umathcode "022D1 = "3 "0 "022D1
+\Umathcode "022D2 = "2 "0 "022D2
+\Umathcode "022D3 = "2 "0 "022D3
+\Umathcode "022D4 = "3 "0 "022D4
+\Umathcode "022D6 = "2 "0 "022D6
+\Umathcode "022D7 = "2 "0 "022D7
+\Umathcode "022D8 = "3 "0 "022D8
+\Umathcode "022D9 = "3 "0 "022D9
+\Umathcode "022DA = "3 "0 "022DA
+\Umathcode "022DB = "3 "0 "022DB
+\Umathcode "022DC = "3 "0 "022DC
+\Umathcode "022DD = "3 "0 "022DD
+\Umathcode "022DE = "3 "0 "022DE
+\Umathcode "022DF = "3 "0 "022DF
+\Umathcode "022E0 = "3 "0 "022E0
+\Umathcode "022E1 = "3 "0 "022E1
+\Umathcode "022E2 = "3 "0 "022E2
+\Umathcode "022E3 = "3 "0 "022E3
+\Umathcode "022E4 = "3 "0 "022E4
+\Umathcode "022E5 = "3 "0 "022E5
+\Umathcode "022E6 = "3 "0 "022E6
+\Umathcode "022E7 = "3 "0 "022E7
+\Umathcode "022E8 = "3 "0 "022E8
+\Umathcode "022E9 = "3 "0 "022E9
+\Umathcode "022EA = "3 "0 "022EA
+\Umathcode "022EB = "3 "0 "022EB
+\Umathcode "022EC = "3 "0 "022EC
+\Umathcode "022ED = "3 "0 "022ED
+\Umathcode "022EE = "0 "0 "022EE
+\Umathcode "022EF = "0 "0 "022EF
+\Umathcode "022F0 = "0 "0 "022F0
+\Umathcode "022F1 = "0 "0 "022F1
+\Umathcode "02300 = "0 "0 "02300
+\Umathcode "02308 = "4 "0 "02308
+\Umathcode "02309 = "5 "0 "02309
+\Umathcode "0230A = "4 "0 "0230A
+\Umathcode "0230B = "5 "0 "0230B
+\Umathcode "0231C = "4 "0 "0231C
+\Umathcode "0231D = "5 "0 "0231D
+\Umathcode "0231E = "4 "0 "0231E
+\Umathcode "0231F = "5 "0 "0231F
+\Umathcode "02322 = "3 "0 "02322
+\Umathcode "02323 = "3 "0 "02323
+\Umathcode "023B0 = "4 "0 "023B0
+\Umathcode "023B1 = "5 "0 "023B1
+\Umathcode "024C7 = "0 "0 "024C7
+\Umathcode "024C8 = "0 "0 "024C8
+\Umathcode "025A0 = "0 "0 "025A0
+\Umathcode "025A1 = "0 "0 "025A1
+\Umathcode "025A2 = "0 "0 "025A2
+\Umathcode "025B2 = "2 "0 "025B2
+\Umathcode "025B3 = "0 "0 "025B3
+\Umathcode "025B6 = "2 "0 "025B6
+\Umathcode "025B7 = "2 "0 "025B7
+\Umathcode "025BC = "2 "0 "025BC
+\Umathcode "025BD = "2 "0 "025BD
+\Umathcode "025C0 = "2 "0 "025C0
+\Umathcode "025C1 = "2 "0 "025C1
+\Umathcode "025CA = "0 "0 "025CA
+\Umathcode "025EF = "2 "0 "025EF
+\Umathcode "02605 = "0 "0 "02605
+\Umathcode "02660 = "0 "0 "02660
+\Umathcode "02661 = "0 "0 "02661
+\Umathcode "02662 = "0 "0 "02662
+\Umathcode "02663 = "0 "0 "02663
+\Umathcode "02666 = "0 "0 "02666
+\Umathcode "0266D = "0 "0 "0266D
+\Umathcode "0266E = "0 "0 "0266E
+\Umathcode "0266F = "0 "0 "0266F
+\Umathcode "02713 = "0 "0 "02713
+\Umathcode "02720 = "0 "0 "02720
+\Umathcode "027E6 = "4 "0 "027E6
+\Umathcode "027E7 = "5 "0 "027E7
+\Umathcode "027E8 = "4 "0 "027E8
+\Umathcode "027E9 = "5 "0 "027E9
+\Umathcode "027EA = "4 "0 "027EA
+\Umathcode "027EB = "5 "0 "027EB
+\Umathcode "027EE = "4 "0 "027EE
+\Umathcode "027EF = "5 "0 "027EF
+\Umathcode "027F5 = "3 "0 "027F5
+\Umathcode "027F6 = "3 "0 "027F6
+\Umathcode "027F7 = "3 "0 "027F7
+\Umathcode "027F8 = "3 "0 "027F8
+\Umathcode "027F9 = "3 "0 "027F9
+\Umathcode "027FA = "3 "0 "027FA
+\Umathcode "027FB = "3 "0 "027FB
+\Umathcode "027FC = "3 "0 "027FC
+\Umathcode "027FD = "3 "0 "027FD
+\Umathcode "027FE = "3 "0 "027FE
+\Umathcode "027FF = "3 "0 "027FF
+\Umathcode "02906 = "3 "0 "02906
+\Umathcode "02907 = "3 "0 "02907
+\Umathcode "0290A = "3 "0 "0290A
+\Umathcode "0290B = "3 "0 "0290B
+\Umathcode "0290C = "3 "0 "0290C
+\Umathcode "0290D = "3 "0 "0290D
+\Umathcode "02911 = "3 "0 "02911
+\Umathcode "02916 = "3 "0 "02916
+\Umathcode "02917 = "3 "0 "02917
+\Umathcode "02921 = "3 "0 "02921
+\Umathcode "02922 = "3 "0 "02922
+\Umathcode "02923 = "3 "0 "02923
+\Umathcode "02924 = "3 "0 "02924
+\Umathcode "02925 = "3 "0 "02925
+\Umathcode "02926 = "3 "0 "02926
+\Umathcode "02A00 = "1 "0 "02A00
+\Umathcode "02A01 = "1 "0 "02A01
+\Umathcode "02A02 = "1 "0 "02A02
+\Umathcode "02A03 = "1 "0 "02A03
+\Umathcode "02A04 = "1 "0 "02A04
+\Umathcode "02A05 = "1 "0 "02A05
+\Umathcode "02A06 = "1 "0 "02A06
+\Umathcode "02A09 = "1 "0 "02A09
+\Umathcode "02A3F = "2 "0 "02A3F
+\Umathcode "02A7D = "3 "0 "02A7D
+\Umathcode "02A7E = "3 "0 "02A7E
+\Umathcode "02A85 = "3 "0 "02A85
+\Umathcode "02A86 = "3 "0 "02A86
+\Umathcode "02A87 = "3 "0 "02A87
+\Umathcode "02A88 = "3 "0 "02A88
+\Umathcode "02A89 = "3 "0 "02A89
+\Umathcode "02A8A = "3 "0 "02A8A
+\Umathcode "02A8B = "3 "0 "02A8B
+\Umathcode "02A8C = "3 "0 "02A8C
+\Umathcode "02A95 = "3 "0 "02A95
+\Umathcode "02A96 = "3 "0 "02A96
+\Umathcode "02AAF = "3 "0 "02AAF
+\Umathcode "02AB0 = "3 "0 "02AB0
+\Umathcode "02AB1 = "3 "0 "02AB1
+\Umathcode "02AB2 = "3 "0 "02AB2
+\Umathcode "02AB3 = "3 "0 "02AB3
+\Umathcode "02AB4 = "3 "0 "02AB4
+\Umathcode "02AB5 = "3 "0 "02AB5
+\Umathcode "02AB6 = "3 "0 "02AB6
+\Umathcode "02AB7 = "3 "0 "02AB7
+\Umathcode "02AB8 = "3 "0 "02AB8
+\Umathcode "02AB9 = "3 "0 "02AB9
+\Umathcode "02ABA = "3 "0 "02ABA
+\Umathcode "02AC5 = "3 "0 "02AC5
+\Umathcode "02AC6 = "3 "0 "02AC6
+\Umathcode "02ACB = "3 "0 "02ACB
+\Umathcode "02ACC = "3 "0 "02ACC
+\Umathcode "12035 = "0 "0 "12035
+\Umathcode "1D6A4 = "0 "0 "1D6A4
+\Umathcode "1D6A5 = "0 "0 "1D6A5
+\Umathcode "1D6FB = "0 "0 "1D6FB
+\Umathcode "1D717 = "0 "0 "1D717
+\Umathcode "1D718 = "0 "0 "1D718
+
+% gaps .. done in lua (as example)
+
+% \Umathcode "1D455 = "0 "0 "0210E
+% \Umathcode "1D49D = "0 "0 "0212C
+% \Umathcode "1D4A0 = "0 "0 "02130
+% \Umathcode "1D4A1 = "0 "0 "02131
+% \Umathcode "1D4A3 = "0 "0 "0210B
+% \Umathcode "1D4A4 = "0 "0 "02110
+% \Umathcode "1D4A7 = "0 "0 "02112
+% \Umathcode "1D4A8 = "0 "0 "02133
+% \Umathcode "1D4AD = "0 "0 "0211B
+% \Umathcode "1D4BA = "0 "0 "0212F
+% \Umathcode "1D4BC = "0 "0 "0210A
+% \Umathcode "1D4C4 = "0 "0 "02134
+% \Umathcode "1D506 = "0 "0 "0212D
+% \Umathcode "1D50B = "0 "0 "0210C
+% \Umathcode "1D50C = "0 "0 "02111
+% \Umathcode "1D515 = "0 "0 "0211C
+% \Umathcode "1D51D = "0 "0 "02128
+% \Umathcode "1D53A = "0 "0 "02102
+% \Umathcode "1D53F = "0 "0 "0210D
+% \Umathcode "1D545 = "0 "0 "02115
+% \Umathcode "1D547 = "0 "0 "02119
+% \Umathcode "1D548 = "0 "0 "0211A
+% \Umathcode "1D549 = "0 "0 "0211D
+% \Umathcode "1D551 = "0 "0 "02124
+
+% initialization
+
+\the\everymathit
+
+% a couple of definitions (we could also use \mathchardef):
+
+\def\acute {\Umathaccent"0"0"0000B4 }
+\def\acwopencirclearrow {\Umathchar "3"0"0021BA }
+\def\aleph {\Umathchar "0"0"002135 }
+\def\Alpha {\Umathchar "0"0"000391 }
+\def\alpha {\Umathchar "0"0"0003B1 }
+\def\amalg {\Umathchar "2"0"002A3F }
+\def\angle {\Umathchar "0"0"002220 }
+\def\Angstrom {\Umathchar "0"0"00212B }
+\def\approx {\Umathchar "3"0"002248 }
+\def\approxEq {\Umathchar "3"0"002245 }
+\def\approxeq {\Umathchar "3"0"00224A }
+\def\approxnEq {\Umathchar "3"0"002247 }
+\def\arrowvert {\Umathchar "0"0"00007C }
+\def\Arrowvert {\Umathchar "0"0"002016 }
+\def\ast {\Umathchar "2"0"002217 }
+\def\ast {\Umathchar "2"0"002217 }
+\def\asymp {\Umathchar "3"0"00224D }
+\def\backepsilon {\Umathchar "0"0"0003F6 }
+\def\backprime {\Umathchar "0"0"012035 }
+\def\backsim {\Umathchar "3"0"00223D }
+\def\backslash {\Umathchar "0"0"00005C }
+\def\bar {\Umathaccent"0"0"0000AF }
+\def\barleftarrow {\Umathchar "3"0"0021E4 }
+\def\barleftarrowrightarrowbar {\Umathchar "3"0"0021B9 }
+\def\barovernorthwestarrow {\Umathchar "3"0"0021B8 }
+\def\barwedge {\Umathchar "2"0"0022BC }
+\def\because {\Umathchar "3"0"002235 }
+\def\Beta {\Umathchar "0"0"000392 }
+\def\beta {\Umathchar "0"0"0003B2 }
+\def\beth {\Umathchar "0"0"002136 }
+\def\between {\Umathchar "3"0"00226C }
+\def\bigcap {\Umathchar "1"0"0022C2 }
+\def\bigcirc {\Umathchar "2"0"0025EF }
+\def\bigcircle {\Umathchar "2"0"0020DD }
+\def\bigcircle {\Umathchar "2"0"0020DD }
+\def\bigcup {\Umathchar "1"0"0022C3 }
+\def\bigdiamond {\Umathchar "0"0"0020DF }
+\def\bigodot {\Umathchar "1"0"002A00 }
+\def\bigoplus {\Umathchar "1"0"002A01 }
+\def\bigotimes {\Umathchar "1"0"002A02 }
+\def\bigsqcap {\Umathchar "1"0"002A05 }
+\def\bigsqcup {\Umathchar "1"0"002A06 }
+\def\bigsquare {\Umathchar "0"0"0020DE }
+\def\bigstar {\Umathchar "0"0"002605 }
+\def\bigtimes {\Umathchar "1"0"002A09 }
+\def\bigtriangledown {\Umathchar "2"0"0025BD }
+\def\bigtriangleup {\Umathchar "2"0"0025B3 }
+\def\bigudot {\Umathchar "1"0"002A03 }
+\def\biguplus {\Umathchar "1"0"002A04 }
+\def\bigvee {\Umathchar "1"0"0022C1 }
+\def\bigwedge {\Umathchar "1"0"0022C0 }
+\def\blacklozenge {\Umathchar "0"0"002666 }
+\def\blacksquare {\Umathchar "0"0"0025A0 }
+\def\blacktriangle {\Umathchar "2"0"0025B2 }
+\def\blacktriangledown {\Umathchar "2"0"0025BC }
+\def\blacktriangleleft {\Umathchar "2"0"0025C0 }
+\def\blacktriangleright {\Umathchar "2"0"0025B6 }
+\def\bot {\Umathchar "0"0"0022A5 }
+\def\bowtie {\Umathchar "3"0"0022C8 }
+\def\Box {\Umathchar "0"0"0025A1 }
+\def\boxdot {\Umathchar "2"0"0022A1 }
+\def\boxminus {\Umathchar "2"0"00229F }
+\def\boxplus {\Umathchar "2"0"00229E }
+\def\boxtimes {\Umathchar "2"0"0022A0 }
+%def\braceld {\Umathchar "0"0"000000 }
+%def\bracerd {\Umathchar "0"0"000000 }
+%def\bracelu {\Umathchar "0"0"000000 }
+%def\braceru {\Umathchar "0"0"000000 }
+\def\breve {\Umathaccent"0"0"0002D8 }
+\def\bullet {\Umathchar "2"0"002022 }
+\def\bullet {\Umathchar "2"0"002022 }
+\def\Bumpeq {\Umathchar "3"0"00224E }
+\def\cap {\Umathchar "2"0"002229 }
+\def\Cap {\Umathchar "2"0"0022D2 }
+\def\carriagereturn {\Umathchar "0"0"0021B5 }
+\def\cdot {\Umathchar "2"0"0022C5 }
+\def\cdotp {\Umathchar "6"0"0022C5 }
+\def\cdots {\Umathchar "0"0"0022EF }
+\def\centerdot {\Umathchar "2"0"0000B7 }
+\def\check {\Umathaccent"0"0"0002C7 }
+\def\checkmark {\Umathchar "0"0"002713 }
+\def\Chi {\Umathchar "0"0"0003A7 }
+\def\chi {\Umathchar "0"0"0003C7 }
+\def\circ {\Umathchar "2"0"002218 }
+\def\circeq {\Umathchar "3"0"002257 }
+\def\circlearrowleft {\Umathchar "3"0"0021BB }
+\def\circlearrowright {\Umathchar "3"0"0021BA }
+\def\circledast {\Umathchar "2"0"00229B }
+\def\circledcirc {\Umathchar "2"0"00229A }
+\def\circleddash {\Umathchar "2"0"00229D }
+\def\circledequals {\Umathchar "2"0"00229C }
+\def\circledR {\Umathchar "0"0"0024C7 }
+\def\circledS {\Umathchar "0"0"0024C8 }
+\def\circleonrightarrow {\Umathchar "3"0"0021F4 }
+\def\clubsuit {\Umathchar "0"0"002663 }
+\def\colon {\Umathchar "6"0"002236 }
+\def\colonequals {\Umathchar "3"0"002254 }
+\def\complement {\Umathchar "0"0"002201 }
+\def\complexes {\Umathchar "0"0"002102 }
+\def\cong {\Umathchar "3"0"002245 }
+\def\coprod {\Umathchar "1"0"002210 }
+\def\cup {\Umathchar "2"0"00222A }
+\def\Cup {\Umathchar "2"0"0022D3 }
+\def\curlyeqprec {\Umathchar "3"0"0022DE }
+\def\curlyeqsucc {\Umathchar "3"0"0022DF }
+\def\curlyvee {\Umathchar "2"0"0022CE }
+\def\curlywedge {\Umathchar "2"0"0022CF }
+\def\curvearrowleft {\Umathchar "3"0"0021B6 }
+\def\curvearrowright {\Umathchar "3"0"0021B7 }
+\def\cwopencirclearrow {\Umathchar "3"0"0021BB }
+\def\dag {\Umathchar "0"0"002020 }
+\def\dagger {\Umathchar "2"0"002020 }
+\def\daleth {\Umathchar "0"0"002138 }
+\def\dasharrow {\Umathchar "3"0"0021E2 }
+\def\dashedleftarrow {\Umathchar "3"0"00290C }
+\def\dashedrightarrow {\Umathchar "3"0"00290D }
+\def\dashv {\Umathchar "3"0"0022A3 }
+\def\ddag {\Umathchar "0"0"002021 }
+\def\ddagger {\Umathchar "2"0"002021 }
+\def\dddot {\Umathaccent"0"0"0020DB }
+\def\ddot {\Umathaccent"0"0"0000A8 }
+\def\ddots {\Umathchar "0"0"0022F1 }
+\def\Ddownarrow {\Umathchar "3"0"00290B }
+\def\definedeq {\Umathchar "3"0"00225D }
+\def\Delta {\Umathchar "0"0"000394 }
+\def\delta {\Umathchar "0"0"0003B4 }
+\def\diamond {\Umathchar "2"0"0022C4 }
+\def\diamondsuit {\Umathchar "0"0"002662 }
+\def\differentialD {\Umathchar "0"0"002145 }
+\def\differentiald {\Umathchar "0"0"002146 }
+\def\digamma {\Umathchar "0"0"0003DC }
+\def\div {\Umathchar "2"0"0000F7 }
+\def\divideontimes {\Umathchar "2"0"0022C7 }
+\def\divides {\Umathchar "2"0"002223 }
+\def\dot {\Umathaccent"0"0"0002D9 }
+\def\doteq {\Umathchar "3"0"002250 }
+\def\Doteq {\Umathchar "3"0"002251 }
+\def\doteqdot {\Umathchar "3"0"002251 }
+\def\dotminus {\Umathchar "2"0"002238 }
+\def\dotplus {\Umathchar "2"0"002214 }
+\def\dots {\Umathchar "0"0"002026 }
+\def\dottedrightarrow {\Umathchar "3"0"002911 }
+\def\doublecap {\Umathchar "2"0"0022D2 }
+\def\doublecup {\Umathchar "2"0"0022D3 }
+\def\doubleprime {\Umathchar "0"0"002033 }
+\def\downarrow {\Umathchar "3"0"002193 }
+\def\Downarrow {\Umathchar "3"0"0021D3 }
+\def\downdasharrow {\Umathchar "3"0"0021E3 }
+\def\downdownarrows {\Umathchar "3"0"0021CA }
+\def\downharpoonleft {\Umathchar "3"0"0021C3 }
+\def\downharpoonright {\Umathchar "3"0"0021C2 }
+\def\downuparrows {\Umathchar "3"0"0021F5 }
+\def\downwhitearrow {\Umathchar "0"0"0021E9 }
+\def\downzigzagarrow {\Umathchar "3"0"0021AF }
+\def\ell {\Umathchar "0"0"002113 }
+\def\emptyset {\Umathchar "0"0"002205 }
+\def\Epsilon {\Umathchar "0"0"000395 }
+\def\epsilon {\Umathchar "0"0"0003F5 }
+\def\eq {\Umathchar "3"0"00003D }
+\def\eqcirc {\Umathchar "3"0"002256 }
+\def\eqgtr {\Umathchar "3"0"0022DD }
+\def\eqless {\Umathchar "3"0"0022DC }
+\def\eqsim {\Umathchar "3"0"002242 }
+\def\eqslantgtr {\Umathchar "3"0"002A96 }
+\def\eqslantless {\Umathchar "3"0"002A95 }
+\def\equalscolon {\Umathchar "3"0"002255 }
+\def\equiv {\Umathchar "3"0"002261 }
+\def\Eta {\Umathchar "0"0"000397 }
+\def\eta {\Umathchar "0"0"0003B7 }
+\def\eth {\Umathchar "0"0"0000F0 }
+\def\Eulerconst {\Umathchar "0"0"002107 }
+\def\exists {\Umathchar "0"0"002203 }
+\def\exponentiale {\Umathchar "0"0"002147 }
+\def\fallingdotseq {\Umathchar "3"0"002252 }
+\def\Finv {\Umathchar "0"0"002132 }
+\def\flat {\Umathchar "0"0"00266D }
+\def\forall {\Umathchar "0"0"002200 }
+\def\frown {\Umathchar "3"0"002322 }
+\def\Game {\Umathchar "0"0"002141 }
+\def\Gamma {\Umathchar "0"0"000393 }
+\def\gamma {\Umathchar "0"0"0003B3 }
+\def\ge {\Umathchar "3"0"002265 }
+\def\geq {\Umathchar "3"0"002265 }
+\def\geqq {\Umathchar "3"0"002267 }
+\def\geqslant {\Umathchar "3"0"002A7E }
+\def\gets {\Umathchar "3"0"002190 }
+\def\gg {\Umathchar "3"0"00226B }
+\def\ggg {\Umathchar "3"0"0022D9 }
+\def\gggtr {\Umathchar "3"0"0022D9 }
+\def\gimel {\Umathchar "0"0"002137 }
+\def\gnapprox {\Umathchar "3"0"002A8A }
+\def\gneqq {\Umathchar "3"0"002269 }
+\def\gnsim {\Umathchar "3"0"0022E7 }
+\def\grave {\Umathaccent"0"0"000060 }
+\def\gt {\Umathchar "3"0"00003E }
+\def\gtrapprox {\Umathchar "3"0"002A86 }
+\def\gtrdot {\Umathchar "2"0"0022D7 }
+\def\gtreqless {\Umathchar "3"0"0022DB }
+\def\gtreqqless {\Umathchar "3"0"002A8C }
+\def\gtrless {\Umathchar "3"0"002277 }
+\def\gtrsim {\Umathchar "3"0"002273 }
+\def\hat {\Umathaccent"0"0"0002C6 }
+\def\hbar {\Umathchar "0"0"00210F }
+\def\heartsuit {\Umathchar "0"0"002661 }
+\def\hookleftarrow {\Umathchar "3"0"0021A9 }
+\def\hookrightarrow {\Umathchar "3"0"0021AA }
+\def\hslash {\Umathchar "0"0"00210F }
+\def\iiint {\Umathchar "1"0"00222D }
+\def\iiintop {\Umathchar "0"0"00222D }
+\def\iint {\Umathchar "1"0"00222C }
+\def\iintop {\Umathchar "0"0"00222C }
+\def\Im {\Umathchar "0"0"002111 }
+\def\imaginaryi {\Umathchar "0"0"002148 }
+\def\imaginaryj {\Umathchar "0"0"002149 }
+\def\imath {\Umathchar "0"0"01D6A4 }
+\def\imply {\Umathchar "3"0"0021D2 }
+\def\in {\Umathchar "0"0"002208 }
+\def\infty {\Umathchar "0"0"00221E }
+\def\int {\Umathchar "1"0"00222B }
+\def\intclockwise {\Umathchar "1"0"002231 }
+\def\integers {\Umathchar "0"0"002124 }
+\def\intercal {\Umathchar "2"0"0022BA }
+\def\intop {\Umathchar "0"0"00222B }
+\def\Iota {\Umathchar "0"0"000399 }
+\def\iota {\Umathchar "0"0"0003B9 }
+\def\jmath {\Umathchar "0"0"01D6A5 }
+\def\Join {\Umathchar "3"0"0022C8 }
+\def\Kappa {\Umathchar "0"0"00039A }
+\def\kappa {\Umathchar "0"0"0003BA }
+\def\Lambda {\Umathchar "0"0"00039B }
+\def\lambda {\Umathchar "0"0"0003BB }
+\def\land {\Umathchar "2"0"002227 }
+\def\langle {\Udelimiter "4"0"0027E8 }
+\def\lbrace {\Udelimiter "4"0"00007B }
+\def\lbrack {\Udelimiter "4"0"00005B }
+\def\lceil {\Udelimiter "4"0"002308 }
+\def\lceiling {\Udelimiter "4"0"002308 }
+\def\ldotp {\Umathchar "6"0"00002E }
+\def\ldots {\Umathchar "0"0"002026 }
+\def\Ldsh {\Umathchar "3"0"0021B2 }
+\def\le {\Umathchar "3"0"002264 }
+\def\leadsto {\Umathchar "3"0"0021DD }
+\def\leftarrow {\Umathchar "3"0"002190 }
+\def\Leftarrow {\Umathchar "3"0"0021D0 }
+\def\leftarrowtail {\Umathchar "3"0"0021A2 }
+\def\leftarrowtriangle {\Umathchar "3"0"0021FD }
+\def\leftdasharrow {\Umathchar "3"0"0021E0 }
+\def\leftharpoondown {\Umathchar "3"0"0021BD }
+\def\leftharpoonup {\Umathchar "3"0"0021BC }
+\def\leftleftarrows {\Umathchar "3"0"0021C7 }
+\def\leftrightarrow {\Umathchar "3"0"002194 }
+\def\Leftrightarrow {\Umathchar "3"0"0021D4 }
+\def\leftrightarrows {\Umathchar "3"0"0021C6 }
+\def\leftrightarrowtriangle {\Umathchar "3"0"0021FF }
+\def\leftrightharpoons {\Umathchar "3"0"0021CB }
+\def\leftrightsquigarrow {\Umathchar "3"0"0021AD }
+\def\leftsquigarrow {\Umathchar "3"0"0021DC }
+\def\leftthreetimes {\Umathchar "2"0"0022CB }
+\def\leftwavearrow {\Umathchar "3"0"00219C }
+\def\leftwhitearrow {\Umathchar "0"0"0021E6 }
+\def\leq {\Umathchar "3"0"002264 }
+\def\leqq {\Umathchar "3"0"002266 }
+\def\leqslant {\Umathchar "3"0"002A7D }
+\def\lessapprox {\Umathchar "3"0"002A85 }
+\def\lessdot {\Umathchar "2"0"0022D6 }
+\def\lesseqgtr {\Umathchar "3"0"0022DA }
+\def\lesseqqgtr {\Umathchar "3"0"002A8B }
+\def\lessgtr {\Umathchar "3"0"002276 }
+\def\lesssim {\Umathchar "3"0"002272 }
+\def\lfloor {\Udelimiter "4"0"00230A }
+\def\lgroup {\Udelimiter "4"0"0027EE }
+\def\lhook {\Umathchar "3"0"0FE322 }
+\def\lhooknwarrow {\Umathchar "3"0"002923 }
+\def\lhooksearrow {\Umathchar "3"0"002925 }
+\def\linefeed {\Umathchar "0"0"0021B4 }
+\def\ll {\Umathchar "3"0"00226A }
+\def\llangle {\Udelimiter "4"0"0027EA }
+\def\llbracket {\Udelimiter "4"0"0027E6 }
+\def\llcorner {\Udelimiter "4"0"00231E }
+\def\Lleftarrow {\Umathchar "3"0"0021DA }
+\def\lll {\Umathchar "3"0"0022D8 }
+\def\llless {\Umathchar "3"0"0022D8 }
+\def\lmoustache {\Udelimiter "4"0"0023B0 }
+\def\lnapprox {\Umathchar "3"0"002A89 }
+\def\lneq {\Umathchar "3"0"002A87 }
+\def\lneqq {\Umathchar "3"0"002268 }
+\def\lnot {\Umathchar "0"0"0000AC }
+\def\lnsim {\Umathchar "3"0"0022E6 }
+\def\longleftarrow {\Umathchar "3"0"0027F5 }
+\def\Longleftarrow {\Umathchar "3"0"0027F8 }
+\def\longleftrightarrow {\Umathchar "3"0"0027F7 }
+\def\Longleftrightarrow {\Umathchar "3"0"0027FA }
+\def\longmapsfrom {\Umathchar "3"0"0027FB }
+\def\Longmapsfrom {\Umathchar "3"0"0027FD }
+\def\longmapsto {\Umathchar "3"0"0027FC }
+\def\Longmapsto {\Umathchar "3"0"0027FE }
+\def\longrightarrow {\Umathchar "3"0"0027F6 }
+\def\Longrightarrow {\Umathchar "3"0"0027F9 }
+\def\longrightsquigarrow {\Umathchar "3"0"0027FF }
+\def\looparrowleft {\Umathchar "3"0"0021AB }
+\def\looparrowright {\Umathchar "3"0"0021AC }
+\def\lor {\Umathchar "2"0"002228 }
+\def\lozenge {\Umathchar "0"0"0025CA }
+\def\lparent {\Udelimiter "4"0"000028 }
+\def\lrcorner {\Udelimiter "5"0"00231F }
+\def\Lsh {\Umathchar "3"0"0021B0 }
+\def\lt {\Umathchar "3"0"00003C }
+\def\ltimes {\Umathchar "2"0"0022C9 }
+\def\lvert {\Udelimiter "4"0"00007C }
+\def\lVert {\Udelimiter "4"0"002016 }
+\def\maltese {\Umathchar "0"0"002720 }
+\def\mapsdown {\Umathchar "3"0"0021A7 }
+\def\mapsfrom {\Umathchar "3"0"0021A4 }
+\def\Mapsfrom {\Umathchar "3"0"002906 }
+\def\mapsfromchar {\Umathchar "3"0"0FE324 }
+\def\mapsto {\Umathchar "3"0"0021A6 }
+\def\Mapsto {\Umathchar "3"0"002907 }
+\def\mapstochar {\Umathchar "3"0"0FE321 }
+\def\mapsup {\Umathchar "3"0"0021A5 }
+\def\mathring {\Umathaccent"0"0"0002DA }
+\def\measuredangle {\Umathchar "0"0"002221 }
+\def\measuredeq {\Umathchar "3"0"00225E }
+\def\mho {\Umathchar "0"0"002127 }
+\def\mid {\Umathchar "3"0"00007C }
+\def\minus {\Umathchar "2"0"002212 }
+\def\minuscolon {\Umathchar "2"0"002239 }
+\def\models {\Umathchar "3"0"0022A7 }
+\def\mp {\Umathchar "2"0"002213 }
+\def\Mu {\Umathchar "0"0"00039C }
+\def\mu {\Umathchar "0"0"0003BC }
+\def\multimap {\Umathchar "3"0"0022B8 }
+\def\napprox {\Umathchar "3"0"002249 }
+\def\napproxEq {\Umathchar "3"0"002246 }
+\def\nasymp {\Umathchar "3"0"00226D }
+\def\natural {\Umathchar "0"0"00266E }
+\def\naturalnumbers {\Umathchar "0"0"002115 }
+\def\ncong {\Umathchar "3"0"002246 }
+\def\ndivides {\Umathchar "2"0"002224 }
+\def\ne {\Umathchar "3"0"002260 }
+\def\nearrow {\Umathchar "3"0"002197 }
+\def\Nearrow {\Umathchar "3"0"0021D7 }
+\def\neg {\Umathchar "0"0"0000AC }
+\def\negativesign {\Umathchar "2"0"00207B }
+\def\neq {\Umathchar "3"0"002260 }
+\def\nequiv {\Umathchar "3"0"002262 }
+\def\neswarrow {\Umathchar "3"0"002922 }
+\def\nexists {\Umathchar "0"0"002204 }
+\def\ngeq {\Umathchar "3"0"002271 }
+\def\ngtr {\Umathchar "3"0"00226F }
+\def\ngtrless {\Umathchar "3"0"002279 }
+\def\ngtrsim {\Umathchar "3"0"002275 }
+\def\nHdownarrow {\Umathchar "3"0"0021DF }
+\def\nHuparrow {\Umathchar "3"0"0021DE }
+\def\ni {\Umathchar "3"0"00220B }
+\def\nin {\Umathchar "3"0"002209 }
+\def\nleftarrow {\Umathchar "3"0"00219A }
+\def\nLeftarrow {\Umathchar "3"0"0021CD }
+\def\nleftrightarrow {\Umathchar "3"0"0021AE }
+\def\nLeftrightarrow {\Umathchar "3"0"0021CE }
+\def\nleq {\Umathchar "3"0"002270 }
+\def\nless {\Umathchar "3"0"00226E }
+\def\nlessgtr {\Umathchar "3"0"002278 }
+\def\nlesssim {\Umathchar "3"0"002274 }
+\def\nmid {\Umathchar "3"0"002224 }
+\def\nni {\Umathchar "3"0"00220C }
+\def\not {\Umathchar "3"0"000338 }
+\def\notin {\Umathchar "3"0"002209 }
+\def\nowns {\Umathchar "3"0"00220C }
+\def\nparallel {\Umathchar "3"0"002226 }
+\def\nprec {\Umathchar "3"0"002280 }
+\def\npreccurlyeq {\Umathchar "3"0"0022E0 }
+\def\nrightarrow {\Umathchar "3"0"00219B }
+\def\nRightarrow {\Umathchar "3"0"0021CF }
+\def\nsim {\Umathchar "3"0"002241 }
+\def\nsimeq {\Umathchar "3"0"002244 }
+\def\nsqsubseteq {\Umathchar "3"0"0022E2 }
+\def\nsqsupseteq {\Umathchar "3"0"0022E3 }
+\def\nsubset {\Umathchar "3"0"002284 }
+\def\nsubseteq {\Umathchar "3"0"002288 }
+\def\nsucc {\Umathchar "3"0"002281 }
+\def\nsucccurlyeq {\Umathchar "3"0"0022E1 }
+\def\nsupset {\Umathchar "3"0"002285 }
+\def\nsupseteq {\Umathchar "3"0"002289 }
+\def\ntriangleleft {\Umathchar "3"0"0022EB }
+\def\ntrianglelefteq {\Umathchar "3"0"0022EC }
+\def\ntriangleright {\Umathchar "3"0"0022EA }
+\def\ntrianglerighteq {\Umathchar "3"0"0022ED }
+\def\Nu {\Umathchar "0"0"00039D }
+\def\nu {\Umathchar "0"0"0003BD }
+\def\nvdash {\Umathchar "3"0"0022AC }
+\def\nvDash {\Umathchar "3"0"0022AD }
+\def\nVdash {\Umathchar "3"0"0022AE }
+\def\nVDash {\Umathchar "3"0"0022AF }
+\def\nvleftarrow {\Umathchar "3"0"0021F7 }
+\def\nVleftarrow {\Umathchar "3"0"0021FA }
+\def\nvleftrightarrow {\Umathchar "3"0"0021F9 }
+\def\nVleftrightarrow {\Umathchar "3"0"0021FC }
+\def\nvrightarrow {\Umathchar "3"0"0021F8 }
+\def\nVrightarrow {\Umathchar "3"0"0021FB }
+\def\nwarrow {\Umathchar "3"0"002196 }
+\def\Nwarrow {\Umathchar "3"0"0021D6 }
+\def\nwsearrow {\Umathchar "3"0"002921 }
+\def\odot {\Umathchar "2"0"002299 }
+\def\ohm {\Umathchar "0"0"002126 }
+\def\oiiint {\Umathchar "1"0"002230 }
+\def\oiint {\Umathchar "1"0"00222F }
+\def\oint {\Umathchar "1"0"00222E }
+\def\ointclockwise {\Umathchar "1"0"002232 }
+\def\ointctrclockwise {\Umathchar "1"0"002233 }
+\def\Omega {\Umathchar "0"0"0003A9 }
+\def\omega {\Umathchar "0"0"0003C9 }
+\def\Omicron {\Umathchar "0"0"00039F }
+\def\omicron {\Umathchar "0"0"0003BF }
+\def\ominus {\Umathchar "2"0"002296 }
+\def\oplus {\Umathchar "2"0"002295 }
+\def\oslash {\Umathchar "2"0"002298 }
+\def\otimes {\Umathchar "2"0"002297 }
+\def\overbar {\Umathaccent"0"0"00203E }
+\def\overbrace {\Umathaccent"0"0"0023DE }
+\def\overbracket {\Umathaccent"0"0"0023B4 }
+\def\overparent {\Umathaccent"0"0"0023DC }
+\def\owns {\Umathchar "3"0"00220B }
+\def\P {\Umathchar "0"0"0000B6 }
+\def\parallel {\Umathchar "3"0"002225 }
+\def\partial {\Umathchar "0"0"002202 }
+\def\perp {\Umathchar "3"0"0022A5 }
+\def\Phi {\Umathchar "0"0"0003A6 }
+\def\phi {\Umathchar "0"0"0003D5 }
+\def\Pi {\Umathchar "0"0"0003A0 }
+\def\pi {\Umathchar "0"0"0003C0 }
+\def\pitchfork {\Umathchar "3"0"0022D4 }
+\def\Plankconst {\Umathchar "0"0"00210E }
+\def\pm {\Umathchar "2"0"0000B1 }
+\def\positivesign {\Umathchar "2"0"00207A }
+\def\prec {\Umathchar "3"0"00227A }
+\def\precapprox {\Umathchar "3"0"002AB7 }
+\def\preccurlyeq {\Umathchar "3"0"00227C }
+\def\preceq {\Umathchar "3"0"002AAF }
+\def\preceqq {\Umathchar "3"0"002AB3 }
+\def\precnapprox {\Umathchar "3"0"002AB9 }
+\def\precneq {\Umathchar "3"0"002AB1 }
+\def\precneqq {\Umathchar "3"0"002AB5 }
+\def\precnsim {\Umathchar "3"0"0022E8 }
+\def\precsim {\Umathchar "3"0"00227E }
+\def\prime {\Umathchar "0"0"002032 }
+\def\primes {\Umathchar "0"0"002119 }
+\def\prod {\Umathchar "1"0"00220F }
+\def\PropertyLine {\Umathchar "0"0"00214A }
+\def\propto {\Umathchar "3"0"00221D }
+\def\Psi {\Umathchar "0"0"0003A8 }
+\def\psi {\Umathchar "0"0"0003C8 }
+\def\questionedeq {\Umathchar "3"0"00225F }
+\def\rangle {\Udelimiter "5"0"0027E9 }
+\def\rationals {\Umathchar "0"0"00211A }
+\def\rbrace {\Udelimiter "5"0"00007D }
+\def\rbrack {\Udelimiter "5"0"00005D }
+\def\rceil {\Udelimiter "5"0"002309 }
+\def\rceiling {\Udelimiter "5"0"002309 }
+\def\Rdsh {\Umathchar "3"0"0021B3 }
+\def\Re {\Umathchar "0"0"00211C }
+\def\reals {\Umathchar "0"0"00211D }
+\def\Relbar {\Umathchar "3"0"00003D }
+\def\relbar {\Umathchar "3"0"002212 }
+\def\restriction {\Umathchar "3"0"0021BE }
+\def\rfloor {\Udelimiter "5"0"00230B }
+\def\rgroup {\Udelimiter "5"0"0027EF }
+\def\Rho {\Umathchar "0"0"0003A1 }
+\def\rho {\Umathchar "0"0"0003C1 }
+\def\rhook {\Umathchar "3"0"0FE323 }
+\def\rhooknearrow {\Umathchar "3"0"002924 }
+\def\rhookswarrow {\Umathchar "3"0"002926 }
+\def\rightangle {\Umathchar "0"0"00221F }
+\def\rightarrow {\Umathchar "3"0"002192 }
+\def\Rightarrow {\Umathchar "3"0"0021D2 }
+\def\rightarrowbar {\Umathchar "3"0"0021E5 }
+\def\rightarrowtail {\Umathchar "3"0"0021A3 }
+\def\rightarrowtriangle {\Umathchar "3"0"0021FE }
+\def\rightdasharrow {\Umathchar "3"0"0021E2 }
+\def\rightharpoondown {\Umathchar "3"0"0021C1 }
+\def\rightharpoonup {\Umathchar "3"0"0021C0 }
+\def\rightleftarrows {\Umathchar "3"0"0021C4 }
+\def\rightleftharpoons {\Umathchar "3"0"0021CC }
+\def\rightrightarrows {\Umathchar "3"0"0021C9 }
+\def\rightsquigarrow {\Umathchar "3"0"0021DD }
+\def\rightthreearrows {\Umathchar "3"0"0021F6 }
+\def\rightthreetimes {\Umathchar "2"0"0022CC }
+\def\rightwavearrow {\Umathchar "3"0"00219D }
+\def\rightwhitearrow {\Umathchar "0"0"0021E8 }
+\def\risingdotseq {\Umathchar "3"0"002253 }
+\def\rmoustache {\Udelimiter "5"0"0023B1 }
+\def\rneq {\Umathchar "3"0"002A88 }
+\def\rparent {\Udelimiter "5"0"000029 }
+\def\rrangle {\Udelimiter "5"0"0027EB }
+\def\rrbracket {\Udelimiter "5"0"0027E7 }
+\def\Rrightarrow {\Umathchar "3"0"0021DB }
+\def\Rsh {\Umathchar "3"0"0021B1 }
+\def\rtimes {\Umathchar "2"0"0022CA }
+\def\rvert {\Udelimiter "5"0"00007C }
+\def\rVert {\Udelimiter "5"0"002016 }
+\def\S {\Umathchar "0"0"0000A7 }
+\def\searrow {\Umathchar "3"0"002198 }
+\def\Searrow {\Umathchar "3"0"0021D8 }
+\def\setminus {\Umathchar "2"0"002216 }
+\def\sharp {\Umathchar "0"0"00266F }
+\def\Sigma {\Umathchar "0"0"0003A3 }
+\def\sigma {\Umathchar "0"0"0003C3 }
+\def\sim {\Umathchar "3"0"00223C }
+\def\simeq {\Umathchar "3"0"002243 }
+\def\slash {\Umathchar "0"0"002044 }
+\def\smile {\Umathchar "3"0"002323 }
+\def\solidus {\Udelimiter "5"0"002044 }
+\def\spadesuit {\Umathchar "0"0"002660 }
+\def\sphericalangle {\Umathchar "0"0"002222 }
+\def\sqcap {\Umathchar "2"0"002293 }
+\def\sqcup {\Umathchar "2"0"002294 }
+\def\sqsubset {\Umathchar "3"0"00228F }
+\def\sqsubseteq {\Umathchar "2"0"002291 }
+\def\sqsubsetneq {\Umathchar "3"0"0022E4 }
+\def\sqsupset {\Umathchar "3"0"002290 }
+\def\sqsupseteq {\Umathchar "2"0"002292 }
+\def\sqsupsetneq {\Umathchar "3"0"0022E5 }
+\def\square {\Umathchar "0"0"0025A1 }
+\def\squaredots {\Umathchar "3"0"002237 }
+\def\star {\Umathchar "2"0"0022C6 }
+\def\stareq {\Umathchar "3"0"00225B }
+\def\subset {\Umathchar "3"0"002282 }
+\def\Subset {\Umathchar "3"0"0022D0 }
+\def\subseteq {\Umathchar "3"0"002286 }
+\def\subseteqq {\Umathchar "3"0"002AC5 }
+\def\subsetneq {\Umathchar "3"0"00228A }
+\def\subsetneqq {\Umathchar "3"0"002ACB }
+\def\succ {\Umathchar "3"0"00227B }
+\def\succapprox {\Umathchar "3"0"002AB8 }
+\def\succcurlyeq {\Umathchar "3"0"00227D }
+\def\succeq {\Umathchar "3"0"002AB0 }
+\def\succeqq {\Umathchar "3"0"002AB4 }
+\def\succnapprox {\Umathchar "3"0"002ABA }
+\def\succneq {\Umathchar "3"0"002AB2 }
+\def\succneqq {\Umathchar "3"0"002AB6 }
+\def\succnsim {\Umathchar "3"0"0022E9 }
+\def\succsim {\Umathchar "3"0"00227F }
+\def\sum {\Umathchar "1"0"002211 }
+\def\supset {\Umathchar "3"0"002283 }
+\def\Supset {\Umathchar "3"0"0022D1 }
+\def\supseteq {\Umathchar "3"0"002287 }
+\def\supseteqq {\Umathchar "3"0"002AC6 }
+\def\supsetneq {\Umathchar "3"0"00228B }
+\def\supsetneqq {\Umathchar "3"0"002ACC }
+\def\surd {\Umathchar "2"0"00221A }
+\def\swarrow {\Umathchar "3"0"002199 }
+\def\Swarrow {\Umathchar "3"0"0021D9 }
+\def\Tau {\Umathchar "0"0"0003A4 }
+\def\tau {\Umathchar "0"0"0003C4 }
+\def\therefore {\Umathchar "3"0"002234 }
+\def\Theta {\Umathchar "0"0"000398 }
+\def\theta {\Umathchar "0"0"0003B8 }
+\def\tilde {\Umathaccent"0"0"0002DC }
+\def\times {\Umathchar "2"0"0000D7 }
+\def\to {\Umathchar "3"0"002192 }
+\def\top {\Umathchar "0"0"0022A4 }
+\def\triangle {\Umathchar "0"0"0025B3 }
+\def\triangledown {\Umathchar "2"0"0025BD }
+\def\triangleleft {\Umathchar "2"0"0025C1 }
+\def\triangleq {\Umathchar "3"0"00225C }
+\def\triangleright {\Umathchar "2"0"0025B7 }
+\def\tripleprime {\Umathchar "0"0"002034 }
+\def\turnediota {\Umathchar "0"0"002129 }
+\def\twoheaddownarrow {\Umathchar "3"0"0021A1 }
+\def\twoheadleftarrow {\Umathchar "3"0"00219E }
+\def\twoheadrightarrow {\Umathchar "3"0"0021A0 }
+\def\twoheadrightarrowtail {\Umathchar "3"0"002916 }
+\def\twoheaduparrow {\Umathchar "3"0"00219F }
+\def\udots {\Umathchar "0"0"0022F0 }
+\def\ulcorner {\Udelimiter "4"0"00231C }
+\def\underbar {\Umathaccent bottom "0"0"00203E }
+\def\underbrace {\Umathaccent bottom "0"0"0023DF }
+\def\underbracket {\Umathaccent bottom "0"0"0023B5 }
+\def\underparent {\Umathaccent bottom "0"0"0023DD }
+\def\upand {\Umathchar "2"0"00214B }
+\def\uparrow {\Umathchar "3"0"002191 }
+\def\Uparrow {\Umathchar "3"0"0021D1 }
+\def\updasharrow {\Umathchar "3"0"0021E1 }
+\def\updownarrow {\Umathchar "3"0"002195 }
+\def\Updownarrow {\Umathchar "3"0"0021D5 }
+\def\updownarrowbar {\Umathchar "0"0"0021A8 }
+\def\updownarrows {\Umathchar "3"0"0021C5 }
+\def\upharpoonleft {\Umathchar "3"0"0021BF }
+\def\upharpoonright {\Umathchar "3"0"0021BE }
+\def\uplus {\Umathchar "2"0"00228E }
+\def\Upsilon {\Umathchar "0"0"0003A5 }
+\def\upsilon {\Umathchar "0"0"0003C5 }
+\def\upuparrows {\Umathchar "3"0"0021C8 }
+\def\upwhitearrow {\Umathchar "0"0"0021E7 }
+\def\urcorner {\Udelimiter "5"0"00231D }
+\def\Uuparrow {\Umathchar "3"0"00290A }
+\def\varepsilon {\Umathchar "0"0"0003B5 }
+\def\varkappa {\Umathchar "0"0"0003F0 }
+\def\varkappa {\Umathchar "0"0"0003F0 }
+\def\varnothing {\Umathchar "0"0"002300 }
+\def\varphi {\Umathchar "0"0"0003C6 }
+\def\varpi {\Umathchar "0"0"0003D6 }
+\def\varrho {\Umathchar "0"0"01D71A }
+\def\varsigma {\Umathchar "0"0"0003C2 }
+\def\vartheta {\Umathchar "0"0"01D717 }
+\def\varTheta {\Umathchar "0"0"0003D1 }
+\def\vdash {\Umathchar "3"0"0022A2 }
+\def\vDash {\Umathchar "3"0"0022A8 }
+\def\Vdash {\Umathchar "3"0"0022A9 }
+\def\VDash {\Umathchar "3"0"0022AB }
+\def\vdots {\Umathchar "0"0"0022EE }
+\def\vec {\Umathaccent"0"0"0020D7 }
+\def\vee {\Umathchar "2"0"002228 }
+\def\veebar {\Umathchar "2"0"0022BB }
+\def\veeeq {\Umathchar "3"0"00225A }
+\def\vert {\Udelimiter "0"0"00007C }
+\def\Vert {\Udelimiter "0"0"002016 }
+\def\Vvdash {\Umathchar "3"0"0022AA }
+\def\wedge {\Umathchar "2"0"002227 }
+\def\wedgeeq {\Umathchar "3"0"002259 }
+\def\whitearrowupfrombar {\Umathchar "0"0"0021EB }
+\def\widehat {\Umathaccent"0"0"000302 }
+\def\widetilde {\Umathaccent"0"0"000303 }
+\def\wp {\Umathchar "0"0"002118 }
+\def\wr {\Umathchar "2"0"002240 }
+\def\Xi {\Umathchar "0"0"00039E }
+\def\xi {\Umathchar "0"0"0003BE }
+\def\yen {\Umathchar "0"0"0000A5 }
+\def\Zeta {\Umathchar "0"0"000396 }
+\def\zeta {\Umathchar "0"0"0003B6 }
+
+% a few definitions:
+
+\def\sqrt{\Uroot "0 "221A }
+
+% \skewchar\teni='177 \skewchar\seveni='177 \skewchar\fivei='177
+% \skewchar\tensy='60 \skewchar\sevensy='60 \skewchar\fivesy='60
+
+\chardef\% = "25
+\chardef\& = "26
+\chardef\# = "23
+\chardef\$ = "24
+\chardef\_ = "5F
+
+\let\ss ß
+\let\ae æ
+\let\oe œ
+\let\o ø
+\let\AE Æ
+\let\OE Œ
+\let\O Ø
+\let\i ı
+\let\aa å
+\let\l ł
+\let\L Ł
+\let\AA Å
+\let\copyright ©
+
+% just use utf
+
+\def\`#1{\string\`\string{#1\string}}
+\def\'#1{\string\'\string{#1\string}}
+\def\v#1{\string\v\string{#1\string}}
+\def\u#1{\string\u\string{#1\string}}
+\def\=#1{\string\=\string{#1\string}}
+\def\^#1{\string\^\string{#1\string}}
+\def\.#1{\string\.\string{#1\string}}
+\def\H#1{\string\H\string{#1\string}}
+\def\~#1{\string\~\string{#1\string}}
+\def\"#1{\string\"\string{#1\string}}
+\def\d#1{\string\d\string{#1\string}}
+\def\b#1{\string\b\string{#1\string}}
+\def\c#1{\string\c\string{#1\string}}
+
+\endinput
diff --git a/Master/texmf-dist/tex/generic/context/luatex/luatex-plain.tex b/Master/texmf-dist/tex/generic/context/luatex/luatex-plain.tex
index 028d4ab0ec7..1ea8558e97f 100644
--- a/Master/texmf-dist/tex/generic/context/luatex/luatex-plain.tex
+++ b/Master/texmf-dist/tex/generic/context/luatex/luatex-plain.tex
@@ -17,6 +17,7 @@
\the\everyjob
\input {luatex-basics}%
\input {luatex-fonts}%
+ \input {luatex-math}%
\input {luatex-languages}%
\input {luatex-mplib}%
}
diff --git a/Master/texmf-dist/tex/generic/context/luatex/luatex-test.tex b/Master/texmf-dist/tex/generic/context/luatex/luatex-test.tex
index f757445d5c9..fcc837e7041 100644
--- a/Master/texmf-dist/tex/generic/context/luatex/luatex-test.tex
+++ b/Master/texmf-dist/tex/generic/context/luatex/luatex-test.tex
@@ -19,8 +19,6 @@
\pdfoutput=1
-% \directlua{generic_context.caches.compilemethod = "both" } % none luac dump both
-
\font\testa=file:lmroman10-regular at 12pt \testa \input tufte \par
\font\testb=file:lmroman12-regular:+liga; at 24pt \testb effe flink fietsen \par
\font\testc=file:lmroman12-regular:mode=node;+liga; at 24pt \testc effe flink fietsen \par
@@ -74,4 +72,12 @@
\noindent Циолковский
+a bit of math
+
+$\it e=mc^2 \bf e=mc^2 \Uchar"1D49D$
+
+$$\left( { {1} \over { {1} \over {x} } } \right) $$
+
+$$\sqrt {2} { { {1} \over { {1} \over {x} } } } $$
+
\end