summaryrefslogtreecommitdiff
path: root/tex/context/base/mkiv/tabl-ntb.mkxl
diff options
context:
space:
mode:
Diffstat (limited to 'tex/context/base/mkiv/tabl-ntb.mkxl')
-rw-r--r--tex/context/base/mkiv/tabl-ntb.mkxl2172
1 files changed, 0 insertions, 2172 deletions
diff --git a/tex/context/base/mkiv/tabl-ntb.mkxl b/tex/context/base/mkiv/tabl-ntb.mkxl
deleted file mode 100644
index 8883a29e3..000000000
--- a/tex/context/base/mkiv/tabl-ntb.mkxl
+++ /dev/null
@@ -1,2172 +0,0 @@
-%D \module
-%D [ file=tabl-ntb,
-%D version=2000.04.18,
-%D title=\CONTEXT\ Table Macros,
-%D subtitle=Natural Tables,
-%D author=Hans Hagen,
-%D date=\currentdate,
-%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
-%C
-%C This module is part of the \CONTEXT\ macro||package and is
-%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
-%C details.
-
-%D This module has a more modern variant in xtables but as we follow a bit different
-%D approach with settings there, this mechanism will stay. In fact each of them has
-%D its advantages. This module could be sped up a bit and made more efficient by
-%D delegating some housekeeping to \LUA\ but it's not worth the effort. The code
-%D could me made more readable but again, there is no real purpose in it. If needed
-%D I can squeeze out a few more percentages runtime.
-
-% columndistance 'optimized' ... needs checking
-%
-% we don't need the alignment mechanism .. we can just pack the row in a box
-
-\writestatus{loading}{ConTeXt Table Macros / Natural Tables}
-
-% sometimes this helps (with nc going wild): \setupTABLE[maxwidth=100cm]
-%
-% bug: width 3cm is not honored and column becomes too wide as given width is added
-% to distributed width
-%
-% \bTABLE
-% \bTR
-% \bTD test \eTD
-% \bTD \framed[height=3cm]{test} \eTD
-% \bTD[width=3cm] \dorecurse{30}{a } \eTD
-% \bTD \input ward \eTD
-% \eTR
-% \bTR
-% \bTD test \eTD
-% \bTD \framed[height=3cm]{test} \eTD
-% \bTD \dorecurse{30}{a } \eTD
-% \bTD \input ward \eTD
-% \eTR
-% \eTABLE
-
-% \protected\def\startrow {\bTR}
-% \protected\def\stoprow {\eTR}
-% \protected\def\startcell#1\stopcell{\bTD#1\eTD}
-% \let\stopcell \relax
-% \let\startcelltable \bTABLE
-% \let\stopcelltable \eTABLE
-
-% \starttext
-% \startcelltable
-% \startrow \startcell a \stopcell \stoprow
-% \startrow \startcell a \stopcell \stoprow
-% \startrow \startcell a \stopcell \stoprow
-% \startrow \startcell a \stopcell \stoprow
-% \stopcelltable
-% \stoptext
-
-%D As always, this is the n\high{th} version. Much time went in trying to speed up
-%D the many cell calculations, some optimizations were rejected in order not to
-%D complicate this module too much (and in order to prevail extensibility). In the
-%D meantime we've sacrified some speed for readability.
-
-\unprotect
-
-%D The next alternative also takes care of preceding and following white space.
-%D
-%D \startbuffer
-%D \bTABLE[left={(},right={)},top=\startnarrower,bottom=\stopnarrower]
-%D \bTR \bTD something \eTD \eTR
-%D \eTABLE
-%D \stopbuffer
-%D
-%D \typebuffer \getbuffer
-
-\ifdefined\dotagTABLEcell \else \let\dotagTABLEcell \relax \fi % todo: namespace
-\ifdefined\dotagTABLEsignal \else \let\dotagTABLEsignal\relax \fi % todo: namespace
-
-\let\tabl_ntb_next_level\relax
-
-\newtoks\t_tabl_ntb_cell_start
-\newtoks\t_tabl_ntb_cell_stop
-
-\appendtoks
- \naturaltablelocalparameter\c!left
- \delayedbegstrut
-\to \t_tabl_ntb_cell_start
-
-\appendtoks
- \delayedendstrut
- \naturaltablelocalparameter\c!right
-\to \t_tabl_ntb_cell_stop
-
-\appendtoks
- \flushpostponednodedata
- % maybe: \the\neverypar
-\to \t_tabl_ntb_cell_start
-
-\protected\def\tabl_ntb_cell_start
- {% \inhibitblank
- \dotagTABLEcell
- %\tabl_ntb_next_level
- \font_styles_math_reset
- \usenaturaltablelocalstyleandcolor\c!style\c!color
- \everypar\t_tabl_ntb_cell_start
- \font_styles_math_start}
-
-\protected\def\tabl_ntb_cell_stop
- {\font_styles_math_stop
- \ifhmode
- \the\t_tabl_ntb_cell_stop
- \par % added 13/4/2006
- \orelse\ifdim\prevdepth<\zeropoint % =-1000pt ?
- % not sure yet:\naturaltablelocalparameter\c!right
- \vskip-\strutdp
- \else
- \removebottomthings
- \fi}
-
-% maybe:
-%
-% \protected\def\tabl_ntb_cell_stop
-% {\ifhmode
-% \the\t_tabl_ntb_cell_stop
-% \par % added 13/4/2006
-% \else
-% % not sure yet:\naturaltablelocalparameter\c!right
-% \par
-% \ifhmode
-% % \removeunwantedspaces
-% \orelse\ifdim\prevdepth<\zeropoint % =-1000pt ?
-% \vskip-\strutdp
-% \else
-% \removebottomthings
-% \fi
-% \fi}
-
-\newcount\c_tabl_ntb_row
-\newcount\c_tabl_ntb_col
-\newcount\c_tabl_ntb_spn
-
-\newcount\c_tabl_ntb_nx
-\newcount\c_tabl_ntb_ny
-
-\setnewconstant\c_tabl_ntb_cell \plusone
-\setnewconstant\c_tabl_ntb_none \plustwo
-
-\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
-
-\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
-
-\newcount\c_tabl_ntb_encountered_col
-\newcount\c_tabl_ntb_encountered_max
-
-\newtoks\t_tabl_ntb
-\newtoks\t_tabl_ntb_row
-
-\newconstant\c_tabl_tbl_pass
-
-\newtoks\t_tabl_ntb_head
-\newtoks\t_tabl_ntb_next
-\newtoks\t_tabl_ntb_body
-\newtoks\t_tabl_ntb_foot
-
-\newcount\c_tabl_ntb_n_of_head_lines
-\newcount\c_tabl_ntb_n_of_next_lines
-\newcount\c_tabl_ntb_n_of_hdnx_lines
-
-\newdimen\d_tabl_ntb_height
-\newdimen\d_tabl_ntb_width
-
-\newdimen\d_tabl_ntb_leftmargindistance
-\newdimen\d_tabl_ntb_rightmargindistance
-\newdimen\d_tabl_ntb_columndistance
-\newdimen\d_tabl_ntb_maxwidth
-
-\newtoks\everyTABLEpass % public
-
-\newcount\tablecellrows % public (needs checking)
-\newcount\tablecellcolumns % public (needs checking)
-
-\newbox\b_tabl_ntb_final
-
-%D For tagging and export:
-
-\newconstant \c_tabl_ntb_head
-\newconstant \c_tabl_ntb_body
-\newconstant \c_tabl_ntb_foot
-\newconditional \c_tabl_ntb_okay
-
-%D We have already prepared the previous macros for nesting, so we only have to pop
-%D in the right ones:
-
-\newcount\c_tabl_level
-
-\installglobalmacrostack\m_tabl_ntb_saved_row
-\installglobalmacrostack\m_tabl_ntb_saved_col
-
-\protected\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}\push_macro_m_tabl_ntb_saved_row
- \xdef\m_tabl_ntb_saved_col{\the\c_tabl_ntb_col}\push_macro_m_tabl_ntb_saved_col
- \else
- \global\intabletrue
- \fi}
-
-\protected\def\tabl_ntb_table_pop
- {\ifnum\m_tabl_tbl_level>\plusone
- \pop_macro_m_tabl_ntb_saved_row\global\c_tabl_ntb_row\m_tabl_ntb_saved_row
- \pop_macro_m_tabl_ntb_saved_col\global\c_tabl_ntb_col\m_tabl_ntb_saved_col
- \else
- \global\intablefalse
- \fi}
-
-\protected\def\tabl_ntb_next_level
- {\advance\c_tabl_level\plusone
- \edef\m_tabl_tbl_level{\the\c_tabl_level}}
-
-\protected\def\tabl_ntb_prev_level
- {\advance\c_tabl_level\minusone
- \edef\m_tabl_tbl_level{\the\c_tabl_level}}
-
-\tabl_ntb_next_level % go to level 1
-
-\installcorenamespace{naturaltable} % was tbl
-\installcorenamespace{naturaltablelocal} % was tbltbl
-
-\installdirectcommandhandler \??naturaltable {naturaltable} % \??naturaltable
-\installsimpleframedcommandhandler \??naturaltablelocal {naturaltablelocal} \??naturaltablelocal
-
-\permanent\protected\def\bTABLEnested{\tabl_ntb_next_level\bTABLE}
-\permanent\protected\def\eTABLEnested{\eTABLE\tabl_ntb_prev_level}
-
-\installcorenamespace{naturaltabletal}
-\installcorenamespace{naturaltablegal}
-\installcorenamespace{naturaltablenob}
-\installcorenamespace{naturaltabletag}
-\installcorenamespace{naturaltablecol}
-\installcorenamespace{naturaltablerow}
-\installcorenamespace{naturaltablewd}
-\installcorenamespace{naturaltableht}
-\installcorenamespace{naturaltabledp}
-\installcorenamespace{naturaltablewid}
-\installcorenamespace{naturaltablehei}
-\installcorenamespace{naturaltabledis}
-\installcorenamespace{naturaltableaut}
-\installcorenamespace{naturaltablebck}
-%installcorenamespace{naturaltablefwd} % forcedwidth
-\installcorenamespace{naturaltabletxt}
-\installcorenamespace{naturaltablespn}
-\installcorenamespace{naturaltableref}
-\installcorenamespace{naturaltableset}
-\installcorenamespace{naturaltablecell}
-\installcorenamespace{naturaltablesqueeze}
-\installcorenamespace{naturaltabletok}
-
-\letvalue{\??naturaltablesqueeze }\donefalse
-\letvalue{\??naturaltablesqueeze\v!fit }\donetrue
-\letvalue{\??naturaltablesqueeze\v!fixed}\donetrue
-\letvalue{\??naturaltablesqueeze\v!broad}\donetrue
-\letvalue{\??naturaltablesqueeze\v!local}\donetrue
-
-\def\tabl_ntb_let_gal{\global\letcsname\??naturaltablegal\m_tabl_tbl_level\endcsname}
-\def\tabl_ntb_get_gal{\csname\??naturaltablegal\m_tabl_tbl_level\endcsname}
-
-\def\tabl_ntb_let_tal#1{\global\letcsname\??naturaltabletal\m_tabl_tbl_level:\number#1\endcsname}
-\def\tabl_ntb_get_tal#1{\csname\??naturaltabletal\m_tabl_tbl_level:\number#1\endcsname}
-
-\def\tabl_ntb_set_nob#1{\letcsname\??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{\edefcsname\??naturaltabletag\m_tabl_tbl_level:\number#1:\number#2\endcsname}
-\def\tabl_ntb_set_col#1#2{\edefcsname\??naturaltablecol\m_tabl_tbl_level:\number#1:\number#2\endcsname}
-\def\tabl_ntb_set_row#1#2{\edefcsname\??naturaltablerow\m_tabl_tbl_level:\number#1:\number#2\endcsname}
-
-\def\tabl_ntb_let_tag#1#2{\letcsname\??naturaltabletag\m_tabl_tbl_level:\number#1:\number#2\endcsname}
-\def\tabl_ntb_let_col#1#2{\letcsname\??naturaltablecol\m_tabl_tbl_level:\number#1:\number#2\endcsname}
-\def\tabl_ntb_let_row#1#2{\letcsname\??naturaltablerow\m_tabl_tbl_level:\number#1:\number#2\endcsname}
-
-%def\tabl_ntb_set_wd#1#2{\global\edefcsname\??naturaltablewd\m_tabl_tbl_level:\number#1:\number#2\endcsname} % global !
-\def\tabl_ntb_set_ht#1#2{\global\edefcsname\??naturaltableht\m_tabl_tbl_level:\number#1:\number#2\endcsname} % global !
-
-%def\tabl_ntb_let_wd#1#2{\global\letcsname\??naturaltablewd\m_tabl_tbl_level:\number#1:\number#2\endcsname} % global !
-\def\tabl_ntb_let_ht#1#2{\global\letcsname\??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{\global\edefcsname\??naturaltablewid\m_tabl_tbl_level:\number#1\endcsname} % {#2} global !
-\def\tabl_ntb_set_hei#1{\global\edefcsname\??naturaltablehei\m_tabl_tbl_level:\number#1\endcsname} % {#2} global !
-\def\tabl_ntb_set_dis#1{\global\edefcsname\??naturaltabledis\m_tabl_tbl_level:\number#1\endcsname} % {#2} global !
-\def\tabl_ntb_set_aut#1{\global\edefcsname\??naturaltableaut\m_tabl_tbl_level:\number#1\endcsname} % {#2} global !
-
-\def\tabl_ntb_let_wid#1{\global\letcsname\??naturaltablewid\m_tabl_tbl_level:\number#1\endcsname} % {#2} global !
-\def\tabl_ntb_let_hei#1{\global\letcsname\??naturaltablehei\m_tabl_tbl_level:\number#1\endcsname} % {#2} global !
-\def\tabl_ntb_let_dis#1{\global\letcsname\??naturaltabledis\m_tabl_tbl_level:\number#1\endcsname} % {#2} global !
-\def\tabl_ntb_let_aut#1{\global\letcsname\??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\lastnamedcs\else\zeropoint\fi}
-\def\tabl_ntb_get_hei#1{\ifcsname\??naturaltablehei\m_tabl_tbl_level:\number#1\endcsname\lastnamedcs\else\zeropoint\fi}
-\def\tabl_ntb_get_dis#1{\ifcsname\??naturaltabledis\m_tabl_tbl_level:\number#1\endcsname\lastnamedcs\else\zeropoint\fi}
-\def\tabl_ntb_get_aut#1{\csname \??naturaltableaut\m_tabl_tbl_level:\number#1\endcsname}
-
-\def\tabl_ntb_let_bck#1#2{\global\expandafter\chardef\csname\??naturaltablebck\m_tabl_tbl_level:\number#1:\number#2\endcsname}
-
-\def\tabl_ntb_get_bck#1#2{\csname\??naturaltablebck\m_tabl_tbl_level:\number#1:\number#2\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}
-
-%D If we ever run into memory issues we can do:
-%
-% \def\tabl_ntb_let_tag#1#2#3%
-% {\ifx#3\c_tabl_ntb_none\else
-% \letcsname\??naturaltabletag\m_tabl_tbl_level:\number#1:\number#2\endcsname#3%
-% \fi}
-%
-% \def\tabl_ntb_get_tag#1#2%
-% {\ifcsname\??naturaltabletag\m_tabl_tbl_level:\number#1:\number#2\endcsname
-% \lastnamedcs
-% \else
-% \c_tabl_ntb_none
-% \fi}
-
-\def\tabl_ntb_let_ref #1#2{\global\letcsname\??naturaltableref\m_tabl_tbl_level:\number#1:\number#2\endcsname}
-\def\tabl_ntb_set_ref #1#2{\global\edefcsname\??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\tabl_ntb_get_ref #1#2{\begincsname\??naturaltableref\m_tabl_tbl_level:\number#1:\number#2\endcsname}
-
-\def\tabl_ntb_set_spn #1{\letcsname\??naturaltablespn\m_tabl_tbl_level:\number#1\endcsname \!!plusone}
-\def\tabl_ntb_spn_doifelse#1{\ifcase0\csname\??naturaltablespn\m_tabl_tbl_level:\number#1\endcsname\relax % could be inlined
- \expandafter\secondoftwoarguments % unset
- \else
- \expandafter\firstoftwoarguments % a span
- \fi}
-
-\protected\def\tabl_ntb_set_txt_process#1#2#3#4#5#6%
- {\defcsname\??naturaltabletxt\m_tabl_tbl_level:\number#1:\number#2\endcsname
- {\tabl_ntb_cell_process{#3}{#4}[#5]{\tabl_ntb_next_level#6\tabl_ntb_prev_level}}}
-
-\def\tabl_ntb_get_txt#1#2%
- {\csname\??naturaltabletxt\m_tabl_tbl_level:\number#1:\number#2\endcsname}
-
-% to be changed:
-
-\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
-\newif\ifautoTBLrowspan \autoTBLrowspantrue
-\newif\ifautoTBLemptycell \autoTBLemptycelltrue
-\newif\ifautoTBLcheckwidth \autoTBLcheckwidthtrue
-\newif\ifappendTBLsetups \appendTBLsetupstrue
-\newif\ifenableTBLbreak \enableTBLbreakfalse
-\newif\ifmultipleTBLheads \multipleTBLheadsfalse
-\newif\iftightTBLrowspan \tightTBLrowspantrue
-\newif\iftightTBLcolspan \tightTBLcolspanfalse
-
-\newconditional \c_tabl_ntb_trace_widths
-
-\installtextracker
- {tables.natural.widths}
- {\settrue \c_tabl_ntb_trace_widths}
- {\setfalse\c_tabl_ntb_trace_widths}
-
-% so far
-
-\protected\def\tabl_ntb_cell_process#1#2[#3]{}
-
-\permanent\protected\def\bTC#1\eTC{\bTD#1\eTD} \let\eTC\relax
-\permanent\protected\def\bTX#1\eTX{\bTD#1\eTD} \let\eTX\relax
-\permanent\protected\def\bTY#1\eTY{\bTR#1\eTR} \let\eTY\relax
-
-\let\tabl_ntb_parameters_get\setupcurrentnaturaltablelocal
-
-\permanent\tolerant\protected\def\setupTABLE[#1]#*[#2]#*[#3]%
- {\ifarguments
- \expandafter\gobblethreeoptionals
- \or
- \expandafter\tabl_ntb_setup_one
- \or
- \expandafter\tabl_ntb_setup_two
- \or
- \expandafter\tabl_ntb_setup_three
- \fi[#1][#2][#3]}
-
-\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]{\ifcsname\??naturaltablesetupthree#1\endcsname\expandafter\lastnamedcs\else\expandafter\tabl_ntb_setup_un\fi[#1]}
-\def\tabl_ntb_setup_two [#1]{\ifcsname\??naturaltablesetuptwo #1\endcsname\expandafter\lastnamedcs\else\expandafter\tabl_ntb_setup_ux\fi[#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
- \enforced\def\tabl_ntb_parameters_get[##1]%
- {\setvalue{\??naturaltableset\m_tabl_tbl_level:#1}{\tabl_ntb_parameters_get[##1,#2]}}%
- \csname\??naturaltableset\m_tabl_tbl_level:#1\endcsname
- \enforced\let\tabl_ntb_parameters_get\setupcurrentnaturaltablelocal
- \else
- \setvalue{\??naturaltableset\m_tabl_tbl_level:#1}{\tabl_ntb_parameters_get[#2]}%
- \fi
- \else
- \setvalue{\??naturaltableset\m_tabl_tbl_level:#1}{\tabl_ntb_parameters_get[#2]}%
- \fi}
-
-% % \setupTABLE [y] [first][background=color,backgroundcolor=blue,frame=off,bottomframe=on,topframe=on,framecolor=white]
-% \setupTABLE [first][first][backgroundcorner=2,corner=10,frame=on]
-% \setupTABLE [last] [first][backgroundcorner=4,corner=12,frame=on]
-%
-% \setupTABLE [row] [each] [background=color,backgroundcolor=blue,frame=on,framecolor=white]
-% \setupTABLE [first][2] [corner=8]
-% \setupTABLE [last] [2] [corner=5]
-% \setupTABLE [first][last] [corner=7]
-% \setupTABLE [last] [last] [corner=6]
-%
-% \startTEXpage
-% \bTABLE[frame=off,align=middle]
-% \bTR \bTD one \eTD \bTD two \eTD \bTD three \eTD \eTR
-% \bTR \bTD first \eTD \bTD second \eTD \bTD third \eTD \eTR
-% \bTR \bTD alpha \eTD \bTD beta \eTD \bTD gamma \eTD \eTR
-% \eTABLE
-% \stopTEXpage
-%
-% \setupTABLE [first] [two][corner=2] % special case
-% \setupTABLE [last] [two][corner=4] % special case
-%
-% % % \setupTABLE [one] [first] ... special case of span
-%
-% \startTEXpage
-% \bTABLE[frame=off,align=middle]
-% \bTR \bTD one \eTD \bTD two \eTD \bTD three \eTD \eTR
-% \bTR \bTD first \eTD \bTD second \eTD \bTD third \eTD \eTR
-% \eTABLE
-% \stopTEXpage
-
-%D By default rowspans are tight but you can change that:
-%D
-%D \startbuffer
-%D \bTABLE
-%D \bTR[height=20pt] \bTH 1. col \eTH \bTH 2. col \eTH \eTR
-%D \bTR[height=20pt] \bTD 1 row in 1. col \eTD \bTD[nr=2] 2 rows in 2. col \eTD \eTR
-%D \bTR[height=20pt] \bTD[nr=2] 2 rows in 1. col\eTD \eTR
-%D \bTR[height=20pt] \bTD[nr=3] 3 rows in 2. col \eTD \eTR
-%D \bTR[height=20pt] \bTD 1 row in 1. col \eTD \eTR
-%D \bTR[height=20pt] \bTD 1 row in 1. col \eTD \eTR
-%D \eTABLE
-%D
-%D \bTABLE
-%D \bTR[height=20pt] \bTH 2. col \eTH \bTH 1. col \eTH \eTR
-%D \bTR[height=20pt] \bTD[nr=2] 2 rows in 2. col \eTD \bTD 1 row in 1. col \eTD \eTR
-%D \bTR[height=20pt] \bTD[nr=2] 2 rows in 1. col\eTD \eTR
-%D \bTR[height=20pt] \bTD[nr=3] 3 rows in 2. col \eTD \eTR
-%D \bTR[height=20pt] \bTD 1 row in 1. col \eTD \eTR
-%D \bTR[height=20pt] \bTD 1 row in 1. col \eTD \eTR
-%D \eTABLE
-%D \stopbuffer
-%D
-%D \typebuffer
-%D
-%D \getbuffer
-%D
-%D With \type {\tightTBLrowspanfalse} we get:
-%D
-%D \start \tightTBLrowspanfalse \getbuffer \stop
-
-\let\tabl_ntb_setup_section\relax
-
-\protected\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:}%
- % each each
- \begincsname\m_tabl_ntb_prefix\c!x\v!each\c!y\v!each\endcsname
- \begincsname\m_tabl_ntb_prefix\c!y\v!each\endcsname
- \begincsname\m_tabl_ntb_prefix\c!x\v!each\endcsname
- % odd even
- \begincsname\m_tabl_ntb_prefix\c!y\v!oddeven\m_tabl_ntb_positive_row\endcsname
- \begincsname\m_tabl_ntb_prefix\c!x\v!oddeven\m_tabl_ntb_positive_col\endcsname
- \begincsname\m_tabl_ntb_prefix\c!x\v!oddeven\m_tabl_ntb_positive_col\c!y\v!oddeven\m_tabl_ntb_positive_row\endcsname
- % row/col number combinations
- \begincsname\m_tabl_ntb_prefix\c!y\m_tabl_ntb_positive_row\endcsname
- \begincsname\m_tabl_ntb_prefix\c!y\m_tabl_ntb_negative_row\endcsname
- \naturaltablelocalparameter\c!extras
- \letnaturaltablelocalparameter\c!extras\relax % new, see x-fo
- \begincsname\m_tabl_ntb_prefix\c!x\m_tabl_ntb_positive_col\endcsname
- \begincsname\m_tabl_ntb_prefix\c!x\m_tabl_ntb_negative_col\endcsname
- \naturaltablelocalparameter\c!extras
- \letnaturaltablelocalparameter\c!extras\relax % new, see x-fo
- % first/last combinations
- \ifnum\m_tabl_ntb_positive_row=\plusone
- \begincsname\m_tabl_ntb_prefix\c!y\v!first\endcsname
- \begincsname\m_tabl_ntb_prefix\c!x\m_tabl_ntb_positive_col\c!y\v!first\endcsname
- \fi
- \ifnum\m_tabl_ntb_positive_col=\plusone
- \begincsname\m_tabl_ntb_prefix\c!x\v!first\endcsname
- \begincsname\m_tabl_ntb_prefix\c!x\v!first\c!y\m_tabl_ntb_positive_row\endcsname
- \fi
- \ifnum\m_tabl_ntb_positive_row=\c_tabl_ntb_maximum_row\relax
- \begincsname\m_tabl_ntb_prefix\c!y\v!last\endcsname
- \begincsname\m_tabl_ntb_prefix\c!x\m_tabl_ntb_positive_col\c!y\v!last\endcsname
- \fi
- \ifnum\m_tabl_ntb_positive_col=\c_tabl_ntb_maximum_col\relax
- \begincsname\m_tabl_ntb_prefix\c!x\v!last\endcsname
- \begincsname\m_tabl_ntb_prefix\c!x\v!last\c!y\m_tabl_ntb_positive_row\endcsname
- \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
- \begincsname\m_tabl_ntb_prefix\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
- \begincsname\m_tabl_ntb_prefix\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
- \begincsname\m_tabl_ntb_prefix\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
- \begincsname\m_tabl_ntb_prefix\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
- \begincsname\m_tabl_ntb_prefix\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
- \begincsname\m_tabl_ntb_prefix\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
- \begincsname\m_tabl_ntb_prefix\c!x\v!one\c!y\v!first\endcsname
- \fi
- \ifnum\m_tabl_ntb_positive_row=\c_tabl_ntb_maximum_row\relax
- \begincsname\m_tabl_ntb_prefix\c!x\v!one\c!y\v!last\endcsname
- \fi
- \fi
- % header things
- \ifnum#1>\c_tabl_ntb_n_of_hdnx_lines\else
- \begincsname\m_tabl_ntb_prefix\v!header\v!each\endcsname
- \begincsname\m_tabl_ntb_prefix\v!header\m_tabl_ntb_positive_col\endcsname
- \fi
- % explicit cells
- \begincsname\m_tabl_ntb_prefix\c!x\m_tabl_ntb_positive_col\c!y\m_tabl_ntb_positive_row\endcsname
- \begincsname\m_tabl_ntb_prefix\c!x\m_tabl_ntb_negative_col\c!y\m_tabl_ntb_negative_row\endcsname
- % local
- \begincsname\m_tabl_ntb_prefix\c!y++\m_tabl_ntb_positive_row\endcsname
- % done
- \relax}
-
-% we cannot use +n (checking on number/last/first would slow down too much)
-%
-% \setupTABLE[r] [2][color=red]
-% \setupTABLE[r] [-2][color=red]
-% \setupTABLE[c] [2][color=green]
-% \setupTABLE[c] [-2][color=green]
-% \setupTABLE[4] [4][color=blue]
-% \setupTABLE[-4][-4][color=blue]
-%
-% \bTABLE
-% \dorecurse{10}{\bTR \dorecurse{6}{\bTD xxx \eTD} \eTR}
-% \eTABLE
-
-\let\m_tabl_ntb_before_split\empty
-\let\m_tabl_ntb_after_split \empty
-\let\m_tabl_ntb_same_page \empty
-
-% split + page:
-%
-% \bTABLE[split=yes]
-% \bTR \bTD left \eTD\bTD right \eTD\eTR
-% \bTR[after=\page] \bTD left \eTD\bTD right \eTD\eTR
-% \bTR \bTD left \eTD\bTD right \eTD\eTR
-% \eTABLE
-
-\protected\def\tabl_ntb_tr
- {\c_tabl_ntb_running_col\zerocount
- \c_tabl_ntb_encountered_col\zerocount
- \advance\c_tabl_ntb_maximum_row\plusone
- \iffirstargument
- \expandafter\tabl_ntb_tr_yes
- \else
- \expandafter\gobbleoneoptional
- \fi}
-
-\def\tabl_ntb_tr_yes[#1]%
- {\setvalue{\??naturaltableset\m_tabl_tbl_level:\c!y++\the\c_tabl_ntb_maximum_row}{\setupcurrentnaturaltablelocal[#1]}}
-
-\def\m_tabl_ntb_default_nr{\naturaltableparameter\c!nr}
-\def\m_tabl_ntb_default_nc{\naturaltableparameter\c!nc}
-
-\protected\def\tabl_ntb_td
- {\advance\c_tabl_ntb_encountered_col\plusone
- \iffirstargument
- \expandafter\tabl_ntb_td_yes
- \else
- \expandafter\tabl_ntb_td_nop
- \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}%
- %
- \ifempty\m_tabl_ntb_n
- \global\advance\c_tabl_ntb_spn\c_tabl_ntb_nx\relax
- \orelse\ifnum\m_tabl_ntb_n=\c_tabl_ntb_running_col\else
- \tabl_ntb_td_pass_n{#1}%
- \fi
- \ifempty\m_tabl_ntb_m \else
- \ifnum\m_tabl_ntb_m=\c_tabl_ntb_running_col\else
- \tabl_ntb_td_pass_m{#1}%
- \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}%
- % 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
- \fi
- \else
- \tabl_ntb_cell_preset
- \fi
- \else
- \tabl_ntb_cell_preset
- \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}%
- % the action key will change!
- \tabl_ntb_set_ref\c_tabl_ntb_maximum_row\c_tabl_ntb_running_col{\naturaltableparameter\c!action}%
- % 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}%
- \ifnum\c_tabl_ntb_encountered_col>\c_tabl_ntb_encountered_max
- \c_tabl_ntb_encountered_max\c_tabl_ntb_encountered_col
- \fi}
-
-\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}%
- \ifnum\c_tabl_ntb_encountered_col>\c_tabl_ntb_encountered_max
- \c_tabl_ntb_encountered_max\c_tabl_ntb_encountered_col
- \fi}
-
-\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
- % 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
- \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
-%D \bTABLE[width=3em]
-%D \bTR\bTD d1 \eTD\bTD[n=2] d2 \eTD\bTD[n=5] d5 \eTD\bTD[n=7] d7 \eTD\eTR
-%D \bTR\bTD f1 \eTD\bTD[n=4] f4 \eTD\bTD[n=5] f5 \eTD\bTD[n=7] f7 \eTD\eTR
-%D \eTABLE
-%D \stopbuffer
-%D
-%D \typebuffer \getbuffer
-%D
-%D \startbuffer
-%D \bTABLE[width=3em]
-%D \bTR\bTD d1 \eTD\bTD[m=2] d2 \eTD\bTD[m=5] d5 \eTD\bTD[m=7] d7 \eTD\eTR
-%D \bTR\bTD f1 \eTD\bTD[m=4] f4 \eTD\bTD[m=5] f5 \eTD\bTD[m=7] f7 \eTD\eTR
-%D \eTABLE
-%D \stopbuffer
-%D
-%D \typebuffer \getbuffer
-%D
-%D \startbuffer
-%D \bTABLE[frame=on]
-%D \bTR \bTH[nc=3] One \eTH \bTH[m=4] Four \eTH\eTR
-%D \bTR \bTD a \eTD\bTD b \eTD\bTD c \eTD\bTD d \eTD\eTR
-%D \eTABLE
-%D
-%D \bTABLE[frame=on]
-%D \bTR \bTH[nr=2] One \eTH \bTH[m=3] Three \eTH\eTR
-%D \bTR \bTD[m=3] a \eTD\bTD b \eTD\bTD c \eTD\bTD d \eTD\eTR
-%D \bTR \bTD[m=3] a \eTD\bTD b \eTD\bTD c \eTD\bTD d \eTD\eTR
-%D \eTABLE
-%D \stopbuffer
-%D
-%D \typebuffer \getbuffer
-
-\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}
-
-%D Vit Zyka needed the option to create a distance between columns, so I added
-%D support for individual column distances.
-%D
-%D \startbuffer
-%D % \setupTABLE[c][each][distance=2em]
-%D \setupTABLE[c][1][distance=2em]
-%D \setupTABLE[c][2][distance=3em]
-%D
-%D \bTABLE
-%D \bTR \bTD test \eTD \bTD test \eTD \bTD test \eTD \eTR
-%D \bTR \bTD[nx=2] test \eTD \bTD test \eTD \eTR
-%D \bTR \bTD test \eTD \bTD[nx=2] test \eTD \eTR
-%D \eTABLE
-%D
-%D \bTABLE[option=stretch]
-%D \bTR \bTD test \eTD \bTD test \eTD \bTD test \eTD \eTR
-%D \bTR \bTD[nx=2] test \eTD \bTD test \eTD \eTR
-%D \bTR \bTD test \eTD \bTD[nx=2] test \eTD \eTR
-%D \eTABLE
-%D \stopbuffer
-%D
-%D \typebuffer \startlinecorrection \getbuffer \stoplinecorrection
-%D
-%D and he provided patches for the global left and right margin distances as well as
-%D the columndistance (although i changed the names -). Here is his testcase:
-%D
-%D \startbuffer
-%D \framed[offset=overlay]\bgroup
-%D \setupTABLE[column][2][align=left]%
-%D \setupTABLE[column][3][align=right]%
-%D \bTABLE[columndistance=2cm,leftmargindistance=.3cm,rightmargindistance=.5cm]
-%D \bTR \bTH[nc=3] Table head\eTH \eTR
-%D \bTR \bTD[nc=2] AB\eTD \bTD C\eTD \eTR
-%D \bTR \bTD[nc=2,align=left] AB\eTD \bTD C\eTD \eTR
-%D \bTR \bTD[nc=2,align=middle] AB\eTD \bTD C\eTD \eTR
-%D \bTR \bTD A\eTD \bTD B\eTD \bTD C\eTD \eTR
-%D \bTR \bTD Aa\eTD \bTD Bb\eTD \bTD Cccc\eTD \eTR
-%D \bTR \bTD[nc=3,align=middle] ABC\eTD \eTR
-%D \eTABLE
-%D \egroup
-%D \stopbuffer
-%D
-%D \typebuffer \startlinecorrection \getbuffer \stoplinecorrection
-
-% to be done: head <raw> foot, dus state var
-
-\let\eTABLEhead\relax
-\let\eTABLEnext\relax
-\let\eTABLEbody\relax
-\let\eTABLEfoot\relax
-
-\permanent\tolerant\protected\def\bTABLEhead[#1]#:#2\eTABLEhead{\appendtoks\tabl_ntb_section[#1]{#2}\to\t_tabl_ntb_head}
-\permanent\tolerant\protected\def\bTABLEnext[#1]#:#2\eTABLEnext{\appendtoks\tabl_ntb_section[#1]{#2}\to\t_tabl_ntb_next}
-\permanent\tolerant\protected\def\bTABLEbody[#1]#:#2\eTABLEbody{\appendtoks\tabl_ntb_section[#1]{#2}\to\t_tabl_ntb_body}
-\permanent\tolerant\protected\def\bTABLEfoot[#1]#:#2\eTABLEfoot{\appendtoks\tabl_ntb_section[#1]{#2}\to\t_tabl_ntb_foot}
-
-\def\tabl_ntb_section[#1]#2% also used in tabl-nte
- {\protected\def\tabl_ntb_setup_section{\setupcurrentnaturaltablelocal[#1]}%
- #2%
- \let\tabl_ntb_setup_section\relax}
-
-\def\tabl_ntb_preset_parameters% each odd|even level / can be sped up but only once per table
- {\begincsname\??naturaltableset\m_tabl_tbl_level:\v!start\v!each\endcsname
- \begincsname\??naturaltableset\m_tabl_tbl_level:\v!start\v!oddeven\m_tabl_tbl_level\endcsname
- \begincsname\??naturaltableset\m_tabl_tbl_level:\v!start\m_tabl_tbl_level\endcsname}
-
-\permanent\tolerant\protected\def\bTABLE[#1]%
- {\tabl_ntb_table_push
- % box not here
- \bgroup
- \pushpostponednodedata
- \t_tabl_ntb_head\emptytoks
- \t_tabl_ntb_next\emptytoks
- \t_tabl_ntb_body\emptytoks
- \t_tabl_ntb_foot\emptytoks
- \ifhmode\kern\zeropoint\fi % blocks \removeunwantedspaces: check this on icare handelingsschema
- \resetcharacteralign % new
- \setupcurrentnaturaltablelocal[\c!align={\v!right,\v!broad,\v!high},#1]%
- %
- \d_tabl_ntb_leftmargindistance \naturaltablelocalparameter\c!leftmargindistance\relax
- \d_tabl_ntb_rightmargindistance\naturaltablelocalparameter\c!rightmargindistance\relax
- \d_tabl_ntb_columndistance \naturaltablelocalparameter\c!columndistance\relax
- \d_tabl_ntb_maxwidth \naturaltablelocalparameter\c!maxwidth\relax
- %
- \usesetupsparameter\naturaltablelocalparameter
- \doifelse{\naturaltablelocalparameter\c!textwidth}\v!local
- {\hsize\availablehsize}
- {\hsize\naturaltablelocalparameter\c!textwidth}%
- \enableTBLbreakfalse
- \multipleTBLheadsfalse
- \autoTBLspreadfalse
- \tightTBLcolspanfalse
- \processaction
- [\naturaltablelocalparameter\c!split]
- [ \v!yes=>\enableTBLbreaktrue,
- \v!repeat=>\enableTBLbreaktrue\multipleTBLheadstrue,
- \v!auto=>\ifinsidesplitfloat\enableTBLbreaktrue\fi]
- \processaction
- [\naturaltablelocalparameter\c!header]
- [\v!repeat=>\multipleTBLheadstrue]%
- \tabl_ntb_preset_parameters
- \processallactionsinset
- [\naturaltablelocalparameter\c!option]
- [\v!stretch=>\autoTBLspreadtrue,%
- \v!tight=>\tightTBLcolspantrue]%
- \linewidth\naturaltablelocalparameter\c!rulethickness % 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
- \enforced\let\bTR\tabl_ntb_bTR
- \enforced\let\bTD\tabl_ntb_bTD
- \enforced\let\bTH\tabl_ntb_bTH
- \enforced\let\bTN\tabl_ntb_bTN}
-
-\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
-
-% there is no gain in a \doifelsenextoptionalcs variant
-
-% todo with tolerant:
-
-\permanent\protected\def\tabl_ntb_bTR{\dosingleempty\tabl_ntb_tr} % also used in tabl-nte
-\permanent\protected\def\tabl_ntb_bTD{\dosingleempty\tabl_ntb_td} % also used in tabl-nte
-\permanent\protected\def\tabl_ntb_bTH{\dosingleempty\tabl_ntb_th} % also used in tabl-nte
-\permanent\protected\def\tabl_ntb_bTN{\dosingleempty\tabl_ntb_tn} % also used in tabl-nte
-
-% permits \expanded{\bTD ... \eTD}
-
-\permanent\let\bTR\relax \permanent\protected\def\eTR{\ignorespaces} % handy in case we use a macro to generate rows
-\permanent\let\bTD\relax \permanent\protected\def\eTD{\ignorespaces}
-\permanent\let\bTH\relax \permanent\protected\def\eTH{\ignorespaces}
-\permanent\let\bTN\relax \permanent\protected\def\eTN{\ignorespaces}
-
-\protected\def\eTABLE % beware, we need to get rid of spurious spaces when in hmode
- {% tricky and dirty order -)
- \setfalse\c_tabl_ntb_okay
- % head
- \doifelsesometoks\t_tabl_ntb_head % slow, better a flag
- {\c_tabl_ntb_head\numexpr\c_tabl_ntb_maximum_row+\plusone\relax
- \the\t_tabl_ntb_head
- \c_tabl_ntb_n_of_head_lines\c_tabl_ntb_maximum_row\relax
- \doifelsesometoks\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_head\zerocount
- \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}%
- % body
- \c_tabl_ntb_body\numexpr\c_tabl_ntb_maximum_row+\plusone\relax
- \the\t_tabl_ntb_body
- % foot
- \doifelsesometoks\t_tabl_ntb_foot
- {\c_tabl_ntb_foot\numexpr\c_tabl_ntb_maximum_row+\plusone\relax
- \the\t_tabl_ntb_foot}%
- {\c_tabl_ntb_foot\zerocount}%
- % done
- \removeunwantedspaces % only if hmode
- % finish cells
- \tabl_ntb_loop_one
- % to be sure
- \tabl_ntb_loop_two
- % check and do
- \ifcase\c_tabl_ntb_maximum_col\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}%
- \removeunwantedspaces % only if hmode
- \tabl_ntb_table_stop
- \stopTBLprocessing
- % wrong ! ! ! better to have an auto-offset-overlay
- % \ifnum\m_tabl_tbl_level>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]}%
- % \par}%
- % \blank
- % \fi
- \poppostponednodedata
- \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}
-
-\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}
-
-\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}}%
- {\c!option=\v!tight}{\strut\kern\scaledpoint}% the kern forces the tight
- \fi}
-
-\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_row_start
- {\t_tabl_ntb_row\emptytoks}
-
-\def\tabl_ntb_row_stop
- {\ifenableTBLbreak
- \tabl_ntb_row_stop_split
- \else
- \tabl_ntb_row_stop_boxed
- \fi}
-
-\def\tabl_ntb_row_stop_boxed
- {% \noindent % no, else double leftskip in narrower
- \etoksapp\t_tabl_ntb
- {% no need for init
- \tabl_ntb_row_align_start
- \the\t_tabl_ntb_row
- \tabl_ntb_row_align_stop}}
-
-\def\tabl_ntb_row_stop_split
- {\ifcsname\??naturaltableset\m_tabl_tbl_level:\c!y++\the\c_tabl_ntb_current_row\endcsname
- \tabl_ntb_row_stop_split_yes
- \else
- \tabl_ntb_row_stop_split_nop
- \fi}
-
-\def\tabl_ntb_row_stop_split_nop
- {\etoksapp\t_tabl_ntb
- {\tabl_ntb_row_align_reset
- \tabl_ntb_row_align_start
- \the\t_tabl_ntb_row
- \tabl_ntb_row_align_stop}}
-
-\def\tabl_ntb_row_stop_split_yes
- {\begingroup
- \csname\??naturaltableset\m_tabl_tbl_level:\c!y++\the\c_tabl_ntb_current_row\endcsname
- \xdef\m_tabl_ntb_before_split{\naturaltablelocalparameter\c!before}% to be checked
- \xdef\m_tabl_ntb_after_split {\naturaltablelocalparameter\c!after}% to be checked
- \xdef\m_tabl_ntb_same_page {\naturaltablelocalparameter\c!samepage}%
- \endgroup
- \etoksapp\t_tabl_ntb
- {\tabl_ntb_row_align_set{\m_tabl_ntb_before_split}{\m_tabl_ntb_after_split}{\m_tabl_ntb_same_page}%
- \tabl_ntb_row_align_start
- \the\t_tabl_ntb_row
- \tabl_ntb_row_align_stop}}
-
-\protected\def\tabl_ntb_row_align_set#1#2#3%
- {\xdef\m_tabl_ntb_before_split{#1}%
- \xdef\m_tabl_ntb_after_split {#2}%
- \xdef\m_tabl_ntb_same_page {#3}}
-
-\protected\def\tabl_ntb_row_align_reset
- {\glet\m_tabl_ntb_before_split\empty
- \glet\m_tabl_ntb_after_split \empty
- \glet\m_tabl_ntb_same_page \empty}
-
-\def\tabl_ntb_prelocate_error
- {\writestatus\m!TABLE{fatal error: use \string\prelocateTBLrows\space to increase table memory (now: \the\c_tabl_prelocated_rows)}}
-
-% \prelocateTBLrows{1000} % may speed up large tables
-
-\permanent\protected\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
- \tabl_ntb_prelocate_okay
- \else
- \tabl_ntb_prelocate_error
- \fi}%
- \def\tabl_ntb_row_stop
- {\etoksapp\t_tabl_ntb
- {\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\tabl_ntb_prelocate_okay
- {\expandafter\let\expandafter\t_tabl_ntb_row\csname\??naturaltabletok\the\c_tabl_ntb_row\endcsname\t_tabl_ntb_row\emptytoks}
-
-%D We use aligments to handle the empty (skipped) columns, so that we don't have to
-%D (re|)|calculate these.
-
-\let\m_tabl_ntb_saved_row\!!zerocount
-\let\m_tabl_ntb_saved_col\!!zerocount
-
-\def\tabl_ntb_start_tagged
- {\scratchcounter\numexpr\c_tabl_ntb_row+\plusone\relax
- \ifnum\scratchcounter=\c_tabl_ntb_head
- \ifconditional\c_tabl_ntb_okay
- \dostoptagged
- \else
- \settrue\c_tabl_ntb_okay
- \fi
- \dostarttagged\t!tablehead\empty
- \orelse\ifnum\scratchcounter=\c_tabl_ntb_body
- \ifconditional\c_tabl_ntb_okay
- \dostoptagged
- \else
- \settrue\c_tabl_ntb_okay
- \fi
- \dostarttagged\t!tablebody\empty
- \orelse\ifnum\scratchcounter=\c_tabl_ntb_foot
- \ifconditional\c_tabl_ntb_okay
- \dostoptagged
- \else
- \settrue\c_tabl_ntb_okay
- \fi
- \dostarttagged\t!tablefoot\empty
- \fi
- \dostarttagged\t!tablerow\empty}
-
-\def\tabl_ntb_stop_tagged
- {\dostoptagged
- \ifconditional\c_tabl_ntb_okay
- \scratchcounter\numexpr\c_tabl_ntb_row+\plustwo\relax
- \ifnum\scratchcounter=\c_tabl_ntb_body
- \dostoptagged
- \setfalse\c_tabl_ntb_okay
- \orelse\ifnum\scratchcounter=\c_tabl_ntb_foot
- \dostoptagged
- \setfalse\c_tabl_ntb_okay
- \orelse\ifnum\scratchcounter>\c_tabl_ntb_maximum_row
- \dostoptagged
- \setfalse\c_tabl_ntb_okay
- \fi
- \fi}
-
-\protected\def\tabl_ntb_row_align_start
- {\global\advance\c_tabl_ntb_row\plusone
- \global\c_tabl_ntb_col\plusone
- \global\c_tabl_ntb_spn\zerocount
- \tabl_ntb_row_align_start_inject
- \ifconditional\c_strc_tags_enabled
- \tabl_ntb_start_tagged
- \fi
- \hbox\bgroup
- \kern\dimexpr\d_tabl_ntb_leftmargindistance\relax}
-
-\protected\def\tabl_ntb_row_align_stop
- {\kern\dimexpr\d_tabl_ntb_rightmargindistance-\d_tabl_ntb_columndistance\relax
- \egroup
- \ifconditional\c_strc_tags_enabled
- \tabl_ntb_stop_tagged
- \fi
- \tabl_ntb_row_align_stop_inject}
-
-\protected\def\tabl_ntb_before_page
- {\ifx\m_tabl_ntb_same_page\v!before
- % \blank[\v!samepage,\v!strong]%
- \unpenalty
- \nobreak
- \orelse\ifx\m_tabl_ntb_same_page\v!both
- % \blank[\v!samepage,\v!strong]%
- \unpenalty
- \nobreak
- \fi}
-
-\protected\def\tabl_ntb_after_page
- {\ifnum\c_tabl_ntb_row>\c_tabl_ntb_n_of_head_lines
- \ifnum\tabl_ntb_get_nob\c_tabl_ntb_row=\zerocount
- \unpenalty
- \ifx\m_tabl_ntb_same_page\v!after
- % \blank[\v!samepage,\v!strong]%
- \nobreak
- \orelse\ifx\m_tabl_ntb_same_page\v!both
- % \blank[\v!samepage,\v!strong]%
- \nobreak
- \else
- % \blank[\v!preference,\v!weak]%
- \allowbreak
- \fi
- \fi
- \else
- % \blank[\v!preference,\v!weak]%
- \allowbreak % else no proper head split off
- \fi}
-
-\protected\def\tabl_ntb_inbetween
- {\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
- \edef\p_spaceinbetween{\naturaltablelocalparameter\c!spaceinbetween}%
- \ifempty\p_spaceinbetween\else
- \blank[\p_spaceinbetween]%
- \fi
- \fi
- \fi}
-
-\protected\def\tabl_ntb_row_align_start_inject
- {\bgroup % protect local vars
- \m_tabl_ntb_before_split
- \egroup
- \ifenableTBLbreak
- \tabl_ntb_before_page
- \fi}
-
-\protected\def\tabl_ntb_row_align_stop_inject
- {\par
- \nointerlineskip
- \ifenableTBLbreak
- \tabl_ntb_after_page
- \fi
- \bgroup % protect local vars
- \m_tabl_ntb_after_split
- \egroup
- \bgroup % protect local vars
- \tabl_ntb_inbetween
- \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
- \dostarttaggedchained\t!table\empty\??naturaltable
- %\registerparoptions % (*) triggers max hsize
- \the\t_tabl_ntb
- \dostoptagged}
-
-\protected\def\tabl_ntb_span#1%
- {\hskip\tabl_ntb_get_dis\c_tabl_ntb_col
- \dorecurse{#1}
- {\hskip\tabl_ntb_get_wid\c_tabl_ntb_col\relax
- \global\advance\c_tabl_ntb_col\plusone}}
-
-\protected\def\tabl_ntb_skip#1%
- {\global\advance\c_tabl_ntb_col#1\relax}
-
-\protected\def\tabl_ntb_plus
- {\global\advance\c_tabl_ntb_col\plusone
- \kern\d_tabl_ntb_columndistance}
-
-\setvalue{\??naturaltablecell\the\c_tabl_ntb_none}#1#2%
- {\scratchcounter\tabl_ntb_get_col{#1}{#2}\relax
- \ifnum\scratchcounter>\zerocount
- \etoksapp\t_tabl_ntb_row
- {\tabl_ntb_span{\the\scratchcounter}}%
- \fi}
-
-\setvalue{\??naturaltablecell\the\c_tabl_ntb_cell}#1#2%
- {\toksapp\t_tabl_ntb_row{\tabl_ntb_pass #1 #2 }% space delimited -> less tokens
- \scratchcounter\tabl_ntb_get_col{#1}{#2}\relax
- \ifnum\scratchcounter>\zerocount
- \etoksapp\t_tabl_ntb_row
- {\ifnum\scratchcounter=\plusone
- \tabl_ntb_plus
- \else
- \tabl_ntb_skip{\the\scratchcounter}%
- \fi}%
- \fi}
-
-\protected\def\tabl_ntb_cell#1#2%
- {\csname\??naturaltablecell\the\tabl_ntb_get_tag{#1}{#2}\endcsname{#1}{#2}}
-
-\protected\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\tabl_ntb_pass_one#1 #2 %
- {\tabl_ntb_get_txt{#1}{#2}}%
-
-\def\tabl_ntb_pass_two#1 #2 % meer in cellD
- {\d_tabl_ntb_width\zeropoint
- \scratchcounter\c_tabl_ntb_col
- \scratchcounterone\tabl_ntb_get_col{#1}{#2}\relax
- \ifcase\scratchcounterone\or
- \advance\d_tabl_ntb_width\dimexpr
- \tabl_ntb_get_wid\scratchcounter
- \relax
- \advance\scratchcounter\plusone
- \else
- \dorecurse\scratchcounterone
- {\advance\d_tabl_ntb_width\dimexpr
- \tabl_ntb_get_wid\scratchcounter
- \ifnum\recurselevel<\scratchcounterone
- +\d_tabl_ntb_columndistance
- +\tabl_ntb_get_dis\scratchcounter
- \fi
- \relax
- \advance\scratchcounter\plusone}%
- \fi
- \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}%
- \fi}%
-
-\def\tabl_ntb_pass_three#1 #2 %
- {% height
- \dostarttagged\t!tablecell\empty
- \scratchcounterone\tabl_ntb_get_col{#1}{#2}\relax
- \scratchcountertwo\tabl_ntb_get_row{#1}{#2}\relax
- \scratchheight\tabl_ntb_get_ht {#1}{#2}\relax
- \tablecellcolumns\scratchcounterone % used later so don't adapt these
- \tablecellrows \scratchcountertwo % used later so don't adapt these
- \d_tabl_ntb_height\zeropoint
- \ifnum\scratchcounterone=\c_tabl_ntb_maximum_col\relax
- % case: nc=maxcolumns
- \else
- \scratchcounter#1\relax
- \dorecurse\scratchcountertwo
- {\advance\d_tabl_ntb_height\tabl_ntb_get_hei\scratchcounter
- \advance\scratchcounter\plusone}%
- \ifdim\d_tabl_ntb_height<\scratchheight\relax
- \d_tabl_ntb_height\scratchheight
- \fi
- \fi
- % width
- \d_tabl_ntb_width\zeropoint
- \scratchcounter\c_tabl_ntb_col
- \ifcase\scratchcounterone\or
- \advance\d_tabl_ntb_width\dimexpr
- \tabl_ntb_get_wid\scratchcounter
- \relax
- \advance\scratchcounter\plusone
- \else
- \dorecurse\scratchcounterone
- {\advance\d_tabl_ntb_width\dimexpr
- \tabl_ntb_get_wid\scratchcounter
- \ifnum\recurselevel<\scratchcounterone
- +\d_tabl_ntb_columndistance
- +\tabl_ntb_get_dis\scratchcounter
- \fi
- \relax
- \advance\scratchcounter\plusone}%
- \fi
- % cell
- \setbox\scratchbox\hbox attr \taggedattribute \c_attr_tagged \bgroup
- \dotagTABLEsignal % maybe we need to add some packaging in this case
- \tabl_ntb_get_txt{#1}{#2}%
- \egroup
- \ifnum\scratchcounterone=\c_tabl_ntb_maximum_col\relax
- % case: nc=maxcolumns
- \else
- \scratchdimen\tabl_ntb_get_hei{#1}%
- \setbox\scratchbox\hpack
- {\lower\ht\scratchbox\hpack{\raise\scratchdimen\box\scratchbox}}%
- \ht\scratchbox\scratchdimen
- \fi
- \dp\scratchbox\zeropoint
- \edef\scratchmacro{\tabl_ntb_get_ref{#1}{#2}}%
- \ifempty\scratchmacro
- \box\scratchbox
- \else
- \normalexpanded{\directgotobox{\box\scratchbox}[\scratchmacro]}% to be checked
- \fi
- \dostoptagged} % right spot
-
-\def\tabl_ntb_cell_finalize
- {\ifx\localwidth\v!fit
- % nothing
- \orelse\ifx\localwidth\v!broad
- % nothing
- \orelse\ifempty\localwidth
- % nothing (safeguard)
- \else
- \tabl_ntb_cell_finalize_indeed
- \fi}
-
-\def\tabl_ntb_cell_finalize_indeed
- {\scratchdimen\tabl_ntb_get_aut\c_tabl_ntb_col\relax
- \ifdim\localwidth>\scratchdimen
- \tabl_ntb_set_aut\c_tabl_ntb_col{\the\dimexpr\localwidth}%
- \fi}
-
-\let\tabl_ntb_preroll\relax
-
-\def\tabl_ntb_table_get_max_width
- {\scratchdimen\wd\scratchbox\relax}
-
-% enable dper 2018-02-22
-
-\def\tabl_ntb_table_get_max_width_step
- {\advance\scratchdimen\tabl_ntb_get_wid\fastloopindex
- \advance\scratchdimen\tabl_ntb_get_dis\fastloopindex}
-
-\def\tabl_ntb_table_get_max_width
- {\scratchdimen\zeropoint
- \dofastloopcs\c_tabl_ntb_maximum_col\tabl_ntb_table_get_max_width_step
- \ifdim\scratchdimen<\wd\scratchbox\relax
- \scratchdimen\wd\scratchbox\relax
- \fi}
-
-\def\tabl_ntb_table_stop
- {\forgetall % new, here see narrower-004.tex
- %\setbox\scratchbox\hbox
- % {\letnaturaltablelocalparameter\c!frame\v!off
- % \letnaturaltablelocalparameter\c!background\empty
- % \letnaturaltablelocalparameter\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
- % 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}%
- % till here
- \tabl_ntb_let_tal\recurselevel\zerocount
- \tabl_ntb_let_wid\recurselevel\zeropoint
- \tabl_ntb_let_dis\recurselevel\zeropoint}%
- \dorecurse\c_tabl_ntb_maximum_row
- {\tabl_ntb_let_hei\recurselevel\maxdimen}%
- \tabl_ntb_let_gal\zerocount
- \tabl_ntb_preroll\relax
- \c_tabl_tbl_pass\plusone
- \let\tabl_ntb_pass\tabl_ntb_pass_one
- \let\tabl_ntb_cell_process\tabl_ntb_cell_process_a
- \setbox\scratchbox\vbox{\settrialtypesetting \tabl_ntb_flush_content}%
- \ifcase\tabl_ntb_get_gal\or
- % \c_tabl_tbl_pass\plusone
- % \let\tabl_ntb_pass\tabl_ntb_pass_one
- \let\tabl_ntb_cell_process\tabl_ntb_cell_process_a_extra
- \setbox\scratchbox\vbox{\settrialtypesetting \tabl_ntb_flush_content}%
- \fi
- \tabl_ntb_let_dis\c_tabl_ntb_maximum_col\zeropoint
- %
- \tabl_ntb_table_get_max_width % \scratchdimen\scratchbox
- %
- \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}%
- % \orelse\ifdim\wd\scratchbox>\hsize
- \orelse\ifdim\scratchdimen>\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}%
- \fi
- \orelse\ifautoTBLrowspan
- \ifnum\c_tabl_ntb_maximum_row_span>\plusone % max ?
- % added jan 2002 because nx=* did no longer work
- \ifnum\c_tabl_ntb_encountered_max<\c_tabl_ntb_maximum_col
- % added jun 2014 because someone had less columns than nx .. sigh / see *nx*
- \writestatus\m!TABLE{missing\space\number\numexpr\c_tabl_ntb_maximum_col-\c_tabl_ntb_encountered_max\relax\space column(s), guessing widths}%
- \fi
- \edef\savedhsize{\the\hsize}%
- % \hsize\wd\scratchbox\relax % new per 17/04/2006
- \hsize\scratchdimen\relax % new per 17/04/2006
- \tabl_ntb_check_widths_one % trial run
- \tabl_ntb_check_widths_two % real run
- \hsize\savedhsize
- \let\tabl_ntb_cell_process\tabl_ntb_cell_process_c
- \setbox\scratchbox\vbox{\settrialtypesetting \tabl_ntb_flush_content}%
- \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
- \tabl_ntb_split_nop
- \orelse\ifenableTBLbreak
- \tabl_ntb_split_yes
- \else
- \tabl_ntb_split_nop
- \fi}
-
-\def\tabl_ntb_stretch_widths % more variants, e.g. a max to \dimend
- {\ifcase\c_tabl_ntb_maximum_col\else % else division by zero
- \scratchdimenfour\zeropoint
- \scratchdimenfive\dimexpr
- \hsize
- -\d_tabl_ntb_leftmargindistance
- -\d_tabl_ntb_rightmargindistance
- +\d_tabl_ntb_columndistance
- \relax
- \dorecurse\c_tabl_ntb_maximum_col
- {\advance\scratchdimenfour\dimexpr
- \tabl_ntb_get_wid\recurselevel
- \relax
- \advance\scratchdimenfive\dimexpr
- -\tabl_ntb_get_dis\recurselevel
- -\d_tabl_ntb_columndistance
- \relax}%
- \relax
- % distribute width (stretch)
- \ifdim\scratchdimenfour<\scratchdimenfive
- \advance\scratchdimenfour-\scratchdimenfive
- \divide\scratchdimenfour\c_tabl_ntb_maximum_col
- \dorecurse\c_tabl_ntb_maximum_col
- {\tabl_ntb_set_wid\recurselevel{\the\dimexpr\tabl_ntb_get_wid\recurselevel-\scratchdimenfour\relax}}%
- \fi
- \fi}
-
-\def\tabl_ntb_split_nop
- {\setbox\b_tabl_ntb_final\vbox{\tabl_ntb_flush_content}%
- \postprocessTABLEbox\b_tabl_ntb_final
- \beforeTABLEbox
- % packaging prevents max hsized box
- % \hbox{\registerparoptions\box\b_tabl_ntb_final}% (*) better here
- % better :
- \ifinsidefloat
- % no \dontleavehmode else too wide, otherwise we get a \hsized box
- \else
- \registerparoptions % (*) better here (also does a \dontleavehmode)
- \ifhmode\else\dontleavehmode\fi
- \fi
- \box\b_tabl_ntb_final
- \afterTABLEbox}
-
-\def\tabl_ntb_split_yes
- {\ifinsidesplitfloat
- \donetrue
- \orelse\ifinsidefloat
- \donefalse
- \else
- \donetrue
- \fi
- \ifdone
- \expandafter\tabl_ntb_split_box
- \else
- \expandafter\tabl_ntb_split_nop
- \fi}
-
-\newbox\TABLEsplitbox % public, don't change
-
-\let\extratblsplitheight\zeropoint % additional space taken by before/afterTABLEsplitbox
-
-\def\tabl_ntb_split_box
- {\resettsplit
- \c_split_minimum_free_lines\plustwo
- \d_split_minimum_free_space\dimexpr\extratblsplitheight+\naturaltablelocalparameter\c!splitoffset\relax
- \t_split_before_result{\beforeTABLEsplitbox}%
- \t_split_after_result{\afterTABLEsplitbox}%
- \t_split_after{\m_tabl_ntb_after_split}%
- \t_split_before{\m_tabl_ntb_before_split}% not used (yet)
- \setbox\b_split_content\vbox{\tabl_ntb_flush_content}%
- \ifmultipleTBLheads
- \dorecurse\c_tabl_ntb_n_of_head_lines
- {\setbox\scratchbox\vsplit\b_split_content to \lineheight
- \setbox\b_split_head\vbox{\unvcopy\b_split_head\unvcopy\scratchbox}}% \vpack ?
- \dorecurse\c_tabl_ntb_n_of_next_lines
- {\setbox\scratchbox\vsplit\b_split_content to \lineheight
- \setbox\b_split_next\vbox{\unvcopy\b_split_next\unvcopy\scratchbox}}% \vpack ?
- \fi
- \edef\p_spaceinbetween{\naturaltablelocalparameter\c!spaceinbetween}%
- \ifempty\p_spaceinbetween\else
- \blank[\p_spaceinbetween]%
- \fi
- \def\postprocesstsplit{\postprocessTABLEsplitbox{\box\b_split_result}}%
- \handletsplit}
-
-% ! ! ! ! TODO: naast \postprocessTABLEsplitbox ook evt \postprocessTABLEbox voor niet split
-
-\let\postprocessTABLEsplitbox\gobbleoneargument
-\let\postprocessTABLEbox \gobbleoneargument
-
-\let\beforeTABLEsplitbox\relax
-\let\afterTABLEsplitbox \relax
-\let\beforeTABLEbox \relax
-\let\afterTABLEbox \relax
-
-\def\tabl_ntb_check_widths_one{\tabl_ntb_check_widths_indeed\zerocount} % 0 = trial run
-\def\tabl_ntb_check_widths_two{\tabl_ntb_check_widths_indeed\plusone } % 1 = real run
-
-\def\tabl_ntb_check_widths_indeed#1%
- {\ifconditional\c_tabl_ntb_trace_widths\tabl_ntb_show_widths B#1\fi
- \scratchcounterone\zerocount
- \scratchdimenone\dimexpr
- \hsize
- -\d_tabl_ntb_leftmargindistance
- -\d_tabl_ntb_rightmargindistance
- -\d_tabl_ntb_columndistance
- \relax
- \dorecurse\c_tabl_ntb_maximum_col
- {\scratchdimen\tabl_ntb_get_aut\recurselevel\relax
- \advance\scratchdimenone\dimexpr
- -\tabl_ntb_get_dis\recurselevel
- -\d_tabl_ntb_columndistance
- \relax
- \ifdim\scratchdimen>\zeropoint\relax
- \advance\scratchdimenone -\scratchdimen
- \else
- \scratchdimen\tabl_ntb_get_wid\recurselevel\relax
- \ifdim\scratchdimen>\d_tabl_ntb_maxwidth\relax
- \ifcase#1\else\tabl_ntb_let_wid\recurselevel\zeropoint\fi
- \advance\scratchcounterone \plusone
- \orelse\ifdim\scratchdimen>\zeropoint\relax
- \advance\scratchdimenone -\scratchdimen
- \else
- % eigenlijk moet dit alleen als de kolom wordt overspannen door een
- % vorige, maw extra dubbele loop en status var
- \ifnum\c_tabl_ntb_encountered_max=\c_tabl_ntb_maximum_col % *nx* bah
- \advance\scratchcounterone \plusone % setting maxwidth to a large value also works
- \fi
- \fi
- \fi}%
- \ifconditional\c_tabl_ntb_trace_widths\tabl_ntb_show_widths M#1\fi
- \ifcase\scratchcounterone \else \divide\scratchdimenone \scratchcounterone \fi
- \dorecurse\c_tabl_ntb_maximum_col
- {\scratchdimen\tabl_ntb_get_wid\recurselevel\relax
- \ifcase#1\relax
- \ifdim\scratchdimen<\scratchdimenone % take natural width
- \tabl_ntb_set_aut\recurselevel{\the\scratchdimen}%
- \fi
- \else
- \ifzeropt\scratchdimen % auto set width
- \tabl_ntb_set_wid\recurselevel{\the\scratchdimenone}%
- \fi
- \fi}%
- \ifconditional\c_tabl_ntb_trace_widths\tabl_ntb_show_widths E#1\fi}
-
-% todo: use scratchcounters, not !! ones
-
-\def\tabl_ntb_check_heights_one_indeed
- {\scratchcountertwo\tabl_ntb_get_row\c_tabl_ntb_current_row_three\c_tabl_ntb_current_col_three\relax
- % check row span
- \ifnum\scratchcountertwo>\plusone
- % current height in row
- \dimen0=\tabl_ntb_get_ht\c_tabl_ntb_current_row_three\c_tabl_ntb_current_col_three
- % 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
- \scratchcounterthree\tabl_ntb_get_row\c_tabl_ntb_current_row_three\recurselevel\relax
- \ifnum\scratchcounterthree=\plusone
- \dimen4=\tabl_ntb_get_ht\c_tabl_ntb_current_row_three\recurselevel\relax
- \ifdim\dimen2<\dimen4
- \dimen2=\dimen4
- \fi
- \fi
- \fi
- \fi}%
- \c_tabl_ntb_current_row_four\c_tabl_ntb_current_row_three
- % calculate cummulative height
- \dimen4=\dimen2
- \scratchcounterthree\c_tabl_ntb_current_row_three
- \advance\scratchcounterthree\minusone
- \dorecurse\scratchcountertwo
- {\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
- \fi
- \ifnum\recurselevel=\scratchcountertwo\else
- \tabl_ntb_set_nob\scratchcounterthree
- \advance\scratchcounterthree\plusone
- \fi
- \advance\c_tabl_ntb_current_row_four\plusone}%
- % distribute overshoot equally
- \ifdim\dimen2>\zeropoint % new: test on natural-003
- \ifdim\dimen4<\dimen0
- \advance\dimen0 -\dimen4
- \divide\dimen0 \scratchcountertwo
- \c_tabl_ntb_current_row_four\c_tabl_ntb_current_row_three
- \tabl_ntb_set_hei\c_tabl_ntb_current_row_three{\the\dimen2}%
- \dorecurse\scratchcountertwo
- {\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}%
- \fi
- \fi}%
- \advance\c_tabl_ntb_current_row_four\plusone}%
- \orelse\ifdim\dimen4>\dimen0
- \iftightTBLrowspan
- \tabl_ntb_set_hei\c_tabl_ntb_current_row_three{\the\dimen2}%
- \fi
- \fi
- \fi
- \fi}
-
-\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\tabl_ntb_show_widths#1#2%
- {\begingroup
- \scratchdimen\zeropoint
- \dorecurse\c_tabl_ntb_maximum_col
- {\advance\scratchdimen\tabl_ntb_get_wid\recurselevel\relax}%
- \writestatus\m!TABLE{#1 \ifcase#2trial\else real\fi: hsize: \the\hsize, total: \the\scratchdimen}%
- \dorecurse\c_tabl_ntb_maximum_col
- {\writestatus\m!TABLE{\space\space\recurselevel: \the\dimexpr\tabl_ntb_get_wid\recurselevel}}%
- \endgroup}
-
-\def\tabl_ntb_char_align % called often
- {\edef\p_characteralign{\naturaltablelocalparameter\c!aligncharacter}%
- \ifx\p_characteralign\v!yes
- \ifcase\c_tabl_tbl_pass\or
- \tabl_ntb_let_tal\currentTABLEcolumn\plusone
- \tabl_ntb_let_gal\plusone
- \fi
- \expandafter\tabl_ntb_char_align_indeed
- \else
- \expandafter\gobbletwoarguments
- \fi}
-
-\def\tabl_ntb_char_align_indeed#1#2% row column
- {\ifcase\c_tabl_tbl_pass \or
- \setcharacteralign{#2}{\naturaltablelocalparameter\c!alignmentcharacter}% we could store the character in tal
- \fi
- \typo_charalign_adapt_font
- \signalcharacteralign{#2}{#1}}
-
-\protected\def\tabl_ntb_cell_process_a_extra#1#2%
- {\ifcase\tabl_ntb_get_tal{#2}\relax
- \expandafter\tabl_ntb_cell_process_x
- \else
- \expandafter\tabl_ntb_cell_process_a
- \fi{#1}{#2}}
-
-\protected\def\tabl_ntb_cell_process_x#1#2[#3]#4%
- {}
-
-% problem: when span doesn't break we can have a span that is the sum of cells but
-% still to small .. chicken egg problem ... for that we should also have a smallest
-% width run
-%
-% nilling the background makes a run upto 25% faster
-
-\def\tabl_ntb_cell_process_a_check_span_one
- {\ifautosqueezeTBLspan
- \edef\p_width{\naturaltablelocalparameter\c!width}%
- \ifcsname\??naturaltablesqueeze\p_width\endcsname\lastnamedcs\else\donefalse\fi
- \else
- \donetrue
- \fi
- \ifdone % brr, 0
- \ifnum\scratchcounter>\plusone
- \tabl_ntb_set_spn\c_tabl_ntb_col
- \fi
- \fi}
-
-\let\tabl_ntb_cell_process_a_check_span_two_yes\relax
-
-\def\tabl_ntb_cell_process_a_check_span_two_nop
- {\ifdim\tabl_ntb_get_wid\c_tabl_ntb_col<\wd\scratchbox
- \tabl_ntb_set_wid\c_tabl_ntb_col{\the\wd\scratchbox}%
- \fi}
-
-\protected\def\tabl_ntb_cell_process_a#1#2[#3]#4% grouping added ! ! !
- {\bgroup
- \letnaturaltablelocalparameter\c!option\empty
- \tabl_ntb_setup_cell{#1}{#2}%
- \setupcurrentnaturaltablelocal[#3]%
- \letnaturaltablelocalparameter\c!background\empty
- \letnaturaltablelocalparameter\c!frame\v!off
- \scratchcounter\tabl_ntb_get_col{#1}{#2}\relax
- \setbox\scratchbox\hbox
- {\scratchdimen\naturaltablelocalparameter\c!distance\relax
- \ifdim\scratchdimen>\tabl_ntb_get_dis{#2}\relax
- \tabl_ntb_set_dis{#2}{\the\scratchdimen}%
- \fi
- \anch_backgrounds_text_level_start
- \inheritednaturaltablelocalframed{\tabl_ntb_cell_start\tabl_ntb_char_align{#1}{#2}#4\tabl_ntb_cell_stop\tabl_ntb_cell_finalize}%
- \anch_backgrounds_text_level_stop
- \ifcase\c_anch_backgrounds_text_count\else
- \tabl_ntb_let_bck{#1}{#2}\c_anch_backgrounds_text_state
- \fi
- }%
- \scratchdimen\tabl_ntb_get_wid\c_tabl_ntb_col\relax
- \ifdim\wd\scratchbox>\scratchdimen
- \ifsqueezeTBLspan
- \tabl_ntb_cell_process_a_check_span_one
- \fi
- \tabl_ntb_spn_doifelse\c_tabl_ntb_col
- \tabl_ntb_cell_process_a_check_span_two_yes
- \tabl_ntb_cell_process_a_check_span_two_nop
- \fi
- \scratchcounter\numexpr\c_tabl_ntb_row+\plusone\relax
- \scratchdimen\tabl_ntb_get_hei\scratchcounter\relax
- \ifdim\ht\scratchbox<\scratchdimen
- \tabl_ntb_set_hei\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}%
- \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
- \ifzeropt\scratchdimen
- % 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}%
- \orelse\ifdim\wd\scratchbox>\scratchdimen
- % unless span
- \tabl_ntb_set_aut\c_tabl_ntb_col{\the\wd\scratchbox}%
- % to be translated
- \writestatus\m!TABLE{no auto width in (\number#1,\number#2)\space\the\wd\scratchbox/\the\hsize}%
- \fi
- \fi
- \fi
- \fi
- \setbox\scratchboxone\emptyhbox
- \wd\scratchboxone\wd\scratchbox
- \ht\scratchboxone\ht\scratchbox
- \dp\scratchboxone\dp\scratchbox
- \box\scratchboxone
- \egroup}
-
-\protected\def\tabl_ntb_cell_process_b_c#1#2#3[#4]#5%
- {\setbox\scratchbox\hbox
- {\tabl_ntb_setup_cell{#2}{#3}%
- \setupcurrentnaturaltablelocal[#4,#1]%
- \letnaturaltablelocalparameter\c!background\empty
- \letnaturaltablelocalparameter\c!frame\v!off
- \inheritednaturaltablelocalframed{\tabl_ntb_cell_start#5\tabl_ntb_cell_stop}}%
- \setbox2\emptyhbox % todo: \scratchboxtwo
- \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
- \fi
- \box2 }
-
-\protected\def\tabl_ntb_cell_process_b#1#2[#3]#4%
- {\scratchdimen\tabl_ntb_get_aut\c_tabl_ntb_col\relax
- \ifdim\scratchdimen>\zeropoint\relax
- \else
- \scratchdimen\tabl_ntb_get_wid\c_tabl_ntb_col\relax
- \ifdim\scratchdimen>\zeropoint\relax
- \ifnum\tabl_ntb_get_col{#1}{#2}=\c_tabl_ntb_maximum_col\relax
- \scratchdimen\hsize
- \fi
- \fi
- \fi
- \normalexpanded{\tabl_ntb_cell_process_b_c{\ifdim\scratchdimen>\zeropoint \c!width=\the\scratchdimen\fi}}%
- {#1}{#2}[#3]{\tabl_ntb_char_align{#1}{#2}#4}}
-
-\protected\def\tabl_ntb_cell_process_c
- {\tabl_ntb_cell_process_b_c{}}
-
-\protected\def\tabl_ntb_cell_process_d#1#2[#3]#4%
- {\tabl_ntb_setup_cell{#1}{#2}%
- \bgroup
- \setupcurrentnaturaltablelocal[#3]%
- \letnaturaltablelocalparameter\c!background\empty
- \letnaturaltablelocalparameter\c!frame\v!off
- \setnaturaltablelocalparameter\c!width{\d_tabl_ntb_width}%
- \inheritednaturaltablelocalframed{\tabl_ntb_cell_start\tabl_ntb_char_align{#1}{#2}#4\tabl_ntb_cell_stop}%
- \egroup}
-
-\protected\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
- \color % handle color here prevents interference due to whatsit nodes
- [\naturaltablelocalparameter\c!color] % as well as permits local colors to take precedence
- {\letnaturaltablelocalparameter\c!color\empty
- \setnaturaltablelocalparameter\c!width{\d_tabl_ntb_width}%
- \ifzeropt\d_tabl_ntb_height % case: nc=maxcolumns
- \else
- \setnaturaltablelocalparameter\c!height{\d_tabl_ntb_height}%
- \fi
- \ifcase\c_anch_backgrounds_text_count\else
- \edef\p_region{\naturaltablelocalparameter\c!region}%
- \ifempty\p_region\ifnum\tabl_ntb_get_bck{#1}{#2}>\zerocount
- \letnaturaltablelocalparameter\c!region\v!yes
- \fi\fi
- \fi
- \inheritednaturaltablelocalframed{\tabl_ntb_cell_start\tabl_ntb_char_align{#1}{#2}#4\tabl_ntb_cell_stop}}%
- \hskip\tabl_ntb_get_dis{#2}}
-
-\newtoks\everyresetTABLEyes
-\newtoks\everyresetTABLEnop
-
-\appendtoks
- \setupTABLE [%
- %
- % framed defaults
- %
- \c!width=\v!fit,%
- \c!height=\v!fit,%
- \c!lines=,%
- \c!offset=.25\exheight,%
- \c!empty=\v!no,%
- \c!frame=\v!on,%
- \c!topframe=,%
- \c!bottomframe=,%
- \c!leftframe=,%
- \c!rightframe=,%
- \c!radius=.5\bodyfontsize,%
- \c!rulethickness=\linewidth,%
- \c!corner=\v!rectangular,%
- \c!depth=\zeropoint,%
- \c!foregroundcolor=,%
- \c!foregroundstyle=,%
- \c!background=,%
- \c!backgroundcolor=,%
- \c!backgroundoffset=\v!frame,%
- \c!framecolor=,%
- \c!frameoffset=.5\linewidth,%
- % \c!backgroundcorner=\framedparameter\c!corner,%
- % \c!backgrounddepth=\framedparameter\c!depth,%
- % \c!backgroundradius=\framedparameter\c!radius,%
- % \c!framecorner=\framedparameter\c!corner,%
- % \c!framedepth=\framedparameter\c!depth,%
- % \c!frameradius=\framedparameter\c!radius,%
- \c!component=,%
- \c!region=,%
- \c!align=,%
- \c!bottom=\vss,%
- \c!top=,%
- \c!strut=\v!yes,%
- \c!autostrut=\v!no,%
- \c!location=\v!normal,%
- \c!orientation=,%
- \c!autowidth=\v!yes,%
- \c!setups=,%
- \c!loffset=\zeropoint,%
- \c!roffset=\zeropoint,%
- \c!toffset=\zeropoint,%
- \c!boffset=\zeropoint,%
- %
- % table specific
- %
- \c!aligncharacter=\v!no,%
- \c!alignmentcharacter={,},%
- \c!color=,%
- \c!columndistance=\zeropoint,% each column (whole table)
- \c!distance=\zeropoint,% individual column
- \c!headcolor=,%
- \c!header=,%
- \c!headstyle=\v!bold,%
- \c!left=,%
- \c!leftmargindistance=\zeropoint,% whole table
- \c!maxwidth=8\emwidth,%
- \c!option=,% \v!stretch
- \c!right=,%
- \c!rightmargindistance=\zeropoint,% whole table
- \c!spaceinbetween=,%
- \c!split=\v!auto,%
- \c!splitoffset=\zeropoint,%
- \c!style=,%
- \c!textwidth=\v!local,% was \hsize
- ]%
-\to \everyresetTABLEyes
-
-\appendtoks
- \setupTABLE [%
- \c!width=\v!fit,%
- \c!height=\v!fit%
- ]%
-\to \everyresetTABLEnop
-
-\the\everyresetTABLEyes
-
-% \bgroup
-% \setupTABLE[column][1][aligncharacter=yes, alignmentcharacter={,}]
-% \bTABLE
-% \bTR \bTD 1,2 \eTD \bTD 2 \eTD \eTR
-% \bTR \bTD 11,2 \eTD \bTD
-% {\setupTABLE[column][1][aligncharacter=yes, alignmentcharacter={,}]
-% \bTABLE
-% \bTR \bTD 1,2 \eTD \bTD 2 \eTD \eTR
-% \bTR \bTD 11,22 \eTD \bTD 2 \eTD \eTR
-% \bTR \bTD 11,2 \eTD \bTD 2 \eTD \eTR \eTABLE} \eTD \eTR
-% \bTR \bTD 11,22 \eTD \bTD 2 \eTD \eTR
-% \eTABLE
-% \egroup
-
-\newconditional\resetTABLEmode \settrue\resetTABLEmode
-
-\def\tabl_ntb_parameters_reset % we can use setters instead
- {\ifnum\m_tabl_tbl_level>\plusone % in ieder geval
- \ifconditional\resetTABLEmode
- \the\everyresetTABLEyes
- \else
- \the\everyresetTABLEnop
- \fi
- \fi}
-
-% new (for Olivier Turlier)
-%
-% \defineTABLEsetup [xx] [foregroundcolor=red]
-%
-% \bTABLE
-% \bTR \bTD oeps \eTD \bTD oeps \eTD \eTR
-% \bTR \bTDs[xx] oeps \eTDs \bTD oeps \eTD \eTR
-% \bTRs[xx] \bTD oeps \eTD \bTD oeps \eTD \eTRs
-% \eTABLE
-
-\installcorenamespace{naturaltablesetup}
-
-\permanent\tolerant\protected\def\defineTABLEsetup[#1]#*[#2]%
- {\ifarguments\else\setvalue{\??naturaltablesetup#1}{#2}\fi}
-
-\permanent\let\eTDs\relax
-\permanent\let\eTRs\relax
-
-\permanent\protected\def\bTDs[#1]#2\eTDs
- {\normalexpanded{\bTD[\begincsname\??naturaltablesetup#1\endcsname]}#2\eTD}
-
-\permanent\protected\def\bTRs[#1]#2\eTRs
- {\normalexpanded{\bTR[\begincsname\??naturaltablesetup#1\endcsname]}#2\eTR}
-
-\protect \endinput
-
-% todo: mode: first|next (of niets)