2021-04-29 02:07:53 +02:00
|
|
|
local write_xml = require'luamml-xmlwriter'
|
|
|
|
local make_root = require'luamml-convert'.make_root
|
|
|
|
local save_result = require'luamml-tex'.save_result
|
|
|
|
local store_column = require'luamml-table'.store_column
|
2021-04-30 20:16:04 +02:00
|
|
|
local store_column_xml = require'luamml-table'.store_column_xml
|
2021-04-29 02:07:53 +02:00
|
|
|
local store_tag = require'luamml-table'.store_tag
|
|
|
|
local get_table = require'luamml-table'.get_table
|
2021-04-30 20:16:04 +02:00
|
|
|
local to_text = require'luamml-lr'
|
2021-04-29 02:07:53 +02:00
|
|
|
|
|
|
|
local properties = node.get_properties_table()
|
|
|
|
|
2021-04-30 19:03:36 +02:00
|
|
|
local funcid = luatexbase.new_luafunction'__luamml_array_init_col:'
|
|
|
|
token.set_lua('__luamml_array_init_col:', funcid, 'protected')
|
2021-04-29 02:07:53 +02:00
|
|
|
lua.get_functions_table()[funcid] = function()
|
|
|
|
-- TODO: Error handling etc
|
2021-04-30 19:03:36 +02:00
|
|
|
local nest = tex.nest[tex.nest.ptr-1]
|
|
|
|
-- The special will be deleted again, it just marks the right math list since the start math node is not there yet
|
|
|
|
local special = node.new('whatsit', 'special')
|
|
|
|
node.insert_after(nest.tail, nest.tail, special)
|
|
|
|
nest.tail = special
|
|
|
|
local temp = nest.head
|
|
|
|
local props = properties[temp]
|
|
|
|
if not props then
|
|
|
|
props = {}
|
|
|
|
properties[temp] = props
|
2021-04-29 02:07:53 +02:00
|
|
|
end
|
2021-04-30 19:03:36 +02:00
|
|
|
props.luamml_array_startmath = special
|
|
|
|
end
|
|
|
|
|
|
|
|
local funcid = luatexbase.new_luafunction'__luamml_array_finalize_col:w'
|
|
|
|
token.set_lua('__luamml_array_finalize_col:w', funcid, 'protected')
|
|
|
|
lua.get_functions_table()[funcid] = function()
|
|
|
|
local alignment = token.scan_int() -- Do it first to consume number even if we end early
|
|
|
|
-- TODO: Error handling etc
|
|
|
|
local temp = tex.nest.top.head
|
|
|
|
local props = properties[temp]
|
|
|
|
local special = props and props.luamml_array_startmath
|
|
|
|
if not special then return end
|
|
|
|
node.remove(tex.nest.top.head, special)
|
|
|
|
local startmath = node.free(special)
|
|
|
|
props.luamml_array_startmath = nil
|
|
|
|
|
|
|
|
alignment = alignment == 1 and 'left' or alignment == 2 and 'right' or nil
|
|
|
|
|
|
|
|
if node.end_of_math(startmath) == tex.nest.top.tail then
|
2021-04-30 20:16:04 +02:00
|
|
|
if startmath.next == tex.nest.top.tail then return end
|
2021-04-30 19:03:36 +02:00
|
|
|
store_column(startmath).columnalign = alignment
|
2021-04-29 02:07:53 +02:00
|
|
|
else
|
2021-04-30 19:03:36 +02:00
|
|
|
-- Oh no, we got text. Let't complain to the user, it's probably their fault
|
|
|
|
print'We are mathematicians, don\'t bother us with text'
|
2021-04-30 20:16:04 +02:00
|
|
|
store_column_xml{[0] = 'mtext', to_text(startmath, tex.nest.top.tail)}
|
2021-04-29 02:07:53 +02:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
local saved_array
|
|
|
|
|
|
|
|
funcid = luatexbase.new_luafunction'__luamml_array_finalize_array:'
|
|
|
|
token.set_lua('__luamml_array_save_array:', funcid)
|
|
|
|
lua.get_functions_table()[funcid] = function()
|
|
|
|
-- TODO: Error handling etc.
|
|
|
|
local colsep = tex.dimen['col@sep']
|
|
|
|
saved_array = get_table()
|
|
|
|
if colsep ~= 0 then
|
|
|
|
saved_array = {[0] = 'mpadded',
|
|
|
|
width = string.format('%+.3fpt', 2*colsep/65781.76),
|
|
|
|
lspace = string.format('%+.3fpt', colsep/65781.76),
|
|
|
|
saved_array
|
|
|
|
}
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
funcid = luatexbase.new_luafunction'__luamml_array_finalize_array:'
|
|
|
|
token.set_lua('__luamml_array_finalize_array:', funcid)
|
|
|
|
lua.get_functions_table()[funcid] = function()
|
|
|
|
-- TODO: Error handling etc.
|
|
|
|
local nucl = tex.nest.top.tail.nucleus
|
|
|
|
local props = properties[nucl]
|
|
|
|
if not props then
|
|
|
|
props = {}
|
|
|
|
properties[nucl] = props
|
|
|
|
end
|
|
|
|
props.mathml_table = saved_array
|
|
|
|
saved_array = nil
|
|
|
|
end
|