From 9194dfa39ec72d9494a0b1040de22721ec576e15 Mon Sep 17 00:00:00 2001 From: Karl Berry Date: Wed, 30 Nov 2022 20:33:47 +0000 Subject: lutabulartools (30nov22) git-svn-id: svn://tug.org/texlive/trunk@65153 c570f23f-e606-0410-a88d-b1316a301751 --- .../tex/luatex/lutabulartools/lutabulartools.lua | 336 +++++++++++++-------- .../tex/luatex/lutabulartools/lutabulartools.sty | 63 ++-- 2 files changed, 241 insertions(+), 158 deletions(-) (limited to 'Master/texmf-dist/tex/luatex') diff --git a/Master/texmf-dist/tex/luatex/lutabulartools/lutabulartools.lua b/Master/texmf-dist/tex/luatex/lutabulartools/lutabulartools.lua index 23ef9654825..719f89873e0 100644 --- a/Master/texmf-dist/tex/luatex/lutabulartools/lutabulartools.lua +++ b/Master/texmf-dist/tex/luatex/lutabulartools/lutabulartools.lua @@ -1,5 +1,5 @@ --% Kale Ewasiuk (kalekje@gmail.com) ---% 2022-11-27 +--% 2022-11-29 --% Copyright (C) 2021-2022 Kale Ewasiuk --% --% Permission is hereby granted, free of charge, to any person obtaining a copy @@ -30,31 +30,33 @@ if (__PL_EXTRAS__ == nil) or (__PENLIGHT__ == nil) then end local T = pl.tablex -local ltt = {} +local lutabt = {} -ltt.tablelevel = 0 +lutabt.tablelevel = 0 -ltt.debug = false +lutabt.debug = false -ltt.auto_topbot = false +lutabt.auto_topbot = false +lutabt.auto_topbot_old = false -ltt.auto_crules = {} -- {{span,trim}, } appearance is like this, 'range|trim', -- auto_rules created by MC -ltt.auto_midrules = {} +lutabt.auto_crules = {} -- {{span,trim}, } appearance is like this, 'range|trim', -- auto_rules created by MC +lutabt.auto_midrules = {} -ltt.col_spec1 = {} -- column spec if one column wide (since makcell nests a tabular, preserve col_spec below) -ltt.col_spec = {} -- tab column spec if above 1 -ltt.col = '' -- current column spec, single char, only applies to tabular with more than 1 column -ltt.col_num = 1 -- current column number -ltt.row_num = 0 -- current row number +lutabt.col_spec1 = {} -- column spec if one column wide (since makcell nests a tabular, preserve col_spec below) +lutabt.col_spec = {} -- tab column spec if above 1 +lutabt.col = '' -- current column spec, single char, only applies to tabular with more than 1 column +lutabt.col_num = 1 -- current column number +lutabt.row_num = 0 -- current row number +lutabt.actlvl = 1 -- 'active' level on which to apply midrules, normally 1 -ltt.col_ver_repl = { +lutabt.col_ver_repl = { m = 'm', M = 'm', b = 'b', } -ltt.col_hor_repl = { -- horizontal cell alignment that multicolumn should use if () or [hori] not passed to func +lutabt.col_hor_repl = { -- horizontal cell alignment that multicolumn should use if () or [hori] not passed to func l = 'l', c = 'c', r = 'r', @@ -70,11 +72,11 @@ ltt.col_hor_repl = { -- horizontal cell alignment that multicolumn should use if } -- allow user to place their own replacements in for a table, say if they define a column that expands to multiple -ltt.col_replaces = { +lutabt.col_replaces = { --x = 'lll' } -ltt.SI_cols = {'S', 'N', 'Q', 'L', 'R'} +lutabt.SI_cols = {'S', 'N', 'Q', 'L', 'R'} @@ -83,24 +85,33 @@ ltt.SI_cols = {'S', 'N', 'Q', 'L', 'R'} ----- -function ltt.debugtalk(s, ss) +function lutabt.debugtalk(s, ss) ss = ss or '' - if ltt.debug then + if lutabt.debug then pl.tex.help_wrt(s, ss..' (lutabulartools)') end end +function __lutabt__debugprtall() + --pl.help_wrt(pl.tablex.filter({ lutabt }, function(v) return type(v) ~= 'function' end), '(lutabulartools state)') + pl.help_wrt(lutabt, '(lutabulartools state)') +end + -function ltt.set_tabular(sett) +function lutabt.set_tabular(sett) sett = luakeys.parse(sett) local trim = '' for k, v in pairs(sett) do if k == 'tbrule' then - ltt.auto_topbot = v + lutabt.auto_topbot = v elseif k == 'nopad' then if pl.hasval(v) then trim = '@{}' end -- set to trim tex.print('\\newcolumntype{\\lttltrim}{'..trim..'}') tex.print('\\newcolumntype{\\lttrtrim}{'..trim..'}') + elseif k =='rowsep' then + tex.print('\\gdef\\arraystretch{'..v..'}') + elseif k =='colsep' then + tex.print('\\global\\setlength{\\tabcolsep}{'..(v*6)..'pt'..'}') end end end @@ -110,13 +121,13 @@ end ----- tabular utility funcs ----- -function ltt.reset_rows() - if ltt.tablelevel == 1 then - ltt.row_num = 0 +function lutabt.reset_rows() + if lutabt.isactlevel() then + lutabt.row_num = 0 end end -function ltt.set_col_num() +function lutabt.set_col_num() -- register current column info (column number and specification) local nest for i = tex.nest.ptr, 1, -1 do @@ -131,16 +142,16 @@ function ltt.set_col_num() for _, sub in node.traverse_id(node.id'unset', nest.head) do col = col + sub + 1 end - ltt.col_num = col + lutabt.col_num = col else - ltt.col_num = 1 + lutabt.col_num = 1 end - ltt.col = ltt.col_spec[ltt.col_num] - ltt.debugtalk('col_num='..ltt.col_num..'; col_spec='..ltt.col,'set_col_num') + lutabt.col = lutabt.col_spec[lutabt.col_num] + lutabt.debugtalk('col_num='..lutabt.col_num..'; col_spec='..lutabt.col,'set_col_num') end -function ltt.set_col_spec(zz) +function lutabt.set_col_spec(zz) -- contents of string 'zz' -- register the table column specification zz = zz:gsub ( "%*%s-{(%d-)}%s-(%b{})" , -- expand expressions such as "*{5}{l}" to "lllll" @@ -148,15 +159,15 @@ function ltt.set_col_spec(zz) zz = zz:gsub ( "%b{}" , "" ) -- omit all stuff in curly braces and square zz = zz:gsub ( "%b[]" , "" ) zz = zz:gsub ( "[@!|><%s%*\']" , "" ) -- some more characters to ignore - zz = zz:gsub('%a', ltt.col_replaces) -- sub extra column + zz = zz:gsub('%a', lutabt.col_replaces) -- sub extra column _col_spec = zz:totable() -- requires pl extras --help_wrt(_col_spec, 'helpme') if #_col_spec > 1 then - ltt.col_spec = _col_spec + lutabt.col_spec = _col_spec else - ltt.col_spec1 = _col_spec + lutabt.col_spec1 = _col_spec end - ltt.debugtalk(ltt.col_spec,'set_col_spec') + lutabt.debugtalk(lutabt.col_spec,'set_col_spec') end @@ -171,23 +182,26 @@ end ----- magic cell and helpers ----- -function ltt.MagicCell(s0,spec,mcspec,pre,content,trim) +function lutabt.MagicCell(s0,spec,mcspec,pre,content,trim) + -- todo delete trim!!! -- - ltt.set_col_num() -- register current column number and column spec + lutabt.set_col_num() -- register current column number and column spec local STR = '' pl.tex.reset_bkt_cnt() - local v, h, r, c, mrowsym, skipmakecell = ltt.parse_MagicCell_spec(spec) -- get v/h align, number rows/columns + local spec, iscmidrule, trim = lutabt.check_MC_cmidrule(spec) -- check for cmidrule and clean spec + + local v, h, r, c, mrowsym, skipmakecell = lutabt.parse_MagicCell_spec(spec) -- get v/h align, number rows/columns local mcspec = mcspec or '' - h, mcspec, c = ltt.get_HColSpec(h, mcspec, c) -- infer horizontal alignment, num columns + h, mcspec, c = lutabt.get_HColSpec(h, mcspec, c) -- infer horizontal alignment, num columns - ltt.debugtalk(pl.List{v, h, r, c, mcspec}:join'; ','v, h, r, c, mcspec') + lutabt.debugtalk(pl.List{v, h, r, c, mcspec}:join'; ','v, h, r, c, mcspec') --help_wrt(_CurTabColAbv,'current column') - if s0 == pl.tex._xTrue or (pl.List(ltt.SI_cols):contains(ltt.col) -- special columns for SI + if s0 == pl.tex._xTrue or (pl.List(lutabt.SI_cols):contains(lutabt.col) -- special columns for SI and c == '') then -- multicolumn cannot have {} around it STR = STR .. '{' -- multirow and makcell must have {} around it S column is used pl.tex.add_bkt_cnt() @@ -217,17 +231,30 @@ function ltt.MagicCell(s0,spec,mcspec,pre,content,trim) STR = STR..content..pl.tex.close_bkt_cnt() --Troubleshooting --help_wrt(STR..' <<< magic cell string') - ltt.debugtalk(STR,'MagicCell') + lutabt.debugtalk(STR,'MagicCell') tex.sprint(STR)--tex print the STR - local en - if c == '' then en = ltt.col_num else en = ltt.col_num + c -1 end - ltt.add_auto_crule(ltt.col_num, en, trim) + if iscmidrule then + local en + if c == '' then en = lutabt.col_num else en = lutabt.col_num + c -1 end + lutabt.add_auto_crule(lutabt.col_num, en, trim) + end end +function lutabt.check_MC_cmidrule(spec) + local iscmidrule = false + local trim = '' + local st, en = spec:find('_') + if st ~= nil then + trim = spec:sub(st+1, #spec) + spec = spec:sub(1,st-1) + iscmidrule = true + end + return spec, iscmidrule, trim +end -function ltt.parse_MagicCell_spec(spec) +function lutabt.parse_MagicCell_spec(spec) local mrowsym = '*' -- * = natural width, = will match p{2cm} for example local skipmakecell = false if string.find(spec, '=') then @@ -238,7 +265,7 @@ function ltt.parse_MagicCell_spec(spec) spec = spec:lower():gsub('%s','') -- take lower case and remove space local vh, rc = spec:gextract('%a') -- extract characters - local v = vh:gfirst({'t', 'm', 'b'}) or ltt.col_ver_repl[ltt.col] or 't' + local v = vh:gfirst({'t', 'm', 'b'}) or lutabt.col_ver_repl[lutabt.col] or 't' local h = vh:gfirst({'l', 'c', 'r'}) or '' v = v:gsub('m', 'c') @@ -252,27 +279,27 @@ function ltt.parse_MagicCell_spec(spec) end -function ltt.get_HColSpec(h, mcspec, c) -- take horizontal alignment +function lutabt.get_HColSpec(h, mcspec, c) -- take horizontal alignment -- c is num columns, h is horizontal alginment, --Assumes _TabColNum was calculated previosly if c == '+' then -- fill row to end - c = tostring(#ltt.col_spec - ltt.col_num + 1) + c = tostring(#lutabt.col_spec - lutabt.col_num + 1) end if h == '' then -- if horizontal not provided, use declared column - h = ltt.col_hor_repl[ltt.col] or 'l' + h = lutabt.col_hor_repl[lutabt.col] or 'l' end if c ~= '' then -- only make new mcspec if column nums > 0 if mcspec == '' then -- and if no mcspec was passed mcspec = h - if ltt.col_num == 1 then -- if first column, auto detect padding + if lutabt.col_num == 1 then -- if first column, auto detect padding mcspec = '@{}'..mcspec end - if (ltt.col_num + tonumber(c) - 1) == #ltt.col_spec then -- if end on last column + if (lutabt.col_num + tonumber(c) - 1) == #lutabt.col_spec then -- if end on last column mcspec = mcspec..'@{}' end else -- if mcspec if given, extract the alignment - ltt.set_col_spec(mcspec) - h = ltt.col_spec1[1] -- get 1 character column spec from mcspec and override h + lutabt.set_col_spec(mcspec) + h = lutabt.col_spec1[1] -- get 1 character column spec from mcspec and override h end end return h, mcspec, c @@ -280,52 +307,54 @@ end ----- ------ autorules (with \MC() or auto top bot +----- autorules (with \MC() or auto top bot or midrule X, performed after \\ ----- -function ltt.add_auto_midrules(rows) - ltt.auto_midrules = rows:split(',') +function lutabt.add_auto_midrules(rows) + lutabt.auto_midrules = rows:split(',') end -function ltt.add_auto_crule(st,en,trim) +function lutabt.add_auto_crule(st,en,trim) if trim ~= 'x' then - ltt.auto_crules[#ltt.auto_crules + 1] = {math.floor(st)..'-'..math.floor(en), trim} -- append here + lutabt.auto_crules[#lutabt.auto_crules + 1] = {math.floor(st)..'-'..math.floor(en), trim} -- append here -- {{span 1-2, trim}, ..} end end +function lutabt.isactlevel() + lutabt.tablelevel = tonumber(lutabt.tablelevel) + lutabt.actlvl = tonumber(lutabt.actlvl) + return lutabt.actlvl == lutabt.tablelevel +end -function ltt.process_auto_rules() - if ltt.tablelevel == 1 then - ltt.row_num = ltt.row_num + 1 - end - if ltt.auto_crules ~= {} then - if ltt.tablelevel == 1 then - for _, v in ipairs(ltt.auto_crules) do - --pl.help_wrt(ltt.auto_crules, 'fuck') - ltt.make1cmidrule('', v[2], v[1], 'cmidrule') + +function lutabt.process_auto_rules() + if lutabt.isactlevel() then + lutabt.row_num = lutabt.row_num + 1 + if lutabt.auto_crules ~= {} then + for _, v in ipairs(lutabt.auto_crules) do + lutabt.make1cmidrule('', v[2], v[1], 'cmidrule') end - for i, v in ipairs(ltt.auto_midrules) do - --pl.help_wrt(ltt.auto_midrules, 'fuck') - --pl.help_wrt(v, 'fuck') - pl.help_wrt(ltt.row_num, 'fuck') - if tonumber(v) == ltt.row_num then - _ = table.remove(ltt.auto_midrules,i) - --pl.help_wrt(v, 'removed!') + for i, v in ipairs(lutabt.auto_midrules) do + if tonumber(v) == lutabt.row_num then + _ = table.remove(lutabt.auto_midrules,i) tex.print('\\midrule ') end end end + if lutabt.mrX.settings.on then + lutabt.mrX.midruleX() + end end - ltt.auto_crules = {} + lutabt.auto_crules = {} end -function ltt.process_auto_topbot_rule(rule) - if ltt.tablelevel == 1 then - if ltt.auto_topbot then +function lutabt.process_auto_topbot_rule(rule) + if lutabt.isactlevel() then + if lutabt.auto_topbot then tex.print('\\'..rule..'rule ') end end @@ -337,31 +366,24 @@ end ----- ------ midrule and midruleX stuff +----- extra midrule ----- -ltt.mrX = {} -ltt.mrX.defaults = {step=5, rule='midrule', reset=false, resetnum=0, cntr=0} -ltt.mrX.settings = T.copy(ltt.mrX.defaults) -ltt.mrX.cntr = 0 -ltt.mrX.pgcntr = 0 - - -function ltt.get_midrule_col(s) +function lutabt.get_midrule_col(s) if string.find(s, '+') then s = s:gsub('+', '') if (s == '') or (s == '0') then s = 1 end - s = tostring(#ltt.col_spec - tonumber(s) + 1) -- use number of tabular columns above 0, + s = tostring(#lutabt.col_spec - tonumber(s) + 1) -- use number of tabular columns above 0, end return s end -function ltt.make1cmidrule(s, r, c, cmd) -- s=square r=round c=curly +function lutabt.make1cmidrule(s, r, c, cmd) -- s=square r=round c=curly cmd = '\\'..cmd if s ~= '' then cmd = cmd..'['..s..']' @@ -376,61 +398,86 @@ function ltt.make1cmidrule(s, r, c, cmd) -- s=square r=round c=curly if t[2] == nil then t[2] = t[1] end - c = ltt.get_midrule_col(t[1])..'-'..ltt.get_midrule_col(t[2]) + c = lutabt.get_midrule_col(t[1])..'-'..lutabt.get_midrule_col(t[2]) cmd = cmd..'{'..c..'}' - ltt.debugtalk(cmd,'make1cmidrule') + lutabt.debugtalk(cmd,'make1cmidrule') tex.print(cmd) end -function ltt.makecmidrules(s, r, c, cmd) +function lutabt.makecmidrules(s, r, c, cmd) for k, c1 in pairs(string.split(c, ',')) do r1, c2 = c1:gextract('%a') if r1 == '' then -- if nothing passed in with the column r1 = r -- set to the global value passed in round brackets end - ltt.make1cmidrule(s, r1:strip(), c2:strip(), cmd) + lutabt.make1cmidrule(s, r1:strip(), c2:strip(), cmd) end end +----- +----- midruleX +----- + +lutabt.mrX = {} +lutabt.mrX.resets = {long=false, longhead=0, cntr=0, head=nil, longx=false, on=true} -- settings that reset when \setmidruleX used +lutabt.mrX.resets['head*'] = nil +lutabt.mrX.settings = T.update(T.copy(lutabt.mrX.resets), {pgcntr=0, step=5, rule='midrule'}) -- current settings, not overwritten with each call + + +function lutabt.mrX.reset_midruleX(n) + lutabt.mrX.settings.cntr = tonumber(n) +end + +function lutabt.mrX.off() + if lutabt.isactlevel() then + lutabt.mrX.settings.on = false + end +end -function ltt.mrX.set_midruleX(new_sett, def) - def = def or '' - local curr_sett = {} - if def == pl.tex._xTrue then -- default flag, if true, reset all non-used keys to default - curr_sett = ltt.mrX.defaults +function lutabt.mrX.set_midruleX(new_sett, def) + lutabt.mrX.settings = T.update(lutabt.mrX.settings, T.union(lutabt.mrX.resets, luakeys.parse(new_sett))) + lutabt.debugtalk(lutabt.mrX.settings, 'new midruleX settings') + if lutabt.mrX.settings.head ~= nil then + lutabt.mrX.settings.cntr = -1*tonumber(lutabt.mrX.settings.head) + elseif lutabt.mrX.settings['head*'] ~= nil then + lutabt.mrX.settings.cntr = -1*tonumber(lutabt.mrX.settings['head*']) + lutabt.auto_midrules[#lutabt.auto_midrules + 1] = lutabt.mrX.settings['head*'] + lutabt.mrX.settings['head*'] = nil -- for some reason need to do this to clear head* + end + if lutabt.mrX.settings.longx then -- longtable X messes with the tablelevel settings, hack to fix, use longx keyword + lutabt.actlvl = 3 + lutabt.mrX.settings.long = true else - curr_sett = ltt.mrX.settings + lutabt.actlvl = 1 end - new_sett = luakeys.parse(new_sett) - ltt.mrX.settings = T.union(curr_sett, new_sett) - ltt.debugtalk(ltt.mrX.settings, 'new midruleX settings') - ltt.mrX.cntr = curr_sett.cntr end -function ltt.mrX.midruleX(n) + +function lutabt.mrX.midruleX(n) n = n or '' -- todo placeholder for noalign ? - local s = ltt.mrX.settings + lutabt.debugtalk(lutabt.mrX.settings, 'midruleX here') + local s = lutabt.mrX.settings local rule = s.rule - if pl.hasval(s.reset) and ltt.mrX.add_label_and_check_page_change() then ltt.mrX.cntr = s.resetnum end - ltt.mrX.cntr = ltt.mrX.cntr + 1 - if ltt.mrX.cntr == s.step then + if pl.hasval(s.long) and lutabt.mrX.add_label_and_check_page_change() then lutabt.mrX.settings.cntr = -1*s.longhead end -- reset to number on page change + lutabt.mrX.settings.cntr = lutabt.mrX.settings.cntr + 1 + if lutabt.mrX.settings.cntr == s.step then if not rule:startswith('\\') then rule = '\\'..rule end -- todo consider allowing \gmidrule syntax, possible issue with expansion - ltt.debugtalk(rule, 'apply midruleX') + lutabt.debugtalk(rule, 'apply midruleX') tex.sprint(rule) - ltt.mrX.cntr = 0 + lutabt.mrX.settings.cntr = 0 end end -function ltt.mrX.add_label_and_check_page_change() - ltt.mrX.pgcntr = ltt.mrX.pgcntr + 1 - tex.print('\\noalign{\\label{ltt@tabular@row@'..ltt.mrX.pgcntr..'}}') - local rcurr = pl.tex.get_ref_info('ltt@tabular@row@'..ltt.mrX.pgcntr) - local rprev = pl.tex.get_ref_info('ltt@tabular@row@'..ltt.mrX.pgcntr-1) - --local rcurrc, _, _ = pl.tex.get_ref_info_all_cref('ltt@tabular@row@'..ltt.mrX.pgcntr) - ltt.debugtalk('curr: '..rcurr[2]..' prev: '..rprev[2]..' row: '..ltt.mrX.pgcntr, 'check midruleX page change') - ltt.debugtalk(rcurr, 'miduleX current reference info for row: '..ltt.mrX.pgcntr) - --ltt.debugtalk(rcurrc, 'miduleX current cleveref cref info') +function lutabt.mrX.add_label_and_check_page_change() + lutabt.mrX.settings.pgcntr = lutabt.mrX.settings.pgcntr + 1 + tex.print('\\noalign{\\label{ltt@tabular@row@'..lutabt.mrX.settings.pgcntr..'}}') + local rcurr = pl.tex.get_ref_info('ltt@tabular@row@'..lutabt.mrX.settings.pgcntr) + local rprev = pl.tex.get_ref_info('ltt@tabular@row@'..lutabt.mrX.settings.pgcntr-1) + --local rcurrc, _, _ = pl.tex.get_ref_info_all_cref('ltt@tabular@row@'..lutabt.mrX.settings.pgcntr) + lutabt.debugtalk('curr: '..rcurr[2]..' prev: '..rprev[2]..' row: '..lutabt.mrX.settings.pgcntr, 'check midruleX page change') + lutabt.debugtalk(rcurr, 'miduleX current reference info for row: '..lutabt.mrX.settings.pgcntr) + --lutabt.debugtalk(rcurrc, 'miduleX current cleveref cref info') if rcurr[2] ~= rprev[2] then -- pg no is second element return true end @@ -438,18 +485,28 @@ function ltt.mrX.add_label_and_check_page_change() end +return lutabt -- lutabulartools + + + +--http://ctan.mirror.rafal.ca/macros/latex/contrib/multirow/multirow.pdf +--http://ctan.mirror.colo-serv.net/macros/latex/contrib/makecell/makecell.pdf +-- https://tex.stackexchange.com/questions/331716/newline-in-multirow-environment + + + -- ---ltt.tabular_row_pages_cntr = 0 ---function ltt.reset_midruleX_on_newpage(n) +--lutabt.tabular_row_pages_cntr = 0 +--function lutabt.reset_midruleX_on_newpage(n) -- local n = n or 0 --- ltt.tabular_row_pages_cntr = ltt.tabular_row_pages_cntr + 1 --- tex.print('\\noalign{\\label{tabular@row@'..ltt.tabular_row_pages_cntr..'}}') --- if ltt.get_ref_page('tabular@row@'..ltt.tabular_row_pages_cntr) - --- ltt.get_ref_page('tabular@row@'..(ltt.tabular_row_pages_cntr-1)) == 1 then +-- lutabt.tabular_row_pages_cntr = lutabt.tabular_row_pages_cntr + 1 +-- tex.print('\\noalign{\\label{tabular@row@'..lutabt.tabular_row_pages_cntr..'}}') +-- if lutabt.get_ref_page('tabular@row@'..lutabt.tabular_row_pages_cntr) - +-- lutabt.get_ref_page('tabular@row@'..(lutabt.tabular_row_pages_cntr-1)) == 1 then -- tex.print('\\setcounter{midruleX}{'..n..'}') -- end --end @@ -457,14 +514,29 @@ end --help_wrt('TEST COL ') --for _, s in ipairs{ 'll', '*{6}{s}', 'l*{6}{l}', 'lll', 'll[]', 'll[]*{6}{l}', '*{6}{l}', 'y*{6}{sq}x', } do --- ltt. set_col_spec(s) --- help_wrt(ltt.col_spec,s) +-- lutabt. set_col_spec(s) +-- help_wrt(lutabt.col_spec,s) --end -return ltt -- lutabulartools - - ---http://ctan.mirror.rafal.ca/macros/latex/contrib/multirow/multirow.pdf ---http://ctan.mirror.colo-serv.net/macros/latex/contrib/makecell/makecell.pdf --- https://tex.stackexchange.com/questions/331716/newline-in-multirow-environment +-- todo move mrX mechanim to avoid @{} +--function lutabt.mrX.set_midruleX(new_sett, def) +-- def = def or '' +-- local curr_sett = {} +-- if def == pl.tex._xTrue then -- default flag, if true, reset all non-used keys to default +-- curr_sett = lutabt.mrX.defaults +-- else +-- curr_sett = lutabt.mrX.settings +-- end +-- new_sett = luakeys.parse(new_sett) +-- lutabt.mrX.settings = T.union(curr_sett, new_sett) +-- +-- lutabt.debugtalk(lutabt.mrX.settings, 'new midruleX settings') +-- lutabt.mrX.settings.cntr = tonumber(curr_sett.cntr) -- todo this needs to be a settings var +-- if new_sett.cntr ~= nil then -- todo fix the counter +-- lutabt.mrX.settings.cntr = tonumber(new_sett.cntr) +-- end +-- if new_sett.head ~= nil then -- todo fix the counter +-- lutabt.mrX.settings.cntr = -1*tonumber(new_sett.head) +-- end +--end diff --git a/Master/texmf-dist/tex/luatex/lutabulartools/lutabulartools.sty b/Master/texmf-dist/tex/luatex/lutabulartools/lutabulartools.sty index 1d2522b099d..4ca37525780 100644 --- a/Master/texmf-dist/tex/luatex/lutabulartools/lutabulartools.sty +++ b/Master/texmf-dist/tex/luatex/lutabulartools/lutabulartools.sty @@ -1,5 +1,5 @@ % Kale Ewasiuk (kalekje@gmail.com) -% 2022-11-27 +% 2022-11-29 % Copyright (C) 2021-2022 Kale Ewasiuk % % Permission is hereby granted, free of charge, to any person obtaining a copy @@ -23,7 +23,7 @@ % OR OTHER DEALINGS IN THE SOFTWARE. \NeedsTeXFormat{LaTeX2e} -\ProvidesPackage{lutabulartools}[2022-11-27] +\ProvidesPackage{lutabulartools}[2022-11-29] \RequirePackage{booktabs} \RequirePackage{multirow} @@ -39,6 +39,7 @@ \newcommand{\lttdebugON}{\luadirect{lutabt.debug = true}} \newcommand{\lttdebugOFF}{\luadirect{lutabt.debug = true}} +\newcommand{\lttdebugprt}{\luadirect{__lutabt__debugprtall()}} \newcolumntype{\lttltrim}{} \newcolumntype{\lttrtrim}{} @@ -46,15 +47,38 @@ %%% midrule every X rows -\def\midruleX{\aftergroup\aftergroup\aftergroup\midruleX@aux} -\def\midruleX@aux{\luadirect{lutabt.mrX.midruleX('')}} % todo argument for vadjust or noalign?? -\NewDocumentCommand{\setmidruleX}{s O{N} m}{% +% NO LONGER NEEDED %%% this was used for @{\midruleX} in colspec, but I made a better way +%\def\midruleX{\aftergroup\aftergroup\aftergroup\midruleX@aux} +%\def\midruleX@aux{\luadirect{lutabt.mrX.midruleX('')}} % +%%% + +\NewDocumentCommand{\midruleX}{s O{N} m}{% \MakeluastringCommands[N]{#2}% \luadirect{lutabt.mrX.set_midruleX(\plluastringA{#3}, \luastring{#1})}% } -\NewDocumentCommand{\midruleXreset}{O{0}}{\luadirect{lutabt.mrX.cntr = tonumber(\luastring{#1})}} -\NewCommandCopy\resetmidruleX\midruleXreset +\NewDocumentCommand{\resetmidruleX}{O{0}}{\luadirect{lutabt.mrX.reset_midruleX(\luastring{#1})}} + + +\NewDocumentCommand{\settabular}{s m}{\luadirect{lutabt.set_tabular(\luastring{#2})}} % + +\def\ltt@resetrownum{\luadirect{lutabt.reset_rows()}} +\def\ltt@resetrownumhard{\luadirect{lutabt.row_num = 0}} +\def\ltt@autotoprule{\luadirect{lutabt.process_auto_topbot_rule('top')}} +\def\ltt@autobotrule{\luadirect{lutabt.process_auto_topbot_rule('bottom')}} +\def\ltt@storeautotbandfalse{\luadirect{ + lutabt.auto_topbot_old = lutabt.auto_topbot + lutabt.auto_topbot = false}} +\def\ltt@restoreautotb{\luadirect{lutabt.auto_topbot = lutabt.auto_topbot_old}} +\def\ltt@inctablelevel{\luadirect{lutabt.tablelevel = lutabt.tablelevel + 1}} +\def\ltt@dectablelevel{\luadirect{lutabt.tablelevel = lutabt.tablelevel - 1}} +\def\ltt@midruleXoff{\luadirect{lutabt.mrX.off()}} +\def\ltt@actlevelreset{\luadirect{lutabt.actlvl = 1}} + +\apptocmd{\@arraycr}{\luadirect{lutabt.process_auto_rules()}}{}{} + + +\NewDocumentCommand{\midrulesat}{m}{\luadirect{lutabt.add_auto_midrules(\luastring{#1})}} %%%% @@ -138,16 +162,11 @@ -\NewDocumentCommand{\midrulesat}{m}{\luadirect{lutabt.add_auto_midrules(\luastring{#1})}} +\apptocmd{\LTXtable}{\ltt@actlevelreset\ltt@resetrownumhard\luadirect{lutabt.tablelevel=0}}{}{} -\NewDocumentCommand{\settabular}{s m}{\luadirect{lutabt.set_tabular(\luastring{#2})}} % make kv interface for auto - -\def\ltt@resetrownum{\luadirect{lutabt.reset_rows()}} -\def\ltt@autotoprule{\luadirect{lutabt.process_auto_topbot_rule('top')}} -\def\ltt@autobotrule{\luadirect{lutabt.process_auto_topbot_rule('bottom')}} \let\oldtabular\tabular \let\oldendtabular\endtabular @@ -155,9 +174,7 @@ \luadirect{lutabt.set_col_spec(\luastringN{#2})}% \oldtabular[#1]{\lttltrim#2\lttrtrim}\ltt@inctablelevel\ltt@resetrownum\ltt@autotoprule% } -\def\endtabular{\ltt@autobotrule\ltt@dectablelevel\oldendtabular} - - +\def\endtabular{\ltt@autobotrule\ltt@midruleXoff\ltt@dectablelevel\oldendtabular} \expandafter\let\expandafter\oldtabulars\csname tabular*\endcsname @@ -166,27 +183,21 @@ \luadirect{lutabt.set_col_spec(\luastringN{#3})}% \begin{oldtabulars}{#1}[#2]{\lttltrim#3\lttrtrim}\ltt@inctablelevel\ltt@resetrownum\ltt@autotoprule% }{% - \ltt@autobotrule\ltt@dectablelevel\end{oldtabulars}% + \ltt@autobotrule\ltt@midruleXoff\ltt@dectablelevel\end{oldtabulars}% } %%% NOTE tabularx uses tabular*, NO NEED TO CHANGE TABULARX! + \let\oldlongtable\longtable \RenewExpandableDocumentCommand{\longtable}{ O{l} m }{% - \luadirect{lutabt.auto_topbot_old = lutabt.auto_topbot - lutabt.auto_topbot = false}% + \ltt@storeautotbandfalse% \luadirect{lutabt.set_col_spec(\luastringN{#2})}% \oldlongtable[#1]{\lttltrim#2\lttrtrim}\ltt@inctablelevel\ltt@resetrownum% } \let\oldendlongtable\endlongtable -\def\endlongtable{\luadirect{lutabt.auto_topbot = lutabt.auto_topbot_old} - \ltt@dectablelevel\oldendlongtable}% restore status of auto topbot rule - -\apptocmd{\@arraycr}{\luadirect{lutabt.process_auto_rules()}}{}{} +\def\endlongtable{\ltt@restoreautotb\ltt@midruleXoff\ltt@dectablelevel\oldendlongtable}% restore status of auto topbot rule -\def\ltt@inctablelevel{\luadirect{lutabt.tablelevel = lutabt.tablelevel + 1}} -\def\ltt@dectablelevel{\luadirect{lutabt.tablelevel = lutabt.tablelevel - 1}} - %s0,spec,mcspec,pre,content % Magic Cell \NewExpandableDocumentCommand{\MC}{ s O{} O{} D<>{} D(){x} m }{% -- cgit v1.2.3