Matrix and array support (requires array package)

This commit is contained in:
Marcel Fabian Krüger 2021-04-29 02:07:53 +02:00
parent b9105dcc4a
commit b33340721f
6 changed files with 146 additions and 5 deletions

View File

@ -52,7 +52,6 @@ lua.get_functions_table()[funcid] = function()
chars[#chars+1] = 0x20 chars[#chars+1] = 0x20
elseif id == node.id'kern' then elseif id == node.id'kern' then
else else
print(n)
texio.write_nl'WARNING: Unsupported node in tag dropped' texio.write_nl'WARNING: Unsupported node in tag dropped'
end end
end end

87
luamml-array.lua Normal file
View File

@ -0,0 +1,87 @@
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_tag = require'luamml-table'.store_tag
local get_table = require'luamml-table'.get_table
local properties = node.get_properties_table()
local funcid = luatexbase.new_luafunction'__luamml_array_add_list_to_row:'
token.set_lua('__luamml_array_add_list_to_row:', funcid, 'protected')
lua.get_functions_table()[funcid] = function()
-- TODO: Error handling etc
-- local box = token.scan_int()
local startmath
local preskip
local postskip
local prestretch = 0 -- Not one since overflowing content protrudes right
local stretch = {0, 0, 0, 0, 0}
local n = tex.nest.top.head.next
local func, ctx, n = node.traverse(tex.nest.top.head.next)
while true do
local id, sub n, id, sub = func(ctx, n)
if not n then break end
if node.id'math' == id then
if sub == 0 then
if startmath then
texio.write_nl'Multiple formulas detected in array field'
end
startmath = n
for i=2, 5 do
if stretch[i] ~= 0 then
prestretch = i
end
end
n = node.end_of_math(n)
end
elseif node.id'glue' == id then
stretch[n.stretch_order+1] = stretch[n.stretch_order+1] + n.stretch
elseif node.id'rule' == id then
else
texio.write_nl'Foreign nodes detected in array field'
end
end
if startmath then
local poststretch
for i=1, 5 do
if stretch[i] ~= 0 then
poststretch = i
end
end
store_column(startmath).columnalign = prestretch < poststretch and 'left' or prestretch > poststretch and 'right' or nil -- or 'center' -- center is already default
else
texio.write_nl'Formula missing in array field'
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

View File

@ -45,7 +45,7 @@ local function delim_to_table(delim)
if props then return props end if props then return props end
local char = delim.small_char local char = delim.small_char
if char == 0 then if char == 0 then
return {[0] = 'mspace', width = string.format("%.2fpt", tex.nulldelimiterspace/65781.76)}, space_like return {[0] = 'mspace', width = string.format("%.3fpt", tex.nulldelimiterspace/65781.76)}, space_like
else else
local fam = delim.small_fam local fam = delim.small_fam
char = remap_lookup[fam << 21 | char] char = remap_lookup[fam << 21 | char]
@ -277,10 +277,10 @@ local function space_to_table(amount, sub, cur_style)
if amount == 0 then return end if amount == 0 then return end
if sub == 99 then -- TODO magic number if sub == 99 then -- TODO magic number
-- 18*2^16=1179648 -- 18*2^16=1179648
return {[0] = 'mspace', width = string.format("%.2fem", amount/1179648)}, space_like return {[0] = 'mspace', width = string.format("%.3fem", amount/1179648)}, space_like
else else
-- 65781.76=tex.sp'100bp'/100 -- 65781.76=tex.sp'100bp'/100
return {[0] = 'mspace', width = string.format("%.2fpt", amount/65781.76)}, space_like return {[0] = 'mspace', width = string.format("%.3fpt", amount/65781.76)}, space_like
end end
end end

43
luamml-patches-array.sty Normal file
View File

@ -0,0 +1,43 @@
\ProvidesExplPackage {luamml-patches-array} {2021-04-23} {0.0.1-alpha}
{Feel free to add a description here}
\lua_now:n { require'luamml-array' }
\cs_new:Npn \__luamml_array_dollarend_array: {
\luamml_flag_save:
$
\__luamml_array_add_list_to_row:
}
\cs_new_eq:NN \luamml@d@llarend@array \__luamml_array_dollarend_array:
\cs_set:Npn \array {
\col@sep \arraycolsep
\def \d@llarbegin { $ }
\let \d@llarend \luamml@d@llarend@array
\def \@halignto {}
\@tabarray
}
\cs_set:Npn \endarray {
\crcr
\__luamml_array_save_array:
\egroup
\egroup
\__luamml_array_finalize_array:
\@arrayright
\gdef \@preamble {}
}
\cs_set:Npn \endalign {
\math@cr
\black@ \totwidth@
\__luamml_amsmath_finalize_table:
\egroup
\ifingather@
\restorealignstate@
\egroup
\nonumber
\ifnum0={\fi\iffalse}\fi
\else
$$
\fi
\ignorespacesafterend
}

View File

@ -34,6 +34,7 @@ local function store_column(startmath, display)
mml = {[0] = 'mtd', mml} mml = {[0] = 'mtd', mml}
end end
table.insert(store_get_row(), mml) table.insert(store_get_row(), mml)
return mml
end end
local function store_tag(xml) local function store_tag(xml)

View File

@ -18,4 +18,15 @@
\int_set:Nn \l__luamml_flag_int { 6 } \int_set:Nn \l__luamml_flag_int { 6 }
} }
\RequirePackage { luamml-patches-amsmath } \cs_new:Npn \__luamml_patch_package:nn #1 #2 {
\@ifpackageloaded {#1} {#2} {
\hook_gput_code:nnn {package/after/#1} {luamml} {#2}
}
}
\cs_new:Npn \__luamml_patch_package:n #1 {
\__luamml_patch_package:nn {#1} {
\RequirePackage { luamml-patches-#1 }
}
}
\__luamml_patch_package:n {amsmath}
\__luamml_patch_package:n {array}