tabl-frm.mkxl /size: 6986 b    last modification: 2023-12-21 09:44
1%D \module
2%D   [       file=tabl-frm,
3%D        version=2017.04.11,
4%D          title=\CONTEXT\ Table Macros,
5%D       subtitle=Framed Tables,
6%D         author=Hans Hagen,
7%D           date=\currentdate,
8%D      copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
9%C
10%C This module is part of the \CONTEXT\ macro||package and is
11%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
12%C details.
13
14%D For Thomas Schmitz who needed 3000 pages long tables.
15
16\unprotect
17
18\writestatus{loading}{ConTeXt Table Macros / Framed Tables}
19
20\installcorenamespace{framedtable}
21\installcorenamespace{framedtablerow}
22\installcorenamespace{framedtablecolumn}
23
24\newinteger  \c_tabl_framed_c
25\newinteger  \c_tabl_framed_r
26\newdimension\d_tabl_framed_h   \def\d_tabl_framed_h_reference{\d_tabl_framed_h}%
27\newdimension\d_tabl_framed_d
28\newdimension\b_tabl_framed
29
30\initializeboxstack\??framedtable
31
32\defineframed[\??framedtable]
33\defineframed[\??framedtablerow][\??framedtable]
34\defineframed[\??framedtablecolumn][\??framedtable]
35
36\setupframed
37  [\??framedtable]
38  [\c!distance=\zeropoint,
39   \c!before=,
40   \c!after=,
41   \c!inbetween=]
42
43\setupframed
44  [\??framedtablerow]
45  [\c!strut=\v!no,
46   \c!offset=\v!overlay]
47
48% \defineframedtable[foo]
49% \defineframedtable[bar][foo]
50
51\permanent\tolerant\protected\def\defineframedtable[#1]#*[#2]%
52  {\ifarguments\or
53     \defineframed[\??framedtable#1][\??framedtable]%
54   \or
55     \defineframed[\??framedtable#1][\??framedtable#2]%
56   \fi}
57
58% \setupframedtable[foo][...]
59
60\permanent\tolerant\protected\def\setupframedtable[#S#1]#*[#S#2]%
61  {\ifarguments\or
62     \setupframed[\??framedtable][#1]%
63   \or
64     \ifcsname\??framed:\??framedtable#1\endcsname \else
65       \defineframed[\??framedtable#1][\??framedtable]%
66     \fi
67     \setupframed[\??framedtable#1][#2]%
68   \fi}
69
70% \setupframedtable[1][...]
71% \setupframedtable[foo][1][...]
72
73\permanent\tolerant\protected\def\setupframedtablerow[#1]#*[#S#2]#*[#S#3]%
74  {\ifarguments\or\or
75     \ifcsname\??framed:\??framedtablerow:#1\endcsname \else
76       \defineframed[\??framedtablerow:#1][\??framedtable]%
77     \fi
78     \setupframed[\??framedtablerow:#1][#2]%
79   \or
80     \ifcsname\??framed:\??framedtable#1\endcsname \else
81       \defineframed[\??framedtable#1][\??framedtable]%
82     \fi
83     \ifcsname\??framed:\??framedtablerow#1:#2\endcsname \else
84       \defineframed[\??framedtablerow#1:#2][\??framedtable#1]%
85     \fi
86     \setupframed[\??framedtablerow#1:#2][#3]%
87   \fi}
88
89\permanent\tolerant\protected\def\setupframedtablecolumn[#1]#*[#S#2]#*[#S#3]%
90  {\ifarguments\or\or
91     \ifcsname\??framed:\??framedtablecolumn:#1\endcsname \else
92       \defineframed[\??framedtablecolumn:#1][\??framedtable]%
93     \fi
94     \setupframed[\??framedtablecolumn:#1][#2]%
95   \or
96     \ifcsname\??framed:\??framedtable#1\endcsname \else
97       \defineframed[\??framedtable#1][\??framedtable]%
98     \fi
99     \ifcsname\??framed:\??framedtablecolumn#1:#2\endcsname \else
100       \defineframed[\??framedtablecolumn#1:#2][\??framedtable#1]%
101     \fi
102     \setupframed[\??framedtablecolumn#1:#2][#3]%
103   \fi}
104
105\mutable\lettonothing\currentframedtable
106
107\permanent\tolerant\protected\def\startframedtable[#S#1]#*[#S#2]%
108  {\begingroup
109   \forgetall
110   \ifhastok={#1}%
111     \lettonothing\currentframedtable
112     \setupframed[\??framedtable][#1]%
113   \else
114     \cdef\currentframedtable{#1}%
115     \setupframed[\??framedtable][#2]%
116   \fi
117   \cdef\currentframed{\??framedtable\currentframedtable}%
118   \pack_framed_initialize
119   \c_tabl_framed_r\zerocount
120   \d_tabl_framed_d\framedparameter\c!distance
121   \framedparameter\c!before}
122
123\permanent\protected\def\stopframedtable
124  {\framedparameter\c!after
125   \endgroup}
126
127% a two pass variant that deals with the height .. so no catcode changes here
128
129\tolerant\protected\def\pack_framed_start_framed_whatever[#S#1]%
130  {\pack_framed_initialize % moved up
131   \bgroup
132   \setupcurrentframed[#1]% here !
133   \pack_framed_process_indeed
134   \bgroup
135   \ignorespaces}
136
137\newinteger\c_tabl_framed_pass
138
139\permanent\let\stopframedrow\relax
140
141\permanent\protected\def\startframedrow#1\stopframedrow
142  {\advanceby\c_tabl_framed_r\plusone
143   \startframedrow_one#1\stopframedrow_one
144   \startframedrow_two#1\stopframedrow_two}
145
146\tolerant\def\startframedrow_one[#-]%
147  {\bgroup
148   \c_tabl_framed_pass\plusone
149   \c_tabl_framed_c\zerocount
150   \d_tabl_framed_h\zeropoint
151   \settrialtypesetting}
152
153\protected\def\stopframedrow_one
154  {\normalexpanded{\egroup\d_tabl_framed_h\the\d_tabl_framed_h\relax}}
155
156\def\startframedrow_two
157  {\bgroup
158   \c_tabl_framed_c\zerocount
159   \c_tabl_framed_pass\plustwo
160   \cdef\currentframed{\the\c_tabl_framed_r}%
161   \cdef\currentframed
162     {\??framedtablerow\currentframedtable
163      \ifcsname\??framedtablerow\currentframedtable:\currentframed\endcsname
164        :\currentframed
165      \orelse\ifcsname\??framedtablerow\currentframedtable:\v!each\endcsname
166        :\v!each
167      \fi}%
168   \pack_framed_start_framed_whatever}
169
170\protected\def\stopframedrow_two
171  {\localcontrolledloop\plusone\c_tabl_framed_c\plusone{\tabl_framed_flush_row_two}%
172   \stopframed
173   \nointerlineskip
174   \vskip\zeroskip\relax
175   \framedparameter\c!inbetween}
176
177\protected\def\tabl_framed_flush_row_two
178  {\vpack to \d_tabl_framed_h{\flushbox\??framedtable{\the\currentloopiterator}\vfill}%
179   \ifzeropt\d_tabl_framed_d\else\kern\d_tabl_framed_d\fi}
180
181\permanent\protected\def\startframedcell
182  {\advanceby\c_tabl_framed_c\plusone
183   \setbox\b_tabl_framed\hpack\bgroup
184  %\bgroup
185   \cdef\currentframed{\the\c_tabl_framed_c}%
186   \cdef\currentframed
187     {\??framedtablecolumn\currentframedtable
188      \ifcsname\??framedtablecolumn\currentframedtable:\currentframed\endcsname
189        :\currentframed
190      \orelse\ifcsname\??framedtablecolumn\currentframedtable:\v!each\endcsname
191        :\v!each
192      \fi}%
193   \ifcase\c_tabl_framed_pass
194   \or
195     \resetframedparameter\c!background
196     \letframedparameter\c!frame\v!off
197   \or
198     \letframedparameter\c!height\d_tabl_framed_h_reference
199   \fi
200   \pack_framed_start_framed_whatever}
201
202\permanent\protected\def\stopframedcell
203  {\stopframed
204  %\egroup
205   \ifcase\c_tabl_framed_pass
206   \or
207     \ifdim\ht\b_tabl_framed>\d_tabl_framed_h
208       \d_tabl_framed_h\ht\b_tabl_framed
209     \fi
210   \else
211     \savebox\??framedtable{\the\c_tabl_framed_c}{\box\b_tabl_framed}%
212   \fi}
213
214\protect \endinput
215
216\starttext
217
218\setupframedtablecolumn [1] [width=3cm,background=color,backgroundcolor=red]
219\setupframedtablecolumn [2] [width=4cm,background=color,backgroundcolor=green,align=normal]
220% \setupframedtablerow [each] [background=color,backgroundcolor=blue,strut=no]
221% \setupframedtablerow [each] [strut=no,offset=overlay]
222
223\startframedtable[inbetween=\kern-0.4pt,distance=-0.4pt]
224
225\testfeatureonce{10000}{
226% \testfeatureonce{10}{
227    \startframedrow
228        \startframedcell%[backgroundcolor=yellow]
229        test
230        \stopframedcell
231        \startframedcell
232        test \par test
233        \stopframedcell
234    \stopframedrow
235}
236\stopframedtable
237
238\stoptext
239