align support and fixes
This commit is contained in:
parent
c0a1f60962
commit
23c6714e97
84
luamml-amsmath.lua
Normal file
84
luamml-amsmath.lua
Normal file
@ -0,0 +1,84 @@
|
|||||||
|
local write_xml = require'luamml-xmlwriter'
|
||||||
|
local make_root = require'luamml-convert'.make_root
|
||||||
|
|
||||||
|
local properties = node.get_properties_table()
|
||||||
|
|
||||||
|
local funcid = luatexbase.new_luafunction'luamml_amsmath_add_box_to_row:'
|
||||||
|
token.set_lua('luamml_amsmath_add_box_to_row:', funcid, 'protected')
|
||||||
|
lua.get_functions_table()[funcid] = function()
|
||||||
|
-- TODO: Error handling etc
|
||||||
|
-- local box = token.scan_int()
|
||||||
|
local boxnum = 0
|
||||||
|
local startmath = tex.box[boxnum].list
|
||||||
|
assert(startmath.id == node.id"math")
|
||||||
|
local props = assert(properties[startmath])
|
||||||
|
local mml = assert(props.saved_mathml_table)
|
||||||
|
table.insert(mml, 1, {[0] = 'maligngroup'})
|
||||||
|
if mml[0] == 'mstyle' and mml.displaystyle == true then
|
||||||
|
mml[0], mml.displaystyle, mml.scriptlevel = 'mtd', nil, nil
|
||||||
|
else
|
||||||
|
if mml[0] ~= 'mstyle' then
|
||||||
|
mml = {[0] = 'mstyle', displaystyle = false, mml}
|
||||||
|
end
|
||||||
|
mml = {[0] = 'mtd', mml}
|
||||||
|
end
|
||||||
|
local row_temp = tex.nest[tex.nest.ptr-1]
|
||||||
|
print(row_temp)
|
||||||
|
props = properties[row_temp]
|
||||||
|
if not props then
|
||||||
|
props = {}
|
||||||
|
properties[row_temp] = props
|
||||||
|
end
|
||||||
|
if not props.mathml_row then
|
||||||
|
props.mathml_row = {[0] = 'mtr'}
|
||||||
|
end
|
||||||
|
mml_row = props.mathml_row
|
||||||
|
table.insert(mml_row, mml)
|
||||||
|
end
|
||||||
|
|
||||||
|
local funcid = luatexbase.new_luafunction'luamml_amsmath_finalize_row:'
|
||||||
|
token.set_lua('luamml_amsmath_finalize_row:', funcid, 'protected')
|
||||||
|
lua.get_functions_table()[funcid] = function()
|
||||||
|
-- TODO: Error handling etc
|
||||||
|
local row_temp = tex.nest[tex.nest.ptr-1]
|
||||||
|
print("final", row_temp)
|
||||||
|
local props = properties[row_temp]
|
||||||
|
if not props then return end
|
||||||
|
if not props.mathml_row then return end
|
||||||
|
mml_row = props.mathml_row
|
||||||
|
props = properties[tex.lists.align_head]
|
||||||
|
if not props then
|
||||||
|
props = {}
|
||||||
|
properties[tex.lists.align_head] = props
|
||||||
|
end
|
||||||
|
local mml_table = props.mathml_table_node_table
|
||||||
|
if not mml_table then
|
||||||
|
mml_table = {[0] = 'mtable', displaystyle = true}
|
||||||
|
props.mathml_table_node_table = mml_table
|
||||||
|
end
|
||||||
|
table.insert(mml_table, mml_row)
|
||||||
|
end
|
||||||
|
|
||||||
|
local funcid = luatexbase.new_luafunction'luamml_amsmath_finalize_table:'
|
||||||
|
token.set_lua('luamml_amsmath_finalize_table:', funcid)
|
||||||
|
lua.get_functions_table()[funcid] = function()
|
||||||
|
-- TODO: Error handling etc
|
||||||
|
local props = properties[tex.lists.align_head]
|
||||||
|
if not props then return end
|
||||||
|
local mml_table = props.mathml_table_node_table
|
||||||
|
if not mml_table then return end
|
||||||
|
print(write_xml(make_root(mml_table, 2)))
|
||||||
|
end
|
||||||
|
|
||||||
|
funcid = luatexbase.new_luafunction'luamml_last_math_alignmark:'
|
||||||
|
token.set_lua('luamml_last_math_alignmark:', funcid, 'protected')
|
||||||
|
lua.get_functions_table()[funcid] = function()
|
||||||
|
local n = tex.nest.top.tail
|
||||||
|
n = n.nucleus or n
|
||||||
|
local props = properties[n]
|
||||||
|
if not props then
|
||||||
|
props = {}
|
||||||
|
properties[n] = props
|
||||||
|
end
|
||||||
|
props.mathml_table = {[0] = 'malignmark'}
|
||||||
|
end
|
@ -77,7 +77,7 @@ local function kernel_to_table(kernel, cur_style)
|
|||||||
local result = {[0] = elem,
|
local result = {[0] = elem,
|
||||||
char,
|
char,
|
||||||
['tex:family'] = fam ~= 0 and fam or nil,
|
['tex:family'] = fam ~= 0 and fam or nil,
|
||||||
mathvariant = #char == 1 and utf8.codepoint(char) < 0x10000 and 'normal' or nil
|
mathvariant = #char == 1 and elem == 'mi' and utf8.codepoint(char) < 0x10000 and 'normal' or nil
|
||||||
}
|
}
|
||||||
return result, result
|
return result, result
|
||||||
elseif id == sub_box_t then
|
elseif id == sub_box_t then
|
||||||
@ -256,7 +256,10 @@ function nodes_to_table(head, cur_style)
|
|||||||
elseif id == accent_t then
|
elseif id == accent_t then
|
||||||
t[#t+1], new_core = accent_to_table(n, sub, cur_style)
|
t[#t+1], new_core = accent_to_table(n, sub, cur_style)
|
||||||
elseif id == style_t then
|
elseif id == style_t then
|
||||||
if #t ~= 0 then
|
if sub ~= cur_style then
|
||||||
|
if #t == 0 then
|
||||||
|
t[0] = 'mstyle'
|
||||||
|
else
|
||||||
local new_t = {[0] = 'mstyle'}
|
local new_t = {[0] = 'mstyle'}
|
||||||
t[#t+1] = new_t
|
t[#t+1] = new_t
|
||||||
t = new_t
|
t = new_t
|
||||||
@ -267,6 +270,7 @@ function nodes_to_table(head, cur_style)
|
|||||||
t.displaystyle, t.scriptlevel = false, sub//2 - 1
|
t.displaystyle, t.scriptlevel = false, sub//2 - 1
|
||||||
end
|
end
|
||||||
cur_style = sub
|
cur_style = sub
|
||||||
|
end
|
||||||
new_core = space_like
|
new_core = space_like
|
||||||
elseif id == choice_t then
|
elseif id == choice_t then
|
||||||
local size = cur_style//2
|
local size = cur_style//2
|
||||||
@ -312,18 +316,22 @@ local function register_remap(family, mapping)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
local function to_mml(head, style)
|
local function to_math(root, style)
|
||||||
local result = nodes_to_table(head, style or 0)
|
if root[0] == 'mrow' then
|
||||||
result[0] = 'math'
|
root[0] = 'math'
|
||||||
result.xmlns = 'http://www.w3.org/1998/Math/MathML'
|
else
|
||||||
result['xmlns:tex'] = 'http://typesetting.eu/2021/LuaMathML'
|
root = {[0] = 'math', root}
|
||||||
if style == 2 then
|
|
||||||
result.display = 'block'
|
|
||||||
end
|
end
|
||||||
return result
|
root.xmlns = 'http://www.w3.org/1998/Math/MathML'
|
||||||
|
root['xmlns:tex'] = 'http://typesetting.eu/2021/LuaMathML'
|
||||||
|
if style < 2 then
|
||||||
|
root.display = 'block'
|
||||||
|
end
|
||||||
|
return root
|
||||||
end
|
end
|
||||||
|
|
||||||
return {
|
return {
|
||||||
register_family = register_remap,
|
register_family = register_remap,
|
||||||
process = to_mml,
|
process = function(head, style) return nodes_to_table(head, style or 2) end,
|
||||||
|
make_root = to_math,
|
||||||
}
|
}
|
||||||
|
99
luamml-patches-amsmath.sty
Normal file
99
luamml-patches-amsmath.sty
Normal file
@ -0,0 +1,99 @@
|
|||||||
|
\ProvidesExplPackage {luamml-patches-amsmath} {2021-04-23} {0.0.1-alpha}
|
||||||
|
{Feel free to add a description here}
|
||||||
|
|
||||||
|
\lua_now:n { require'luamml-amsmath' }
|
||||||
|
|
||||||
|
\cs_set:Npn \align@preamble {
|
||||||
|
&
|
||||||
|
\hfil
|
||||||
|
\strut@
|
||||||
|
\setboxz@h {
|
||||||
|
\@lign
|
||||||
|
$
|
||||||
|
\m@th
|
||||||
|
\displaystyle {
|
||||||
|
##
|
||||||
|
}
|
||||||
|
\ifmeasuring@
|
||||||
|
\luamml_flag_ignore:
|
||||||
|
\else
|
||||||
|
\luamml_flag_alignment_left:
|
||||||
|
\fi
|
||||||
|
$
|
||||||
|
}
|
||||||
|
\ifmeasuring@
|
||||||
|
\savefieldlength@
|
||||||
|
\fi
|
||||||
|
\set@field
|
||||||
|
\tabskip\z@skip
|
||||||
|
&
|
||||||
|
\setboxz@h {
|
||||||
|
\@lign
|
||||||
|
$
|
||||||
|
\m@th
|
||||||
|
\displaystyle
|
||||||
|
{
|
||||||
|
{}
|
||||||
|
\luamml_last_math_alignmark:
|
||||||
|
##
|
||||||
|
}
|
||||||
|
\ifmeasuring@
|
||||||
|
\luamml_flag_ignore:
|
||||||
|
\else
|
||||||
|
\luamml_flag_alignment_right:
|
||||||
|
\fi
|
||||||
|
$
|
||||||
|
}
|
||||||
|
\ifmeasuring@
|
||||||
|
\savefieldlength@
|
||||||
|
\else
|
||||||
|
\luamml_amsmath_add_box_to_row:
|
||||||
|
\fi
|
||||||
|
\set@field
|
||||||
|
\hfil
|
||||||
|
\tabskip\alignsep@
|
||||||
|
}
|
||||||
|
|
||||||
|
\cs_set:Npn \math@cr@@@align {
|
||||||
|
\ifst@rred
|
||||||
|
\nonumber
|
||||||
|
\fi
|
||||||
|
\if@eqnsw
|
||||||
|
\global \tag@true
|
||||||
|
\fi
|
||||||
|
\global \advance \row@ \@ne
|
||||||
|
\add@amps \maxfields@
|
||||||
|
\omit
|
||||||
|
\kern -\alignsep@
|
||||||
|
\luamml_amsmath_finalize_row:
|
||||||
|
\iftag@
|
||||||
|
\setboxz@h {
|
||||||
|
\@lign
|
||||||
|
\strut@
|
||||||
|
{ \make@display@tag }
|
||||||
|
}
|
||||||
|
\place@tag
|
||||||
|
\fi
|
||||||
|
\ifst@rred
|
||||||
|
\else
|
||||||
|
\global \@eqnswtrue
|
||||||
|
\fi
|
||||||
|
\global \lineht@ \z@
|
||||||
|
\cr
|
||||||
|
}
|
||||||
|
|
||||||
|
\cs_set:Npn \endalign {
|
||||||
|
\math@cr
|
||||||
|
\black@ \totwidth@
|
||||||
|
\luamml_amsmath_finalize_table:
|
||||||
|
\egroup
|
||||||
|
\ifingather@
|
||||||
|
\restorealignstate@
|
||||||
|
\egroup
|
||||||
|
\nonumber
|
||||||
|
\ifnum0=‘{\fi\iffalse}\fi
|
||||||
|
\else
|
||||||
|
$$
|
||||||
|
\fi
|
||||||
|
\ignorespacesafterend
|
||||||
|
}
|
@ -1,10 +1,13 @@
|
|||||||
local mlist_to_mml = require'luamml-convert'
|
local mlist_to_mml = require'luamml-convert'
|
||||||
local process_mlist = mlist_to_mml.process
|
local process_mlist = mlist_to_mml.process
|
||||||
|
local make_root = mlist_to_mml.make_root
|
||||||
local register_family = mlist_to_mml.register_family
|
local register_family = mlist_to_mml.register_family
|
||||||
|
|
||||||
local mappings = require'luamml-legacy-mappings'
|
local mappings = require'luamml-legacy-mappings'
|
||||||
local write_xml = require'luamml-xmlwriter'
|
local write_xml = require'luamml-xmlwriter'
|
||||||
|
|
||||||
|
local properties = node.get_properties_table()
|
||||||
|
|
||||||
local funcid = luatexbase.new_luafunction'RegisterFamilyMapping'
|
local funcid = luatexbase.new_luafunction'RegisterFamilyMapping'
|
||||||
token.set_lua('RegisterFamilyMapping', funcid, 'protected')
|
token.set_lua('RegisterFamilyMapping', funcid, 'protected')
|
||||||
lua.get_functions_table()[funcid] = function()
|
lua.get_functions_table()[funcid] = function()
|
||||||
@ -17,10 +20,56 @@ lua.get_functions_table()[funcid] = function()
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- Possible flag values:
|
||||||
|
-- 0: Normal (This is the only supported one in display mode)
|
||||||
|
-- 1: Like 0, result is display math
|
||||||
|
-- 2: Generate MathML, but only save it for later usage in startmath node
|
||||||
|
-- 3: Skip
|
||||||
|
-- 4: Prepend node list from buffer before generating
|
||||||
|
-- 5: Like 5, result is display math
|
||||||
|
-- 6: 2+4
|
||||||
|
-- 7: Skip but save copy of node list in buffer
|
||||||
|
--
|
||||||
|
-- In other words:
|
||||||
|
-- Bit 1: Suppress output
|
||||||
|
-- Bit 0: Force display if 1 isn't set, if it is then skip MathML generation
|
||||||
|
-- Bit 2: Integrate with table mechanism
|
||||||
|
|
||||||
|
local mlist_buffer
|
||||||
|
|
||||||
luatexbase.add_to_callback('pre_mlist_to_hlist_filter', function(mlist, style)
|
luatexbase.add_to_callback('pre_mlist_to_hlist_filter', function(mlist, style)
|
||||||
print''
|
local flag = tex.count.l__luamml_flag_int
|
||||||
local xml = process_mlist(mlist, style == 'display' and 2 or 0)
|
if flag & 3 == 3 then
|
||||||
print(write_xml(xml))
|
if flag & 4 == 4 then
|
||||||
print''
|
assert(mlist_buffer == nil)
|
||||||
|
mlist_buffer = node.copy_list(mlist)
|
||||||
|
end
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
local new_mlist, buffer_tail
|
||||||
|
if flag & 4 == 4 then
|
||||||
|
new_mlist, buffer_tail = assert(mlist_buffer), node.tail(mlist_buffer)
|
||||||
|
mlist.prev, buffer_tail.next = buffer_tail, mlist
|
||||||
|
mlist_buffer = nil
|
||||||
|
else
|
||||||
|
new_mlist = mlist
|
||||||
|
end
|
||||||
|
local xml = process_mlist(new_mlist, style == 'display' and 0 or 2)
|
||||||
|
if flag & 2 == 0 then
|
||||||
|
print(write_xml(make_root(xml, (style == 'display' or flag & 1 == 1) and 0 or 2)) .. '\n')
|
||||||
|
else
|
||||||
|
assert(style == 'text')
|
||||||
|
local startmath = tex.nest.top.tail
|
||||||
|
local props = properties[startmath]
|
||||||
|
if not props then
|
||||||
|
props = {}
|
||||||
|
properties[startmath] = props
|
||||||
|
end
|
||||||
|
props.saved_mathml_table = xml
|
||||||
|
end
|
||||||
|
if buffer_tail then
|
||||||
|
mlist.prev, buffer_tail.next = nil, nil
|
||||||
|
node.flush_list(new_mlist)
|
||||||
|
end
|
||||||
return true
|
return true
|
||||||
end, 'dump_list')
|
end, 'dump_list')
|
||||||
|
17
luamml.sty
Normal file
17
luamml.sty
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
\ProvidesExplPackage {luamml} {2021-04-23} {0.0.1-alpha}
|
||||||
|
{Feel free to add a description here}
|
||||||
|
|
||||||
|
\int_new:N \l__luamml_flag_int
|
||||||
|
\lua_now:n { require'luamml-tex' }
|
||||||
|
|
||||||
|
\cs_new:Nn \luamml_flag_ignore: {
|
||||||
|
\int_set:Nn \l__luamml_flag_int { 3 }
|
||||||
|
}
|
||||||
|
\cs_new:Nn \luamml_flag_alignment_left: {
|
||||||
|
\int_set:Nn \l__luamml_flag_int { 7 }
|
||||||
|
}
|
||||||
|
\cs_new:Nn \luamml_flag_alignment_right: {
|
||||||
|
\int_set:Nn \l__luamml_flag_int { 6 }
|
||||||
|
}
|
||||||
|
|
||||||
|
\RequirePackage { luamml-patches-amsmath }
|
13
test_tex.tex
13
test_tex.tex
@ -1,11 +1,12 @@
|
|||||||
\documentclass{article}
|
\documentclass{article}
|
||||||
% \usepackage{unicode-math}
|
\usepackage{unicode-math}
|
||||||
\directlua{require'luamml-tex'}
|
\usepackage{amsmath}
|
||||||
|
\usepackage{luamml}
|
||||||
\RegisterFamilyMapping\symsymbols{oms}
|
\RegisterFamilyMapping\symsymbols{oms}
|
||||||
\RegisterFamilyMapping\symletters{oml}
|
\RegisterFamilyMapping\symletters{oml}
|
||||||
\begin{document}
|
\begin{document}
|
||||||
\[
|
\[
|
||||||
ax^2+b+c=0
|
ax^2+bx+c=0
|
||||||
\]
|
\]
|
||||||
\[
|
\[
|
||||||
x = \frac{-b \pm \sqrt{b^2-4ac}}{2a}.
|
x = \frac{-b \pm \sqrt{b^2-4ac}}{2a}.
|
||||||
@ -14,5 +15,11 @@
|
|||||||
\sum_a\underline c\dot bc'
|
\sum_a\underline c\dot bc'
|
||||||
\]
|
\]
|
||||||
|
|
||||||
|
\begin{align}
|
||||||
|
abc&=def\\
|
||||||
|
1+2&=3\\
|
||||||
|
5
|
||||||
|
\end{align}
|
||||||
|
|
||||||
Es gilt $\sin(x)-\sin(x+2\pi)=0$.
|
Es gilt $\sin(x)-\sin(x+2\pi)=0$.
|
||||||
\end{document}
|
\end{document}
|
||||||
|
Loading…
Reference in New Issue
Block a user