summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/lualatex/luamml/luamml-array.lua
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/tex/lualatex/luamml/luamml-array.lua')
-rw-r--r--Master/texmf-dist/tex/lualatex/luamml/luamml-array.lua84
1 files changed, 84 insertions, 0 deletions
diff --git a/Master/texmf-dist/tex/lualatex/luamml/luamml-array.lua b/Master/texmf-dist/tex/lualatex/luamml/luamml-array.lua
new file mode 100644
index 00000000000..9a7b3581f2a
--- /dev/null
+++ b/Master/texmf-dist/tex/lualatex/luamml/luamml-array.lua
@@ -0,0 +1,84 @@
+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
+local store_column_xml = require'luamml-table'.store_column_xml
+local store_tag = require'luamml-table'.store_tag
+local get_table = require'luamml-table'.get_table
+local to_text = require'luamml-lr'
+
+local properties = node.get_properties_table()
+
+local funcid = luatexbase.new_luafunction'__luamml_array_init_col:'
+token.set_lua('__luamml_array_init_col:', funcid, 'protected')
+lua.get_functions_table()[funcid] = function()
+ -- TODO: Error handling etc
+ 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
+ end
+ 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
+ if startmath.next == tex.nest.top.tail then return end
+ store_column(startmath).columnalign = alignment
+ else
+ -- 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'
+ store_column_xml(to_text(startmath, tex.nest.top.tail)).columnalign = alignment
+ 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