{multline} support (without labels on the left)
This commit is contained in:
parent
4005fc172d
commit
3a8dcdebe8
@ -4,6 +4,7 @@ local save_result = require'luamml-tex'.save_result
|
|||||||
local store_column = require'luamml-table'.store_column
|
local store_column = require'luamml-table'.store_column
|
||||||
local store_tag = require'luamml-table'.store_tag
|
local store_tag = require'luamml-table'.store_tag
|
||||||
local get_table = require'luamml-table'.get_table
|
local get_table = require'luamml-table'.get_table
|
||||||
|
local set_row_attribute = require'luamml-table'.set_row_attribute
|
||||||
local to_text = require'luamml-lr'
|
local to_text = require'luamml-lr'
|
||||||
|
|
||||||
local properties = node.get_properties_table()
|
local properties = node.get_properties_table()
|
||||||
@ -36,6 +37,12 @@ lua.get_functions_table()[funcid] = function()
|
|||||||
store_column(startmath)
|
store_column(startmath)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local funcid = luatexbase.new_luafunction'__luamml_amsmath_set_row_columnalign:n'
|
||||||
|
token.set_lua('__luamml_amsmath_set_row_columnalign:n', funcid, 'protected')
|
||||||
|
lua.get_functions_table()[funcid] = function()
|
||||||
|
set_row_attribute('columnalign', token.scan_argument())
|
||||||
|
end
|
||||||
|
|
||||||
do
|
do
|
||||||
local saved
|
local saved
|
||||||
funcid = luatexbase.new_luafunction'__luamml_amsmath_save_inner_table:n'
|
funcid = luatexbase.new_luafunction'__luamml_amsmath_save_inner_table:n'
|
||||||
@ -81,6 +88,7 @@ lua.get_functions_table()[funcid] = function()
|
|||||||
mml_table.displaystyle = true
|
mml_table.displaystyle = true
|
||||||
local columns = node.count(node.id'align_record', tex.lists.align_head)//2
|
local columns = node.count(node.id'align_record', tex.lists.align_head)//2
|
||||||
mml_table.columnalign = kind == 'align' and string.rep('right left', columns, ' ') or nil
|
mml_table.columnalign = kind == 'align' and string.rep('right left', columns, ' ') or nil
|
||||||
|
mml_table.width = kind == 'multline' and '100%' or nil
|
||||||
local spacing = {}
|
local spacing = {}
|
||||||
for n in node.traverse_id(node.id'glue', tex.lists.align_head) do
|
for n in node.traverse_id(node.id'glue', tex.lists.align_head) do
|
||||||
spacing[#spacing+1] = n.width == 0 and '0' or '.8em'
|
spacing[#spacing+1] = n.width == 0 and '0' or '.8em'
|
||||||
|
@ -271,6 +271,83 @@
|
|||||||
\ignorespacesafterend
|
\ignorespacesafterend
|
||||||
}
|
}
|
||||||
|
|
||||||
|
% For a more interesting one, let's consider multline:
|
||||||
|
\cs_new_eq:NN \__luamml_amsmath_original_multline:n \multline@
|
||||||
|
\cs_set:Npn \multline@ #1 {
|
||||||
|
\__luamml_amsmath_original_multline:n {
|
||||||
|
\ifmeasuring@ \else
|
||||||
|
\__luamml_amsmath_set_row_columnalign:n {left}
|
||||||
|
\fi
|
||||||
|
#1
|
||||||
|
\ifmeasuring@ \else
|
||||||
|
\__luamml_amsmath_set_row_columnalign:n {right}
|
||||||
|
\fi
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
\cs_new_eq:NN \__luamml_amsmath_original_mmeasure:n \mmeasure@
|
||||||
|
\cs_set:Npn \mmeasure@ #1 {
|
||||||
|
\exp_last_unbraced:Nno
|
||||||
|
\use_ii_i:nn
|
||||||
|
{ \luamml_flag_ignore: }
|
||||||
|
{ \__luamml_amsmath_original_mmeasure:n {#1} }
|
||||||
|
}
|
||||||
|
|
||||||
|
% Luckily, {multline} uses \endmultline@math in exactly
|
||||||
|
% the spot where we have to set the flag.
|
||||||
|
% Less luckily, \endmultline@math sometimes get overwritten for the last line.
|
||||||
|
% But that isn't a problem since we want special behavior there anyway.
|
||||||
|
\cs_set:Npn \endmultline@math {
|
||||||
|
\luamml_flag_save:Nn \displaystyle {mtd}
|
||||||
|
$
|
||||||
|
\__luamml_amsmath_add_last_to_row:
|
||||||
|
}
|
||||||
|
|
||||||
|
\cs_set:Npn \rendmultline@ {
|
||||||
|
\iftag@
|
||||||
|
\luamml_flag_save:Nn \displaystyle {mtd}
|
||||||
|
$
|
||||||
|
\__luamml_amsmath_add_last_to_row:
|
||||||
|
\let \endmultline@math \relax
|
||||||
|
\ifshifttag@
|
||||||
|
\hskip \multlinegap
|
||||||
|
\llap {
|
||||||
|
\vtop {
|
||||||
|
\raise@tag
|
||||||
|
\normalbaselines
|
||||||
|
\setbox \@ne \null
|
||||||
|
\dp \@ne \lineht@
|
||||||
|
\box \@ne
|
||||||
|
\hbox {
|
||||||
|
\strut@
|
||||||
|
\make@display@tag
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
\else
|
||||||
|
\hskip \multlinetaggap
|
||||||
|
\make@display@tag
|
||||||
|
\fi
|
||||||
|
\__luamml_amsmath_set_tag:
|
||||||
|
\else
|
||||||
|
\hskip \multlinegap
|
||||||
|
\fi
|
||||||
|
\hfilneg
|
||||||
|
\math@cr
|
||||||
|
\__luamml_amsmath_finalize_table:n {multline}
|
||||||
|
\egroup
|
||||||
|
$$
|
||||||
|
}
|
||||||
|
|
||||||
|
\cs_set:Npn \lendmultline@ {
|
||||||
|
\hfilneg
|
||||||
|
\hskip\multlinegap
|
||||||
|
\math@cr
|
||||||
|
\__luamml_amsmath_finalize_table:n {multline}
|
||||||
|
\egroup
|
||||||
|
$$
|
||||||
|
}
|
||||||
|
|
||||||
\cs_set:Npn \bBigg@ #1 #2 {
|
\cs_set:Npn \bBigg@ #1 #2 {
|
||||||
{
|
{
|
||||||
\ensuremath {
|
\ensuremath {
|
||||||
|
@ -4,8 +4,23 @@ local save_result = require'luamml-tex'.save_result
|
|||||||
|
|
||||||
local properties = node.get_properties_table()
|
local properties = node.get_properties_table()
|
||||||
|
|
||||||
|
local glue_id = node.id'glue'
|
||||||
|
local tabskip_sub = 12
|
||||||
|
assert(node.subtypes'glue'[tabskip_sub] == 'tabskip')
|
||||||
|
|
||||||
local function store_get_row()
|
local function store_get_row()
|
||||||
local row_temp = tex.nest[tex.nest.ptr-1].head
|
local row_temp
|
||||||
|
for i=tex.nest.ptr-1, 0, -1 do
|
||||||
|
local head = tex.nest[i].head
|
||||||
|
local glue = head.next
|
||||||
|
if glue and glue.id == glue_id and glue.subtype == tabskip_sub then
|
||||||
|
row_temp = head
|
||||||
|
break
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if not row_temp then
|
||||||
|
error[[luamml_table's store function called outside of table]]
|
||||||
|
end
|
||||||
local props = properties[row_temp]
|
local props = properties[row_temp]
|
||||||
if not props then
|
if not props then
|
||||||
props = {}
|
props = {}
|
||||||
@ -48,6 +63,11 @@ local function store_tag(xml)
|
|||||||
last_tag = nil
|
last_tag = nil
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local function set_row_attribute(name, value)
|
||||||
|
local mml_row = store_get_row()
|
||||||
|
mml_row[name] = value
|
||||||
|
end
|
||||||
|
|
||||||
luatexbase.add_to_callback('hpack_filter', function(_, group)
|
luatexbase.add_to_callback('hpack_filter', function(_, group)
|
||||||
if group ~= 'fin_row' then return true end
|
if group ~= 'fin_row' then return true end
|
||||||
|
|
||||||
@ -85,5 +105,6 @@ return {
|
|||||||
store_column = store_column,
|
store_column = store_column,
|
||||||
store_column_xml = store_column_xml,
|
store_column_xml = store_column_xml,
|
||||||
store_tag = store_tag,
|
store_tag = store_tag,
|
||||||
|
set_row_attribute = set_row_attribute,
|
||||||
get_table = get_table,
|
get_table = get_table,
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user