array improvements

This commit is contained in:
Marcel Fabian Krüger 2021-04-30 19:03:36 +02:00
parent b33340721f
commit c026f67867
2 changed files with 90 additions and 68 deletions

View File

@ -7,51 +7,45 @@ 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')
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 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'
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
startmath = n
for i=2, 5 do
if stretch[i] ~= 0 then
prestretch = i
props.luamml_array_startmath = special
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
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.nest == tex.nest.top.tail then return end
store_column(startmath).columnalign = alignment
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'
-- 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'
end
end

View File

@ -3,20 +3,63 @@
\lua_now:n { require'luamml-array' }
\cs_new:Npn \__luamml_array_dollarend_array: {
\cs_set:Npn \@classz {
\@classx
\@tempcnta \count@
\prepnext@tok
\@addtopreamble {
\ifcase \@chnum
\hfil
\hskip 1sp
\d@llarbegin
\__luamml_array_init_col:
\insert@column
\luamml_flag_save:
$
\__luamml_array_add_list_to_row:
\d@llarend
\__luamml_array_finalize_col:w 0~
\do@row@strut
\hfil
\or
\hskip 1sp
\d@llarbegin
\__luamml_array_init_col:
\insert@column
\luamml_flag_save:
\d@llarend
\__luamml_array_finalize_col:w 1~
\do@row@strut
\hfil
\or
\hfil
\hskip 1sp
\d@llarbegin
\__luamml_array_init_col:
\insert@column
\luamml_flag_save:
\d@llarend
\__luamml_array_finalize_col:w 2~
\do@row@strut
\or
\setbox \ar@mcellbox \vbox \@startpbox { \@nextchar }
\insert@column
\@endpbox
\ar@align@mcell
\do@row@strut
\or
\vtop \@startpbox { \@nextchar }
\insert@column
\@endpbox
\do@row@strut
\or
\vbox \@startpbox { \@nextchar }
\insert@column
\@endpbox
\do@row@strut
\fi
}
\prepnext@tok
}
\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:
@ -26,18 +69,3 @@
\@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
}