diff options
Diffstat (limited to 'tex/context/base/tabl-ntb.mkiv')
-rw-r--r-- | tex/context/base/tabl-ntb.mkiv | 1912 |
1 files changed, 901 insertions, 1011 deletions
diff --git a/tex/context/base/tabl-ntb.mkiv b/tex/context/base/tabl-ntb.mkiv index 9c7864184..99da4b5e8 100644 --- a/tex/context/base/tabl-ntb.mkiv +++ b/tex/context/base/tabl-ntb.mkiv @@ -1,5 +1,5 @@ %D \module -%D [ file=tabl-ntb, +%D [ file=core-ntb, %D version=2000.04.18, %D title=\CONTEXT\ Table Macros, %D subtitle=Natural Tables, @@ -11,15 +11,16 @@ %C therefore copyrighted by \PRAGMA. See mreadme.pdf for %C details. -%D This module as a more modern variant in xtables but as we follow a bit -%D different approach with settings there, this mechanism will stay. In fact -%D each of them has its advantages. This module could be sped up a bit and made -%D more efficient by delegating some housekeeping to \LUA\ but it's not worth -%D the effort. The code could me made more readable but again, there is no -%D real purpose in it. If needed I can squeeze out a few more percentages -%D runtime. +%D This is an unfinished, preliminary module. At least two +%D runs are needed to get the table fixed. Ugly code. -\writestatus{loading}{ConTeXt Table Macros / Natural Tables} +% todo: TABLE TBL -> ntb +% todo: special parsetb for argless variant +% todo: protect \tbl... +% todo: tblnx also count +% todo: get rid of recurse +% todo: fast if +% todo: avoid halign (just do it manual) and thereby globals % bug: width 3cm is not honored and column becomes too wide % as given width is added to distributed width @@ -55,14 +56,65 @@ % \stopcelltable % \stoptext -%D As always, this is the n\high{th} version. Much time went in +% optie=rek beschrijven + +\writestatus{loading}{ConTeXt Table Macros / Natural Tables} + +%D As always, this is the nth version. Much time went in %D trying to speed up the many cell calculations, some %D optimizations were rejected in order not to complicate this -%D module too much (and in order to prevail extensibility). In the -%D meantime we've sacrified some speed for readability. +%D module too much (and in order to prevail extensibility). +% shapebox fails here in mkii +% +% \setupcolors[state=start] +% \bTABLE +% \bTR [align=middle]\bTH Range\eTH{}\bTH Value\eTH{}\eTR +% \bTR \bTD \type{<} 12\eTD{}\bTD 3\eTD{}\eTR +% \bTR \bTD 12--16\eTD{}\bTD 2\eTD{}\eTR +% \bTR \bTD \type{>}16\eTD{}\bTD 1\eTD{}\eTR +% \eTABLE + +% \starttext +% \placefigure[left]{}{} +% \startlinecorrection \dontleavehmode \bTABLE +% \bTR \bTD oeps \eTD \eTR +% \eTABLE \stoplinecorrection +% \placefigure[right]{}{} +% \startlinecorrection \dontleavehmode \bTABLE +% \bTR \bTD oeps \eTD \eTR +% \eTABLE \stoplinecorrection +% \stoptext + +%D To Do: +%D +%D \starttyping +%D break over pagina +%D kop herhalen +%D reset settings +%D +%D \setupTABLE [c|column|x] [nx|odd|even|first|last][a=b] +%D \setupTABLE [r|row |y] [nx|odd|even|first|last][a=b] +%D \setupTABLE [nx|odd|even|first|last][ny|odd|even|first|last][a=b] +%D \setupTABLE [nx|odd|even|first|last] [a=b] +%D \setupTABLE [a=b] +%D +%D \bTH \eTH +%D \stoptyping + +% the section setup does not work yet, data needs to be stored, +% i.e.each row should know if it's a head/body/foot, and there +% should be \setupTABLE[head]... and alike + \unprotect +%D A simple way to force equal line spacing is to say: +%D +%D \starttyping +%D \def\bTBLCELL{\begstrut} +%D \def\eTBLCELL{\endstrut} +%D \stoptyping +%D %D The next alternative also takes care of preceding and following %D white space. %D @@ -74,25 +126,22 @@ %D %D \typebuffer \getbuffer -\ifdefined\dotagTABLEcell \else \let\dotagTABLEcell \relax \fi % todo: namespace -\ifdefined\dotagTABLEsignal \else \let\dotagTABLEsignal\relax \fi % todo: namespace - -\let\tabl_tnb_next_level\relax +\ifdefined\dotagTABLEcell \else \let\dotagTABLEcell \relax \fi +\ifdefined\dotagTABLEsignal \else \let\dotagTABLEsignal\relax \fi -\unexpanded\def\tabl_tnb_cell_start +\def\bTBLCELL % why not \doinhibitblank {\inhibitblank \dotagTABLEcell -% \tabl_tnb_next_level - \usenaturaltablelocalstyleandcolor\c!style\c!color - \everypar{\naturaltablelocalparameter\c!left\delayedbegstrut}} + \dousestyleparameter\tbltblstyle + \everypar{\tbltblleft\delayedbegstrut}} -\unexpanded\def\tabl_tnb_cell_stop +\def\eTBLCELL {\ifhmode \delayedendstrut - \naturaltablelocalparameter\c!right + \tbltblright \par % added 13/4/2006 \else - % not sure yet:\naturaltablelocalparameter\c!right + % not sure yet:\tbltblright \par \ifdim\prevdepth<\zeropoint % =-1000pt ? \vskip-\strutdp @@ -101,195 +150,92 @@ \fi \fi} -\newcount\c_tabl_ntb_row -\newcount\c_tabl_ntb_col -\newcount\c_tabl_ntb_spn +\newcount\currenttbl -\newcount\c_tabl_ntb_nx -\newcount\c_tabl_ntb_ny +\def\@@tbl{tbl} \def\tblcell{1} \def\tblnone{2} -\setnewconstant\c_tabl_ntb_cell \plusone -\setnewconstant\c_tabl_ntb_none \plustwo +\def\@@tblprefix{tbl:} \let\@@rawtblprefix\@@tblprefix -\newcount\c_tabl_ntb_current_row -\newcount\c_tabl_ntb_current_col -\newcount\c_tabl_ntb_current_row_one -\newcount\c_tabl_ntb_current_col_one -\newcount\c_tabl_ntb_current_row_two -\newcount\c_tabl_ntb_current_col_two -\newcount\c_tabl_ntb_current_row_three -\newcount\c_tabl_ntb_current_col_three -\newcount\c_tabl_ntb_current_row_four -\newcount\c_tabl_ntb_current_col_four +%D This should be done more efficient: soon -\newcount\c_tabl_ntb_running_col -\newcount\c_tabl_ntb_maximum_row -\newcount\c_tabl_ntb_maximum_col -\newcount\c_tabl_ntb_maximum_row_span -\newcount\c_tabl_ntb_maximum_col_span +% \let as well as \expandafter\edef's -\newtoks\t_tabl_ntb -\newtoks\t_tabl_ntb_row +\newcounter\TBLlevel -\newconstant\c_tabl_tbl_pass +\def\@@tblprefix{\@@tbl:\ifnum\TBLlevel>1 :\TBLlevel:\fi} -\newtoks\t_tabl_ntb_head -\newtoks\t_tabl_ntb_next -\newtoks\t_tabl_ntb_body -\newtoks\t_tabl_ntb_foot +% \def\tblsetprefix % not yet used, figure out when .. may interfere with setup +% {\edef\@@tblprefix{\@@tbl:\ifnum\TBLlevel>1 :\TBLlevel:\fi}} -\newcount\c_tabl_ntb_n_of_head_lines -\newcount\c_tabl_ntb_n_of_next_lines -\newcount\c_tabl_ntb_n_of_hdnx_lines +\def\settblnob#1{\expandafter\let\csname\@@tblprefix\number#1:b\endcsname\plusone} +\def\gettblnob#1{\ifcsname\@@tblprefix\number#1:b\endcsname\plusone\else\zerocount\fi} -\newdimen\d_tabl_ntb_height -\newdimen\d_tabl_ntb_width +\def\settbltag#1#2{\expandafter\edef\csname\@@tblprefix\number#1:\number#2:s\endcsname} +\def\settblcol#1#2{\expandafter\edef\csname\@@tblprefix\number#1:\number#2:c\endcsname} +\def\settblrow#1#2{\expandafter\edef\csname\@@tblprefix\number#1:\number#2:r\endcsname} -\newtoks\everyTABLEpass % public +\def\lettbltag#1#2{\expandafter\let\csname\@@tblprefix\number#1:\number#2:s\endcsname} +\def\lettblcol#1#2{\expandafter\let\csname\@@tblprefix\number#1:\number#2:c\endcsname} +\def\lettblrow#1#2{\expandafter\let\csname\@@tblprefix\number#1:\number#2:r\endcsname} -\newcount\tablecellrows % public (needs checking) -\newcount\tablecellcolumns % public (needs checking) +\def\settblwd#1#2{\expandafter\xdef\csname\@@tblprefix\number#1:\number#2:wd\endcsname} % global ! +\def\settblht#1#2{\expandafter\xdef\csname\@@tblprefix\number#1:\number#2:ht\endcsname} % global ! +\def\lettblwd#1#2{\global\expandafter\let\csname\@@tblprefix\number#1:\number#2:wd\endcsname} % global ! +\def\lettblht#1#2{\global\expandafter\let\csname\@@tblprefix\number#1:\number#2:ht\endcsname} % global ! -\newbox\b_tabl_ntb_final +\def\gettbltag#1#2{\csname\@@tblprefix\number#1:\number#2:s\endcsname} +\def\gettblcol#1#2{\csname\@@tblprefix\number#1:\number#2:c\endcsname} +\def\gettblrow#1#2{\csname\@@tblprefix\number#1:\number#2:r\endcsname} -%D We have already prepared the previous macros for nesting, -%D so we only have to pop in the right ones: +\def\gettblwd #1#2{\csname\@@tblprefix\number#1:\number#2:wd\endcsname} +\def\gettblht #1#2{\csname\@@tblprefix\number#1:\number#2:ht\endcsname} -\newcount\c_tabl_level +\def\settblwid#1{\expandafter\xdef\csname\@@tblprefix\number#1:w\endcsname} % {#2} global ! +\def\settblhei#1{\expandafter\xdef\csname\@@tblprefix\number#1:h\endcsname} % {#2} global ! +\def\settbldis#1{\expandafter\xdef\csname\@@tblprefix\number#1:d\endcsname} % {#2} global ! +\def\settblaut#1{\expandafter\xdef\csname\@@tblprefix\number#1:a\endcsname} % {#2} global ! -\unexpanded\def\tabl_ntb_table_push - {\ifnum\m_tabl_tbl_level>\plusone - \tabl_ntb_parameters_reset - % we need a proper count push/pop - \xdef\m_tabl_ntb_saved_row{\the\c_tabl_ntb_row}\globalpushmacro\m_tabl_ntb_saved_row - \xdef\m_tabl_ntb_saved_col{\the\c_tabl_ntb_col}\globalpushmacro\m_tabl_ntb_saved_col - \else - \global\intabletrue - \fi} +\def\lettblwid#1{\global\expandafter\let\csname\@@tblprefix\number#1:w\endcsname} % {#2} global ! +\def\lettblhei#1{\global\expandafter\let\csname\@@tblprefix\number#1:h\endcsname} % {#2} global ! +\def\lettbldis#1{\global\expandafter\let\csname\@@tblprefix\number#1:d\endcsname} % {#2} global ! +\def\lettblaut#1{\global\expandafter\let\csname\@@tblprefix\number#1:a\endcsname} % {#2} global ! -\unexpanded\def\tabl_ntb_table_pop - {\ifnum\m_tabl_tbl_level>\plusone - \globalpopmacro\m_tabl_ntb_saved_row\global\c_tabl_ntb_row\m_tabl_ntb_saved_row - \globalpopmacro\m_tabl_ntb_saved_col\global\c_tabl_ntb_col\m_tabl_ntb_saved_col - \else - \global\intablefalse - \fi} +\def\gettblwid#1{\ifcsname\@@tblprefix\number#1:w\endcsname\csname\@@tblprefix\number#1:w\endcsname\else\zeropoint\fi} +\def\gettblhei#1{\ifcsname\@@tblprefix\number#1:h\endcsname\csname\@@tblprefix\number#1:h\endcsname\else\zeropoint\fi} +\def\gettbldis#1{\ifcsname\@@tblprefix\number#1:d\endcsname\csname\@@tblprefix\number#1:d\endcsname\else\zeropoint\fi} +\def\gettblaut#1{\csname \@@tblprefix\number#1:a\endcsname} -\unexpanded\def\tabl_tnb_next_level - {\advance\c_tabl_level\plusone - \edef\m_tabl_tbl_level{\the\c_tabl_level}} - -\unexpanded\def\tabl_tnb_prev_level - {\advance\c_tabl_level\minusone - \edef\m_tabl_tbl_level{\the\c_tabl_level}} - -\tabl_tnb_next_level % go to level 1 - -\installcorenamespace{naturaltable} % was tbl -\installcorenamespace{naturaltablelocal} % was tbltbl - -\installdirectcommandhandler \??naturaltable {naturaltable} % \??naturaltable -\installsimpleframedcommandhandler \??naturaltablelocal {naturaltablelocal} \??naturaltablelocal - -\installcorenamespace{naturaltablenob} -\installcorenamespace{naturaltabletag} -\installcorenamespace{naturaltablecol} -\installcorenamespace{naturaltablerow} -\installcorenamespace{naturaltablewd} -\installcorenamespace{naturaltableht} -\installcorenamespace{naturaltabledp} -\installcorenamespace{naturaltablewid} -\installcorenamespace{naturaltablehei} -\installcorenamespace{naturaltabledis} -\installcorenamespace{naturaltableaut} -\installcorenamespace{naturaltabletxt} -\installcorenamespace{naturaltablespn} -\installcorenamespace{naturaltableref} -\installcorenamespace{naturaltableset} -\installcorenamespace{naturaltablecell} - -\def\tabl_ntb_set_nob#1{\expandafter\let\csname\??naturaltablenob\m_tabl_tbl_level:\number#1\endcsname\plusone} -\def\tabl_ntb_get_nob#1{\ifcsname\??naturaltablenob\m_tabl_tbl_level:\number#1\endcsname\plusone\else\zerocount\fi} - -\def\tabl_ntb_set_tag#1#2{\expandafter\edef\csname\??naturaltabletag\m_tabl_tbl_level:\number#1:\number#2\endcsname} -\def\tabl_ntb_set_col#1#2{\expandafter\edef\csname\??naturaltablecol\m_tabl_tbl_level:\number#1:\number#2\endcsname} -\def\tabl_ntb_set_row#1#2{\expandafter\edef\csname\??naturaltablerow\m_tabl_tbl_level:\number#1:\number#2\endcsname} - -\def\tabl_ntb_let_tag#1#2{\expandafter\let\csname\??naturaltabletag\m_tabl_tbl_level:\number#1:\number#2\endcsname} -\def\tabl_ntb_let_col#1#2{\expandafter\let\csname\??naturaltablecol\m_tabl_tbl_level:\number#1:\number#2\endcsname} -\def\tabl_ntb_let_row#1#2{\expandafter\let\csname\??naturaltablerow\m_tabl_tbl_level:\number#1:\number#2\endcsname} - -\def\tabl_ntb_set_wd#1#2{\expandafter\xdef\csname\??naturaltablewd\m_tabl_tbl_level:\number#1:\number#2\endcsname} % global ! -\def\tabl_ntb_set_ht#1#2{\expandafter\xdef\csname\??naturaltableht\m_tabl_tbl_level:\number#1:\number#2\endcsname} % global ! - -\def\tabl_ntb_let_wd#1#2{\global\expandafter\let\csname\??naturaltablewd\m_tabl_tbl_level:\number#1:\number#2\endcsname} % global ! -\def\tabl_ntb_let_ht#1#2{\global\expandafter\let\csname\??naturaltableht\m_tabl_tbl_level:\number#1:\number#2\endcsname} % global ! - -\def\tabl_ntb_get_tag#1#2{\csname\??naturaltabletag\m_tabl_tbl_level:\number#1:\number#2\endcsname} -\def\tabl_ntb_get_col#1#2{\csname\??naturaltablecol\m_tabl_tbl_level:\number#1:\number#2\endcsname} -\def\tabl_ntb_get_row#1#2{\csname\??naturaltablerow\m_tabl_tbl_level:\number#1:\number#2\endcsname} - -\def\tabl_ntb_get_wd#1#2{\csname\??naturaltablewd\m_tabl_tbl_level:\number#1:\number#2\endcsname} -\def\tabl_ntb_get_ht#1#2{\csname\??naturaltableht\m_tabl_tbl_level:\number#1:\number#2\endcsname} - -\def\tabl_ntb_set_wid#1{\expandafter\xdef\csname\??naturaltablewid\m_tabl_tbl_level:\number#1\endcsname} % {#2} global ! -\def\tabl_ntb_set_hei#1{\expandafter\xdef\csname\??naturaltablehei\m_tabl_tbl_level:\number#1\endcsname} % {#2} global ! -\def\tabl_ntb_set_dis#1{\expandafter\xdef\csname\??naturaltabledis\m_tabl_tbl_level:\number#1\endcsname} % {#2} global ! -\def\tabl_ntb_set_aut#1{\expandafter\xdef\csname\??naturaltableaut\m_tabl_tbl_level:\number#1\endcsname} % {#2} global ! - -\def\tabl_ntb_let_wid#1{\global\expandafter\let\csname\??naturaltablewid\m_tabl_tbl_level:\number#1\endcsname} % {#2} global ! -\def\tabl_ntb_let_hei#1{\global\expandafter\let\csname\??naturaltablehei\m_tabl_tbl_level:\number#1\endcsname} % {#2} global ! -\def\tabl_ntb_let_dis#1{\global\expandafter\let\csname\??naturaltabledis\m_tabl_tbl_level:\number#1\endcsname} % {#2} global ! -\def\tabl_ntb_let_aut#1{\global\expandafter\let\csname\??naturaltableaut\m_tabl_tbl_level:\number#1\endcsname} % {#2} global ! - -\def\tabl_ntb_get_wid#1{\ifcsname\??naturaltablewid\m_tabl_tbl_level:\number#1\endcsname\csname\??naturaltablewid\m_tabl_tbl_level:\number#1\endcsname\else\zeropoint\fi} -\def\tabl_ntb_get_hei#1{\ifcsname\??naturaltablehei\m_tabl_tbl_level:\number#1\endcsname\csname\??naturaltablehei\m_tabl_tbl_level:\number#1\endcsname\else\zeropoint\fi} -\def\tabl_ntb_get_dis#1{\ifcsname\??naturaltabledis\m_tabl_tbl_level:\number#1\endcsname\csname\??naturaltabledis\m_tabl_tbl_level:\number#1\endcsname\else\zeropoint\fi} -\def\tabl_ntb_get_aut#1{\csname \??naturaltableaut\m_tabl_tbl_level:\number#1\endcsname} - -\def\tabl_ntb_tag_pattern#1#2{\??naturaltabletag\m_tabl_tbl_level:\number#1:\number#2} -\def\tabl_ntb_row_pattern#1#2{\??naturaltablerow\m_tabl_tbl_level:\number#1:\number#2} -\def\tabl_ntb_col_pattern#1#2{\??naturaltablecol\m_tabl_tbl_level:\number#1:\number#2} - -\def\tabl_ntb_tag_doif #1#2{\ifcsname\??naturaltabletag\m_tabl_tbl_level:\number#1:\number#2\endcsname\expandafter\firstofoneargument \else\expandafter\gobbleoneargument \fi} -\def\tabl_ntb_tag_doifnot #1#2{\ifcsname\??naturaltabletag\m_tabl_tbl_level:\number#1:\number#2\endcsname\expandafter\gobbleoneargument \else\expandafter\firstofoneargument \fi} -\def\tabl_ntb_tag_doifelse#1#2{\ifcsname\??naturaltabletag\m_tabl_tbl_level:\number#1:\number#2\endcsname\expandafter\firstoftwoarguments\else\expandafter\secondoftwoarguments\fi} -\def\tabl_ntb_row_doif #1#2{\ifcsname\??naturaltablerow\m_tabl_tbl_level:\number#1:\number#2\endcsname\expandafter\firstofoneargument \else\expandafter\gobbleoneargument \fi} -\def\tabl_ntb_col_doif #1#2{\ifcsname\??naturaltablecol\m_tabl_tbl_level:\number#1:\number#2\endcsname\expandafter\firstofoneargument \else\expandafter\gobbleoneargument \fi} -\def\tabl_ntb_col_doifnot #1#2{\ifcsname\??naturaltablecol\m_tabl_tbl_level:\number#1:\number#2\endcsname\expandafter\gobbleoneargument \else\expandafter\firstofoneargument \fi} - -% not used -% -% \def\tabl_ntb_tag_state#1#2{\ifcsname\??naturaltabletag\m_tabl_tbl_level:\number#1:\number#2\endcsname\zerocount\else\plusone\fi} -% \def\tabl_ntb_row_state#1#2{\ifcsname\??naturaltablerow\m_tabl_tbl_level:\number#1:\number#2\endcsname\zerocount\else\plusone\fi} -% \def\tabl_ntb_col_state#1#2{\ifcsname\??naturaltablecol\m_tabl_tbl_level:\number#1:\number#2\endcsname\zerocount\else\plusone\fi} +\def\doiftbltag #1#2{\ifcsname\@@tblprefix\number#1:\number#2:s\endcsname\@EA\firstofoneargument \else\@EA\gobbleoneargument \fi} +\def\doifnottbltag #1#2{\ifcsname\@@tblprefix\number#1:\number#2:s\endcsname\@EA\gobbleoneargument \else\@EA\firstofoneargument \fi} +\def\doifelsetbltag#1#2{\ifcsname\@@tblprefix\number#1:\number#2:s\endcsname\@EA\firstoftwoarguments\else\@EA\secondoftwoarguments\fi} +\def\doiftblrow #1#2{\ifcsname\@@tblprefix\number#1:\number#2:r\endcsname\@EA\firstofoneargument \else\@EA\gobbleoneargument \fi} +\def\doiftblcol #1#2{\ifcsname\@@tblprefix\number#1:\number#2:c\endcsname\@EA\firstofoneargument \else\@EA\gobbleoneargument \fi} +\def\doifnottblcol #1#2{\ifcsname\@@tblprefix\number#1:\number#2:c\endcsname\@EA\gobbleoneargument \else\@EA\firstofoneargument \fi} -\def\tabl_ntb_set_spn #1{\expandafter\let\csname\??naturaltablespn\m_tabl_tbl_level:\number#1\endcsname \!!plusone} -\def\tabl_ntb_spn_doifelse#1{\doifelse {\csname\??naturaltablespn\m_tabl_tbl_level:\number#1\endcsname}\!!plusone} +\def\tbltagstate#1#2{\ifcsname\@@tblprefix\number#1:\number#2:s\endcsname\zerocount\else\plusone\fi} +\def\tblrowstate#1#2{\ifcsname\@@tblprefix\number#1:\number#2:r\endcsname\zerocount\else\plusone\fi} +\def\tblcolstate#1#2{\ifcsname\@@tblprefix\number#1:\number#2:c\endcsname\zerocount\else\plusone\fi} -\def\tabl_ntb_set_spn #1{\setvalue {\??naturaltablespn\m_tabl_tbl_level:\number#1}{1}} -\def\tabl_ntb_spn_doifelse#1{\doifelsevalue{\??naturaltablespn\m_tabl_tbl_level:\number#1}{1}} +\def\settblspn #1{\expandafter\let\csname\@@tblprefix\number#1:s\endcsname \!!plusone} +\def\doifelsetblspn#1{\doifelse {\csname\@@tblprefix\number#1:s\endcsname}\!!plusone} +% \def\doifelsetblspn#1{\@EA\ifx\csname\@@tblprefix\number#1:s\endcsname\plusone\@EA\firstoftwoarguments\else\@EA\secondoftwoarguments\fi} -\def\tabl_ntb_let_ref#1#2{\expandafter\glet\csname\??naturaltableref\m_tabl_tbl_level:\number#1:\number#2\endcsname} -\def\tabl_ntb_set_ref#1#2{\expandafter\xdef\csname\??naturaltableref\m_tabl_tbl_level:\number#1:\number#2\endcsname} -\def\tabl_ntb_get_ref#1#2{\ifcsname\??naturaltableref\m_tabl_tbl_level:\number#1:\number#2\endcsname\csname\??naturaltableref\m_tabl_tbl_level:\number#1:\number#2\endcsname\fi} +\def\settblspn #1{\setvalue {\@@tblprefix\number#1:s}{1}} +\def\doifelsetblspn#1{\doifelsevalue{\@@tblprefix\number#1:s}{1}} -% keep for a while: -% -% \unexpanded\def\tabl_ntb_set_txt_process#1#2#3#4#5#6% nasty: we restore the level -% {\expandafter\def\csname\??naturaltabletxt\m_tabl_tbl_level:\number#1:\number#2\expandafter\endcsname\expandafter -% {\expandafter\def\expandafter\m_tabl_tbl_level\expandafter{\m_tabl_tbl_level}\tabl_ntb_cell_process{#3}{#4}[#5]{#6}}} +\long\def\settbltxt#1#2#3% + {\long\@EA\def\csname\@@tblprefix\number#1:\number#2:t\@EA\endcsname\@EA{\@EA\def\@EA\TBLlevel\@EA{\TBLlevel}#3}} -\unexpanded\def\tabl_ntb_set_txt_process#1#2#3#4#5#6% - {\expandafter\def\csname\??naturaltabletxt\m_tabl_tbl_level:\number#1:\number#2\endcsname - {\tabl_ntb_cell_process{#3}{#4}[#5]{\tabl_tnb_next_level#6\tabl_tnb_prev_level}}} +\def\gettbltxt#1#2% + {\csname\@@tblprefix\number#1:\number#2:t\endcsname} -\def\tabl_ntb_get_txt#1#2% - {\csname\??naturaltabletxt\m_tabl_tbl_level:\number#1:\number#2\endcsname} +\newtoks\tbltoks +\newtoks\tblrowtoks -% to be changed: +\let\pushTBLparameters\relax +\let\popTBLparameters \relax -\newif\ifsqueezeTBLspan \squeezeTBLspantrue % spans one column cell over multi column par cells +\newif\ifsqueezeTBLspan \squeezeTBLspantrue % spans one column cell over multi column par cells \newif\ifautosqueezeTBLspan \autosqueezeTBLspantrue % unless explicit widths are given \newif\ifautoTBLspread \autoTBLspreadfalse \newif\ifautoTBLhsize \autoTBLhsizetrue @@ -303,90 +249,78 @@ \newif\iftraceTABLE \traceTABLEfalse -% so far +\def\noftblheadlines{0} +\def\noftblnextlines{0} +\def\noftblhdnxlines{0} -\unexpanded\def\tabl_ntb_cell_process#1#2[#3]{} +\long\def\handleTBLcell#1#2[#3]{} -\unexpanded\def\bTC#1\eTC{\bTD#1\eTD} \let\eTC\relax -\unexpanded\def\bTX#1\eTX{\bTD#1\eTD} \let\eTX\relax -\unexpanded\def\bTY#1\eTY{\bTR#1\eTR} \let\eTY\relax +\long\def\bTC#1\eTC{\bTD#1\eTD} +\long\def\bTX#1\eTX{\bTD#1\eTD} +\long\def\bTY#1\eTY{\bTR#1\eTR} -\unexpanded\def\setupTABLE - {\dotripleempty\tabl_ntb_setup} +\let\getTABLEparameters\getparameters -\let\tabl_ntb_parameters_get\setupcurrentnaturaltablelocal +\unexpanded\def\setupTABLE + {\dotripleempty\dosetupTABLE} -\def\tabl_ntb_setup +\def\dosetupTABLE[#1][#2][#3]% {\ifthirdargument - \expandafter\tabl_ntb_setup_three + \processaction + [#1] + [ \v!row=>{\dosetupTABLExy[\c!y][#2][#3]},% + \v!column=>{\dosetupTABLExy[\c!x][#2][#3]},% + r=>{\dosetupTABLExy[\c!y][#2][#3]},% + c=>{\dosetupTABLExy[\c!x][#2][#3]},% + y=>{\dosetupTABLExy[\c!y][#2][#3]},% + x=>{\dosetupTABLExy[\c!x][#2][#3]},% + \v!start=>{\dosetupTABLExy[#1][#2][#3]},% + \v!header=>{\dosetupTABLExy[#1][#2][#3]},% + \s!unknown=>{\dosetupTABLEzz[#1][#2][#3]}]% \else\ifsecondargument - \doubleexpandafter\tabl_ntb_setup_two + \processaction + [#1] + [ \v!row=>{\dosetupTABLExy[\c!y][\v!each][#2]},% + \v!column=>{\dosetupTABLExy[\c!x][\v!each][#2]},% + r=>{\dosetupTABLExy[\c!y][\v!each][#2]},% + c=>{\dosetupTABLExy[\c!x][\v!each][#2]},% + y=>{\dosetupTABLExy[\c!y][\v!each][#2]},% + x=>{\dosetupTABLExy[\c!x][\v!each][#2]},% + \v!start=>{\dosetupTABLExy[#1][\v!each][#2]},% + \v!header=>{\dosetupTABLExy[#1][\v!each][#2]},% + \s!unknown=>{\dosetupTABLEzz[\c!x][#1][#2]}]% \else - \doubleexpandafter\tabl_ntb_setup_one + \getparameters[\@@tbl\@@tbl][#1]% \fi\fi} -\def\tabl_ntb_setup_one[#1][#2][#3]% - {\setupcurrentnaturaltablelocal[#1]} - -\def\tabl_ntb_setup_xy[#1][#2][#3]% - {\def\tabl_ntb_setup_step##1{\tabl_ntb_parameters_set[#1##1][#3]}% - \processcommalist[#2]\tabl_ntb_setup_step} - -\def\tabl_ntb_setup_un[#1][#2][#3]% - {\def\tabl_ntb_setup_step##1% - {\def\tabl_ntb_setup_step_step####1{\tabl_ntb_parameters_set[\c!x##1\c!y####1][#3]}% - \processcommalist[#2]\tabl_ntb_setup_step_step}% - \processcommalist[#1]\tabl_ntb_setup_step} - -\def\tabl_ntb_setup_each[#1][#2][#3]% ignores #3 - {\tabl_ntb_parameters_set[#1\v!each][#2]} - -\def\tabl_ntb_setup_ux[#1][#2][#3]% ignores #3 - {\def\tabl_ntb_setup_step##1{\tabl_ntb_parameters_set[\c!x##1][#2]}% - \processcommalist[#1]\tabl_ntb_setup_step} - -\installcorenamespace{naturaltablesetupthree} -\installcorenamespace{naturaltablesetuptwo} - -\def\tabl_ntb_setup_three[#1]{\csname\??naturaltablesetupthree\ifcsname\??naturaltablesetupthree#1\endcsname#1\else\s!unknown\fi\endcsname[#1]} -\def\tabl_ntb_setup_two [#1]{\csname\??naturaltablesetuptwo \ifcsname\??naturaltablesetuptwo #1\endcsname#1\else\s!unknown\fi\endcsname[#1]} - -\setvalue{\??naturaltablesetupthree \v!row}[#1]{\tabl_ntb_setup_xy [\c!y]} -\setvalue{\??naturaltablesetupthree \v!column}[#1]{\tabl_ntb_setup_xy [\c!x]} -\setvalue{\??naturaltablesetupthree \v!start}[#1]{\tabl_ntb_setup_xy [\v!start]} -\setvalue{\??naturaltablesetupthree \v!header}[#1]{\tabl_ntb_setup_xy [\v!header]} - -\setvalue{\??naturaltablesetuptwo \v!row}[#1]{\tabl_ntb_setup_each[\c!y]} -\setvalue{\??naturaltablesetuptwo \v!column}[#1]{\tabl_ntb_setup_each[\c!x]} -\setvalue{\??naturaltablesetuptwo \v!start}[#1]{\tabl_ntb_setup_each[\v!start]} -\setvalue{\??naturaltablesetuptwo \v!header}[#1]{\tabl_ntb_setup_each[\v!header]} - -\letvalue{\??naturaltablesetupthree\s!unknown}\tabl_ntb_setup_un -\letvalue{\??naturaltablesetuptwo \s!unknown}\tabl_ntb_setup_ux - -\letcsnamecsname\csname\??naturaltablesetupthree r\endcsname\csname\??naturaltablesetupthree \v!row\endcsname -\letcsnamecsname\csname\??naturaltablesetupthree c\endcsname\csname\??naturaltablesetupthree\v!column\endcsname -\letcsnamecsname\csname\??naturaltablesetupthree y\endcsname\csname\??naturaltablesetupthree \v!row\endcsname -\letcsnamecsname\csname\??naturaltablesetupthree x\endcsname\csname\??naturaltablesetupthree\v!column\endcsname - -\letcsnamecsname\csname\??naturaltablesetuptwo r\endcsname\csname\??naturaltablesetuptwo \v!row\endcsname -\letcsnamecsname\csname\??naturaltablesetuptwo c\endcsname\csname\??naturaltablesetuptwo \v!column\endcsname -\letcsnamecsname\csname\??naturaltablesetuptwo y\endcsname\csname\??naturaltablesetuptwo \v!row\endcsname -\letcsnamecsname\csname\??naturaltablesetuptwo x\endcsname\csname\??naturaltablesetuptwo \v!column\endcsname - -\def\tabl_ntb_parameters_set[#1][#2]% - {\ifappendTBLsetups - \ifcsname\??naturaltableset\m_tabl_tbl_level:#1\endcsname - \def\tabl_ntb_parameters_get[##1]% - {\setvalue{\??naturaltableset\m_tabl_tbl_level:#1}{\tabl_ntb_parameters_get[##1,#2]}}% - \getvalue{\??naturaltableset\m_tabl_tbl_level:#1}% - \let\tabl_ntb_parameters_get\setupcurrentnaturaltablelocal - \else - \setvalue{\??naturaltableset\m_tabl_tbl_level:#1}{\tabl_ntb_parameters_get[#2]}% - \fi +\def\dosetupTABLExy[#1][#2][#3]% + {\def\dodosetupTABLE##1{\setTABLEparameters[#1##1][#3]}% + \processcommalist[#2]\dodosetupTABLE} + +\def\dosetupTABLEzz[#1][#2][#3]% + {\def\dodosetupTABLE##1% + {\def\dododosetupTABLE####1{\setTABLEparameters[\c!x##1\c!y####1][#3]}% + \processcommalist[#2]\dododosetupTABLE}% + \processcommalist[#1]\dodosetupTABLE} + +\def\nopTABLEparameters[#1][#2]% + {\letvalueempty{\@@tblprefix#1}} % can be made faster + +\def\setTABLEparameters[#1][#2]% + {\pushTBLparameters + \ifappendTBLsetups + \doifdefinedelse{\@@tblprefix#1} + {\def\getTABLEparameters[##1][##2]% + {\setvalue{\@@tblprefix#1}{\getTABLEparameters[\@@tbl\@@tbl][##2,#2]}}% + \getvalue{\@@tblprefix#1}% + \let\getTABLEparameters\getparameters} + {\setvalue{\@@tblprefix#1}{\getTABLEparameters[\@@tbl\@@tbl][#2]}}% \else - \setvalue{\??naturaltableset\m_tabl_tbl_level:#1}{\tabl_ntb_parameters_get[#2]}% - \fi} + \setvalue{\@@tblprefix#1}{\getTABLEparameters[\@@tbl\@@tbl][#2]}% + \fi + \popTBLparameters} + +\let\setupTBLsection\relax % % \setupTABLE [y] [first][background=color,backgroundcolor=blue,frame=off,bottomframe=on,topframe=on,framecolor=white] % \setupTABLE [first][first][backgroundcorner=2,corner=10,frame=on] @@ -448,91 +382,87 @@ %D %D \start \tightTBLrowspanfalse \getbuffer \stop -\let\tabl_ntb_setup_section\relax - -\unexpanded\def\tabl_ntb_setup_cell#1#2% cell over col over row - {\tabl_ntb_setup_section % already forgotten - \edef\m_tabl_ntb_positive_row{\number#1}% - \edef\m_tabl_ntb_positive_col{\number#2}% - \edef\m_tabl_ntb_negative_row{\the\numexpr-\c_tabl_ntb_maximum_row+#1+\minusone\relax}% - \edef\m_tabl_ntb_negative_col{\the\numexpr-\c_tabl_ntb_maximum_col+#2+\minusone\relax}% - % saves tokens (no speed gain) - \edef\m_tabl_ntb_prefix{\??naturaltableset\m_tabl_tbl_level:}% +\unexpanded\def\setupTBLcell#1#2% cell over col over row + {\setupTBLsection % already forgotten + \edef\positiverow{\number#1}% + \edef\positivecol{\number#2}% + \edef\negativerow{\the\numexpr-\maximumrow+#1+\minusone\relax}% + \edef\negativecol{\the\numexpr-\maximumcol+#2+\minusone\relax}% % each each - \csname\m_tabl_ntb_prefix\c!x\v!each\c!y\v!each\endcsname - \csname\m_tabl_ntb_prefix\c!y\v!each\endcsname - \csname\m_tabl_ntb_prefix\c!x\v!each\endcsname + \csname\@@tblprefix\c!x\v!each\c!y\v!each\endcsname + \csname\@@tblprefix\c!y\v!each\endcsname + \csname\@@tblprefix\c!x\v!each\endcsname % odd even - \csname\m_tabl_ntb_prefix\c!y\v!oddeven\m_tabl_ntb_positive_row\endcsname - \csname\m_tabl_ntb_prefix\c!x\v!oddeven\m_tabl_ntb_positive_col\endcsname - \csname\m_tabl_ntb_prefix\c!x\v!oddeven\m_tabl_ntb_positive_col\c!y\v!oddeven\m_tabl_ntb_positive_row\endcsname + \csname\@@tblprefix\c!y\v!oddeven\positiverow\endcsname + \csname\@@tblprefix\c!x\v!oddeven\positivecol\endcsname + \csname\@@tblprefix\c!x\v!oddeven\positivecol\c!y\v!oddeven\positiverow\endcsname % row/col number combinations - \ifcsname\m_tabl_ntb_prefix\c!y\m_tabl_ntb_positive_row\endcsname\csname\m_tabl_ntb_prefix\c!y\m_tabl_ntb_positive_row\endcsname\fi - \ifcsname\m_tabl_ntb_prefix\c!y\m_tabl_ntb_negative_row\endcsname\csname\m_tabl_ntb_prefix\c!y\m_tabl_ntb_negative_row\endcsname\fi - \naturaltablelocalparameter\c!extras - \letnaturaltablelocalparameter\c!extras\relax % new, see x-fo - \ifcsname\m_tabl_ntb_prefix\c!x\m_tabl_ntb_positive_col\endcsname\csname\m_tabl_ntb_prefix\c!x\m_tabl_ntb_positive_col\endcsname\fi - \ifcsname\m_tabl_ntb_prefix\c!x\m_tabl_ntb_negative_col\endcsname\csname\m_tabl_ntb_prefix\c!x\m_tabl_ntb_negative_col\endcsname\fi - \naturaltablelocalparameter\c!extras - \letnaturaltablelocalparameter\c!extras\relax % new, see x-fo + \ifcsname\@@tblprefix\c!y\positiverow\endcsname\csname\@@tblprefix\c!y\positiverow\endcsname\fi + \ifcsname\@@tblprefix\c!y\negativerow\endcsname\csname\@@tblprefix\c!y\negativerow\endcsname\fi + \csname\@@tbl\@@tbl\c!extras\endcsname + \@EA\let\csname\@@tbl\@@tbl\c!extras\endcsname\relax % new, see x-fo + \ifcsname\@@tblprefix\c!x\positivecol\endcsname\csname\@@tblprefix\c!x\positivecol\endcsname\fi + \ifcsname\@@tblprefix\c!x\negativecol\endcsname\csname\@@tblprefix\c!x\negativecol\endcsname\fi + \csname\@@tbl\@@tbl\c!extras\endcsname + \@EA\let\csname\@@tbl\@@tbl\c!extras\endcsname\relax % new, see x-fo % first/last combinations - \ifnum\m_tabl_ntb_positive_row=\plusone - \csname\m_tabl_ntb_prefix\c!y\v!first\endcsname - \ifcsname\m_tabl_ntb_prefix\c!x\m_tabl_ntb_positive_col\c!y\v!first\endcsname\csname\m_tabl_ntb_prefix\c!x\m_tabl_ntb_positive_col\c!y\v!first\endcsname\fi + \ifnum\positiverow=\plusone + \csname\@@tblprefix\c!y\v!first\endcsname + \ifcsname\@@tblprefix\c!x\positivecol\c!y\v!first\endcsname\csname\@@tblprefix\c!x\positivecol\c!y\v!first\endcsname\fi \fi - \ifnum\m_tabl_ntb_positive_col=\plusone - \csname\m_tabl_ntb_prefix\c!x\v!first\endcsname - \ifcsname\m_tabl_ntb_prefix\c!x\v!first\c!y\m_tabl_ntb_positive_row\endcsname\csname\m_tabl_ntb_prefix\c!x\v!first\c!y\m_tabl_ntb_positive_row\endcsname\fi + \ifnum\positivecol=\plusone + \csname\@@tblprefix\c!x\v!first\endcsname + \ifcsname\@@tblprefix\c!x\v!first\c!y\positiverow\endcsname\csname\@@tblprefix\c!x\v!first\c!y\positiverow\endcsname\fi \fi - \ifnum\m_tabl_ntb_positive_row=\c_tabl_ntb_maximum_row\relax - \csname\m_tabl_ntb_prefix\c!y\v!last\endcsname - \ifcsname\m_tabl_ntb_prefix\c!x\m_tabl_ntb_positive_col\c!y\v!last\endcsname\csname\m_tabl_ntb_prefix\c!x\m_tabl_ntb_positive_col\c!y\v!last\endcsname\fi + \ifnum\positiverow=\maximumrow\relax + \csname\@@tblprefix\c!y\v!last\endcsname + \ifcsname\@@tblprefix\c!x\positivecol\c!y\v!last\endcsname\csname\@@tblprefix\c!x\positivecol\c!y\v!last\endcsname\fi \fi - \ifnum\m_tabl_ntb_positive_col=\c_tabl_ntb_maximum_col\relax - \csname\m_tabl_ntb_prefix\c!x\v!last\endcsname - \ifcsname\m_tabl_ntb_prefix\c!x\v!last\c!y\m_tabl_ntb_positive_row\endcsname\csname\m_tabl_ntb_prefix\c!x\v!last\c!y\m_tabl_ntb_positive_row\endcsname\fi + \ifnum\positivecol=\maximumcol\relax + \csname\@@tblprefix\c!x\v!last\endcsname + \ifcsname\@@tblprefix\c!x\v!last\c!y\positiverow\endcsname\csname\@@tblprefix\c!x\v!last\c!y\positiverow\endcsname\fi \fi - \ifnum\m_tabl_ntb_positive_row=\c_tabl_ntb_maximum_row\relax \ifnum\m_tabl_ntb_positive_col=\c_tabl_ntb_maximum_col\relax - \csname\m_tabl_ntb_prefix\c!x\v!last\c!y\v!last\endcsname + \ifnum\positiverow=\maximumrow\relax \ifnum\positivecol=\maximumcol\relax + \csname\@@tblprefix\c!x\v!last\c!y\v!last\endcsname \fi\fi - \ifnum\m_tabl_ntb_positive_row=\plusone \ifnum\m_tabl_ntb_positive_col=\plusone - \csname\m_tabl_ntb_prefix\c!x\v!first\c!y\v!first\endcsname + \ifnum\positiverow=\plusone \ifnum\positivecol=\plusone + \csname\@@tblprefix\c!x\v!first\c!y\v!first\endcsname \fi\fi - \ifnum\m_tabl_ntb_positive_row=\plusone \ifnum\m_tabl_ntb_positive_col=\c_tabl_ntb_maximum_col\relax - \csname\m_tabl_ntb_prefix\c!x\v!last\c!y\v!first\endcsname + \ifnum\positiverow=\plusone \ifnum\positivecol=\maximumcol\relax + \csname\@@tblprefix\c!x\v!last\c!y\v!first\endcsname \fi\fi - \ifnum\m_tabl_ntb_positive_row=\c_tabl_ntb_maximum_row\relax \ifnum\m_tabl_ntb_positive_col=\plusone - \csname\m_tabl_ntb_prefix\c!x\v!first\c!y\v!last\endcsname + \ifnum\positiverow=\maximumrow\relax \ifnum\positivecol=\plusone + \csname\@@tblprefix\c!x\v!first\c!y\v!last\endcsname \fi\fi % special case: two rows and last row : two&first and two&last (round corners) - \ifnum\c_tabl_ntb_maximum_row=\plustwo\relax - \ifnum\m_tabl_ntb_positive_row=\c_tabl_ntb_maximum_row\relax \ifnum\m_tabl_ntb_positive_col=\plusone - \csname\m_tabl_ntb_prefix\c!x\v!first\c!y\v!two\endcsname + \ifnum\maximumrow=\plustwo\relax + \ifnum\positiverow=\maximumrow\relax \ifnum\positivecol=\plusone + \csname\@@tblprefix\c!x\v!first\c!y\v!two\endcsname \fi\fi - \ifnum\m_tabl_ntb_positive_row=\c_tabl_ntb_maximum_row\relax \ifnum\m_tabl_ntb_positive_col=\c_tabl_ntb_maximum_col\relax - \csname\m_tabl_ntb_prefix\c!x\v!last\c!y\v!two\endcsname + \ifnum\positiverow=\maximumrow\relax \ifnum\positivecol=\maximumcol\relax + \csname\@@tblprefix\c!x\v!last\c!y\v!two\endcsname \fi\fi \fi - \ifnum\tabl_ntb_get_col\m_tabl_ntb_positive_row\m_tabl_ntb_positive_col=\c_tabl_ntb_maximum_col\relax % top span over whole width - \ifnum\m_tabl_ntb_positive_row=\plusone - \csname\m_tabl_ntb_prefix\c!x\v!one\c!y\v!first\endcsname + \ifnum\gettblcol\positiverow\positivecol=\maximumcol\relax % top span over whole width + \ifnum\positiverow=\plusone + \csname\@@tblprefix\c!x\v!one\c!y\v!first\endcsname \fi - \ifnum\m_tabl_ntb_positive_row=\c_tabl_ntb_maximum_row\relax - \csname\m_tabl_ntb_prefix\c!x\v!one\c!y\v!last\endcsname + \ifnum\positiverow=\maximumrow\relax + \csname\@@tblprefix\c!x\v!one\c!y\v!last\endcsname \fi \fi % header things - \ifnum#1>\c_tabl_ntb_n_of_hdnx_lines\else - \ifcsname\m_tabl_ntb_prefix\v!header\v!each \endcsname\csname\m_tabl_ntb_prefix\v!header\v!each \endcsname\fi - \ifcsname\m_tabl_ntb_prefix\v!header\m_tabl_ntb_positive_col\endcsname\csname\m_tabl_ntb_prefix\v!header\m_tabl_ntb_positive_col\endcsname\fi + \ifnum#1>\noftblhdnxlines\else + \ifcsname\@@tblprefix\v!header\v!each \endcsname\csname\@@tblprefix\v!header\v!each \endcsname\fi + \ifcsname\@@tblprefix\v!header\positivecol\endcsname\csname\@@tblprefix\v!header\positivecol\endcsname\fi \fi % explicit cells - \ifcsname\m_tabl_ntb_prefix\c!x\m_tabl_ntb_positive_col\c!y\m_tabl_ntb_positive_row\endcsname\csname\m_tabl_ntb_prefix\c!x\m_tabl_ntb_positive_col\c!y\m_tabl_ntb_positive_row\endcsname\fi - \ifcsname\m_tabl_ntb_prefix\c!x\m_tabl_ntb_negative_col\c!y\m_tabl_ntb_negative_row\endcsname\csname\m_tabl_ntb_prefix\c!x\m_tabl_ntb_negative_col\c!y\m_tabl_ntb_negative_row\endcsname\fi + \ifcsname\@@tblprefix\c!x\positivecol\c!y\positiverow\endcsname\csname\@@tblprefix\c!x\positivecol\c!y\positiverow\endcsname\fi + \ifcsname\@@tblprefix\c!x\negativecol\c!y\negativerow\endcsname\csname\@@tblprefix\c!x\negativecol\c!y\negativerow\endcsname\fi % local - \ifcsname\m_tabl_ntb_prefix\c!y++\m_tabl_ntb_positive_row\endcsname\csname\m_tabl_ntb_prefix\c!y++\m_tabl_ntb_positive_row\endcsname\fi + \ifcsname\@@tblprefix\c!y++\positiverow\endcsname\csname\@@tblprefix\c!y++\positiverow\endcsname\fi % done - \xdef\m_tabl_ntb_after_split{\naturaltablelocalparameter\c!after}% to be checked + \global\letcscsname\@@tblsplitafter\csname\@@tbl\@@tbl\c!after\endcsname \relax} % we cannot use +n (checking on number/last/first would slow down too much) @@ -548,7 +478,7 @@ % \dorecurse{10}{\bTR \dorecurse{6}{\bTD xxx \eTD} \eTR} % \eTABLE -\let\m_tabl_ntb_after_split\relax +\globallet\@@tblsplitafter\relax % split + page: % @@ -558,152 +488,101 @@ % \bTR \bTD left \eTD\bTD right \eTD\eTR % \eTABLE -\unexpanded\def\tabl_ntb_tr - {\c_tabl_ntb_running_col\zerocount - \advance\c_tabl_ntb_maximum_row\plusone - \iffirstargument - \expandafter\tabl_ntb_tr_yes - \else - \expandafter\gobbleoneoptional - \fi} +% todo: protect counters -\def\tabl_ntb_tr_yes[#1]% - {\setvalue{\??naturaltableset\m_tabl_tbl_level:\c!y++\the\c_tabl_ntb_maximum_row}{\setupcurrentnaturaltablelocal[#1]}} +\newcount\row \newcount\col +\newcount\xrow \newcount\xcol +\newcount\xxrow \newcount\xxcol +\newcount\maximumrow \newcount\maximumcol \newcount\maximumrowspan + \newcount\currentcol +\newcount\tblspn -\def\m_tabl_ntb_default_nr{\naturaltableparameter\c!nr} -\def\m_tabl_ntb_default_nc{\naturaltableparameter\c!nc} +\def\settblref#1#2{\expandafter\xdef\csname\@@tblprefix\number#1:\number#2:x\endcsname} +\def\gettblref#1#2{\ifcsname\@@tblprefix\number#1:\number#2:x\endcsname\csname\@@tblprefix\number#1:\number#2:x\endcsname\fi} -\unexpanded\def\tabl_ntb_td - {\iffirstargument - \expandafter\tabl_ntb_td_yes - \else - \expandafter\tabl_ntb_td_nop +\def\parseTR[#1]% + {\currentcol\zerocount + \advance\maximumrow\plusone + \iffirstargument + \setvalue{\@@tblprefix\c!y++\number\maximumrow}{\getparameters[\@@tbl\@@tbl][#1]}% maybe also in mkii \fi} -\def\tabl_ntb_td_yes[#1]#2\eTD - {\letnaturaltableparameter\c!ny \m_tabl_ntb_default_nr - \letnaturaltableparameter\c!nx \m_tabl_ntb_default_nc - \letnaturaltableparameter\c!nc \plusone - \letnaturaltableparameter\c!nr \plusone - \letnaturaltableparameter\c!n \c_tabl_ntb_running_col - \letnaturaltableparameter\c!m \empty - \letnaturaltableparameter\c!action\empty % not that important - \setupcurrentnaturaltable[#1]% - % - \c_tabl_ntb_nx\naturaltableparameter\c!nx\relax - \c_tabl_ntb_ny\naturaltableparameter\c!ny\relax - % goto first cell n/m=cellnumber - \edef\m_tabl_ntb_n{\naturaltableparameter\c!n}% - \edef\m_tabl_ntb_m{\naturaltableparameter\c!m}% - % - \ifx\m_tabl_ntb_n\empty - \global\advance\c_tabl_ntb_spn\c_tabl_ntb_nx\relax - \else\ifnum\m_tabl_ntb_n=\c_tabl_ntb_running_col\else - \tabl_ntb_td_pass_n{#1}% +\long\def\parseTD[#1]#2\eTD + {\def\tblny{\tblnr}% + \def\tblnx{\tblnc}% + \let\tblnc\plusone + \let\tblnr\plusone + \let\tbln\currentcol + \let\tblm\empty + \iffirstargument + \getparameters[\@@tbl][#1]% + \fi + % goto first cell % NEW, n/m=cellnumber + \edef\@@tblnindeed{\csname\@@tbl\c!n\endcsname}% + \ifx\@@tblnindeed\empty + \global\advance\tblspn\tblnx\relax + \else\ifnum\@@tblnindeed=\currentcol\else + \scratchcounter\numexpr\@@tblnindeed-\currentcol+\minusone-\tblspn\relax + \ifnum\scratchcounter>\zerocount + \normalexpanded{\noexpand\parseTD[\c!nx=\the\scratchcounter,\c!n=,\c!m=,*sq=\v!no]}\eTD + \fi + % can also be made faster + \getparameters[\@@tbl][\c!ny=\tblnr,\c!nx=\tblnc,nc=1,nr=1,#1,\c!n=,\c!m=]% \fi\fi - \ifx\m_tabl_ntb_m\empty \else - \ifnum\m_tabl_ntb_m=\c_tabl_ntb_running_col\else - \tabl_ntb_td_pass_m{#1}% + \edef\@@tblmindeed{\csname\@@tbl\c!m\endcsname}% + \ifx\@@tblmindeed\empty \else + \ifnum\@@tblmindeed=\currentcol \else + \scratchcounter\numexpr\@@tblmindeed-\currentcol+\minusone-\tblspn\relax + \dorecurse\scratchcounter{\normalexpanded{\noexpand\parseTD[\c!n=,\c!m=]}\eTD}% + % can be sped up + \getparameters[\@@tbl][\c!ny=\tblnr,\c!nx=\tblnc,nc=1,nr=1,#1,\c!n=,\c!m=]% kind of double, see prev \fi \fi \doloop % skip over columns that result from earlier span - {\advance\c_tabl_ntb_running_col\plusone - \ifcsname\tabl_ntb_tag_pattern\c_tabl_ntb_maximum_row\c_tabl_ntb_running_col\endcsname \else - \exitloop - \fi}% + {\advance\currentcol\plusone + \doifnottbltag\maximumrow\currentcol\exitloop}% + % == \def\next{\advance\currentcol\plusone\doiftbltag\maximumrow\currentcol\next}\next % fill r*c cells and set span - \c_tabl_ntb_nx\naturaltableparameter\c!nx\relax - \c_tabl_ntb_ny\naturaltableparameter\c!ny\relax - \ifnum\c_tabl_ntb_nx=\plusone - \ifnum\c_tabl_ntb_ny=\plusone - \ifnum\c_tabl_ntb_running_col>\c_tabl_ntb_maximum_col\relax - \c_tabl_ntb_maximum_col\c_tabl_ntb_running_col + \ifnum\tblnx=\plusone + \ifnum\tblny=\plusone + \ifnum\currentcol>\maximumcol\relax + \maximumcol\currentcol \fi \else - \tabl_ntb_cell_preset + \presetTBLcell \fi \else - \tabl_ntb_cell_preset + \presetTBLcell \fi % set values - \tabl_ntb_let_tag\c_tabl_ntb_maximum_row\c_tabl_ntb_running_col\c_tabl_ntb_cell - \tabl_ntb_set_col\c_tabl_ntb_maximum_row\c_tabl_ntb_running_col{\the\c_tabl_ntb_nx}% - \tabl_ntb_set_row\c_tabl_ntb_maximum_row\c_tabl_ntb_running_col{\the\c_tabl_ntb_ny}% + \lettbltag\maximumrow\currentcol\tblcell + \settblcol\maximumrow\currentcol{\number\tblnx}% + \settblrow\maximumrow\currentcol{\number\tblny}% % the action key will change! - \tabl_ntb_set_ref\c_tabl_ntb_maximum_row\c_tabl_ntb_running_col{\naturaltableparameter\c!action}% + \settblref\maximumrow\currentcol{\ifcsname\@@tbl\c!action\endcsname\csname\@@tbl\c!action\endcsname\fi}% % save text - \normalexpanded - {\tabl_ntb_set_txt_process\c_tabl_ntb_maximum_row\c_tabl_ntb_running_col{\the\c_tabl_ntb_maximum_row}{\the\c_tabl_ntb_running_col}}% - {#1}{#2}} - -\def\tabl_ntb_td_nop[#1]#2\eTD - {\global\advance\c_tabl_ntb_spn\plusone\relax - \doloop - {\advance\c_tabl_ntb_running_col\plusone - \ifcsname\tabl_ntb_tag_pattern\c_tabl_ntb_maximum_row\c_tabl_ntb_running_col\endcsname \else - \exitloop - \fi}% - \c_tabl_ntb_nx\plusone - \c_tabl_ntb_ny\plusone - \ifnum\c_tabl_ntb_running_col>\c_tabl_ntb_maximum_col\relax - \c_tabl_ntb_maximum_col\c_tabl_ntb_running_col - \fi - \tabl_ntb_let_tag\c_tabl_ntb_maximum_row\c_tabl_ntb_running_col\c_tabl_ntb_cell - \tabl_ntb_set_col\c_tabl_ntb_maximum_row\c_tabl_ntb_running_col{\the\c_tabl_ntb_nx}% - \tabl_ntb_set_row\c_tabl_ntb_maximum_row\c_tabl_ntb_running_col{\the\c_tabl_ntb_ny}% - \tabl_ntb_let_ref\c_tabl_ntb_maximum_row\c_tabl_ntb_running_col\empty - \normalexpanded - {\tabl_ntb_set_txt_process\c_tabl_ntb_maximum_row\c_tabl_ntb_running_col{\the\c_tabl_ntb_maximum_row}{\the\c_tabl_ntb_running_col}}% - {#1}{#2}} - -\def\tabl_ntb_td_pass_n#1% - {\scratchcounter\numexpr\m_tabl_ntb_n-\c_tabl_ntb_running_col+\minusone-\c_tabl_ntb_spn\relax - \ifnum\scratchcounter>\zerocount - \normalexpanded{\tabl_ntb_td[\c!nx=\the\scratchcounter,\c!n=,\c!m=,*sq=\v!no]}\eTD - \fi - \letnaturaltableparameter\c!ny\m_tabl_ntb_default_nr - \letnaturaltableparameter\c!nx\m_tabl_ntb_default_nc - \letnaturaltableparameter\c!nc\plusone - \letnaturaltableparameter\c!nr\plusone - \setupcurrentnaturaltable[#1]% - \letnaturaltableparameter\c!n \empty - \letnaturaltableparameter\c!m \empty} - -\def\tabl_ntb_td_pass_m#1% - {\scratchcounter\numexpr\m_tabl_ntb_m-\c_tabl_ntb_running_col+\minusone-\c_tabl_ntb_spn\relax - \dorecurse\scratchcounter{\normalexpanded{\tabl_ntb_td[\c!n=,\c!m=]}\eTD}% - % can be sped up - \letnaturaltableparameter\c!ny\m_tabl_ntb_default_nr - \letnaturaltableparameter\c!nx\m_tabl_ntb_default_nc - \letnaturaltableparameter\c!nc\plusone - \letnaturaltableparameter\c!nr\plusone - \setupcurrentnaturaltable[#1]% - \letnaturaltableparameter\c!n \empty - \letnaturaltableparameter\c!m \empty} - -\def\tabl_ntb_cell_preset - {\c_tabl_ntb_current_row\c_tabl_ntb_maximum_row - \c_tabl_ntb_current_col\c_tabl_ntb_running_col - \dorecurse\c_tabl_ntb_ny\tabl_ntb_cell_preset_rows + \edef\celltag{{\number\maximumrow}{\number\currentcol}}% + \@EA\settbltxt\@EA\maximumrow\@EA\currentcol\@EA{\@EA\handleTBLcell\celltag[#1]{#2}}} + +\def\presetTBLcell + {\row\maximumrow + \col\currentcol + \dorecurse\tblny + {\col\currentcol + \settblcol\row\col{\number\tblnx}% + \ifnum\tblnx>\maximumrowspan\relax + \maximumrowspan\tblnx + \fi + \dorecurse\tblnx + {\lettbltag\row\col\tblnone + \advance\col\plusone}% + \advance\row\plusone}% % check max column - \advance\c_tabl_ntb_current_col\minusone - \ifnum\c_tabl_ntb_current_col>\c_tabl_ntb_maximum_col\relax - \c_tabl_ntb_maximum_col\c_tabl_ntb_current_col + \advance\col\minusone + \ifnum\col>\maximumcol\relax + \maximumcol\col \fi} -\def\tabl_ntb_cell_preset_rows - {\c_tabl_ntb_current_col\c_tabl_ntb_running_col - \tabl_ntb_set_col\c_tabl_ntb_current_row\c_tabl_ntb_current_col{\the\c_tabl_ntb_nx}% - \ifnum\c_tabl_ntb_nx>\c_tabl_ntb_maximum_row_span\relax - \c_tabl_ntb_maximum_row_span\c_tabl_ntb_nx - \fi - \dorecurse\c_tabl_ntb_nx\tabl_ntb_cell_preset_cells - \advance\c_tabl_ntb_current_row\plusone} - -\def\tabl_ntb_cell_preset_cells - {\tabl_ntb_let_tag\c_tabl_ntb_current_row\c_tabl_ntb_current_col\c_tabl_ntb_none - \advance\c_tabl_ntb_current_col\plusone} - %D The usage of n and m: %D %D \startbuffer @@ -738,13 +617,13 @@ %D \stopbuffer %D %D \typebuffer \getbuffer + +\long\def\parseTH[#1]#2\eTH + {\parseTD[#1,\c!color=\tbltblheadcolor,\c!style=\tbltblheadstyle,\c!aligncharacter=\v!no]#2\eTD} -\def\tabl_ntb_th[#1]#2\eTH - {\tabl_ntb_td[#1,\c!color=\naturaltablelocalparameter\c!headcolor,\c!style=\naturaltablelocalparameter\c!headstyle,\c!aligncharacter=\v!no]#2\eTD} - -\def\tabl_ntb_tn[#1]#2\eTN - {\tabl_ntb_td[#1]\digits#2\relax\eTD} - +\long\def\parseTN[#1]#2\eTN + {\parseTD[#1]\digits#2\relax\eTD} + %D Vit Zyka needed the option to create a distance between columns, so I %D added support for individual column distances. %D @@ -789,94 +668,86 @@ %D \stopbuffer %D %D \typebuffer \startlinecorrection \getbuffer \stoplinecorrection + +\newtoks\TBLhead +\newtoks\TBLnext +\newtoks\TBLbody +\newtoks\TBLfoot % to be done: head <raw> foot, dus state var -\unexpanded\def\bTABLEhead{\dosingleempty\tabl_ntb_head} \let\eTABLEhead\relax -\unexpanded\def\bTABLEnext{\dosingleempty\tabl_ntb_next} \let\eTABLEnext\relax -\unexpanded\def\bTABLEbody{\dosingleempty\tabl_ntb_body} \let\eTABLEbody\relax -\unexpanded\def\bTABLEfoot{\dosingleempty\tabl_ntb_foot} \let\eTABLEfoot\relax +\unexpanded\def\bTABLEhead{\dosingleempty\doTABLEhead} \let\eTABLEhead\relax +\unexpanded\def\bTABLEnext{\dosingleempty\doTABLEnext} \let\eTABLEnext\relax +\unexpanded\def\bTABLEbody{\dosingleempty\doTABLEbody} \let\eTABLEbody\relax +\unexpanded\def\bTABLEfoot{\dosingleempty\doTABLEfoot} \let\eTABLEfoot\relax -\def\tabl_ntb_head[#1]#2\eTABLEhead{\appendtoks\tabl_ntb_section[#1]{#2}\to\t_tabl_ntb_head} -\def\tabl_ntb_next[#1]#2\eTABLEnext{\appendtoks\tabl_ntb_section[#1]{#2}\to\t_tabl_ntb_next} -\def\tabl_ntb_body[#1]#2\eTABLEbody{\appendtoks\tabl_ntb_section[#1]{#2}\to\t_tabl_ntb_body} -\def\tabl_ntb_foot[#1]#2\eTABLEfoot{\appendtoks\tabl_ntb_section[#1]{#2}\to\t_tabl_ntb_foot} +\long\def\doTABLEhead[#1]#2\eTABLEhead{\appendtoks\doTABLEsection[#1]{#2}\to\TBLhead} +\long\def\doTABLEnext[#1]#2\eTABLEnext{\appendtoks\doTABLEsection[#1]{#2}\to\TBLnext} +\long\def\doTABLEbody[#1]#2\eTABLEbody{\appendtoks\doTABLEsection[#1]{#2}\to\TBLbody} +\long\def\doTABLEfoot[#1]#2\eTABLEfoot{\appendtoks\doTABLEsection[#1]{#2}\to\TBLfoot} -\def\tabl_ntb_section[#1]#2% also used in tabl-nte - {\unexpanded\def\tabl_ntb_setup_section{\setupcurrentnaturaltablelocal[#1]}% +\long\def\doTABLEsection[#1]#2% + {\unexpanded\def\setupTBLsection{\getparameters[\@@tbl\@@tbl][#1]}% #2% - \let\tabl_ntb_setup_section\relax} + \let\setupTBLsection\relax} -\def\tabl_ntb_preset_parameters% each odd|even level / can be sped up but only once per table - {\ifcsname\??naturaltableset\m_tabl_tbl_level:\v!start\v!each\endcsname - \csname\??naturaltableset\m_tabl_tbl_level:\v!start\v!each\endcsname - \fi - \ifcsname\??naturaltableset\m_tabl_tbl_level:\v!start\v!oddeven\m_tabl_tbl_level\endcsname % hm - \csname\??naturaltableset\m_tabl_tbl_level:\v!start\v!oddeven\m_tabl_tbl_level\endcsname - \fi - \ifcsname\??naturaltableset\m_tabl_tbl_level:\v!start\m_tabl_tbl_level\endcsname % hm - \csname\??naturaltableset\m_tabl_tbl_level:\v!start\m_tabl_tbl_level\endcsname - \fi} +\let\pushTBL\relax +\let\popTBL \relax + +\newconstant\tblpass + +\def\presetallTABLEparameters% each odd|even level / can be sped up but only once per table + {\executeifdefined{\@@rawtblprefix\v!start\v!each}\relax + \executeifdefined{\@@rawtblprefix\v!start\v!oddeven\TBLlevel}\relax + \executeifdefined{\@@rawtblprefix\v!start\number\TBLlevel}\relax} \unexpanded\def\bTABLE - {\dosingleempty\tabl_ntb_table} + {\dosingleempty\dobTABLE} -\def\tabl_ntb_table[#1]% - {\tabl_ntb_table_push +\def\dobTABLE[#1]% + {\pushTBL % box not here \bgroup - \t_tabl_ntb_head\emptytoks - \t_tabl_ntb_next\emptytoks - \t_tabl_ntb_body\emptytoks - \t_tabl_ntb_foot\emptytoks + \TBLhead\emptytoks + \TBLnext\emptytoks + \TBLbody\emptytoks + \TBLfoot\emptytoks \ifhmode\kern\zeropoint\fi % blocks \removeunwantedspaces: check this on icare handelingsschema \resetcharacteralign % new - \setupcurrentnaturaltablelocal[\c!align={\v!right,\v!broad,\v!high},#1]% - \doifsomething{\naturaltablelocalparameter\c!setups}\doprocesslocalsetups{\naturaltablelocalparameter\c!setups}% - \doifelse{\naturaltablelocalparameter\c!textwidth}\v!local - {\hsize\availablehsize} - {\hsize\naturaltablelocalparameter\c!textwidth}% + \getparameters + [\@@tbl\@@tbl] + [\c!align={\v!right,\v!broad,\v!high},#1]% + \ifx\tbltblsetups\empty\else + \doprocesslocalsetups\tbltblsetups + \fi + \hsize\tbltbltextwidth \processaction - [\naturaltablelocalparameter\c!split] + [\tbltblsplit] [ \v!yes=>\enableTBLbreaktrue, \v!repeat=>\enableTBLbreaktrue\multipleTBLheadstrue, \v!auto=>\ifinsidesplitfloat\enableTBLbreaktrue\fi] \processaction - [\naturaltablelocalparameter\c!header] + [\tbltblheader] [\v!repeat=>\multipleTBLheadstrue]% - \tabl_ntb_preset_parameters + \presetallTABLEparameters \processallactionsinset - [\naturaltablelocalparameter\c!option] + [\tbltbloption] [\v!stretch=>\autoTBLspreadtrue]% - \linewidth\naturaltablelocalparameter\c!rulethickness % needs to be frozen + \linewidth\tbltblrulethickness % needs to be frozen \dontcomplain - \c_tabl_ntb_running_col \zerocount - \c_tabl_ntb_maximum_col \zerocount - \c_tabl_ntb_maximum_row \zerocount - \c_tabl_ntb_maximum_row_span\plusone - \let\currentTABLErow \tabl_ntb_current_row - \let\currentTABLEcolumn\tabl_ntb_current_column - \let\nofTABLErows \tabl_ntb_n_of_rows - \let\nofTABLEcolumns \tabl_ntb_n_of_columns + \currentcol\zerocount + \maximumrowspan\plusone + \maximumcol\zerocount + \maximumrow\zerocount \let\bTR\dobTR \let\bTD\dobTD \let\bTH\dobTH \let\bTN\dobTN} -\def\tabl_ntb_current_row {\m_tabl_ntb_positive_row} -\def\tabl_ntb_current_column{\m_tabl_ntb_positive_col} -\def\tabl_ntb_n_of_rows {\number\c_tabl_ntb_maximum_row} -\def\tabl_ntb_n_of_columns {\number\c_tabl_ntb_maximum_col} - -\let\currentTABLErow \!!zerocount -\let\currentTABLEcolumn\!!zerocount -\let\nofTABLErows \!!zerocount -\let\nofTABLEcolumns \!!zerocount - -\unexpanded\def\dobTR{\dosingleempty\tabl_ntb_tr} % also used in tabl-nte -\unexpanded\def\dobTD{\dosingleempty\tabl_ntb_td} % also used in tabl-nte -\unexpanded\def\dobTH{\dosingleempty\tabl_ntb_th} % also used in tabl-nte -\unexpanded\def\dobTN{\dosingleempty\tabl_ntb_tn} % also used in tabl-nte +\unexpanded\def\dobTR{\dosingleempty\parseTR} +\unexpanded\def\dobTD{\dosingleempty\parseTD} +\unexpanded\def\dobTH{\dosingleempty\parseTH} +\unexpanded\def\dobTN{\dosingleempty\parseTN} % permits \expanded{\bTD ... \eTD} @@ -887,348 +758,302 @@ \unexpanded\def\eTABLE % beware, we need to get rid of spurious spaces when in hmode {% tricky and dirty order -) - \doifsometokselse\t_tabl_ntb_head % slow, better a flag - {\the\t_tabl_ntb_head - \c_tabl_ntb_n_of_head_lines\c_tabl_ntb_maximum_row\relax - \doifsometokselse\t_tabl_ntb_next - {\the\t_tabl_ntb_next - \c_tabl_ntb_n_of_next_lines\numexpr\c_tabl_ntb_maximum_row-\c_tabl_ntb_n_of_head_lines\relax}% - {\c_tabl_ntb_n_of_next_lines\zerocount}% was 1 - \c_tabl_ntb_n_of_hdnx_lines\c_tabl_ntb_maximum_row} - {\c_tabl_ntb_n_of_head_lines\zerocount % was 1 - \c_tabl_ntb_n_of_next_lines\zerocount - \c_tabl_ntb_n_of_hdnx_lines\zerocount}% - \the\t_tabl_ntb_body - \the\t_tabl_ntb_foot + \doifsometokselse\TBLhead % slow, better a flag + {\the\TBLhead + \edef\noftblheadlines{\number\maximumrow}% + \doifsometokselse\TBLnext + {\the\TBLnext + \edef\noftblnextlines{\number\numexpr\maximumrow-\noftblheadlines\relax}}% + {\let\noftblnextlines\zerocount}% was 1 + \edef\noftblhdnxlines{\number\maximumrow}} + {\let\noftblheadlines\zerocount % was 1 + \let\noftblnextlines\zerocount + \let\noftblhdnxlines\zerocount}% + \the\TBLbody + \the\TBLfoot \removeunwantedspaces % only if hmode % finish cells - \tabl_ntb_loop_one + \dorecurse\maximumrow + {\row\recurselevel\relax + \dorecurse\maximumcol + {\col\recurselevel\relax + \doifnottbltag\row\col + {\xxcol\col + \xxrow\row + \xrow\row + \doloop + {\xcol\col + \doloop + {\doifelsetbltag\xrow\xcol \exitloop + {\advance\xcol\plusone + \ifnum\xcol>\maximumcol\relax \exitloop \fi}}% + \doifelsetbltag\xrow\xcol \exitloop + {\xxrow\xrow \xxcol\xcol \advance\xrow\plusone + \ifnum\xrow>\maximumrow \exitloop \fi}}% + \ifnum\xxrow>\maximumrow\xxrow\maximumrow\fi + \ifnum\xxcol>\maximumcol\xxcol\maximumcol\fi + \xxrow\numexpr\xxrow-\row+\plusone\relax + \xxcol\numexpr\xxcol-\col+\plusone\relax + \xrow\row + \dorecurse\xxrow + {\xcol\col \settblcol\xrow\xcol{\number\xxcol}% + \dorecurse\xxcol + {\lettbltag\xrow\xcol\tblnone \advance\xcol\plusone}% + \advance\xrow\plusone}% + \lettbltag\row\col\tblcell + \settblcol\row\col{\the\xxcol}% + \settblrow\row\col{\the\xxrow}% + \ifautoTBLemptycell + \edef\celltag{{\number\row}{\number\col}}% + \@EA\settbltxt\@EA\row\@EA\col\@EA{\@EA\handleTBLcell\celltag[]{\strut}}% + \fi}}}% % to be sure - \tabl_ntb_loop_two + \dorecurse\maximumrow + {\row\recurselevel\relax + \dorecurse\maximumcol + {\col\recurselevel\relax + \doiftblrow\row\col + {\scratchcounter\numexpr\maximumrow-\row+\plusone\relax + \ifnum\gettblrow\row\col>\scratchcounter + \settblrow\row\col{\the\scratchcounter}% + \fi}% + \lettblht\row\col\zeropoint + \lettblwd\row\col\zeropoint + \doifnottblcol\row\col{\lettblcol\row\col\zerocount}% + \doifnottbltag\row\col{\lettbltag\row\col\tblnone}}}% % check and do - \ifcase\c_tabl_ntb_maximum_col\else + \ifcase\maximumcol\else \startTBLprocessing - \tabl_ntb_table_start - \dorecurse\c_tabl_ntb_maximum_row - {\tabl_ntb_row_start - \c_tabl_ntb_current_row\recurselevel\relax - \dorecurse\c_tabl_ntb_maximum_col - {\c_tabl_ntb_current_col\recurselevel\relax - \normalexpanded{\tabl_ntb_cell{\the\c_tabl_ntb_current_row}{\the\c_tabl_ntb_current_col}}}% - \tabl_ntb_row_stop}% + \begTBL + \dorecurse\maximumrow + {\bTBL + \row\recurselevel\relax + \dorecurse\maximumcol + {\col\recurselevel\relax + \normalexpanded{\noexpand\doTBL{\number\row}{\number\col}}}% + \eTBL}% \removeunwantedspaces % only if hmode - \tabl_ntb_table_stop + \endTBL \stopTBLprocessing % wrong ! ! ! better to have an auto-offset-overlay - % \ifnum\m_tabl_tbl_level>1 + % \ifnum\TBLlevel>1 % \vskip-\strutdp % \fi \fi % tracing % \iftrue % \blank \tttf - % \dorecurse\c_tabl_ntb_maximum_row - % {\c_tabl_ntb_current_row\recurselevel\relax - % \dorecurse\c_tabl_ntb_maximum_col - % {\c_tabl_ntb_current_col\recurselevel\relax - % [r=\the\c_tabl_ntb_current_row,c=\the\c_tabl_ntb_current_col,h=\the\dimexpr\tabl_ntb_get_ht\c_tabl_ntb_current_row\c_tabl_ntb_current_col,w=\the\dimexpr\tabl_ntb_get_wd\c_tabl_ntb_current_row\c_tabl_ntb_current_col]}% + % \dorecurse\maximumrow + % {\row\recurselevel\relax + % \dorecurse\maximumcol + % {\col\recurselevel\relax + % [r=\the\row,c=\the\col,h=\the\dimexpr\gettblht\row\col,w=\the\dimexpr\gettblwd\row\col]}% % \par}% % \blank % \fi \egroup - \tabl_ntb_table_pop} - -\def\tabl_ntb_loop_one - {\dorecurse\c_tabl_ntb_maximum_row{\tabl_ntb_loop_one_rows}} - -\def\tabl_ntb_loop_one_rows - {\c_tabl_ntb_current_row\recurselevel\relax - \dorecurse\c_tabl_ntb_maximum_col\tabl_ntb_loop_one_cells} + \popTBL} -\def\tabl_ntb_loop_one_cells - {\c_tabl_ntb_current_col\recurselevel\relax - \ifcsname\tabl_ntb_tag_pattern\c_tabl_ntb_current_row\c_tabl_ntb_current_col\endcsname \else - \tabl_ntb_loop_one_cells_indeed - \fi} +\let\startTBLprocessing\relax +\let\stopTBLprocessing \relax -\def\tabl_ntb_loop_one_cells_indeed - {\c_tabl_ntb_current_col_two\c_tabl_ntb_current_col - \c_tabl_ntb_current_row_two\c_tabl_ntb_current_row - \c_tabl_ntb_current_row_one\c_tabl_ntb_current_row - \doloop - {\c_tabl_ntb_current_col_one\c_tabl_ntb_current_col - \doloop - {\ifcsname\tabl_ntb_tag_pattern\c_tabl_ntb_current_row_one\c_tabl_ntb_current_col_one\endcsname - \exitloop - \else - \advance\c_tabl_ntb_current_col_one\plusone - \ifnum\c_tabl_ntb_current_col_one>\c_tabl_ntb_maximum_col\relax - \exitloop - \fi - \fi}% - \ifcsname\tabl_ntb_tag_pattern\c_tabl_ntb_current_row_one\c_tabl_ntb_current_col_one\endcsname - \exitloop - \else - \c_tabl_ntb_current_row_two\c_tabl_ntb_current_row_one - \c_tabl_ntb_current_col_two\c_tabl_ntb_current_col_one - \advance\c_tabl_ntb_current_row_one\plusone - \ifnum\c_tabl_ntb_current_row_one>\c_tabl_ntb_maximum_row - \exitloop - \fi - \fi}% - \ifnum\c_tabl_ntb_current_row_two>\c_tabl_ntb_maximum_row\c_tabl_ntb_current_row_two\c_tabl_ntb_maximum_row\fi - \ifnum\c_tabl_ntb_current_col_two>\c_tabl_ntb_maximum_col\c_tabl_ntb_current_col_two\c_tabl_ntb_maximum_col\fi - \c_tabl_ntb_current_row_two\numexpr\c_tabl_ntb_current_row_two-\c_tabl_ntb_current_row+\plusone\relax - \c_tabl_ntb_current_col_two\numexpr\c_tabl_ntb_current_col_two-\c_tabl_ntb_current_col+\plusone\relax - \c_tabl_ntb_current_row_one\c_tabl_ntb_current_row - \dorecurse\c_tabl_ntb_current_row_two - {\c_tabl_ntb_current_col_one\c_tabl_ntb_current_col - \tabl_ntb_set_col\c_tabl_ntb_current_row_one\c_tabl_ntb_current_col_one{\the\c_tabl_ntb_current_col_two}% - \dorecurse\c_tabl_ntb_current_col_two - {\tabl_ntb_let_tag\c_tabl_ntb_current_row_one\c_tabl_ntb_current_col_one\c_tabl_ntb_none - \advance\c_tabl_ntb_current_col_one\plusone}% - \advance\c_tabl_ntb_current_row_one\plusone}% - \tabl_ntb_let_tag\c_tabl_ntb_current_row\c_tabl_ntb_current_col\c_tabl_ntb_cell - \tabl_ntb_set_col\c_tabl_ntb_current_row\c_tabl_ntb_current_col{\the\c_tabl_ntb_current_col_two}% - \tabl_ntb_set_row\c_tabl_ntb_current_row\c_tabl_ntb_current_col{\the\c_tabl_ntb_current_row_two}% - \ifautoTBLemptycell - \normalexpanded - {\tabl_ntb_set_txt_process\c_tabl_ntb_current_row\c_tabl_ntb_current_col{\the\c_tabl_ntb_current_row}{\the\c_tabl_ntb_current_col}}% - {}{\strut}% - \fi} +\newcount\prelocatedTBLrows % \prelocateTBLrows{1000} may speed up large tables -\def\tabl_ntb_loop_two - {\dorecurse\c_tabl_ntb_maximum_row\tabl_ntb_loop_two_rows} - -\def\tabl_ntb_loop_two_rows - {\c_tabl_ntb_current_row\recurselevel\relax - \dorecurse\c_tabl_ntb_maximum_col\tabl_ntb_loop_two_cells} - -\def\tabl_ntb_loop_two_cells - {\c_tabl_ntb_current_col\recurselevel\relax - \ifcsname\tabl_ntb_row_pattern\c_tabl_ntb_current_row\c_tabl_ntb_current_col\endcsname - \scratchcounter\numexpr\c_tabl_ntb_maximum_row-\c_tabl_ntb_current_row+\plusone\relax - \ifnum\tabl_ntb_get_row\c_tabl_ntb_current_row\c_tabl_ntb_current_col>\scratchcounter - \tabl_ntb_set_row\c_tabl_ntb_current_row\c_tabl_ntb_current_col{\the\scratchcounter}% - \fi - \fi - \tabl_ntb_let_ht\c_tabl_ntb_current_row\c_tabl_ntb_current_col\zeropoint - \tabl_ntb_let_wd\c_tabl_ntb_current_row\c_tabl_ntb_current_col\zeropoint - \ifcsname\tabl_ntb_col_pattern\c_tabl_ntb_current_row\c_tabl_ntb_current_col\endcsname \else - \tabl_ntb_let_col\c_tabl_ntb_current_row\c_tabl_ntb_current_col\zerocount - \fi - \ifcsname\tabl_ntb_tag_pattern\c_tabl_ntb_current_row\c_tabl_ntb_current_col\endcsname \else - \tabl_ntb_let_tag\c_tabl_ntb_current_row\c_tabl_ntb_current_col\c_tabl_ntb_none - \fi} - -\let\startTBLprocessing\relax % public -\let\stopTBLprocessing \relax % public - -\newcount\c_tabl_prelocated_rows % \prelocateTBLrows{1000} may speed up large tables - -\def\tabl_ntb_row_start{\t_tabl_ntb_row\emptytoks} -\def\tabl_ntb_row_stop {\normalexpanded{\t_tabl_ntb{\the\t_tabl_ntb\noexpand\tabl_ntb_row_align_start\the\t_tabl_ntb_row\tabl_ntb_row_align_stop}}} - -\def\tabl_ntb_prelocate_error - {\writestatus\m!system{fatal error: use \string\prelocateTBLrows\space to increase table memory (now: \the\c_tabl_prelocated_rows)}} - -% \prelocateTBLrows{1000} % may speed up large tables +\def\bTBL{\tblrowtoks\emptytoks} +\def\eTBL{\tbltoks\@EA\@EA\@EA{\@EA\the\@EA\tbltoks\@EA\begintblrow\the\tblrowtoks\endtblrow}}% -\installcorenamespace{naturaltabletok} +\def\prelocateTBLerror + {\writestatus\m!system{fatal error: use \string\prelocateTBLrows\space to increase table memory (now: \number\prelocatedTBLrows)}} \def\prelocateTBLrows#1% we start at zero so we have one to much, better play safe anyway - {\dostepwiserecurse\c_tabl_prelocated_rows{#1}\plusone{\expandafter\newtoks\csname\??naturaltabletok\recurselevel\endcsname}% - \def\tabl_ntb_row_start - {\ifnum\c_tabl_ntb_row<\c_tabl_prelocated_rows\relax - \expandafter\let\expandafter\t_tabl_ntb_row\csname\??naturaltabletok\the\c_tabl_ntb_row\endcsname\t_tabl_ntb_row\emptytoks + {\dostepwiserecurse\prelocatedTBLrows{#1}\plusone{\expandafter\newtoks\csname tbl:\recurselevel\endcsname}% + \def\bTBL + {\ifnum\tblrow<\prelocatedTBLrows\relax + \@EA\let\@EA\tblrowtoks\csname tbl:\the\tblrow\endcsname\tblrowtoks\emptytoks \else - \tabl_ntb_prelocate_error + \prelocateTBLerror \fi}% - \def\tabl_ntb_row_stop - {\normalexpanded{\t_tabl_ntb{\the\t_tabl_ntb\noexpand\tabl_ntb_row_align_start\the\csname\??naturaltabletok\the\c_tabl_ntb_row\endcsname\tabl_ntb_row_align_stop}}}% - \global\c_tabl_prelocated_rows#1\relax} + \def\eTBL + {\tbltoks\@EA\@EA\@EA{\@EA\the\@EA\tbltoks\@EA\begintblrow\@EA\the\csname tbl:\the\tblrow\endcsname\endtblrow}}% + \global\prelocatedTBLrows#1\relax} + +% \prelocateTBLrows{1000} % may speed up large tables % We use aligments to handle the empty (skipped) columns, so % that we don't have to (re|)|calculate these. -\def\tabl_ntb_column_skip - {\global\advance\c_tabl_ntb_col\plusone} +\def\skiptblcol + {\global\advance\tblcol\plusone} -\def\tabl_ntb_column_next - {\global\advance\c_tabl_ntb_col\plusone - \kern\naturaltablelocalparameter\c!columndistance - \aligntab} +\def\nexttblcol + {\global\advance\tblcol\plusone + \kern\tbltblcolumndistance + &} -\def\tabl_ntb_column_span +\def\spantblcol {\span} -\let\m_tabl_ntb_saved_row\!!zerocount -\let\m_tabl_ntb_saved_col\!!zerocount +\newcount\tblrow +\newcount\tblcol -\def\tabl_ntb_row_align_start - {\noalign{\tabl_ntb_row_align_reset}% - \tabl_ntb_column_next - \kern\dimexpr\naturaltablelocalparameter\c!leftmargindistance-\naturaltablelocalparameter\c!columndistance\relax} +\let\savedtblrow\!!zerocount +\let\savedtblcol\!!zerocount -\unexpanded\def\tabl_ntb_row_align_reset - {\global\advance\c_tabl_ntb_row\plusone - \global\c_tabl_ntb_col\zerocount - \global\c_tabl_ntb_spn\zerocount} +\def\begintblrow + {\noalign + {\global\advance\tblrow\plusone + \global\tblcol\zerocount + \global\tblspn\zerocount}% + % \iftrue + % \bgroup\tbox{\tttf[\number\tblrow]}\egroup + % \fi + \nexttblcol + \kern\dimexpr\tbltblleftmargindistance-\tbltblcolumndistance\relax} -\unexpanded\def\tabl_ntb_row_align_stop - {\kern\dimexpr\naturaltablelocalparameter\c!rightmargindistance-\naturaltablelocalparameter\c!columndistance\relax +\def\endtblrow + {\kern\dimexpr\tbltblrightmargindistance-\tbltblcolumndistance\relax \crcr \noalign {\nointerlineskip - \ifnum\c_tabl_ntb_row>\c_tabl_ntb_n_of_head_lines - \ifnum\tabl_ntb_get_nob\c_tabl_ntb_row=\zerocount + \ifnum\tblrow>\noftblheadlines + \ifnum\gettblnob\tblrow=\zerocount \allowbreak \fi \else \allowbreak % else no proper head split off \fi \bgroup % protect local vars - \m_tabl_ntb_after_split + \@@tblsplitafter \egroup \bgroup % protect local vars - \scratchcounter\numexpr\c_tabl_ntb_row+\plusone\relax - \ifnum\scratchcounter>\c_tabl_ntb_n_of_hdnx_lines\relax - \ifnum\scratchcounter<\c_tabl_ntb_maximum_row\relax - \doifsomething{\naturaltablelocalparameter\c!spaceinbetween} - {\blank[\naturaltablelocalparameter\c!spaceinbetween]}% + \scratchcounter\numexpr\tblrow+\plusone\relax + \ifnum\scratchcounter>\noftblhdnxlines\relax + \ifnum\scratchcounter<\maximumrow\relax + \doifsomething\tbltblspaceinbetween{\blank[\tbltblspaceinbetween]}% \fi \fi \egroup}} -\def\tabl_ntb_flush_content - {\the\everyTABLEpass - \global\c_tabl_ntb_spn\zerocount - \global\c_tabl_ntb_col\zerocount - \global\c_tabl_ntb_row\zerocount - \global\advance\c_tabl_ntb_row\minusone +\def\begintbl + {\global\tblspn\zerocount + \global\tblcol\zerocount + \global\tblrow\zerocount + \global\advance\tblrow\minusone \tabskip\zeropoint \dostarttagged\t!table\empty \dostarttagged\t!tablerow\empty \appendtoks\dostoptagged\dostarttagged\t!tablerow\empty\to\everycr \halign\bgroup - \registerparoptions - % watch out: tagging the cell happens at the outer level (faster) - \ignorespaces\alignmark\alignmark\unskip - \aligntab\aligntab - \ignorespaces\alignmark\alignmark\unskip - \cr % one too many - \the\t_tabl_ntb - \dostoptagged + \registerparoptions + % watch out: tagging the cell happens at the outer level (faster) +% \ignorespaces##\unskip&&\dostarttagged\t!tablecell\empty\ignorespaces##\unskip\dostoptagged\cr} % one too many + \ignorespaces##\unskip&&\ignorespaces##\unskip\cr} % one too many + +\def\endtbl + {\dostoptagged \egroup \dostoptagged} -\setvalue{\??naturaltablecell\the\c_tabl_ntb_none}#1#2% - {\scratchcounter\tabl_ntb_get_col{#1}{#2}\relax - \ifnum\scratchcounter>\zerocount - \advance\scratchcounter\minusone - \ifnum\scratchcounter>\zerocount - \tabl_ntb_span - \fi - \t_tabl_ntb_row\expandafter{\the\t_tabl_ntb_row\tabl_ntb_column_next} - \fi} +\setvalue{\tblnone TBL}#1#2% + {\spanTBL{#1}{#2}} + +\setvalue{\tblcell TBL}#1#2% + {\tblrowtoks\expandafter{\the\tblrowtoks\makeTBL #1 #2 }% space delimited -> less tokens + \spanTBL{#1}{#2}} -\setvalue{\??naturaltablecell\the\c_tabl_ntb_cell}#1#2% - {\t_tabl_ntb_row\expandafter{\the\t_tabl_ntb_row\tabl_ntb_pass #1 #2 }% space delimited -> less tokens - \scratchcounter\tabl_ntb_get_col{#1}{#2}\relax +\def\spanTBL#1#2% + {\scratchcounter\gettblcol{#1}{#2}\relax \ifnum\scratchcounter>\zerocount - \advance\scratchcounter\minusone - \ifnum\scratchcounter>\zerocount - \tabl_ntb_span - \fi - \t_tabl_ntb_row\expandafter{\the\t_tabl_ntb_row\tabl_ntb_column_next} + \advance\scratchcounter \minusone + \dorecurse\scratchcounter{\tblrowtoks\expandafter{\the\tblrowtoks\spantblcol}}% + \dorecurse\scratchcounter{\tblrowtoks\expandafter{\the\tblrowtoks\skiptblcol}}% + \tblrowtoks\expandafter{\the\tblrowtoks\nexttblcol}% \fi} -\def\tabl_ntb_span - {\dorecurse\scratchcounter{\t_tabl_ntb_row\expandafter{\the\t_tabl_ntb_row\tabl_ntb_column_span}}% - \dorecurse\scratchcounter{\t_tabl_ntb_row\expandafter{\the\t_tabl_ntb_row\tabl_ntb_column_skip}}} +\def\doTBL#1#2% + {\csname\gettbltag{#1}{#2}TBL\endcsname{#1}{#2}} + +\def\begTBL + {\global\tblspn\zerocount + \global\tblrow\zerocount + \global\tblcol\zerocount + \tblpass\zerocount + \tbltoks\emptytoks} -\unexpanded\def\tabl_ntb_cell#1#2% - {\csname\??naturaltablecell\the\tabl_ntb_get_tag{#1}{#2}\endcsname{#1}{#2}} +\newtoks\everyTABLEpass -\unexpanded\def\tabl_ntb_table_start - {\global\c_tabl_ntb_spn\zerocount - \global\c_tabl_ntb_row\zerocount - \global\c_tabl_ntb_col\zerocount - \c_tabl_tbl_pass\zerocount - \t_tabl_ntb\emptytoks} +\def\flushtbltoks + {\the\everyTABLEpass + \begintbl + \the\tbltoks + \endtbl} -\def\tabl_ntb_pass_one#1 #2 % - {\tabl_ntb_get_txt{#1}{#2}}% +\def\domakeTBLone#1 #2 % + {\gettbltxt{#1}{#2}}% -\def\tabl_ntb_pass_two#1 #2 % meer in cellD - {\d_tabl_ntb_width\zeropoint - \scratchcounter\c_tabl_ntb_col - \!!counta\tabl_ntb_get_col{#1}{#2}\relax +\def\domakeTBLtwo#1 #2 % meer in cellD + {\scratchdimen\zeropoint + \scratchcounter\tblcol + \!!counta\gettblcol{#1}{#2}\relax \dorecurse\!!counta - {\advance\d_tabl_ntb_width\dimexpr - \tabl_ntb_get_wid\scratchcounter - +\naturaltablelocalparameter\c!columndistance - \ifnum\recurselevel<\!!counta - +\tabl_ntb_get_dis\scratchcounter - \fi - \relax + {\advance\scratchdimen\dimexpr\gettblwid\scratchcounter+\tbltblcolumndistance\relax + \ifnum\recurselevel<\!!counta \advance\scratchdimen \gettbldis\scratchcounter\fi \advance\scratchcounter\plusone}% - \advance\d_tabl_ntb_width-\naturaltablelocalparameter\c!columndistance\relax - \setbox\scratchbox\hbox{\tabl_ntb_get_txt{#1}{#2}}% - \tabl_ntb_set_ht{#1}{#2}{\the\ht\scratchbox}% - \tabl_ntb_set_wd{#1}{#2}{\the\wd\scratchbox}% - \ifdim\ht\scratchbox>\tabl_ntb_get_hei{#1}\relax - \tabl_ntb_set_hei{#1}{\the\ht\scratchbox}% + \edef\widthTBL{\the\dimexpr\scratchdimen-\tbltblcolumndistance\relax}% + \setbox\scratchbox\hbox{\gettbltxt{#1}{#2}}% + \settblht{#1}{#2}{\the\ht\scratchbox}% + \settblwd{#1}{#2}{\the\wd\scratchbox}% + \ifdim\ht\scratchbox>\gettblhei{#1}\relax + \settblhei{#1}{\the\ht\scratchbox}% \fi}% -\def\tabl_ntb_pass_three#1 #2 % +\newcount\tablecellrows +\newcount\tablecellcolumns + +\def\domakeTBLthree#1 #2 % {% height \dostarttagged\t!tablecell\empty - \!!counta \tabl_ntb_get_col{#1}{#2}\relax - \!!countb \tabl_ntb_get_row{#1}{#2}\relax - \!!heighta\tabl_ntb_get_ht {#1}{#2}\relax + \!!counta \gettblcol{#1}{#2}\relax + \!!countb \gettblrow{#1}{#2}\relax + \!!heighta\gettblht {#1}{#2}\relax \tablecellcolumns\!!counta % used later so don't adapt these \tablecellrows \!!countb % used later so don't adapt these - \d_tabl_ntb_height\zeropoint - \ifnum\!!counta=\c_tabl_ntb_maximum_col\relax + \scratchdimen\zeropoint + \ifnum\!!counta=\maximumcol\relax % case: nc=maxcolumns \else \scratchcounter#1\relax \dorecurse\!!countb - {\advance\d_tabl_ntb_height\tabl_ntb_get_hei\scratchcounter + {\advance\scratchdimen\gettblhei\scratchcounter \advance\scratchcounter\plusone}% - \ifdim\d_tabl_ntb_height<\!!heighta\relax - \d_tabl_ntb_height\!!heighta + \ifdim\scratchdimen<\!!heighta\relax + \scratchdimen\!!heighta \fi \fi + \edef\heightTBL{\the\scratchdimen}% % width - \d_tabl_ntb_width\zeropoint - \scratchcounter\c_tabl_ntb_col + \scratchdimen\zeropoint + \scratchcounter\tblcol \dorecurse\!!counta - {\advance\d_tabl_ntb_width\dimexpr - \tabl_ntb_get_wid\scratchcounter - +\naturaltablelocalparameter\c!columndistance - \ifnum\recurselevel<\!!counta - +\tabl_ntb_get_dis\scratchcounter - \fi - \relax + {\advance\scratchdimen\dimexpr\gettblwid\scratchcounter+\tbltblcolumndistance\relax + \ifnum\recurselevel<\!!counta \advance\scratchdimen \gettbldis\scratchcounter\fi \advance\scratchcounter\plusone}% - \advance\d_tabl_ntb_width-\naturaltablelocalparameter\c!columndistance\relax + \edef\widthTBL{\the\dimexpr\scratchdimen-\tbltblcolumndistance\relax}% % cell \setbox\scratchbox\hbox attr \taggedattribute \attribute\taggedattribute \bgroup \dotagTABLEsignal % maybe we need to add some packaging in this case - \tabl_ntb_get_txt{#1}{#2}% + \gettbltxt{#1}{#2}% \egroup - \ifnum\!!counta=\c_tabl_ntb_maximum_col\relax + \ifnum\!!counta=\maximumcol\relax % case: nc=maxcolumns \else - \scratchdimen\tabl_ntb_get_hei{#1}% + \scratchdimen\gettblhei{#1}% \setbox\scratchbox\hbox {\lower\ht\scratchbox\hbox{\raise\scratchdimen\box\scratchbox}}% \ht\scratchbox\scratchdimen \fi \dp\scratchbox\zeropoint - \edef\!!stringa{\tabl_ntb_get_ref{#1}{#2}}% + \edef\!!stringa{\gettblref{#1}{#2}}% \ifx\!!stringa\empty \box\scratchbox \else @@ -1236,103 +1061,108 @@ \fi \dostoptagged} % right spot -\def\tabl_tnb_cell_finalize +\def\inTBLcell#1#2% hm, do we need #1 #2 ? we use tblcol anyway {\doifnotinset\localwidth{\v!fit,\v!broad}% user set - {\scratchdimen\tabl_ntb_get_aut\c_tabl_ntb_col\relax + {\scratchdimen\gettblaut\tblcol\relax \ifdim\localwidth>\scratchdimen - \tabl_ntb_set_aut\c_tabl_ntb_col{\the\dimexpr\localwidth}% - \fi}} + \settblaut\tblcol{\the\dimexpr\localwidth\relax}% + \fi}}% -\def\tabl_ntb_table_stop +\def\endTBL {\setbox\scratchbox\hbox - {\setupcurrentnaturaltablelocal[\c!frame=\v!off,\c!background=,\c!align=\v!no]% - \inheritednaturaltablelocalframed{\strut}}% - \edef\minimalcellheight{\the\ht\scratchbox}% not used - \dorecurse\c_tabl_ntb_maximum_col - {\tabl_ntb_let_aut\recurselevel\zeropoint + {\localframed + [\@@tbl\@@tbl] + [\c!frame=\v!off,\c!background=,\c!align=\v!no] + {\strut}}% + \edef\minimalcellheight{\the\ht\scratchbox}% + \dorecurse\maximumcol + {\lettblaut\recurselevel\zeropoint % new - \c_tabl_ntb_current_col_one\recurselevel\relax - \dorecurse\c_tabl_ntb_maximum_row - {\tabl_ntb_let_wd\recurselevel\c_tabl_ntb_current_col_one\zeropoint - \tabl_ntb_let_ht\recurselevel\c_tabl_ntb_current_col_one\zeropoint}% + \xcol\recurselevel\relax + \dorecurse\maximumrow + {\lettblwd\recurselevel\xcol\zeropoint + \lettblht\recurselevel\xcol\zeropoint}% % till here - \tabl_ntb_let_wid\recurselevel\zeropoint - \tabl_ntb_let_dis\recurselevel\zeropoint}% - \dorecurse\c_tabl_ntb_maximum_row - {\tabl_ntb_let_hei\recurselevel\maxdimen}% - \c_tabl_tbl_pass\plusone - \let\tabl_ntb_pass\tabl_ntb_pass_one - \let\tabl_ntb_cell_process\tabl_ntb_cell_process_a - \setbox0\vbox{\settrialtypesetting \tabl_ntb_flush_content}% - \tabl_ntb_let_dis\c_tabl_ntb_maximum_col\zeropoint + \lettblwid\recurselevel\zeropoint + \lettbldis\recurselevel\zeropoint}% + \dorecurse\maximumrow + {\lettblhei\recurselevel\maxdimen}% + \tblpass\plusone + \let\makeTBL\domakeTBLone + \let\handleTBLcell\dohandleTBLcellA + \setbox0\vbox{\settrialtypesetting \flushtbltoks}% +% \setbox\scratchbox\vbox{\settrialtypesetting \flushtbltoks}% + \lettbldis\maximumcol\zeropoint \ifautoTBLspread % experimental, stretch non fixed cells to \hsize - \tabl_ntb_check_widths_one % trial run - \tabl_ntb_check_widths_two % real run - \tabl_ntb_stretch_widths - \let\tabl_ntb_cell_process\tabl_ntb_cell_process_b - \setbox\scratchbox\vbox{\settrialtypesetting \tabl_ntb_flush_content}% + \checktblwidthsone % trial run + \checktblwidthstwo % real run + \stretchtblwidths + \let\handleTBLcell\dohandleTBLcellB + \setbox\scratchbox\vbox{\settrialtypesetting \flushtbltoks}% \else\ifdim\wd0>\hsize \ifautoTBLhsize - \tabl_ntb_check_widths_one % trial run - \tabl_ntb_check_widths_two % real run - \let\tabl_ntb_cell_process\tabl_ntb_cell_process_b - \setbox\scratchbox\vbox{\settrialtypesetting \tabl_ntb_flush_content}% + \checktblwidthsone % trial run + \checktblwidthstwo % real run + \let\handleTBLcell\dohandleTBLcellB + \setbox\scratchbox\vbox{\settrialtypesetting \flushtbltoks}% \fi - \else\ifautoTBLrowspan\ifnum\c_tabl_ntb_maximum_row_span>1 % max ? + \else\ifautoTBLrowspan\ifnum\maximumrowspan>1 % max ? % added jan 2002 because nx=* did no longer work \edef\savedhsize{\the\hsize}% \hsize\wd0\relax % new per 17/04/2006 - \tabl_ntb_check_widths_one % trial run - \tabl_ntb_check_widths_two % real run + \checktblwidthsone % trial run + \checktblwidthstwo % real run \hsize\savedhsize % - \let\tabl_ntb_cell_process\tabl_ntb_cell_process_c - \setbox\scratchbox\vbox{\settrialtypesetting \tabl_ntb_flush_content}% + \let\handleTBLcell\dohandleTBLcellC + \setbox\scratchbox\vbox{\settrialtypesetting \flushtbltoks}% \fi\fi\fi\fi - \let\tabl_ntb_cell_process\tabl_ntb_cell_process_d - \c_tabl_tbl_pass\plustwo - \let\tabl_ntb_pass\tabl_ntb_pass_two - \setbox\scratchbox\vbox{\settrialtypesetting \tabl_ntb_flush_content}% - \tabl_ntb_check_heights_one - \tabl_ntb_check_heights_two - \let\tabl_ntb_cell_process\tabl_ntb_cell_process_e - \c_tabl_tbl_pass\plusthree - \let\tabl_ntb_pass\tabl_ntb_pass_three - \ifnum\m_tabl_tbl_level>\plusone - \expandafter\tabl_tbl_split_nop + \let\handleTBLcell\dohandleTBLcellD + \tblpass\plustwo + \let\makeTBL\domakeTBLtwo + \setbox\scratchbox\vbox{\settrialtypesetting \flushtbltoks}% + \checktblheightsone + \checktblheightstwo + \let\handleTBLcell\dohandleTBLcellE + \tblpass\plusthree + \let\makeTBL\domakeTBLthree + \ifnum\TBLlevel>\plusone + \@EA\notsplittblbox \else\ifenableTBLbreak - \doubleexpandafter\tabl_tbl_split_yes + \@EAEAEA\splittblbox \else - \doubleexpandafter\tabl_tbl_split_nop - \fi\fi{\tabl_ntb_flush_content}} + \@EAEAEA\notsplittblbox + \fi\fi{\flushtbltoks}} -\def\tabl_ntb_stretch_widths % more variants, e.g. a max to \dimend - {\ifcase\c_tabl_ntb_maximum_col\else % else division by zero +\def\stretchtblwidths % more variants, e.g. a max to \dimend + {\ifcase\maximumcol\else % else division by zero \!!dimend\zeropoint \!!dimene\hsize - \dorecurse\c_tabl_ntb_maximum_col - {\advance\!!dimend\dimexpr\tabl_ntb_get_wid\recurselevel+\naturaltablelocalparameter\c!columndistance\relax - \advance\!!dimene-\tabl_ntb_get_dis\recurselevel}% - \advance\!!dimend\dimexpr-\naturaltablelocalparameter\c!columndistance+\naturaltablelocalparameter\c!leftmargindistance+\naturaltablelocalparameter\c!rightmargindistance\relax + \dorecurse\maximumcol + {\advance\!!dimend\dimexpr\gettblwid\recurselevel+\tbltblcolumndistance\relax + \advance\!!dimene-\gettbldis\recurselevel}% + \advance\!!dimend\dimexpr-\tbltblcolumndistance+\tbltblleftmargindistance+\tbltblrightmargindistance\relax % distribute width (stretch) \ifdim\!!dimend<\!!dimene \advance\!!dimend-\!!dimene \!!dimend-\!!dimend - \divide\!!dimend\c_tabl_ntb_maximum_col - \dorecurse\c_tabl_ntb_maximum_col - {\tabl_ntb_set_wid\recurselevel{\the\dimexpr\tabl_ntb_get_wid\recurselevel+\!!dimend\relax}}% + \divide\!!dimend\maximumcol + \dorecurse\maximumcol + {\settblwid\recurselevel{\the\dimexpr\gettblwid\recurselevel+\!!dimend\relax}}% \fi \fi} -\def\tabl_tbl_split_nop#1% - {\setbox\b_tabl_ntb_final\vbox{#1}% - \postprocessTABLEbox\b_tabl_ntb_final +\newbox\finaltblbox + +\def\notsplittblbox#1% + {\setbox\finaltblbox\vbox{#1}% + \postprocessTABLEbox\finaltblbox \beforeTABLEbox - \box\b_tabl_ntb_final + \box\finaltblbox \afterTABLEbox} -\def\tabl_tbl_split_yes % #1 +\def\splittblbox#1% {\ifinsidesplitfloat \donetrue \else\ifinsidefloat @@ -1341,33 +1171,33 @@ \donetrue \fi\fi \ifdone - \expandafter\tabl_ntb_split_box + \executeifdefined{dosplittblbox\tbltblsplitmethod}\dosplittblbox{#1}% \else - \expandafter\tabl_tbl_split_nop + \notsplittblbox{#1}% \fi} \newbox\TABLEsplitbox % public, don't change \let\extratblsplitheight\zeropoint % additional space taken by before/afterTABLEsplitbox -\def\tabl_ntb_split_box#1% +\def\dosplittblbox#1% {\resettsplit \def\tsplitminimumfreelines{2}% - \def\tsplitminimumfreespace{\dimexpr\extratblsplitheight+\naturaltablelocalparameter\c!splitoffset\relax}% + \def\tsplitminimumfreespace{\dimexpr\extratblsplitheight+\tbltblsplitoffset\relax}% \def\tsplitbeforeresult {\beforeTABLEsplitbox}% \def\tsplitafterresult {\afterTABLEsplitbox}% - \def\tsplitafter {\m_tabl_ntb_after_split}% + \def\tsplitafter {\@@tblsplitafter}% \setbox\tsplitcontent\vbox{#1}% \ifmultipleTBLheads - \dorecurse\c_tabl_ntb_n_of_head_lines + \dorecurse\noftblheadlines {\setbox\scratchbox\vsplit\tsplitcontent to \lineheight \setbox\tsplithead\vbox{\unvcopy\tsplithead\unvcopy\scratchbox}}% - \dorecurse\c_tabl_ntb_n_of_next_lines + \dorecurse\noftblnextlines {\setbox\scratchbox\vsplit\tsplitcontent to \lineheight \setbox\tsplitnext\vbox{\unvcopy\tsplitnext\unvcopy\scratchbox}}% \fi - \doifsomething{\naturaltablelocalparameter\c!spaceinbetween} - {\def\tsplitinbetween{\blank[\naturaltablelocalparameter\c!spaceinbetween]}}% + \doifsomething\tbltblspaceinbetween + {\def\tsplitinbetween{\blank[\tbltblspaceinbetween]}}% \def\postprocesstsplit{\postprocessTABLEsplitbox{\box\tsplitresult}}% \handletsplit} @@ -1381,22 +1211,22 @@ \let\beforeTABLEbox \relax \let\afterTABLEbox \relax -\def\tabl_ntb_check_widths_one{\tabl_ntb_check_widths_indeed0} % 0 = trial run -\def\tabl_ntb_check_widths_two{\tabl_ntb_check_widths_indeed1} % 1 = real run +\def\checktblwidthsone{\dochecktblwidths0} % 0 = trial run +\def\checktblwidthstwo{\dochecktblwidths1} % 1 = real run -\def\tabl_ntb_check_widths_indeed#1% - {\iftraceTABLE\tabl_ntb_show_widths{B#1}\fi +\def\dochecktblwidths#1% + {\iftraceTABLE\showtblwids{B#1}\fi \!!counta\zerocount - \!!dimena\dimexpr\hsize-\naturaltablelocalparameter\c!leftmargindistance-\naturaltablelocalparameter\c!rightmargindistance-\naturaltablelocalparameter\c!columndistance\relax - \dorecurse\c_tabl_ntb_maximum_col - {\scratchdimen\tabl_ntb_get_aut\recurselevel\relax - \advance\!!dimena-\tabl_ntb_get_dis\recurselevel\relax + \!!dimena\dimexpr\hsize-\tbltblleftmargindistance-\tbltblrightmargindistance-\tbltblcolumndistance\relax + \dorecurse\maximumcol + {\scratchdimen\gettblaut\recurselevel\relax + \advance\!!dimena-\gettbldis\recurselevel\relax \ifdim\scratchdimen>\zeropoint\relax \advance\!!dimena -\scratchdimen \else - \scratchdimen\tabl_ntb_get_wid\recurselevel\relax - \ifdim\scratchdimen>\naturaltablelocalparameter\c!maxwidth\relax - \ifcase#1\else\tabl_ntb_let_wid\recurselevel\zeropoint\fi + \scratchdimen\gettblwid\recurselevel\relax + \ifdim\scratchdimen>\tbltblmaxwidth\relax + \ifcase#1\else\lettblwid\recurselevel\zeropoint\fi \advance\!!counta \plusone \else \ifdim\scratchdimen>\zeropoint\relax @@ -1409,157 +1239,163 @@ \fi \fi}% \ifcase\!!counta \else \divide\!!dimena \!!counta \fi - \dorecurse\c_tabl_ntb_maximum_col - {\scratchdimen\tabl_ntb_get_wid\recurselevel\relax + \dorecurse\maximumcol + {\scratchdimen\gettblwid\recurselevel\relax \ifcase#1\relax \ifdim\scratchdimen<\!!dimena % take natural width - \tabl_ntb_set_aut\recurselevel{\the\scratchdimen}% + \settblaut\recurselevel{\the\scratchdimen}% \fi \else \ifdim\scratchdimen=\zeropoint % auto set width - \tabl_ntb_set_wid\recurselevel{\the\!!dimena}% + \settblwid\recurselevel{\the\!!dimena}% \fi \fi}% - \iftraceTABLE\tabl_ntb_show_widths{E#1}\fi} + \iftraceTABLE\showtblwids{E#1}\fi} + +\newcount\xrowTBL +\newcount\xcolTBL +\newcount\xxrowTBL -\def\tabl_ntb_check_heights_one_indeed - {\!!countb\tabl_ntb_get_row\c_tabl_ntb_current_row_three\c_tabl_ntb_current_col_three\relax +% dikke arg naar recurse wegwerken + +\def\dochecktblheightsone + {\!!countb\gettblrow\xrowTBL\xcolTBL\relax % check row span \ifnum\!!countb>\plusone % current height in row - \dimen0=\tabl_ntb_get_ht\c_tabl_ntb_current_row_three\c_tabl_ntb_current_col_three + \dimen0=\gettblht\xrowTBL\xcolTBL % find nearest height in row \dimen2=\zeropoint - \dorecurse\c_tabl_ntb_maximum_col - {\ifnum\recurselevel=\c_tabl_ntb_current_col_three\else - \ifcsname\tabl_ntb_row_pattern\c_tabl_ntb_current_row_three\recurselevel\endcsname - \!!countc=\tabl_ntb_get_row\c_tabl_ntb_current_row_three\recurselevel\relax - \ifnum\!!countc=\plusone - \dimen4=\tabl_ntb_get_ht\c_tabl_ntb_current_row_three\recurselevel\relax - \ifdim\dimen2<\dimen4 - \dimen2=\dimen4 - \fi - \fi - \fi + \dorecurse\maximumcol + {\ifnum\recurselevel=\xcolTBL\else + \doiftblrow\xrowTBL\recurselevel + {\!!countc=\gettblrow\xrowTBL\recurselevel\relax + \ifnum\!!countc=\plusone + \dimen4=\gettblht\xrowTBL\recurselevel\relax + \ifdim\dimen2<\dimen4 + \dimen2=\dimen4 + \fi + \fi}% \fi}% - \c_tabl_ntb_current_row_four\c_tabl_ntb_current_row_three + \xxrowTBL\xrowTBL % calculate cummulative height \dimen4=\dimen2 - \!!countc\c_tabl_ntb_current_row_three + \!!countc\xrowTBL \advance\!!countc\minusone \dorecurse\!!countb - {\ifnum\c_tabl_ntb_current_row_four=\c_tabl_ntb_current_row_three\else - \advance\dimen4 \tabl_ntb_get_hei\c_tabl_ntb_current_row_four + {\ifnum\xxrowTBL=\xrowTBL\else + \advance\dimen4 \gettblhei\xxrowTBL \fi \ifnum\recurselevel=\!!countb\else - \tabl_ntb_set_nob\!!countc + \settblnob\!!countc \advance\!!countc\plusone \fi - \advance\c_tabl_ntb_current_row_four\plusone}% + \advance\xxrowTBL\plusone}% % distribute overshoot equally \ifdim\dimen2>\zeropoint % new: test on natural-003 \ifdim\dimen4<\dimen0 \advance\dimen0 -\dimen4 \divide\dimen0 \!!countb - \c_tabl_ntb_current_row_four\c_tabl_ntb_current_row_three - \tabl_ntb_set_hei\c_tabl_ntb_current_row_three{\the\dimen2}% + \xxrowTBL\xrowTBL + \settblhei\xrowTBL{\the\dimen2}% \dorecurse\!!countb - {\dorecurse\c_tabl_ntb_maximum_col - {\ifnum\recurselevel=\c_tabl_ntb_current_col_three\else - \scratchdimen\dimexpr\tabl_ntb_get_ht\c_tabl_ntb_current_row_four\recurselevel+\dimen0\relax - \tabl_ntb_set_ht\c_tabl_ntb_current_row_four\recurselevel{\the\scratchdimen}% - \ifdim\tabl_ntb_get_hei\c_tabl_ntb_current_row_four<\scratchdimen - \tabl_ntb_set_hei\c_tabl_ntb_current_row_four{\the\scratchdimen}% + {\dorecurse\maximumcol + {\ifnum\recurselevel=\xcolTBL\else + \scratchdimen\dimexpr\gettblht\xxrowTBL\recurselevel+\dimen0\relax + \settblht\xxrowTBL\recurselevel{\the\scratchdimen}% + \ifdim\gettblhei\xxrowTBL<\scratchdimen + \settblhei\xxrowTBL{\the\scratchdimen}% \fi \fi}% - \advance\c_tabl_ntb_current_row_four\plusone}% + \advance\xxrowTBL\plusone}% \else\ifdim\dimen4>\dimen0 \iftightTBLrowspan - \tabl_ntb_set_hei\c_tabl_ntb_current_row_three{\the\dimen2}% + \settblhei\xrowTBL{\the\dimen2}% \fi \fi\fi \fi \fi} +\def\checktblheightsone + {\dorecurse\maximumrow + {\xrowTBL\recurselevel\relax + \dorecurse\maximumcol + {\xcolTBL\recurselevel\relax + \doiftblrow\xrowTBL\xcolTBL\dochecktblheightsone}}} -\def\tabl_ntb_check_heights_one - {\dorecurse\c_tabl_ntb_maximum_row - {\c_tabl_ntb_current_row_three\recurselevel\relax - \dorecurse\c_tabl_ntb_maximum_col - {\c_tabl_ntb_current_col_three\recurselevel\relax - \ifcsname\tabl_ntb_row_pattern\c_tabl_ntb_current_row_three\c_tabl_ntb_current_col_three\endcsname - \tabl_ntb_check_heights_one_indeed - \fi}}} - -\def\tabl_ntb_check_heights_two +\def\checktblheightstwo {} -\def\tabl_ntb_show_widths#1% +\def\showtblwids#1% {\vbox - {\forgetall\tttf[#1]\dorecurse\c_tabl_ntb_maximum_col - {\scratchdimen\tabl_ntb_get_wid\recurselevel\relax + {\forgetall\tttf[#1]\dorecurse\maximumcol + {\scratchdimen\gettblwid\recurselevel\relax [\recurselevel:\the\scratchdimen]}}} -\def\tabl_ntb_char_align - {\doifelse{\naturaltablelocalparameter\c!aligncharacter}\v!yes - \tabl_ntb_char_align_indeed\gobbleoneargument} +\def\TBLcharalign + {\doifelse\tbltblaligncharacter\v!yes + \doTBLcharalign\gobbleoneargument} -\def\tabl_ntb_char_align_indeed#1#2% column data +\long\def\doTBLcharalign#1#2% column data {\edef\alignmentclass{#1}% - \edef\alignmentcharacter{\naturaltablelocalparameter\c!alignmentcharacter}% - \ifcase\c_tabl_tbl_pass\or + \edef\alignmentcharacter{\tbltblalignmentcharacter}% + \ifcase\tblpass\or \setfirstpasscharacteralign\checkalignment{#2}% {\strut#2\unskip}% \fi % force hsize, so always a second \setsecondpasscharacteralign \checkalignment{#2}% {\strut#2\unskip}% \ignorespaces} -\unexpanded\def\tabl_ntb_cell_process_a#1#2[#3]#4% grouping added ! ! ! +% new, needed for icare first col of 'doeltabel', experimental + +\long\def\dohandleTBLcellA#1#2[#3]#4% grouping added ! ! ! {\bgroup - \tabl_ntb_setup_cell{#1}{#2}% + \setupTBLcell{#1}{#2}% \setbox\scratchbox\hbox - {\scratchdimen\naturaltablelocalparameter\c!distance\relax - \ifdim\scratchdimen>\tabl_ntb_get_dis{#2}\relax - \tabl_ntb_set_dis{#2}{\the\scratchdimen}% + {\scratchdimen\tbltbldistance\relax + \ifdim\scratchdimen>\gettbldis{#2}\relax + \settbldis{#2}{\the\scratchdimen}% \fi - \setupcurrentnaturaltablelocal[#3,\c!background=,\c!frame=\v!off]% 25% faster - \inheritednaturaltablelocalframed{\tabl_tnb_cell_start\tabl_ntb_char_align{#2}{#4}\tabl_tnb_cell_stop\tabl_tnb_cell_finalize}}% - \scratchdimen\tabl_ntb_get_wid\c_tabl_ntb_col\relax + \localframed + [\@@tbl\@@tbl] + [#3,\c!background=,\c!frame=\v!off]% 25% faster + {\bTBLCELL\TBLcharalign{#2}{#4}\eTBLCELL\inTBLcell{#1}{#2}}}% + \scratchdimen\gettblwid\tblcol\relax \ifdim\wd\scratchbox>\scratchdimen \ifsqueezeTBLspan \ifautosqueezeTBLspan - \doifinsetelse{\naturaltablelocalparameter\c!width}{\v!fit,\v!fixed,\v!broad,\v!local} + \doifinsetelse\tbltblwidth{\v!fit,\v!fixed,\v!broad,\v!local} \donetrue \donefalse \else \donetrue \fi \ifdone % brr, 0 - \ifnum\tabl_ntb_get_col{#1}{#2}>\plusone \tabl_ntb_set_spn\c_tabl_ntb_col\fi + \ifnum\number\gettblcol{#1}{#2}>\plusone \settblspn\tblcol\fi \fi \fi - \tabl_ntb_spn_doifelse\c_tabl_ntb_col + \doifelsetblspn\tblcol \donothing - {\ifdim\tabl_ntb_get_wid\c_tabl_ntb_col<\wd\scratchbox - \tabl_ntb_set_wid\c_tabl_ntb_col{\the\wd\scratchbox}% + {\ifdim\gettblwid\tblcol<\wd\scratchbox + \settblwid\tblcol{\the\wd\scratchbox}% \fi}% auto set \fi - \scratchcounter\numexpr\c_tabl_ntb_row+\plusone\relax - \scratchdimen\tabl_ntb_get_hei\scratchcounter\relax + \scratchcounter\numexpr\tblrow+\plusone\relax + \scratchdimen\gettblhei\scratchcounter\relax \ifdim\ht\scratchbox<\scratchdimen - \tabl_ntb_set_hei\scratchcounter{\the\ht\scratchbox}% auto set + \settblhei\scratchcounter{\the\ht\scratchbox}% auto set \fi - \tabl_ntb_set_ht{#1}{#2}{\the\ht\scratchbox}% - \tabl_ntb_set_wd{#1}{#2}{\the\wd\scratchbox}% + \settblht{#1}{#2}{\the\ht\scratchbox}% + \settblwd{#1}{#2}{\the\wd\scratchbox}% \ifautoTBLcheckwidth \ifdim\wd\scratchbox<.75\hsize % fuzzy guess \ifdim\ht\scratchbox>2\openlineheight % honor width since this - \scratchdimen\tabl_ntb_get_aut\c_tabl_ntb_col\relax % can be a figure or so + \scratchdimen\gettblaut\tblcol\relax % can be a figure or so \ifdim\scratchdimen=\zeropoint % side effect: when width is set to 0pt, % we can force a span that fits the sum of spans widths - \tabl_ntb_set_aut\c_tabl_ntb_col{\the\scratchdimen}% + \settblaut\tblcol{\the\scratchdimen}% \else\ifdim\wd\scratchbox>\scratchdimen % unless span - \tabl_ntb_set_aut\c_tabl_ntb_col{\the\wd\scratchbox}% + \settblaut\tblcol{\the\wd\scratchbox}% % to be translated \writestatus\m!TABLE {no auto width in (\number#1,\number#2)\space\the\wd\scratchbox/\the\hsize}% @@ -1568,102 +1404,155 @@ \fi \fi \setbox2\emptyhbox - \wd2\wd\scratchbox - \ht2\ht\scratchbox - \dp2\dp\scratchbox + \wd2\wd\scratchbox \ht2\ht\scratchbox \dp2\dp\scratchbox \box2 \egroup} -\unexpanded\def\tabl_ntb_cell_process_b_c#1#2#3[#4]#5% +\long\def\dohandleTBLcellBC#1#2#3[#4]#5% {\setbox\scratchbox\hbox - {\tabl_ntb_setup_cell{#2}{#3}% - \setupcurrentnaturaltablelocal[#4,#1,\c!frame=\v!off,\c!background=]% - \inheritednaturaltablelocalframed{\tabl_tnb_cell_start#5\tabl_tnb_cell_stop}}% + {\setupTBLcell{#2}{#3}% + \localframed + [\@@tbl\@@tbl] + [#4,#1,\c!frame=\v!off,\c!background=] + {\bTBLCELL#5\eTBLCELL}}% \setbox2\emptyhbox - \wd2\wd\scratchbox - \ht2\ht\scratchbox - \dp2\dp\scratchbox + \wd2\wd\scratchbox \ht2\ht\scratchbox \dp2\dp\scratchbox \ifautoTBLrowspan - \scratchcounter\numexpr\c_tabl_ntb_row+\plusone\relax - \ifcsname\tabl_ntb_row_pattern\scratchcounter\c_tabl_ntb_col\endcsname - \scratchdimen\tabl_ntb_get_hei\scratchcounter\relax - \ifnum\tabl_ntb_get_row\scratchcounter\c_tabl_ntb_col>\plusone - \ifdim\ht\scratchbox>\scratchdimen - \ht2\dimexpr-\scratchdimen-\ht\scratchbox\relax - \fi - \fi - \fi + \scratchcounter\numexpr\tblrow+\plusone\relax + \doiftblrow\scratchcounter\tblcol + {\scratchdimen\gettblhei\scratchcounter\relax % moved inside test + \ifnum\gettblrow\scratchcounter\tblcol>\plusone \ifdim\ht\scratchbox>\scratchdimen + \scratchdimen-\scratchdimen \advance\scratchdimen -\ht\scratchbox + \ht2\scratchdimen + \fi \fi}% \fi \box2 } -\unexpanded\def\tabl_ntb_cell_process_b#1#2[#3]#4% - {\scratchdimen\tabl_ntb_get_aut\c_tabl_ntb_col\relax +\long\def\dohandleTBLcellB#1#2[#3]#4% + {\scratchdimen\gettblaut\tblcol\relax \ifdim\scratchdimen>\zeropoint\relax + \let\tblwidthkey\c!width + \edef\tblwidth{\the\scratchdimen}% \else - \scratchdimen\tabl_ntb_get_wid\c_tabl_ntb_col\relax + \scratchdimen\gettblwid\tblcol\relax \ifdim\scratchdimen>\zeropoint\relax - \ifnum\tabl_ntb_get_col{#1}{#2}=\c_tabl_ntb_maximum_col\relax + \ifnum\gettblcol{#1}{#2}=\maximumcol\relax \scratchdimen\hsize \fi + \let\tblwidthkey\c!width + \edef\tblwidth{\the\scratchdimen}% + \else + \let\tblwidthkey\s!unknown + \let\tblwidth\zeropoint \fi \fi - \normalexpanded{\tabl_ntb_cell_process_b_c{\ifdim\scratchdimen>\zeropoint \c!width=\the\scratchdimen\fi}}% - {#1}{#2}[#3]{\tabl_ntb_char_align{#2}{#4}}} + \dohandleTBLcellBC{\tblwidthkey=\tblwidth}{#1}{#2}[#3]{\TBLcharalign{#2}{#4}}} -\unexpanded\def\tabl_ntb_cell_process_c - {\tabl_ntb_cell_process_b_c{}} +\long\def\dohandleTBLcellC + {\dohandleTBLcellBC{}} -\unexpanded\def\tabl_ntb_cell_process_d#1#2[#3]#4% - {\tabl_ntb_setup_cell{#1}{#2}% +\long\def\dohandleTBLcellD#1#2[#3]#4% + {\setupTBLcell{#1}{#2}% \bgroup - \setupcurrentnaturaltablelocal[#3,\c!width=\d_tabl_ntb_width,\c!background=,\c!frame=\v!off]% 25% faster - \inheritednaturaltablelocalframed{\tabl_tnb_cell_start\tabl_ntb_char_align{#2}{#4}\tabl_tnb_cell_stop}% + \localframed + [\@@tbl\@@tbl] + [#3,\c!width=\widthTBL,\c!background=,\c!frame=\v!off]% 25% faster + {\bTBLCELL\TBLcharalign{#2}{#4}\eTBLCELL}% \egroup} -\unexpanded\def\tabl_ntb_cell_process_e#1#2[#3]#4% - {\tabl_ntb_setup_cell{#1}{#2}% - \setupcurrentnaturaltablelocal[#3]% to get the color right, the way we +\long\def\dohandleTBLcellE#1#2[#3]#4% + {\setupTBLcell{#1}{#2}% + \getparameters[\@@tbl\@@tbl][#3]% to get the color right, the way we \color % handle color here prevents interference due to whatsit nodes - [\naturaltablelocalparameter\c!color] % as well as permits local colors to take precedence - {\ifdim\d_tabl_ntb_height=\zeropoint\relax % case: nc=maxcolumns - \setupcurrentnaturaltablelocal[\c!color=,\c!width=\d_tabl_ntb_width]% + [\tbltblcolor] % as well as permits local colors to take precedence + {\ifdim\heightTBL=\zeropoint\relax % case: nc=maxcolumns + \localframed + [\@@tbl\@@tbl] + [\c!color=,\c!width=\widthTBL] + {\bTBLCELL\TBLcharalign{#2}{#4}\eTBLCELL}% \else - \setupcurrentnaturaltablelocal[\c!color=,\c!width=\d_tabl_ntb_width,\c!height=\d_tabl_ntb_height]% - \fi - \inheritednaturaltablelocalframed{\tabl_tnb_cell_start\tabl_ntb_char_align{#2}{#4}\tabl_tnb_cell_stop}}% - \hskip\tabl_ntb_get_dis{#2}} - -\setupTABLE - [\c!frameoffset=.5\linewidth, - \c!backgroundoffset=\v!frame, - \c!framecolor=\s!black, - \c!width=\v!fit, - \c!height=\v!fit, - \c!autowidth=\v!yes, - \c!rulethickness=\linewidth, - \c!strut=\v!yes, - \c!autostrut=\v!no, - % - \c!color=, - \c!style=, - \c!headstyle=\v!bold, - \c!headcolor=, - \c!aligncharacter=\v!no, - \c!alignmentcharacter={,}, - \c!option=, % \v!stretch - \c!header=, - \c!spaceinbetween=, - \c!maxwidth=8\emwidth, - \c!textwidth=\v!local, % was \hsize - \c!split=\v!auto, - \c!splitoffset=\zeropoint, - \c!distance=\zeropoint, % individual column - \c!columndistance=\zeropoint, % each column (whole table) - \c!leftmargindistance=\zeropoint, % whole table - \c!rightmargindistance=\zeropoint,% whole table - \c!left=, - \c!right=, - \c!setups=] + \localframed + [\@@tbl\@@tbl] + [\c!color=,\c!width=\widthTBL,\c!height=\heightTBL] + {\bTBLCELL\TBLcharalign{#2}{#4}\eTBLCELL}% + \fi}% + \hskip\gettbldis{#2}} + +\presetlocalframed % todo: tableparameter etc + [\@@tbl\@@tbl] + +\setupTABLE [% + \c!frameoffset=.5\linewidth, + \c!backgroundoffset=\v!frame, + \c!framecolor=\s!black, + \c!width=\v!fit, + \c!height=\v!fit, + \c!autowidth=\v!yes, + \c!rulethickness=\linewidth, + \c!strut=\v!yes, + \c!autostrut=\v!no, + % + \c!color=, + \c!style=, + \c!headstyle=\v!bold, + \c!headcolor=, + \c!aligncharacter=\v!no, + \c!alignmentcharacter={,}, + \c!option=, % \v!stretch + \c!header=, + \c!spaceinbetween=, + \c!maxwidth=8em, + \c!textwidth=\hsize, + \c!split=\v!auto, + \c!splitoffset=0pt, + \c!distance=\zeropoint, % individual column + \c!columndistance=\zeropoint, % each column (whole table) + \c!leftmargindistance=\zeropoint, % whole table + \c!rightmargindistance=\zeropoint,% whole table + \c!left=, + \c!right=, + \c!setups=, + \c!splitmethod=a% +] + +%D We have already prepared the previous macros for nesting, +%D so we only have to pop in the right ones: + +%D New: + +\def\pushTBLparameters + {\globalpushmacro\TBLlevel + \ifcase\tblpass + % we're just after \bTABLE + \else\ifnum\TBLlevel>\zerocount + \doglobal\increment\TBLlevel\relax + \fi\fi} + +\def\popTBLparameters + {\globalpopmacro\TBLlevel} + +\def\pushTBL + {\ifnum\TBLlevel=\zerocount + \global\advance\currenttbl\plusone + \fi + \doglobal\increment\TBLlevel\relax + \ifnum\TBLlevel>\plusone + \resetallTABLEparameters + % we need a proper count push/pop + \xdef\savedtblrow{\the\tblrow}\globalpushmacro\savedtblrow + \xdef\savedtblcol{\the\tblcol}\globalpushmacro\savedtblcol + \else + \global\intabletrue + \fi} + +\def\popTBL + {\ifnum\TBLlevel>\plusone + \globalpopmacro\savedtblrow\global\tblrow\savedtblrow + \globalpopmacro\savedtblcol\global\tblcol\savedtblcol + \else + \global\intablefalse + \fi + \doglobal\decrement\TBLlevel\relax} % \bgroup % \setupTABLE[column][1][aligncharacter=yes, alignmentcharacter={,}] @@ -1681,21 +1570,23 @@ \newconditional\resetTABLEmode \settrue\resetTABLEmode -\def\tabl_ntb_parameters_reset - {\ifnum\m_tabl_tbl_level>\plusone % in ieder geval +\def\resetallTABLEparameters% moet genest wel werken + {\ifnum\TBLlevel>\plusone % in ieder geval \ifconditional\resetTABLEmode +% \presetlocalframed % breedte hoogte diepte offset +% [\@@tbl\@@tbl]% % achtergrond, achtergrondraster, achtergrondkleur % not ok yet - \setupTABLE - [\c!frameoffset=.5\linewidth, + \setupTABLE [% + \c!frameoffset=.5\linewidth, \c!backgroundoffset=\v!frame, \c!framecolor=\s!black, \c!width=fit, \c!height=fit, - \c!autowidth=\v!yes, - % \c!rulethickness=\linewidth, +\c!autowidth=\v!yes, +% \c!rulethickness=\linewidth, \c!strut=\v!no, - \c!strut=\v!yes, % needed for mathml, but ... maybe we need another resetTABLEmode - \c!autostrut=\v!no, +\c!strut=\v!yes, % needed for mathml, but ... maybe we need another resetTABLEmode +\c!autostrut=\v!no, \c!color=, \c!style=, \c!headstyle=, @@ -1720,22 +1611,21 @@ % \bTRs[xx] \bTD oeps \eTD \bTD oeps \eTD \eTRs % \eTABLE -\installcorenamespace{naturaltablesetup} - \unexpanded\def\defineTABLEsetup - {\dodoubleargument\tabl_ntb_define_setup} - -\def\tabl_ntb_define_setup[#1][#2]% - {\setvalue{\??naturaltablesetup#1}{#2}} + {\dodoubleargument\dodefineTABLEsetup} -\let\eTDs\relax -\let\eTRs\relax +\def\dodefineTABLEsetup[#1][#2]% + {\setvalue{\@@tbl:set:#1}{#2}} -\unexpanded\def\bTDs[#1]#2\eTDs - {\normalexpanded{\bTD[\ifcsname\??naturaltablesetup#1\endcsname\csname\??naturaltablesetup#1\endcsname\fi]}#2\eTD} +\long\def\bTDs[#1]#2\eTDs + {\doifdefinedelse{\@@tbl:set:#1} + {\@EA\@EA\@EA\bTD\@EA\@EA\@EA[\csname\@@tbl:set:#1\endcsname]#2\eTD} + {\bTD[]#2\eTD}} -\unexpanded\def\bTRs[#1]#2\eTRs - {\normalexpanded{\bTR[\ifcsname\??naturaltablesetup#1\endcsname\csname\??naturaltablesetup#1\endcsname\fi]}#2\eTR} +\long\def\bTRs[#1]#2\eTRs + {\doifdefinedelse{\@@tbl:set:#1} + {\@EA\@EA\@EA\bTR\@EA\@EA\@EA[\csname\@@tbl:set:#1\endcsname]#2\eTR} + {\bTR[]#2\eTR}} \protect \endinput |