summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/luatex
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/tex/luatex')
-rw-r--r--Master/texmf-dist/tex/luatex/luamplib/luamplib.lua1101
-rw-r--r--Master/texmf-dist/tex/luatex/luamplib/luamplib.sty53
-rw-r--r--Master/texmf-dist/tex/luatex/luatexja/addons/luatexja-fontspec-27c.sty16
-rw-r--r--Master/texmf-dist/tex/luatex/luatexja/addons/luatexja-fontspec-29c.sty16
-rw-r--r--Master/texmf-dist/tex/luatex/luatexja/addons/luatexja-fontspec-29e.sty16
-rw-r--r--Master/texmf-dist/tex/luatex/luatexja/lltjext.sty8
-rw-r--r--Master/texmf-dist/tex/luatex/luatexja/ltj-latex.sty103
-rw-r--r--Master/texmf-dist/tex/luatex/luatexja/ltj-pretreat.lua7
-rw-r--r--Master/texmf-dist/tex/luatex/luatexja/ltj-rmlgbm.lua4
-rw-r--r--Master/texmf-dist/tex/luatex/luatexja/luatexja.sty2
-rw-r--r--Master/texmf-dist/tex/luatex/luatexja/patches/lltjdefs.sty51
-rw-r--r--Master/texmf-dist/tex/luatex/luatexja/patches/lltjfont.sty319
-rw-r--r--Master/texmf-dist/tex/luatex/luatexja/patches/lltjp-array.sty11
-rw-r--r--Master/texmf-dist/tex/luatex/luatexja/patches/lltjp-geometry.sty24
-rw-r--r--Master/texmf-dist/tex/luatex/luatexja/patches/lltjp-siunitx.sty113
-rw-r--r--Master/texmf-dist/tex/luatex/luaxml/luaxml-cssquery.lua14
-rw-r--r--Master/texmf-dist/tex/luatex/luaxml/luaxml-domobject.lua95
-rw-r--r--Master/texmf-dist/tex/luatex/luaxml/luaxml-encodings.lua88
-rw-r--r--Master/texmf-dist/tex/luatex/luaxml/luaxml-mod-html.lua221
-rw-r--r--Master/texmf-dist/tex/luatex/luaxml/luaxml-namedentities.lua4167
-rw-r--r--Master/texmf-dist/tex/luatex/luaxml/luaxml-transform.lua13
-rw-r--r--Master/texmf-dist/tex/luatex/markdown/markdown-tinyyaml.lua4
-rw-r--r--Master/texmf-dist/tex/luatex/markdown/markdown.lua183
23 files changed, 3631 insertions, 2998 deletions
diff --git a/Master/texmf-dist/tex/luatex/luamplib/luamplib.lua b/Master/texmf-dist/tex/luatex/luamplib/luamplib.lua
index 72320fe65a6..d70d0796b87 100644
--- a/Master/texmf-dist/tex/luatex/luamplib/luamplib.lua
+++ b/Master/texmf-dist/tex/luatex/luamplib/luamplib.lua
@@ -11,8 +11,8 @@
luatexbase.provides_module {
name = "luamplib",
- version = "2.31.0",
- date = "2024/05/21",
+ version = "2.34.1",
+ date = "2024/07/19",
description = "Lua package to typeset Metapost with LuaTeX's MPLib.",
}
@@ -60,6 +60,7 @@ luamplib.showlog = luamplib.showlog or false
local tableconcat = table.concat
local tableinsert = table.insert
+local tableunpack = table.unpack
local texsprint = tex.sprint
local texgettoks = tex.gettoks
local texgetbox = tex.getbox
@@ -281,6 +282,7 @@ end
luamplib.codeinherit = false
local mplibinstances = {}
+luamplib.instances = mplibinstances
local has_instancename = false
local function reporterror (result, prevlog)
@@ -315,6 +317,7 @@ local function reporterror (result, prevlog)
end
end
+if not math.initialseed then math.randomseed(currenttime) end
local function luamplibload (name)
local mpx = mplib.new {
ini_version = true,
@@ -329,7 +332,7 @@ local function luamplibload (name)
local preamble = tableconcat{
format(preamble, replacesuffix(name,"mp")),
luamplib.preambles.mplibcode,
- luamplib.legacy_verbatimtex and luamplib.preambles.legacyverbatimtex or "",
+ luamplib.legacyverbatimtex and luamplib.preambles.legacyverbatimtex or "",
luamplib.textextlabel and luamplib.preambles.textextlabel or "",
}
local result, log
@@ -352,7 +355,7 @@ local function process (data, instancename)
currentformat,
luamplib.numbersystem or "scaled",
tostring(luamplib.textextlabel),
- tostring(luamplib.legacy_verbatimtex),
+ tostring(luamplib.legacyverbatimtex),
}
has_instancename = false
end
@@ -373,8 +376,6 @@ local function process (data, instancename)
if log then
if result.fig then
converted = luamplib.convert(result)
- else
- info"No figure output. Maybe no beginfig/endfig"
end
end
else
@@ -409,8 +410,7 @@ local function process_tex_text (str)
else
local boxid = texboxes.globalid + 1
texboxes.globalid = boxid
- run_tex_code(format(
- [[\expandafter\newbox\csname luamplib.box.%s\endcsname]], boxid))
+ run_tex_code(format([[\expandafter\newbox\csname luamplib.box.%s\endcsname]], boxid))
tex_box_id = tex.getcount'allocationnumber'
end
run_tex_code(format("%s\\setbox%i\\hbox{%s}", global, tex_box_id, str))
@@ -581,7 +581,7 @@ function luamplib.runscript (code)
return buffer
end
buffer = {}
- mpprint(buffer, table.unpack(res))
+ mpprint(buffer, tableunpack(res))
return tableconcat(buffer)
end
return ""
@@ -595,7 +595,7 @@ local function protecttexcontents (str)
:gsub("%s+", " ")
end
-luamplib.legacy_verbatimtex = true
+luamplib.legacyverbatimtex = true
function luamplib.maketext (str, what)
if str and str ~= "" then
@@ -605,7 +605,7 @@ function luamplib.maketext (str, what)
not str:find("\\begin%s*{document}") and
not str:find("\\documentstyle"..name_e) and
not str:find("\\usepackage"..name_e) then
- if luamplib.legacy_verbatimtex then
+ if luamplib.legacyverbatimtex then
if luamplib.in_the_fig then
return process_verbatimtex_infig(str)
else
@@ -661,51 +661,123 @@ luamplib.shadecolor = function (str)
run_tex_code({
[[\color_export:nnN{]], str, [[}{backend}\mplib_@tempa]],
},ccexplat)
- local name = get_macro'mplib_@tempa':match'{(.-)}{.+}'
+ local name, value = get_macro'mplib_@tempa':match'{(.-)}{(.-)}'
local t, obj = res:explode()
if pdfmode then
- obj = t[1]:match"^/(.+)"
- if ltx.pdf and ltx.pdf.object_id then
- obj = format("%s 0 R", ltx.pdf.object_id(obj))
- else
- run_tex_code({
- [[\edef\mplib_@tempa{\pdf_object_ref:n{]], obj, "}}",
- },ccexplat)
- obj = get_macro'mplib_@tempa'
- end
+ obj = format("%s 0 R", ltx.pdf.object_id( t[1]:sub(2,-1) ))
else
obj = t[2]
end
- local value = t[3]:match"%[(.-)%]" or t[3]
- return format('(%s) withprescript"mplib_spotcolor=%s:%s"', value,obj,name)
+ return format('(1) withprescript"mplib_spotcolor=%s:%s:%s"', value,obj,name)
end
return colorsplit(res)
end
+local running = -1073741824
local emboldenfonts = { }
-local function embolden (head, fakebold)
- local curr = head
+local function getemboldenwidth (curr, fakebold)
+ local width = emboldenfonts.width
+ if not width then
+ local f
+ local function getglyph(n)
+ while n do
+ if n.head then
+ getglyph(n.head)
+ elseif n.font and n.font > 0 then
+ f = n.font; break
+ end
+ n = node.getnext(n)
+ end
+ end
+ getglyph(curr)
+ width = font.getcopy(f or font.current()).size * fakebold / factor * 10
+ emboldenfonts.width = width
+ end
+ return width
+end
+local function getrulewhatsit (line, wd, ht, dp)
+ line, wd, ht, dp = line/1000, wd/factor, ht/factor, dp/factor
+ local pl
+ local fmt = "%f w %f %f %f %f re %s"
+ if pdfmode then
+ pl = node.new("whatsit","pdf_literal")
+ pl.mode = 0
+ else
+ fmt = "pdf:content "..fmt
+ pl = node.new("whatsit","special")
+ end
+ pl.data = fmt:format(line, 0, -dp, wd, ht+dp, "B")
+ local ss = node.new"glue"
+ node.setglue(ss, 0, 65536, 65536, 2, 2)
+ pl.next = ss
+ return pl
+end
+local function getrulemetric (box, curr, bp)
+ local wd,ht,dp = curr.width, curr.height, curr.depth
+ wd = wd == running and box.width or wd
+ ht = ht == running and box.height or ht
+ dp = dp == running and box.depth or dp
+ if bp then
+ return wd/factor, ht/factor, dp/factor
+ end
+ return wd, ht, dp
+end
+local function embolden (box, curr, fakebold)
+ local head = curr
while curr do
if curr.head then
- embolden(curr.head, fakebold)
- elseif curr.leader and curr.leader.head then
- embolden(curr.leader.head, fakebold)
+ curr.head = embolden(curr, curr.head, fakebold)
+ elseif curr.replace then
+ curr.replace = embolden(box, curr.replace, fakebold)
+ elseif curr.leader then
+ if curr.leader.head then
+ curr.leader.head = embolden(curr.leader, curr.leader.head, fakebold)
+ elseif curr.leader.id == node.id"rule" then
+ local glue = node.effective_glue(curr, box)
+ local line = getemboldenwidth(curr, fakebold)
+ local wd,ht,dp = getrulemetric(box, curr.leader)
+ if box.id == node.id"hlist" then
+ wd = glue
+ else
+ ht, dp = 0, glue
+ end
+ local pl = getrulewhatsit(line, wd, ht, dp)
+ local pack = box.id == node.id"hlist" and node.hpack or node.vpack
+ local list = pack(pl, glue, "exactly")
+ head = node.insert_after(head, curr, list)
+ head, curr = node.remove(head, curr)
+ end
+ elseif curr.id == node.id"rule" and curr.subtype == 0 then
+ local line = getemboldenwidth(curr, fakebold)
+ local wd,ht,dp = getrulemetric(box, curr)
+ if box.id == node.id"vlist" then
+ ht, dp = 0, ht+dp
+ end
+ local pl = getrulewhatsit(line, wd, ht, dp)
+ local list
+ if box.id == node.id"hlist" then
+ list = node.hpack(pl, wd, "exactly")
+ else
+ list = node.vpack(pl, ht+dp, "exactly")
+ end
+ head = node.insert_after(head, curr, list)
+ head, curr = node.remove(head, curr)
elseif curr.id == node.id"glyph" and curr.font > 0 then
local f = curr.font
local i = emboldenfonts[f]
if not i then
+ local ft = font.getfont(f) or font.getcopy(f)
if pdfmode then
- local ft = font.getcopy(f)
- ft.mode = 2
- ft.width = ft.size * fakebold / 6578.176
+ width = ft.size * fakebold / factor * 10
+ emboldenfonts.width = width
+ ft.mode, ft.width = 2, width
i = font.define(ft)
else
- local ft = font.getfont(f) or font.getcopy(f)
if ft.format ~= "opentype" and ft.format ~= "truetype" then
goto skip_type1
end
local name = ft.name:gsub('"',''):gsub(';$','')
- name = format('%s;embolden=%s',name,fakebold)
+ name = format('%s;embolden=%s;',name,fakebold)
_, i = fonts.constructors.readanddefine(name,ft.size)
end
emboldenfonts[f] = i
@@ -715,6 +787,7 @@ local function embolden (head, fakebold)
::skip_type1::
curr = node.getnext(curr)
end
+ return head
end
local function graphictextcolor (col, filldraw)
if col:find"^[%d%.:]+$" then
@@ -741,7 +814,9 @@ end
luamplib.graphictext = function (text, fakebold, fc, dc)
local fmt = process_tex_text(text):sub(1,-2)
local id = tonumber(fmt:match"mplibtexboxid=(%d+):")
- embolden(texgetbox(id).head, fakebold)
+ emboldenfonts.width = nil
+ local box = texgetbox(id)
+ box.head = embolden(box, box.head, fakebold)
local fill = graphictextcolor(fc,"fill")
local draw = graphictextcolor(dc,"draw")
local bc = pdfmode and "" or "pdf:bc "
@@ -836,7 +911,7 @@ function luamplib.glyph (f, c)
local fontdata = font.getfont(fid) or font.getcopy(fid)
filename, subfont, kind = fontdata.filename, fontdata.subfont, fontdata.format
instance = fontdata.specification and fontdata.specification.instance
- filename = filename:gsub("^harfloaded:","")
+ filename = filename and filename:gsub("^harfloaded:","")
else
local name
f = f:match"^%s*(.+)%s*$"
@@ -891,7 +966,7 @@ function luamplib.glyph (f, c)
if not gid then return mperr"cannot get GID (glyph id)" end
local fac = 1000 / (shapedata.units or 1000)
local t = shapedata.glyphs[gid].segments
- if not t then return "image(fill fullcircle scaled 0;)" end
+ if not t then return "image()" end
for i,v in ipairs(t) do
if type(v) == "table" then
for ii,vv in ipairs(v) do
@@ -905,20 +980,18 @@ function luamplib.glyph (f, c)
return glyphimage(t, kind)
end
-local rulefmt = "mplibpic[%i]:=image(addto currentpicture contour \z
+local rulefmt = "mpliboutlinepic[%i]:=image(addto currentpicture contour \z
unitsquare shifted - center unitsquare;) xscaled %f yscaled %f shifted (%f,%f);"
local outline_horz, outline_vert
function outline_vert (res, box, curr, xshift, yshift)
local b2u = box.dir == "LTL"
- local dy = (b2u and -(box.depth or 0) or (box.height or 0))/factor
+ local dy = (b2u and -box.depth or box.height)/factor
local ody = dy
while curr do
if curr.id == node.id"rule" then
- local ht, dp = curr.height/factor, curr.depth/factor
+ local wd, ht, dp = getrulemetric(box, curr, true)
local hd = ht + dp
if hd ~= 0 then
- local wd = curr.width
- wd = (wd == -1073741824 and box.width or wd)/factor
dy = dy + (b2u and dp or -ht)
if wd ~= 0 and curr.subtype == 0 then
res[#res+1] = rulefmt:format(#res+1, wd, hd, xshift+wd/2, yshift+dy+(ht-dp)/2)
@@ -927,14 +1000,13 @@ function outline_vert (res, box, curr, xshift, yshift)
end
elseif curr.id == node.id"glue" then
local vwidth = node.effective_glue(curr,box)/factor
- dy = dy + (b2u and vwidth or 0)
if curr.leader then
local curr, kind = curr.leader, curr.subtype
if curr.id == node.id"rule" then
- local wd = curr.width/factor
+ local wd = getrulemetric(box, curr, true)
if wd ~= 0 then
local hd = vwidth
- local dy = dy - hd
+ local dy = dy + (b2u and 0 or -hd)
if hd ~= 0 and curr.subtype == 0 then
res[#res+1] = rulefmt:format(#res+1, wd, hd, xshift+wd/2, yshift+dy+hd/2)
end
@@ -942,8 +1014,7 @@ function outline_vert (res, box, curr, xshift, yshift)
elseif curr.head then
local hd = (curr.height + curr.depth)/factor
if hd <= vwidth then
- local dy = b2u and dy-vwidth or dy
- local n, iy = 0, 0
+ local dy, n, iy = dy, 0, 0
if kind == 100 or kind == 103 then -- todo: gleaders
local ady = abs(ody - dy)
local ndy = math.ceil(ady / hd) * hd
@@ -971,7 +1042,7 @@ function outline_vert (res, box, curr, xshift, yshift)
end
end
end
- dy = dy - (b2u and 0 or vwidth)
+ dy = dy + (b2u and vwidth or -vwidth)
elseif curr.id == node.id"kern" then
dy = dy + curr.kern/factor * (b2u and 1 or -1)
elseif curr.id == node.id"vlist" then
@@ -987,24 +1058,23 @@ function outline_vert (res, box, curr, xshift, yshift)
end
return res
end
-function outline_horz (res, box, curr, xshift, yshift)
+function outline_horz (res, box, curr, xshift, yshift, discwd)
local r2l = box.dir == "TRT"
- local dx = r2l and (box.width or 0)/factor or 0
+ local dx = r2l and (discwd or box.width/factor) or 0
local dirs = { { dir = r2l, dx = dx } }
- local odx = dx
while curr do
if curr.id == node.id"dir" then
local sign, dir = curr.dir:match"(.)(...)"
local level, newdir = curr.level, r2l
if sign == "+" then
- local n = node.getnext(curr)
- while n do
- if n.id == node.id"dir" and n.level+1 == level then break end
- n = node.getnext(n)
- end
- n = n or node.tail(curr)
newdir = dir == "TRT"
if r2l ~= newdir then
+ local n = node.getnext(curr)
+ while n do
+ if n.id == node.id"dir" and n.level+1 == level then break end
+ n = node.getnext(n)
+ end
+ n = n or node.tail(curr)
dx = dx + node.rangedimensions(box, curr, n)/factor * (newdir and 1 or -1)
end
dirs[level] = { dir = r2l, dx = dx }
@@ -1029,6 +1099,18 @@ function outline_horz (res, box, curr, xshift, yshift)
dx = dx - (r2l and curr.width/factor*expand or 0)
local xpos = dx + xshift + (curr.xoffset or 0)/factor
local ypos = yshift + (curr.yoffset or 0)/factor
+ local vertical = ft.shared and ft.shared.features.vertical and "rotated 90" or ""
+ if vertical ~= "" then -- luatexko
+ for _,v in ipairs(ft.characters[curr.char].commands or { }) do
+ if v[1] == "down" then
+ ypos = ypos - v[2] / factor
+ elseif v[1] == "right" then
+ xpos = xpos + v[2] / factor
+ else
+ break
+ end
+ end
+ end
local image
if ft.format == "opentype" or ft.format == "truetype" then
image = luamplib.glyph(curr.font, gid)
@@ -1048,20 +1130,17 @@ function outline_horz (res, box, curr, xshift, yshift)
end
image = format("glyph %s of %q scaled %f", gid, name, scale)
end
- res[#res+1] = format("mplibpic[%i]:=%s xscaled %f yscaled %f slanted %f shifted (%f,%f);",
- #res+1, image, xscale, yscale, slant, xpos, ypos)
+ res[#res+1] = format("mpliboutlinepic[%i]:=%s xscaled %f yscaled %f slanted %f %s shifted (%f,%f);",
+ #res+1, image, xscale, yscale, slant, vertical, xpos, ypos)
dx = dx + (r2l and 0 or curr.width/factor*expand)
- elseif curr.id == node.id"disc" then
+ elseif curr.replace then
local width = node.dimensions(curr.replace)/factor
dx = dx - (r2l and width or 0)
- res = outline_horz(res, curr, curr.replace, xshift+dx, yshift)
+ res = outline_horz(res, box, curr.replace, xshift+dx, yshift, width)
dx = dx + (r2l and 0 or width)
elseif curr.id == node.id"rule" then
- local wd = curr.width/factor
+ local wd, ht, dp = getrulemetric(box, curr, true)
if wd ~= 0 then
- local ht, dp = curr.height, curr.depth
- ht = (ht == -1073741824 and box.height or ht)/factor
- dp = (dp == -1073741824 and box.depth or dp)/factor
local hd = ht + dp
dx = dx - (r2l and wd or 0)
if hd ~= 0 and curr.subtype == 0 then
@@ -1075,10 +1154,10 @@ function outline_horz (res, box, curr, xshift, yshift)
if curr.leader then
local curr, kind = curr.leader, curr.subtype
if curr.id == node.id"rule" then
- local ht, dp = curr.height/factor, curr.depth/factor
+ local wd, ht, dp = getrulemetric(box, curr, true)
local hd = ht + dp
if hd ~= 0 then
- local wd = width
+ wd = width
if wd ~= 0 and curr.subtype == 0 then
res[#res+1] = rulefmt:format(#res+1, wd, hd, xshift+dx+wd/2, yshift+(ht-dp)/2)
end
@@ -1089,7 +1168,7 @@ function outline_horz (res, box, curr, xshift, yshift)
local dx = r2l and dx+width or dx
local n, ix = 0, 0
if kind == 100 or kind == 103 then -- todo: gleaders
- local adx = abs(dx-odx)
+ local adx = abs(dx-dirs[1].dx)
local ndx = math.ceil(adx / wd) * wd
local diff = ndx - adx
n = (width-diff) // wd
@@ -1137,12 +1216,8 @@ function luamplib.outlinetext (text)
local id = tonumber(fmt:match"mplibtexboxid=(%d+):")
local box = texgetbox(id)
local res = outline_horz({ }, box, box.head, 0, 0)
- if #res == 0 then res = { "mplibpic[1]:=image(fill fullcircle scaled 0;);" } end
- local t = { }
- for i=1, #res do
- t[#t+1] = format("addto currentpicture also mplibpic[%i];", i)
- end
- return tableconcat(res) .. format("mplibpic[0]:=image(%s);", tableconcat(t))
+ if #res == 0 then res = { "mpliboutlinepic[1]:=image();" } end
+ return tableconcat(res) .. format("mpliboutlinenum:=%i;", #res)
end
luamplib.preambles = {
@@ -1246,6 +1321,9 @@ def mplib_do_outline_text_set_f (text f) text r =
def mplib_do_outline_options_f = f enddef;
def mplib_do_outline_options_r = r enddef;
enddef;
+def mplib_do_outline_text_set_u (text f) text r =
+ def mplib_do_outline_options_f = f enddef;
+enddef;
def mplib_do_outline_text_set_d (text d) text r =
def mplib_do_outline_options_d = d enddef;
def mplib_do_outline_options_r = r enddef;
@@ -1259,27 +1337,40 @@ def mplib_do_outline_text_set_n text r =
def mplib_do_outline_options_r = r enddef;
enddef;
def mplib_do_outline_text_set_p = enddef;
-def mplib_fill_outline_text (expr p) =
- i:=0;
- for item within p:
- i:=i+1;
- addto currentpicture contour pathpart item
- if i < length p: withpostscript "collect"; fi
+def mplib_fill_outline_text =
+ for n=1 upto mpliboutlinenum:
+ i:=0;
+ for item within mpliboutlinepic[n]:
+ i:=i+1;
+ fill pathpart item mplib_do_outline_options_f withpen pencircle scaled 0
+ if (n<mpliboutlinenum) or (i<length mpliboutlinepic[n]): withpostscript "collect"; fi
+ endfor
endfor
- mplib_do_outline_options_f;
enddef;
-def mplib_draw_outline_text (expr p) =
- i:=0;
- for item within p:
- i:=i+1;
- addto currentpicture doublepath pathpart item
- if i < length p: withpostscript "collect"; fi
+def mplib_draw_outline_text =
+ for n=1 upto mpliboutlinenum:
+ for item within mpliboutlinepic[n]:
+ draw pathpart item mplib_do_outline_options_d;
+ endfor
+ endfor
+enddef;
+def mplib_filldraw_outline_text =
+ for n=1 upto mpliboutlinenum:
+ i:=0;
+ for item within mpliboutlinepic[n]:
+ i:=i+1;
+ if (n<mpliboutlinenum) or (i<length mpliboutlinepic[n]):
+ fill pathpart item mplib_do_outline_options_f withpostscript "collect";
+ else:
+ draw pathpart item mplib_do_outline_options_f withpostscript "both";
+ fi
+ endfor
endfor
- mplib_do_outline_options_d;
enddef;
vardef mpliboutlinetext@# (expr t) text rest =
save kind; string kind; kind := str @#;
- save mplibpic, i; picture mplibpic[]; numeric i;
+ save i; numeric i;
+ picture mpliboutlinepic[]; numeric mpliboutlinenum;
def mplib_do_outline_options_d = enddef;
def mplib_do_outline_options_f = enddef;
def mplib_do_outline_options_r = enddef;
@@ -1287,31 +1378,102 @@ vardef mpliboutlinetext@# (expr t) text rest =
image ( addto currentpicture also image (
if kind = "f":
mplib_do_outline_text_set_f rest;
- def mplib_do_outline_options_d = withpen pencircle scaled 0 enddef;
- mplib_fill_outline_text (mplibpic0);
+ mplib_fill_outline_text;
elseif kind = "d":
mplib_do_outline_text_set_d rest;
- mplib_draw_outline_text (mplibpic0);
+ mplib_draw_outline_text;
elseif kind = "b":
mplib_do_outline_text_set_b rest;
- mplib_fill_outline_text (mplibpic0);
- mplib_draw_outline_text (mplibpic0);
+ mplib_fill_outline_text;
+ mplib_draw_outline_text;
elseif kind = "u":
- mplib_do_outline_text_set_f rest;
- mplib_fill_outline_text (mplibpic0);
+ mplib_do_outline_text_set_u rest;
+ mplib_filldraw_outline_text;
elseif kind = "r":
mplib_do_outline_text_set_r rest;
- mplib_draw_outline_text (mplibpic0);
- mplib_fill_outline_text (mplibpic0);
+ mplib_draw_outline_text;
+ mplib_fill_outline_text;
elseif kind = "p":
mplib_do_outline_text_set_p;
- mplib_draw_outline_text (mplibpic0);
+ mplib_draw_outline_text;
else:
mplib_do_outline_text_set_n rest;
- mplib_fill_outline_text (mplibpic0);
+ mplib_fill_outline_text;
fi;
) mplib_do_outline_options_r; )
enddef ;
+primarydef t withpattern p =
+ image( fill t withprescript "mplibpattern=" & if numeric p: decimal fi p; )
+enddef;
+vardef mplibtransformmatrix (text e) =
+ save t; transform t;
+ t = identity e;
+ runscript("luamplib.transformmatrix = {"
+ & decimal xxpart t & ","
+ & decimal yxpart t & ","
+ & decimal xypart t & ","
+ & decimal yypart t & ","
+ & decimal xpart t & ","
+ & decimal ypart t & ","
+ & "}");
+enddef;
+primarydef p withfademethod s =
+ if picture p:
+ image(
+ draw p;
+ draw center p withprescript "mplibfadestate=stop";
+ )
+ else:
+ p withprescript "mplibfadestate=stop"
+ fi
+ withprescript "mplibfadetype=" & s
+ withprescript "mplibfadebbox=" &
+ decimal xpart llcorner p & ":" &
+ decimal ypart llcorner p & ":" &
+ decimal xpart urcorner p & ":" &
+ decimal ypart urcorner p
+enddef;
+def withfadeopacity (expr a,b) =
+ withprescript "mplibfadeopacity=" &
+ decimal a & ":" &
+ decimal b
+enddef;
+def withfadevector (expr a,b) =
+ withprescript "mplibfadevector=" &
+ decimal xpart a & ":" &
+ decimal ypart a & ":" &
+ decimal xpart b & ":" &
+ decimal ypart b
+enddef;
+let withfadecenter = withfadevector;
+def withfaderadius (expr a,b) =
+ withprescript "mplibfaderadius=" &
+ decimal a & ":" &
+ decimal b
+enddef;
+def withfadebbox (expr a,b) =
+ withprescript "mplibfadebbox=" &
+ decimal xpart a & ":" &
+ decimal ypart a & ":" &
+ decimal xpart b & ":" &
+ decimal ypart b
+enddef;
+primarydef p asgroup s =
+ image(
+ fill llcorner p--lrcorner p--urcorner p--ulcorner p--cycle
+ withprescript "gr_state=start"
+ withprescript "gr_type=" & s;
+ draw p;
+ draw center p withprescript "gr_state=stop";
+ )
+enddef;
+def withgroupname expr s =
+ withprescript "mplibgroupname=" & s
+enddef;
+def usemplibgroup primary s =
+ draw maketext("\usemplibgroup{" & s & "}")
+ shifted runscript("return luamplib.trgroupshifts['" & s & "']")
+enddef;
]],
legacyverbatimtex = [[
def specialVerbatimTeX (text t) = runscript("luamplibprefig{"&t&"}") enddef;
@@ -1365,7 +1527,7 @@ luamplib.everyendmplib = setmetatable({ [""] = "" },{ __index = function(t) retu
function luamplib.process_mplibcode (data, instancename)
texboxes.localid = 4096
- if luamplib.legacy_verbatimtex then
+ if luamplib.legacyverbatimtex then
luamplib.figid, tex_code_pre_mplib = 1, {}
end
@@ -1426,15 +1588,6 @@ local function script2table(s)
return t
end
-local function getobjects(result,figure,f)
- return figure:objects()
-end
-
-function luamplib.convert (result, flusher)
- luamplib.flush(result, flusher)
- return true -- done
-end
-
local figcontents = { post = { } }
local function put2output(a,...)
figcontents[#figcontents+1] = type(a) == "string" and format(a,...) or a
@@ -1452,96 +1605,6 @@ local function pdf_literalcode (fmt,...)
put2output{-2, format(fmt,...)}
end
-local function pdf_textfigure(font,size,text,width,height,depth)
- text = text:gsub(".",function(c)
- return format("\\hbox{\\char%i}",string.byte(c)) -- kerning happens in metapost : false
- end)
- put2output("\\mplibtextext{%s}{%f}{%s}{%s}{%s}",font,size,text,0,0)
-end
-
-local bend_tolerance = 131/65536
-
-local rx, sx, sy, ry, tx, ty, divider = 1, 0, 0, 1, 0, 0, 1
-
-local function pen_characteristics(object)
- local t = mplib.pen_info(object)
- rx, ry, sx, sy, tx, ty = t.rx, t.ry, t.sx, t.sy, t.tx, t.ty
- divider = sx*sy - rx*ry
- return not (sx==1 and rx==0 and ry==0 and sy==1 and tx==0 and ty==0), t.width
-end
-
-local function concat(px, py) -- no tx, ty here
- return (sy*px-ry*py)/divider,(sx*py-rx*px)/divider
-end
-
-local function curved(ith,pth)
- local d = pth.left_x - ith.right_x
- if abs(ith.right_x - ith.x_coord - d) <= bend_tolerance and abs(pth.x_coord - pth.left_x - d) <= bend_tolerance then
- d = pth.left_y - ith.right_y
- if abs(ith.right_y - ith.y_coord - d) <= bend_tolerance and abs(pth.y_coord - pth.left_y - d) <= bend_tolerance then
- return false
- end
- end
- return true
-end
-
-local function flushnormalpath(path,open)
- local pth, ith
- for i=1,#path do
- pth = path[i]
- if not ith then
- pdf_literalcode("%f %f m",pth.x_coord,pth.y_coord)
- elseif curved(ith,pth) then
- pdf_literalcode("%f %f %f %f %f %f c",ith.right_x,ith.right_y,pth.left_x,pth.left_y,pth.x_coord,pth.y_coord)
- else
- pdf_literalcode("%f %f l",pth.x_coord,pth.y_coord)
- end
- ith = pth
- end
- if not open then
- local one = path[1]
- if curved(pth,one) then
- pdf_literalcode("%f %f %f %f %f %f c",pth.right_x,pth.right_y,one.left_x,one.left_y,one.x_coord,one.y_coord )
- else
- pdf_literalcode("%f %f l",one.x_coord,one.y_coord)
- end
- elseif #path == 1 then -- special case .. draw point
- local one = path[1]
- pdf_literalcode("%f %f l",one.x_coord,one.y_coord)
- end
-end
-
-local function flushconcatpath(path,open)
- pdf_literalcode("%f %f %f %f %f %f cm", sx, rx, ry, sy, tx ,ty)
- local pth, ith
- for i=1,#path do
- pth = path[i]
- if not ith then
- pdf_literalcode("%f %f m",concat(pth.x_coord,pth.y_coord))
- elseif curved(ith,pth) then
- local a, b = concat(ith.right_x,ith.right_y)
- local c, d = concat(pth.left_x,pth.left_y)
- pdf_literalcode("%f %f %f %f %f %f c",a,b,c,d,concat(pth.x_coord, pth.y_coord))
- else
- pdf_literalcode("%f %f l",concat(pth.x_coord, pth.y_coord))
- end
- ith = pth
- end
- if not open then
- local one = path[1]
- if curved(pth,one) then
- local a, b = concat(pth.right_x,pth.right_y)
- local c, d = concat(one.left_x,one.left_y)
- pdf_literalcode("%f %f %f %f %f %f c",a,b,c,d,concat(one.x_coord, one.y_coord))
- else
- pdf_literalcode("%f %f l",concat(one.x_coord,one.y_coord))
- end
- elseif #path == 1 then -- special case .. draw point
- local one = path[1]
- pdf_literalcode("%f %f l",concat(one.x_coord,one.y_coord))
- end
-end
-
local function start_pdf_code()
if pdfmode then
pdf_literalcode("q")
@@ -1584,6 +1647,7 @@ end
local prev_override_color
local function do_preobj_CR(object,prescript)
+ if object.postscript == "collect" then return end
local override = prescript and prescript.mpliboverridecolor
if override then
if pdfmode then
@@ -1611,32 +1675,46 @@ end
local pdfmanagement = is_defined'pdfmanagement_add:nnn'
local pdfobjs, pdfetcs = {}, {}
pdfetcs.pgfextgs = "pgf@sys@addpdfresource@extgs@plain"
+pdfetcs.pgfpattern = "pgf@sys@addpdfresource@patterns@plain"
+pdfetcs.pgfcolorspace = "pgf@sys@addpdfresource@colorspaces@plain"
-local function update_pdfobjs (os)
- local on = pdfobjs[os]
+local function update_pdfobjs (os, stream)
+ local key = os
+ if stream then key = key..stream end
+ local on = pdfobjs[key]
if on then
return on,false
end
if pdfmode then
- on = pdf.immediateobj(os)
+ if stream then
+ on = pdf.immediateobj("stream",stream,os)
+ else
+ on = pdf.immediateobj(os)
+ end
else
on = pdfetcs.cnt or 1
- texsprint(format("\\special{pdf:obj @mplibpdfobj%s %s}",on,os))
+ if stream then
+ texsprint(format("\\special{pdf:stream @mplibpdfobj%s (%s) <<%s>>}",on,stream,os))
+ else
+ texsprint(format("\\special{pdf:obj @mplibpdfobj%s %s}",on,os))
+ end
pdfetcs.cnt = on + 1
end
- pdfobjs[os] = on
+ pdfobjs[key] = on
return on,true
end
+pdfetcs.resfmt = pdfmode and "%s 0 R" or "@mplibpdfobj%s"
if pdfmode then
pdfetcs.getpageres = pdf.getpageresources or function() return pdf.pageresources end
- pdfetcs.setpageres = pdf.setpageresources or function(s) pdf.pageresources = s end
- pdfetcs.initialize_resources = function (name)
+ local getpageres = pdfetcs.getpageres
+ local setpageres = pdf.setpageresources or function(s) pdf.pageresources = s end
+ local initialize_resources = function (name)
local tabname = format("%s_res",name)
pdfetcs[tabname] = { }
if luatexbase.callbacktypes.finish_pdffile then -- ltluatex
local obj = pdf.reserveobj()
- pdfetcs.setpageres(format("%s/%s %i 0 R", pdfetcs.getpageres() or "", name, obj))
+ setpageres(format("%s/%s %i 0 R", getpageres() or "", name, obj))
luatexbase.add_to_callback("finish_pdffile", function()
pdf.immediateobj(obj, format("<<%s>>", tableconcat(pdfetcs[tabname])))
end,
@@ -1644,20 +1722,30 @@ if pdfmode then
end
end
pdfetcs.fallback_update_resources = function (name, res)
+ local tabname = format("%s_res",name)
+ if not pdfetcs[tabname] then
+ initialize_resources(name)
+ end
if luatexbase.callbacktypes.finish_pdffile then
- local t = pdfetcs[format("%s_res",name)]
+ local t = pdfetcs[tabname]
t[#t+1] = res
else
- local tpr, n = pdfetcs.getpageres() or "", 0
+ local tpr, n = getpageres() or "", 0
tpr, n = tpr:gsub(format("/%s<<",name), "%1"..res)
if n == 0 then
tpr = format("%s/%s<<%s>>", tpr, name, res)
end
- pdfetcs.setpageres(tpr)
+ setpageres(tpr)
end
end
else
- texsprint("\\special{pdf:obj @MPlibTr<<>>}","\\special{pdf:obj @MPlibSh<<>>}")
+ texsprint {
+ "\\special{pdf:obj @MPlibTr<<>>}",
+ "\\special{pdf:obj @MPlibSh<<>>}",
+ "\\special{pdf:obj @MPlibCS<<>>}",
+ "\\special{pdf:obj @MPlibPt<<>>}",
+ }
+ pdfetcs.resadded = { }
end
local transparancy_modes = { [0] = "Normal",
@@ -1667,65 +1755,65 @@ local transparancy_modes = { [0] = "Normal",
"Hue", "Saturation", "Color", "Luminosity",
"Compatible",
}
-
-local function update_tr_res(mode,opaq)
- if pdfetcs.pgfloaded == nil then
- pdfetcs.pgfloaded = is_defined(pdfetcs.pgfextgs)
- if pdfmode and not pdfmanagement and not pdfetcs.pgfloaded and not is_defined"TRP@list" then
- pdfetcs.initialize_resources"ExtGState"
- end
- end
- local os = format("<</BM /%s/ca %.3f/CA %.3f/AIS false>>",mode,opaq,opaq)
- local on, new = update_pdfobjs(os)
- if not new then return on end
+local function add_extgs_resources (on, new)
local key = format("MPlibTr%s", on)
- local val = format(pdfmode and "%s 0 R" or "@mplibpdfobj%s", on)
- if pdfmanagement then
- texsprint(ccexplat,
- format("\\pdfmanagement_add:nnn{Page/Resources/ExtGState}{%s}{%s}", key, val))
- else
- local tr = format("/%s %s", key, val)
- if pdfetcs.pgfloaded then
- texsprint(format("\\csname %s\\endcsname{%s}", pdfetcs.pgfextgs,tr))
- elseif pdfmode then
- if is_defined"TRP@list" then
- texsprint(catat11,{
- [[\if@filesw\immediate\write\@auxout{]],
- [[\string\g@addto@macro\string\TRP@list{]],
- tr,
- [[}}\fi]],
- })
- if not get_macro"TRP@list":find(tr) then
- texsprint(catat11,[[\global\TRP@reruntrue]])
+ if new then
+ local val = format(pdfetcs.resfmt, on)
+ if pdfmanagement then
+ texsprint {
+ "\\csname pdfmanagement_add:nnn\\endcsname{Page/Resources/ExtGState}{", key, "}{", val, "}"
+ }
+ else
+ local tr = format("/%s %s", key, val)
+ if is_defined(pdfetcs.pgfextgs) then
+ texsprint { "\\csname ", pdfetcs.pgfextgs, "\\endcsname{", tr, "}" }
+ elseif pdfmode then
+ if is_defined"TRP@list" then
+ texsprint(catat11,{
+ [[\if@filesw\immediate\write\@auxout{]],
+ [[\string\g@addto@macro\string\TRP@list{]],
+ tr,
+ [[}}\fi]],
+ })
+ if not get_macro"TRP@list":find(tr) then
+ texsprint(catat11,[[\global\TRP@reruntrue]])
+ end
+ else
+ pdfetcs.fallback_update_resources("ExtGState", tr)
end
else
- pdfetcs.fallback_update_resources("ExtGState", tr)
+ texsprint { "\\special{pdf:put @MPlibTr<<", tr, ">>}" }
end
- else
- texsprint(format("\\special{pdf:put @MPlibTr<<%s>>}",tr))
- texsprint"\\special{pdf:put @resources<</ExtGState @MPlibTr>>}"
end
end
- return on
+ if not pdfmode and not pdfmanagement and not is_defined(pdfetcs.pgfextgs) then
+ texsprint"\\special{pdf:put @resources <</ExtGState @MPlibTr>>}"
+ pdfetcs.resadded.ExtGState = "@MPlibTr"
+ end
+ return key
end
-
-local function do_preobj_TR(prescript)
+local function do_preobj_TR(object,prescript)
+ if object.postscript == "collect" then return end
local opaq = prescript and prescript.tr_transparency
- local tron_no
if opaq then
+ local key, on, os, new
local mode = prescript.tr_alternative or 1
- mode = transparancy_modes[tonumber(mode)]
- tron_no = update_tr_res(mode, opaq)
- start_pdf_code()
- pdf_literalcode("/MPlibTr%i gs",tron_no)
+ mode = transparancy_modes[tonumber(mode)] or mode
+ for i,v in ipairs{ {mode,opaq},{"Normal",1} } do
+ mode, opaq = v[1], v[2]
+ os = format("<</BM /%s/ca %.3f/CA %.3f/AIS false>>",mode,opaq,opaq)
+ on, new = update_pdfobjs(os)
+ key = add_extgs_resources(on,new)
+ if i == 1 then
+ pdf_literalcode("/%s gs",key)
+ else
+ return format("/%s gs",key)
+ end
+ end
end
- return tron_no
end
local function sh_pdfpageresources(shtype,domain,colorspace,ca,cb,coordinates,steps,fractions)
- if pdfmode and not pdfmanagement and not pdfetcs.Shading_res then
- pdfetcs.initialize_resources"Shading"
- end
local fun2fmt,os = "<</FunctionType 2/Domain [%s]/C0 [%s]/C1 [%s]/N 1>>"
if steps > 1 then
local list,bounds,encode = { },{ },{ }
@@ -1736,7 +1824,7 @@ local function sh_pdfpageresources(shtype,domain,colorspace,ca,cb,coordinates,st
encode[2*i-1] = 0
encode[2*i] = 1
os = fun2fmt:format(domain,tableconcat(ca[i],' '),tableconcat(cb[i],' '))
- list[i] = format(pdfmode and "%s 0 R" or "@mplibpdfobj%s",update_pdfobjs(os))
+ list[i] = format(pdfetcs.resfmt, update_pdfobjs(os))
end
os = tableconcat {
"<</FunctionType 3",
@@ -1748,7 +1836,7 @@ local function sh_pdfpageresources(shtype,domain,colorspace,ca,cb,coordinates,st
else
os = fun2fmt:format(domain,tableconcat(ca[1],' '),tableconcat(cb[1],' '))
end
- local objref = format(pdfmode and "%s 0 R" or "@mplibpdfobj%s",update_pdfobjs(os))
+ local objref = format(pdfetcs.resfmt, update_pdfobjs(os))
os = tableconcat {
format("<</ShadingType %i", shtype),
format("/ColorSpace %s", colorspace),
@@ -1757,21 +1845,25 @@ local function sh_pdfpageresources(shtype,domain,colorspace,ca,cb,coordinates,st
"/Extend [true true]/AntiAlias true>>",
}
local on, new = update_pdfobjs(os)
- if not new then return on end
- local key = format("MPlibSh%s", on)
- local val = format(pdfmode and "%s 0 R" or "@mplibpdfobj%s", on)
- if pdfmanagement then
- texsprint(ccexplat,
- format("\\pdfmanagement_add:nnn{Page/Resources/Shading}{%s}{%s}", key, val))
- else
- local res = format("/%s %s", key, val)
- if pdfmode then
- pdfetcs.fallback_update_resources("Shading", res)
+ if new then
+ local key, val = format("MPlibSh%s", on), format(pdfetcs.resfmt, on)
+ if pdfmanagement then
+ texsprint {
+ "\\csname pdfmanagement_add:nnn\\endcsname{Page/Resources/Shading}{", key, "}{", val, "}"
+ }
else
- texsprint(format("\\special{pdf:put @MPlibSh<<%s>>}", res))
- texsprint"\\special{pdf:put @resources<</Shading @MPlibSh>>}"
+ local res = format("/%s %s", key, val)
+ if pdfmode then
+ pdfetcs.fallback_update_resources("Shading", res)
+ else
+ texsprint { "\\special{pdf:put @MPlibSh<<", res, ">>}" }
+ end
end
end
+ if not pdfmode and not pdfmanagement then
+ texsprint"\\special{pdf:put @resources <</Shading @MPlibSh>>}"
+ pdfetcs.resadded.Shading = "@MPlibSh"
+ end
return on
end
@@ -1802,7 +1894,9 @@ end })
local function do_preobj_SH(object,prescript)
local shade_no
local sh_type = prescript and prescript.sh_type
- if sh_type then
+ if not sh_type then
+ return
+ else
local domain = prescript.sh_domain or "0 1"
local centera = prescript.sh_center_a or "0 0"; centera = centera:explode()
local centerb = prescript.sh_center_b or "0 0"; centerb = centerb:explode()
@@ -1850,15 +1944,14 @@ local function do_preobj_SH(object,prescript)
local script = object.prescript:explode"\13+"
for i=#script,1,-1 do
if script[i]:find"mplib_spotcolor" then
- local name, value
- objref, name = script[i]:match"=(.-):(.+)"
- value = script[i+1]:match"=(.+)"
+ local t, name, value = script[i]:explode"="[2]:explode":"
+ value, objref, name = t[1], t[2], t[3]
if not names[name] then
pos = pos+1
names[name] = pos
names[#names+1] = name
end
- local t = { }
+ t = { }
for j=1,names[name] do t[#t+1] = 0 end
t[#t+1] = value
tableinsert(#ca == #cb and ca or cb, t)
@@ -1914,6 +2007,437 @@ local function do_preobj_SH(object,prescript)
return shade_no
end
+pdfetcs.patterns = { }
+local patterns = pdfetcs.patterns
+local function gather_resources (optres)
+ local t, do_pattern = { }, not optres
+ local names = {"ExtGState","ColorSpace","Shading"}
+ if do_pattern then
+ names[#names+1] = "Pattern"
+ end
+ if pdfmode then
+ if pdfmanagement then
+ for _,v in ipairs(names) do
+ local pp = get_macro(format("g__pdfdict_/g__pdf_Core/Page/Resources/%s_prop",v))
+ if pp and pp:find"__prop_pair" then
+ t[#t+1] = format("/%s %s 0 R", v, ltx.pdf.object_id("__pdf/Page/Resources/"..v))
+ end
+ end
+ else
+ local res = pdfetcs.getpageres() or ""
+ run_tex_code[[\mplibtmptoks\expandafter{\the\pdfvariable pageresources}]]
+ res = res .. texgettoks'mplibtmptoks'
+ if do_pattern then return res end
+ res = res:explode"/+"
+ for _,v in ipairs(res) do
+ v = v:match"^%s*(.-)%s*$"
+ if not v:find"Pattern" and not optres:find(v) then
+ t[#t+1] = "/" .. v
+ end
+ end
+ end
+ else
+ if pdfmanagement then
+ for _,v in ipairs(names) do
+ local pp = get_macro(format("g__pdfdict_/g__pdf_Core/Page/Resources/%s_prop",v))
+ if pp and pp:find"__prop_pair" then
+ run_tex_code {
+ "\\mplibtmptoks\\expanded{{",
+ format("/%s \\csname pdf_object_ref:n\\endcsname{__pdf/Page/Resources/%s}",v,v),
+ "}}",
+ }
+ t[#t+1] = texgettoks'mplibtmptoks'
+ end
+ end
+ elseif is_defined(pdfetcs.pgfextgs) then
+ run_tex_code ({
+ "\\mplibtmptoks\\expanded{{",
+ "\\ifpgf@sys@pdf@extgs@exists /ExtGState @pgfextgs\\fi",
+ "\\ifpgf@sys@pdf@colorspaces@exists /ColorSpace @pgfcolorspaces\\fi",
+ do_pattern and "\\ifpgf@sys@pdf@patterns@exists /Pattern @pgfpatterns \\fi" or "",
+ "}}",
+ }, catat11)
+ t[#t+1] = texgettoks'mplibtmptoks'
+ elseif do_pattern then
+ for _,v in ipairs(names) do
+ local vv = pdfetcs.resadded[v]
+ if vv then
+ t[#t+1] = format("/%s %s", v, vv)
+ end
+ end
+ end
+ end
+ return tableconcat(t)
+end
+function luamplib.registerpattern ( boxid, name, opts )
+ local box = texgetbox(boxid)
+ local wd = format("%.3f",box.width/factor)
+ local hd = format("%.3f",(box.height+box.depth)/factor)
+ info("w/h/d of '%s': %s %s 0.0", name, wd, hd)
+ if opts.xstep == 0 then opts.xstep = nil end
+ if opts.ystep == 0 then opts.ystep = nil end
+ if opts.colored == nil then
+ opts.colored = opts.coloured
+ if opts.colored == nil then
+ opts.colored = true
+ end
+ end
+ if type(opts.matrix) == "table" then opts.matrix = tableconcat(opts.matrix," ") end
+ if type(opts.bbox) == "table" then opts.bbox = tableconcat(opts.bbox," ") end
+ if opts.matrix and opts.matrix:find"%a" then
+ local data = format("mplibtransformmatrix(%s);",opts.matrix)
+ process(data,"@mplibtransformmatrix")
+ local t = luamplib.transformmatrix
+ opts.matrix = format("%s %s %s %s", t[1], t[2], t[3], t[4])
+ opts.xshift = opts.xshift or t[5]
+ opts.yshift = opts.yshift or t[6]
+ end
+ local attr = {
+ "/Type/Pattern",
+ "/PatternType 1",
+ format("/PaintType %i", opts.colored and 1 or 2),
+ "/TilingType 2",
+ format("/XStep %s", opts.xstep or wd),
+ format("/YStep %s", opts.ystep or hd),
+ format("/Matrix [%s %s %s]", opts.matrix or "1 0 0 1", opts.xshift or 0, opts.yshift or 0),
+ }
+ local optres = opts.resources or ""
+ optres = optres .. gather_resources(optres)
+ if pdfmode then
+ if opts.bbox then
+ attr[#attr+1] = format("/BBox [%s]", opts.bbox)
+ end
+ local index = tex.saveboxresource(boxid, tableconcat(attr), optres, true, opts.bbox and 4 or 1)
+ patterns[name] = { id = index, colored = opts.colored }
+ else
+ local objname = "@mplibpattern"..name
+ local metric = format("bbox %s", opts.bbox or format("0 0 %s %s",wd,hd))
+ texsprint {
+ "\\ifvmode\\nointerlineskip\\fi\\vbox to0pt{\\vss\\hbox to0pt{",
+ "\\special{pdf:bcontent}",
+ "\\special{pdf:bxobj ", objname, " ", metric, "}",
+ "\\raise\\dp ", boxid, "\\box ", boxid,
+ "\\special{pdf:put @resources <<", optres, ">>}",
+ "\\special{pdf:exobj <<", tableconcat(attr), ">>}",
+ "\\special{pdf:econtent}",
+ "\\hss}}",
+ }
+ patterns[#patterns+1] = objname
+ patterns[name] = { id = #patterns, colored = opts.colored }
+ end
+end
+local function pattern_colorspace (cs)
+ local on, new = update_pdfobjs(format("[/Pattern %s]", cs))
+ if new then
+ local key, val = format("MPlibCS%i",on), format(pdfetcs.resfmt,on)
+ if pdfmanagement then
+ texsprint {
+ "\\csname pdfmanagement_add:nnn\\endcsname{Page/Resources/ColorSpace}{", key, "}{", val, "}"
+ }
+ else
+ local res = format("/%s %s", key, val)
+ if is_defined(pdfetcs.pgfcolorspace) then
+ texsprint { "\\csname ", pdfetcs.pgfcolorspace, "\\endcsname{", res, "}" }
+ elseif pdfmode then
+ pdfetcs.fallback_update_resources("ColorSpace", res)
+ else
+ texsprint { "\\special{pdf:put @MPlibCS<<", res, ">>}" }
+ end
+ end
+ end
+ if not pdfmode and not pdfmanagement and not is_defined(pdfetcs.pgfcolorspace) then
+ texsprint"\\special{pdf:put @resources <</ColorSpace @MPlibCS>>}"
+ pdfetcs.resadded.ColorSpace = "@MPlibCS"
+ end
+ return on
+end
+local function do_preobj_PAT(object, prescript)
+ local name = prescript and prescript.mplibpattern
+ if not name then return end
+ local patt = patterns[name]
+ local index = patt and patt.id or err("cannot get pattern object '%s'", name)
+ local key = format("MPlibPt%s",index)
+ if patt.colored then
+ pdf_literalcode("/Pattern cs /%s scn", key)
+ else
+ local color = prescript.mpliboverridecolor
+ if not color then
+ local t = object.color
+ color = t and #t>0 and luamplib.colorconverter(t)
+ end
+ if not color then return end
+ local cs
+ if color:find" cs " or color:find"@pdf.obj" then
+ local t = color:explode()
+ if pdfmode then
+ cs = format("%s 0 R", ltx.pdf.object_id( t[1]:sub(2,-1) ))
+ color = t[3]
+ else
+ cs = t[2]
+ color = t[3]:match"%[(.+)%]"
+ end
+ else
+ local t = colorsplit(color)
+ cs = #t == 4 and "/DeviceCMYK" or #t == 3 and "/DeviceRGB" or "/DeviceGray"
+ color = tableconcat(t," ")
+ end
+ pdf_literalcode("/MPlibCS%i cs %s /%s scn", pattern_colorspace(cs), color, key)
+ end
+ if not patt.done then
+ local val = pdfmode and format("%s 0 R",index) or patterns[index]
+ if pdfmanagement then
+ texsprint {
+ "\\csname pdfmanagement_add:nnn\\endcsname{Page/Resources/Pattern}{", key, "}{", val, "}"
+ }
+ else
+ local res = format("/%s %s", key, val)
+ if is_defined(pdfetcs.pgfpattern) then
+ texsprint { "\\csname ", pdfetcs.pgfpattern, "\\endcsname{", res, "}" }
+ elseif pdfmode then
+ pdfetcs.fallback_update_resources("Pattern", res)
+ else
+ texsprint { "\\special{pdf:put @MPlibPt<<", res, ">>}" }
+ end
+ end
+ end
+ if not pdfmode and not pdfmanagement and not is_defined(pdfetcs.pgfpattern) then
+ texsprint"\\special{pdf:put @resources <</Pattern @MPlibPt>>}"
+ pdfetcs.resadded.Pattern = "@MPlibPt"
+ end
+ patt.done = true
+end
+
+pdfetcs.fading = { }
+local function do_preobj_FADE (object, prescript)
+ local fd_type = prescript and prescript.mplibfadetype
+ local fd_stop = prescript and prescript.mplibfadestate
+ if not fd_type then
+ return fd_stop -- returns "stop" (if picture) or nil
+ end
+ local bbox = prescript.mplibfadebbox:explode":"
+ local dx, dy = -bbox[1], -bbox[2]
+ local vec = prescript.mplibfadevector; vec = vec and vec:explode":"
+ if not vec then
+ if fd_type == "linear" then
+ vec = {bbox[1], bbox[2], bbox[3], bbox[2]} -- left to right
+ else
+ local centerx, centery = (bbox[1]+bbox[3])/2, (bbox[2]+bbox[4])/2
+ vec = {centerx, centery, centerx, centery} -- center for both circles
+ end
+ end
+ local coords = { vec[1]+dx, vec[2]+dy, vec[3]+dx, vec[4]+dy }
+ if fd_type == "linear" then
+ coords = format("%f %f %f %f", tableunpack(coords))
+ elseif fd_type == "circular" then
+ local width, height = bbox[3]-bbox[1], bbox[4]-bbox[2]
+ local radius = (prescript.mplibfaderadius or "0:"..math.sqrt(width^2+height^2)/2):explode":"
+ tableinsert(coords, 3, radius[1])
+ tableinsert(coords, radius[2])
+ coords = format("%f %f %f %f %f %f", tableunpack(coords))
+ else
+ err("unknown fading method '%s'", fd_type)
+ end
+ bbox = format("0 0 %f %f", bbox[3]+dx, bbox[4]+dy)
+ fd_type = fd_type == "linear" and 2 or 3
+ local opaq = (prescript.mplibfadeopacity or "1:0"):explode":"
+ local on, os, new
+ on = sh_pdfpageresources(fd_type, "0 1", "/DeviceGray", {{opaq[1]}}, {{opaq[2]}}, coords, 1)
+ os = format("<</PatternType 2/Shading %s>>", format(pdfetcs.resfmt, on))
+ on = update_pdfobjs(os)
+ local streamtext = format("q /Pattern cs/MPlibFd%s scn %s re f Q", on, bbox)
+ os = format("<</Pattern<</MPlibFd%s %s>>>>", on, format(pdfetcs.resfmt, on))
+ on = update_pdfobjs(os)
+ local resources = "/Resources " .. format(pdfetcs.resfmt, on)
+ on = update_pdfobjs"<</S/Transparency/CS/DeviceGray>>"
+ local attr = tableconcat{
+ "/Subtype/Form",
+ format("/BBox[%s]", bbox),
+ format("/Matrix[1 0 0 1 %f %f]", -dx, -dy),
+ resources,
+ "/Group ", format(pdfetcs.resfmt, on),
+ }
+ on = update_pdfobjs(attr, streamtext)
+ os = "<</SMask<</S/Luminosity/G " .. format(pdfetcs.resfmt, on) .. ">>>>"
+ on, new = update_pdfobjs(os)
+ local key = add_extgs_resources(on,new)
+ start_pdf_code()
+ pdf_literalcode("/%s gs", key)
+ if fd_stop then return "standalone" end
+ return "start"
+end
+
+pdfetcs.tr_group = { shifts = { } }
+luamplib.trgroupshifts = pdfetcs.tr_group.shifts
+local function do_preobj_GRP (object, prescript)
+ local grstate = prescript and prescript.gr_state
+ if not grstate then return end
+ local trgroup = pdfetcs.tr_group
+ if grstate == "start" then
+ trgroup.name = prescript.mplibgroupname or "lastmplibgroup"
+ trgroup.isolated, trgroup.knockout = false, false
+ for _,v in ipairs(prescript.gr_type:explode",+") do
+ trgroup[v] = true
+ end
+ local p = object.path
+ trgroup.bbox = {
+ math.min(p[1].x_coord, p[2].x_coord, p[3].x_coord, p[4].x_coord),
+ math.min(p[1].y_coord, p[2].y_coord, p[3].y_coord, p[4].y_coord),
+ math.max(p[1].x_coord, p[2].x_coord, p[3].x_coord, p[4].x_coord),
+ math.max(p[1].y_coord, p[2].y_coord, p[3].y_coord, p[4].y_coord),
+ }
+ put2output[[\begingroup\setbox\mplibscratchbox\hbox\bgroup]]
+ elseif grstate == "stop" then
+ local llx,lly,urx,ury = tableunpack(trgroup.bbox)
+ local grattr = format("/Group<</S/Transparency/I %s/K %s>>",trgroup.isolated,trgroup.knockout)
+ local res = gather_resources()
+ put2output(tableconcat{
+ "\\egroup",
+ format("\\wd\\mplibscratchbox %fbp", urx-llx),
+ format("\\ht\\mplibscratchbox %fbp", ury-lly),
+ "\\dp\\mplibscratchbox 0pt",
+ })
+ if pdfmode then
+ put2output(tableconcat{
+ "\\saveboxresource type 2 attr{/Type/XObject/Subtype/Form/FormType 1",
+ format("/BBox[%f %f %f %f]", llx,lly,urx,ury),
+ grattr, "} resources{", res, "}\\mplibscratchbox",
+ [[\setbox\mplibscratchbox\hbox{\useboxresource\lastsavedboxresourceindex}]],
+ [[\wd\mplibscratchbox 0pt\ht\mplibscratchbox 0pt\dp\mplibscratchbox 0pt]],
+ [[\box\mplibscratchbox\endgroup]],
+ "\\expandafter\\xdef\\csname luamplib.group.", trgroup.name, "\\endcsname{",
+ "\\noexpand\\mplibstarttoPDF{",llx,"}{",lly,"}{",urx,"}{",ury,"}",
+ "\\useboxresource \\the\\lastsavedboxresourceindex\\noexpand\\mplibstoptoPDF}",
+ })
+ else
+ trgroup.cnt = (trgroup.cnt or 0) + 1
+ local objname = format("@mplibtrgr%s", trgroup.cnt)
+ put2output(tableconcat{
+ "\\special{pdf:bxobj ", objname, " bbox ", format("%f %f %f %f", llx,lly,urx,ury), "}",
+ "\\unhbox\\mplibscratchbox",
+ "\\special{pdf:put @resources <<", res, ">>}",
+ "\\special{pdf:exobj <<", grattr, ">>}",
+ "\\special{pdf:uxobj ", objname, "}\\endgroup",
+ "\\expandafter\\gdef\\csname luamplib.group.", trgroup.name, "\\endcsname{",
+ "\\mplibstarttoPDF{",llx,"}{",lly,"}{",urx,"}{",ury,"}",
+ "\\special{pdf:uxobj ", objname, "}\\mplibstoptoPDF}",
+ })
+ end
+ trgroup.shifts[trgroup.name] = { llx, lly }
+ end
+ return grstate
+end
+
+local function stop_special_effects(fade,opaq,over)
+ if fade then -- fading
+ stop_pdf_code()
+ end
+ if opaq then -- opacity
+ pdf_literalcode(opaq)
+ end
+ if over then -- color
+ put2output"\\special{pdf:ec}"
+ end
+end
+
+local function getobjects(result,figure,f)
+ return figure:objects()
+end
+
+function luamplib.convert (result, flusher)
+ luamplib.flush(result, flusher)
+ return true -- done
+end
+
+local function pdf_textfigure(font,size,text,width,height,depth)
+ text = text:gsub(".",function(c)
+ return format("\\hbox{\\char%i}",string.byte(c)) -- kerning happens in metapost : false
+ end)
+ put2output("\\mplibtextext{%s}{%f}{%s}{%s}{%s}",font,size,text,0,0)
+end
+
+local bend_tolerance = 131/65536
+
+local rx, sx, sy, ry, tx, ty, divider = 1, 0, 0, 1, 0, 0, 1
+
+local function pen_characteristics(object)
+ local t = mplib.pen_info(object)
+ rx, ry, sx, sy, tx, ty = t.rx, t.ry, t.sx, t.sy, t.tx, t.ty
+ divider = sx*sy - rx*ry
+ return not (sx==1 and rx==0 and ry==0 and sy==1 and tx==0 and ty==0), t.width
+end
+
+local function concat(px, py) -- no tx, ty here
+ return (sy*px-ry*py)/divider,(sx*py-rx*px)/divider
+end
+
+local function curved(ith,pth)
+ local d = pth.left_x - ith.right_x
+ if abs(ith.right_x - ith.x_coord - d) <= bend_tolerance and abs(pth.x_coord - pth.left_x - d) <= bend_tolerance then
+ d = pth.left_y - ith.right_y
+ if abs(ith.right_y - ith.y_coord - d) <= bend_tolerance and abs(pth.y_coord - pth.left_y - d) <= bend_tolerance then
+ return false
+ end
+ end
+ return true
+end
+
+local function flushnormalpath(path,open)
+ local pth, ith
+ for i=1,#path do
+ pth = path[i]
+ if not ith then
+ pdf_literalcode("%f %f m",pth.x_coord,pth.y_coord)
+ elseif curved(ith,pth) then
+ pdf_literalcode("%f %f %f %f %f %f c",ith.right_x,ith.right_y,pth.left_x,pth.left_y,pth.x_coord,pth.y_coord)
+ else
+ pdf_literalcode("%f %f l",pth.x_coord,pth.y_coord)
+ end
+ ith = pth
+ end
+ if not open then
+ local one = path[1]
+ if curved(pth,one) then
+ pdf_literalcode("%f %f %f %f %f %f c",pth.right_x,pth.right_y,one.left_x,one.left_y,one.x_coord,one.y_coord )
+ else
+ pdf_literalcode("%f %f l",one.x_coord,one.y_coord)
+ end
+ elseif #path == 1 then -- special case .. draw point
+ local one = path[1]
+ pdf_literalcode("%f %f l",one.x_coord,one.y_coord)
+ end
+end
+
+local function flushconcatpath(path,open)
+ pdf_literalcode("%f %f %f %f %f %f cm", sx, rx, ry, sy, tx ,ty)
+ local pth, ith
+ for i=1,#path do
+ pth = path[i]
+ if not ith then
+ pdf_literalcode("%f %f m",concat(pth.x_coord,pth.y_coord))
+ elseif curved(ith,pth) then
+ local a, b = concat(ith.right_x,ith.right_y)
+ local c, d = concat(pth.left_x,pth.left_y)
+ pdf_literalcode("%f %f %f %f %f %f c",a,b,c,d,concat(pth.x_coord, pth.y_coord))
+ else
+ pdf_literalcode("%f %f l",concat(pth.x_coord, pth.y_coord))
+ end
+ ith = pth
+ end
+ if not open then
+ local one = path[1]
+ if curved(pth,one) then
+ local a, b = concat(pth.right_x,pth.right_y)
+ local c, d = concat(one.left_x,one.left_y)
+ pdf_literalcode("%f %f %f %f %f %f c",a,b,c,d,concat(one.x_coord, one.y_coord))
+ else
+ pdf_literalcode("%f %f l",concat(one.x_coord,one.y_coord))
+ end
+ elseif #path == 1 then -- special case .. draw point
+ local one = path[1]
+ pdf_literalcode("%f %f l",concat(one.x_coord,one.y_coord))
+ end
+end
+
function luamplib.flush (result,flusher)
if result then
local figures = result.fig
@@ -1942,7 +2466,9 @@ function luamplib.flush (result,flusher)
local prescript = object.prescript
prescript = prescript and script2table(prescript) -- prescript is now a table
local cr_over = do_preobj_CR(object,prescript) -- color
- local tr_opaq = do_preobj_TR(prescript) -- opacity
+ local tr_opaq = do_preobj_TR(object,prescript) -- opacity
+ local fading_ = do_preobj_FADE(object,prescript) -- fading
+ local trgroup = do_preobj_GRP(object,prescript) -- transparency group
if prescript and prescript.mplibtexboxid then
put_tex_boxes(object,prescript)
elseif objecttype == "start_bounds" or objecttype == "stop_bounds" then --skip
@@ -1964,7 +2490,7 @@ function luamplib.flush (result,flusher)
pdf_literalcode("%f %f %f %f %f %f cm",ot[3],ot[4],ot[5],ot[6],ot[1],ot[2])
pdf_textfigure(object.font,object.dsize,object.text,object.width,object.height,object.depth)
stop_pdf_code()
- else
+ elseif not trgroup and fading_ ~= "stop" then
local evenodd, collect, both = false, false, false
local postscript = object.postscript
if not object.istext then
@@ -1988,7 +2514,6 @@ function luamplib.flush (result,flusher)
savedhtap[#savedhtap+1] = object.htap or false
end
else
- local shade_no = do_preobj_SH(object,prescript) -- shading
local ml = object.miterlimit
if ml and ml ~= miterlimit then
miterlimit = ml
@@ -2015,6 +2540,8 @@ function luamplib.flush (result,flusher)
pdf_literalcode("[] 0 d")
dashed = false
end
+ local shade_no = do_preobj_SH(object,prescript) -- shading
+ local pattern_ = do_preobj_PAT(object,prescript) -- pattern
local path = object.path
local transformed, penwidth = false, 1
local open = path and path[1].left_type and path[#path].right_type
@@ -2105,11 +2632,21 @@ function luamplib.flush (result,flusher)
end
end
end
- if tr_opaq then -- opacity
- stop_pdf_code()
+ if fading_ == "start" then
+ pdfetcs.fading.specialeffects = {fading_, tr_opaq, cr_over}
+ elseif trgroup == "start" then
+ pdfetcs.tr_group.specialeffects = {fading_, tr_opaq, cr_over}
+ elseif fading_ == "stop" then
+ local se = pdfetcs.fading.specialeffects
+ if se then stop_special_effects(se[1], se[2], se[3]) end
+ elseif trgroup == "stop" then
+ local se = pdfetcs.tr_group.specialeffects
+ if se then stop_special_effects(se[1], se[2], se[3]) end
+ else
+ stop_special_effects(fading_, tr_opaq, cr_over)
end
- if cr_over then -- color
- put2output"\\special{pdf:ec}"
+ if fading_ or trgroup then -- extgs resetted
+ miterlimit, linecap, linejoin, dashed = -1, -1, -1, false
end
end
end
diff --git a/Master/texmf-dist/tex/luatex/luamplib/luamplib.sty b/Master/texmf-dist/tex/luatex/luamplib/luamplib.sty
index 55362792183..257d9957240 100644
--- a/Master/texmf-dist/tex/luatex/luamplib/luamplib.sty
+++ b/Master/texmf-dist/tex/luatex/luamplib/luamplib.sty
@@ -14,7 +14,7 @@
\else
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{luamplib}
- [2024/05/21 v2.31.0 mplib package for LuaTeX]
+ [2024/07/19 v2.34.1 mplib package for LuaTeX]
\ifx\newluafunction\@undefined
\input ltluatex
\fi
@@ -46,6 +46,41 @@
\catcode`\&=12 \catcode`\$=12 \catcode`\%=12 \catcode`\^^M=12
}
\def\mplibputtextbox#1{\vbox to 0pt{\vss\hbox to 0pt{\raise\dp#1\copy#1\hss}}}
+\protected\def\usemplibgroup#1{\csname luamplib.group.#1\endcsname}
+{\def\:{\global\let\mplibsptoken= } \: }
+\protected\def\mppattern#1{%
+ \begingroup
+ \def\mplibpatternname{#1}%
+ \mplibpatterngetnexttok
+}
+\def\mplibpatterngetnexttok{\futurelet\nexttok\mplibpatternbranch}
+\def\mplibpatternskipspace{\afterassignment\mplibpatterngetnexttok\let\nexttok= }
+\def\mplibpatternbranch{%
+ \ifx [\nexttok
+ \expandafter\mplibpatternopts
+ \else
+ \ifx\mplibsptoken\nexttok
+ \expandafter\expandafter\expandafter\mplibpatternskipspace
+ \else
+ \let\mplibpatternoptions\empty
+ \expandafter\expandafter\expandafter\mplibpatternmain
+ \fi
+ \fi
+}
+\def\mplibpatternopts[#1]{%
+ \def\mplibpatternoptions{#1}%
+ \mplibpatternmain
+}
+\def\mplibpatternmain{%
+ \setbox\mplibscratchbox\hbox\bgroup\ignorespaces
+}
+\protected\def\endmppattern{%
+ \egroup
+ \directlua{ luamplib.registerpattern(
+ \the\mplibscratchbox, '\mplibpatternname', {\mplibpatternoptions}
+ )}%
+ \endgroup
+}
\def\mpfiginstancename{@mpfig}
\protected\def\mpfig{%
\begingroup
@@ -66,16 +101,16 @@
\long\def\mplibdomainmpfig#1\endmpfig{%
\endgroup
\directlua{
- local legacy = luamplib.legacy_verbatimtex
+ local legacy = luamplib.legacyverbatimtex
local everympfig = luamplib.everymplib["\mpfiginstancename"] or ""
local everyendmpfig = luamplib.everyendmplib["\mpfiginstancename"] or ""
- luamplib.legacy_verbatimtex = false
+ luamplib.legacyverbatimtex = false
luamplib.everymplib["\mpfiginstancename"] = ""
luamplib.everyendmplib["\mpfiginstancename"] = ""
luamplib.process_mplibcode(
"beginfig(0) "..everympfig.." "..[===[\unexpanded{#1}]===].." "..everyendmpfig.." endfig;",
"\mpfiginstancename")
- luamplib.legacy_verbatimtex = legacy
+ luamplib.legacyverbatimtex = legacy
luamplib.everymplib["\mpfiginstancename"] = everympfig
luamplib.everyendmplib["\mpfiginstancename"] = everyendmpfig
}%
@@ -89,14 +124,14 @@
\long\def\mplibdoprempfig#1\endmpfig{%
\endgroup
\directlua{
- local legacy = luamplib.legacy_verbatimtex
+ local legacy = luamplib.legacyverbatimtex
local everympfig = luamplib.everymplib["\mpfiginstancename"]
local everyendmpfig = luamplib.everyendmplib["\mpfiginstancename"]
- luamplib.legacy_verbatimtex = false
+ luamplib.legacyverbatimtex = false
luamplib.everymplib["\mpfiginstancename"] = ""
luamplib.everyendmplib["\mpfiginstancename"] = ""
luamplib.process_mplibcode([===[\unexpanded{#1}]===],"\mpfiginstancename")
- luamplib.legacy_verbatimtex = legacy
+ luamplib.legacyverbatimtex = legacy
luamplib.everymplib["\mpfiginstancename"] = everympfig
luamplib.everyendmplib["\mpfiginstancename"] = everyendmpfig
}%
@@ -163,9 +198,9 @@
\def\mpliblegacybehavior#1{\directlua{
local s = string.lower("#1")
if s == "enable" or s == "true" or s == "yes" then
- luamplib.legacy_verbatimtex = true
+ luamplib.legacyverbatimtex = true
else
- luamplib.legacy_verbatimtex = false
+ luamplib.legacyverbatimtex = false
end
}}
\def\mplibverbatim#1{\directlua{
diff --git a/Master/texmf-dist/tex/luatex/luatexja/addons/luatexja-fontspec-27c.sty b/Master/texmf-dist/tex/luatex/luatexja/addons/luatexja-fontspec-27c.sty
index 76ebf8716c8..6ef3ff1751e 100644
--- a/Master/texmf-dist/tex/luatex/luatexja/addons/luatexja-fontspec-27c.sty
+++ b/Master/texmf-dist/tex/luatex/luatexja/addons/luatexja-fontspec-27c.sty
@@ -3,7 +3,7 @@
%
\NeedsTeXFormat{LaTeX2e}
-\ProvidesPackage{luatexja-fontspec-27c}[2024-02-19 fontspec support of LuaTeX-ja]
+\ProvidesPackage{luatexja-fontspec-27c}[2024-05-27 fontspec support of LuaTeX-ja]
\RequirePackage{l3keys2e}
\ExplSyntaxOn
@@ -359,10 +359,24 @@
\setfontfamily #1 [#2,#4] {#3}
\cs_set_eq:NN \fontspec_set_family:Nnn \__ltj_orig_fontspec_set_family:Nnn
}
+\DeclareDocumentCommand \providejfontfamily { m O{} m O{} } {
+ \cs_set_eq:NN \fontspec_set_family:Nnn \__ltj_fontspec_set_family:Nnn
+ \providefontfamily #1 [#2,#4] {#3}
+ \cs_set_eq:NN \fontspec_set_family:Nnn \__ltj_orig_fontspec_set_family:Nnn
+}
\DeclareDocumentCommand \newjfontface { m O{} m O{} } {
\newjfontfamily #1 [ BoldFont={},ItalicFont={},SmallCapsFont={},#2,#4 ] {#3}
}
+\DeclareDocumentCommand \renewjfontface { m O{} m O{} } {
+ \renewjfontfamily #1 [ BoldFont={},ItalicFont={},SmallCapsFont={},#2,#4 ] {#3}
+}
+\DeclareDocumentCommand \setjfontface { m O{} m O{} } {
+ \setjfontfamily #1 [ BoldFont={},ItalicFont={},SmallCapsFont={},#2,#4 ] {#3}
+}
+\DeclareDocumentCommand \providejfontface { m O{} m O{} } {
+ \providejfontfamily #1 [ BoldFont={},ItalicFont={},SmallCapsFont={},#2,#4 ] {#3}
+}
\prop_new:N \l__ltj_fontspec_tmp_prop
\prop_new:N \g__ltj_fontspec_fontopts_prop
diff --git a/Master/texmf-dist/tex/luatex/luatexja/addons/luatexja-fontspec-29c.sty b/Master/texmf-dist/tex/luatex/luatexja/addons/luatexja-fontspec-29c.sty
index 1415cee1274..51af33447ce 100644
--- a/Master/texmf-dist/tex/luatex/luatexja/addons/luatexja-fontspec-29c.sty
+++ b/Master/texmf-dist/tex/luatex/luatexja/addons/luatexja-fontspec-29c.sty
@@ -3,7 +3,7 @@
%
\NeedsTeXFormat{LaTeX2e}
-\ProvidesPackage{luatexja-fontspec-29c}[2024-05-05 fontspec support of LuaTeX-ja]
+\ProvidesPackage{luatexja-fontspec-29c}[2024-05-27 fontspec support of LuaTeX-ja]
\RequirePackage{l3keys2e}
\ExplSyntaxOn
@@ -359,10 +359,24 @@
\setfontfamily #1 [#2,#4] {#3}
\cs_set_eq:NN \fontspec_set_family:Nnn \__ltj_orig_fontspec_set_family:Nnn
}
+\DeclareDocumentCommand \providejfontfamily { m O{} m O{} } {
+ \cs_set_eq:NN \fontspec_set_family:Nnn \__ltj_fontspec_set_family:Nnn
+ \providefontfamily #1 [#2,#4] {#3}
+ \cs_set_eq:NN \fontspec_set_family:Nnn \__ltj_orig_fontspec_set_family:Nnn
+}
\DeclareDocumentCommand \newjfontface { m O{} m O{} } {
\newjfontfamily #1 [ BoldFont={},ItalicFont={},SmallCapsFont={},#2,#4 ] {#3}
}
+\DeclareDocumentCommand \renewjfontface { m O{} m O{} } {
+ \renewjfontfamily #1 [ BoldFont={},ItalicFont={},SmallCapsFont={},#2,#4 ] {#3}
+}
+\DeclareDocumentCommand \setjfontface { m O{} m O{} } {
+ \setjfontfamily #1 [ BoldFont={},ItalicFont={},SmallCapsFont={},#2,#4 ] {#3}
+}
+\DeclareDocumentCommand \providejfontface { m O{} m O{} } {
+ \providejfontfamily #1 [ BoldFont={},ItalicFont={},SmallCapsFont={},#2,#4 ] {#3}
+}
\prop_new:N \l__ltj_fontspec_tmp_prop
\prop_new:N \g__ltj_fontspec_fontopts_prop
diff --git a/Master/texmf-dist/tex/luatex/luatexja/addons/luatexja-fontspec-29e.sty b/Master/texmf-dist/tex/luatex/luatexja/addons/luatexja-fontspec-29e.sty
index e763d91ad7d..02a79ad6ca2 100644
--- a/Master/texmf-dist/tex/luatex/luatexja/addons/luatexja-fontspec-29e.sty
+++ b/Master/texmf-dist/tex/luatex/luatexja/addons/luatexja-fontspec-29e.sty
@@ -3,7 +3,7 @@
%
\NeedsTeXFormat{LaTeX2e}
-\ProvidesPackage{luatexja-fontspec-29e}[2024-05-14 fontspec support of LuaTeX-ja]
+\ProvidesPackage{luatexja-fontspec-29e}[2024-05-27 fontspec support of LuaTeX-ja]
\RequirePackage{l3keys2e}
\ExplSyntaxOn
@@ -359,10 +359,24 @@
\setfontfamily #1 [#2,#4] {#3}
\cs_set_eq:NN \fontspec_set_family:Nnn \__ltj_orig_fontspec_set_family:Nnn
}
+\DeclareDocumentCommand \providejfontfamily { m O{} m O{} } {
+ \cs_set_eq:NN \fontspec_set_family:Nnn \__ltj_fontspec_set_family:Nnn
+ \providefontfamily #1 [#2,#4] {#3}
+ \cs_set_eq:NN \fontspec_set_family:Nnn \__ltj_orig_fontspec_set_family:Nnn
+}
\DeclareDocumentCommand \newjfontface { m O{} m O{} } {
\newjfontfamily #1 [ BoldFont={},ItalicFont={},SmallCapsFont={},#2,#4 ] {#3}
}
+\DeclareDocumentCommand \renewjfontface { m O{} m O{} } {
+ \renewjfontfamily #1 [ BoldFont={},ItalicFont={},SmallCapsFont={},#2,#4 ] {#3}
+}
+\DeclareDocumentCommand \setjfontface { m O{} m O{} } {
+ \setjfontfamily #1 [ BoldFont={},ItalicFont={},SmallCapsFont={},#2,#4 ] {#3}
+}
+\DeclareDocumentCommand \providejfontface { m O{} m O{} } {
+ \providejfontfamily #1 [ BoldFont={},ItalicFont={},SmallCapsFont={},#2,#4 ] {#3}
+}
\prop_new:N \l__ltj_fontspec_tmp_prop
\prop_new:N \g__ltj_fontspec_fontopts_prop
diff --git a/Master/texmf-dist/tex/luatex/luatexja/lltjext.sty b/Master/texmf-dist/tex/luatex/luatexja/lltjext.sty
index a83c9305c93..69e709f02ee 100644
--- a/Master/texmf-dist/tex/luatex/luatexja/lltjext.sty
+++ b/Master/texmf-dist/tex/luatex/luatexja/lltjext.sty
@@ -3,7 +3,7 @@
%
\NeedsTeXFormat{LaTeX2e}
-\ProvidesPackage{lltjext}[2022-08-24 v1.2k-ltj-14 Macros for vertical writing]
+\ProvidesPackage{lltjext}[2024-05-16 v1.2k-ltj-15 Macros for vertical writing]
\RequirePackage{luatexja}
\newcount\ltj@ext@dir
\let\ltj@lltjext@orig@tabular=\tabular
@@ -541,17 +541,11 @@
\else \let\box@dir\utod
\fi
\fi
-\ifltj@ltfilehook@avail % LaTeX2e >= 2020-10-01
\@defaultunitsset\@picht{#3}\unitlength
\@defaultunitsset\@picwd{#2}\unitlength
\setbox\@picbox\hbox to\@picwd\bgroup\box@dir
\@defaultunitsset\@tempdimc{#4}\unitlength\hskip-\@tempdimc
\@defaultunitsset\@tempdimc{#5}\unitlength\lower\@tempdimc\hbox\bgroup
-\else % <= 2020-02-02
- \@picwd=#2\unitlength \@picht=#3\unitlength
- \setbox\@picbox\hbox to\@picwd\bgroup\box@dir
- \hskip-#4\unitlength\lower#5\unitlength\hbox\bgroup
-\fi
\ltj@@pic@reset@blshift
\ignorespaces}
\def\endpicture{%
diff --git a/Master/texmf-dist/tex/luatex/luatexja/ltj-latex.sty b/Master/texmf-dist/tex/luatex/luatexja/ltj-latex.sty
index 7e091d161d1..9f6e4d0a365 100644
--- a/Master/texmf-dist/tex/luatex/luatexja/ltj-latex.sty
+++ b/Master/texmf-dist/tex/luatex/luatexja/ltj-latex.sty
@@ -12,45 +12,14 @@
\def\luatexjalatexLoaded{\endinput}
\NeedsTeXFormat{LaTeX2e}
-\ProvidesPackage{ltj-latex}[2022-10-15 LaTeX support of LuaTeX-ja]
+\ProvidesPackage{ltj-latex}[2024-05-16 LaTeX support of LuaTeX-ja]
\endlinechar=13
%%% LaTeX version detection
-\newif\ifltj@ltfilehook@avail
-\@ifl@t@r\fmtversion{2020-10-01}{%
- \@ifl@t@r\fmtversion{2020-10-02}%
- {\ltj@ltfilehook@availtrue}
- {%
- \ifnum\patch@level<0\relax \ifnum\patch@level<-6 \ltj@ltfilehook@availtrue\fi
- \else\ltj@ltfilehook@availtrue\fi
- }%
-}{}
-\@ifl@t@r\fmtversion{2021-05-01}{\count@=1 }{\count@=0 }
-\ifnum \count@<1
-%%%% \shipout
- \newluafunction\ltj@@lua@shipout@inner
- \directlua{
- local t = lua.get_functions_table()
- local getbox, setbox = tex.getbox, tex.setbox
- local shipout_lthook = luatexja.direction.shipout_lthook
- t[\the\ltj@@lua@shipout@inner]=function ()
- local a = shipout_lthook(getbox(\the\ltj@afbox))
- if a then setbox(\the\ltj@afbox, a) end
- end
- }
- \protected\luadef\ltj@@lua@shipout\ltj@@lua@shipout@inner
- \def\ltj@shipout@{\ltj@@lua@shipout\primitive\shipout\box\ltj@afbox}%
- \protected\def\ltj@shipout{\ltj@afterbox\ltj@shipout@}
- \ifprimitive\shipout\let\shipout\ltj@shipout\fi
- \ifcsname tex_shipout:D\endcsname
- \expandafter\let\csname tex_shipout:D\endcsname\ltj@shipout
- \fi
-\else
- \directlua{%
- luatexbase.add_to_callback('pre_shipout_filter',luatexja.direction.shipout_lthook, 'ltj.direction', 1)
- }
-\fi
+\directlua{%
+ luatexbase.add_to_callback('pre_shipout_filter',luatexja.direction.shipout_lthook, 'ltj.direction', 1)
+}
%%% patch for LaTeX
\usepackage{lltjfont}
@@ -59,36 +28,30 @@
\RequirePackage{lltjp-atbegshi}
%%% patching commands
-\ifltj@ltfilehook@avail
- %% \ltj@ExecuteBeforePackage <package><code> and \ltj@ExecuteAfterPackage <package><code>
- %% no-starred version: do nothing if the <package> is loaded
- %% starred version: do <code> right away if the <package> is loaded
- \def\ltj@ExecuteAfterPackage{\@ifstar\@@ltj@ExecuteAfterPackage@star\@@ltj@ExecuteAfterPackage}
- \def\ltj@ExecuteBeforePackage{\@ifstar\@@ltj@ExecuteBeforePackage@star\@@ltj@ExecuteBeforePackage}
- \@ifl@t@r\fmtversion{2021-11-15}{% 2021-11-15
- \def\@@ltj@ExecuteAfterPackage@star#1{\AddToHook{package/#1/after}}
- \def\@@ltj@ExecuteBeforePackage@star#1{\AddToHook{package/#1/before}}
- \long\def\@@ltj@ExecuteAfterPackage#1#2{%
- \@ifpackageloaded{#1}{}{\AddToHook{package/#1/after}{#2}}%
- }
- \long\def\@@ltj@ExecuteBeforePackage#1#2{%
- \@ifpackageloaded{#1}{}{\AddToHook{package/#1/before}{#2}}%
- }
- }{
- \def\@@ltj@ExecuteAfterPackage#1{\AddToHook{package/after/#1}}
- \def\@@ltj@ExecuteBeforePackage#1{\AddToHook{package/before/#1}}
- \long\def\@@ltj@ExecuteAfterPackage@star#1#2{%
- \@ifpackageloaded{#1}{#2}{\@@ltj@ExecuteAfterPackage{#1}{#2}}%
- }
- \long\def\@@ltj@ExecuteBeforePackage@star#1#2{%
- \@ifpackageloaded{#1}{#2}{\@@ltj@ExecuteBeforePackage{#1}{#2}}%
- }
+%% \ltj@ExecuteBeforePackage <package><code> and \ltj@ExecuteAfterPackage <package><code>
+%% no-starred version: do nothing if the <package> is loaded
+%% starred version: do <code> right away if the <package> is loaded
+\def\ltj@ExecuteAfterPackage{\@ifstar\@@ltj@ExecuteAfterPackage@star\@@ltj@ExecuteAfterPackage}
+\def\ltj@ExecuteBeforePackage{\@ifstar\@@ltj@ExecuteBeforePackage@star\@@ltj@ExecuteBeforePackage}
+\@ifl@t@r\fmtversion{2021-11-15}{% 2021-11-15
+ \def\@@ltj@ExecuteAfterPackage@star#1{\AddToHook{package/#1/after}}
+ \def\@@ltj@ExecuteBeforePackage@star#1{\AddToHook{package/#1/before}}
+ \long\def\@@ltj@ExecuteAfterPackage#1#2{%
+ \@ifpackageloaded{#1}{}{\AddToHook{package/#1/after}{#2}}%
}
-\else
- \RequirePackage{filehook}
- \let\ltj@ExecuteAfterPackage=\AtEndOfPackageFile
- \let\ltj@ExecuteBeforePackage=\AtBeginOfPackageFile
-\fi
+ \long\def\@@ltj@ExecuteBeforePackage#1#2{%
+ \@ifpackageloaded{#1}{}{\AddToHook{package/#1/before}{#2}}%
+ }
+}{
+ \def\@@ltj@ExecuteAfterPackage#1{\AddToHook{package/after/#1}}
+ \def\@@ltj@ExecuteBeforePackage#1{\AddToHook{package/before/#1}}
+ \long\def\@@ltj@ExecuteAfterPackage@star#1#2{%
+ \@ifpackageloaded{#1}{#2}{\@@ltj@ExecuteAfterPackage{#1}{#2}}%
+ }
+ \long\def\@@ltj@ExecuteBeforePackage@star#1#2{%
+ \@ifpackageloaded{#1}{#2}{\@@ltj@ExecuteBeforePackage{#1}{#2}}%
+ }
+}
\def\ltj@pkgpatch@im#1{\@ifnextchar[{\ltj@pkgpatch@im@{#1}}{\ltj@pkgpatch@im@{#1}[lltjp-#1]}}%]
\def\ltj@pkgpatch@im@#1[#2]{\ltj@ExecuteAfterPackage*{#1}{\ltj@pkgpatch@im@@{#2}}}
\def\ltj@pkgpatch@im@@#1{%
@@ -101,11 +64,7 @@
}
\def\ltj@pkgpatch#1{\@ifnextchar[{\ltj@pkgpatch@{#1}}{\ltj@pkgpatch@{#1}[lltjp-#1]}}%]
-\ifltj@ltfilehook@avail
- \def\ltj@pkgpatch@@{\AddToHook{begindocument/before}[luatexja.autopatch]}
-\else
- \def\ltj@pkgpatch@@{\gpreto\@begindocumenthook}
-\fi
+\def\ltj@pkgpatch@@{\AddToHook{begindocument/before}[luatexja.autopatch]}
\def\ltj@pkgpatch@#1[#2]{%
\ltj@pkgpatch@@{%
\@ifpackageloaded{#1}{\@ifpackageloaded{#2}{}{\RequirePackage{#2}}}{}%
@@ -121,18 +80,12 @@
\ltj@pkgpatch{tascmac}
\ltj@pkgpatch{ascmac}[lltjp-tascmac]
\ltj@pkgpatch@im{stfloats}
-\ifltj@ltfilehook@avail\else
- \ltj@pkgpatch{preview} %% at \begin{document}
- % (preview package has delayed option)
-\fi
\ltj@pkgpatch{array} %% at \begin{document}
\ltj@pkgpatch{collcell} %% at \begin{document}
\ltj@pkgpatch@im{unicode-math}
\ltj@pkgpatch@im{siunitx}
\ltj@pkgpatch@im{microtype}
-\ifltj@ltfilehook@avail\else\ltj@pkgpatch@im{everyshi}\fi
-
\RequirePackage{lltjp-geometry}
\ltj@ExecuteBeforePackage{breqn}{%
diff --git a/Master/texmf-dist/tex/luatex/luatexja/ltj-pretreat.lua b/Master/texmf-dist/tex/luatex/luatexja/ltj-pretreat.lua
index 43ecac806c2..8f5632be4e3 100644
--- a/Master/texmf-dist/tex/luatex/luatexja/ltj-pretreat.lua
+++ b/Master/texmf-dist/tex/luatex/luatexja/ltj-pretreat.lua
@@ -156,16 +156,17 @@ function set_box_stack_level(head, mode)
if ltjs.list_dir == dir_tate then
for p in traverse_glyph(to_direct(head)) do
if getlang(p)==lang_ja and has_attr(p, attr_icflag, 0) then
- local pf = ltjf_replace_altfont(attr_curtfnt, getchar(p), p)
+ local pc = ltjs_orig_char_table[p] or getchar(p)
+ local pf = ltjf_replace_altfont(attr_curtfnt, pc, p)
if ltjf_font_metric_table[pf].vert_activated then
- local pc = ltjf_font_metric_table[pf].vform[pc]; if pc then setchar(p, pc) end
+ pc = ltjf_font_metric_table[pf].vform[pc]; if pc then setchar(p, pc) end
end
end
end
else
for p in traverse_glyph(to_direct(head)) do
if getlang(p)==lang_ja and has_attr(p, attr_icflag, 0) then
- ltjf_replace_altfont(attr_curjfnt, getchar(p), p)
+ ltjf_replace_altfont(attr_curjfnt, ltjs_orig_char_table[p] or getchar(p), p)
end
end
end
diff --git a/Master/texmf-dist/tex/luatex/luatexja/ltj-rmlgbm.lua b/Master/texmf-dist/tex/luatex/luatexja/ltj-rmlgbm.lua
index 88352dd5b24..2b65eb5e5c7 100644
--- a/Master/texmf-dist/tex/luatex/luatexja/ltj-rmlgbm.lua
+++ b/Master/texmf-dist/tex/luatex/luatexja/ltj-rmlgbm.lua
@@ -15,7 +15,7 @@ do
end
local cidfont_data = {}
local cache_chars = {}
-local cache_ver = 13
+local cache_ver = 14
local identifiers = fonts.hashes.identifiers
local cid_reg, cid_order, cid_supp, cid_name
@@ -147,7 +147,7 @@ do
descender = 655360*0.12,
},
embedding = "no", cache = "yes", factor = 0, hfactor = 0, vfactor = 0,
- tounicode = 1,
+ tounicode = 1, filename="",
properties = { language = "dflt", script = "dflt" },
}
cidfont_data[cid_name] = k
diff --git a/Master/texmf-dist/tex/luatex/luatexja/luatexja.sty b/Master/texmf-dist/tex/luatex/luatexja/luatexja.sty
index a54ede6758b..f9ae793bb40 100644
--- a/Master/texmf-dist/tex/luatex/luatexja/luatexja.sty
+++ b/Master/texmf-dist/tex/luatex/luatexja/luatexja.sty
@@ -27,7 +27,7 @@
\newif\ifltj@disablejfam
%%%% VERSION
-\def\LuaTeXjaversion{20240514.0}
+\def\LuaTeXjaversion{20240714.0}
%% Check if LaTeX is used.
\begingroup\expandafter\expandafter\expandafter\endgroup
diff --git a/Master/texmf-dist/tex/luatex/luatexja/patches/lltjdefs.sty b/Master/texmf-dist/tex/luatex/luatexja/patches/lltjdefs.sty
index bb63ac68774..00c858e3493 100644
--- a/Master/texmf-dist/tex/luatex/luatexja/patches/lltjdefs.sty
+++ b/Master/texmf-dist/tex/luatex/luatexja/patches/lltjdefs.sty
@@ -3,7 +3,7 @@
%
\NeedsTeXFormat{LaTeX2e}
-\ProvidesPackage{lltjdefs}[2022-01-23 Default font settings of LuaTeX-ja]
+\ProvidesPackage{lltjdefs}[2024-05-16 Default font settings of LuaTeX-ja]
\ifdefined\ltj@stdmcfont\else\def\ltj@stdmcfont{file:HaranoAjiMincho-Regular.otf}\fi
\ifdefined\ltj@stdgtfont\else\def\ltj@stdgtfont{file:HaranoAjiGothic-Medium.otf}\fi
@@ -18,13 +18,8 @@
\DeclareKanjiEncodingDefaults{}{}
\DeclareErrorKanjiFont{JY3}{mc}{m}{n}{10}
\kanjifamily{mc}
-\ifnum\ltj@@latex@plv<1500 % <=2020-10-01
- \kanjiseries{m}
- \kanjishape{n}
-\else % >=2021-06-01
- \def\k@series{m}
- \def\k@shape{n}
-\fi
+\def\k@series{m}
+\def\k@shape{n}
\fontsize{10}{10}
\DeclareYokoKanjiEncoding{JY3}{}{}
\DeclareKanjiSubstitution{JY3}{mc}{m}{n}
@@ -37,12 +32,7 @@
\newcommand\kanjiencodingdefault{JY3}
\newcommand\kanjifamilydefault{\mcdefault}
\newcommand\kanjiseriesdefault{\mddefault}
-\ifnum 0\ifltj@ltfilehook@avail1\fi\ifdefined\@rmfamilyhook1\fi>0
- %% LaTeX 2020-02-02
- \newcommand\kanjishapedefault{\shapedefault}
-\else%% LaTeX 2019-10-01
- \newcommand\kanjishapedefault{\updefault}
-\fi
+\newcommand\kanjishapedefault{\shapedefault}
\DeclareKanjiFamily{JY3}{mc}{}
\DeclareFontShape{JY3}{mc}{m}{n}{<-> s*[\ifdefined\Cjascale\Cjascale\else 0.962216\fi]
@@ -90,57 +80,36 @@
\DeclareMathAlphabet{\mathgt}{JY3}{gt}{m}{n}
\fi
-\ifnum 0\ifltj@ltfilehook@avail1\fi\ifdefined\@rmfamilyhook1\fi>0
-%%%% LaTeX >= 2020-02-02
\edef\bfseries@mc{\bfdefault}
\edef\bfseries@gt{\bfdefault}
\def\bfseries@jtt{\bfseries@mc}
\edef\mdseries@mc{\mddefault}
\edef\mdseries@gt{\mddefault}
\def\mdseries@jtt{\mdseries@mc}
-\fi
\newif\if@ltj@match@family
\@ltj@match@familyfalse
\def\verbatim@font{\normalfont\ttfamily\kanjifamily\jttdefault\selectfont}
-\def\@ltj@hook@family#1#2{% #1: csname #2: contents
- \ifltj@ltfilehook@avail % LaTeX 2020-10-01
- \AddToHook{#1}{#2}%
- \else\ifcsname @#1hook\endcsname % LaTeX 2020-02-02
- \csappto{@#1hook}{#2}%
- \else % LaTeX 2019-10-01
- \ifcsname #1 \endcsname
- \expandafter\patchcmd\csname #1 \endcsname{\selectfont}{#2\selectfont}{}{}%
- \else
- \PackageWarningNoLine{luatexja}{%
- Patching to \expandafter\string\csname #1\endcsname\space failed%
- }%
- \fi
- \fi\fi
-}
-\@ltj@hook@family{rmfamily}{%
+\AddToHook{rmfamily}{%
\if@ltj@match@family
\prepare@family@series@update@kanji{mc}\mcdefault
\fi
}
-\@ltj@hook@family{sffamily}{%
+\AddToHook{sffamily}{%
\if@ltj@match@family
\prepare@family@series@update@kanji{gt}\gtdefault
\fi
}
-\@ltj@hook@family{ttfamily}{%
+\AddToHook{ttfamily}{%
\if@ltj@match@family
\prepare@family@series@update@kanji{jtt}\jttdefault
\fi
}
-\let\@ltj@hook@family\@undefined
-\ifltj@ltfilehook@avail % 2020-10-01
- \expandafter\def\expandafter\kanjiseriesdefault
- \expandafter{\kanjiseriesdefault\@empty}
- \let\kanjiseriesdefault@kernel\kanjiseriesdefault
-\fi
+\expandafter\def\expandafter\kanjiseriesdefault
+ \expandafter{\kanjiseriesdefault\@empty}
+\let\kanjiseriesdefault@kernel\kanjiseriesdefault
%%% \eminnershape
\expandafter\patchcmd\csname em \endcsname{\itshape}{\gtfamily\itshape}{}{}
diff --git a/Master/texmf-dist/tex/luatex/luatexja/patches/lltjfont.sty b/Master/texmf-dist/tex/luatex/luatexja/patches/lltjfont.sty
index 2efc9435ab8..52ac44d5ccb 100644
--- a/Master/texmf-dist/tex/luatex/luatexja/patches/lltjfont.sty
+++ b/Master/texmf-dist/tex/luatex/luatexja/patches/lltjfont.sty
@@ -3,31 +3,10 @@
%
\NeedsTeXFormat{LaTeX2e}
-\ProvidesPackage{lltjfont}[2023-04-13 Patch to NFSS2 for LuaTeX-ja]
+\ProvidesPackage{lltjfont}[2023-05-16 Patch to NFSS2 for LuaTeX-ja]
%%%%%%%% LaTeX2e version detection
-\newcount\ltj@@latex@plv \ltj@@latex@plv=-1
-\ifltj@ltfilehook@avail
-\ExplSyntaxOn
- \cs_if_exist:NTF \__shipout_execute_main_cont:Nnnn
- {\ltj@@latex@plv=1500}% 2021-06-01
- {\ifnum\patch@level>2\relax \ltj@@latex@plv=1300\else \ltj@@latex@plv=1000\fi}% 2020-10-01
-\ExplSyntaxOff
-\else\ifdefined\@rmfamilyhook % 2020-02-02
- \ifx\@forced@seriestrue\@undefined % 2020-02-02 pl0--2
- \@latex@error
- {Please update LaTeX2e!^^J\space\space
- At least LaTeX2e 2020-02-02 patch level 3 is required}%
- {LaTeX2e 2020-02-02 patch level 2 (and 4) has a bug.}
- \else
- \ltj@@latex@plv=300
- \unless\ifx\series@maybe@drop@one@m@x\@undefined % pl5 + develop
- \ltj@@latex@plv=501
- \else\unless\ifx\series@maybe@drop@one@m\@undefined % patch level 5
- \ltj@@latex@plv=500
- \fi\fi
- \fi
-\fi\fi
+\newcount\ltj@@latex@plv \ltj@@latex@plv=1500
%% patching \DeclareTextComposite
\def\ltj@chardef@text@cmd#1{%
@@ -400,59 +379,7 @@
\directlua{luatexja.jfont.pickup_alt_font_a('\f@size')}%
}%
\fi}
-\ifnum\ltj@@latex@plv<1500 % <=2020-10-01
-\protected\def\ltj@selectfont@patch{%
- \ltj@@start@time@measure{selectfont}%
- \let\tmp@error@fontshape\error@fontshape
- \let\error@fontshape\error@kfontshape
- \ltj@@is@kyenc{\k@encoding}\ifin@%
- \let\cy@encoding\k@encoding
- \ensure@KanjiEncodingPair{t}%
- \edef\ct@encoding{\csname t@enc@\k@encoding\endcsname}%
- \else
- \ltj@@is@ktenc{\k@encoding}\ifin@%
- \let\ct@encoding\k@encoding
- \ensure@KanjiEncodingPair{y}%
- \edef\cy@encoding{\csname y@enc@\k@encoding\endcsname}%
- \else
- \@latex@error{KANJI Encoding scheme `\k@encoding' unknown}\@eha
- \fi
- \fi
- \global\let\ltj@afont@name=\font@name
- \ltj@selectfont@tate\ltj@selectfont@yoko
-%
- \edef\tmp@item{{\k@encoding}}\expandafter\def\expandafter\k@encoding\tmp@item
- \kenc@update
- \global\let\font@name=\ltj@afont@name
- \let\error@fontshape\tmp@error@fontshape
- \if@knjcmd \@knjcmdfalse
- \expandafter\ifx
- \csname rel@\k@encoding/\k@family/\k@series/\k@shape\endcsname\relax
- \expandafter\ifx
- \csname rel@\k@encoding/\k@family/\k@series/all\endcsname\relax
- \else
- \csname rel@\k@encoding/\k@family/\k@series/all\endcsname\selectfont
- % 警告: 再び \selectfont を呼んでいる.無限ループの可能性あり
- \fi
- \else
- \csname rel@\k@encoding/\k@family/\k@series/\k@shape\endcsname\selectfont
- % 警告: 再び \selectfont を呼んでいる.無限ループの可能性あり
- \fi
- \fi
- \global\let\font@name=\ltj@afont@name
- \ltj@@stop@time@measure{selectfont}%
-}
-\RequirePackage{everysel}
-\let\ltj@@EverySelectfont@Init=\@EverySelectfont@Init
-\expandafter\expandafter\expandafter\let
-\expandafter\expandafter\csname ltj@@orig@selectfont\endcsname\csname selectfont\space\endcsname
-\@EverySelectfont@Init% for LaTeX2e <=2020-10-01
-\def\@EverySelectfont@Init{%
- \expandafter\let\csname selectfont\space \endcsname \ltj@@orig@selectfont
- \ltj@@EverySelectfont@Init
-}
-\EverySelectfont{\ltj@selectfont@patch}
-\else % LaTeX2e >=2021-06-01
+
\AddToHook{selectfont}[luatexja]{%
\ltj@@start@time@measure{selectfont}%
\ifx\delayed@k@adjustment\@empty
@@ -514,7 +441,6 @@
\global\let\font@name=\ltj@afont@name
\ltj@@stop@time@measure{selectfont}%
}
-\fi
\bgroup
\def\ltj@@dir@patch#1#2#3{%
@@ -721,8 +647,6 @@
}
%%%%%%
-\ifnum\ltj@@latex@plv>0
-%%%% LaTeX >= 2020-02-02
\newif\if@shape@roman@kanji
\def\merge@kanji@series#1{%
@@ -740,76 +664,11 @@
\@nil
}
-\ifnum\ltj@@latex@plv>500 % !!! pl5 + develop
\def\set@target@series@kanji#1{%
\edef\k@series{#1}%
\series@maybe@drop@one@m\k@series\k@series
}
-\else\ifnum\ltj@@latex@plv>300 % !!! pl5
- \def\set@target@series@kanji#1{%
- \edef\k@series{#1}%
- \expandafter\series@maybe@drop@one@m\expandafter{\k@series}\k@series
- }
-\else % !!! pl 3, 4
- \def\set@target@series@kanji#1{%
- \edef\k@series{#1}%
- \edef\k@series{\expandafter\series@drop@one@m\k@series mm\series@drop@one@m}%
- }
-\fi\fi
-\ifnum\ltj@@latex@plv<1500% <=2020-10-01
-\def\merge@kanji@series@#1#2#3\@nil{%
- \def\reserved@a{#3}%
- \ifx\reserved@a\@empty
- \set@target@series@kanji{#2}%
- \else
- \begingroup\let\f@encoding\k@encoding\let\f@family\k@family
- \maybe@load@fontshape\endgroup
- \edef\reserved@a{\k@encoding /\k@family /#1/\k@shape}%
- \ifcsname \reserved@a \endcsname
- \set@target@series@kanji{#1}%
- \else
- \ifcsname \k@encoding /\k@family /#2/\k@shape \endcsname
- \set@target@series@kanji{#2}%
- {\let\curr@fontshape\curr@kfontshape\@font@shape@subst@warning}%
- \else
- \set@target@series@kanji{#3}%
- {\let\curr@fontshape\curr@kfontshape\@font@shape@subst@warning}%
- \fi
- \fi
- \fi
-}
-\def\merge@kanji@shape@#1#2#3\@nil{%
- \def\reserved@a{#3}%
- \ifx\reserved@a\@empty
- \if@shape@roman@kanji
- \set@safe@kanji@shape{#2}{}%
- \else
- \edef\k@shape{#2}%
- \fi
- \else
- \begingroup\let\f@encoding\k@encoding\let\f@family\k@family
- \maybe@load@fontshape\endgroup
- \edef\reserved@a{\k@encoding /\k@family /\k@series/#1}%
- \ifcsname \reserved@a\endcsname
- \edef\k@shape{#1}%
- \else
- \ifcsname \k@encoding /\k@family /\k@series/#2\endcsname
- \edef\k@shape{#2}%
- {\let\curr@fontshape\curr@kfontshape\@font@shape@subst@warning}%
- \else
- \if@shape@roman@kanji
- \set@safe@kanji@shape{#3}%
- {{\let\curr@fontshape\curr@kfontshape\@font@shape@subst@warning}}%
- \else
- \edef\k@shape{#3}%
- {\let\curr@fontshape\curr@kfontshape\@font@shape@subst@warning}%
- \fi
- \fi
- \fi
- \fi
-}
-\else % >=2021-06-01
\def\merge@kanji@series@#1#2#3\@nil{%
\def\reserved@a{#3}%
\ifx\reserved@a\@empty
@@ -892,20 +751,8 @@
\fi
}
\let\delayed@merge@kanji@shape\merge@kanji@shape@without@substitution
-\fi
\newif\if@forced@series@kanji
-\ifnum\ltj@@latex@plv=300 % 2020-02-02 pl3, 4
- \DeclareRobustCommand\romanseries[1]{\merge@font@series{#1}}
- \DeclareRobustCommand\kanjiseries[1]{\merge@kanji@series{#1}}
- \DeclareRobustCommand\romanseriesforce[1]{\edef\f@series{#1}}
- \DeclareRobustCommand\kanjiseriesforce[1]{\edef\k@series{#1}}
-\else\ifnum\ltj@@latex@plv<1500% >=2020-02-02 pl5 and <=2020-10-01
- \DeclareRobustCommand\romanseries[1]{\@forced@seriesfalse\merge@font@series{#1}}
- \DeclareRobustCommand\kanjiseries[1]{\@forced@series@kanjifalse\merge@kanji@series{#1}}
- \DeclareRobustCommand\romanseriesforce[1]{\@forced@seriestrue\edef\f@series{#1}}
- \DeclareRobustCommand\kanjiseriesforce[1]{\@forced@series@kanjitrue\edef\k@series{#1}}
-\else% >=2021-06-01
\DeclareRobustCommand\romanseries[1]{\@forced@seriesfalse
\expandafter\def\expandafter\delayed@f@adjustment\expandafter
{\delayed@f@adjustment\delayed@merge@font@series{#1}}}
@@ -919,22 +766,9 @@
\expandafter\def\expandafter\delayed@k@adjustment\expandafter
{\delayed@k@adjustment\edef\k@series{#1}}}
\let\delayed@k@adjustment\@empty
-\fi\fi
\DeclareRobustCommand\fontseries[1]{\kanjiseries{#1}\romanseries{#1}}%
\DeclareRobustCommand\fontseriesforce[1]{\kanjiseriesforce{#1}\romanseriesforce{#1}}%
-\ifnum\ltj@@latex@plv<1500% <=2020-10-01
- \DeclareRobustCommand\romanshape[1]{\merge@font@shape{#1}}
- \DeclareRobustCommand\kanjishape[1]{\merge@kanji@shape{#1}}
- \DeclareRobustCommand\fontshape[1]{%
- \@shape@roman@kanjitrue
- \merge@font@shape{#1}\merge@kanji@shape{#1}%
- \@shape@roman@kanjifalse
- }
- \DeclareRobustCommand\romanshapeforce[1]{\edef\f@shape{#1}}
- \DeclareRobustCommand\kanjishapeforce[1]{\edef\k@shape{#1}}
- \DeclareRobustCommand\fontshapeforce[1]{\set@safe@kanji@shape{#1}{}\romanshapeforce{#1}}
-\else% >=2021-06-01
\DeclareRobustCommand\romanshape[1]{%
\expandafter\def\expandafter\delayed@f@adjustment\expandafter
{\delayed@f@adjustment\delayed@merge@font@shape{#1}}}
@@ -956,9 +790,6 @@
\romanshapeforce{#1}%
\expandafter\def\expandafter\delayed@k@adjustment\expandafter
{\delayed@k@adjustment\set@safe@kanji@shape{#1}{}}}
-\fi
-\ifnum\ltj@@latex@plv>1499
-%%%% LaTeX >= 2021-06-01
\DeclareRobustCommand\usekanji[4]{%
\kanjiencoding{#1}\edef\k@family{#2}%
\set@target@series@kanji{#3}\edef\k@shape{#4}%
@@ -969,42 +800,6 @@
\set@target@series{#3}\edef\f@shape{#4}%
\let\delayed@f@adjustment\@empty
\selectfont\ignorespaces}
-\else\ifnum\ltj@@latex@plv>1000
-%%%% 2021-10-01 PL3 <= LaTeX < 2021-06-01
-\DeclareRobustCommand\usekanji[4]{%
- \kanjiencoding{#1}\edef\k@family{#2}%
- \set@target@series@kanji{#3}\edef\k@shape{#4}%
- \selectfont\ignorespaces}
-\DeclareRobustCommand\useroman[4]{%
- \romanencoding{#1}\edef\f@family{#2}%
- \set@target@series{#3}\edef\f@shape{#4}%
- \selectfont\ignorespaces}
-\else
-%%%% 2020-10-01 <= LaTeX < 2020-10-01 PL3
-\DeclareRobustCommand\usekanji[4]{%
- \kanjiencoding{#1}\edef\k@family{#2}\edef\k@series{#3}\edef\k@shape{#4}%
- \selectfont\ignorespaces}
-\DeclareRobustCommand\useroman[4]{%
- \romanencoding{#1}\edef\f@family{#2}\edef\f@series{#3}\edef\f@shape{#4}%
- \selectfont\ignorespaces}
-\fi\fi
-%%%% LaTeX >= 2020-02-02 END
-\else
-%%%% LaTeX 2019-10-01
-\DeclareRobustCommand\romanseries[1]{\edef\f@series{#1}}
-\DeclareRobustCommand\kanjiseries[1]{\edef\k@series{#1}}
-\DeclareRobustCommand\fontseries[1]{\kanjiseries{#1}\romanseries{#1}}
-\DeclareRobustCommand\romanshape[1]{\edef\f@shape{#1}}
-\DeclareRobustCommand\kanjishape[1]{\edef\k@shape{#1}}
-\DeclareRobustCommand\fontshape[1]{\set@safe@kanji@shape{#1}{}\romanshape{#1}}
-\DeclareRobustCommand\usekanji[4]{%
- \kanjiencoding{#1}\kanjifamily{#2}\kanjiseries{#3}\kanjishape{#4}%
- \selectfont\ignorespaces}
-\DeclareRobustCommand\useroman[4]{%
- \romanencoding{#1}\romanfamily{#2}\romanseries{#3}\romanshape{#4}%
- \selectfont\ignorespaces}
-%%%% LaTeX 2019-10-01 END
-\fi
%%%%
\def\set@safe@kanji@shape#1#2{%
@@ -1026,8 +821,6 @@
\else\useroman{#1}{#2}{#3}{#4}%
\fi}
-\ifnum 0\ifltj@ltfilehook@avail1\fi\ifdefined\@rmfamilyhook1\fi>0
-%%%% LaTeX >= 2020-02-02
\let\prepare@family@series@update@kanji=\prepare@family@series@update
\patchcmd\prepare@family@series@update{\fontfamily}{\romanfamily}{}{}
\patchcmd\prepare@family@series@update@kanji{\if@forced@series}{\if@forced@series@kanji}{}{}
@@ -1049,34 +842,16 @@
\patchcmd\update@series@target@value@kanji{\f@series}{\k@series}{}{}
\def\@meta@family@list@kanji{\@elt{mc}\@elt{gt}\@elt{jtt}}
-\def\@ltj@hook@series@default#1#2#3{%
- \ifltj@ltfilehook@avail % 2020-10-01
- \AddToHook{#1/defaults}{#2}%
- \else\ifcsname @set#1defaultshook\endcsname %after 2020-04-07
- \expandafter\g@addto@macro\csname @set#1defaultshook\endcsname{#2}%
- \else % 2020-02-02
- \expandafter\patchcmd\csname #1 \endcsname{#3}{#3#2}{}{}%
- \fi\fi
-}
-\@ltj@hook@series@default{bfseries}{%
+\AddToHook{bfseries/defaults}{%
\let\bfseries@mc\bfdef@ult
\let\bfseries@gt\bfdef@ult
\let\bfseries@jtt\bfdef@ult
-}{%
- \let\bfseries@rm\bfdef@ult
- \let\bfseries@sf\bfdef@ult
- \let\bfseries@tt\bfdef@ult
}
-\@ltj@hook@series@default{mdseries}{%
+\AddToHook{mdseries/defaults}{%
\let\mdseries@mc\mddef@ult
\let\mdseries@gt\mddef@ult
\let\mdseries@jtt\mddef@ult
-}{%
- \let\mdseries@rm\mddef@ult
- \let\mdseries@sf\mddef@ult
- \let\mdseries@tt\mddef@ult
}
-\let\@ltj@hook@series@default\@undefined
\expandafter\patchcmd\csname bfseries \endcsname{%
\ifx\f@family\rmdef@ult \fontseries\bfseries@rm
@@ -1105,105 +880,41 @@
\fi\fi\fi
}{}{}
-\def\@ltj@hook@series#1#2{%
- \ifltj@ltfilehook@avail % 2020-10-01
- \AddToHook{#1}{#2}%
- \else % 2020-02-02
- \expandafter\patchcmd\csname #1 \endcsname{\selectfont}{#2\selectfont}{}{}%
- \fi
-}
-\@ltj@hook@series{bfseries}{%
+\AddToHook{bfseries}{%
\ifx\k@family\mcdef@ult \kanjiseries\bfseries@mc
\else\ifx\k@family\gtdef@ult \kanjiseries\bfseries@gt
\else\ifx\k@family\jttdef@ult\kanjiseries\bfseries@jtt
\else \kanjiseries\bfdefault
\fi\fi\fi
}
-\@ltj@hook@series{mdseries}{%
+\AddToHook{mdseries}{%
\ifx\k@family\mcdef@ult \kanjiseries\mdseries@mc
\else\ifx\k@family\gtdef@ult \kanjiseries\mdseries@gt
\else\ifx\k@family\jttdef@ult\kanjiseries\mdseries@jtt
\else \kanjiseries\mddefault
\fi\fi\fi
}
-\let\@ltj@hook@series\@undefined
-\def\@ltj@hook@efd#1#2{%
- \ifltj@ltfilehook@avail % 2020-10-01
- \AddToHook{expand@font@defaults}{#1}%
- \else\ifdefined\@expandfontdefaultshook %after 2020-04-07
- \g@addto@macro\@expandfontdefaultshook{#1#2}%
- \else % 2020-02-02
- \appto\expand@font@defaults{#1#2}%
- \fi\fi
-}
-\@ltj@hook@efd{%
+\AddToHook{expand@font@defaults}{%
\edef\mcdef@ult{\mcdefault}%
\edef\gtdef@ult{\gtdefault}%
\edef\jttdef@ult{\jttdefault}%
-}{\edef\kanjidef@ult{\kanjifamilydefault}}
-\let\@ltj@hook@efd\@undefined
+ \edef\kanjidef@ult{\kanjifamilydefault}}
-\ifltj@ltfilehook@avail % 2020-10-01
- \appto\init@series@setup{%
- \ifx\kanjiseriesdefault\kanjiseriesdefault@kernel
- \mdseries
- \let\kanjiseriesdefault\k@series
- \fi
- }
-\else
- \appto\init@series@setup{%
- \ifx\kanjidef@ult\mcdef@ult \mcfamily
- \else\ifx\kanjidef@ult\gtdef@ult \gtfamily
- \else\ifx\kanjidef@ult\jttdef@ult \jttfamily
- \fi\fi\fi
- }
-\fi
-
-\def\@ltj@hook@dfh#1{%
- \ifltj@ltfilehook@avail % 2020-10-01
- \AddToHook{normalfont}{#1}%
- \else\ifdefined\@defaultfamilyhook
- \g@addto@macro\@defaultfamilyhook{#1}%
- \else % 2020-02-02
- \expandafter\patchcmd\csname normalfont \endcsname{\selectfont}{#1\selectfont}{}{}%
- \let\reset@font\normalfont
- \fi\fi
+\appto\init@series@setup{%
+ \ifx\kanjiseriesdefault\kanjiseriesdefault@kernel
+ \mdseries
+ \let\kanjiseriesdefault\k@series
+ \fi
}
-\ifnum\ltj@@latex@plv>1499
-\@ltj@hook@dfh{%
+\AddToHook{normalfont}{%
\kanjiencoding{\kanjiencodingdefault}%
\edef\k@family{\kanjifamilydefault}%
\edef\k@series{\kanjiseriesdefault}%
\edef\k@shape{\kanjishapedefault}%
\let\delayed@k@adjustment\empty
}
-\else
-\@ltj@hook@dfh{%
- \kanjiencoding{\kanjiencodingdefault}%
- \edef\k@family{\kanjifamilydefault}%
- \edef\k@series{\kanjiseriesdefault}%
- \edef\k@shape{\kanjishapedefault}%
-}
-\fi
-\let\@ltj@hook@dfh\@undefined
-%%%% LaTeX >= 2020-02-02 END
-\else
-%%%% LaTeX 2019-10-01
-\DeclareRobustCommand\normalfont{%
- \useroman\encodingdefault\familydefault\seriesdefault\shapedefault
- \usekanji\kanjiencodingdefault\kanjifamilydefault\kanjiseriesdefault\kanjishapedefault}
-\let\reset@font\normalfont
-%%%% LaTeX 2019-10-01 END
-\fi
-
-
-
-\ifdefined\prepare@family@series@update@kanji\else
-%%%% LaTeX 2019-10-01
-\def\prepare@family@series@update@kanji#1{\kanjifamily}
-\fi
\DeclareRobustCommand\mcfamily{%
\unless\ifltj@disablejfam\not@math@alphabet\mcfamily\mathmc\fi
diff --git a/Master/texmf-dist/tex/luatex/luatexja/patches/lltjp-array.sty b/Master/texmf-dist/tex/luatex/luatexja/patches/lltjp-array.sty
index 9575dc3c049..80051535716 100644
--- a/Master/texmf-dist/tex/luatex/luatexja/patches/lltjp-array.sty
+++ b/Master/texmf-dist/tex/luatex/luatexja/patches/lltjp-array.sty
@@ -3,7 +3,7 @@
%
\NeedsTeXFormat{LaTeX2e}
-\ProvidesPackage{lltjp-array}[2019-07-18 Patch to array for LuaTeX-ja]
+\ProvidesPackage{lltjp-array}[2024-06-10 Patch to array for LuaTeX-ja]
\RequirePackage{etoolbox,array}
@@ -11,7 +11,14 @@
\ignorespaces\@sharp\unskip
}{%
\ltj@sharp
-}{}{}
+}{}{% >=2024-06-01
+ \def\ltj@sharp{\relax\pltx@next@inhibitglue\ltjfakeboxbdd\ignorespaces\@sharp\textonly@unskip\ltjfakeboxbdd}
+ \patchcmd\insert@column{%
+ \ignorespaces\@sharp\textonly@unskip
+ }{%
+ \ltj@sharp
+ }{}{}
+}
\@ifpackageloaded{lltjext}{}{%
%% remove extra \xkanjiskip (pLaTeX2e 2016/04/17)
diff --git a/Master/texmf-dist/tex/luatex/luatexja/patches/lltjp-geometry.sty b/Master/texmf-dist/tex/luatex/luatexja/patches/lltjp-geometry.sty
index 67b0f5de7f7..641fa4a34df 100644
--- a/Master/texmf-dist/tex/luatex/luatexja/patches/lltjp-geometry.sty
+++ b/Master/texmf-dist/tex/luatex/luatexja/patches/lltjp-geometry.sty
@@ -3,7 +3,7 @@
%
\NeedsTeXFormat{LaTeX2e}
-\ProvidesPackage{lltjp-geometry}[2021-10-24 Patch to geometry for LuaTeX-ja with vertical writing mode]
+\ProvidesPackage{lltjp-geometry}[2024-05-16 Patch to geometry for LuaTeX-ja with vertical writing mode]
\RequirePackage{expl3}
\ifdefined\if@ltj@@geometry@tate\expandafter\endinput\fi
\newif\if@ltj@@geometry@tate
@@ -31,15 +31,6 @@
%============================================
\unless\ifdefined\ltj@ExecuteAfterPackage
-\expandafter\newif\csname ifltj@ltfilehook@avail\endcsname
-\@ifl@t@r\fmtversion{2020-10-01}{%
- \@ifl@t@r\fmtversion{2020-10-02}{\ltj@ltfilehook@availtrue}
- {%
- \ifnum\patch@level<0\relax \ifnum\patch@level<-6 \ltj@ltfilehook@availtrue\fi
- \else\ltj@ltfilehook@availtrue\fi
- }%
-}{}
-\ifltj@ltfilehook@avail
%% \ltj@ExecuteBeforePackage <package><code> and \ltj@ExecuteAfterPackage <package><code>
%% no-starred version: do nothing if the <package> is loaded
%% starred version: do <code> right away if the <package> is loaded
@@ -64,11 +55,6 @@
\@ifpackageloaded{#1}{#2}{\@@ltj@ExecuteBeforePackage{#1}{#2}}%
}
}
-\else
- \RequirePackage{filehook}
- \let\ltj@ExecuteAfterPackage=\AtEndOfPackageFile
- \let\ltj@ExecuteBeforePackage=\AtBeginOfPackageFile
-\fi
\fi
%============================================
@@ -89,12 +75,8 @@
\else
\@gobble\iftrue\csname iftdir\endcsname \bool_set_true:N \l_tmpa_bool \fi
\fi
-\ifltj@ltfilehook@avail
- \prop_map_inline:Nn \g__hook_begindocument_code_prop
- { \tl_if_in:nnT {#2} {\tate} {\bool_set_true:N \l_tmpa_bool} }
-\else
- \tl_if_in:NnT \@begindocumenthook {\tate} {\bool_set_true:N \l_tmpa_bool}
-\fi
+\prop_map_inline:Nn \g__hook_begindocument_code_prop
+ { \tl_if_in:nnT {#2} {\tate} {\bool_set_true:N \l_tmpa_bool} }
\bool_if:NT \l_tmpa_bool {
\if@ltj@@geometry@forceoff
\@ltj@@geometry@tatefalse
diff --git a/Master/texmf-dist/tex/luatex/luatexja/patches/lltjp-siunitx.sty b/Master/texmf-dist/tex/luatex/luatexja/patches/lltjp-siunitx.sty
index 9c4526c3fdb..292cbf00bfe 100644
--- a/Master/texmf-dist/tex/luatex/luatexja/patches/lltjp-siunitx.sty
+++ b/Master/texmf-dist/tex/luatex/luatexja/patches/lltjp-siunitx.sty
@@ -1,5 +1,5 @@
%
-% lltjp-siunitx.sty 2022-12-14
+% lltjp-siunitx.sty 2024-06-10
%
\NeedsTeXFormat{LaTeX2e}
@@ -7,7 +7,6 @@
\RequirePackage{siunitx}
\makeatletter
\ExplSyntaxOn
-\cs_if_exist:NTF \siunitx_print_text:n {% siunitx v3.00
\cs_set_protected:Npn \siunitx_print_text:n #1
{
\text
@@ -32,104 +31,26 @@
}
}
\cs_set_eq:NN \ltj_orig__siunitx_table_collect_begin:w \__siunitx_table_collect_begin:w
-\cs_set_protected:Npn \__siunitx_table_collect_begin:w #1 \relax
- { \ltj_orig__siunitx_table_collect_begin:w }
-\RenewDocumentCommand \tablenum { O { } m }
- {
- \mode_leave_vertical:
- \group_begin:
- \keys_set:nn { siunitx } {#1}
- \siunitx_cell_begin:w
- \relax \ignorespaces #2
- \siunitx_cell_end:
- \group_end:
- }
-}% siunitx v3.00 end
-{% siunitx v2.xx
-\cs_generate_variant:Nn \tl_if_in:NnT { coT }
-\cs_new:Nn \__ltj_siunix_patch_inner:n {
- \cs_if_exist:cT { #1_tl } {
- \tl_if_in:coT { #1_tl } { \tex_char:D } {
- \tl_replace_all:cnn { #1_tl } { \tex_char:D } { \ltjalchar }
- }
+\cs_set_protected:Npn \__siunitx_table_collect_begin:w #1 {
+ \token_if_eq_meaning:NNTF #1 \relax
+ {\ltj_orig__siunitx_table_collect_begin:w }
+ {\ltj_orig__siunitx_table_collect_begin:w #1 }
}
-}
-\cs_new:Nn \__ltj_siunix_patch_inner_math:n {
- \__ltj_siunix_patch_inner:n { l__siunitx_#1_math }
- \__ltj_siunix_patch_inner:n { l__siunitx_#1_text }
-}
-\AtBeginDocument {
- \__ltj_siunix_patch_inner:n { c__siunitx_minus }
- \__ltj_siunix_patch_inner:n { c__siunitx_mu }
- \__ltj_siunix_patch_inner_math:n { angstrom }
- \__ltj_siunix_patch_inner_math:n { arcminute }
- \__ltj_siunix_patch_inner_math:n { arcsecond }
- \__ltj_siunix_patch_inner_math:n { ohm }
-}
-
-%%%% new table column: S and s
-\bool_new:N \l__ltj_siunitx_table_collect_relax_bool
-\cs_set_protected:Npn \__siunitx_table_collect_begin_s: {
- \bool_set_false:N \l__ltj_siunitx_table_collect_relax_bool
- \cs_set_eq:NN \__siunitx_table_collect_token:N
- \__siunitx_table_collect_token_s:N
- \cs_set_eq:NN \__siunitx_table_print: \__siunitx_table_print_s:
- \__siunitx_table_collect_init_s:
- \__siunitx_table_collect_get:
-}
-
-\cs_set_protected:Npn \__siunitx_table_collect_not_braced:N #1
+\cs_set_protected:Npn \__siunitx_table_collect_token:N #1
{
- \token_if_eq_meaning:NNTF #1 \tex_relax:D {
- \bool_if:NTF \l__ltj_siunitx_table_collect_relax_bool {
- \__siunitx_table_collect_not_braced_aux_i:N #1
- } {
- \bool_set_true:N \l__ltj_siunitx_table_collect_relax_bool
- }
- } {
- \token_if_eq_meaning:NNF #1 \ltjfakeboxbdd {
- \token_if_eq_meaning:NNF #1 \pltx@next@inhibitglue {
- \token_if_eq_meaning:NNF #1 \tex_ignorespaces:D
+ \__siunitx_table_collect_search:NnF #1
{
- \token_if_eq_meaning:NNF #1 \tex_unskip:D
- { \__siunitx_table_collect_not_braced_aux_i:N #1 }
+ \ignorespaces { \__siunitx_table_collect_ignore_spaces:N #1}
+ \pltx@next@inhibitglue { \__siunitx_table_collect_loop:}
+ \ltjfakeboxbdd { \__siunitx_table_collect_loop:}
+ \textonly@unskip { \__siunitx_table_collect_loop:}
+ \unskip { \__siunitx_table_collect_loop:}
+ \end { \tabularnewline \end }
+ \relax { \__siunitx_table_collect_relax:N #1 }
+ \tabularnewline { \tabularnewline }
+ \siunitx_cell_end: { \siunitx_cell_end:}
}
- }}}
- \__siunitx_table_collect_next:
- }
-
-\AtBeginDocument
- {
- \@ifpackageloaded { mdwtab }
- {
- \cs_set_protected:Npn \__siunitx_table_collect_not_braced:N #1
- {
- \token_if_eq_meaning:NNTF #1 \tex_relax:D {
- \bool_if:NTF \l__ltj_siunitx_table_collect_relax_bool {
- \__siunitx_table_collect_not_braced_aux_i:N #1
- } {
- \bool_set_true:N \l__ltj_siunitx_table_collect_relax_bool
- }
- } {
- \token_if_eq_meaning:NNF #1 \ltjfakeboxbdd {
- \token_if_eq_meaning:NNF #1 \pltx@next@inhibitglue {
- \token_if_eq_meaning:NNF #1 \tex_ignorespaces:D
- {
- \token_if_eq_meaning:NNF #1 \tex_unskip:D
- {
- \token_if_eq_meaning:NNF #1 \tab@setcr
- {
- \token_if_eq_meaning:NNF #1 \@maybe@unskip
- { \__siunitx_table_collect_not_braced_aux_i:N #1 }
- }
- }
- }
- }}}
- \__siunitx_table_collect_next:
- }
- }
- { }
- }
+ { \__siunitx_table_collect_token_aux:N #1 }
}
\ExplSyntaxOff
\endinput
diff --git a/Master/texmf-dist/tex/luatex/luaxml/luaxml-cssquery.lua b/Master/texmf-dist/tex/luatex/luaxml/luaxml-cssquery.lua
index ebb29abb15c..452656845c4 100644
--- a/Master/texmf-dist/tex/luatex/luaxml/luaxml-cssquery.lua
+++ b/Master/texmf-dist/tex/luatex/luaxml/luaxml-cssquery.lua
@@ -156,7 +156,7 @@ local function cssquery()
-- make sure we deal with a string
value = tostring(value)
-- make the search string safe for pattern matching
- local escaped_search = search:gsub("([%(%)%.%%%+%–%*%?%[%^%$])", "%%%1")
+ local escaped_search = search:gsub("([%(%)%.%%%+%-%#%*%?%[%^%$])", "%%%1")
if modifier == "" then
return value == search
elseif modifier == "|" then
@@ -434,6 +434,18 @@ local function cssquery()
return querylist
end
+ --- Remove selector from the CSS list object.
+ -- All actions that literaly match the given selector will be removed.
+ function CssQuery:remove_selector(
+ selector -- CSS selector to be removed
+ )
+ for pos, obj in ipairs(self.querylist) do
+ if obj.source == selector then
+ table.remove(self.querylist, pos)
+ end
+ end
+ end
+
--- It tests list of queries agaings a DOM element and executes the
--- coresponding function that is saved for the matched query.
-- @return nothing
diff --git a/Master/texmf-dist/tex/luatex/luaxml/luaxml-domobject.lua b/Master/texmf-dist/tex/luatex/luaxml/luaxml-domobject.lua
index 73689add5a1..dca38df0db5 100644
--- a/Master/texmf-dist/tex/luatex/luaxml/luaxml-domobject.lua
+++ b/Master/texmf-dist/tex/luatex/luaxml/luaxml-domobject.lua
@@ -6,16 +6,20 @@ local dom = {}
local xml
local handler
local css_query
+local html
if kpse then
xml = require("luaxml-mod-xml")
handler = require("luaxml-mod-handler")
css_query = require("luaxml-cssquery")
+ html = require("luaxml-mod-html")
else
xml = require("luaxml.mod-xml")
handler = require("luaxml.mod-handler")
css_query = require("luaxml.cssquery")
+ html = require("luaxml.mod-html")
end
+local HtmlParser = html.HtmlParser
local void = {area = true, base = true, br = true, col = true, hr = true, img = true, input = true, link = true, meta = true, param = true}
@@ -91,9 +95,14 @@ local function serialize_dom(parser, current,level, output)
local format = get_action(typ, "start")
insert(format, el, prepare_attributes(attr))
end
- local function text(typ, text)
+ local function text(typ, text, parent)
+ local parent = parent or {}
local format = get_action(typ, "text")
- insert(format, escape_element(text))
+ if parent.verbatim then
+ insert(format, text)
+ else
+ insert(format, escape_element(text))
+ end
end
local function stop(typ, el)
local format = get_action(typ, "stop")
@@ -141,7 +150,7 @@ local function serialize_dom(parser, current,level, output)
end
start(xtype, name, attributes)
- text(xtype,text_content)
+ text(xtype,text_content, (current or {})._parent)
local children = root._children or {}
for _, child in ipairs(children) do
output = serialize_dom(parser,child, level + 1, output)
@@ -411,8 +420,8 @@ local parse = function(
return strings
end
- --- Get table with the inner text of an element -- leading and trailing spaces are removed and elements that contain only white space are ignored.
- --- @return table
+ --- Get table with the inner text of an element - leading and trailing spaces are removed and elements that contain only white space are ignored.
+ -- @return table
function DOM_Object:stripped_strings(
current --- [optional] element to be selected
)
@@ -612,11 +621,83 @@ local parse = function(
-- include the methods to all xml nodes
save_methods(parser._handler.root)
-- parser:
- return parser
+ return parser, DOM_Object
+end
+
+-- table of elements that should be kept without XML escaping in the DOM serialization
+local verbatim_elements = {script=true, style=true}
+
+local function html_to_dom(html_object)
+ -- convert parsed HTML DOM to the XML DOM
+ local dom, DOM_Object = parse("") -- use empty text to just initialize the DOM object
+ -- use root of the DOM object as the original parent
+ local current_parent = dom._handler.root
+
+ local function create_node(tbl)
+ -- create node suitable for LuaXML DOM object
+ tbl._children = {}
+ -- this should copy methods from the DOM object to the newly created object
+ tbl.__index = DOM_Object
+ return setmetatable(tbl, DOM_Object)
+ end
+
+ local function build_tree(object)
+ -- convert tree produced by the HTML parser to LuaXML DOM
+ local typ = object._type
+ -- process particular node types from the HTML parser
+ if typ == "doctype" then
+ current_parent:add_child_node(create_node {_name=object.name, _type="DTD"})
+ elseif typ == "comment" then
+ current_parent:add_child_node(create_node {_text=object.text, _type="COMMENT"})
+ elseif typ == "element" then
+ local attributes = {}
+ -- convert attributes to the form expected by the DOM object
+ for _, attr in ipairs(object.attr) do
+ attributes[attr.name] = attr.value
+ end
+ local element = current_parent:create_element(object.tag, attributes)
+ -- disable escaping of text in dom:serialize() for <script> or <style> elements
+ if verbatim_elements[string.lower(object.tag)] then element.verbatim = true end
+ current_parent:add_child_node(element)
+ -- set the current element as parent for the processing of children
+ local old_parent = current_parent
+ current_parent = element
+ -- process children
+ for k,v in ipairs(object.children) do
+ build_tree(v)
+ end
+ -- restore original parent
+ current_parent = old_parent
+ elseif typ == "text" then
+ local text = current_parent:create_text_node(object.text)
+ current_parent:add_child_node(text)
+ else
+ -- for other node types, just process the children
+ for k,v in ipairs(object.children) do
+ build_tree(v)
+ end
+ end
+
+ end
+ build_tree(html_object)
+ return dom
+end
+
+--- Parse HTML text as a DOM object.
+-- It supports all methods as the object returned by the parse() function.
+-- @param html_str string with the HTML code to be parsed
+-- @return DOM_Object
+local function html_parse(html_str)
+ local html_obj = HtmlParser:init(html_str)
+ local html_dom = html_obj:parse()
+ return html_to_dom(html_dom)
end
+
+
--- @export
return {
parse = parse,
- serialize_dom= serialize_dom
+ serialize_dom= serialize_dom,
+ html_parse = html_parse
}
diff --git a/Master/texmf-dist/tex/luatex/luaxml/luaxml-encodings.lua b/Master/texmf-dist/tex/luatex/luaxml/luaxml-encodings.lua
new file mode 100644
index 00000000000..71bfc81dd1b
--- /dev/null
+++ b/Master/texmf-dist/tex/luatex/luaxml/luaxml-encodings.lua
@@ -0,0 +1,88 @@
+--- Convert 8-bit encodings to UTF-8
+--- @module luaxml-encodings
+-- this table is generated automatically by this command:
+-- texlua encodings/make_encodings.lua
+local encodings = {
+ ['ibm866'] = 'АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмноп░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀рстуфхцчшщъыьэюяЁёЄєЇїЎў°∙·√№¤■ ',
+ ['iso-8859-5'] = '�������������������������������� ЁЂЃЄЅІЇЈЉЊЋЌ­ЎЏАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя№ёђѓєѕіїјљњћќ§ўџ',
+ ['macintosh'] = 'ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûü†°¢£§•¶ß®©™´¨≠ÆØ∞±≤≥¥µ∂∑∏π∫ªºΩæø¿¡¬√ƒ≈∆«»… ÀÃÕŒœ–—“”‘’÷◊ÿŸ⁄€‹›fifl‡·‚„‰ÂÊÁËÈÍÎÏÌÓÔÒÚÛÙıˆ˜¯˘˙˚¸˝˛ˇ',
+ ['windows-1251'] = 'ЂЃ‚ѓ„…†‡€‰Љ‹ЊЌЋЏђ‘’“”•–—�™љ›њќћџ ЎўЈ¤Ґ¦§Ё©Є«¬­®Ї°±Ііґµ¶·ё№є»јЅѕїАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя',
+ ['iso-8859-13'] = '�������������������������������� ”¢£¤„¦§Ø©Ŗ«¬­®Æ°±²³“µ¶·ø¹ŗ»¼½¾æĄĮĀĆÄÅĘĒČÉŹĖĢĶĪĻŠŃŅÓŌÕÖ×ŲŁŚŪÜŻŽßąįāćäåęēčéźėģķīļšńņóōõö÷ųłśūüżž’',
+ ['iso-8859-6'] = '�������������������������������� ���¤�������،­�������������؛���؟�ءآأؤإئابةتثجحخدذرزسشصضطظعغ�����ـفقكلمنهوىيًٌٍَُِّْ',
+ ['iso-8859-8'] = '�������������������������������� �¢£¤¥¦§¨©×«¬­®¯°±²³´µ¶·¸¹÷»¼½¾��������������������������������‗אבגדהוזחטיךכלםמןנסעףפץצקרשת��‎‏',
+ ['iso-8859-4'] = '�������������������������������� ĄĸŖ¤ĨĻ§¨ŠĒĢŦ­Ž¯°ą˛ŗ´ĩļˇ¸šēģŧŊžŋĀÁÂÃÄÅÆĮČÉĘËĖÍÎĪĐŅŌĶÔÕÖ×ØŲÚÛÜŨŪßāáâãäåæįčéęëėíîīđņōķôõö÷øųúûüũū˙',
+ ['koi8-r'] = '─│┌┐└┘├┤┬┴┼▀▄█▌▐░▒▓⌠■∙√≈≤≥ ⌡°²·÷═║╒ё╓╔╕╖╗╘╙╚╛╜╝╞╟╠╡Ё╢╣╤╥╦╧╨╩╪╫╬©юабцдефгхийклмнопярстужвьызшэщчъЮАБЦДЕФГХИЙКЛМНОПЯРСТУЖВЬЫЗШЭЩЧЪ',
+ ['iso-8859-7'] = '�������������������������������� ‘’£€₯¦§¨©ͺ«¬­�―°±²³΄΅Ά·ΈΉΊ»Ό½ΎΏΐΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡ�ΣΤΥΦΧΨΩΪΫάέήίΰαβγδεζηθικλμνξοπρςστυφχψωϊϋόύώ',
+ ['iso-8859-3'] = '�������������������������������� Ħ˘£¤�Ĥ§¨İŞĞĴ­�Ż°ħ²³´µĥ·¸ışğĵ½�żÀÁÂ�ÄĊĈÇÈÉÊËÌÍÎÏ�ÑÒÓÔĠÖ×ĜÙÚÛÜŬŜßàáâ�äċĉçèéêëìíîï�ñòóôġö÷ĝùúûüŭŝ˙',
+ ['windows-1256'] = '€پ‚ƒ„…†‡ˆ‰ٹ‹Œچژڈگ‘’“”•–—ک™ڑ›œ‌‍ں ،¢£¤¥¦§¨©ھ«¬­®¯°±²³´µ¶·¸¹؛»¼½¾؟ہءآأؤإئابةتثجحخدذرزسشصض×طظعغـفقكàلâمنهوçèéêëىيîïًٌٍَôُِ÷ّùْûü‎‏ے',
+ ['windows-1258'] = '€�‚ƒ„…†‡ˆ‰�‹Œ����‘’“”•–—˜™�›œ��Ÿ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂĂÄÅÆÇÈÉÊË̀ÍÎÏĐÑ̉ÓÔƠÖ×ØÙÚÛÜỮßàáâăäåæçèéêë́íîïđṇ̃óôơö÷øùúûüư₫ÿ',
+ ['iso-8859-14'] = '�������������������������������� Ḃḃ£ĊċḊ§Ẁ©ẂḋỲ­®ŸḞḟĠġṀṁ¶ṖẁṗẃṠỳẄẅṡÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏŴÑÒÓÔÕÖṪØÙÚÛÜÝŶßàáâãäåæçèéêëìíîïŵñòóôõöṫøùúûüýŷÿ',
+ ['windows-1252'] = '€�‚ƒ„…†‡ˆ‰Š‹Œ�Ž��‘’“”•–—˜™š›œ�žŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ',
+ ['iso-8859-15'] = '�������������������������������� ¡¢£€¥Š§š©ª«¬­®¯°±²³Žµ¶·ž¹º»ŒœŸ¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ',
+ ['x-mac-cyrillic'] = 'АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ†°Ґ£§•¶І®©™Ђђ≠Ѓѓ∞±≤≥іµґЈЄєЇїЉљЊњјЅ¬√ƒ≈∆«»… ЋћЌќѕ–—“”‘’÷„ЎўЏџ№Ёёяабвгдежзийклмнопрстуфхцчшщъыьэю€',
+ ['windows-1254'] = '€�‚ƒ„…†‡ˆ‰Š‹Œ����‘’“”•–—˜™š›œ��Ÿ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏĞÑÒÓÔÕÖ×ØÙÚÛÜİŞßàáâãäåæçèéêëìíîïğñòóôõö÷øùúûüışÿ',
+ ['windows-1255'] = '€�‚ƒ„…†‡ˆ‰�‹�����‘’“”•–—˜™�›���� ¡¢£₪¥¦§¨©×«¬­®¯°±²³´µ¶·¸¹÷»¼½¾¿ְֱֲֳִֵֶַָֹֺֻּֽ־ֿ׀ׁׂ׃װױײ׳״�������אבגדהוזחטיךכלםמןנסעףפץצקרשת��‎‏',
+ ['windows-1250'] = '€�‚�„…†‡�‰Š‹ŚŤŽŹ�‘’“”•–—�™š›śťžź ˇ˘Ł¤Ą¦§¨©Ş«¬­®Ż°±˛ł´µ¶·¸ąş»Ľ˝ľżŔÁÂĂÄĹĆÇČÉĘËĚÍÎĎĐŃŇÓÔŐÖ×ŘŮÚŰÜÝŢßŕáâăäĺćçčéęëěíîďđńňóôőö÷řůúűüýţ˙',
+ ['koi8-u'] = '─│┌┐└┘├┤┬┴┼▀▄█▌▐░▒▓⌠■∙√≈≤≥ ⌡°²·÷═║╒ёє╔ії╗╘╙╚╛ґў╞╟╠╡ЁЄ╣ІЇ╦╧╨╩╪ҐЎ©юабцдефгхийклмнопярстужвьызшэщчъЮАБЦДЕФГХИЙКЛМНОПЯРСТУЖВЬЫЗШЭЩЧЪ',
+ ['iso-8859-10'] = '�������������������������������� ĄĒĢĪĨĶ§ĻĐŠŦŽ­ŪŊ°ąēģīĩķ·ļđšŧž―ūŋĀÁÂÃÄÅÆĮČÉĘËĖÍÎÏÐŅŌÓÔÕÖŨØŲÚÛÜÝÞßāáâãäåæįčéęëėíîïðņōóôõöũøųúûüýþĸ',
+ ['windows-1257'] = '€�‚�„…†‡�‰�‹�¨ˇ¸�‘’“”•–—�™�›�¯˛� �¢£¤�¦§Ø©Ŗ«¬­®Æ°±²³´µ¶·ø¹ŗ»¼½¾æĄĮĀĆÄÅĘĒČÉŹĖĢĶĪĻŠŃŅÓŌÕÖ×ŲŁŚŪÜŻŽßąįāćäåęēčéźėģķīļšńņóōõö÷ųłśūüżž˙',
+ ['windows-1253'] = '€�‚ƒ„…†‡�‰�‹�����‘’“”•–—�™�›���� ΅Ά£¤¥¦§¨©�«¬­®―°±²³΄µ¶·ΈΉΊ»Ό½ΎΏΐΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡ�ΣΤΥΦΧΨΩΪΫάέήίΰαβγδεζηθικλμνξοπρςστυφχψωϊϋόύώ',
+ ['iso-8859-2'] = '�������������������������������� Ą˘Ł¤ĽŚ§¨ŠŞŤŹ­ŽŻ°ą˛ł´ľśˇ¸šşťź˝žżŔÁÂĂÄĹĆÇČÉĘËĚÍÎĎĐŃŇÓÔŐÖ×ŘŮÚŰÜÝŢßŕáâăäĺćçčéęëěíîďđńňóôőö÷řůúűüýţ˙',
+ ['windows-874'] = '€����…�����������‘’“”•–—�������� กขฃคฅฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภมยรฤลฦวศษสหฬอฮฯะัาำิีึืฺุู����฿เแโใไๅๆ็่้๊๋์ํ๎๏๐๑๒๓๔๕๖๗๘๙๚๛',
+ ['iso-8859-16'] = '�������������������������������� ĄąŁ€„Š§š©Ș«Ź­źŻ°±ČłŽ”¶·žčș»ŒœŸżÀÁÂĂÄĆÆÇÈÉÊËÌÍÎÏĐŃÒÓÔŐÖŚŰÙÚÛÜĘȚßàáâăäćæçèéêëìíîïđńòóôőöśűùúûüęțÿ',
+}
+
+
+local utfchar = utf8.char
+
+--- Try to find an encoding in HTML string
+---@param str string HTML document
+---@param len number count of characters from the start of the string where it should search for the encoding metadata
+---@return string encoding identifier, or nil and message if no encoding was found
+local function find_html_encoding(str, len)
+ -- try to find encoding in the html document
+ -- we limit search length, because encoding should be in the document head, ideally near the start
+ local len = len or 4096
+ local sub = str:sub(1, len)
+ for meta in sub:gmatch("<meta (.-)>") do
+ local charset = meta:match("charset%s*=%s*[\"']?(.-)[\"']")
+ if charset then return string.lower(charset) end
+ end
+ return nil, "Cannot find the document encoding"
+end
+
+local function load_mapping(enc_name)
+ local enc_name = enc_name or ""
+ local enc = encodings[enc_name]
+ if not enc then return nil, "Cannot load encoding " .. enc_name end
+ local mapping,i = {}, 128
+ for pos, codepoint in utf8.codes(enc) do
+ mapping[i] = utfchar(codepoint)
+ i = i + 1
+ end
+ return mapping
+end
+
+--- Convert string to utf-8
+---@param text string for converting
+---@param mapping table
+---@return string converted string
+local function recode(text, mapping)
+ return text:gsub("(.)", function(char)
+ local charpoint = string.byte(char)
+ if charpoint > 127 then
+ return mapping[charpoint]
+ else
+ return false
+ end
+ end)
+end
+
+
+return {
+ encodings = encodings,
+ find_html_encoding = find_html_encoding,
+ load_mapping = load_mapping,
+ recode = recode
+}
+
diff --git a/Master/texmf-dist/tex/luatex/luaxml/luaxml-mod-html.lua b/Master/texmf-dist/tex/luatex/luaxml/luaxml-mod-html.lua
index 69e32b16e22..d8c2b7e9327 100644
--- a/Master/texmf-dist/tex/luatex/luaxml/luaxml-mod-html.lua
+++ b/Master/texmf-dist/tex/luatex/luaxml/luaxml-mod-html.lua
@@ -1,3 +1,6 @@
+--- HTML parsing module for LuaXML
+-- @module luaxml-mod-html
+-- @author Michal Hoftich <michal.h21@gmail.com
-- Copyright Michal Hoftich, 2022
-- HTML parser inspired by https://browser.engineering/html.html
-- but then redone using https://html.spec.whatwg.org/multipage/parsing.html
@@ -1540,9 +1543,14 @@ local function is_formatting_element(name)
return formatting_element_names[name]
end
-local special_elements = {}
+local function hash_from_array(tbl)
+ local t = {}
+ for _, v in ipairs(tbl) do t[v] = true end
+ return t
+end
+
-local special_elements_list = {"address", "applet", "area", "article", "aside",
+local special_elements_list = hash_from_array {"address", "applet", "area", "article", "aside",
"base", "basefont", "bgsound", "blockquote", "body", "br", "button", "caption",
"center", "col", "colgroup", "dd", "details", "dir", "div", "dl", "dt",
"embed", "fieldset", "figcaption", "figure", "footer", "form", "frame",
@@ -1555,13 +1563,9 @@ local special_elements_list = {"address", "applet", "area", "article", "aside",
"mi","mo","mn","ms","mtext", "annotation-xml","foreignObject","desc", "title"
}
-for k,v in ipairs(special_elements_list) do
- special_elements[v] = true
-end
-
local function is_special(name)
- return special_elements[name]
+ return special_elements_list[name]
end
-- these lists are used in HtmlParser:generate_implied_endtags()
@@ -1649,8 +1653,12 @@ local HtmlTreeStates = {}
+--- @type HtmlParser
local HtmlParser = {}
+--- Initialize the HTML Object
+---@param body string HTML to be parsed
+---@return table initialized object
function HtmlParser:init(body)
local o ={}
setmetatable(o, self)
@@ -1686,10 +1694,11 @@ for _,v in ipairs(self_closing_tags_list) do self_closing_tags[v] = true end
-
+--- Execute the HTML parser
+--- @return table Root node of the HTML DOM
function HtmlParser:parse()
-- we assume utf8 input, you must convert it yourself if the source is
- -- in a different encoding
+ -- in a different encoding. for example using luaxml-encodings library
self.text = {}
self.state = self.default_state
-- this should enable us to pass over some characters that we want to ignore
@@ -1791,6 +1800,7 @@ function HtmlParser:emit(token)
elseif token_type == "start_tag" then
self:add_text()
-- self:start_attribute()
+ self:reset_insertion_mode()
self:start_tag()
-- print("Emit start tag", table.concat(token.name))
-- save last attribute
@@ -1882,8 +1892,139 @@ function HtmlParser:set_xmlns(node, parent)
end
end
+function HtmlParser:pop_element()
+ -- close the current element and add it to the DOM
+ local el = self:close_element()
+ local parent = self:get_parent()
+ parent:add_child(el)
+ return el
+end
+
+local close_p_at_start = hash_from_array {"address", "article", "aside", "blockquote", "center", "details", "dialog", "dir", "div", "dl", "fieldset", "figcaption", "figure", "footer", "header", "hgroup", "main", "menu", "nav", "ol", "p", "search", "section", "summary", "ul", "pre", "listing", "form", "table", "xmp", "hr"}
+
+local close_headers = hash_from_array {"h1", "h2", "h3", "h4", "h5", "h6"}
+
+local body_modes = hash_from_array {"in_body", "in_cell", "in_row", "in_select", "in_table", "in_table_body", "in_frameset"}
+
+local list_items = hash_from_array {"li", "dt", "dd"}
+
+local close_address_at_end = hash_from_array{"address", "article", "aside", "blockquote", "button", "center", "details", "dialog", "dir", "div", "dl", "fieldset", "figcaption", "figure", "footer", "header", "hgroup", "listing", "main", "menu", "nav", "ol", "pre", "search", "section", "summary", "ul", "form"}
+
+
+function HtmlParser:close_unfinished(name)
+ -- close all unfinished elements until the element with the given name is found
+ for i = #self.unfinished, 1, -1 do
+ local el = self:pop_element()
+ if el.tag == name then
+ break
+ end
+ end
+end
+
+
+function HtmlParser:close_paragraph()
+ -- close currently open <p> elements
+ self:close_unfinished("p")
+end
+
+function HtmlParser:current_element_name()
+ -- return name of the current element
+ return self:get_parent().tag
+end
+
+local not_specials = hash_from_array { "address", "div", "p"}
+
+local function handle_list_item(self, name)
+ -- we handle li, dt and dd. dt and dd should close each other, li closes only itself
+ local names = {dt = true, dd = true}
+ if name == "li" then names = {li=true} end
+ for i = #self.unfinished, 1, -1 do
+ local current = self.unfinished[i]
+ local current_tag = current.tag
+ if names[current_tag] then
+ self:generate_implied_endtags(nil, {current.tag})
+ for j = #self.unfinished, i, -1 do
+ self:pop_element()
+ end
+ break
+ elseif is_special(current_tag) and not not_specials[name] then
+ break
+ end
+ end
+end
+
+local close_paragraph = function(self)
+ if is_in_button_scope(self, "p") then
+ self:close_paragraph()
+ end
+end
+
+function HtmlParser:handle_insertion_mode(token)
+ -- simple handling of https://html.spec.whatwg.org/multipage/parsing.html#tree-construction
+ -- we don't support most rules, just the most important for avoiding mismatched tags
+
+ if body_modes[self.insertion_mode] then
+ if token.type == "start_tag" then
+ local name = table.concat(token.name)
+ if close_p_at_start[name] then close_paragraph(self) end
+ if close_headers[name] then
+ close_paragraph(self)
+ -- close current element if it is already header
+ if close_headers[self:current_element_name()] then
+ self:pop_element()
+ end
+ elseif name == "pre" or name == "listing" then
+ -- we should ignore next "\n" char token
+ elseif name == "image" then
+ -- image tag is an error, change to <img>
+ token.name = {"img"}
+ elseif list_items[name] then
+ handle_list_item(self, name)
+ close_paragraph(self)
+ end
+ elseif token.type == "end_tag" then
+ local name = table.concat(token.name)
+ if close_address_at_end[name] then
+ if is_in_scope(self, name, {}) then
+ self:close_unfinished(name)
+ else
+ token.type = "ignore"
+ end
+ elseif name == "p" then
+ if not is_in_button_scope(self, "p") then
+ local parent = self:get_parent()
+ local node = Element:init("p", parent)
+ table.insert(self.unfinished, node)
+ end
+ -- use self:close_paragraph() instead of close_paragraph() because we don't need to check scope at this point
+ self:close_paragraph()
+ elseif name == "br" then
+ token.type = "start_tag"
+ elseif close_headers[name] then
+ local header_in_scope = false
+ -- detect, if there are any open h1-h6 tag and close it
+ for el, _ in pairs(close_headers) do
+ if is_in_scope(self, el, {}) then
+ header_in_scope = el
+ break
+ end
+ end
+ if not header_in_scope then
+ token.type = "ignore"
+ else
+ self:close_unfinished(header_in_scope)
+ end
+ end
+ end
+ end
+end
+
+local rawtext_elements = hash_from_array {"style", "textarea", "xmp"}
+
+
function HtmlParser:start_tag()
local token = self.current_token
+ self:handle_insertion_mode(token)
if token.type == "start_tag" then
-- close all currently opened attributes
self:start_attribute()
@@ -1894,18 +2035,18 @@ function HtmlParser:start_tag()
node.attr = token.attr
node.self_closing = token.self_closing
self:set_xmlns(node)
- --
+ -- in this handler we should close <p> or <li> elements without explicit closing tags
if token.self_closing -- <img />
or self_closing_tags[name] -- void elements
then
- parent:add_child(node)
+ parent:add_child(node, node.tag)
else
-- add to the unfinished list
table.insert(self.unfinished, node)
end
if name == "title" then
self.element_state = "rcdata"
- elseif name == "style" then
+ elseif rawtext_elements[name] then
self.element_state = "rawtext"
elseif name == "script" then
self.element_state = "script_data"
@@ -1916,11 +2057,13 @@ end
function HtmlParser:end_tag()
-- close current opened element
local token = self.current_token
+ self:handle_insertion_mode(token)
if token.type == "end_tag" then
if #self.unfinished==0 then return nil end
- local node = self:close_element()
- local parent = self:get_parent()
- parent:add_child(node)
+ -- close the current element only if the token is in the current scope
+ if is_in_scope(self, table.concat(token.name), {}) then
+ self:pop_element()
+ end
end
end
@@ -1964,6 +2107,21 @@ function HtmlParser:adjusted_current_node()
end
+local simple_modes = {
+ body = "in_body",
+ td = "in_cell",
+ th = "in_cell",
+ tr = "in_row",
+ tbody = "in_table_body",
+ thead = "in_table_body",
+ tfoot = "in_table_body",
+ caption = "in_caption",
+ colgroup = "in_column_group",
+ table = "in_table",
+ template = "current_template_insertion_mode",
+ frameset = "in_frameset"
+}
+
function HtmlParser:reset_insertion_mode()
-- https://html.spec.whatwg.org/multipage/parsing.html#reset-the-insertion-mode-appropriately
local last = false
@@ -1977,16 +2135,33 @@ function HtmlParser:reset_insertion_mode()
if name == "head" and last == true then
self:switch_insertion("in_head")
return
- elseif name == "body" then
- self:switch_insertion("in_body")
- return
elseif name == "html" then
- if self.head_pointer then
+ if not self.head_pointer then
self:switch_insertion("before_head")
return
else
self:switch_insertion("after_head")
+ return
+ end
+ elseif name == "select" then
+ if not last then
+ for x = position -1, 1, -1 do
+ if x == 1 then break end
+ local ancestor = self.unfinished[x]
+ local ancestor_name = ancestor.tag
+ if ancestor_name == "template" then
+ break
+ elseif ancestor_name == "table" then
+ self:switch_insertion("in_select_in_table")
+ return
+ end
+ end
end
+ self:switch_insertion("in_select")
+ return
+ elseif simple_modes[name] then
+ self:switch_insertion(simple_modes[name])
+ return
elseif last == true then
self:switch_insertion("in_body")
return
@@ -2006,8 +2181,8 @@ function HtmlParser:generate_implied_endtags(included, ignored)
local current = self:current_node() or {}
-- keep removing elements while they are in the "included" list
if included[current.tag] then
- table.remove(self.unfinished)
- self:generate_implied_endtags(ignored)
+ self:pop_element()
+ self:generate_implied_endtags(included, ignored)
end
end
@@ -2023,9 +2198,7 @@ function HtmlParser:finish()
self:start_tag("html")
end
while #self.unfinished > 0 do
- local node = self:close_element()
- local parent = self:get_parent()
- parent:add_child(node)
+ self:pop_element()
end
-- return root element
return self.Document -- self:close_element()
diff --git a/Master/texmf-dist/tex/luatex/luaxml/luaxml-namedentities.lua b/Master/texmf-dist/tex/luatex/luaxml/luaxml-namedentities.lua
index 0e6399ab135..5c5ff007770 100644
--- a/Master/texmf-dist/tex/luatex/luaxml/luaxml-namedentities.lua
+++ b/Master/texmf-dist/tex/luatex/luaxml/luaxml-namedentities.lua
@@ -1,2234 +1,2233 @@
-local utf8 = require "utf8"
return {
-["Subset"]="⋐",
-["Chi"]="Χ",
-["tprime"]="‴",
-["lneq"]="⪇",
-["RightUpTeeVector"]="⥜",
-["cscr"]="𝒸",
-["leftrightarrows"]="⇆",
-["LeftRightVector"]="⥎",
-["Laplacetrf"]="ℒ",
-["boxHd"]="╤",
-["GreaterSlantEqual"]="⩾",
-["sqsub"]="⊏",
-["nvdash"]="⊬",
-["boxHu"]="╧",
-["vcy"]="в",
-["DiacriticalDoubleAcute"]="˝",
-["nvHarr"]="⤄",
-["lnapprox"]="⪉",
-["fscr"]="𝒻",
-["OverBracket"]="⎴",
-["pm"]="±",
-["ovbar"]="⌽",
-["larrhk"]="↩",
-["atilde"]="ã",
-["Igrave"]="Ì",
-["profsurf"]="⌓",
-["Sigma"]="Σ",
-["rHar"]="⥤",
-["Gcedil"]="Ģ",
-["sect"]="§",
-["nmid"]="∤",
-["escr"]="ℯ",
-["delta"]="δ",
-["male"]="♂",
-["Integral"]="∫",
-["RightUpVectorBar"]="⥔",
-["alefsym"]="ℵ",
-["nsqsube"]="⋢",
-["Nacute"]="Ń",
-["mcomma"]="⨩",
-["ApplyFunction"]=utf8.char(0x2061),
-["rfisht"]="⥽",
-["phmmat"]="ℳ",
-["rarrw"]="↝",
-["backepsilon"]="϶",
-["hscr"]="𝒽",
-["middot"]="·",
-["ldrushar"]="⥋",
-["supne"]="⊋",
-["Longleftrightarrow"]="⟺",
-["Oacute"]="Ó",
-["af"]="⁡",
+["Implies"]="⇒",
+["longrightarrow"]="⟶",
+["precneqq"]="⪵",
+["geqslant"]="⩾",
+["Product"]="∏",
+["Scirc"]="Ŝ",
+["lvnE"]="≨︀",
+["dotminus"]="∸",
+["sscr"]="𝓈",
+["capdot"]="⩀",
+["dlcrop"]="⌍",
+["omacr"]="ō",
+["sext"]="✶",
+["xutri"]="△",
+["xrArr"]="⟹",
+["glE"]="⪒",
+["NotSupersetEqual"]="⊉",
+["backsim"]="∽",
["sup"]="⊃",
-["lozenge"]="◊",
-["scy"]="с",
-["gscr"]="ℊ",
-["smallsetminus"]="∖",
+["realpart"]="ℜ",
["hardcy"]="ъ",
-["DoubleVerticalBar"]="∥",
-["Yuml"]="Ÿ",
-["plusdu"]="⨥",
-["NotSucceedsSlantEqual"]="⋡",
-["nwnear"]="⤧",
-["lfloor"]="⌊",
-["rcy"]="р",
-["jscr"]="𝒿",
-["AMP"]="&",
-["acute"]="´",
-["uacute"]="ú",
-["Or"]="⩔",
-["rdldhar"]="⥩",
-["langd"]="⦑",
-["Iacute"]="Í",
-["spar"]="∥",
-["ucy"]="у",
-["rsh"]="↱",
-["Kcedil"]="Ķ",
-["iscr"]="𝒾",
-["lambda"]="λ",
-["lbrkslu"]="⦍",
-["napE"]="⩰̸",
-["shcy"]="ш",
-["nsupE"]="⫆̸",
-["Ycirc"]="Ŷ",
-["sect"]="§",
-["precnapprox"]="⪹",
-["iocy"]="ё",
-["dzcy"]="џ",
+["sqcap"]="⊓",
+["brvbar"]="¦",
+["LT"]="<",
+["udarr"]="⇅",
+["lozf"]="⧫",
+["Eogon"]="Ę",
+["frac18"]="⅛",
+["lesssim"]="≲",
+["wedbar"]="⩟",
+["EmptyVerySmallSquare"]="▫",
+["aring"]="å",
+["lesdoto"]="⪁",
+["ltquest"]="⩻",
+["LeftUpTeeVector"]="⥠",
+["FilledSmallSquare"]="◼",
+["mho"]="℧",
+["NotGreaterTilde"]="≵",
+["xharr"]="⟷",
+["NotSucceedsEqual"]="⪰̸",
+["sqsupset"]="⊐",
+["Ccedil"]="Ç",
+["aacute"]="á",
+["succcurlyeq"]="≽",
+["gneq"]="⪈",
+["forall"]="∀",
+["rightharpoonup"]="⇀",
+["leftarrow"]="←",
+["ang"]="∠",
+["mapstoup"]="↥",
+["xscr"]="𝓍",
+["NotTildeEqual"]="≄",
+["ograve"]="ò",
+["boxdl"]="┐",
+["DownLeftVectorBar"]="⥖",
+["nsup"]="⊅",
+["shchcy"]="щ",
+["demptyv"]="⦱",
+["apos"]="'",
+["between"]="≬",
+["leftrightsquigarrow"]="↭",
+["gtcc"]="⪧",
+["grave"]="`",
+["bigodot"]="⨀",
+["oline"]="‾",
+["angmsdad"]="⦫",
+["NotCongruent"]="≢",
+["gtquest"]="⩼",
+["fltns"]="▱",
+["smeparsl"]="⧤",
+["Eta"]="Η",
+["ltdot"]="⋖",
+["rhard"]="⇁",
+["rscr"]="𝓇",
["ETH"]="Ð",
-["GreaterTilde"]="≳",
-["coprod"]="∐",
-["rpar"]=")",
-["lthree"]="⋋",
-["ImaginaryI"]="ⅈ",
-["DoubleUpDownArrow"]="⇕",
-["intercal"]="⊺",
-["spadesuit"]="♠",
-["boxVH"]="╬",
-["smashp"]="⨳",
-["nu"]="ν",
-["Agrave"]="À",
-["boxtimes"]="⊠",
-["sext"]="✶",
-["nsub"]="⊄",
-["oelig"]="œ",
-["GreaterEqual"]="≥",
-["TRADE"]="™",
-["dtrif"]="▾",
-["nless"]="≮",
-["mu"]="μ",
-["larrsim"]="⥳",
-["GreaterEqualLess"]="⋛",
-["Uuml"]="Ü",
-["LeftArrowBar"]="⇤",
-["ntrianglerighteq"]="⋭",
-["DiacriticalDot"]="˙",
-["LongLeftArrow"]="⟵",
-["agrave"]="à",
-["lmoustache"]="⎰",
-["nvDash"]="⊭",
-["para"]="¶",
-["nlt"]="≮",
-["Eacute"]="É",
-["spades"]="♠",
-["lrcorner"]="⌟",
-["checkmark"]="✓",
-["lessdot"]="⋖",
-["opar"]="⦷",
-["nVDash"]="⊯",
-["pertenk"]="‱",
-["range"]="⦥",
-["Pr"]="⪻",
-["Gammad"]="Ϝ",
-["ape"]="≊",
-["Longleftarrow"]="⟸",
-["boxV"]="║",
-["rightthreetimes"]="⋌",
+["iocy"]="ё",
+["semi"]=";",
+["nexists"]="∄",
+["approxeq"]="≊",
+["compfn"]="∘",
+["sstarf"]="⋆",
+["angrtvbd"]="⦝",
["gnap"]="⪊",
-["vzigzag"]="⦚",
-["Ecirc"]="Ê",
-["npar"]="∦",
-["notinvb"]="⋷",
-["Tau"]="Τ",
-["blank"]="␣",
-["Kappa"]="Κ",
-["rmoust"]="⎱",
-["GJcy"]="Ѓ",
-["ufisht"]="⥾",
-["NotLeftTriangleBar"]="⧏̸",
-["bigvee"]="⋁",
-["lrhar"]="⇋",
-["supset"]="⊃",
-["uwangle"]="⦧",
-["UpTeeArrow"]="↥",
-["supE"]="⫆",
-["imof"]="⊷",
-["leg"]="⋚",
-["notniva"]="∌",
-["nvgt"]=">⃒",
-["rthree"]="⋌",
-["yfr"]="𝔶",
-["uHar"]="⥣",
-["nshortmid"]="∤",
-["biguplus"]="⨄",
-["barvee"]="⊽",
-["iff"]="⇔",
-["boxvH"]="╪",
-["simrarr"]="⥲",
-["Egrave"]="È",
-["ntilde"]="ñ",
-["VerticalTilde"]="≀",
-["sigmaf"]="ς",
-["khcy"]="х",
-["planck"]="ℏ",
-["NotNestedGreaterGreater"]="⪢̸",
-["NonBreakingSpace"]=" ",
-["OpenCurlyQuote"]="‘",
-["supsim"]="⫈",
-["cudarrl"]="⤸",
-["theta"]="θ",
-["notindot"]="⋵̸",
-["Omicron"]="Ο",
-["ccedil"]="ç",
-["colone"]="≔",
-["bscr"]="𝒷",
-["Dagger"]="‡",
-["comma"]=",",
+["mDDot"]="∺",
+["udblac"]="ű",
["Acirc"]="Â",
-["plankv"]="ℏ",
-["boxdr"]="┌",
-["rarrap"]="⥵",
-["rmoustache"]="⎱",
-["LeftAngleBracket"]="⟨",
-["Cacute"]="Ć",
-["blk34"]="▓",
-["rfloor"]="⌋",
-["awconint"]="∳",
-["sfrown"]="⌢",
-["middot"]="·",
-["ascr"]="𝒶",
-["dot"]="˙",
-["caron"]="ˇ",
-["image"]="ℑ",
-["esdot"]="≐",
-["ohbar"]="⦵",
-["rarrb"]="⇥",
-["submult"]="⫁",
-["plusb"]="⊞",
-["oopf"]="𝕠",
-["breve"]="˘",
-["conint"]="∮",
-["angrt"]="∟",
-["nbump"]="≎̸",
-["raquo"]="»",
-["Iuml"]="Ï",
-["Rcedil"]="Ŗ",
-["minus"]="−",
-["nsucceq"]="⪰̸",
-["telrec"]="⌕",
-["CHcy"]="Ч",
-["nrightarrow"]="↛",
-["NotRightTriangle"]="⋫",
-["zfr"]="𝔷",
-["succ"]="≻",
-["Aacute"]="Á",
-["NestedLessLess"]="≪",
-["RightTeeArrow"]="↦",
-["homtht"]="∻",
-["Cup"]="⋓",
-["lcub"]="{",
-["race"]="∽̱",
-["THORN"]="Þ",
-["propto"]="∝",
-["odblac"]="ő",
-["mumap"]="⊸",
-["filig"]="fi",
-["ecir"]="≖",
-["DoubleRightArrow"]="⇒",
-["npreceq"]="⪯̸",
-["female"]="♀",
-["LeftFloor"]="⌊",
-["gtrarr"]="⥸",
-["dotsquare"]="⊡",
-["map"]="↦",
-["OverBrace"]="⏞",
-["zopf"]="𝕫",
-["rang"]="⟩",
-["laquo"]="«",
-["elsdot"]="⪗",
-["frac56"]="⅚",
-["Iuml"]="Ï",
-["ocirc"]="ô",
-["clubs"]="♣",
-["IOcy"]="Ё",
-["scnE"]="⪶",
-["deg"]="°",
-["simgE"]="⪠",
-["nap"]="≉",
-["blacktriangle"]="▴",
-["edot"]="ė",
-["epsiv"]="ϵ",
-["napprox"]="≉",
-["NotGreaterSlantEqual"]="⩾̸",
-["prap"]="⪷",
-["lnap"]="⪉",
-["circledS"]="Ⓢ",
-["lang"]="⟨",
-["qprime"]="⁗",
-["aelig"]="æ",
-["ncongdot"]="⩭̸",
-["supdsub"]="⫘",
-["nltrie"]="⋬",
-["xopf"]="𝕩",
+["UnderParenthesis"]="⏝",
+["nisd"]="⋺",
+["lneq"]="⪇",
+["Dagger"]="‡",
+["qscr"]="𝓆",
+["gneqq"]="≩",
+["doteqdot"]="≑",
+["DoubleVerticalBar"]="∥",
+["emptyset"]="∅",
+["lEg"]="⪋",
+["subseteq"]="⊆",
+["dwangle"]="⦦",
+["dotplus"]="∔",
+["NotPrecedesSlantEqual"]="⋠",
+["bnot"]="⌐",
["LeftDownVector"]="⇃",
-["duarr"]="⇵",
-["urcorner"]="⌝",
-["nvltrie"]="⊴⃒",
-["Pi"]="Π",
+["leg"]="⋚",
+["Therefore"]="∴",
+["Omega"]="Ω",
+["acE"]="∾̳",
+["Auml"]="Ä",
+["xvee"]="⋁",
["Eacute"]="É",
-["nGtv"]="≫̸",
-["icirc"]="î",
-["twoheadleftarrow"]="↞",
+["LeftFloor"]="⌊",
+["swnwar"]="⤪",
+["Jukcy"]="Є",
+["nless"]="≮",
+["NotSquareSupersetEqual"]="⋣",
+["larrfs"]="⤝",
+["gcy"]="г",
+["solbar"]="⌿",
+["rharul"]="⥬",
+["dscy"]="ѕ",
+["yen"]="¥",
+["ForAll"]="∀",
+["DownArrow"]="↓",
+["qprime"]="⁗",
+["NegativeThickSpace"]="​",
+["part"]="∂",
+["Iukcy"]="І",
+["ltcc"]="⪦",
+["xlArr"]="⟸",
+["fcy"]="ф",
+["gl"]="≷",
+["rsh"]="↱",
+["lrhar"]="⇋",
["divide"]="÷",
-["yopf"]="𝕪",
-["ntlg"]="≸",
-["Darr"]="↡",
+["bemptyv"]="⦰",
+["rx"]="℞",
+["ecy"]="э",
+["ApplyFunction"]="⁡",
+["divideontimes"]="⋇",
+["prod"]="∏",
+["boxHU"]="╩",
+["HARDcy"]="Ъ",
+["mstpos"]="∾",
+["llcorner"]="⌞",
+["rsquor"]="’",
+["NotTildeFullEqual"]="≇",
+["mlcp"]="⫛",
+["cemptyv"]="⦲",
+["Proportional"]="∝",
+["DiacriticalDoubleAcute"]="˝",
+["dcy"]="д",
+["Yacute"]="Ý",
+["egsdot"]="⪘",
["hslash"]="ℏ",
-["Coproduct"]="∐",
-["profline"]="⌒",
-["imagline"]="ℐ",
-["chcy"]="ч",
-["ccedil"]="ç",
-["PrecedesEqual"]="⪯",
-["jcirc"]="ĵ",
-["nang"]="∠⃒",
-["Icirc"]="Î",
-["nbumpe"]="≏̸",
-["incare"]="℅",
-["tint"]="∭",
-["nhArr"]="⇎",
-["emsp13"]=" ",
-["blacktriangleleft"]="◂",
-["Star"]="⋆",
-["hkswarow"]="⤦",
-["NegativeThickSpace"]="​",
-["eDot"]="≑",
-["Euml"]="Ë",
-["scaron"]="š",
-["RightDownVectorBar"]="⥕",
-["cent"]="¢",
-["jukcy"]="є",
-["backsimeq"]="⋍",
-["Ncy"]="Н",
-["DD"]="ⅅ",
-["circledast"]="⊛",
-["ccirc"]="ĉ",
-["rsaquo"]="›",
-["YIcy"]="Ї",
-["iquest"]="¿",
-["NotExists"]="∄",
-["iukcy"]="і",
-["Tab"]=" ",
-["Equilibrium"]="⇌",
-["nLt"]="≪⃒",
-["yen"]="¥",
-["CircleDot"]="⊙",
-["CircleMinus"]="⊖",
-["topf"]="𝕥",
-["equivDD"]="⩸",
-["DoubleLeftRightArrow"]="⇔",
-["ngsim"]="≵",
-["upuparrows"]="⇈",
-["ll"]="≪",
-["cirscir"]="⧂",
-["ShortLeftArrow"]="←",
-["angmsdag"]="⦮",
-["shortmid"]="∣",
-["ngeqslant"]="⩾̸",
-["subset"]="⊂",
-["curvearrowleft"]="↶",
-["gdot"]="ġ",
-["circledcirc"]="⊚",
-["Pcy"]="П",
-["asymp"]="≈",
-["boxUr"]="╙",
-["uopf"]="𝕦",
-["frac15"]="⅕",
-["Iacute"]="Í",
-["Utilde"]="Ũ",
-["Congruent"]="≡",
-["nhpar"]="⫲",
-["capbrcup"]="⩉",
-["ordf"]="ª",
-["SOFTcy"]="Ь",
-["nlArr"]="⇍",
-["not"]="¬",
-["ffllig"]="ffl",
-["nprec"]="⊀",
-["Hat"]="^",
+["infin"]="∞",
["Auml"]="Ä",
-["ntriangleleft"]="⋪",
-["longmapsto"]="⟼",
-["nvrtrie"]="⊵⃒",
-["timesb"]="⊠",
-["lsh"]="↰",
-["Jcy"]="Й",
-["gcirc"]="ĝ",
-["Oacute"]="Ó",
-["vartriangleright"]="⊳",
-["NotRightTriangleEqual"]="⋭",
-["Rightarrow"]="⇒",
-["ast"]="*",
-["hamilt"]="ℋ",
-["Ncedil"]="Ņ",
-["apE"]="⩰",
-["macr"]="¯",
-["cwconint"]="∲",
-["Kcy"]="К",
-["Ucirc"]="Û",
-["hcirc"]="ĥ",
-["yacy"]="я",
-["uml"]="¨",
-["popf"]="𝕡",
-["bumpE"]="⪮",
-["varnothing"]="∅",
-["RightUpVector"]="↾",
-["curren"]="¤",
-["Scedil"]="Ş",
-["FilledVerySmallSquare"]="▪",
-["dollar"]="$",
-["Lcy"]="Л",
-["longrightarrow"]="⟶",
-["LeftTee"]="⊣",
-["excl"]="!",
-["acirc"]="â",
-["wp"]="℘",
-["lcaron"]="ľ",
-["NotGreaterFullEqual"]="≧̸",
-["CounterClockwiseContourIntegral"]="∳",
-["sup2"]="²",
-["rnmid"]="⫮",
-["Lcedil"]="Ļ",
-["ddotseq"]="⩷",
-["tbrk"]="⎴",
-["mlcp"]="⫛",
-["rarrhk"]="↪",
-["Tilde"]="∼",
-["Mcy"]="М",
-["aring"]="å",
-["rarrsim"]="⥴",
-["nopf"]="𝕟",
-["aelig"]="æ",
-["order"]="ℴ",
-["diamondsuit"]="♦",
-["nvsim"]="∼⃒",
-["lhard"]="↽",
-["commat"]="@",
-["qint"]="⨌",
-["lsquo"]="‘",
-["sqcaps"]="⊓︀",
-["circlearrowleft"]="↺",
-["NotElement"]="∉",
-["measuredangle"]="∡",
-["Atilde"]="Ã",
-["CapitalDifferentialD"]="ⅅ",
-["kgreen"]="ĸ",
-["Cscr"]="𝒞",
+["Wcirc"]="Ŵ",
+["larrtl"]="↢",
+["Aacute"]="Á",
+["LeftTriangleEqual"]="⊴",
+["NegativeMediumSpace"]="​",
+["TripleDot"]="⃛",
+["utdot"]="⋰",
+["isinv"]="∈",
+["looparrowright"]="↬",
+["loang"]="⟬",
+["multimap"]="⊸",
["NotLessEqual"]="≰",
-["trpezium"]="⏢",
-["ne"]="≠",
-["NotSuperset"]="⊃⃒",
-["nearrow"]="↗",
-["ncong"]="≇",
-["doteqdot"]="≑",
-["supmult"]="⫂",
-["longleftrightarrow"]="⟷",
-["Rarr"]="↠",
-["DoubleUpArrow"]="⇑",
-["Dscr"]="𝒟",
-["mp"]="∓",
-["jmath"]="ȷ",
-["erarr"]="⥱",
-["searrow"]="↘",
-["Sup"]="⋑",
-["lvnE"]="≨︀",
-["ffilig"]="ffi",
-["NotSquareSupersetEqual"]="⋣",
-["bullet"]="•",
-["bigstar"]="★",
-["cylcty"]="⌭",
-["nvle"]="≤⃒",
-["TildeFullEqual"]="≅",
-["lopf"]="𝕝",
-["sqsupseteq"]="⊒",
-["lt"]="<",
-["geqslant"]="⩾",
+["midcir"]="⫰",
+["nge"]="≱",
["quot"]="\"",
-["le"]="≤",
-["square"]="□",
-["sigma"]="σ",
-["prE"]="⪳",
-["rtrie"]="⊵",
-["triangleq"]="≜",
+["REG"]="®",
+["div"]="÷",
+["complexes"]="ℂ",
+["lhblk"]="▄",
+["gvnE"]="≩︀",
+["leftharpoonup"]="↼",
+["it"]="⁢",
+["clubsuit"]="♣",
+["iff"]="⇔",
+["Hacek"]="ˇ",
+["CircleTimes"]="⊗",
+["Cacute"]="Ć",
+["rarrtl"]="↣",
+["RightDownVector"]="⇂",
+["rarrfs"]="⤞",
+["UpArrowBar"]="⤒",
+["male"]="♂",
+["RightTriangle"]="⊳",
+["GreaterTilde"]="≳",
+["Barwed"]="⌆",
+["ltlarr"]="⥶",
+["Zdot"]="Ż",
+["parsim"]="⫳",
+["Ugrave"]="Ù",
+["Dot"]="¨",
+["circleddash"]="⊝",
+["rsaquo"]="›",
+["hyphen"]="‐",
+["angrt"]="∟",
+["RightTriangleEqual"]="⊵",
+["Darr"]="↡",
+["ulcrop"]="⌏",
+["olcir"]="⦾",
+["gimel"]="ℷ",
+["gel"]="⋛",
+["SquareSubset"]="⊏",
+["Uacute"]="Ú",
+["gt"]=">",
+["lnap"]="⪉",
+["Union"]="⋃",
+["nu"]="ν",
+["and"]="∧",
+["ltcir"]="⩹",
["Fscr"]="ℱ",
+["ee"]="ⅇ",
+["laquo"]="«",
+["Hfr"]="ℌ",
+["prec"]="≺",
+["imagline"]="ℐ",
+["precnsim"]="⋨",
+["zhcy"]="ж",
+["mu"]="μ",
+["rlarr"]="⇄",
+["pound"]="£",
+["origof"]="⊶",
+["rfloor"]="⌋",
+["lnsim"]="⋦",
+["nVdash"]="⊮",
+["otimes"]="⊗",
+["iuml"]="ï",
+["Cscr"]="𝒞",
+["lsime"]="⪍",
+["ngeqq"]="≧̸",
+["Del"]="∇",
+["Coproduct"]="∐",
+["NotSubsetEqual"]="⊈",
+["HilbertSpace"]="ℋ",
+["frac58"]="⅝",
+["cap"]="∩",
+["roang"]="⟭",
+["intlarhk"]="⨗",
+["DownTee"]="⊤",
+["thickapprox"]="≈",
+["prnap"]="⪹",
+["laquo"]="«",
+["lesdot"]="⩿",
+["inodot"]="ı",
+["Hscr"]="ℋ",
+["YIcy"]="Ї",
+["ctdot"]="⋯",
+["thetav"]="ϑ",
+["DoubleUpDownArrow"]="⇕",
+["succ"]="≻",
+["nbumpe"]="≏̸",
+["ReverseElement"]="∋",
+["Oacute"]="Ó",
+["equest"]="≟",
+["Lt"]="≪",
+["Nacute"]="Ń",
["DiacriticalTilde"]="˜",
-["SucceedsSlantEqual"]="≽",
-["mopf"]="𝕞",
-["Ecaron"]="Ě",
-["UpArrowDownArrow"]="⇅",
-["ges"]="⩾",
-["nsqsupe"]="⋣",
-["ubrcy"]="ў",
-["Gscr"]="𝒢",
-["HARDcy"]="Ъ",
-["jopf"]="𝕛",
-["gtquest"]="⩼",
-["iinfin"]="⧜",
-["twixt"]="≬",
+["Escr"]="ℰ",
+["boxvH"]="╪",
+["Ifr"]="ℑ",
+["mp"]="∓",
+["ell"]="ℓ",
+["Iacute"]="Í",
+["NotNestedGreaterGreater"]="⪢̸",
+["raquo"]="»",
+["Zcy"]="З",
+["micro"]="µ",
+["dzigrarr"]="⟿",
+["rtrif"]="▸",
+["Uuml"]="Ü",
+["nvHarr"]="⤄",
+["leqslant"]="⩽",
+["tritime"]="⨻",
+["nlarr"]="↚",
+["NotRightTriangle"]="⋫",
+["apid"]="≋",
+["succeq"]="⪰",
+["NotEqualTilde"]="≂̸",
+["varphi"]="ϕ",
+["Vert"]="‖",
+["int"]="∫",
+["lurdshar"]="⥊",
+["lneqq"]="≨",
+["Jsercy"]="Ј",
+["Superset"]="⊃",
+["subsetneqq"]="⫋",
+["gap"]="⪆",
+["ssmile"]="⌣",
+["Ugrave"]="Ù",
+["IOcy"]="Ё",
+["ltimes"]="⋉",
+["UnderBracket"]="⎵",
+["subseteqq"]="⫅",
+["Dscr"]="𝒟",
+["dtrif"]="▾",
+["raquo"]="»",
+["hbar"]="ℏ",
+["ge"]="≥",
+["cudarrr"]="⤵",
+["icy"]="и",
+["plusdo"]="∔",
+["bull"]="•",
+["weierp"]="℘",
+["mapsto"]="↦",
+["Uring"]="Ů",
+["supplus"]="⫀",
+["Succeeds"]="≻",
+["Ascr"]="𝒜",
+["cdot"]="ċ",
+["nwarr"]="↖",
+["target"]="⌖",
+["dharr"]="⇂",
+["curlyvee"]="⋎",
+["supE"]="⫆",
+["emsp13"]=" ",
["ltrie"]="⊴",
+["olarr"]="↺",
+["RightTeeVector"]="⥛",
+["Vvdash"]="⊪",
+["larrsim"]="⥳",
+["varsubsetneq"]="⊊︀",
+["Not"]="⫬",
+["CenterDot"]="·",
+["PlusMinus"]="±",
+["aring"]="å",
+["Nscr"]="𝒩",
+["delta"]="δ",
+["npre"]="⪯̸",
+["Vcy"]="В",
+["NotVerticalBar"]="∤",
+["scpolint"]="⨓",
+["rcedil"]="ŗ",
+["Lmidot"]="Ŀ",
+["DScy"]="Ѕ",
+["nsubseteq"]="⊈",
+["ngE"]="≧̸",
+["NotSquareSubsetEqual"]="⋢",
+["edot"]="ė",
+["Ucy"]="У",
+["lessapprox"]="⪅",
+["niv"]="∋",
+["Kscr"]="𝒦",
+["LeftVectorBar"]="⥒",
+["nhpar"]="⫲",
+["scedil"]="ş",
+["Uacute"]="Ú",
+["ntrianglelefteq"]="⋬",
+["Otilde"]="Õ",
+["iexcl"]="¡",
+["lbrke"]="⦋",
+["simdot"]="⩪",
+["sigmaf"]="ς",
+["Bfr"]="𝔅",
+["pitchfork"]="⋔",
+["ngeqslant"]="⩾̸",
+["Pscr"]="𝒫",
+["gsime"]="⪎",
+["Ouml"]="Ö",
+["rarrsim"]="⥴",
+["subE"]="⫅",
+["otimesas"]="⨶",
+["lfloor"]="⌊",
+["prop"]="∝",
+["imacr"]="ī",
+["blacktriangleleft"]="◂",
+["Ntilde"]="Ñ",
+["llarr"]="⇇",
+["nsucc"]="⊁",
+["PartialD"]="∂",
+["Iacute"]="Í",
+["gdot"]="ġ",
+["Afr"]="𝔄",
+["Igrave"]="Ì",
["csub"]="⫏",
-["Hscr"]="ℋ",
-["leftharpoondown"]="↽",
+["Mscr"]="ℳ",
+["Scy"]="С",
+["bsime"]="⋍",
+["nequiv"]="≢",
+["scnap"]="⪺",
+["Tab"]=" ",
+["Equal"]="⩵",
+["blacklozenge"]="⧫",
+["nrarrc"]="⤳̸",
+["divide"]="÷",
["RightUpDownVector"]="⥏",
-["LongLeftRightArrow"]="⟷",
-["Im"]="ℑ",
-["dcaron"]="ď",
+["iinfin"]="⧜",
+["precnapprox"]="⪹",
+["dArr"]="⇓",
+["orslope"]="⩗",
+["Rcy"]="Р",
+["sqsub"]="⊏",
+["OverBracket"]="⎴",
+["sum"]="∑",
+["ncedil"]="ņ",
+["ltrPar"]="⦖",
+["ii"]="ⅈ",
+["Gcirc"]="Ĝ",
+["SucceedsTilde"]="≿",
+["RightFloor"]="⌋",
+["osol"]="⊘",
["barwedge"]="⌅",
-["nexist"]="∄",
-["blacktriangledown"]="▾",
-["fork"]="⋔",
-["rhard"]="⇁",
-["cent"]="¢",
-["RightTriangle"]="⊳",
-["Eta"]="Η",
-["dotminus"]="∸",
-["nles"]="⩽̸",
-["larrtl"]="↢",
-["LeftTriangleEqual"]="⊴",
-["hopf"]="𝕙",
-["gammad"]="ϝ",
-["gsime"]="⪎",
-["llhard"]="⥫",
-["precapprox"]="⪷",
-["profalar"]="⌮",
-["lnE"]="≨",
-["ddagger"]="‡",
-["leq"]="≤",
-["smile"]="⌣",
-["robrk"]="⟧",
-["Jscr"]="𝒥",
-["triangleleft"]="◃",
-["acd"]="∿",
-["prod"]="∏",
-["atilde"]="ã",
-["seArr"]="⇘",
-["therefore"]="∴",
-["iopf"]="𝕚",
-["solbar"]="⌿",
-["kcedil"]="ķ",
-["NotHumpEqual"]="≏̸",
-["nspar"]="∦",
-["frac14"]="¼",
-["nsime"]="≄",
-["DoubleLongLeftArrow"]="⟸",
-["sccue"]="≽",
-["models"]="⊧",
-["SupersetEqual"]="⊇",
-["iquest"]="¿",
-["oline"]="‾",
-["lparlt"]="⦓",
-["triplus"]="⨹",
-["nequiv"]="≢",
-["nlE"]="≦̸",
-["nldr"]="‥",
-["equals"]="=",
-["Agrave"]="À",
-["ccaron"]="č",
-["Yacute"]="Ý",
-["Oslash"]="Ø",
-["udarr"]="⇅",
-["ang"]="∠",
-["dopf"]="𝕕",
-["comp"]="∁",
-["caps"]="∩︀",
-["bowtie"]="⋈",
-["glj"]="⪤",
-["ltquest"]="⩻",
-["cirmid"]="⫯",
-["ordm"]="º",
-["esim"]="≂",
-["reals"]="ℝ",
-["LeftTriangle"]="⊲",
-["flat"]="♭",
-["eopf"]="𝕖",
-["lap"]="⪅",
-["not"]="¬",
-["ENG"]="Ŋ",
-["DiacriticalAcute"]="´",
-["sharp"]="♯",
-["longleftarrow"]="⟵",
-["dblac"]="˝",
-["UpArrow"]="↑",
-["npre"]="⪯̸",
-["bopf"]="𝕓",
-["DScy"]="Ѕ",
+["twoheadrightarrow"]="↠",
+["Gscr"]="𝒢",
+["acy"]="а",
+["dtdot"]="⋱",
+["rbrke"]="⦌",
+["imath"]="ı",
+["Hcirc"]="Ĥ",
+["num"]="#",
+["nprec"]="⊀",
+["smallsetminus"]="∖",
+["lesges"]="⪓",
+["LeftUpVector"]="↿",
+["gtdot"]="⋗",
+["theta"]="θ",
+["kappav"]="ϰ",
+["jmath"]="ȷ",
+["Lscr"]="ℒ",
+["Aogon"]="Ą",
+["ltrif"]="◂",
+["DownArrowUpArrow"]="⇵",
+["prap"]="⪷",
+["Racute"]="Ŕ",
+["curlyeqprec"]="⋞",
["bepsi"]="϶",
-["angrtvb"]="⊾",
-["ccaps"]="⩍",
-["UnderParenthesis"]="⏝",
-["subne"]="⊊",
-["succnsim"]="⋩",
-["Bumpeq"]="≎",
-["xvee"]="⋁",
-["colon"]=":",
-["deg"]="°",
-["fnof"]="ƒ",
-["Uarr"]="↟",
-["Zcaron"]="Ž",
-["copf"]="𝕔",
-["Theta"]="Θ",
-["omicron"]="ο",
-["ntriangleright"]="⋫",
-["DoubleLongRightArrow"]="⟹",
-["UnderBrace"]="⏟",
-["GT"]=">",
-["lEg"]="⪋",
-["supplus"]="⫀",
-["acute"]="´",
+["blacktriangle"]="▴",
+["nvap"]="≍⃒",
+["Supset"]="⋑",
+["angmsd"]="∡",
+["boxul"]="┘",
+["LessSlantEqual"]="⩽",
["GT"]=">",
-["upsilon"]="υ",
-["sc"]="≻",
-["xrarr"]="⟶",
-["eng"]="ŋ",
-["it"]="⁢",
-["Ntilde"]="Ñ",
-["Mu"]="Μ",
-["CircleTimes"]="⊗",
-["NotTildeTilde"]="≉",
-["NotLessLess"]="≪̸",
-["vellip"]="⋮",
-["cularrp"]="⤽",
-["UnderBracket"]="⎵",
-["aopf"]="𝕒",
-["itilde"]="ĩ",
-["latail"]="⤙",
-["Nu"]="Ν",
-["Ascr"]="𝒜",
-["complement"]="∁",
-["gjcy"]="ѓ",
-["radic"]="√",
-["maltese"]="✠",
-["glE"]="⪒",
-["plusmn"]="±",
-["curvearrowright"]="↷",
-["gt"]=">",
-["Colone"]="⩴",
-["Bscr"]="ℬ",
-["ic"]="⁣",
-["clubsuit"]="♣",
-["djcy"]="ђ",
-["Oopf"]="𝕆",
-["ltrPar"]="⦖",
-["ngtr"]="≯",
-["eqcirc"]="≖",
-["Hacek"]="ˇ",
-["vdash"]="⊢",
-["NotCupCap"]="≭",
-["Gdot"]="Ġ",
-["jsercy"]="ј",
-["marker"]="▮",
+["nexist"]="∄",
+["ccupssm"]="⩐",
+["Eacute"]="É",
+["ddarr"]="⇊",
+["ntlg"]="≸",
+["Iscr"]="ℐ",
+["Jcirc"]="Ĵ",
+["Sacute"]="Ś",
+["capand"]="⩄",
+["gesdoto"]="⪂",
+["olcross"]="⦻",
+["amalg"]="⨿",
+["rarrlp"]="↬",
+["NotLeftTriangle"]="⋪",
+["reals"]="ℝ",
+["bigcup"]="⋃",
+["NJcy"]="Њ",
+["Odblac"]="Ő",
+["hArr"]="⇔",
+["RightArrowLeftArrow"]="⇄",
+["SOFTcy"]="Ь",
+["Lambda"]="Λ",
+["RightCeiling"]="⌉",
+["Vdash"]="⊩",
+["elinters"]="⏧",
+["lsimg"]="⪏",
["Nopf"]="ℕ",
-["Wfr"]="𝔚",
-["boxHD"]="╦",
-["mho"]="℧",
-["ulcrop"]="⌏",
-["DifferentialD"]="ⅆ",
-["aacute"]="á",
-["lpar"]="(",
+["Esim"]="⩳",
+["vzigzag"]="⦚",
+["acd"]="∿",
+["ccedil"]="ç",
+["lbarr"]="⤌",
+["nmid"]="∤",
+["Backslash"]="∖",
+["Laplacetrf"]="ℒ",
+["npr"]="⊀",
+["nap"]="≉",
+["nsupseteqq"]="⫆̸",
+["igrave"]="ì",
+["LJcy"]="Љ",
+["lessgtr"]="≶",
["angle"]="∠",
-["rharu"]="⇀",
-["Breve"]="˘",
-["Dot"]="¨",
-["rect"]="▭",
-["NotNestedLessLess"]="⪡̸",
-["boxplus"]="⊞",
-["NotSucceeds"]="⊁",
-["gnapprox"]="⪊",
-["DownLeftTeeVector"]="⥞",
-["Xfr"]="𝔛",
-["Lang"]="⟪",
-["Element"]="∈",
-["sung"]="♪",
-["RightVectorBar"]="⥓",
-["simne"]="≆",
-["LeftVector"]="↼",
-["Idot"]="İ",
+["lAarr"]="⇚",
+["notin"]="∉",
+["orv"]="⩛",
+["gtreqqless"]="⪌",
+["CircleMinus"]="⊖",
+["Diamond"]="⋄",
+["map"]="↦",
+["nvsim"]="∼⃒",
+["pi"]="π",
+["pluscir"]="⨢",
+["boxVH"]="╬",
["QUOT"]="\"",
-["nsmid"]="∤",
-["fjlig"]="fj",
-["Ufr"]="𝔘",
-["cuvee"]="⋎",
+["duarr"]="⇵",
+["lgE"]="⪑",
+["lmoust"]="⎰",
+["lsquo"]="‘",
+["rightrightarrows"]="⇉",
+["times"]="×",
+["iuml"]="ï",
+["andslope"]="⩘",
+["order"]="ℴ",
+["Sub"]="⋐",
+["capcap"]="⩋",
+["nabla"]="∇",
+["ntriangleleft"]="⋪",
+["blk14"]="░",
+["Kopf"]="𝕂",
+["lArr"]="⇐",
+["Qopf"]="ℚ",
+["circledS"]="Ⓢ",
+["omid"]="⦶",
+["ord"]="⩝",
+["lvertneqq"]="≨︀",
+["updownarrow"]="↕",
+["yacute"]="ý",
+["ni"]="∋",
+["hamilt"]="ℋ",
+["Jopf"]="𝕁",
+["CupCap"]="≍",
+["lbrack"]="[",
+["preccurlyeq"]="≼",
+["Ropf"]="ℝ",
+["lessdot"]="⋖",
+["blank"]="␣",
+["SucceedsEqual"]="⪰",
+["triangleleft"]="◃",
+["ring"]="˚",
+["omega"]="ω",
+["bowtie"]="⋈",
+["Sqrt"]="√",
+["uuml"]="ü",
+["Udblac"]="Ű",
+["diams"]="♦",
+["Oslash"]="Ø",
["real"]="ℜ",
-["luruhar"]="⥦",
-["NotRightTriangleBar"]="⧐̸",
-["target"]="⌖",
-["lharu"]="↼",
-["CloseCurlyQuote"]="’",
-["rAtail"]="⤜",
-["nparallel"]="∦",
-["brvbar"]="¦",
-["Vfr"]="𝔙",
-["wedbar"]="⩟",
-["REG"]="®",
-["boxur"]="└",
-["Rcaron"]="Ř",
-["Rang"]="⟫",
-["sqsubseteq"]="⊑",
-["div"]="÷",
-["boxul"]="┘",
-["Cdot"]="Ċ",
-["vsupnE"]="⫌︀",
-["zeetrf"]="ℨ",
-["Sfr"]="𝔖",
-["roang"]="⟭",
-["LessTilde"]="≲",
-["equiv"]="≡",
-["frac12"]="½",
-["eacute"]="é",
-["rrarr"]="⇉",
-["nearhk"]="⤤",
-["Zopf"]="ℤ",
-["SucceedsTilde"]="≿",
+["egrave"]="è",
+["prurel"]="⊰",
+["LeftUpDownVector"]="⥑",
+["TildeEqual"]="≃",
+["cuwed"]="⋏",
+["times"]="×",
["ap"]="≈",
-["lfisht"]="⥼",
-["timesd"]="⨰",
-["UpDownArrow"]="↕",
-["xuplus"]="⨄",
-["cularr"]="↶",
-["iprod"]="⨼",
-["AElig"]="Æ",
-["rationals"]="ℚ",
-["geqq"]="≧",
-["Tfr"]="𝔗",
-["Yopf"]="𝕐",
-["rtimes"]="⋊",
-["Tcaron"]="Ť",
-["srarr"]="→",
-["diam"]="⋄",
-["mid"]="∣",
-["imath"]="ı",
-["PlusMinus"]="±",
-["isin"]="∈",
-["vprop"]="∝",
-["RightArrowLeftArrow"]="⇄",
-["NotSubset"]="⊂⃒",
-["bigtriangledown"]="▽",
-["ldsh"]="↲",
-["Qfr"]="𝔔",
-["nvap"]="≍⃒",
-["vert"]="|",
-["Xopf"]="𝕏",
-["lBarr"]="⤎",
-["egsdot"]="⪘",
-["Tcedil"]="Ţ",
-["xi"]="ξ",
-["LeftUpVectorBar"]="⥘",
-["circ"]="ˆ",
-["ocir"]="⊚",
-["gtlPar"]="⦕",
-["Rfr"]="ℜ",
-["RightTriangleBar"]="⧐",
-["nwarhk"]="⤣",
-["zhcy"]="ж",
-["Iukcy"]="І",
-["plusdo"]="∔",
+["lowast"]="∗",
+["Lopf"]="𝕃",
+["bdquo"]="„",
+["blacktriangledown"]="▾",
+["vBarv"]="⫩",
+["Longleftarrow"]="⟸",
+["lesg"]="⋚︀",
+["Popf"]="ℙ",
+["iogon"]="į",
+["vellip"]="⋮",
+["Ntilde"]="Ñ",
+["cwconint"]="∲",
["boxv"]="│",
-["minusb"]="⊟",
-["Ncaron"]="Ň",
-["angmsdaa"]="⦨",
-["varsubsetneqq"]="⫋︀",
-["cirfnint"]="⨐",
-["LongRightArrow"]="⟶",
-["ddarr"]="⇊",
-["piv"]="ϖ",
-["fopf"]="𝕗",
-["Ofr"]="𝔒",
-["fflig"]="ff",
-["Jukcy"]="Є",
-["xhArr"]="⟺",
-["ncy"]="н",
-["Scaron"]="Š",
-["TildeEqual"]="≃",
-["subrarr"]="⥹",
-["iacute"]="í",
-["ogt"]="⧁",
-["nvge"]="≥⃒",
-["vee"]="∨",
-["UnderBar"]="_",
-["andslope"]="⩘",
-["gopf"]="𝕘",
-["Pfr"]="𝔓",
-["die"]="¨",
+["boxbox"]="⧉",
+["langd"]="⦑",
+["diam"]="⋄",
+["boxHu"]="╧",
+["acute"]="´",
["Uopf"]="𝕌",
+["Fcy"]="Ф",
+["vee"]="∨",
+["eqslantless"]="⪕",
+["NotLeftTriangleEqual"]="⋬",
+["OverBrace"]="⏞",
+["beta"]="β",
+["Otilde"]="Õ",
+["fjlig"]="fj",
+["uacute"]="ú",
+["CirclePlus"]="⊕",
+["Mellintrf"]="ℳ",
+["Vopf"]="𝕍",
+["Gcy"]="Г",
+["searhk"]="⤥",
+["boxur"]="└",
+["LeftTeeVector"]="⥚",
+["nsubE"]="⫅̸",
+["gvertneqq"]="≩︀",
+["eqcirc"]="≖",
+["nrightarrow"]="↛",
+["DJcy"]="Ђ",
+["tdot"]="⃛",
+["Dcy"]="Д",
+["Sopf"]="𝕊",
+["range"]="⦥",
+["agrave"]="à",
+["gtrsim"]="≳",
["RightArrowBar"]="⇥",
-["orarr"]="↻",
-["Precedes"]="≺",
-["oror"]="⩖",
-["straightepsilon"]="ϵ",
-["cong"]="≅",
-["TScy"]="Ц",
-["nleftarrow"]="↚",
-["DZcy"]="Џ",
-["horbar"]="―",
+["larrlp"]="↫",
+["le"]="≤",
+["xi"]="ξ",
+["gla"]="⪥",
+["GT"]=">",
+["leftarrowtail"]="↢",
+["commat"]="@",
+["rightarrowtail"]="↣",
+["approx"]="≈",
+["sdot"]="⋅",
["Topf"]="𝕋",
-["Cayleys"]="ℭ",
-["leqq"]="≦",
-["curlyeqprec"]="⋞",
-["nLeftarrow"]="⇍",
-["pcy"]="п",
-["realine"]="ℛ",
-["nlsim"]="≴",
+["Ecy"]="Э",
+["eplus"]="⩱",
+["cir"]="○",
["Rarrtl"]="⤖",
-["CupCap"]="≍",
-["vDash"]="⊨",
-["shortparallel"]="∥",
-["ExponentialE"]="ⅇ",
-["Sopf"]="𝕊",
-["iiota"]="℩",
-["Nfr"]="𝔑",
-["pointint"]="⨕",
-["NotGreaterLess"]="≹",
-["olcross"]="⦻",
-["kcy"]="к",
-["complexes"]="ℂ",
-["varepsilon"]="ϵ",
-["Fouriertrf"]="ℱ",
-["rho"]="ρ",
-["Lsh"]="↰",
-["exponentiale"]="ⅇ",
-["hookrightarrow"]="↪",
-["Ropf"]="ℝ",
-["lAtail"]="⤛",
-["Kfr"]="𝔎",
-["bsim"]="∽",
-["jcy"]="й",
-["frac34"]="¾",
-["DotDot"]="⃜",
+["Emacr"]="Ē",
+["Dcaron"]="Ď",
+["Sc"]="⪼",
+["cent"]="¢",
+["rtri"]="▹",
+["cedil"]="¸",
+["spades"]="♠",
+["upsilon"]="υ",
+["boxminus"]="⊟",
+["angmsdaa"]="⦨",
+["zdot"]="ż",
+["Bcy"]="Б",
+["Zscr"]="𝒵",
+["looparrowleft"]="↫",
+["Dfr"]="𝔇",
+["Bumpeq"]="≎",
+["nLeftarrow"]="⇍",
+["equiv"]="≡",
+["Ccaron"]="Č",
+["UpperLeftArrow"]="↖",
+["SubsetEqual"]="⊆",
+["nrArr"]="⇏",
+["loarr"]="⇽",
+["minusdu"]="⨪",
+["sup3"]="³",
+["Zopf"]="ℤ",
+["elsdot"]="⪗",
+["NotLessLess"]="≪̸",
+["eta"]="η",
+["ubrcy"]="ў",
+["Yscr"]="𝒴",
+["subset"]="⊂",
+["Cfr"]="ℭ",
+["harrcir"]="⥈",
+["supsetneq"]="⊋",
+["LeftUpVectorBar"]="⥘",
+["LT"]="<",
+["DoubleLeftArrow"]="⇐",
+["circledcirc"]="⊚",
+["bkarow"]="⤍",
+["rangd"]="⦒",
+["downharpoonright"]="⇂",
+["Wopf"]="𝕎",
+["ast"]="*",
+["planck"]="ℏ",
+["gtrdot"]="⋗",
+["Ffr"]="𝔉",
+["rArr"]="⇒",
+["VeryThinSpace"]=" ",
+["Ecaron"]="Ě",
+["RightVectorBar"]="⥓",
+["divonx"]="⋇",
+["Xopf"]="𝕏",
+["nsubset"]="⊂⃒",
+["Otimes"]="⨷",
+["bot"]="⊥",
+["nsime"]="≄",
["thorn"]="þ",
-["ThickSpace"]="  ",
-["SquareUnion"]="⊔",
-["frac58"]="⅝",
-["dfisht"]="⥿",
-["MediumSpace"]=" ",
-["Lfr"]="𝔏",
-["Qopf"]="ℚ",
+["subsetneq"]="⊊",
+["nltri"]="⋪",
+["Cayleys"]="ℭ",
+["Efr"]="𝔈",
+["Intersection"]="⋂",
+["UnderBar"]="_",
+["fpartint"]="⨍",
+["Iuml"]="Ï",
+["rsquo"]="’",
+["ecir"]="≖",
+["nis"]="⋼",
+["fscr"]="𝒻",
+["hellip"]="…",
+["ogt"]="⧁",
["ntgl"]="≹",
-["LessFullEqual"]="≦",
-["malt"]="✠",
-["mcy"]="м",
-["NotGreaterEqual"]="≱",
-["bottom"]="⊥",
-["NotSucceedsEqual"]="⪰̸",
-["lcedil"]="ļ",
-["infintie"]="⧝",
-["Lcaron"]="Ľ",
-["NotSquareSubset"]="⊏̸",
-["brvbar"]="¦",
-["fallingdotseq"]="≒",
-["AElig"]="Æ",
-["swarhk"]="⤦",
-["Ifr"]="ℑ",
-["pi"]="π",
-["lcy"]="л",
-["copy"]="©",
-["dlcorn"]="⌞",
-["oacute"]="ó",
-["gtreqless"]="⋛",
-["neArr"]="⇗",
+["frac14"]="¼",
+["squf"]="▪",
+["circ"]="ˆ",
+["prE"]="⪳",
+["ordf"]="ª",
["ZHcy"]="Ж",
-["Vdashl"]="⫦",
-["darr"]="↓",
-["circeq"]="≗",
+["NegativeVeryThinSpace"]="​",
+["quot"]="\"",
+["excl"]="!",
+["sqcaps"]="⊓︀",
+["gfr"]="𝔤",
+["varsigma"]="ς",
+["nwarrow"]="↖",
+["reg"]="®",
+["longmapsto"]="⟼",
+["And"]="⩓",
+["cuvee"]="⋎",
+["zwj"]="‍",
+["plankv"]="ℏ",
+["varepsilon"]="ϵ",
+["Aopf"]="𝔸",
+["UpTee"]="⊥",
+["lescc"]="⪨",
+["ltri"]="◃",
+["iiint"]="∭",
+["ccups"]="⩌",
+["alefsym"]="ℵ",
+["succneqq"]="⪶",
+["hscr"]="𝒽",
+["Or"]="⩔",
["yuml"]="ÿ",
-["Jfr"]="𝔍",
-["Product"]="∏",
-["boxDL"]="╗",
-["el"]="⪙",
-["supe"]="⊇",
-["frac13"]="⅓",
-["Barwed"]="⌆",
-["larrpl"]="⤹",
-["SHCHcy"]="Щ",
-["LeftUpDownVector"]="⥑",
-["Diamond"]="⋄",
-["DownLeftVectorBar"]="⥖",
-["Cross"]="⨯",
-["ncup"]="⩂",
-["supnE"]="⫌",
-["lne"]="⪇",
-["micro"]="µ",
-["lowbar"]="_",
-["perp"]="⊥",
-["sqcap"]="⊓",
-["Gfr"]="𝔊",
-["raemptyv"]="⦳",
-["gesl"]="⋛︀",
-["drcrop"]="⌌",
-["boxUL"]="╝",
-["becaus"]="∵",
-["gne"]="⪈",
-["scap"]="⪸",
-["swarrow"]="↙",
-["nesim"]="≂̸",
-["DoubleDot"]="¨",
-["Mopf"]="𝕄",
-["apid"]="≋",
-["InvisibleComma"]="⁣",
-["Backslash"]="∖",
-["mnplus"]="∓",
-["niv"]="∋",
-["Hfr"]="ℌ",
-["rarrlp"]="↬",
-["Because"]="∵",
-["parsl"]="⫽",
-["sup1"]="¹",
-["Lt"]="≪",
-["par"]="∥",
-["Iota"]="Ι",
-["beth"]="ℶ",
-["Lopf"]="𝕃",
+["rcub"]="}",
+["lt"]="<",
+["vArr"]="⇕",
+["EqualTilde"]="≂",
+["vDash"]="⊨",
+["RightArrow"]="→",
+["dlcorn"]="⌞",
+["Barv"]="⫧",
+["nsc"]="⊁",
+["Proportion"]="∷",
+["iota"]="ι",
+["gscr"]="ℊ",
+["abreve"]="ă",
+["ThickSpace"]="  ",
+["szlig"]="ß",
+["lhard"]="↽",
+["emptyv"]="∅",
+["Tau"]="Τ",
+["sharp"]="♯",
+["bNot"]="⫭",
+["LongLeftRightArrow"]="⟷",
+["frac23"]="⅔",
+["NotEqual"]="≠",
+["scE"]="⪴",
+["jfr"]="𝔧",
+["bscr"]="𝒷",
+["uhblk"]="▀",
+["frac35"]="⅗",
+["TSHcy"]="Ћ",
+["ntrianglerighteq"]="⋭",
+["Tcedil"]="Ţ",
+["NotGreaterFullEqual"]="≧̸",
+["asympeq"]="≍",
+["oror"]="⩖",
+["ecirc"]="ê",
+["ohbar"]="⦵",
+["Rho"]="Ρ",
+["iacute"]="í",
+["ascr"]="𝒶",
+["RightUpVector"]="↾",
+["Ocirc"]="Ô",
+["cedil"]="¸",
+["sect"]="§",
+["angmsdab"]="⦩",
+["FilledVerySmallSquare"]="▪",
+["curlywedge"]="⋏",
+["lesdotor"]="⪃",
+["esdot"]="≐",
+["eqvparsl"]="⧥",
["Cap"]="⋒",
-["Aring"]="Å",
-["rarr"]="→",
-["Efr"]="𝔈",
-["bigcup"]="⋃",
-["DownLeftRightVector"]="⥐",
-["lesges"]="⪓",
-["NegativeThinSpace"]="​",
-["DownRightTeeVector"]="⥟",
-["npolint"]="⨔",
-["gEl"]="⪌",
-["lltri"]="◺",
-["ogon"]="˛",
-["LessEqualGreater"]="⋚",
-["sqsupset"]="⊐",
-["NotSubsetEqual"]="⊈",
-["Ubrcy"]="Ў",
-["ShortDownArrow"]="↓",
-["ugrave"]="ù",
-["Dcaron"]="Ď",
-["subE"]="⫅",
-["divide"]="÷",
-["bigotimes"]="⨂",
-["dscy"]="ѕ",
-["wreath"]="≀",
-["Jopf"]="𝕁",
-["pre"]="⪯",
-["tdot"]="⃛",
-["Cfr"]="ℭ",
-["Uogon"]="Ų",
-["softcy"]="ь",
-["isinE"]="⋹",
-["Dstrok"]="Đ",
-["Jsercy"]="Ј",
-["capdot"]="⩀",
-["realpart"]="ℜ",
-["hearts"]="♥",
-["Atilde"]="Ã",
-["LeftArrowRightArrow"]="⇆",
-["upharpoonleft"]="↿",
-["Iopf"]="𝕀",
-["Intersection"]="⋂",
-["midcir"]="⫰",
-["ocirc"]="ô",
-["sdot"]="⋅",
-["Dfr"]="𝔇",
-["gla"]="⪥",
-["DiacriticalGrave"]="`",
+["dscr"]="𝒹",
+["rbrace"]="}",
+["nsccue"]="⋡",
+["neArr"]="⇗",
+["rightthreetimes"]="⋌",
+["plusmn"]="±",
["Ubreve"]="Ŭ",
-["int"]="∫",
-["PrecedesSlantEqual"]="≼",
-["Square"]="□",
-["Acy"]="А",
+["ifr"]="𝔦",
+["Poincareplane"]="ℌ",
+["leftrightarrows"]="⇆",
+["scnsim"]="⋩",
+["cscr"]="𝒸",
+["NotHumpEqual"]="≏̸",
+["capbrcup"]="⩉",
+["curarr"]="↷",
+["notinvb"]="⋷",
+["LeftArrow"]="←",
+["Gopf"]="𝔾",
+["ldrushar"]="⥋",
+["nscr"]="𝓃",
+["Gg"]="⋙",
+["ouml"]="ö",
+["nsce"]="⪰̸",
+["cupbrcap"]="⩈",
+["nLt"]="≪⃒",
+["bullet"]="•",
+["nsqsupe"]="⋣",
+["rect"]="▭",
+["lbrace"]="{",
+["Fopf"]="𝔽",
+["COPY"]="©",
+["epar"]="⋕",
+["mscr"]="𝓂",
+["odsold"]="⦼",
+["cupor"]="⩅",
+["not"]="¬",
+["subsim"]="⫇",
+["hoarr"]="⇿",
+["Scedil"]="Ş",
+["eacute"]="é",
+["emsp"]=" ",
+["uml"]="¨",
+["igrave"]="ì",
+["pscr"]="𝓅",
+["LeftTee"]="⊣",
+["Cedilla"]="¸",
+["Iopf"]="𝕀",
+["HumpEqual"]="≏",
+["les"]="⩽",
+["Rcedil"]="Ŗ",
+["lsquor"]="‚",
+["raemptyv"]="⦳",
+["NotSucceedsSlantEqual"]="⋡",
+["SuchThat"]="∋",
+["vert"]="|",
+["backcong"]="≌",
["Hopf"]="ℍ",
-["precsim"]="≾",
-["nleq"]="≰",
-["urcorn"]="⌝",
-["hyphen"]="‐",
-["FilledSmallSquare"]="◼",
-["zdot"]="ż",
-["ndash"]="–",
-["hbar"]="ℏ",
-["Wopf"]="𝕎",
-["Esim"]="⩳",
-["subsetneq"]="⊊",
-["boxhD"]="╥",
-["searhk"]="⤥",
-["late"]="⪭",
+["CircleDot"]="⊙",
+["Kappa"]="Κ",
+["conint"]="∮",
+["DZcy"]="Џ",
+["prsim"]="≾",
+["Copf"]="ℂ",
+["curvearrowright"]="↷",
+["twixt"]="≬",
+["curren"]="¤",
+["rtriltri"]="⧎",
+["jscr"]="𝒿",
+["cupcup"]="⩊",
+["Lcedil"]="Ļ",
+["supseteqq"]="⫆",
+["bfr"]="𝔟",
+["lesseqqgtr"]="⪋",
+["leftleftarrows"]="⇇",
+["Bopf"]="𝔹",
+["acute"]="´",
["blacktriangleright"]="▸",
-["auml"]="ä",
-["NotLessTilde"]="≴",
-["Bfr"]="𝔅",
-["grave"]="`",
-["ltlarr"]="⥶",
-["Aogon"]="Ą",
-["sdote"]="⩦",
-["gtrsim"]="≳",
-["nvinfin"]="⧞",
-["lgE"]="⪑",
-["mdash"]="—",
-["Vopf"]="𝕍",
-["leftrightarrow"]="↔",
-["RBarr"]="⤐",
-["amalg"]="⨿",
-["preccurlyeq"]="≼",
-["EqualTilde"]="≂",
-["scpolint"]="⨓",
-["NotHumpDownHump"]="≎̸",
-["uparrow"]="↑",
-["downarrow"]="↓",
-["boxdL"]="╕",
-["Hstrok"]="Ħ",
-["Ccaron"]="Č",
-["succsim"]="≿",
-["RightFloor"]="⌋",
-["DownBreve"]="̑",
-["succapprox"]="⪸",
-["dsol"]="⧶",
-["napid"]="≋̸",
-["nprcue"]="⋠",
+["frac34"]="¾",
+["Gbreve"]="Ğ",
+["Updownarrow"]="⇕",
+["iscr"]="𝒾",
+["sigmav"]="ς",
+["trade"]="™",
+["minusb"]="⊟",
+["GJcy"]="Ѓ",
+["TildeFullEqual"]="≅",
+["DoubleRightTee"]="⊨",
+["nang"]="∠⃒",
+["ddotseq"]="⩷",
+["copy"]="©",
["Eopf"]="𝔼",
-["ell"]="ℓ",
-["cupdot"]="⊍",
-["Not"]="⫬",
-["zigrarr"]="⇝",
-["downharpoonright"]="⇂",
-["nisd"]="⋺",
-["lotimes"]="⨴",
-["plusmn"]="±",
-["ngE"]="≧̸",
-["odash"]="⊝",
-["emptyset"]="∅",
+["Psi"]="Ψ",
+["UpperRightArrow"]="↗",
+["geqq"]="≧",
+["subedot"]="⫃",
+["nvlArr"]="⤂",
+["Ncedil"]="Ņ",
+["vsupne"]="⊋︀",
+["supset"]="⊃",
["squarf"]="▪",
-["NotGreaterTilde"]="≵",
-["NotTildeFullEqual"]="≇",
-["DownArrowUpArrow"]="⇵",
-["nwarrow"]="↖",
-["looparrowright"]="↬",
+["LeftDoubleBracket"]="⟦",
+["utrif"]="▴",
["Dopf"]="𝔻",
-["oplus"]="⊕",
-["UpEquilibrium"]="⥮",
-["leftthreetimes"]="⋋",
-["DoubleLeftTee"]="⫤",
-["nabla"]="∇",
-["RuleDelayed"]="⧴",
-["euml"]="ë",
-["varsupsetneqq"]="⫌︀",
-["upsi"]="υ",
-["supsup"]="⫖",
-["bsol"]="\\",
-["Copf"]="ℂ",
-["DDotrahd"]="⤑",
-["Upsilon"]="Υ",
-["UpperRightArrow"]="↗",
-["nedot"]="≐̸",
-["NotEqual"]="≠",
-["bumpeq"]="≏",
-["emsp14"]=" ",
-["frac38"]="⅜",
-["DownTeeArrow"]="↧",
-["Bopf"]="𝔹",
-["capand"]="⩄",
-["nleqq"]="≦̸",
-["ratio"]="∶",
-["eplus"]="⩱",
-["nge"]="≱",
-["laquo"]="«",
-["urtri"]="◹",
-["LeftUpVector"]="↿",
-["gl"]="≷",
-["Gt"]="≫",
-["andd"]="⩜",
+["ape"]="≊",
+["gEl"]="⪌",
+["COPY"]="©",
+["afr"]="𝔞",
+["Acy"]="А",
+["ldquor"]="„",
+["because"]="∵",
+["Pr"]="⪻",
+["OverBar"]="‾",
+["lang"]="⟨",
+["mopf"]="𝕞",
+["crarr"]="↵",
+["Epsilon"]="Ε",
+["Nfr"]="𝔑",
+["kjcy"]="ќ",
+["TildeTilde"]="≈",
+["bsim"]="∽",
+["lcy"]="л",
+["larrb"]="⇤",
+["ncong"]="≇",
+["ENG"]="Ŋ",
+["brvbar"]="¦",
+["Rightarrow"]="⇒",
+["nopf"]="𝕟",
+["Wfr"]="𝔚",
+["ljcy"]="љ",
+["diamondsuit"]="♦",
+["latail"]="⤙",
+["lambda"]="λ",
+["frac14"]="¼",
+["mcy"]="м",
+["nparsl"]="⫽⃥",
+["lBarr"]="⤎",
+["subdot"]="⪽",
+["frac12"]="½",
+["kopf"]="𝕜",
+["LeftCeiling"]="⌈",
+["erarr"]="⥱",
+["pre"]="⪯",
+["varr"]="↕",
+["Pi"]="Π",
+["sub"]="⊂",
+["ncy"]="н",
+["marker"]="▮",
+["rpargt"]="⦔",
+["supe"]="⊇",
+["veebar"]="⊻",
+["checkmark"]="✓",
+["nbsp"]=" ",
+["sqsupseteq"]="⊒",
+["upharpoonright"]="↾",
+["lopf"]="𝕝",
+["Omicron"]="Ο",
+["ccaps"]="⩍",
+["lrhard"]="⥭",
["Lstrok"]="Ł",
-["gamma"]="γ",
-["Sc"]="⪼",
-["Aopf"]="𝔸",
-["pluscir"]="⨢",
-["Itilde"]="Ĩ",
-["DoubleRightTee"]="⊨",
-["pluse"]="⩲",
-["iiint"]="∭",
-["dotplus"]="∔",
-["vrtri"]="⊳",
-["Proportion"]="∷",
-["bne"]="=⃥",
-["cuepr"]="⋞",
+["Mfr"]="𝔐",
+["njcy"]="њ",
+["ocy"]="о",
+["Zcaron"]="Ž",
+["NotSucceeds"]="⊁",
+["rarrbfs"]="⤠",
+["gtrapprox"]="⪆",
+["oS"]="Ⓢ",
+["diamond"]="⋄",
+["gesdot"]="⪀",
+["urcorner"]="⌝",
+["lotimes"]="⨴",
+["pertenk"]="‱",
+["rfisht"]="⥽",
+["Zfr"]="ℨ",
+["Map"]="⤅",
+["cross"]="✗",
+["DifferentialD"]="ⅆ",
+["boxtimes"]="⊠",
+["horbar"]="―",
+["lg"]="≶",
+["orarr"]="↻",
+["Vbar"]="⫫",
+["ropf"]="𝕣",
+["NotDoubleVerticalBar"]="∦",
+["Sfr"]="𝔖",
+["Iuml"]="Ï",
+["leftharpoondown"]="↽",
+["atilde"]="ã",
+["VerticalTilde"]="≀",
+["DoubleContourIntegral"]="∯",
+["longleftarrow"]="⟵",
+["Im"]="ℑ",
+["RightUpVectorBar"]="⥔",
+["nGg"]="⋙̸",
+["scap"]="⪸",
+["nrarr"]="↛",
+["ycy"]="ы",
+["ucirc"]="û",
+["qopf"]="𝕢",
+["oopf"]="𝕠",
+["yacute"]="ý",
+["Xfr"]="𝔛",
+["fork"]="⋔",
+["in"]="∈",
+["xcap"]="⋂",
+["check"]="✓",
+["jcy"]="й",
+["Phi"]="Φ",
+["doteq"]="≐",
["vBar"]="⫨",
-["yucy"]="ю",
-["PrecedesTilde"]="≾",
-["varr"]="↕",
-["leftarrowtail"]="↢",
-["rangle"]="⟩",
-["subsub"]="⫕",
-["rightarrowtail"]="↣",
-["oslash"]="ø",
-["mapstodown"]="↧",
-["sqsube"]="⊑",
-["NewLine"]="\n",
-["Vdash"]="⊩",
-["num"]="#",
-["umacr"]="ū",
-["InvisibleTimes"]="⁢",
-["bemptyv"]="⦰",
+["frown"]="⌢",
["Iogon"]="Į",
-["ssmile"]="⌣",
-["timesbar"]="⨱",
-["Tstrok"]="Ŧ",
-["Icy"]="И",
-["zacute"]="ź",
-["Cedilla"]="¸",
-["daleth"]="ℸ",
-["semi"]=";",
-["ssetmn"]="∖",
-["subdot"]="⪽",
-["Bernoullis"]="ℬ",
-["otimesas"]="⨶",
-["circleddash"]="⊝",
-["circlearrowright"]="↻",
-["NotLeftTriangleEqual"]="⋬",
-["NotTilde"]="≁",
-["npart"]="∂̸",
-["Gbreve"]="Ğ",
-["gtrless"]="≷",
-["pound"]="£",
-["curlyeqsucc"]="⋟",
-["blacklozenge"]="⧫",
-["ldca"]="⤶",
-["nsucc"]="⊁",
-["top"]="⊤",
-["ufr"]="𝔲",
-["sscr"]="𝓈",
-["eDDot"]="⩷",
-["Updownarrow"]="⇕",
-["loz"]="◊",
-["Gcy"]="Г",
-["boxdl"]="┐",
+["gnsim"]="⋧",
+["nsupset"]="⊃⃒",
+["equals"]="=",
+["angmsdac"]="⦪",
+["odash"]="⊝",
+["Hstrok"]="Ħ",
+["homtht"]="∻",
+["maltese"]="✠",
+["esim"]="≂",
+["realine"]="ℛ",
+["straightepsilon"]="ϵ",
+["utri"]="▵",
+["primes"]="ℙ",
+["dbkarow"]="⤏",
+["NotLessTilde"]="≴",
+["nvrArr"]="⤃",
+["cularrp"]="⤽",
+["supsup"]="⫖",
+["rang"]="⟩",
+["nshortmid"]="∤",
+["NotCupCap"]="≭",
+["gnE"]="≩",
+["otilde"]="õ",
+["LeftTriangle"]="⊲",
+["oelig"]="œ",
+["curarrm"]="⤼",
+["orderof"]="ℴ",
+["DoubleLongLeftArrow"]="⟸",
+["OverParenthesis"]="⏜",
+["amacr"]="ā",
+["copysr"]="℗",
+["acirc"]="â",
+["LeftArrowRightArrow"]="⇆",
+["filig"]="fi",
+["uopf"]="𝕦",
+["rlhar"]="⇌",
+["dharl"]="⇃",
+["rAarr"]="⇛",
+["rarrw"]="↝",
+["isin"]="∈",
+["simg"]="⪞",
+["NoBreak"]="⁠",
+["rAtail"]="⤜",
+["ndash"]="–",
+["IJlig"]="IJ",
+["dfr"]="𝔡",
+["ohm"]="Ω",
+["breve"]="˘",
+["ccedil"]="ç",
+["topf"]="𝕥",
+["nvDash"]="⊭",
+["RBarr"]="⤐",
+["clubs"]="♣",
["napos"]="ʼn",
-["Sqrt"]="√",
-["xsqcup"]="⨆",
-["Implies"]="⇒",
-["uring"]="ů",
-["thetav"]="ϑ",
-["iiiint"]="⨌",
-["nLeftrightarrow"]="⇎",
-["lobrk"]="⟦",
-["xfr"]="𝔵",
-["Abreve"]="Ă",
-["micro"]="µ",
-["quatint"]="⨖",
-["congdot"]="⩭",
-["nrtrie"]="⋭",
-["Fcy"]="Ф",
-["hksearow"]="⤥",
-["LowerLeftArrow"]="↙",
-["rdca"]="⤷",
-["OverBar"]="‾",
-["frac12"]="½",
-["imacr"]="ī",
-["boxVL"]="╣",
-["sfr"]="𝔰",
-["ensp"]=" ",
-["dwangle"]="⦦",
-["boxh"]="─",
-["Eogon"]="Ę",
+["ngtr"]="≯",
+["Tstrok"]="Ŧ",
+["lrarr"]="⇆",
+["eqslantgtr"]="⪖",
+["efr"]="𝔢",
+["gne"]="⪈",
+["csube"]="⫑",
+["Xi"]="Ξ",
+["sopf"]="𝕤",
+["LeftVector"]="↼",
+["ggg"]="⋙",
+["Ubrcy"]="Ў",
+["die"]="¨",
+["topbot"]="⌶",
+["Rfr"]="ℜ",
+["ofcir"]="⦿",
["imped"]="Ƶ",
-["Ecy"]="Э",
-["lates"]="⪭︀",
-["phi"]="φ",
-["minusd"]="∸",
-["planckh"]="ℎ",
-["Ocirc"]="Ô",
-["lE"]="≦",
-["sum"]="∑",
-["lrtri"]="⊿",
-["ruluhar"]="⥨",
-["lAarr"]="⇚",
-["DownArrow"]="↓",
-["zscr"]="𝓏",
-["questeq"]="≟",
-["ngeqq"]="≧̸",
-["And"]="⩓",
-["Dcy"]="Д",
-["angrtvbd"]="⦝",
-["rarrpl"]="⥅",
-["thkap"]="≈",
-["Otimes"]="⨷",
-["lesssim"]="≲",
-["gE"]="≧",
-["ouml"]="ö",
-["nsubseteq"]="⊈",
-["bigcirc"]="◯",
+["plusmn"]="±",
+["nles"]="⩽̸",
+["pcy"]="п",
+["permil"]="‰",
+["notinE"]="⋹̸",
+["bigoplus"]="⨁",
+["boxplus"]="⊞",
+["doublebarwedge"]="⌆",
+["ccaron"]="č",
+["asymp"]="≈",
+["sup1"]="¹",
+["bumpeq"]="≏",
+["nrtrie"]="⋭",
+["larrbfs"]="⤟",
+["emacr"]="ē",
+["gtrless"]="≷",
+["Kfr"]="𝔎",
+["plus"]="+",
+["risingdotseq"]="≓",
+["notindot"]="⋵̸",
+["Subset"]="⋐",
+["CloseCurlyDoubleQuote"]="”",
+["nlsim"]="≴",
+["dcaron"]="ď",
["boxVR"]="╠",
-["Vert"]="‖",
-["naturals"]="ℕ",
-["plussim"]="⨦",
-["wscr"]="𝓌",
-["raquo"]="»",
-["bigodot"]="⨀",
-["dashv"]="⊣",
-["hairsp"]=" ",
-["inodot"]="ı",
-["vnsup"]="⊃⃒",
+["lne"]="⪇",
+["Pfr"]="𝔓",
+["rightsquigarrow"]="↝",
+["phone"]="☎",
+["DiacriticalDot"]="˙",
+["Congruent"]="≡",
+["SquareIntersection"]="⊓",
+["ordf"]="ª",
+["loz"]="◊",
["cire"]="≗",
-["vartriangleleft"]="⊲",
-["rbrke"]="⦌",
-["boxuL"]="╛",
-["sce"]="⪰",
-["nrtri"]="⋫",
-["loarr"]="⇽",
-["ShortRightArrow"]="→",
-["xscr"]="𝓍",
-["Bcy"]="Б",
-["HumpEqual"]="≏",
-["lmidot"]="ŀ",
-["DownLeftVector"]="↽",
-["leftharpoonup"]="↼",
+["ecaron"]="ě",
+["nsub"]="⊄",
+["Fouriertrf"]="ℱ",
+["Qfr"]="𝔔",
+["dblac"]="˝",
+["sc"]="≻",
+["xrarr"]="⟶",
+["ImaginaryI"]="ⅈ",
+["angmsdag"]="⦮",
+["wopf"]="𝕨",
+["middot"]="·",
+["gsiml"]="⪐",
+["biguplus"]="⨄",
+["Prime"]="″",
+["bigcirc"]="◯",
+["vsubnE"]="⫋︀",
+["lrtri"]="⊿",
+["nparallel"]="∦",
["lbbrk"]="❲",
-["rarrtl"]="↣",
-["SucceedsEqual"]="⪰",
-["HumpDownHump"]="≎",
-["Vee"]="⋁",
-["Gopf"]="𝔾",
-["otilde"]="õ",
-["ofr"]="𝔬",
-["Sub"]="⋐",
-["gnE"]="≩",
-["SquareSuperset"]="⊐",
-["leftrightharpoons"]="⇋",
-["tosa"]="⤩",
-["Ucirc"]="Û",
-["mscr"]="𝓂",
-["Exists"]="∃",
-["langle"]="⟨",
-["rfr"]="𝔯",
-["THORN"]="Þ",
-["gtreqqless"]="⪌",
-["eqvparsl"]="⧥",
-["NotCongruent"]="≢",
-["phiv"]="ϕ",
-["lsquor"]="‚",
-["prec"]="≺",
-["igrave"]="ì",
-["Fopf"]="𝔽",
-["nwArr"]="⇖",
-["nscr"]="𝓃",
-["gescc"]="⪩",
-["intprod"]="⨼",
-["larrlp"]="↫",
-["AMP"]="&",
-["psi"]="ψ",
-["mDDot"]="∺",
-["VDash"]="⊫",
-["Lleftarrow"]="⇚",
-["mfr"]="𝔪",
+["dotsquare"]="⊡",
+["rceil"]="⌉",
["gesles"]="⪔",
-["kscr"]="𝓀",
-["Omega"]="Ω",
-["bumpe"]="≏",
-["NotDoubleVerticalBar"]="∦",
-["frac18"]="⅛",
-["ecolon"]="≕",
-["compfn"]="∘",
-["supdot"]="⪾",
-["Alpha"]="Α",
-["rsquor"]="’",
+["roarr"]="⇾",
+["simplus"]="⨤",
+["lagran"]="ℒ",
+["pr"]="≺",
+["mnplus"]="∓",
+["Iota"]="Ι",
+["NestedLessLess"]="≪",
+["utilde"]="ũ",
+["mldr"]="…",
+["bigstar"]="★",
+["micro"]="µ",
["percnt"]="%",
-["pfr"]="𝔭",
-["frasl"]="⁄",
-["lscr"]="𝓁",
-["aleph"]="ℵ",
-["swArr"]="⇙",
-["uuml"]="ü",
-["uacute"]="ú",
-["scE"]="⪴",
-["hellip"]="…",
+["fllig"]="fl",
+["euml"]="ë",
+["circledR"]="®",
+["lltri"]="◺",
+["IEcy"]="Е",
+["notniva"]="∌",
+["or"]="∨",
+["curvearrowleft"]="↶",
+["gnapprox"]="⪊",
+["NotLessSlantEqual"]="⩽̸",
+["Cconint"]="∰",
+["NotSucceedsTilde"]="≿̸",
+["gammad"]="ϝ",
+["rightharpoondown"]="⇁",
+["CounterClockwiseContourIntegral"]="∳",
+["supdot"]="⪾",
+["upsi"]="υ",
+["nvle"]="≤⃒",
+["beth"]="ℶ",
+["nhArr"]="⇎",
+["Gamma"]="Γ",
+["complement"]="∁",
+["xoplus"]="⨁",
+["chi"]="χ",
+["backepsilon"]="϶",
+["nsube"]="⊈",
+["aopf"]="𝕒",
+["para"]="¶",
+["drbkarow"]="⤐",
+["Dstrok"]="Đ",
+["isinE"]="⋹",
+["Ecirc"]="Ê",
+["aelig"]="æ",
["ulcorner"]="⌜",
-["prnap"]="⪹",
-["Gg"]="⋙",
-["wedge"]="∧",
-["SquareSubset"]="⊏",
-["qscr"]="𝓆",
-["kfr"]="𝔨",
-["RightTee"]="⊢",
-["eqsim"]="≂",
-["rbrksld"]="⦎",
-["ohm"]="Ω",
-["lozf"]="⧫",
-["cups"]="∪︀",
-["epsilon"]="ε",
-["ncap"]="⩃",
-["Leftarrow"]="⇐",
-["ultri"]="◸",
-["egrave"]="è",
-["vBarv"]="⫩",
-["bNot"]="⫭",
-["nfr"]="𝔫",
-["rsqb"]="]",
-["OpenCurlyDoubleQuote"]="“",
-["rsquo"]="’",
-["Del"]="∇",
-["smtes"]="⪬︀",
-["varphi"]="ϕ",
-["CirclePlus"]="⊕",
-["prcue"]="≼",
-["curren"]="¤",
-["nltri"]="⋪",
-["oscr"]="ℴ",
-["Wcirc"]="Ŵ",
-["prime"]="′",
-["ifr"]="𝔦",
-["apos"]="'",
-["UpTee"]="⊥",
-["lescc"]="⪨",
-["NegativeMediumSpace"]="​",
-["DownTee"]="⊤",
-["NotSquareSubsetEqual"]="⋢",
-["LowerRightArrow"]="↘",
-["wr"]="≀",
+["Lcaron"]="Ľ",
+["bopf"]="𝕓",
+["midast"]="*",
+["barvee"]="⊽",
+["nvgt"]=">⃒",
+["bnequiv"]="≡⃥",
+["caron"]="ˇ",
["andand"]="⩕",
-["gvnE"]="≩︀",
-["lfr"]="𝔩",
-["lowast"]="∗",
-["gfr"]="𝔤",
-["digamma"]="ϝ",
-["cemptyv"]="⦲",
-["ubreve"]="ŭ",
-["dstrok"]="đ",
+["eparsl"]="⧣",
+["xhArr"]="⟺",
+["Yuml"]="Ÿ",
+["fallingdotseq"]="≒",
+["vltri"]="⊲",
+["gtrarr"]="⥸",
+["nGtv"]="≫̸",
+["congdot"]="⩭",
+["lfisht"]="⥼",
+["nrtri"]="⋫",
+["prnsim"]="⋨",
+["nsupE"]="⫆̸",
+["Colone"]="⩴",
+["SquareSuperset"]="⊐",
+["boxUL"]="╝",
+["Rrightarrow"]="⇛",
+["nleftrightarrow"]="↮",
+["Conint"]="∯",
+["ffilig"]="ffi",
+["nleqq"]="≦̸",
+["drcrop"]="⌌",
+["boxh"]="─",
+["Lang"]="⟪",
+["ldrdhar"]="⥧",
+["rbrack"]="]",
+["nvinfin"]="⧞",
+["succsim"]="≿",
+["boxhu"]="┴",
+["tau"]="τ",
+["incare"]="℅",
+["flat"]="♭",
+["angst"]="Å",
+["Oslash"]="Ø",
+["Vfr"]="𝔙",
+["tscy"]="ц",
+["lates"]="⪭︀",
+["eopf"]="𝕖",
+["Because"]="∵",
+["frac25"]="⅖",
+["daleth"]="ℸ",
+["ic"]="⁣",
+["ensp"]=" ",
+["lrm"]="‎",
+["DoubleLeftRightArrow"]="⇔",
+["kappa"]="κ",
+["fopf"]="𝕗",
+["cularr"]="↶",
+["shy"]="­",
+["yen"]="¥",
+["glj"]="⪤",
+["dzcy"]="џ",
["expectation"]="ℰ",
-["sime"]="≃",
-["ltrif"]="◂",
-["iacute"]="í",
-["chi"]="χ",
+["dash"]="‐",
+["female"]="♀",
+["UnderBrace"]="⏟",
+["rotimes"]="⨵",
+["caps"]="∩︀",
+["copf"]="𝕔",
+["lparlt"]="⦓",
+["NotLess"]="≮",
+["simrarr"]="⥲",
+["dtri"]="▿",
+["supne"]="⊋",
+["block"]="█",
+["siml"]="⪝",
+["blk12"]="▒",
+["natural"]="♮",
+["frac34"]="¾",
+["frac38"]="⅜",
+["Ufr"]="𝔘",
+["gg"]="≫",
+["Square"]="□",
+["lt"]="<",
["erDot"]="≓",
-["Vcy"]="В",
+["RightAngleBracket"]="⟩",
+["LeftDownTeeVector"]="⥡",
+["NotGreaterGreater"]="≫̸",
+["uogon"]="ų",
+["ocirc"]="ô",
+["sung"]="♪",
+["dollar"]="$",
+["Scaron"]="Š",
+["top"]="⊤",
+["iopf"]="𝕚",
+["udhar"]="⥮",
+["gjcy"]="ѓ",
+["ncap"]="⩃",
+["circlearrowleft"]="↺",
+["bernou"]="ℬ",
+["angmsdaf"]="⦭",
+["ldsh"]="↲",
+["isins"]="⋴",
+["RoundImplies"]="⥰",
+["bigtriangledown"]="▽",
+["LeftAngleBracket"]="⟨",
+["HorizontalLine"]="─",
+["Vdashl"]="⫦",
+["rHar"]="⥤",
+["Tcaron"]="Ť",
+["LeftDownVectorBar"]="⥙",
+["jopf"]="𝕛",
+["LeftRightVector"]="⥎",
+["LessGreater"]="≶",
+["npart"]="∂̸",
+["nsmid"]="∤",
+["RightTriangleBar"]="⧐",
+["nesim"]="≂̸",
+["deg"]="°",
+["LeftTeeArrow"]="↤",
+["NotHumpDownHump"]="≎̸",
+["tridot"]="◬",
+["lceil"]="⌈",
+["ExponentialE"]="ⅇ",
+["tosa"]="⤩",
+["gopf"]="𝕘",
+["ContourIntegral"]="∮",
+["late"]="⪭",
+["bbrk"]="⎵",
+["half"]="½",
["boxhd"]="┬",
-["DoubleDownArrow"]="⇓",
-["lArr"]="⇐",
-["demptyv"]="⦱",
-["smt"]="⪪",
-["intcal"]="⊺",
-["in"]="∈",
-["capcup"]="⩇",
-["kjcy"]="ќ",
-["Ccirc"]="Ĉ",
-["bnequiv"]="≡⃥",
-["Emacr"]="Ē",
-["siml"]="⪝",
-["jfr"]="𝔧",
-["gesdoto"]="⪂",
-["efr"]="𝔢",
-["precneqq"]="⪵",
-["because"]="∵",
-["Udblac"]="Ű",
-["lg"]="≶",
-["boxvr"]="├",
-["fpartint"]="⨍",
-["rbbrk"]="❳",
-["LT"]="<",
-["cap"]="∩",
-["circledR"]="®",
-["notinvc"]="⋶",
-["zwj"]="‍",
-["nle"]="≰",
-["hfr"]="𝔥",
-["bigsqcup"]="⨆",
-["nGg"]="⋙̸",
-["doublebarwedge"]="⌆",
+["hopf"]="𝕙",
+["Ouml"]="Ö",
+["Atilde"]="Ã",
+["planckh"]="ℎ",
+["MinusPlus"]="∓",
+["uharl"]="↿",
+["aleph"]="ℵ",
+["boxHD"]="╦",
+["lesseqgtr"]="⋚",
+["colon"]=":",
+["SquareSupersetEqual"]="⊒",
+["isinsv"]="⋳",
+["lnapprox"]="⪉",
+["PrecedesSlantEqual"]="≼",
+["boxuL"]="╛",
+["csup"]="⫐",
+["hstrok"]="ħ",
+["leftrightharpoons"]="⇋",
+["boxuR"]="╘",
+["DD"]="ⅅ",
+["Longrightarrow"]="⟹",
+["epsilon"]="ε",
+["NotTildeTilde"]="≉",
+["nfr"]="𝔫",
+["Vscr"]="𝒱",
+["Ncy"]="Н",
+["boxUl"]="╜",
+["searr"]="↘",
+["ddagger"]="‡",
+["KHcy"]="Х",
+["NotSuperset"]="⊃⃒",
+["Uparrow"]="⇑",
+["nsqsube"]="⋢",
+["Imacr"]="Ī",
+["nspar"]="∦",
+["supsetneqq"]="⫌",
+["Sscr"]="𝒮",
+["lobrk"]="⟦",
+["mfr"]="𝔪",
+["acirc"]="â",
+["subne"]="⊊",
+["Icirc"]="Î",
+["Re"]="ℜ",
+["nearrow"]="↗",
["YUcy"]="Ю",
-["empty"]="∅",
-["nacute"]="ń",
-["Acirc"]="Â",
-["bigtriangleup"]="△",
-["hybull"]="⁃",
-["Ycy"]="Ы",
-["isindot"]="⋵",
-["iota"]="ι",
-["numero"]="№",
-["cfr"]="𝔠",
-["llarr"]="⇇",
-["lrhard"]="⥭",
-["cross"]="✗",
+["eqsim"]="≂",
+["UnionPlus"]="⊎",
+["topcir"]="⫱",
+["boxVL"]="╣",
+["Xscr"]="𝒳",
+["QUOT"]="\"",
+["RightDownVectorBar"]="⥕",
+["epsi"]="ε",
+["natur"]="♮",
+["leftthreetimes"]="⋋",
+["hercon"]="⊹",
+["lHar"]="⥢",
+["Aring"]="Å",
+["Kcedil"]="Ķ",
+["kfr"]="𝔨",
+["Oacute"]="Ó",
["zwnj"]="‌",
+["plusdu"]="⨥",
+["Kcy"]="К",
+["sqcup"]="⊔",
+["zscr"]="𝓏",
+["Assign"]="≔",
+["zopf"]="𝕫",
+["lstrok"]="ł",
+["zigrarr"]="⇝",
+["ShortDownArrow"]="↓",
+["simlE"]="⪟",
+["mid"]="∣",
["zeta"]="ζ",
-["precnsim"]="⋨",
-["zcy"]="з",
+["gE"]="≧",
+["zeetrf"]="ℨ",
+["qfr"]="𝔮",
["zcaron"]="ž",
-["xodot"]="⨀",
-["RightDownTeeVector"]="⥝",
-["ljcy"]="љ",
+["Yacute"]="Ý",
+["hksearow"]="⤥",
+["Atilde"]="Ã",
+["zacute"]="ź",
+["bsemi"]="⁏",
+["bigtriangleup"]="△",
+["yuml"]="ÿ",
+["yucy"]="ю",
["yscr"]="𝓎",
+["yopf"]="𝕪",
["yicy"]="ї",
-["Rcy"]="Р",
-["nsubset"]="⊂⃒",
-["yen"]="¥",
-["ycy"]="ы",
-["simeq"]="≃",
-["dharr"]="⇂",
-["ycirc"]="ŷ",
-["hArr"]="⇔",
-["yacute"]="ý",
-["yacute"]="ý",
+["urcorn"]="⌝",
+["Aacute"]="Á",
+["backsimeq"]="⋍",
+["ShortUpArrow"]="↑",
["xwedge"]="⋀",
-["xoplus"]="⨁",
-["nparsl"]="⫽⃥",
-["PartialD"]="∂",
-["YAcy"]="Я",
-["xrArr"]="⟹",
-["xotime"]="⨂",
-["sstarf"]="⋆",
-["yuml"]="ÿ",
-["Int"]="∬",
-["bsolb"]="⧅",
+["Jcy"]="Й",
+["nltrie"]="⋬",
+["starf"]="★",
+["zfr"]="𝔷",
+["comma"]=",",
+["xsqcup"]="⨆",
+["boxVr"]="╟",
+["cirscir"]="⧂",
+["ucirc"]="û",
+["Cross"]="⨯",
+["naturals"]="ℕ",
+["quaternions"]="ℍ",
+["xopf"]="𝕩",
+["xodot"]="⨀",
["xnis"]="⋻",
-["xmap"]="⟼",
-["hercon"]="⊹",
-["xlArr"]="⟸",
-["xharr"]="⟷",
-["rbrack"]="]",
+["lsaquo"]="‹",
+["xlarr"]="⟵",
+["Zacute"]="Ź",
+["vdash"]="⊢",
+["submult"]="⫁",
+["Oscr"]="𝒪",
["xdtri"]="▽",
-["diamond"]="⋄",
+["LowerRightArrow"]="↘",
["xcup"]="⋃",
-["subsup"]="⫓",
-["lneqq"]="≨",
-["dharl"]="⇃",
-["Scy"]="С",
-["wopf"]="𝕨",
-["rightleftharpoons"]="⇌",
-["wfr"]="𝔴",
-["nsupseteqq"]="⫆̸",
-["boxuR"]="╘",
-["permil"]="‰",
+["Ycy"]="Ы",
+["timesb"]="⊠",
+["Ucirc"]="Û",
+["eth"]="ð",
+["wscr"]="𝓌",
+["ratail"]="⤚",
+["wr"]="≀",
+["Ograve"]="Ò",
+["wp"]="℘",
+["euml"]="ë",
+["yfr"]="𝔶",
+["rangle"]="⟩",
+["hearts"]="♥",
["wedgeq"]="≙",
-["eparsl"]="⧣",
-["RoundImplies"]="⥰",
-["afr"]="𝔞",
-["vsubne"]="⊊︀",
-["sup2"]="²",
+["wedge"]="∧",
+["gtcir"]="⩺",
+["par"]="∥",
+["swarr"]="↙",
+["phiv"]="ϕ",
+["NotElement"]="∉",
+["alpha"]="α",
+["SquareUnion"]="⊔",
+["parsl"]="⫽",
["vscr"]="𝓋",
+["rharu"]="⇀",
+["vrtri"]="⊳",
+["comp"]="∁",
+["Agrave"]="À",
+["rdca"]="⤷",
+["vprop"]="∝",
+["Tscr"]="𝒯",
["vopf"]="𝕧",
-["lbrace"]="{",
+["ldca"]="⤶",
["vnsub"]="⊂⃒",
-["vltri"]="⊲",
-["Uacute"]="Ú",
-["vfr"]="𝔳",
-["sacute"]="ś",
-["njcy"]="њ",
-["frac35"]="⅗",
-["squf"]="▪",
+["gbreve"]="ğ",
+["NotSquareSubset"]="⊏̸",
+["verbar"]="|",
+["YAcy"]="Я",
["veeeq"]="≚",
-["lsime"]="⪍",
-["mapstoleft"]="↤",
+["downharpoonleft"]="⇃",
+["Star"]="⋆",
+["xfr"]="𝔵",
+["nges"]="⩾̸",
+["GreaterGreater"]="⪢",
+["vartriangleright"]="⊳",
+["rcy"]="р",
+["vartheta"]="ϑ",
+["varsupsetneqq"]="⫌︀",
+["dashv"]="⊣",
["varsupsetneq"]="⊋︀",
-["varsubsetneq"]="⊊︀",
-["Tcy"]="Т",
-["cwint"]="∱",
-["varsigma"]="ς",
-["LessGreater"]="≶",
+["Ncaron"]="Ň",
+["varsubsetneqq"]="⫋︀",
["varrho"]="ϱ",
-["varpropto"]="∝",
-["pr"]="≺",
-["backprime"]="‵",
+["triangledown"]="▿",
+["varpi"]="ϖ",
+["sol"]="/",
+["ssetmn"]="∖",
+["varnothing"]="∅",
["varkappa"]="ϰ",
-["Poincareplane"]="ℌ",
-["roplus"]="⨮",
-["Edot"]="Ė",
-["copysr"]="℗",
+["vangrt"]="⦜",
+["Leftarrow"]="⇐",
+["Qscr"]="𝒬",
+["uwangle"]="⦧",
+["rarrap"]="⥵",
["uuml"]="ü",
-["dfr"]="𝔡",
["uuarr"]="⇈",
-["uogon"]="ų",
-["Uscr"]="𝒰",
-["gel"]="⋛",
-["olarr"]="↺",
-["lsaquo"]="‹",
-["omacr"]="ō",
-["utdot"]="⋰",
-["or"]="∨",
-["Ocirc"]="Ô",
-["ClockwiseContourIntegral"]="∲",
-["SmallCircle"]="∘",
-["gtcc"]="⪧",
["uscr"]="𝓊",
+["urtri"]="◹",
+["uring"]="ů",
+["sect"]="§",
+["quatint"]="⨖",
["urcrop"]="⌎",
-["ContourIntegral"]="∮",
-["szlig"]="ß",
-["egs"]="⪖",
-["Ucy"]="У",
-["ange"]="⦤",
-["upharpoonright"]="↾",
-["xcap"]="⋂",
+["wfr"]="𝔴",
+["duhar"]="⥯",
+["upuparrows"]="⇈",
+["macr"]="¯",
+["SmallCircle"]="∘",
+["upsih"]="ϒ",
+["uplus"]="⊎",
+["shy"]="­",
+["uparrow"]="↑",
["uml"]="¨",
-["nsubseteqq"]="⫅̸",
+["eDot"]="≑",
+["blk34"]="▓",
+["umacr"]="ū",
+["ultri"]="◸",
+["rbbrk"]="❳",
["ulcorn"]="⌜",
-["uhblk"]="▀",
-["scirc"]="ŝ",
-["shy"]="­",
-["uharl"]="↿",
+["uharr"]="↾",
["ugrave"]="ù",
-["lstrok"]="ł",
-["Gamma"]="Γ",
-["udhar"]="⥮",
-["udblac"]="ű",
-["ucirc"]="û",
-["loang"]="⟬",
-["uarr"]="↑",
+["Ograve"]="Ò",
+["nsupseteq"]="⊉",
+["ufisht"]="⥾",
+["Breve"]="˘",
+["ucy"]="у",
+["cylcty"]="⌭",
+["ubreve"]="ŭ",
+["SHcy"]="Ш",
+["boxdR"]="╒",
+["awint"]="⨑",
+["uHar"]="⥣",
["uArr"]="⇑",
-["twoheadrightarrow"]="↠",
+["REG"]="®",
+["twoheadleftarrow"]="↞",
["tstrok"]="ŧ",
+["iprod"]="⨼",
["tshcy"]="ћ",
-["tscy"]="ц",
-["angsph"]="∢",
-["kappa"]="κ",
["tscr"]="𝓉",
-["tritime"]="⨻",
-["trisb"]="⧍",
+["trpezium"]="⏢",
+["ycirc"]="ŷ",
+["larrhk"]="↩",
+["triplus"]="⨹",
["triminus"]="⨺",
-["trie"]="≜",
-["tridot"]="◬",
-["aacute"]="á",
+["Rsh"]="↱",
+["becaus"]="∵",
+["Acirc"]="Â",
["trianglerighteq"]="⊵",
-["RightTeeVector"]="⥛",
["triangleright"]="▹",
+["hkswarow"]="⤦",
+["triangleq"]="≜",
+["AElig"]="Æ",
["trianglelefteq"]="⊴",
+["varpropto"]="∝",
["triangle"]="▵",
-["NegativeVeryThinSpace"]="​",
-["triangledown"]="▿",
-["dash"]="‐",
-["trade"]="™",
+["tprime"]="‴",
["topfork"]="⫚",
-["Upsi"]="ϒ",
-["topcir"]="⫱",
-["loplus"]="⨭",
-["Zdot"]="Ż",
-["lbrke"]="⦋",
-["angmsd"]="∡",
-["dArr"]="⇓",
-["topbot"]="⌶",
["toea"]="⤨",
-["iexcl"]="¡",
-["acirc"]="â",
-["easter"]="⩮",
-["CloseCurlyDoubleQuote"]="”",
-["cupcup"]="⩊",
-["rlhar"]="⇌",
-["nsimeq"]="≄",
-["Uparrow"]="⇑",
-["tau"]="τ",
-["npr"]="⊀",
-["phone"]="☎",
-["emacr"]="ē",
-["SHcy"]="Ш",
-["gtdot"]="⋗",
-["ReverseUpEquilibrium"]="⥯",
+["ac"]="∾",
+["timesd"]="⨰",
+["UpArrowDownArrow"]="⇅",
+["timesbar"]="⨱",
+["llhard"]="⥫",
+["CHcy"]="Ч",
+["odblac"]="ő",
+["THORN"]="Þ",
+["notni"]="∌",
+["nbump"]="≎̸",
+["eqcolon"]="≕",
["tilde"]="˜",
-["angmsdac"]="⦪",
-["duhar"]="⥯",
-["approxeq"]="≊",
-["NotSupersetEqual"]="⊉",
-["thorn"]="þ",
-["thksim"]="∼",
-["subsim"]="⫇",
-["bnot"]="⌐",
+["simgE"]="⪠",
+["intercal"]="⊺",
+["thetasym"]="ϑ",
+["xcirc"]="◯",
["thinsp"]=" ",
["thicksim"]="∼",
-["gt"]=">",
-["UpperLeftArrow"]="↖",
-["thetasym"]="ϑ",
-["simlE"]="⪟",
-["bbrktbrk"]="⎶",
-["Jcirc"]="Ĵ",
-["cedil"]="¸",
-["NotLessSlantEqual"]="⩽̸",
-["rx"]="℞",
-["infin"]="∞",
-["curlyvee"]="⋎",
-["LeftArrow"]="←",
-["tfr"]="𝔱",
-["blacksquare"]="▪",
-["emptyv"]="∅",
-["Mellintrf"]="ℳ",
-["aogon"]="ą",
-["succnapprox"]="⪺",
-["tcy"]="т",
-["ecaron"]="ě",
+["LeftArrowBar"]="⇤",
+["Uuml"]="Ü",
+["DownTeeArrow"]="↧",
+["cent"]="¢",
+["hookleftarrow"]="↩",
+["odiv"]="⨸",
+["therefore"]="∴",
+["ClockwiseContourIntegral"]="∲",
+["Ofr"]="𝔒",
+["auml"]="ä",
+["frac12"]="½",
+["nRightarrow"]="⇏",
+["kcedil"]="ķ",
+["DownRightVectorBar"]="⥗",
+["boxDL"]="╗",
["tcedil"]="ţ",
-["boxhU"]="╨",
-["boxVl"]="╢",
-["gacute"]="ǵ",
-["tcaron"]="ť",
-["boxDr"]="╓",
-["bump"]="≎",
-["blk12"]="▒",
-["RightArrow"]="→",
-["els"]="⪕",
-["apacir"]="⩯",
-["acy"]="а",
-["omid"]="⦶",
-["boxbox"]="⧉",
-["iecy"]="е",
-["szlig"]="ß",
-["upsih"]="ϒ",
-["swnwar"]="⤪",
-["Icirc"]="Î",
-["swarr"]="↙",
-["times"]="×",
-["Ograve"]="Ò",
-["hoarr"]="⇿",
-["NotTildeEqual"]="≄",
-["IEcy"]="Е",
-["iexcl"]="¡",
-["bdquo"]="„",
-["TildeTilde"]="≈",
+["boxUr"]="╙",
+["icirc"]="î",
+["lmoustache"]="⎰",
+["prime"]="′",
+["ngeq"]="≱",
["nshortparallel"]="∦",
-["subedot"]="⫃",
-["supsetneq"]="⊋",
-["CenterDot"]="·",
-["lessapprox"]="⪅",
-["LeftVectorBar"]="⥒",
-["bigoplus"]="⨁",
-["supseteqq"]="⫆",
-["drcorn"]="⌟",
-["hstrok"]="ħ",
-["HorizontalLine"]="─",
-["curarrm"]="⤼",
-["lopar"]="⦅",
+["szlig"]="ß",
+["Egrave"]="È",
+["sqsubset"]="⊏",
+["NotRightTriangleEqual"]="⋭",
+["swarrow"]="↙",
+["Ucirc"]="Û",
+["DownArrowBar"]="⤓",
+["Lfr"]="𝔏",
["wcirc"]="ŵ",
+["LessLess"]="⪡",
+["Tilde"]="∼",
+["empty"]="∅",
+["swarhk"]="⤦",
+["DownLeftVector"]="↽",
+["Uscr"]="𝒰",
+["khcy"]="х",
+["gesl"]="⋛︀",
+["supsub"]="⫔",
+["malt"]="✠",
+["cirmid"]="⫯",
+["PrecedesTilde"]="≾",
+["lharul"]="⥪",
+["rightleftharpoons"]="⇌",
+["Ccedil"]="Ç",
+["plusb"]="⊞",
+["nsupe"]="⊉",
+["geq"]="≥",
+["dHar"]="⥥",
+["lcedil"]="ļ",
+["ange"]="⦤",
+["supseteq"]="⊇",
+["Upsi"]="ϒ",
+["mapstodown"]="↧",
+["profalar"]="⌮",
+["cupdot"]="⊍",
+["mapstoleft"]="↤",
+["xotime"]="⨂",
+["tbrk"]="⎴",
+["supmult"]="⫂",
+["disin"]="⋲",
["suphsub"]="⫗",
-["Otilde"]="Õ",
-["EmptySmallSquare"]="◻",
+["eg"]="⪚",
["supedot"]="⫄",
-["Kopf"]="𝕂",
-["boxminus"]="⊟",
-["csupe"]="⫒",
-["Ffr"]="𝔉",
-["origof"]="⊶",
-["sup3"]="³",
-["boxH"]="═",
-["vsubnE"]="⫋︀",
-["Hcirc"]="Ĥ",
-["block"]="█",
+["NonBreakingSpace"]=" ",
+["Euml"]="Ë",
["bsolhsub"]="⟈",
-["Supset"]="⋑",
-["GreaterFullEqual"]="≧",
+["supdsub"]="⫘",
+["sup3"]="³",
+["DoubleLeftTee"]="⫤",
+["angrtvb"]="⊾",
+["supsim"]="⫈",
+["sup2"]="²",
+["sup2"]="²",
+["circledast"]="⊛",
+["rfr"]="𝔯",
+["darr"]="↓",
+["rarrhk"]="↪",
+["macr"]="¯",
["sup1"]="¹",
-["llcorner"]="⌞",
-["sopf"]="𝕤",
-["larrbfs"]="⤟",
-["succneqq"]="⪶",
-["part"]="∂",
-["eacute"]="é",
-["COPY"]="©",
-["frac23"]="⅔",
-["dbkarow"]="⤏",
-["succeq"]="⪰",
-["notni"]="∌",
-["Euml"]="Ë",
-["harrcir"]="⥈",
-["leftrightsquigarrow"]="↭",
-["xcirc"]="◯",
-["caret"]="⁁",
-["les"]="⩽",
-["lharul"]="⥪",
-["bsime"]="⋍",
-["DoubleLeftArrow"]="⇐",
-["ecirc"]="ê",
-["subsetneqq"]="⫋",
-["crarr"]="↵",
-["cuwed"]="⋏",
-["Ugrave"]="Ù",
-["Gcirc"]="Ĝ",
-["LeftTriangleBar"]="⧏",
+["aacute"]="á",
+["oscr"]="ℴ",
+["lharu"]="↼",
+["telrec"]="⌕",
+["Dashv"]="⫤",
+["succnsim"]="⋩",
+["AElig"]="Æ",
+["Vee"]="⋁",
+["succnapprox"]="⪺",
+["CapitalDifferentialD"]="ⅅ",
["gsim"]="≳",
-["RightTriangleEqual"]="⊵",
-["lacute"]="ĺ",
-["Ccedil"]="Ç",
-["ee"]="ⅇ",
-["heartsuit"]="♥",
-["coloneq"]="≔",
-["subseteq"]="⊆",
-["NotSucceedsTilde"]="≿̸",
+["succapprox"]="⪸",
+["rmoustache"]="⎱",
+["DotEqual"]="≐",
+["subsup"]="⫓",
+["Gcedil"]="Ģ",
+["questeq"]="≟",
+["lthree"]="⋋",
+["cong"]="≅",
+["lcub"]="{",
+["radic"]="√",
+["subrarr"]="⥹",
+["nvlt"]="<⃒",
["subplus"]="⪿",
-["cupcap"]="⩆",
-["Amacr"]="Ā",
-["angst"]="Å",
-["supsetneqq"]="⫌",
-["sube"]="⊆",
-["imagpart"]="ℑ",
-["Lambda"]="Λ",
-["Afr"]="𝔄",
-["sub"]="⊂",
+["bigsqcup"]="⨆",
+["downarrow"]="↓",
+["auml"]="ä",
+["boxdL"]="╕",
+["boxvr"]="├",
+["lbrkslu"]="⦍",
+["bigwedge"]="⋀",
+["apacir"]="⩯",
+["Wscr"]="𝒲",
+["iecy"]="е",
+["VerticalSeparator"]="❘",
+["Yfr"]="𝔜",
["strns"]="¯",
["straightphi"]="ϕ",
-["boxvL"]="╡",
-["dagger"]="†",
-["eta"]="η",
-["KHcy"]="Х",
-["Yfr"]="𝔜",
-["lbrack"]="[",
-["VerticalBar"]="∣",
-["rightleftarrows"]="⇄",
-["fltns"]="▱",
-["verbar"]="|",
-["RightAngleBracket"]="⟩",
-["DownRightVector"]="⇁",
-["Lacute"]="Ĺ",
-["sol"]="/",
-["lrm"]="‎",
-["lesdot"]="⩿",
-["nleqslant"]="⩽̸",
-["capcap"]="⩋",
+["kcy"]="к",
+["aogon"]="ą",
+["star"]="☆",
+["caret"]="⁁",
+["cups"]="∪︀",
+["iquest"]="¿",
+["spar"]="∥",
+["NotExists"]="∄",
+["Gt"]="≫",
["squ"]="□",
-["xutri"]="△",
-["TSHcy"]="Ћ",
-["gap"]="⪆",
-["gtrdot"]="⋗",
-["scnap"]="⪺",
-["bkarow"]="⤍",
-["NotPrecedes"]="⊀",
-["suphsol"]="⟉",
+["sqsupe"]="⊒",
+["subnE"]="⫋",
["sqsup"]="⊐",
-["epsi"]="ε",
-["sqsubset"]="⊏",
-["check"]="✓",
-["UpArrowBar"]="⤒",
-["NotPrecedesEqual"]="⪯̸",
-["csube"]="⫑",
-["nsupset"]="⊃⃒",
-["lesdoto"]="⪁",
+["sqsubseteq"]="⊑",
+["ffr"]="𝔣",
+["UpTeeArrow"]="↥",
+["middot"]="·",
+["DoubleLongRightArrow"]="⟹",
+["sqsube"]="⊑",
+["sce"]="⪰",
+["Sup"]="⋑",
+["cacute"]="ć",
+["GreaterFullEqual"]="≧",
+["pfr"]="𝔭",
+["Lleftarrow"]="⇚",
+["heartsuit"]="♥",
+["precsim"]="≾",
+["nsucceq"]="⪰̸",
["sqcups"]="⊔︀",
-["suplarr"]="⥻",
-["nsim"]="≁",
-["NotEqualTilde"]="≂̸",
-["nearr"]="↗",
-["SquareIntersection"]="⊓",
-["intlarhk"]="⨗",
-["Ecirc"]="Ê",
-["vangrt"]="⦜",
-["fllig"]="fl",
-["Leftrightarrow"]="⇔",
-["primes"]="ℙ",
-["nvlArr"]="⤂",
+["Igrave"]="Ì",
+["iquest"]="¿",
+["Pcy"]="П",
+["thksim"]="∼",
+["djcy"]="ђ",
+["hfr"]="𝔥",
+["spadesuit"]="♠",
+["rbrkslu"]="⦐",
+["shcy"]="ш",
+["barwed"]="⌅",
+["rpar"]=")",
+["iiiint"]="⨌",
+["solb"]="⧄",
+["Integral"]="∫",
+["napE"]="⩰̸",
+["softcy"]="ь",
+["NotRightTriangleBar"]="⧐̸",
+["Mu"]="Μ",
+["frasl"]="⁄",
+["Icy"]="И",
+["dfisht"]="⥿",
["smte"]="⪬",
-["ltri"]="◃",
-["Tscr"]="𝒯",
+["smt"]="⪪",
+["bottom"]="⊥",
+["oacute"]="ó",
+["ofr"]="𝔬",
["smid"]="∣",
-["smeparsl"]="⧤",
-["rarrc"]="⤳",
-["divideontimes"]="⋇",
-["eth"]="ð",
-["boxvR"]="╞",
-["copy"]="©",
-["nges"]="⩾̸",
-["fcy"]="ф",
-["ShortUpArrow"]="↑",
-["simplus"]="⨤",
-["frac45"]="⅘",
-["nexists"]="∄",
-["LeftTeeArrow"]="↤",
-["leftleftarrows"]="⇇",
-["simg"]="⪞",
-["euro"]="€",
-["simdot"]="⩪",
-["sim"]="∼",
-["sigmav"]="ς",
-["iuml"]="ï",
-["updownarrow"]="↕",
-["shy"]="­",
-["solb"]="⧄",
+["ReverseUpEquilibrium"]="⥯",
+["smashp"]="⨳",
+["slarr"]="←",
+["simne"]="≆",
+["LeftRightArrow"]="↔",
+["thkap"]="≈",
+["nlArr"]="⇍",
+["chcy"]="ч",
+["not"]="¬",
+["kgreen"]="ĸ",
+["simeq"]="≃",
+["LongRightArrow"]="⟶",
+["sime"]="≃",
+["sigma"]="σ",
+["odot"]="⊙",
+["amp"]="&",
+["Longleftrightarrow"]="⟺",
+["Upsilon"]="Υ",
+["upharpoonleft"]="↿",
+["bigotimes"]="⨂",
+["parallel"]="∥",
+["ffllig"]="ffl",
+["shortparallel"]="∥",
+["boxdr"]="┌",
+["shortmid"]="∣",
+["Euml"]="Ë",
+["UpDownArrow"]="↕",
+["lcaron"]="ľ",
+["sfrown"]="⌢",
+["harr"]="↔",
+["dsol"]="⧶",
+["Beta"]="Β",
+["srarr"]="→",
+["boxHd"]="╤",
["nesear"]="⤨",
-["Umacr"]="Ū",
-["uharr"]="↾",
-["Therefore"]="∴",
-["Barv"]="⫧",
-["amacr"]="ā",
["setmn"]="∖",
+["DoubleDot"]="¨",
["setminus"]="∖",
-["Sscr"]="𝒮",
+["andd"]="⩜",
+["leftrightarrow"]="↔",
["seswar"]="⤩",
-["ccupssm"]="⩐",
-["searr"]="↘",
+["eogon"]="ę",
+["bne"]="=⃥",
+["DownBreve"]="̑",
+["nLtv"]="≪̸",
+["nprcue"]="⋠",
+["SucceedsSlantEqual"]="≽",
+["downdownarrows"]="⇊",
+["seArr"]="⇘",
+["Utilde"]="Ũ",
+["Gammad"]="Ϝ",
+["sdote"]="⩦",
+["iexcl"]="¡",
+["nvdash"]="⊬",
+["csupe"]="⫒",
["sdotb"]="⊡",
-["icirc"]="î",
-["amp"]="&",
-["gcy"]="г",
-["Aacute"]="Á",
-["boxvh"]="┼",
-["bfr"]="𝔟",
-["OverParenthesis"]="⏜",
-["sqsupe"]="⊒",
-["amp"]="&",
-["frac14"]="¼",
-["ZeroWidthSpace"]="​",
-["Colon"]="∷",
-["Proportional"]="∝",
-["thickapprox"]="≈",
-["subseteqq"]="⫅",
-["IJlig"]="IJ",
-["scedil"]="ş",
-["lrarr"]="⇆",
-["angmsdaf"]="⦭",
-["downharpoonleft"]="⇃",
+["scsim"]="≿",
+["bcy"]="б",
+["NotTilde"]="≁",
+["minus"]="−",
+["scnE"]="⪶",
+["scirc"]="ŝ",
+["oplus"]="⊕",
+["para"]="¶",
+["Ycirc"]="Ŷ",
+["notinva"]="∉",
+["nLl"]="⋘̸",
+["Aring"]="Å",
+["THORN"]="Þ",
+["numero"]="№",
+["scaron"]="š",
+["bsol"]="\\",
+["harrw"]="↭",
+["exponentiale"]="ⅇ",
+["eDDot"]="⩷",
+["AMP"]="&",
+["gamma"]="γ",
+["opar"]="⦷",
+["cwint"]="∱",
+["GreaterEqual"]="≥",
+["bigcap"]="⋂",
+["rtimes"]="⋊",
+["integers"]="ℤ",
+["easter"]="⩮",
["RightDoubleBracket"]="⟧",
-["half"]="½",
-["larr"]="←",
["sbquo"]="‚",
-["Vscr"]="𝒱",
-["nVdash"]="⊮",
-["DownRightVectorBar"]="⥗",
-["RightDownVector"]="⇂",
-["disin"]="⋲",
-["nsce"]="⪰̸",
-["rbrace"]="}",
-["MinusPlus"]="∓",
-["rtrif"]="▸",
-["parsim"]="⫳",
-["supseteq"]="⊇",
-["Superset"]="⊃",
-["Verbar"]="‖",
+["cfr"]="𝔠",
+["ruluhar"]="⥨",
+["image"]="ℑ",
+["nleqslant"]="⩽̸",
+["Yopf"]="𝕐",
+["apE"]="⩰",
+["NotPrecedesEqual"]="⪯̸",
+["rsqb"]="]",
+["rtrie"]="⊵",
+["rthree"]="⋌",
+["amp"]="&",
+["eng"]="ŋ",
+["ll"]="≪",
+["rrarr"]="⇉",
+["RightTee"]="⊢",
+["ETH"]="Ð",
+["ReverseEquilibrium"]="⇋",
+["langle"]="⟨",
["Zeta"]="Ζ",
-["nsccue"]="⋡",
-["bsemi"]="⁏",
-["ldquor"]="„",
-["curarr"]="↷",
-["rscr"]="𝓇",
-["rppolint"]="⨒",
-["rpargt"]="⦔",
-["rotimes"]="⨵",
-["Equal"]="⩵",
-["ropf"]="𝕣",
-["ropar"]="⦆",
-["roarr"]="⇾",
-["odot"]="⊙",
-["natural"]="♮",
-["slarr"]="←",
-["angmsdae"]="⦬",
-["acE"]="∾̳",
+["roplus"]="⨮",
+["there4"]="∴",
+["DownRightTeeVector"]="⥟",
+["npar"]="∦",
+["robrk"]="⟧",
+["exist"]="∃",
+["lfr"]="𝔩",
+["VDash"]="⊫",
+["rnmid"]="⫮",
+["rmoust"]="⎱",
["rlm"]="‏",
-["COPY"]="©",
-["iogon"]="į",
-["nleftrightarrow"]="↮",
-["reg"]="®",
-["risingdotseq"]="≓",
-["rightsquigarrow"]="↝",
-["dtri"]="▿",
-["Larr"]="↞",
-["icy"]="и",
-["gimel"]="ℷ",
+["Ccirc"]="Ĉ",
+["imagpart"]="ℑ",
+["Equilibrium"]="⇌",
+["dd"]="ⅆ",
+["cuepr"]="⋞",
+["Agrave"]="À",
+["cuesc"]="⋟",
+["square"]="□",
+["notnivc"]="⋽",
+["rbrksld"]="⦎",
["cup"]="∪",
-["DJcy"]="Ђ",
-["gtrapprox"]="⪆",
-["rightharpoonup"]="⇀",
-["prsim"]="≾",
-["rightharpoondown"]="⇁",
-["frac16"]="⅙",
-["nbsp"]=" ",
-["cedil"]="¸",
-["numsp"]=" ",
+["OpenCurlyDoubleQuote"]="“",
+["Lacute"]="Ĺ",
+["NewLine"]="\n",
+["Sigma"]="Σ",
+["Abreve"]="Ă",
+["rightleftarrows"]="⇄",
+["tint"]="∭",
+["angmsdae"]="⦬",
+["Leftrightarrow"]="⇔",
+["rdquor"]="”",
+["Verbar"]="‖",
+["Gfr"]="𝔊",
["rightarrow"]="→",
["rhov"]="ϱ",
-["rdquo"]="”",
-["rharul"]="⥬",
-["frac34"]="¾",
-["ldrdhar"]="⥧",
-["gnsim"]="⋧",
-["rtriltri"]="⧎",
-["emsp"]=" ",
-["rlarr"]="⇄",
-["Oslash"]="Ø",
-["LeftDownTeeVector"]="⥡",
+["Alpha"]="Α",
+["rho"]="ρ",
+["DownLeftTeeVector"]="⥞",
+["ntriangleright"]="⋫",
["reg"]="®",
-["LeftTeeVector"]="⥚",
-["gsiml"]="⪐",
-["QUOT"]="\"",
-["blk14"]="░",
-["rightrightarrows"]="⇉",
-["NotGreaterGreater"]="≫̸",
-["Xscr"]="𝒳",
-["Re"]="ℜ",
-["Ouml"]="Ö",
+["Int"]="∬",
+["agrave"]="à",
+["Ecirc"]="Ê",
+["NotReverseElement"]="∌",
+["backprime"]="‵",
+["Jfr"]="𝔍",
["rdsh"]="↳",
-["and"]="∧",
-["larrb"]="⇤",
-["TripleDot"]="⃛",
-["bcy"]="б",
-["diams"]="♦",
-["veebar"]="⊻",
-["rcub"]="}",
-["Scirc"]="Ŝ",
-["ac"]="∾",
-["rceil"]="⌉",
-["rcedil"]="ŗ",
-["cupbrcap"]="⩈",
-["rcaron"]="ř",
-["cuesc"]="⋟",
-["HilbertSpace"]="ℋ",
-["plus"]="+",
-["rbrkslu"]="⦐",
-["LessLess"]="⪡",
-["macr"]="¯",
-["notinE"]="⋹̸",
+["jsercy"]="ј",
+["Bscr"]="ℬ",
+["boxH"]="═",
+["leq"]="≤",
+["NotPrecedes"]="⊀",
+["coloneq"]="≔",
+["boxvh"]="┼",
+["larr"]="←",
+["ncup"]="⩂",
+["EmptySmallSquare"]="◻",
+["vartriangleleft"]="⊲",
+["iacute"]="í",
+["nVDash"]="⊯",
+["lap"]="⪅",
+["precapprox"]="⪷",
+["ecolon"]="≕",
+["lsqb"]="[",
["rbarr"]="⤍",
-["abreve"]="ă",
-["sqcup"]="⊔",
-["ratail"]="⤚",
-["VeryThinSpace"]=" ",
-["Uarrocir"]="⥉",
-["rarrfs"]="⤞",
-["Odblac"]="Ő",
-["Imacr"]="Ī",
-["ordm"]="º",
-["odsold"]="⦼",
-["NJcy"]="Њ",
-["Yacute"]="Ý",
-["rarrbfs"]="⤠",
-["prop"]="∝",
-["notin"]="∉",
-["vsupne"]="⊋︀",
-["bigcap"]="⋂",
-["Phi"]="Φ",
-["Ograve"]="Ò",
-["Yscr"]="𝒴",
-["approx"]="≈",
-["racute"]="ŕ",
-["ggg"]="⋙",
-["lmoust"]="⎰",
+["yacy"]="я",
+["efDot"]="≒",
+["ratio"]="∶",
+["wreath"]="≀",
+["nearhk"]="⤤",
+["rarrpl"]="⥅",
+["nvge"]="≥⃒",
+["searrow"]="↘",
+["thorn"]="þ",
+["rdquo"]="”",
+["LessFullEqual"]="≦",
+["nvrtrie"]="⊵⃒",
+["nsubseteqq"]="⫅̸",
+["nedot"]="≐̸",
+["VerticalLine"]="|",
+["lsh"]="↰",
+["DownRightVector"]="⇁",
+["ecirc"]="ê",
+["andv"]="⩚",
+["trie"]="≜",
+["race"]="∽̱",
["rBarr"]="⤏",
-["gneqq"]="≩",
-["isinv"]="∈",
-["harr"]="↔",
-["rArr"]="⇒",
-["rAarr"]="⇛",
-["quot"]="\"",
+["lbrksld"]="⦏",
+["emsp14"]=" ",
+["RuleDelayed"]="⧴",
+["vsubne"]="⊊︀",
+["ShortLeftArrow"]="←",
+["gtlPar"]="⦕",
["quest"]="?",
-["iuml"]="ï",
-["LeftRightArrow"]="↔",
-["LeftDoubleBracket"]="⟦",
-["gesdot"]="⪀",
-["Ntilde"]="Ñ",
-["boxUR"]="╚",
-["exist"]="∃",
-["subnE"]="⫋",
-["ograve"]="ò",
-["qopf"]="𝕢",
-["Zacute"]="Ź",
-["qfr"]="𝔮",
-["dcy"]="д",
-["NotReverseElement"]="∌",
-["DotEqual"]="≐",
-["VerticalLine"]="|",
-["pscr"]="𝓅",
-["prurel"]="⊰",
-["cdot"]="ċ",
-["bprime"]="‵",
-["ltdot"]="⋖",
-["prnsim"]="⋨",
-["curlywedge"]="⋏",
-["prnE"]="⪵",
-["REG"]="®",
-["sup3"]="³",
+["dot"]="˙",
+["RightVector"]="⇀",
+["rppolint"]="⨒",
+["Hat"]="^",
+["zcy"]="з",
+["suplarr"]="⥻",
+["boxhU"]="╨",
+["puncsp"]=" ",
+["GreaterLess"]="≷",
+["psi"]="ψ",
+["ncaron"]="ň",
+["SupersetEqual"]="⊇",
+["propto"]="∝",
["preceq"]="⪯",
-["LeftDownVectorBar"]="⥙",
-["ForAll"]="∀",
+["frac56"]="⅚",
+["NotLessGreater"]="≸",
+["jukcy"]="є",
+["swArr"]="⇙",
+["profline"]="⌒",
+["prnE"]="⪵",
+["larrpl"]="⤹",
+["af"]="⁡",
+["profsurf"]="⌓",
+["Larr"]="↞",
["forkv"]="⫙",
-["varpi"]="ϖ",
-["nrArr"]="⇏",
+["prcue"]="≼",
+["RightUpTeeVector"]="⥜",
["pound"]="£",
+["ugrave"]="ù",
+["popf"]="𝕡",
+["frac78"]="⅞",
+["suphsol"]="⟉",
+["loplus"]="⨭",
+["pointint"]="⨕",
+["cupcap"]="⩆",
+["LessTilde"]="≲",
+["pm"]="±",
+["blacksquare"]="▪",
["plustwo"]="⨧",
-["shchcy"]="щ",
-["cacute"]="ć",
-["Dashv"]="⫤",
-["lHar"]="⥢",
-["NotLeftTriangle"]="⋪",
-["gbreve"]="ğ",
-["boxDl"]="╖",
-["Beta"]="Β",
-["ReverseEquilibrium"]="⇋",
+["copy"]="©",
+["plussim"]="⨦",
+["Lcy"]="Л",
+["pluse"]="⩲",
+["ropar"]="⦆",
+["OpenCurlyQuote"]="‘",
["plusacir"]="⨣",
-["eqslantgtr"]="⪖",
-["ecy"]="э",
-["pitchfork"]="⋔",
-["ctdot"]="⋯",
-["odiv"]="⨸",
-["lesseqqgtr"]="⪋",
-["GreaterLess"]="≷",
-["Ocy"]="О",
-["weierp"]="℘",
-["Uring"]="Ů",
-["period"]=".",
-["nis"]="⋼",
-["cudarrr"]="⤵",
-["boxHU"]="╩",
-["Ouml"]="Ö",
-["Assign"]="≔",
-["Lscr"]="ℒ",
-["parallel"]="∥",
-["there4"]="∴",
-["cupor"]="⩅",
-["nwarr"]="↖",
-["para"]="¶",
-["ouml"]="ö",
-["otimes"]="⊗",
-["drbkarow"]="⤐",
-["puncsp"]=" ",
-["otilde"]="õ",
-["Vvdash"]="⊪",
-["osol"]="⊘",
+["Exists"]="∃",
+["piv"]="ϖ",
+["phmmat"]="ℳ",
+["angzarr"]="⍼",
+["vsupnE"]="⫌︀",
+["phi"]="φ",
+["perp"]="⊥",
+["rdldhar"]="⥩",
+["ccirc"]="ĉ",
+["Tfr"]="𝔗",
+["Tcy"]="Т",
+["circeq"]="≗",
+["InvisibleTimes"]="⁢",
+["OElig"]="Œ",
+["trisb"]="⧍",
+["Rcaron"]="Ř",
+["olt"]="⧀",
+["UpArrow"]="↑",
+["DDotrahd"]="⤑",
+["Uarrocir"]="⥉",
+["lacute"]="ĺ",
["oslash"]="ø",
-["dd"]="ⅆ",
-["NotPrecedesSlantEqual"]="⋠",
-["orv"]="⩛",
-["orslope"]="⩗",
-["KJcy"]="Ќ",
-["larrfs"]="⤝",
-["orderof"]="ℴ",
-["asympeq"]="≍",
-["ord"]="⩝",
-["NotLess"]="≮",
-["NotGreater"]="≯",
-["ThinSpace"]=" ",
-["ominus"]="⊖",
+["Uarr"]="↟",
+["bsolb"]="⧅",
+["gt"]=">",
+["ordm"]="º",
+["Itilde"]="Ĩ",
+["ordm"]="º",
+["Jscr"]="𝒥",
+["Rarr"]="↠",
+["measuredangle"]="∡",
["DoubleLongLeftRightArrow"]="⟺",
-["lesseqgtr"]="⋚",
+["lmidot"]="ŀ",
+["period"]=".",
["operp"]="⦹",
-["quaternions"]="ℍ",
-["boxdR"]="╒",
-["omega"]="ω",
-["Kscr"]="𝒦",
-["lessgtr"]="≶",
-["utilde"]="ũ",
-["olt"]="⧀",
-["Rho"]="Ρ",
-["olcir"]="⦾",
-["oint"]="∮",
+["bprime"]="‵",
+["numsp"]=" ",
+["ominus"]="⊖",
+["nldr"]="‥",
["ograve"]="ò",
-["Succeeds"]="≻",
-["Igrave"]="Ì",
-["eogon"]="ę",
-["Uacute"]="Ú",
-["bbrk"]="⎵",
-["ocy"]="о",
-["bcong"]="≌",
+["omicron"]="ο",
+["nearr"]="↗",
+["jcirc"]="ĵ",
+["nlE"]="≦̸",
+["deg"]="°",
+["frac13"]="⅓",
+["tcy"]="т",
+["lowbar"]="_",
+["vfr"]="𝔳",
+["ogon"]="˛",
+["sim"]="∼",
+["ocirc"]="ô",
+["Icirc"]="Î",
+["ocir"]="⊚",
+["ZeroWidthSpace"]="​",
["oast"]="⊛",
+["smile"]="⌣",
+["bigvee"]="⋁",
["oacute"]="ó",
-["cir"]="○",
-["angmsdab"]="⦩",
-["Iscr"]="ℐ",
-["ldquo"]="“",
-["RightVector"]="⇀",
-["euml"]="ë",
-["between"]="≬",
-["oS"]="Ⓢ",
-["downdownarrows"]="⇊",
-["nvlt"]="<⃒",
-["lurdshar"]="⥊",
-["starf"]="★",
-["xlarr"]="⟵",
-["Aring"]="Å",
-["Xi"]="Ξ",
-["gtcir"]="⩺",
-["Nscr"]="𝒩",
-["elinters"]="⏧",
-["ntrianglelefteq"]="⋬",
-["Vbar"]="⫫",
+["Egrave"]="È",
+["nwnear"]="⤧",
+["nwarhk"]="⤣",
+["rationals"]="ℚ",
+["DiacriticalGrave"]="`",
+["npreceq"]="⪯̸",
+["rarrc"]="⤳",
+["Uogon"]="Ų",
+["InvisibleComma"]="⁣",
+["nvltrie"]="⊴⃒",
+["digamma"]="ϝ",
+["cirE"]="⧃",
+["AMP"]="&",
+["Theta"]="Θ",
+["frac15"]="⅕",
+["fnof"]="ƒ",
+["icirc"]="î",
+["Cdot"]="Ċ",
+["ngsim"]="≵",
+["sube"]="⊆",
+["tcaron"]="ť",
["ntilde"]="ñ",
-["andv"]="⩚",
-["Rsh"]="↱",
-["angmsdad"]="⦫",
-["nsup"]="⊅",
-["nbsp"]=" ",
-["SquareSupersetEqual"]="⊒",
-["ETH"]="Ð",
-["nsube"]="⊈",
-["DoubleContourIntegral"]="∯",
-["nsubE"]="⫅̸",
-["angmsdah"]="⦯",
-["NotLessGreater"]="≸",
-["awint"]="⨑",
-["rtri"]="▹",
-["nsc"]="⊁",
-["boxvl"]="┤",
-["beta"]="β",
-["LessSlantEqual"]="⩽",
-["supsub"]="⫔",
-["agrave"]="à",
-["LeftUpTeeVector"]="⥠",
-["nrarrw"]="↝̸",
-["ltcc"]="⪦",
-["nrarrc"]="⤳̸",
-["frac78"]="⅞",
-["nvrArr"]="⤃",
-["igrave"]="ì",
-["barwed"]="⌅",
-["Mscr"]="ℳ",
-["nrarr"]="↛",
-["SubsetEqual"]="⊆",
-["notnivc"]="⋽",
-["notnivb"]="⋾",
-["succcurlyeq"]="≽",
-["eth"]="ð",
-["notinva"]="∉",
-["Otilde"]="Õ",
-["star"]="☆",
-["rangd"]="⦒",
-["Psi"]="Ψ",
-["nsupe"]="⊉",
-["mapstoup"]="↥",
-["LJcy"]="Љ",
-["looparrowleft"]="↫",
-["nlarr"]="↚",
-["Ll"]="⋘",
-["ordf"]="ª",
-["ni"]="∋",
+["ufr"]="𝔲",
+["Mcy"]="М",
["Delta"]="Δ",
-["NotVerticalBar"]="∤",
-["backcong"]="≌",
-["NoBreak"]="⁠",
+["vnsup"]="⊃⃒",
+["lAtail"]="⤛",
+["DoubleUpArrow"]="⇑",
+["aelig"]="æ",
+["lscr"]="𝓁",
+["Rscr"]="ℛ",
+["capcup"]="⩇",
+["npolint"]="⨔",
+["gesdotol"]="⪄",
+["uacute"]="ú",
+["bumpE"]="⪮",
+["drcorn"]="⌟",
+["notnivb"]="⋾",
+["notinvc"]="⋶",
+["ovbar"]="⌽",
+["Mopf"]="𝕄",
+["NotGreater"]="≯",
+["boxDr"]="╓",
+["lrcorner"]="⌟",
+["nleq"]="≰",
+["nleftarrow"]="↚",
+["nle"]="≰",
+["boxvl"]="┤",
+["Downarrow"]="⇓",
+["hcirc"]="ĥ",
["nharr"]="↮",
+["tfr"]="𝔱",
+["nlt"]="≮",
+["gacute"]="ǵ",
+["colone"]="≔",
+["Rang"]="⟫",
["ngt"]="≯",
-["Pscr"]="𝒫",
-["laemptyv"]="⦴",
-["utrif"]="▴",
-["ngeq"]="≱",
-["ncedil"]="ņ",
-["ncaron"]="ň",
-["boxhu"]="┴",
-["NotSquareSuperset"]="⊐̸",
-["bull"]="•",
+["ntilde"]="ñ",
+["vcy"]="в",
+["boxvL"]="╡",
+["NotLeftTriangleBar"]="⧏̸",
+["NestedGreaterGreater"]="≫",
+["xmap"]="⟼",
+["napid"]="≋̸",
+["LeftTriangleBar"]="⧏",
["SquareSubsetEqual"]="⊑",
-["VerticalSeparator"]="❘",
-["natur"]="♮",
-["ffr"]="𝔣",
-["rdquor"]="”",
-["lagran"]="ℒ",
-["nRightarrow"]="⇏",
-["nLtv"]="≪̸",
-["nLl"]="⋘̸",
-["Epsilon"]="Ε",
-["csup"]="⫐",
-["leftarrow"]="←",
-["nGt"]="≫⃒",
-["multimap"]="⊸",
-["mstpos"]="∾",
-["SuchThat"]="∋",
-["mldr"]="…",
-["midast"]="*",
-["Sum"]="∑",
-["vartheta"]="ϑ",
-["mapsto"]="↦",
-["nsupseteq"]="⊉",
-["Oscr"]="𝒪",
-["forall"]="∀",
-["aring"]="å",
-["ltimes"]="⋉",
-["ltcir"]="⩹",
-["lt"]="<",
-["ii"]="ⅈ",
-["equest"]="≟",
-["scsim"]="≿",
-["lsqb"]="[",
-["lsimg"]="⪏",
-["Egrave"]="È",
-["Downarrow"]="⇓",
-["lsim"]="≲",
-["eqslantless"]="⪕",
-["ucirc"]="û",
-["Auml"]="Ä",
-["lnsim"]="⋦",
-["uplus"]="⊎",
-["lhblk"]="▄",
-["Ugrave"]="Ù",
-["dlcrop"]="⌍",
-["OElig"]="Œ",
-["lesg"]="⋚︀",
-["lesdotor"]="⪃",
-["eg"]="⪚",
-["lvertneqq"]="≨︀",
-["leqslant"]="⩽",
-["ccups"]="⩌",
-["lceil"]="⌈",
-["auml"]="ä",
-["RightCeiling"]="⌉",
-["lbrksld"]="⦏",
-["lbarr"]="⤌",
+["eacute"]="é",
+["ne"]="≠",
+["ncongdot"]="⩭̸",
+["boxvR"]="╞",
+["PrecedesEqual"]="⪯",
+["Omacr"]="Ō",
+["egs"]="⪖",
+["ouml"]="ö",
+["nbsp"]=" ",
+["xuplus"]="⨄",
+["napprox"]="≉",
+["CloseCurlyQuote"]="’",
+["nacute"]="ń",
+["Chi"]="Χ",
+["subsub"]="⫕",
+["gescc"]="⪩",
+["gcirc"]="ĝ",
+["Lsh"]="↰",
+["sfr"]="𝔰",
+["circlearrowright"]="↻",
+["rcaron"]="ř",
+["ThinSpace"]=" ",
+["otilde"]="õ",
+["TRADE"]="™",
+["cudarrl"]="⤸",
["lat"]="⪫",
-["Rscr"]="ℛ",
-["Zcy"]="З",
-["bigwedge"]="⋀",
-["Prime"]="″",
+["nLeftrightarrow"]="⇎",
+["leqq"]="≦",
+["dagger"]="†",
+["dstrok"]="đ",
+["sacute"]="ś",
+["Amacr"]="Ā",
+["mumap"]="⊸",
+["models"]="⊧",
+["DiacriticalAcute"]="´",
+["minusd"]="∸",
+["hybull"]="⁃",
+["ijlig"]="ij",
+["fflig"]="ff",
+["NotGreaterEqual"]="≱",
+["Colon"]="∷",
+["boxV"]="║",
+["DotDot"]="⃜",
+["mdash"]="—",
+["hairsp"]=" ",
+["bcong"]="≌",
+["mcomma"]="⨩",
+["cirfnint"]="⨐",
+["TScy"]="Ц",
+["luruhar"]="⥦",
+["awconint"]="∳",
+["nsim"]="≁",
+["els"]="⪕",
+["imof"]="⊷",
+["lpar"]="(",
+["lozenge"]="◊",
+["oint"]="∮",
+["Umacr"]="Ū",
+["Sum"]="∑",
+["lopar"]="⦅",
+["racute"]="ŕ",
+["LessEqualGreater"]="⋚",
+["Wedge"]="⋀",
+["bbrktbrk"]="⎶",
+["RightDownTeeVector"]="⥝",
+["HumpDownHump"]="≎",
+["rarrb"]="⇥",
+["longleftrightarrow"]="⟷",
+["lnE"]="≨",
+["NotGreaterSlantEqual"]="⩾̸",
+["Nu"]="Ν",
+["NotNestedLessLess"]="⪡̸",
+["UpEquilibrium"]="⥮",
+["boxhD"]="╥",
+["el"]="⪙",
["boxDR"]="╔",
-["scnsim"]="⋩",
-["efDot"]="≒",
-["kopf"]="𝕜",
-["minusdu"]="⨪",
-["kappav"]="ϰ",
+["Gdot"]="Ġ",
+["itilde"]="ĩ",
+["isindot"]="⋵",
+["GreaterEqualLess"]="⋛",
+["Ll"]="⋘",
+["nrarrw"]="↝̸",
+["supnE"]="⫌",
+["epsiv"]="ϵ",
+["Element"]="∈",
+["gtreqless"]="⋛",
+["laemptyv"]="⦴",
+["nGt"]="≫⃒",
+["angsph"]="∢",
+["lE"]="≦",
+["kscr"]="𝓀",
+["Ocy"]="О",
+["LowerLeftArrow"]="↙",
+["dopf"]="𝕕",
+["iukcy"]="і",
+["atilde"]="ã",
+["DoubleRightArrow"]="⇒",
+["oslash"]="ø",
+["rarr"]="→",
+["intprod"]="⨼",
+["hookrightarrow"]="↪",
+["intcal"]="⊺",
+["infintie"]="⧝",
+["escr"]="ℯ",
+["iiota"]="℩",
+["curren"]="¤",
+["Bernoullis"]="ℬ",
+["angmsdah"]="⦯",
+["ShortRightArrow"]="→",
+["boxUR"]="╚",
+["ges"]="⩾",
+["DoubleDownArrow"]="⇓",
+["NotSquareSuperset"]="⊐̸",
+["lsim"]="≲",
+["bump"]="≎",
+["curlyeqsucc"]="⋟",
+["SHCHcy"]="Щ",
+["frac45"]="⅘",
+["qint"]="⨌",
+["Precedes"]="≺",
+["RightTeeArrow"]="↦",
+["frac16"]="⅙",
+["euro"]="€",
+["smtes"]="⪬︀",
+["eth"]="ð",
+["ldquo"]="“",
+["equivDD"]="⩸",
+["Oopf"]="𝕆",
["boxVh"]="╫",
-["Uuml"]="Ü",
-["centerdot"]="·",
-["isinsv"]="⋳",
-["isins"]="⋴",
-["bot"]="⊥",
-["integers"]="ℤ",
-["Racute"]="Ŕ",
-["ijlig"]="ij",
-["bernou"]="ℬ",
-["Cconint"]="∰",
-["doteq"]="≐",
-["hookleftarrow"]="↩",
-["epar"]="⋕",
-["harrw"]="↭",
-["dzigrarr"]="⟿",
-["Zscr"]="𝒵",
-["alpha"]="α",
-["times"]="×",
+["GreaterSlantEqual"]="⩾",
+["KJcy"]="Ќ",
["egrave"]="è",
-["UnionPlus"]="⊎",
-["Qscr"]="𝒬",
-["Omacr"]="Ō",
-["Zfr"]="ℨ",
-["gneq"]="⪈",
-["divonx"]="⋇",
-["gesdotol"]="⪄",
-["gvertneqq"]="≩︀",
-["geq"]="≥",
-["utri"]="▵",
-["ge"]="≥",
-["vArr"]="⇕",
-["Rrightarrow"]="⇛",
-["frac25"]="⅖",
-["LeftCeiling"]="⌈",
-["GreaterGreater"]="⪢",
-["LT"]="<",
-["Longrightarrow"]="⟹",
-["eqcolon"]="≕",
-["ofcir"]="⦿",
-["boxUl"]="╜",
-["Wscr"]="𝒲",
-["Sacute"]="Ś",
-["Union"]="⋃",
-["gg"]="≫",
-["DownArrowBar"]="⤓",
-["Escr"]="ℰ",
-["ecirc"]="ê",
-["Lmidot"]="Ŀ",
-["Wedge"]="⋀",
-["frown"]="⌢",
-["ring"]="˚",
-["dtdot"]="⋱",
-["Ccedil"]="Ç",
-["Conint"]="∯",
-["dscr"]="𝒹",
-["Map"]="⤅",
-["EmptyVerySmallSquare"]="▫",
-["backsim"]="∽",
-["angzarr"]="⍼",
-["dHar"]="⥥",
-["Mfr"]="𝔐",
-["cirE"]="⧃",
-["Popf"]="ℙ",
-["NestedGreaterGreater"]="≫",
-["ReverseElement"]="∋",
-["boxVr"]="╟",
+["NotGreaterLess"]="≹",
+["boxVl"]="╢",
+["MediumSpace"]=" ",
+["LongLeftArrow"]="⟵",
+["uarr"]="↑",
+["Ocirc"]="Ô",
+["Idot"]="İ",
+["bumpe"]="≏",
+["nwArr"]="⇖",
+["NegativeThinSpace"]="​",
+["coprod"]="∐",
+["VerticalBar"]="∣",
+["sccue"]="≽",
+["boxDl"]="╖",
+["NotSubset"]="⊂⃒",
+["Edot"]="Ė",
+["scy"]="с",
+["Cup"]="⋓",
+["centerdot"]="·",
+["nsimeq"]="≄",
+["DownLeftRightVector"]="⥐",
}
diff --git a/Master/texmf-dist/tex/luatex/luaxml/luaxml-transform.lua b/Master/texmf-dist/tex/luatex/luaxml/luaxml-transform.lua
index b6841fea5fb..4b51eed1170 100644
--- a/Master/texmf-dist/tex/luatex/luaxml/luaxml-transform.lua
+++ b/Master/texmf-dist/tex/luatex/luaxml/luaxml-transform.lua
@@ -198,6 +198,10 @@ local function add_action(selector, template, parameters, csspar)
end
+local function reset_actions(selector, csspar)
+ local css = csspar or css
+ css:remove_selector(selector)
+end
--- Transform XML string
@@ -243,7 +247,7 @@ end
local Transformer
--- Make new Transformer object
--- @return Tranformer object
+-- @return Transformer object
local function new()
local self = setmetatable({}, Transformer)
self.css = cssquery()
@@ -289,6 +293,12 @@ function Transformer:add_custom_action(selector, fn )
add_custom_action(selector, fn, self.css)
end
+--- Remove all actions that match the given selector
+---@param selector string
+function Transformer:reset_actions(selector)
+ reset_actions(selector, self.css)
+end
+
-- all methods that use transformation functions must
-- correctly handle the cssquery object that this library uses
@@ -338,6 +348,7 @@ local M = {
print_tex = print_tex,
add_action = add_action,
add_custom_action = add_custom_action,
+ reset_actions = reset_actions,
simple_content = simple_content,
load_file = load_file,
process_dom = process_dom,
diff --git a/Master/texmf-dist/tex/luatex/markdown/markdown-tinyyaml.lua b/Master/texmf-dist/tex/luatex/markdown/markdown-tinyyaml.lua
index 36cef293ed9..25b351f7e40 100644
--- a/Master/texmf-dist/tex/luatex/markdown/markdown-tinyyaml.lua
+++ b/Master/texmf-dist/tex/luatex/markdown/markdown-tinyyaml.lua
@@ -253,7 +253,9 @@ function Parser:parsestring(line, stopper)
end
line = ssub(line, 2)
end
- return rtrim(buf), line
+ buf = rtrim(buf)
+ local val = tonumber(buf) or buf
+ return val, line
end
local function isemptyline(line)
diff --git a/Master/texmf-dist/tex/luatex/markdown/markdown.lua b/Master/texmf-dist/tex/luatex/markdown/markdown.lua
index e65712cdcb6..92e02be8018 100644
--- a/Master/texmf-dist/tex/luatex/markdown/markdown.lua
+++ b/Master/texmf-dist/tex/luatex/markdown/markdown.lua
@@ -20,7 +20,7 @@
-- TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-- SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
--
--- Copyright (C) 2016-2024 Vít Starý Novotný
+-- Copyright (C) 2016-2024 Vít Starý Novotný, Andrej Genčur
--
-- This work may be distributed and/or modified under the
-- conditions of the LaTeX Project Public License, either version 1.3
@@ -58,11 +58,11 @@
-- those in the standard .ins files.
--
local metadata = {
- version = "3.5.0-0-gfd01a252",
+ version = "3.6.2-0-g6c30af7e",
comment = "A module for the conversion from markdown to plain TeX",
- author = "John MacFarlane, Hans Hagen, Vít Starý Novotný",
+ author = "John MacFarlane, Hans Hagen, Vít Starý Novotný, Andrej Genčur",
copyright = {"2009-2016 John MacFarlane, Hans Hagen",
- "2016-2023 Vít Starý Novotný"},
+ "2016-2024 Vít Starý Novotný, Andrej Genčur"},
license = "LPPL 1.3c"
}
@@ -120,6 +120,8 @@ local singletonCache = {
convert = nil,
options = nil,
}
+defaultOptions.unicodeNormalization = true
+defaultOptions.unicodeNormalizationForm = "nfc"
defaultOptions.cacheDir = "."
defaultOptions.contentBlocksLanguageMap = "markdown-languages.json"
defaultOptions.debugExtensionsFileName = "debug-extensions.json"
@@ -2971,8 +2973,12 @@ function M.writer.new(options)
local buffer = {}
local prev_space = false
local letter_found = false
+ local normalized_s = s
+ if not options.unicodeNormalization or options.unicodeNormalizationForm ~= "nfc" then
+ normalized_s = uni_algos.normalize.NFC(normalized_s)
+ end
- for _, code in utf8.codes(uni_algos.normalize.NFC(s)) do
+ for _, code in utf8.codes(normalized_s) do
local char = utf8.char(code)
-- Remove everything up to the first letter.
@@ -3020,8 +3026,12 @@ function M.writer.new(options)
local buffer = {}
local prev_space = false
local letter_found = false
+ local normalized_s = s
+ if not options.unicodeNormalization or options.unicodeNormalizationForm ~= "nfc" then
+ normalized_s = uni_algos.normalize.NFC(normalized_s)
+ end
- for _, code in utf8.codes(uni_algos.normalize.NFC(s)) do
+ for _, code in utf8.codes(normalized_s) do
local char = utf8.char(code)
-- Remove everything up to the first non-space.
@@ -4438,19 +4448,21 @@ parsers.link_text = parsers.lbracket
- (parsers.newline + parsers.lbracket + parsers.rbracket + parsers.blankline^2))))^0)
* parsers.rbracket
+parsers.link_label_body = -#(parsers.sp * parsers.rbracket)
+ * #((parsers.any - parsers.rbracket)^-999 * parsers.rbracket)
+ * Cs((parsers.alphanumeric^1
+ + parsers.inticks
+ + parsers.autolink
+ + V("InlineHtml")
+ + ( parsers.backslash * parsers.backslash)
+ + ( parsers.backslash * (parsers.lbracket + parsers.rbracket)
+ + V("NoSoftLineBreakSpace")
+ + V("NoSoftLineBreakEndline")
+ + (parsers.any
+ - (parsers.newline + parsers.lbracket + parsers.rbracket + parsers.blankline^2))))^1)
+
parsers.link_label = parsers.lbracket
- * -#(parsers.sp * parsers.rbracket)
- * #((parsers.any - parsers.rbracket)^-999 * parsers.rbracket)
- * Cs((parsers.alphanumeric^1
- + parsers.inticks
- + parsers.autolink
- + V("InlineHtml")
- + ( parsers.backslash * parsers.backslash)
- + ( parsers.backslash * (parsers.lbracket + parsers.rbracket)
- + V("NoSoftLineBreakSpace")
- + V("NoSoftLineBreakEndline")
- + (parsers.any
- - (parsers.newline + parsers.lbracket + parsers.rbracket + parsers.blankline^2))))^1)
+ * parsers.link_label_body
* parsers.rbracket
parsers.inparens_url = P{ parsers.lparent
@@ -5076,6 +5088,9 @@ function M.reader.new(writer, options)
-- List of references defined in the document
local references
+ -- List of note references defined in the document
+ parsers.rawnotes = {}
+
function self.register_link(_, tag, url, title,
attributes)
local normalized_tag = self.normalize_tag(tag)
@@ -5093,6 +5108,10 @@ function M.reader.new(writer, options)
return references[self.normalize_tag(tag)]
end
+ function self.lookup_note_reference(tag)
+ return parsers.rawnotes[self.normalize_tag(tag)]
+ end
+
parsers.title_s_direct_ref = parsers.squote
* Cs((parsers.html_entities
+ (parsers.anyescaped - parsers.squote - parsers.blankline^2))^0)
@@ -5163,15 +5182,49 @@ function M.reader.new(writer, options)
+ #parsers.link_text
* Cg(Cc("link_text"), "link_type")
+ parsers.note_opening = #(parsers.circumflex * parsers.link_text)
+ * Cg(Cc("note_inline"), "link_type")
+
+ parsers.raw_note_opening = #( parsers.lbracket
+ * parsers.circumflex
+ * parsers.link_label_body
+ * parsers.rbracket)
+ * Cg(Cc("raw_note"), "link_type")
+
+ local inline_note_element = Cg(Cc("note"), "element")
+ * parsers.note_opening
+ * Cg(parsers.circumflex * parsers.lbracket, "content")
+
+ local image_element = Cg(Cc("image"), "element")
+ * parsers.image_opening
+ * Cg(parsers.exclamation * parsers.lbracket, "content")
+
+ local note_element = Cg(Cc("note"), "element")
+ * parsers.raw_note_opening
+ * Cg(parsers.lbracket * parsers.circumflex, "content")
+
+ local link_element = Cg(Cc("link"), "element")
+ * parsers.link_opening
+ * Cg(parsers.lbracket, "content")
+
+ local opening_elements = parsers.fail
+
+ if options.inlineNotes then
+ opening_elements = opening_elements + inline_note_element
+ end
+
+ opening_elements = opening_elements + image_element
+
+ if options.notes then
+ opening_elements = opening_elements + note_element
+ end
+
+ opening_elements = opening_elements + link_element
+
parsers.link_image_opening = Ct( Cg(Cc("delimiter"), "type")
* Cg(Cc(true), "is_opening")
* Cg(Cc(false), "is_closing")
- * ( Cg(Cc("image"), "element")
- * parsers.image_opening
- * Cg(parsers.exclamation * parsers.lbracket, "content")
- + Cg(Cc("link"), "element")
- * parsers.link_opening
- * Cg(parsers.lbracket, "content")))
+ * opening_elements)
parsers.link_image_closing = Ct( Cg(Cc("delimiter"), "type")
* Cg(Cc("link"), "element")
@@ -5229,7 +5282,7 @@ function M.reader.new(writer, options)
local value = t[i]
if value.type == "delimiter" and
value.is_opening and
- (value.element == "link" or value.element == "image")
+ (value.element == "link" or value.element == "image" or value.element == "note")
and not value.removed then
if value.is_active then
return i
@@ -5318,6 +5371,15 @@ function M.reader.new(writer, options)
rendered = writer.image(mapped, reference.url, reference.title, reference.attributes)
end
+ if (t[opening_index].element == "note") then
+ if (t[opening_index].link_type == "note_inline") then
+ rendered = writer.note(mapped)
+ end
+ if (t[opening_index].link_type == "raw_note") then
+ rendered = writer.note(reference)
+ end
+ end
+
t[opening_index].rendered = rendered
delete_parsed_content_in_range(t, opening_index + 1, closing_index)
empty_content_in_range(t, opening_index, closing_index)
@@ -5376,6 +5438,11 @@ function M.reader.new(writer, options)
render_link_or_image(t, opening_index, closing_index, closing_index, inline_content)
end
+ local function resolve_note_inline_link(t, opening_index, closing_index)
+ local inline_content = resolve_inline_following_content(t, closing_index, false, false)
+ render_link_or_image(t, opening_index, closing_index, closing_index, inline_content)
+ end
+
local function resolve_shortcut_link(t, opening_index, closing_index)
local content = collect_link_content(t, opening_index + 1, closing_index - 1)
local r = self.lookup_reference(content)
@@ -5387,6 +5454,16 @@ function M.reader.new(writer, options)
end
end
+ local function resolve_raw_note_link(t, opening_index, closing_index)
+ local content = collect_link_content(t, opening_index + 1, closing_index - 1)
+ local r = self.lookup_note_reference(content)
+
+ if r then
+ local parsed_ref = self.parser_functions.parse_blocks_nested(r)
+ render_link_or_image(t, opening_index, closing_index, closing_index, parsed_ref)
+ end
+ end
+
local function resolve_full_link(t, opening_index, closing_index)
local next_link_closing_index = find_next_link_closing_index(t, closing_index + 4)
local next_link_content = collect_link_content(t, closing_index + 3, next_link_closing_index - 1)
@@ -5418,9 +5495,10 @@ function M.reader.new(writer, options)
end
for i,value in ipairs(t) do
- if not value.is_closing or
- value.type ~= "delimiter" or
- not (value.element == "link" or value.element == "image") then
+ if not value.is_closing
+ or value.type ~= "delimiter"
+ or not (value.element == "link" or value.element == "image" or value.element == "note")
+ or value.removed then
goto continue
end
@@ -5446,6 +5524,12 @@ function M.reader.new(writer, options)
if (link_type == "collapsed") then
resolve_collapsed_link(t, opener_position, i)
end
+ if (link_type == "note_inline") then
+ resolve_note_inline_link(t, opener_position, i)
+ end
+ if (link_type == "raw_note") then
+ resolve_raw_note_link(t, opener_position, i)
+ end
::continue::
end
@@ -6164,6 +6248,20 @@ end
inlines_no_link_or_emphasis_t.EndlineExceptions = parsers.EndlineExceptions - parsers.eof
parsers.inlines_no_link_or_emphasis = Ct(inlines_no_link_or_emphasis_t)
return function(input)
+ if options.unicodeNormalization then
+ local form = options.unicodeNormalizationForm
+ if form == "nfc" then
+ input = uni_algos.normalize.NFC(input)
+ elseif form == "nfd" then
+ input = uni_algos.normalize.NFD(input)
+ elseif form == "nfkc" then
+ input = uni_algos.normalize.NFKC(input)
+ elseif form == "nfkd" then
+ input = uni_algos.normalize.NFKD(input)
+ else
+ error(format("Unknown normalization form %s", form))
+ end
+ end
input = input:gsub("\r\n?", "\n")
if input:sub(-1) ~= "\n" then
input = input .. "\n"
@@ -6365,7 +6463,7 @@ M.extensions.citations = function(citation_nbsps)
)
* citation_name
* (parsers.internal_punctuation - parsers.semicolon)^-1
- * ( parsers.spnlc
+ * ( parsers.spnlc / function(_) return end
* citation_body_postnote
+ Cc("")
* parsers.spnlc
@@ -7482,6 +7580,8 @@ M.extensions.notes = function(notes, inline_notes)
local parsers = self.parsers
local writer = self.writer
+ local rawnotes = parsers.rawnotes
+
if inline_notes then
local InlineNote
= parsers.circumflex
@@ -7500,8 +7600,6 @@ M.extensions.notes = function(notes, inline_notes)
= #(parsers.lbracket * parsers.circumflex)
* parsers.link_label / strip_first_char
- local rawnotes = {}
-
-- like indirect_link
local function lookup_note(ref)
return writer.defer_call(function()
@@ -8004,13 +8102,30 @@ M.extensions.jekyll_data = function(expect_jekyll_data)
for k, _ in pairs(d) do
table.insert(keys, k)
end
- table.sort(keys)
+ table.sort(keys, function(first, second)
+ if type(first) ~= type(second) then
+ return type(first) < type(second)
+ else
+ return first < second
+ end
+ end)
if not p then
table.insert(buf, "\\markdownRendererJekyllDataBegin")
end
- if #d > 0 then
+ local is_sequence = false
+ if #d > 0 and #d == #keys then
+ for i=1, #d do
+ if d[i] == nil then
+ goto not_a_sequence
+ end
+ end
+ is_sequence = true
+ end
+ ::not_a_sequence::
+
+ if is_sequence then
table.insert(buf, "\\markdownRendererJekyllDataSequenceBegin{")
table.insert(buf, self.identifier(p or "null"))
table.insert(buf, "}{")
@@ -8065,7 +8180,7 @@ M.extensions.jekyll_data = function(expect_jekyll_data)
end
end
- if #d > 0 then
+ if is_sequence then
table.insert(buf, "\\markdownRendererJekyllDataSequenceEnd")
else
table.insert(buf, "\\markdownRendererJekyllDataMappingEnd")