xtables-mkiv.tex /size: 39 Kb    last modification: 2023-12-21 09:43
1% language=us runpath=texruns:manuals/xtables
2
3% author    : Hans Hagen
4% copyright : ConTeXt Development Team
5% license   : Creative Commons Attribution ShareAlike 4.0 International
6% reference : pragma-ade.nl | contextgarden.net | texlive (related) distributions
7% origin    : the ConTeXt distribution
8%
9% comment   : Because this manual is distributed with TeX distributions it comes with a rather
10%             liberal license. We try to adapt these documents to upgrades in the (sub)systems
11%             that they describe. Using parts of the content otherwise can therefore conflict
12%             with existing functionality and we cannot be held responsible for that. Many of
13%             the manuals contain characteristic graphics and personal notes or examples that
14%             make no sense when used out-of-context.
15%
16% comment   : Some chapters might have been published in TugBoat, the NTG Maps, the ConTeXt
17%             Group journal or otherwise. Thanks to the editors for corrections. Also thanks
18%             to users for testing, feedback and corrections.
19
20\usemodule[art-01,abr-02]
21
22\definecolor[red]    [darkred]
23\definecolor[green]  [darkgreen]
24\definecolor[blue]   [darkblue]
25\definecolor[yellow] [darkyellow]
26\definecolor[magenta][darkmagenta]
27\definecolor[cyan]   [darkcyan]
28
29\setupexternalfigures
30  [location={local,default}]
31
32\setupbodyfont
33  [10pt]
34
35\setuptyping
36  [color=darkyellow]
37
38\setuptype
39  [color=darkcyan]
40
41% \setupnumbering
42%   [alternative=doublesided]
43
44\setuphead
45  [section]
46  [color=darkmagenta]
47
48\setupinteraction
49  [hidden]
50
51\startdocument
52  [metadata:author=Hans Hagen,
53   metadata:title=Extreme Tables,
54   author=Hans Hagen,
55   affiliation=PRAGMA ADE,
56   location=Hasselt NL,
57   title=Extreme Tables,
58   extra=ConTeXt MkIV,
59   support=www.contextgarden.net,
60   website=www.pragma-ade.nl]
61
62\startMPpage
63
64    StartPage ;
65        fill Page enlarged 2mm withcolor magenta/4 ;
66        pickup pencircle scaled 2mm ;
67        numeric n ; n := bbheight Page ;
68        forever :
69            n := n / 1.5 ;
70            draw bottomboundary Page shifted (0, n) withcolor 2yellow/3 withtransparency (1,0.5) ;
71            draw topboundary    Page shifted (0,-n) withcolor 2yellow/3 withtransparency (1,0.5) ;
72            exitif n < 2cm ;
73        endfor ;
74        numeric n ; n := bbheight Page ;
75        forever :
76            n := n / 1.5 ;
77            draw leftboundary  Page shifted ( n,0) withcolor 2cyan/3 withtransparency (1,0.5) ;
78            draw rightboundary Page shifted (-n,0) withcolor 2cyan/3 withtransparency (1,0.5) ;
79            exitif n < 2cm ;
80        endfor ;
81        picture p, q, r ;
82        p := textext("\ssbf\WORD{\documentvariable{title}}") xsized (bbheight Page - 2cm) rotated 90 ;
83        q := textext("\ssbf\WORD{\documentvariable{author}}") ysized 1cm ;
84        r := textext("\ssbf\WORD{\documentvariable{extra}}") xsized bbwidth q ;
85        draw anchored.rt (p, center rightboundary  Page shifted (-1cm,0cm)) withcolor white ;
86        draw anchored.bot(q, center bottomboundary Page shifted ( 1cm,4.4cm)) withcolor white ;
87        draw anchored.bot(r, center bottomboundary Page shifted ( 1cm,2.8cm)) withcolor white ;
88    StopPage ;
89
90\stopMPpage
91
92% \page[empty] \setuppagenumber[start=1]
93
94\startsubject[title={Contents}]
95
96\placelist[section][criterium=all,interaction=all]
97
98\stopsubject
99
100\startsection[title={Introduction}]
101
102This is a short introduction to yet another table mechanism built in \CONTEXT. It
103is a variant of the so called natural tables but it has a different
104configuration. Also, the implementation is completely different. The reason for
105writing it is that in one of our projects we had to write styles for documents
106that had tables spanning 30 or more pages and apart from memory constraints this
107is quite a challenge for the other mechanisms, if only because splitting them
108into successive floats is not possible due to limitations of \TEX. The extreme
109table mechanism can handle pretty large tables and split them too. As each cell
110is basically a \type {\framed} and as we need to do two passes over the table,
111this mechanism is not the fastest but it is some two times faster than the
112natural tables mechanism, and in most cases can be used instead.
113
114\stopsection
115
116\startsection[title={The structure}]
117
118The structure of the tables is summarized here. There can be the usual head, body
119and foot specifications and we also support the optional header in following
120pages.
121
122\starttyping
123\definextable [tag] | [tag][parent]
124\setupxtable [settings] | [tag][settings]
125
126\startxtable[tag|settings]
127  \startxtablehead|next|body|foot[tag|settings]
128    \startxrowgroup[tag|settings]
129      \startxrow[settings]
130        \startxcellgroup[tag|settings]
131          \startxcell[settings] ... \stopxcell
132        \stopxcellgroup
133      \stopxrow
134    \stopxrowgroup
135  \stopxtablehead|next|body|foot
136\stopxtable
137\stoptyping
138
139Contrary to what you might expect, the definition command defines a new set of
140command. You don't need to use this in order to set up a new settings
141environment. Settings and definitions can inherit so you can build a chain of
142parent|-|child settings. The grouping is nothing more than a switch to a new set
143of settings.
144
145\stopsection
146
147\startsection[title={Direct control}]
148
149A simple table with just frames is defined as follows:
150
151\startbuffer
152\startxtable
153  \startxrow
154    \startxcell one   \stopxcell
155    \startxcell two   \stopxcell
156  \stopxrow
157  \startxrow
158    \startxcell alpha \stopxcell
159    \startxcell beta  \stopxcell
160  \stopxrow
161\stopxtable
162\stopbuffer
163
164\typebuffer
165
166\startlinecorrection[blank] \getbuffer \stoplinecorrection
167
168You can pass parameters for tuning the table:
169
170\startbuffer
171\startxtable[offset=1cm]
172  \startxrow
173    \startxcell one   \stopxcell
174    \startxcell two   \stopxcell
175  \stopxrow
176  \startxrow
177    \startxcell alpha \stopxcell
178    \startxcell beta  \stopxcell
179  \stopxrow
180\stopxtable
181\stopbuffer
182
183\typebuffer
184
185\startlinecorrection[blank] \getbuffer \stoplinecorrection
186
187You can (for as much as they make sense) use the same settings as the \type
188{\framed} command, as long as you keep in mind that messing with the frame
189related offsets can have side effects.
190
191\stopsection
192
193\startsection[title={Sets of settings}]
194
195Instead of directly passing settings you can use a predefined set. Of course you
196can also combine these methods.
197
198\startbuffer
199\definextable
200  [myxtable]
201
202\definextable
203  [myxtable:important]
204  [myxtable]
205
206\setupxtable
207  [myxtable]
208  [width=4cm,
209   foregroundcolor=red]
210
211\setupxtable
212  [myxtable:important]
213  [background=color,
214   backgroundcolor=red,
215   foregroundcolor=white]
216\stopbuffer
217
218\typebuffer \getbuffer
219
220We can use these settings in table. Although it is not really needed to define a
221set beforehand (i.e.\ you can just use the setup command) it is cleaner and more
222efficient too.
223
224\startbuffer
225\startxtable[myxtable]
226  \startxrow[foregroundcolor=green]
227    \startxcell one \stopxcell
228    \startxcell two \stopxcell
229    \startxcellgroup[foregroundcolor=blue]
230      \startxcell tree  \stopxcell
231      \startxcell four  \stopxcell
232    \stopxcellgroup
233  \stopxrow
234  \startxrow
235    \startxcell alpha \stopxcell
236    \startxcell beta  \stopxcell
237    \startxcellgroup[myxtable:important]
238      \startxcell gamma \stopxcell
239      \startxcell delta \stopxcell
240    \stopxcellgroup
241  \stopxrow
242\stopxtable
243\stopbuffer
244
245\typebuffer
246
247\startlinecorrection[blank] \getbuffer \stoplinecorrection
248
249The overhead of (chained) settings is quite acceptable and it helps to keep the
250source of the table uncluttered from specific settings.
251
252\stopsection
253
254\startsection[title={Defining}]
255
256If needed you can define your own encapsulating commands. The following example
257demonstrates this:
258
259\startbuffer
260\definextable[mytable]
261\stopbuffer
262
263\getbuffer \typebuffer
264
265We now can use the \type{mytable} wrapper:
266
267\startbuffer
268\startmytable[height=4cm,width=8cm,align={middle,lohi}]
269  \startxrow
270    \startxcell test \stopxcell
271  \stopxrow
272\stopmytable
273\stopbuffer
274
275\typebuffer
276
277\startlinecorrection[blank] \getbuffer \stoplinecorrection
278
279One drawback of using buffers is that they don't play well in macro definitions.
280In that case you need to use the following wrapper:
281
282\startbuffer
283\starttexdefinition MyTable #1#2#3#4
284  \startembeddedxtable
285    \startxrow
286      \startxcell #1 \stopxcell
287      \startxcell #2 \stopxcell
288    \stopxrow
289    \startxrow
290      \startxcell #3 \stopxcell
291      \startxcell #4 \stopxcell
292    \stopxrow
293  \stopembeddedxtable
294\stoptexdefinition
295\stopbuffer
296
297\typebuffer \getbuffer
298
299This macro is used as any other macro with arguments:
300
301\startbuffer
302\MyTable{one}{two}{three}{four}
303\stopbuffer
304
305\typebuffer
306
307\startlinecorrection[blank] \getbuffer \stoplinecorrection
308
309\stopsection
310
311\startsection[title={Stretching}]
312
313If you don't give the width of a cell, the widest natural size will be taken.
314Otherwise the given width applies to the whole column.
315
316\startbuffer
317\startxtable
318  \startxrow
319    \startxcell[width=1cm] one  \stopxcell
320    \startxcell[width=2cm] two  \stopxcell
321    \startxcell[width=3cm] tree \stopxcell
322    \startxcell[width=4cm] four \stopxcell
323  \stopxrow
324  \startxrow
325    \startxcell alpha \stopxcell
326    \startxcell beta  \stopxcell
327    \startxcell gamma \stopxcell
328    \startxcell delta \stopxcell
329  \stopxrow
330\stopxtable
331\stopbuffer
332
333\typebuffer
334
335\startlinecorrection[blank] \getbuffer \stoplinecorrection
336
337You can let the cells stretch so that the whole width of the text area is taken.
338
339\startbuffer[one]
340\startxtable[option=stretch]
341  \startxrow
342    \startxcell[width=1cm] one  \stopxcell
343    \startxcell[width=2cm] two  \stopxcell
344    \startxcell[width=3cm] tree \stopxcell
345    \startxcell[width=4cm] four \stopxcell
346  \stopxrow
347  \startxrow
348    \startxcell alpha \stopxcell
349    \startxcell beta  \stopxcell
350    \startxcell gamma \stopxcell
351    \startxcell delta \stopxcell
352  \stopxrow
353\stopxtable
354\stopbuffer
355
356\typebuffer[one]
357
358The available left over space is equally distributed among the cells.
359
360\startlinecorrection[blank] \getbuffer[one] \stoplinecorrection
361
362\startbuffer[two]
363\startxtable[option={stretch,width}]
364  \startxrow
365    \startxcell[width=1cm] one  \stopxcell
366    \startxcell[width=2cm] two  \stopxcell
367    \startxcell[width=3cm] tree \stopxcell
368    \startxcell[width=4cm] four \stopxcell
369  \stopxrow
370  \startxrow
371    \startxcell alpha \stopxcell
372    \startxcell beta  \stopxcell
373    \startxcell gamma \stopxcell
374    \startxcell delta \stopxcell
375  \stopxrow
376\stopxtable
377\stopbuffer
378
379An alternative is to distribute the space proportionally:
380
381\typebuffer[two]
382
383\startlinecorrection[blank] \getbuffer[two] \stoplinecorrection
384
385Just to stress the difference we show both alongside now:
386
387\startlinecorrection[blank]
388    \getbuffer[one]
389    \blank
390    \getbuffer[two]
391\stoplinecorrection
392
393You can specify the width of a cell with each cell but need to keep into mind
394that that value is then used for the whole column:
395
396\startbuffer
397\startxtable
398  \startxrow
399    \startxcell[width=1em] one  \stopxcell
400    \startxcell[width=2em] two  \stopxcell
401    \startxcell[width=3em] tree \stopxcell
402    \startxcell[width=4em] four \stopxcell
403  \stopxrow
404  \startxrow
405    \startxcell alpha \stopxcell
406    \startxcell beta  \stopxcell
407    \startxcell gamma \stopxcell
408    \startxcell delta \stopxcell
409  \stopxrow
410\stopxtable
411\stopbuffer
412
413\typebuffer
414
415\startlinecorrection[blank] \getbuffer \stoplinecorrection
416
417You can enforce that larger columns win via the \type {option} parameter:
418
419\startbuffer
420\startxtable[option=max]
421  \startxrow
422    \startxcell[width=1em] one  \stopxcell
423    \startxcell[width=2em] two  \stopxcell
424    \startxcell[width=3em] tree \stopxcell
425    \startxcell[width=4em] four \stopxcell
426  \stopxrow
427  \startxrow
428    \startxcell alpha \stopxcell
429    \startxcell beta  \stopxcell
430    \startxcell gamma \stopxcell
431    \startxcell delta \stopxcell
432  \stopxrow
433\stopxtable
434\stopbuffer
435
436\typebuffer
437
438\startlinecorrection[blank] \getbuffer \stoplinecorrection
439
440\stopsection
441
442\startsection[title={Spacing}]
443
444It is possible to separate the cells by horizontal and/or vertical space. As an
445example we create a setup.
446
447\startbuffer
448\setupxtable
449  [myztable]
450  [option=stretch,
451   foregroundcolor=blue,
452   columndistance=10pt,
453   leftmargindistance=20pt,
454   rightmargindistance=30pt]
455\stopbuffer
456
457\typebuffer \getbuffer
458
459You can use the \type {textwidth} parameter to set a specific maximum width. We
460now apply the previous settings to an extreme table:
461
462\startbuffer
463\startxtable[myztable]
464  \startxrow
465    \startxcell[width=1cm] one              \stopxcell
466    \startxcell[width=2cm,distance=5pt] two \stopxcell
467    \startxcell[width=3cm] tree             \stopxcell
468    \startxcell[width=4cm] four             \stopxcell
469  \stopxrow
470  \startxrow
471    \startxcell[width=1cm] alpha \stopxcell
472    \startxcell[width=2cm] beta  \stopxcell
473    \startxcell[width=3cm] gamma \stopxcell
474    \startxcell[width=4cm] delta \stopxcell
475  \stopxrow
476\stopxtable
477\stopbuffer
478
479\typebuffer
480
481As you can see here, we can still locally overload the settings but keep in mind
482that these apply to the whole column then, not to the specific cell.
483
484\startlinecorrection[blank] \getbuffer \stoplinecorrection
485
486Vertical spacing is (currently) setup differently, i.e.\ as an argument to the
487\type {\blank} command.
488
489\startbuffer
490\startxtable[spaceinbetween=medium]
491  \startxrow
492    \startxcell one  \stopxcell
493    \startxcell two  \stopxcell
494    \startxcell tree \stopxcell
495    \startxcell four \stopxcell
496  \stopxrow
497  \startxrow
498    \startxcell alpha \stopxcell
499    \startxcell beta  \stopxcell
500    \startxcell gamma \stopxcell
501    \startxcell delta \stopxcell
502  \stopxrow
503\stopxtable
504\stopbuffer
505
506\typebuffer
507
508Specifying spacing this way improves consistency with the rest of the document
509spacing.
510
511\startlinecorrection[blank] \getbuffer \stoplinecorrection
512
513\stopsection
514
515\startsection[title={Spanning}]
516
517Of course we can span cells horizontally as well as vertically. Future versions
518might provide more advanced options but the basics work okay.
519
520\startbuffer
521\startxtable
522  \startxrow
523    \startxcell one \stopxcell
524    \startxcell[nx=2] two + three \stopxcell
525    \startxcell four \stopxcell
526    \startxcell five \stopxcell
527  \stopxrow
528  \startxrow
529    \startxcell[nx=3] alpha + beta + gamma \stopxcell
530    \startxcell[nx=2] delta + epsilon \stopxcell
531  \stopxrow
532\stopxtable
533\stopbuffer
534
535\typebuffer
536
537This spans a few cells horizontally:
538
539\startlinecorrection[blank] \getbuffer \stoplinecorrection
540
541The next example gives a span in two directions:
542
543\startbuffer
544\startxtable
545  \startxrow
546    \startxcell alpha 1 \stopxcell
547    \startxcell beta  1 \stopxcell
548    \startxcell gamma 1 \stopxcell
549    \startxcell delta 1 \stopxcell
550  \stopxrow
551  \startxrow
552    \startxcell alpha 2 \stopxcell
553    \startxcell[nx=2,ny=2] whatever \stopxcell
554    \startxcell delta 2 \stopxcell
555  \stopxrow
556  \startxrow
557    \startxcell alpha 3 \stopxcell
558    \startxcell delta 3 \stopxcell
559  \stopxrow
560  \startxrow
561    \startxcell alpha 4 \stopxcell
562    \startxcell beta  4 \stopxcell
563    \startxcell gamma 4 \stopxcell
564    \startxcell delta 4 \stopxcell
565  \stopxrow
566\stopxtable
567\stopbuffer
568
569\typebuffer
570
571Of course, spanning is always a compromise but the best fit found by this
572mechanism takes natural width, given width and available space into account.
573
574\startlinecorrection[blank] \getbuffer \stoplinecorrection
575
576\stopsection
577
578\startsection[title={Partitioning}]
579
580You can partition a table as follows:
581
582\startbuffer
583\startxtable
584  \startxtablehead
585    \startxrow
586      \startxcell head one  \stopxcell
587      \startxcell head two  \stopxcell
588      \startxcell head tree \stopxcell
589      \startxcell head four \stopxcell
590    \stopxrow
591  \stopxtablehead
592  \startxtablenext
593    \startxrow
594      \startxcell next one  \stopxcell
595      \startxcell next two  \stopxcell
596      \startxcell next tree \stopxcell
597      \startxcell next four \stopxcell
598    \stopxrow
599  \stopxtablenext
600  \startxtablebody
601    \startxrow
602      \startxcell body one  \stopxcell
603      \startxcell body two  \stopxcell
604      \startxcell body tree \stopxcell
605      \startxcell body four \stopxcell
606    \stopxrow
607  \stopxtablebody
608  \startxtablefoot
609    \startxrow
610      \startxcell foot one  \stopxcell
611      \startxcell foot two  \stopxcell
612      \startxcell foot tree \stopxcell
613      \startxcell foot four \stopxcell
614    \stopxrow
615  \stopxtablefoot
616\stopxtable
617\stopbuffer
618
619\typebuffer
620
621There can be multiple such partitions and they are collected in head, next, body
622and foot groups. Normally the header ends up at the beginning and the footer at
623the end. When a table is split, the first page gets the header and the following
624pages the next one.
625
626You can let headers and footers be repeated by setting the \type {header}
627and|/|or \type {footer} parameters to \type {repeat}.
628
629\starttyping
630\setupxtable
631  [split=yes,
632   header=repeat,
633   footer=repeat]
634\stoptyping
635
636The table can be flushed in the running text but also in successive
637floats. Given that the table is in a buffer:
638
639\starttyping
640\placetable[here,split]{A big table.}{\getbuffer}
641\stoptyping
642
643When you specify \type {split} as \type {yes} the caption is taken into account
644when calculating the available space.
645
646There are actually three different split methods. The \type {yes} option works in
647text mode as well as in floats, but in text mode no headers and footers get
648repeated. If you want that feature in a text flush you have to set \type {split}
649to \type {repeat} as well.
650
651You can keep rows together by passing a \type {samepage} directive. This
652parameter can get the values \type {before}, \type {after} and \type {both}.
653
654\starttyping
655\startxtable[split=yes]
656  \startxrow                \startxcell \tttf      .01. \stopxcell \stopxrow
657  \startxrow                \startxcell \tttf      .... \stopxcell \stopxrow
658  \startxrow                \startxcell \tttf \red .21. \stopxcell \stopxrow
659  \startxrow[samepage=both] \startxcell \tttf \red .22. \stopxcell \stopxrow
660  \startxrow[samepage=both] \startxcell \tttf \red .23. \stopxcell \stopxrow
661  \startxrow                \startxcell \tttf      .... \stopxcell \stopxrow
662  \startxrow                \startxcell \tttf      .99. \stopxcell \stopxrow
663\stopxtable
664\stoptyping
665
666\stopsection
667
668\startsection[title={Options}]
669
670On the average a table will come out okay but you need to keep in mind that when
671(complex) spans are used the results can be less that optimal. However, as
672normally one pays attention to creating tables, the amount of control provided
673often makes it possible to get what you want.
674
675In the following situations, the first cell width is determined by the span. It
676is possible to make a more clever analyzer but we need to keep in mind that in
677the same column there can be entries that span a different amount of columns. Not
678only would that be inefficient but it would also be rather unpredictable unless
679you know exactly what happens deep down. The following two examples demonstrate
680default behaviour.
681
682\startbuffer
683\startxtable
684  \startxrow
685    \startxcell[nx=3]
686        1/2/3
687    \stopxcell
688  \stopxrow
689  \startxrow
690    \startxcell 1 \stopxcell
691    \startxcell 2 \stopxcell
692    \startxcell 3 \stopxcell
693  \stopxrow
694\stopxtable
695\stopbuffer
696
697\typebuffer \getbuffer
698
699\startbuffer
700\startxtable
701  \startxrow
702    \startxcell[nx=3]
703        1 / 2 / 3
704    \stopxcell
705  \stopxrow
706  \startxrow
707    \startxcell 1 \stopxcell
708    \startxcell 2 \stopxcell
709    \startxcell 3 \stopxcell
710  \stopxrow
711\stopxtable
712\stopbuffer
713
714\typebuffer \getbuffer
715
716In practice you will set the width of the columns, as in:
717
718\startbuffer
719\startxtable
720  \startxrow
721    \startxcell[nx=3]
722        1/2/3
723    \stopxcell
724  \stopxrow
725  \startxrow
726    \startxcell[width=\dimexpr\textwidth/3] 1 \stopxcell
727    \startxcell[width=\dimexpr\textwidth/3] 2 \stopxcell
728    \startxcell[width=\dimexpr\textwidth/3] 3 \stopxcell
729  \stopxrow
730\stopxtable
731\stopbuffer
732
733\typebuffer \getbuffer
734
735But, if you want you can control the enforced width by setting an option:
736
737\startbuffer
738\startxtable
739  \startxrow
740    \startxcell[nx=3,option=tight]
741        1/2/3
742    \stopxcell
743  \stopxrow
744  \startxrow
745    \startxcell 1 \stopxcell
746    \startxcell 2 \stopxcell
747    \startxcell 3 \stopxcell
748  \stopxrow
749\stopxtable
750\stopbuffer
751
752\typebuffer \getbuffer
753
754\startbuffer
755\startxtable
756  \startxrow
757    \startxcell[nx=3,option=tight]
758        1 / 2 / 3
759    \stopxcell
760  \stopxrow
761  \startxrow
762    \startxcell 1 \stopxcell
763    \startxcell 2 \stopxcell
764    \startxcell 3 \stopxcell
765  \stopxrow
766\stopxtable
767\stopbuffer
768
769\typebuffer \getbuffer
770
771There is also a global setting:
772
773\startbuffer
774\startxtable[option=tight]
775  \startxrow
776    \startxcell[nx=3]
777      1/2/3
778    \stopxcell
779  \stopxrow
780  \startxrow
781    \startxcell 1 \stopxcell
782    \startxcell 2 \stopxcell
783    \startxcell 3 \stopxcell
784  \stopxrow
785\stopxtable
786\stopbuffer
787
788\typebuffer \getbuffer
789
790\stopsection
791
792\startsection[title={Nesting}]
793
794Extreme tables can be nested but you need to keep an eye on inheritance here as
795the inner table uses the settings from the encapsulating cell. The widths and
796heights of the inner table default to \type {fit}. We could cook up a more
797complex nesting model but this one is easy to follow.
798
799\startbuffer
800\startxtable
801  \startxrow
802    \startxcell[offset=0pt]
803      \startxtable[background=color,backgroundcolor=green,
804            foregroundcolor=white,offset=1ex]
805        \startxrow
806          \startxcell[width=1cm] one \stopxcell
807          \startxcell[width=2cm] two \stopxcell
808        \stopxrow
809        \startxrow
810          \startxcell[width=3cm] alpha \stopxcell
811          \startxcell[width=4cm] beta  \stopxcell
812        \stopxrow
813      \stopxtable
814    \stopxcell
815    \startxcell two   \stopxcell
816  \stopxrow
817  \startxrow
818    \startxcell alpha \stopxcell
819    \startxcell
820      \startxtable[background=color,backgroundcolor=red,
821            foregroundcolor=white]
822        \startxrow
823          \startxcell one \stopxcell
824          \startxcell two \stopxcell
825        \stopxrow
826        \startxrow
827          \startxcell alpha \stopxcell
828          \startxcell beta  \stopxcell
829        \stopxrow
830      \stopxtable
831    \stopxcell
832  \stopxrow
833\stopxtable
834\stopbuffer
835
836\typebuffer
837
838Here we just manipulate the offset a bit.
839
840\startlinecorrection[blank] \getbuffer \stoplinecorrection
841
842\stopsection
843
844\startsection[title={Buffers}]
845
846When you don't want to clutter your document source too much buffers can be if
847help:
848
849\startbuffer
850\startbuffer[test]
851\startxtable
852  \startxrow
853    \startxcell[width=1cm] one \stopxcell
854    \startxcell[width=2cm] two \stopxcell
855  \stopxrow
856  \startxrow
857    \startxcell alpha \stopxcell
858    \startxcell beta  \stopxcell
859  \stopxrow
860\stopxtable
861\stopbuffer
862\stopbuffer
863
864\typebuffer \getbuffer
865
866One way of getting this table typeset is to say:
867
868\starttyping
869\getbuffer[test]
870\stoptyping
871
872Normally this is quite okay. However, internally extreme tables become also
873buffers. If you don't like the overhead of this double buffering you can use the
874following command:
875
876\starttyping
877\processxtablebuffer[test]
878\stoptyping
879
880This can save you some memory and runtime, but don't expect miracles. Also, this
881way of processing does not support nested tables (unless \type {{}} is used).
882
883\stopsection
884
885\startsection[title={XML}]
886
887The following example demonstrates that we can use this mechanism in \XML\ too.
888The example was provided by Thomas Schmitz. First we show how a table looks like
889in \XML:
890
891\startbuffer[test]
892<table>
893  <tablerow>
894      <tablecell>
895        One
896      </tablecell>
897      <tablecell>
898        Two
899      </tablecell>
900  </tablerow>
901  <tablerow>
902    <tablecell>
903      <b>Three</b>
904    </tablecell>
905    <tablecell>
906      Four
907    </tablecell>
908  </tablerow>
909</table>
910\stopbuffer
911
912\typebuffer[test]
913
914We need to map these elements to setups:
915
916\startbuffer
917\startxmlsetups xml:testsetups
918    \xmlsetsetup{main}{b|table|tablerow|tablecell}{xml:*}
919\stopxmlsetups
920
921\xmlregistersetup{xml:testsetups}
922\stopbuffer
923
924\typebuffer \getbuffer
925
926The setups themselves are rather simple as we don't capture any attributes.
927
928\startbuffer
929\startxmlsetups xml:b
930  \bold{\xmlflush{#1}}
931\stopxmlsetups
932
933\startxmlsetups xml:table
934  \startembeddedxtable
935    \xmlflush{#1}
936  \stopembeddedxtable
937\stopxmlsetups
938
939\startxmlsetups xml:tablerow
940  \startxrow
941    \xmlflush{#1}
942  \stopxrow
943\stopxmlsetups
944
945\startxmlsetups xml:tablecell
946  \startxcell
947    \xmlflush{#1}
948  \stopxcell
949\stopxmlsetups
950\stopbuffer
951
952\typebuffer \getbuffer
953
954We now process the example. Of course it will also work for files.
955
956\startbuffer
957\xmlprocessbuffer{main}{test}{}
958\stopbuffer
959
960\typebuffer
961
962The result is:
963
964\startlinecorrection[blank] \getbuffer \stoplinecorrection
965
966\stopsection
967
968\startsection[title={Natural tables}]
969
970For the impatient a small additional module is provided that remaps the natural
971table commands onto extreme tables:
972
973\startbuffer
974\usemodule[ntb-to-xtb]
975\stopbuffer
976
977\typebuffer \getbuffer
978
979After that:
980
981\startbuffer
982\bTABLE
983  \bTR
984    \bTD[background=color,backgroundcolor=red] one \eTD
985    \bTD[width=2cm] two \eTD
986  \eTR
987  \bTR
988    \bTD[width=5cm] alpha \eTD
989    \bTD[background=color,backgroundcolor=yellow] beta \eTD
990  \eTR
991\eTABLE
992\stopbuffer
993
994\typebuffer
995
996Will come out as:
997
998\startlinecorrection[blank]
999\getbuffer
1000\stoplinecorrection
1001
1002You can restore and remap the commands with the following helpers:
1003
1004\starttyping
1005\restoreTABLEfromxtable
1006\mapTABLEtoxtable
1007\stoptyping
1008
1009Of course not all functionality of the natural tables maps onto similar
1010functionality of extreme tables, but on the average the result will look rather
1011similar.
1012
1013\stopsection
1014
1015\startsection[title={Alignment}]
1016
1017\enabletrackers[typesetters.characteralign]
1018
1019There is limited support for aligning numbers in columns. When you flush right
1020and have a fixed number of digits it's not a problem, but otherwise it might come
1021in handy. In any case, you might want to use the following as part of your style:
1022
1023\starttyping
1024\addfeature[tabularnumbers]
1025\stoptyping
1026
1027\start \addfeature[tabularnumbers]
1028
1029The basic alignment mechanism can be demonstrated with the following examples:
1030
1031\startbuffer
1032\startcharacteralign[,] % or [character={,}]
1033    \checkcharacteralign{123.456,78} \par
1034    \checkcharacteralign    {456}    \par
1035    \checkcharacteralign {23.456}    \par
1036    \checkcharacteralign     {78,9}  \par
1037    \checkcharacteralign     {78}    \par
1038\stopcharacteralign
1039\stopbuffer
1040
1041\typebuffer \getbuffer
1042
1043\startbuffer
1044\startcharacteralign[leftsample=123.456,rightsample=00,character={,}]
1045    \checkcharacteralign{123.456,78} \par
1046    \checkcharacteralign    {456}    \par
1047    \checkcharacteralign {23.456}    \par
1048    \checkcharacteralign     {78,9}  \par
1049    \checkcharacteralign     {78}    \par
1050\stopcharacteralign
1051\stopbuffer
1052
1053\typebuffer \getbuffer
1054
1055\startbuffer
1056\startcharacteralign[leftwidth=100pt,rightwidth=30pt]
1057    \checkcharacteralign{123.456,78} \par
1058    \checkcharacteralign    {456}    \par
1059    \checkcharacteralign {23.456}    \par
1060    \checkcharacteralign     {78,9}  \par
1061    \checkcharacteralign     {78}    \par
1062\stopcharacteralign
1063\stopbuffer
1064
1065\typebuffer \getbuffer
1066
1067Samples win over width settings. When no sample or width is given a two pass
1068analyzer kicks in. This is not the case in the following examples.
1069
1070\startbuffer
1071\startxtable
1072    [align={flushright,lohi},
1073     aligncharacter=yes,
1074     alignmentleftsample=100,
1075     alignmentrightsample=00,
1076     alignmentcharacter={.}]
1077  \startxrow \startxcell 1     \stopxcell \stopxrow
1078  \startxrow \startxcell 1.1   \stopxcell \stopxrow
1079  \startxrow \startxcell 11.11 \stopxcell \stopxrow
1080\stopxtable
1081\stopbuffer
1082
1083\typebuffer \getbuffer
1084
1085\startbuffer
1086\startxtable
1087    [align={flushright,lohi},
1088     aligncharacter=yes,
1089     alignmentleftsample=000.000,
1090     alignmentrightsample=00,
1091     alignmentcharacter={,}]
1092  \startxrow \startxcell 123.456,78 x \stopxcell \stopxrow
1093  \startxrow \startxcell     456    x \stopxcell \stopxrow
1094  \startxrow \startxcell 23.456     x \stopxcell \stopxrow
1095  \startxrow \startxcell     78,9   x \stopxcell \stopxrow
1096  \startxrow \startxcell     78     x \stopxcell \stopxrow
1097\stopxtable
1098\stopbuffer
1099
1100\typebuffer \getbuffer
1101
1102\startbuffer
1103\startxtable[align={flushright,lohi}]
1104  \startxrow
1105    \startxcell
1106        [aligncharacter=yes,
1107         alignmentcharacter={,},
1108         alignmentleftsample=000.000,
1109         alignmentrightsample=00]
1110        123.456,78
1111    \stopxcell
1112  \stopxrow
1113  \startxrow
1114    \startxcell
1115        [aligncharacter=yes]
1116        456
1117    \stopxcell
1118  \stopxrow
1119  \startxrow
1120    \startxcell
1121        [aligncharacter=yes]
1122        23.456
1123    \stopxcell
1124  \stopxrow
1125  \startxrow
1126    \startxcell
1127        [aligncharacter=yes]
1128        78,9
1129    \stopxcell
1130  \stopxrow
1131  \startxrow
1132    \startxcell
1133        [aligncharacter=yes]
1134        78
1135    \stopxcell
1136  \stopxrow
1137\stopxtable
1138\stopbuffer
1139
1140\typebuffer \getbuffer
1141
1142\startbuffer
1143\setupxtable
1144  [aligned]
1145  [aligncharacter=yes,
1146   alignmentleftsample=000.000,
1147   alignmentrightsample=00,
1148   alignmentcharacter={,}]
1149
1150\startxtable[align={flushright,lohi}]
1151  \startxrow \startxcell[aligned] 123.456,78 \stopxcell \stopxrow
1152  \startxrow \startxcell[aligned]     456    \stopxcell \stopxrow
1153  \startxrow \startxcell[aligned] 23.456     \stopxcell \stopxrow
1154  \startxrow \startxcell[aligned]     78,9   \stopxcell \stopxrow
1155  \startxrow \startxcell[aligned]     78     \stopxcell \stopxrow
1156\stopxtable
1157\stopbuffer
1158
1159\typebuffer \getbuffer
1160
1161\stop
1162
1163\disabletrackers[typesetters.characteralign]
1164
1165\stopsection
1166
1167\startsection[title={Depth}]
1168
1169Take the following example. Here we have some text that, when typeset narrow,
1170will have a last line with no (or, depending on the font, hardly) depth.
1171
1172\startbuffer
1173\startxtable[frame=on]
1174
1175    \startxrow
1176        \startxcell[width=3cm]
1177            here filled with some words to force a rather long line
1178        \stopxcell
1179    \stopxrow
1180
1181    \startxrow
1182        \startxcell
1183            here filled with some words to force a rather long line
1184        \stopxcell
1185    \stopxrow
1186
1187    \startxrow
1188        \startxcell
1189            here filled with some words to force a rather long line
1190
1191        \stopxcell
1192    \stopxrow
1193
1194\stopxtable
1195\stopbuffer
1196
1197\typebuffer
1198
1199The problem is that \TEX\ doesn't add depth that that last line and adding it
1200automatically can be done in grid mode but one doesn't always want that. Some mechanisms
1201add so called struts automatically. As the table cells are framed boxes indeed that
1202happens here, unless you add an empty line (as in the last row). When you embed
1203
1204\startlinecorrection[blank] {\showstruts \showboxes \getbuffer} \stoplinecorrection
1205
1206\startbuffer
1207\startxtable[frame=on]
1208
1209    \startxrow
1210        \startxcell[width=3cm]
1211            \startitemize[packed]
1212                \startitem
1213                    here filled with some words to force a rather long line
1214                \stopitem
1215            \stopitemize
1216        \stopxcell
1217    \stopxrow
1218
1219    \startxrow
1220        \startxcell
1221            \startitemize[packed]
1222                \startitem
1223                    here filled with some words to force a rather long line
1224                \stopitem
1225            \stopitemize
1226        \stopxcell
1227    \stopxrow
1228
1229    \startxrow
1230        \startxcell
1231            \startitemize[packed]
1232                \startitem
1233                    here filled with some words to force a rather long line
1234
1235                \stopitem
1236            \stopitemize
1237        \stopxcell
1238    \stopxrow
1239
1240\stopxtable
1241\stopbuffer
1242
1243\typebuffer
1244
1245Don't count on all mechanisms used inside a cell to provide this but with itemize
1246you're lucky.
1247
1248\startlinecorrection[blank] {\showstruts \showboxes \getbuffer} \stoplinecorrection
1249
1250\stopsection
1251
1252\startsection[title={Swapping}]
1253
1254The next two examples demonstrate a feature added for Taco, who wanted to input
1255vertical instead of horizontal. It's a bit of a hack but it works okay for
1256simple cases. We assume these settings:
1257
1258\startbuffer[settings]
1259\setupxtable[one]  [foregroundcolor=darkred]
1260\setupxtable[two]  [foregroundcolor=darkgreen]
1261\setupxtable[three][foregroundcolor=darkblue]
1262\setupxtable[four] [foregroundcolor=darkorange]
1263\stopbuffer
1264
1265\startbuffer[demo-1]
1266\startxtable[frame=on]
1267    \startxcolumn[one]
1268        \startxcell A1 \stopxcell
1269        \startxcell B1 \stopxcell
1270        \startxcell C1 \stopxcell
1271        \startxcell D1 \stopxcell
1272        \startxcell E1 \stopxcell
1273    \stopxcolumn
1274    \startxcolumn[two]
1275        \startxcell A2 \stopxcell
1276        \startxcell B2 \stopxcell
1277        \startxcell C2 \stopxcell
1278        \startxcell D2 \stopxcell
1279        \startxcell E2 \stopxcell
1280    \stopxcolumn
1281    \startxcolumn[three]
1282        \startxcell A3 \stopxcell
1283        \startxcell B3 \stopxcell
1284        \startxcell C3 \stopxcell
1285        \startxcell D3 \stopxcell
1286        \startxcell E3 \stopxcell
1287    \stopxcolumn
1288    \startxcolumn[four]
1289        \startxcell A4 \stopxcell
1290        \startxcell B4 \stopxcell
1291        \startxcell C4 \stopxcell
1292        \startxcell D4 \stopxcell
1293        \startxcell E4 \stopxcell
1294    \stopxcolumn
1295\stopxtable
1296\stopbuffer
1297
1298\startbuffer[demo-2]
1299\startxtable[frame=on]
1300    \startxcolumn[one]
1301        \startxcell A \stopxcell
1302        \startxcell B \stopxcell
1303        \startxcell C \stopxcell
1304        \startxcell D \stopxcell
1305        \startxcell E \stopxcell
1306    \stopxcolumn
1307    \startxcolumn[two]
1308        \startxcell       A  \stopxcell
1309        \startxcell[ny=2] BC \stopxcell
1310        \startxcell[ny=2] DE \stopxcell
1311    \stopxcolumn
1312    \startxcolumn[three]
1313        \startxcell       A    \stopxcell
1314        \startxcell[ny=4] BCDE \stopxcell
1315    \stopxcolumn
1316    \startxcolumn[four]
1317        \startxcell       A \stopxcell
1318        \startxcell       B \stopxcell
1319        \startxcell[ny=2] CD \stopxcell
1320        \startxcell       E  \stopxcell
1321    \stopxcolumn
1322\stopxtable
1323\stopbuffer
1324
1325\typebuffer[settings]
1326
1327The first example has no spans:
1328
1329\typebuffer[demo-1]
1330
1331while the second one has:
1332
1333\typebuffer[demo-2]
1334
1335The results are shown in \in {figure} [fig:swapped].
1336
1337\startplacefigure[title={Entering columns instead of rows.},reference=fig:swapped]
1338    \getbuffer[settings]
1339    \startcombination
1340        {\getbuffer[demo-1]} {no spans}
1341        {\getbuffer[demo-2]} {some spans}
1342    \stopcombination
1343\stopplacefigure
1344
1345\stopsection
1346
1347\startsection[title={Examples}]
1348
1349On the following pages we show some examples of (experimental) features. For this
1350we will use the usual quotes from Ward, Tufte and Davis etc.\ that you can find
1351in the distribution.
1352
1353\page
1354
1355\startbuffer
1356\startxtable[bodyfont=6pt]
1357    \startxrow
1358        \startxcell \input ward  \stopxcell
1359        \startxcell \input tufte \stopxcell
1360        \startxcell \input davis \stopxcell
1361    \stopxrow
1362\stopxtable
1363\stopbuffer
1364
1365\typebuffer \getbuffer
1366
1367\startbuffer
1368\startxtable[bodyfont=6pt,option=width]
1369    \startxrow
1370        \startxcell \input ward  \stopxcell
1371        \startxcell \input tufte \stopxcell
1372        \startxcell \input davis \stopxcell
1373    \stopxrow
1374\stopxtable
1375\stopbuffer
1376
1377\typebuffer \getbuffer
1378
1379\page
1380
1381\startbuffer
1382\startxtable[bodyfont=6pt]
1383    \startxrow
1384        \startxcell \externalfigure[cow.pdf][width=3cm] \stopxcell
1385        \startxcell \input tufte \stopxcell
1386        \startxcell \input davis \stopxcell
1387    \stopxrow
1388\stopxtable
1389\stopbuffer
1390
1391\typebuffer \getbuffer
1392
1393\startbuffer
1394\startxtable[bodyfont=6pt,option=width]
1395    \startxrow
1396        \startxcell \externalfigure[cow.pdf][width=3cm] \stopxcell
1397        \startxcell \input tufte \stopxcell
1398        \startxcell \input davis \stopxcell
1399    \stopxrow
1400\stopxtable
1401\stopbuffer
1402
1403\typebuffer \getbuffer
1404
1405\page
1406
1407\startbuffer
1408\startxtable[option=stretch]
1409    \startxrow
1410        \startxcell bla \stopxcell
1411        \startxcell bla bla \stopxcell
1412        \startxcell bla bla bla \stopxcell
1413    \stopxrow
1414\stopxtable
1415\stopbuffer
1416
1417\typebuffer \getbuffer
1418
1419\startbuffer
1420\startxtable[option={stretch,width}]
1421    \startxrow
1422        \startxcell bla \stopxcell
1423        \startxcell bla bla \stopxcell
1424        \startxcell bla bla bla \stopxcell
1425    \stopxrow
1426\stopxtable
1427\stopbuffer
1428
1429\typebuffer \getbuffer
1430
1431\page
1432
1433\startbuffer
1434\setupxtable[suffix][align=middle,foregroundcolor=red]
1435\setupxtable[blabla][foregroundstyle=slanted]
1436\setupxtable[crap]  [foregroundcolor=blue]
1437\setupxtable[bold]  [crap][foregroundstyle=bold]
1438
1439\startxtable % [frame=off]
1440    \startxtablehead
1441        \startxrow[bold]
1442            \startxcell[suffix]       head a \stopxcell
1443            \startxcell[blabla]       head b \stopxcell
1444            \startxcell               head c \stopxcell
1445        \stopxrow
1446    \stopxtablehead
1447    \startxtablebody
1448        \startxrow
1449            \startxcell[suffix][ny=2] cell a 1 \stopxcell
1450            \startxcell               cell b 1 \stopxcell
1451            \startxcell               cell c 1 \stopxcell
1452        \stopxrow
1453        \startxrow
1454            \startxcell               cell b 2 \stopxcell
1455            \startxcell               cell c 2 \stopxcell
1456        \stopxrow
1457        \startxrow
1458            \startxcell[suffix]       cell a 3 \stopxcell
1459            \startxcell               cell b 3 \stopxcell
1460            \startxcell               cell c 3 \stopxcell
1461        \stopxrow
1462        \startxrow
1463            \startxcell[suffix]       cell a 4 \stopxcell
1464            \startxcell               cell b 4 \stopxcell
1465            \startxcell               cell c 4 \stopxcell
1466        \stopxrow
1467        \startxrow
1468            \startxcell[suffix]       cell a 5 \stopxcell
1469            \startxcell               cell b 5 \stopxcell
1470            \startxcell               cell c 5 \stopxcell
1471        \stopxrow
1472    \stopxtablebody
1473\stopxtable
1474\stopbuffer
1475
1476\typebuffer \start \getbuffer \stop
1477
1478\page
1479
1480\startbuffer
1481\startxtable[option=stretch]
1482    \startxrow
1483        \startxcell[option=fixed] first cell \stopxcell
1484        \startxcell 101 \stopxcell
1485        \startxcell 102 \stopxcell
1486        \startxcell 103 \stopxcell
1487    \stopxrow
1488    \startxrow
1489        \startxcell 2\high{nd} cell \stopxcell
1490        \startxcell a \stopxcell
1491        \startxcell b \stopxcell
1492        \startxcell c \stopxcell
1493    \stopxrow
1494\stopxtable
1495\stopbuffer
1496
1497\typebuffer \start \getbuffer \stop
1498
1499\page
1500
1501\startbuffer[demo]
1502\startxtable
1503\startxrow
1504    \startxcell[demo][nx=4] 1 / 2 / 3 / 4 \stopxcell
1505\stopxrow
1506\startxrow
1507    \startxcell[demo][nx=3] 1 / 2 / 3 \stopxcell
1508    \startxcell 4 \stopxcell
1509\stopxrow
1510\startxrow
1511    \startxcell 1 \stopxcell
1512    \startxcell[demo][nx=3] 2 / 3 / 4 \stopxcell
1513\stopxrow
1514\startxrow
1515    \startxcell[demo][nx=2] 1 / 2 \stopxcell
1516    \startxcell 3 \stopxcell
1517    \startxcell 4 \stopxcell
1518\stopxrow
1519\startxrow
1520    \startxcell 1 \stopxcell
1521    \startxcell[demo][nx=2] 2 / 3 \stopxcell
1522    \startxcell 4 \stopxcell
1523\stopxrow
1524\startxrow
1525    \startxcell 1 \stopxcell
1526    \startxcell 2 \stopxcell
1527    \startxcell[demo][nx=2] 3 / 4 \stopxcell
1528\stopxrow
1529\startxrow
1530    \startxcell[demo][nx=2] 1 / 2 \stopxcell
1531    \startxcell[demo][nx=2] 3 / 4 \stopxcell
1532\stopxrow
1533\startxrow
1534    \startxcell 1 \stopxcell
1535    \startxcell 2 \stopxcell
1536    \startxcell 3 \stopxcell
1537    \startxcell 4 \stopxcell
1538\stopxrow
1539\stopxtable
1540\stopbuffer
1541
1542\startbuffer[tight]
1543\setupxtable[demo][option=tight]
1544\stopbuffer
1545
1546\startbuffer[normal]
1547\setupxtable[demo][option=]
1548\stopbuffer
1549
1550\typebuffer[demo]
1551
1552\page
1553
1554\typebuffer[tight]  \start \getbuffer[tight,demo]  \stop
1555\typebuffer[normal] \start \getbuffer[normal,demo] \stop
1556
1557\page
1558
1559\startbuffer
1560\startxtable[align={middle,lohi}]
1561  \startxrow
1562    \startxcell[ny=3] (1,3) \stopxcell
1563    \startxcell       (1,1) \stopxcell
1564    \startxcell       (1,1) \stopxcell
1565  \stopxrow
1566  \startxrow
1567    \startxcell       (1,1) \stopxcell
1568    \startxcell       (1,1) \stopxcell
1569  \stopxrow
1570  \startxrow
1571    \startxcell[nx=2] (2,1) \stopxcell
1572  \stopxrow
1573\stopxtable
1574\stopbuffer
1575
1576\typebuffer \getbuffer
1577
1578\startbuffer
1579\startxtable[align={middle,lohi}]
1580  \startxrow
1581    \startxcell[ny=2] (1,2) \stopxcell
1582    \startxcell       (1,1) \stopxcell
1583    \startxcell       (1,1) \stopxcell
1584  \stopxrow
1585  \startxrow
1586    \startxcell       (1,1) \stopxcell
1587    \startxcell       (1,1) \stopxcell
1588  \stopxrow
1589  \startxrow
1590    \startxcell[nx=2] (2,1) \stopxcell
1591  \stopxrow
1592\stopxtable
1593\stopbuffer
1594
1595\typebuffer \getbuffer
1596
1597\startbuffer
1598\startxtable[align={middle,lohi}]
1599  \startxrow
1600    \startxcell[ny=2] (1,2) \stopxcell
1601    \startxcell       (1,1) \stopxcell
1602    \startxcell       (1,1) \stopxcell
1603    \startxcell       (1,1) \stopxcell
1604  \stopxrow
1605  \startxrow
1606    \startxcell[nx=3] (3,1) \stopxcell
1607  \stopxrow
1608  \startxrow
1609    \startxcell[nx=4] (4,1) \stopxcell
1610  \stopxrow
1611\stopxtable
1612\stopbuffer
1613
1614\typebuffer \getbuffer
1615
1616\stopsection
1617
1618\page
1619
1620% \ruledhbox{\getbuffer[normal,demo]}
1621
1622\startsection[title={Colofon}]
1623
1624\starttabulate[|B|p|]
1625\NC author    \NC \documentvariable{author}, \documentvariable{affiliation}, \documentvariable{location} \NC \NR
1626\NC version   \NC \currentdate \NC \NR
1627\NC website   \NC \documentvariable{website} \endash\ \documentvariable{support} \NC \NR
1628\NC copyright \NC \symbol[cc][cc-by-sa] \NC \NR
1629\stoptabulate
1630
1631\stopsection
1632
1633\stopdocument
1634