summaryrefslogtreecommitdiff
path: root/tex/context/base/tabl-xtb.mkvi
diff options
context:
space:
mode:
Diffstat (limited to 'tex/context/base/tabl-xtb.mkvi')
-rw-r--r--tex/context/base/tabl-xtb.mkvi108
1 files changed, 83 insertions, 25 deletions
diff --git a/tex/context/base/tabl-xtb.mkvi b/tex/context/base/tabl-xtb.mkvi
index 2382cae21..fae4d1615 100644
--- a/tex/context/base/tabl-xtb.mkvi
+++ b/tex/context/base/tabl-xtb.mkvi
@@ -59,8 +59,6 @@
\unprotect
-% \def\v!xtable{xtable}
-
% option=stretch : equal distribution
% option={stretch,width} : proportional distribution
% option={max} : prefer max over forced width/height
@@ -97,6 +95,8 @@
\newcount\c_tabl_x_nesting
\newcount\c_tabl_x_skip_mode % 1 = skip
+\newdimen\d_tabl_x_textwidth
+
% \setupxtable[one][parent][a=b,c=d]
% \setupxtable[one] [a=b,c=d]
% \setupxtable [a=b,c=d]
@@ -111,10 +111,10 @@
\to \everysetupxtable
\setupxtable[%
- \c!nr=1,
- \c!nc=1,
- \c!nx=1, % slow
- \c!ny=1, % slow
+ \c!nr=\plusone,
+ \c!nc=\plusone,
+ \c!nx=\plusone, % slow
+ \c!ny=\plusone, % slow
\c!align=\v!table, % {\v!flushleft,\v!broad,\v!high}, % just as \bTABLE .. \eTABLE
\c!frameoffset=.5\linewidth,
\c!backgroundoffset=\v!frame,
@@ -124,7 +124,7 @@
% \c!bodyfont=,
\c!width=\v!fit,
\c!height=\v!fit,
- \c!maxwidth=8em,
+ \c!maxwidth=8\emwidth,
\c!autowidth=\v!yes, % controls framed
\c!rulethickness=\linewidth,
\c!strut=\v!yes,
@@ -137,8 +137,8 @@
% \c!footer=,
% \c!header=,
\c!spaceinbetween=,
- \c!textwidth=\hsize,
- \c!textheight=\vsize,
+ \c!textwidth=\v!local, % was \hsize,
+ \c!textheight=\vsize, % used for vertical spread
\c!distance=\zeropoint, % individual column
\c!columndistance=\zeropoint, % each column (whole table)
\c!leftmargindistance=\zeropoint, % whole table
@@ -164,7 +164,9 @@
% These direct buffers can be somewhat faster but it's probably neglectable.
% Anyway, no nesting is supported as we then need to catch (e.g.) rows and
% keep track of nesting and have a more complex redefinition of nested
-% instanced \unknown\ it's not worth the trouble.
+% instanced \unknown\ it's not worth the trouble. Only use them when you
+% really need them and use the embeddedxtable command when nesting them.
+% Implementing nesting would be slower than not using direct buffers.
\def\tabl_x_process_buffer_directly[#name]%
{\bgroup
@@ -179,9 +181,10 @@
\def\tabl_x_process_buffer[#settings]%
{\tabl_x_prepare{#settings}%
\let\tabl_x_start_table\tabl_x_start_ignore
- \gobbleuntil\stopxtable}
+ \gobbleuntil\stopxtable} % nested xtables are not supported,
-%D A bonus: you can use the following construct inside a macro.
+%D A bonus: you have to use the following construct inside a macro or
+%D direct buffer.
\unexpanded\def\startembeddedxtable
{\dosingleempty\tabl_x_embedded_start}
@@ -211,10 +214,11 @@
\unexpanded\def\tabl_x_start_named_indeed[#settings]%
{\advance\c_tabl_x_nesting\plusone
\dostarttagged\t!table\empty
- \forgetall
\iffirstargument
\setupcurrentxtable[#settings]%
\fi
+ \tabl_x_check_textwidth
+ \forgetall
\edef\tabl_x_current_buffer{\tabl_x_default_buffer}%
\normalexpanded{\buff_pickup{\tabl_x_current_buffer}{\e!start\currentxtable}{\e!stop\currentxtable}\relax\tabl_x_process}}
@@ -223,17 +227,28 @@
%D Now we come to processing:
+\def\tabl_x_check_textwidth
+ {\edef\p_textwidth{\xtableparameter\c!textwidth}%
+ \ifx\p_textwidth\v!local
+ \d_tabl_x_textwidth\availablehsize
+ \else
+ \d_tabl_x_textwidth\p_textwidth
+ \fi}
+
\def\tabl_x_prepare#settings% assumes \iffirstargument to be set
{\advance\c_tabl_x_nesting\plusone
\dostarttagged\t!table\empty
- \forgetall
\iffirstargument
\tabl_x_set_checked{#settings}%
- \fi}
+ \fi
+ \tabl_x_check_textwidth
+ \forgetall}
\def\tabl_x_get_buffer
{\ctxcommand{gettexbuffer("\tabl_x_current_buffer")}}
+\let\tabl_x_stop_cell\relax
+
\unexpanded\def\tabl_x_process
{\begingroup % *
\doifsomething{\xtableparameter\c!bodyfont}
@@ -242,7 +257,7 @@
{\xtableparameter\c!spaceinbetween}%
\ctxcommand{x_table_create {
option = "\xtableparameter\c!option",
- textwidth = \number\dimexpr\xtableparameter\c!textwidth,
+ textwidth = \number\d_tabl_x_textwidth,
textheight = \number\dimexpr\xtableparameter\c!textheight,
maxwidth = \number\dimexpr\xtableparameter\c!maxwidth,
lineheight = \number\openlineheight,
@@ -296,15 +311,64 @@
\else\ifinsidefloat
\tabl_x_flush_float_normal
\else
- \doifelse{\xtableparameter\c!split}\v!yes
- \tabl_x_flush_flow_split
- \tabl_x_flush_flow_normal
+ \tabl_x_flush_text_checked
\fi\fi
\ctxcommand{x_table_cleanup()}%
\dostoptagged
\resetbuffer[\tabl_x_current_buffer]%
\egroup}
+% text flow split modes
+
+\installcorenamespace{xtableflushsplit}
+
+\def\tabl_x_flush_text_checked
+ {\expandcheckedcsname\??xtableflushsplit{\xtableparameter\c!split}\v!no}
+
+% in text flow: headers and footers only once
+
+\setvalue{\??xtableflushsplit\v!yes}%
+ {\ctxcommand{x_table_flush{ method = "\v!split" }}}
+
+% in text flow: headers and footers only once
+
+\setvalue{\??xtableflushsplit\v!no}%
+ {\dontleavehmode % else no leftskip etc
+ \ctxcommand{x_table_flush{ method = "\v!normal" }}}
+
+% in text flow: headers and footers get repeated
+
+\setvalue{\??xtableflushsplit\v!repeat}%
+ {\doloop
+ {\ctxcommand{x_table_flush{ method = "\v!split", vsize = \number\ifdim\pagegoal=\maxdimen\textheight\else\pagegoal\fi }}%
+ \ifcase\c_tabl_x_state
+ \exitloop
+ \else
+ \page
+ \fi}}
+
+% \setvalue{\??xtableflushsplit\v!setups}%
+% {\directsetup{xtable:split:user}}
+%
+% \startsetups[xtable:split:user]
+% \doloop {
+% \xtablesplitflush % uses \xtablesplitvsize (a macro)
+% \ifcase\xtablesplitstate
+% \exitloop
+% \else
+% \page
+% \fi
+% }
+% \stopsetups
+%
+% \unexpanded\def\xtablesplitflush
+% {\ctxcommand{x_table_flush{ method = "\v!split", vsize = \number\dimexpr\xtablesplitvsize\relax}}\relax}
+%
+% \def\xtablesplitvsize
+% {\ifdim\pagegoal=\maxdimen\textheight\else\pagegoal\fi}
+%
+% \let\xtablesplitstate\c_tabl_x_state
+
\let\extratxtablesplitheight\zeropoint % might disappear so don't depend on it
\def\tabl_x_flush_float_normal
@@ -319,12 +383,6 @@
\let\tsplitdirectwidth \d_tabl_x_final_width
\handledirecttsplit}
-\def\tabl_x_flush_flow_normal
- {\ctxcommand{x_table_flush{ method = "\v!normal" }}}
-
-\def\tabl_x_flush_flow_split
- {\ctxcommand{x_table_flush{ method = "\v!split" }}}
-
\def\tabl_x_split_splitter#vsize%
{\setbox\tsplitresult\vbox
{\ctxcommand{x_table_flush{ method = "\v!split", vsize = \number\dimexpr#vsize }}}%