1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16\unprotect
17
18\writestatus{loading}{ConTeXt Table Macros Framed Tables}
19
20\installcorenamespace{framedtable}
21\installcorenamespace{framedtablerow}
22\installcorenamespace{framedtablecolumn}
23
24\newcount\c_tabl_framed_c
25\newcount\c_tabl_framed_r
26\newdimen\d_tabl_framed_h
27\newdimen\d_tabl_framed_d
28\newdimen\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
49
50
51\unexpanded\def\defineframedtable
52 {\dodoubleempty\tabl_framed_define}
53
54\def\tabl_framed_define[#1][#2]
55 {\ifsecondargument
56 \defineframed[\??framedtable#1][\??framedtable#2]
57 \else\iffirstargument
58 \defineframed[\??framedtable#1][\??framedtable]
59 \fi\fi}
60
61
62
63\unexpanded\def\setupframedtable
64 {\dodoubleempty\tabl_framed_setup}
65
66\def\tabl_framed_setup[#1][#2]
67 {\ifsecondargument
68 \ifcsname\??framed:\??framedtable#1\endcsname \else
69 \defineframed[\??framedtable#1][\??framedtable]
70 \fi
71 \setupframed[\??framedtable#1][#2]
72 \else
73 \setupframed[\??framedtable][#1]
74 \fi}
75
76
77
78
79\unexpanded\def\setupframedtablerow
80 {\dotripleempty\tabl_framed_setup_row}
81
82\def\tabl_framed_setup_row[#1][#2][#3]
83 {\ifthirdargument
84 \ifcsname\??framed:\??framedtable#1\endcsname \else
85 \defineframed[\??framedtable#1][\??framedtable]
86 \fi
87 \ifcsname\??framed:\??framedtablerow#1:#2\endcsname \else
88 \defineframed[\??framedtablerow#1:#2][\??framedtable#1]
89 \fi
90 \setupframed[\??framedtablerow#1:#2][#3]
91 \else\ifsecondargument
92 \ifcsname\??framed:\??framedtablerow:#1\endcsname \else
93 \defineframed[\??framedtablerow:#1][\??framedtable]
94 \fi
95 \setupframed[\??framedtablerow:#1][#2]
96 \fi\fi}
97
98\unexpanded\def\setupframedtablecolumn
99 {\dotripleempty\tabl_framed_setup_column}
100
101\def\tabl_framed_setup_column[#1][#2][#3]
102 {\ifthirdargument
103 \ifcsname\??framed:\??framedtable#1\endcsname \else
104 \defineframed[\??framedtable#1][\??framedtable]
105 \fi
106 \ifcsname\??framed:\??framedtablecolumn#1:#2\endcsname \else
107 \defineframed[\??framedtablecolumn#1:#2][\??framedtable#1]
108 \fi
109 \setupframed[\??framedtablecolumn#1:#2][#3]
110 \else\ifsecondargument
111 \ifcsname\??framed:\??framedtablecolumn:#1\endcsname \else
112 \defineframed[\??framedtablecolumn:#1][\??framedtable]
113 \fi
114 \setupframed[\??framedtablecolumn:#1][#2]
115 \fi\fi}
116
117\unexpanded\def\startframedtable
118 {\dodoubleempty\tabl_framed_start}
119
120\unexpanded\def\tabl_framed_start[#1][#2]
121 {\begingroup
122 \forgetall
123 \doifelseassignment{#1}
124 {\let\currentframedtable\empty
125 \setupframed[\??framedtable][#1]}
126 {\edef\currentframedtable{#1}
127 \setupframed[\??framedtable][#2]}
128 \edef\currentframed{\??framedtable\currentframedtable}
129 \c_tabl_framed_r\zerocount
130 \d_tabl_framed_d\framedparameter\c!distance
131 \framedparameter\c!before}
132
133\unexpanded\def\stopframedtable
134 {\framedparameter\c!after
135 \endgroup}
136
137
138
139\unexpanded\def\startframedrow
140 {\advance\c_tabl_framed_r\plusone
141 \c_tabl_framed_c\zerocount
142 \d_tabl_framed_h\zeropoint
143 \bgroup
144 \edef\currentframed{\number\c_tabl_framed_r}
145 \edef\currentframed
146 {\??framedtablerow\currentframedtable
147 \ifcsname\??framedtablerow\currentframedtable:\currentframed\endcsname
148 :\currentframed
149 \else\ifcsname\??framedtablerow\currentframedtable:\v!each\endcsname
150 :\v!each
151 \fi\fi}
152 \dosingleempty\pack_framed_start_framed_nop_indeed}
153
154\unexpanded\def\stopframedrow
155 {\dofastloopcs\c_tabl_framed_c\tabl_framed_flush_row
156 \stopframed
157 \nointerlineskip
158 \vskip\zeropoint\relax
159 \framedparameter\c!inbetween}
160
161\unexpanded\def\tabl_framed_flush_row
162 {\vpack to \d_tabl_framed_h{\flushbox\??framedtable{\number\fastloopindex}\vfill}
163 \ifzeropt\d_tabl_framed_d\else\kern\d_tabl_framed_d\fi}
164
165\newcount\c_tabl_framed_pass
166
167\let\stopframedrow\relax
168
169\unexpanded\def\startframedrow#1\stopframedrow
170 {\advance\c_tabl_framed_r\plusone
171 \startframedrow_one#1\stopframedrow_one
172 \startframedrow_two#1\stopframedrow_two}
173
174\def\startframedrow_one
175 {\bgroup
176 \c_tabl_framed_pass\plusone
177 \c_tabl_framed_c\zerocount
178 \d_tabl_framed_h\zeropoint
179 \settrialtypesetting
180 \gobblesingleempty}
181
182\unexpanded\def\stopframedrow_one
183 {\normalexpanded{\egroup\d_tabl_framed_h\the\d_tabl_framed_h\relax}}
184
185\def\startframedrow_two
186 {\bgroup
187 \c_tabl_framed_c\zerocount
188 \c_tabl_framed_pass\plustwo
189 \edef\currentframed{\number\c_tabl_framed_r}
190 \edef\currentframed
191 {\??framedtablerow\currentframedtable
192 \ifcsname\??framedtablerow\currentframedtable:\currentframed\endcsname
193 :\currentframed
194 \else\ifcsname\??framedtablerow\currentframedtable:\v!each\endcsname
195 :\v!each
196 \fi\fi}
197 \dosingleempty\pack_framed_start_framed_nop_indeed}
198
199\unexpanded\def\stopframedrow_two
200 {\dofastloopcs\c_tabl_framed_c\tabl_framed_flush_row
201 \stopframed
202 \nointerlineskip
203 \vskip\zeropoint\relax
204 \framedparameter\c!inbetween}
205
206\unexpanded\def\tabl_framed_flush_row_two
207 {\vpack to \d_tabl_framed_h{\flushbox\??framedtable{\number\fastloopindex}\vfill}
208 \ifzeropt\d_tabl_framed_d\else\kern\d_tabl_framed_d\fi}
209
210
211\unexpanded\def\startframedcell
212 {\advance\c_tabl_framed_c\plusone
213 \setbox\b_tabl_framed\hpack\bgroup
214
215 \edef\currentframed{\number\c_tabl_framed_c}
216 \edef\currentframed
217 {\??framedtablecolumn\currentframedtable
218 \ifcsname\??framedtablecolumn\currentframedtable:\currentframed\endcsname
219 :\currentframed
220 \else\ifcsname\??framedtablecolumn\currentframedtable:\v!each\endcsname
221 :\v!each
222 \fi\fi}
223 \ifcase\c_tabl_framed_pass
224 \or
225 \letframedparameter\c!background\empty
226 \letframedparameter\c!frame\v!off
227 \or
228 \letframedparameter\c!height\d_tabl_framed_h
229 \fi
230 \dosingleempty\pack_framed_start_framed_nop_indeed}
231
232\unexpanded\def\stopframedcell
233 {\stopframed
234
235 \ifcase\c_tabl_framed_pass
236 \or
237 \ifdim\ht\b_tabl_framed>\d_tabl_framed_h
238 \d_tabl_framed_h\ht\b_tabl_framed
239 \fi
240 \else
241 \savebox\??framedtable{\number\c_tabl_framed_c}{\box\b_tabl_framed}
242 \fi}
243
244\protect \endinput
245
246\starttext
247
248\setupframedtablecolumn [1] [width=3cm,background=color,backgroundcolor=red]
249\setupframedtablecolumn [2] [width=4cm,background=color,backgroundcolor=green,align=normal]
250
251
252
253\startframedtable[inbetween=\kern0.4pt,distance=0.4pt]
254
255\testfeatureonce{10000}{
256
257 \startframedrow
258 \startframedcell
259 test
260 \stopframedcell
261 \startframedcell
262 test \par test
263 \stopframedcell
264 \stopframedrow
265}
266\stopframedtable
267
268\stoptext
269 |