1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16\writestatus{loading}{ConTeXt Table Macros Xtreme}
17
18\unprotect
19
20\newdimension\d_tabl_x_width \def\d_tabl_x_width_reference {\d_tabl_x_width }
21\newdimension\d_tabl_x_height \def\d_tabl_x_height_reference{\d_tabl_x_height}
22\newdimension\d_tabl_x_depth
23\newdimension\d_tabl_x_distance
24\newdimension\d_tabl_x_final_width \def\d_tabl_x_final_width_reference{\d_tabl_x_final_width}
25\newinteger \c_tabl_x_nx
26\newinteger \c_tabl_x_ny
27\newinteger \c_tabl_x_mode
28\newbox \b_tabl_x
29\newinteger \c_tabl_x_state
30\newinteger \c_tabl_x_nesting
31\newinteger \c_tabl_x_skip_mode
32\newdimension\d_tabl_x_textwidth
33\newinteger \c_tabl_x_swapped
34\newinteger \c_tabl_x_swapped_max
35
36\protect
37
38\registerctxluafile{tablxtb}{autosuffix}
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82\unprotect
83
84
85
86
87
88
89
90
91
92\aliased\let\dotagxtablecell \relax
93\aliased\let\dotagxtablesignal\relax
94
95\appendtoks
96 \enforced\permanent\protected\def\dotagxtablecell
97 {\clf_settagtablecell{\tablecellrows}{\tablecellcolumns}{\raggedstatus}}
98 \enforced\permanent\protected\def\dotagxtablesignal
99 {\signalcharacter}
100\to \everyenableelements
101
102\lettonothing\m_tabl_x_swapped_settings
103
104\aliased\let\currentxtablerow \clf_x_table_r
105\aliased\let\currentxtablecolumn\clf_x_table_c
106
107
108
109
110
111\installcorenamespace{xtable}
112\installcorenamespace{xtablecheck}
113\installcorenamespace{xtableswap}
114
115\installframedautocommandhandler \??xtable {xtable} \??xtable
116
117\appendtoks
118 \checkxtableparent
119\to \everysetupxtable
120
121\setupxtable[
122 \c!nr=\plusone,
123 \c!nc=\plusone,
124 \c!nx=\plusone,
125 \c!ny=\plusone,
126 \c!align=\v!table,
127 \c!frameoffset=.5\linewidth,
128 \c!backgroundoffset=\v!frame,
129
130
131
132
133 \c!width=\v!fit,
134 \c!height=\v!fit,
135 \c!maxwidth=8\emwidth,
136 \c!autowidth=\v!yes,
137 \c!rulethickness=\linewidth,
138 \c!strut=\v!yes,
139 \c!autostrut=\v!no,
140 \c!split=\v!auto,
141 \c!splitoffset=\zeropoint,
142 \c!aligncharacter=\v!no,
143 \c!alignmentcharacter={,},
144 \c!alignmentleftsample=,
145 \c!alignmentrightsample=,
146 \c!alignmentleftwidth=\zeropoint,
147 \c!alignmentrightwidth=\zeropoint,
148
149
150
151 \c!spaceinbetween=,
152 \c!textwidth=\v!local,
153 \c!textheight=\vsize,
154 \c!distance=\zeropoint,
155 \c!columndistance=\zeropoint,
156 \c!leftmargindistance=\zeropoint,
157 \c!rightmargindistance=\zeropoint,
158]
159
160\def \tabl_x_default_buffer{xtable\the\c_tabl_x_nesting}
161\lettonothing\tabl_x_current_buffer
162
163\permanent\protected\def\startxtable{\tabl_x_start_table}
164
165\protected\tolerant\def\tabl_x_start_table[#S#settings]
166 {\bgroup
167 \tabl_x_prepare{#settings}
168 \edef\tabl_x_current_buffer{\tabl_x_default_buffer}
169 \buff_pickup{\tabl_x_current_buffer}{startxtable}{stopxtable}\relax\tabl_x_process\zerocount}
170
171
172
173\permanent\protected\lettonothing\stopxtable
174
175
176
177
178
179
180
181
182\permanent\tolerant\protected\def\processxtablebuffer[#name]
183 {\bgroup
184 \let\tabl_x_start_table\tabl_x_process_buffer
185 \edef\tabl_x_current_buffer{#name}
186 \tabl_x_get_buffer
187 \tabl_x_process}
188
189\protected\tolerant\def\tabl_x_start_ignore[#S#settings]
190 {}
191
192\protected\tolerant\def\tabl_x_process_buffer[#S#settings]
193 {\tabl_x_prepare{#settings}
194 \let\tabl_x_start_table\tabl_x_start_ignore
195 \ignoreupto\stopxtable}
196
197
198
199
200\permanent\tolerant\protected\def\startembeddedxtable[#S#settings]#:#content\stopembeddedxtable
201 {\tabl_x_prepare{#settings}
202 \clf_assignbuffer{embeddedxtable}{\detokenize{#content}}\catcodetable\relax
203 \bgroup
204 \let\tabl_x_start_table\tabl_x_process_buffer
205 \edef\tabl_x_current_buffer{embeddedxtable}
206 \tabl_x_process}
207
208\permanent\protected\lettonothing\stopembeddedxtable
209
210
211
212\appendtoks
213 \permanent\protected\edefcsname\e!start\currentxtable\endcsname{\tabl_x_start_named[\currentxtable]}
214 \permanent\protected\edefcsname\e!stop \currentxtable\endcsname{\tabl_x_stop_named}
215\to \everydefinextable
216
217\protected\def\tabl_x_start_named[#tag]#spacer[#S#settings]
218 {\bgroup
219 \cdef\currentxtable{#tag}
220 \advanceby\c_tabl_x_nesting\plusone
221 \dostarttaggedchained\t!table\empty\empty\??xtable
222 \setupcurrentxtable[#settings]
223 \tabl_x_check_textwidth
224
225 \edef\tabl_x_current_buffer{\tabl_x_default_buffer}
226 \normalexpanded{\buff_pickup{\tabl_x_current_buffer}{\e!start\currentxtable}{\e!stop\currentxtable}\relax\tabl_x_process\zerocount}}
227
228\protected\def\tabl_x_stop_named
229 {}
230
231
232
233\protected\def\tabl_x_check_textwidth
234 {\edef\p_textwidth{\xtableparameter\c!textwidth}
235 \ifx\p_textwidth\v!local
236 \d_tabl_x_textwidth\availablehsize
237 \else
238 \d_tabl_x_textwidth{\p_textwidth}
239 \fi}
240
241\newtoks\everypreparextable
242
243\protected\def\tabl_x_prepare#settings
244 {\advanceby\c_tabl_x_nesting\plusone
245 \dostarttaggedchained\t!table\empty\empty\??xtable
246 \tabl_x_set_checked{#settings}
247 \tabl_x_check_textwidth
248 \expand\everypreparextable
249 }
250
251\def\tabl_x_get_buffer
252 {\clf_getbuffertex{\tabl_x_current_buffer}}
253
254\let\tabl_x_start_row_yes \relax
255\let\tabl_x_start_row_nop \relax
256\let\tabl_x_stop_row \relax
257\let\tabl_x_start_cell_yes\relax
258\let\tabl_x_start_cell_nop\relax
259\let\tabl_x_stop_cell \relax
260
261\newtoks\t_table_x_cleanup
262
263\protected\def\tabl_x_process
264 {\begingroup
265 \forgetall
266 \dontcomplain
267 \usebodyfontparameter\xtableparameter
268 \setbox\scratchbox\vbox\bgroup
269 \ifempty{\xtableparameter\c!spaceinbetween}\else
270 \blank[\xtableparameter\c!spaceinbetween]
271 \fi
272 \egroup
273 \clf_x_table_create
274 option {\xtableparameter\c!option}
275 textwidth \d_tabl_x_textwidth
276 textheight {\xtableparameter\c!textheight}
277 maxwidth {\xtableparameter\c!maxwidth}
278 lineheight \openlineheight
279 columndistance {\xtableparameter\c!columndistance}
280 leftmargindistance {\xtableparameter\c!leftmargindistance}
281 rightmargindistance {\xtableparameter\c!rightmargindistance}
282 rowdistance \ht\scratchbox
283 header {\xtableparameter\c!header}
284 footer {\xtableparameter\c!footer}
285 \relax
286
287 \resetxtableparameter\c!option
288
289 \linewidth{\xtableparameter\c!rulethickness}
290
291 \c_tabl_x_swapped_max\zerocount
292 \begingroup
293 \let\tabl_x_start_row_yes \tabl_x_start_row_reflow_width_yes
294 \let\tabl_x_start_row_nop \tabl_x_start_row_reflow_width_nop
295 \let\tabl_x_stop_row \tabl_x_stop_row_reflow_width
296 \let\tabl_x_start_cell_yes\tabl_x_start_cell_reflow_width_yes
297 \let\tabl_x_start_cell_nop\tabl_x_start_cell_reflow_width_nop
298 \let\tabl_x_stop_cell \tabl_x_stop_cell_reflow_width
299 \settrialtypesetting
300 \tabl_x_get_buffer
301 \ifcase\c_tabl_x_swapped_max
302 \else
303 \tabl_x_flush_swapped
304 \fi
305 \clf_x_table_reflow_width
306 \endgroup
307 \begingroup
308 \let\tabl_x_start_row_yes \tabl_x_start_row_reflow_height_yes
309 \let\tabl_x_start_row_nop \tabl_x_start_row_reflow_height_nop
310 \let\tabl_x_stop_row \tabl_x_stop_row_reflow_height
311 \let\tabl_x_start_cell_yes\tabl_x_start_cell_reflow_height_yes
312 \let\tabl_x_start_cell_nop\tabl_x_start_cell_reflow_height_nop
313 \let\tabl_x_stop_cell \tabl_x_stop_cell_reflow_height
314 \settrialtypesetting
315 \ifcase\c_tabl_x_swapped_max
316 \tabl_x_get_buffer
317 \else
318 \tabl_x_flush_swapped
319 \fi
320 \clf_x_table_reflow_height
321 \endgroup
322 \begingroup
323 \let\tabl_x_start_row_yes \tabl_x_start_row_construct_yes
324 \let\tabl_x_start_row_nop \tabl_x_start_row_construct_nop
325 \let\tabl_x_stop_row \tabl_x_stop_row_construct
326 \let\tabl_x_start_cell_yes\tabl_x_start_cell_construct_yes
327 \let\tabl_x_start_cell_nop\tabl_x_start_cell_construct_nop
328 \let\tabl_x_stop_cell \tabl_x_stop_cell_construct
329 \ifcase\c_tabl_x_swapped_max
330 \tabl_x_get_buffer
331 \else
332 \tabl_x_flush_swapped
333 \fi
334 \clf_x_table_construct
335 \endgroup
336 \endgroup
337 \ifinsidesplitfloat
338 \tabl_x_flush_float_split
339 \orelse\ifinsidefloat
340 \tabl_x_flush_float_normal
341 \else
342 \tabl_x_flush_text_checked
343 \fi
344 \clf_x_table_cleanup
345 \dostoptagged
346 \resetbuffer[\tabl_x_current_buffer]
347 \resetcharacteralign
348 \expand\t_table_x_cleanup
349 \egroup}
350
351
352
353\installcorenamespace{xtableflushsplit}
354
355\protected\def\tabl_x_flush_text_checked
356 {\expandnamespaceparameter\??xtableflushsplit\xtableparameter\c!split\v!no}
357
358
359
360\defcsname\??xtableflushsplit\v!yes\endcsname
361 {\clf_x_table_flush
362 method {\v!split}
363 \relax}
364
365
366
367\defcsname\??xtableflushsplit\v!no\endcsname
368 {
369
370
371 \kern\zeropoint
372 \ignorespaces
373 \clf_x_table_flush
374 method {\v!normal}
375 \relax
376 \removeunwantedspaces}
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392\defcsname\??xtableflushsplit\v!repeat\endcsname
393 {\doloop
394 {\testpage[5]
395 \clf_x_table_flush
396 method {\v!split}
397 height {\ifdim\pagegoal=\maxdimen\textheight\else\pagegoal\pagetotal\lineheight\fi}
398 \relax
399 \ifcase\c_tabl_x_state
400 \exitloop
401 \else
402 \page
403 \fi}}
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430\mutable\let\extraxtablesplitheight\zeropoint
431
432\protected\def\tabl_x_flush_float_normal
433 {\clf_x_table_flush
434 method {\v!normal}
435 \relax}
436
437\protected\def\tabl_x_flush_float_split
438 {\resetdirecttsplit
439 \edef\extrasplitfloatlines{\xtableparameter\c!split}
440 \d_split_minimum_free_space{\extraxtablesplitheight\xtableparameter\c!splitoffset}
441
442 \let\tsplitdirectsplitter\tabl_x_split_splitter
443 \let\tsplitdirectwidth \d_tabl_x_final_width_reference
444 \handledirecttsplit}
445
446\protected\def\tabl_x_split_splitter#height
447 {\setbox\b_split_result\vbox
448 {\clf_x_table_flush
449 method {\v!split}
450 height {#height}
451 \relax}
452 \ifcase\c_tabl_x_state
453 \global\somenextsplitofffloat\conditionalfalse
454 \else
455 \global\somenextsplitofffloat\conditionaltrue
456 \fi}
457
458
459
460
461
462
463
464
465
466\protected\def\tabl_x_start_row_reflow_width_yes[#S#settings]
467 {\setupcurrentxtable[#settings]
468 \clf_x_table_next_row}
469
470\protected\def\tabl_x_start_row_reflow_width_nop
471 {\clf_x_table_next_row}
472
473\protected\def\tabl_x_stop_row_reflow_width
474 {}
475
476\let\tabl_x_start_row_reflow_height_yes\tabl_x_start_row_reflow_width_yes
477\let\tabl_x_start_row_reflow_height_nop\tabl_x_start_row_reflow_width_nop
478\let\tabl_x_stop_row_reflow_height \tabl_x_stop_row_reflow_width
479
480\protected\def\tabl_x_start_row_construct_yes[#S#settings]
481 {\setupcurrentxtable[#settings]
482 \dostarttaggednodetail\t!tablerow
483 \clf_x_table_next_row_option{\xtableparameter\c!samepage}}
484
485\protected\def\tabl_x_start_row_construct_nop
486 {\dostarttaggednodetail\t!tablerow
487 \clf_x_table_next_row}
488
489\protected\def\tabl_x_stop_row_construct
490 {\clf_x_table_finish_row
491 \dostoptagged}
492
493\permanent\protected\def\dummyxcell
494 {\begingroup
495 \enforced\let\inheritedxtableframed\relax
496 \tabl_x_start_cell_nop
497 \tabl_x_stop_cell
498 \endgroup}
499
500\def\tabl_x_setup_character_align
501 {\edef\p_left {\directxtableparameter\c!alignmentleftsample}
502 \edef\p_right{\directxtableparameter\c!alignmentrightsample}
503 \ifempty\p_left
504 \scratchdimenone{\directxtableparameter\c!alignmentleftwidth}
505 \else
506 \setbox\scratchbox\hbox{\p_left}
507 \scratchdimenone\wd\scratchbox
508 \fi
509 \ifempty\p_right
510 \scratchdimentwo{\directxtableparameter\c!alignmentrightwidth}
511 \else
512 \setbox\scratchbox\hbox{\p_right}
513 \scratchdimentwo\wd\scratchbox
514 \fi
515 \clf_setcharacteraligndetail
516 \clf_x_table_c
517 {\directxtableparameter\c!alignmentcharacter}
518 \scratchdimenone
519 \scratchdimentwo
520 \relax}
521
522\newtoks\t_tabl_x_every_cell
523
524
525
526
527
528\appendtoks
529 \ifcstok{\directxtableparameter\c!aligncharacter}\v!yes
530 \ifcase\clf_x_table_r\or
531 \tabl_x_setup_character_align
532 \fi
533 \signalcharacteralign\clf_x_table_c\clf_x_table_r
534 \fi
535\to \t_tabl_x_every_cell
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577\protected\def\tabl_x_begin_of_cell
578 {\expand\t_tabl_x_every_cell
579 \everypar{\delayedbegstrut}
580 \ifconditional\c_font_styles_math
581 \normalstartimath
582 \fi}
583
584\protected\def\tabl_x_end_of_cell
585 {\ifmmode
586 \normalstopimath
587 \fi
588 \ifhmode
589 \delayedendstrut
590 \par
591 \else
592 \par
593 \ifdim\prevdepth<\zeropoint
594 \vskip\strutdp
595 \else
596 \removebottomthings
597 \fi
598 \fi}
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619\let\tabl_x_set_hsize\relax
620
621\protected\def\tabl_x_start_cell_reflow_width_yes[#S#settings]
622 {\setbox\b_tabl_x\hpack\bgroup
623 \ifnum\c_tabl_x_nesting>\plusone
624 \letxtableparameter\c!width \v!fit
625 \letxtableparameter\c!height\v!fit
626 \fi
627
628 \letxtableparameter\c!nx\plusone
629 \letxtableparameter\c!ny\plusone
630 \letxtableparameter\c!nc\plusone
631 \letxtableparameter\c!nr\plusone
632
633 \setupcurrentxtable[#settings]
634
635 \c_tabl_x_nx{\directxtableparameter\c!nc}
636 \c_tabl_x_ny{\directxtableparameter\c!nr}
637 \ifnum\c_tabl_x_nx=\plusone
638 \c_tabl_x_nx{\directxtableparameter\c!nx}
639 \fi
640 \ifnum\c_tabl_x_ny=\plusone
641 \c_tabl_x_ny{\directxtableparameter\c!ny}
642 \fi
643
644 \d_tabl_x_distance{\xtableparameter\c!distance}
645 \clf_x_table_init_reflow_width_option{\xtableparameter\c!option}
646 \inheritedxtableframed\bgroup
647 \tabl_x_begin_of_cell
648 \tabl_x_set_hsize}
649
650\protected\def\tabl_x_start_cell_reflow_width_nop
651 {\setbox\b_tabl_x\hpack\bgroup
652 \ifnum\c_tabl_x_nesting>\plusone
653 \letxtableparameter\c!width \v!fit
654 \letxtableparameter\c!height\v!fit
655 \fi
656 \c_tabl_x_nx\plusone
657 \c_tabl_x_ny\plusone
658 \d_tabl_x_distance{\xtableparameter\c!distance}
659 \clf_x_table_init_reflow_width
660 \inheritedxtableframed\bgroup
661 \tabl_x_begin_of_cell
662 \tabl_x_set_hsize}
663
664\protected\def\tabl_x_stop_cell_reflow_width
665 {\tabl_x_end_of_cell
666 \egroup
667 \egroup
668 \clf_x_table_set_reflow_width}
669
670\protected\def\tabl_x_start_cell_reflow_height_yes[#S#settings]
671 {\setbox\b_tabl_x\hpack\bgroup
672 \clf_x_table_init_reflow_height
673 \ifcase\c_tabl_x_skip_mode
674 \ifnum\c_tabl_x_nesting>\plusone
675 \letxtableparameter\c!height\v!fit
676 \fi
677 \setupcurrentxtable[#settings]
678 \relax
679 \letxtableparameter\c!width\d_tabl_x_width_reference
680 \inheritedxtableframed\bgroup
681 \tabl_x_begin_of_cell
682 \fi}
683
684\protected\def\tabl_x_start_cell_reflow_height_nop
685 {\setbox\b_tabl_x\hpack\bgroup
686 \clf_x_table_init_reflow_height
687 \ifcase\c_tabl_x_skip_mode
688 \ifnum\c_tabl_x_nesting>\plusone
689 \letxtableparameter\c!height\v!fit
690 \fi
691 \relax
692 \letxtableparameter\c!width\d_tabl_x_width_reference
693 \inheritedxtableframed\bgroup
694 \tabl_x_begin_of_cell
695 \fi}
696
697\protected\def\tabl_x_stop_cell_reflow_height
698 {\ifcase\c_tabl_x_skip_mode
699 \tabl_x_end_of_cell
700 \egroup
701 \fi
702 \egroup
703 \clf_x_table_set_reflow_height}
704
705\protected\def\tabl_x_start_cell_construct_yes[#S#settings]
706 {\dostarttaggednodetail\t!tablecell
707 \setbox\b_tabl_x\hpack\bgroup
708 \setupcurrentxtable[#settings]
709 \letxtableparameter\c!width \d_tabl_x_width_reference
710 \letxtableparameter\c!height\d_tabl_x_height_reference
711 \clf_x_table_init_construct
712 \inheritedxtableframed\bgroup
713 \tabl_x_begin_of_cell
714 \dotagxtablecell}
715
716\protected\def\tabl_x_start_cell_construct_nop
717 {\dostarttaggednodetail\t!tablecell
718 \setbox\b_tabl_x\hpack\bgroup
719 \letxtableparameter\c!width \d_tabl_x_width_reference
720 \letxtableparameter\c!height\d_tabl_x_height_reference
721 \clf_x_table_init_construct
722 \inheritedxtableframed\bgroup
723 \tabl_x_begin_of_cell
724 \dotagxtablecell}
725
726\protected\def\tabl_x_stop_cell_construct
727 {\tabl_x_end_of_cell
728 \egroup
729 \dotagxtablesignal
730 \egroup
731 \clf_x_table_set_construct
732 \dostoptagged}
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753\protected\def\tabl_x_set_checked#settings
754 {\ifcsname\namedxtablehash{#settings}\s!parent\endcsname
755 \cdef\currentxtable{#settings}
756 \else
757 \setupcurrentxtable[#settings]
758 \fi}
759
760\permanent\protected\def\startxtablehead{\begingroup\c_tabl_x_mode\plusone \tabl_x_start_partition}
761\permanent\protected\def\startxtablefoot{\begingroup\c_tabl_x_mode\plustwo \tabl_x_start_partition}
762\permanent\protected\def\startxtablenext{\begingroup\c_tabl_x_mode\plusthree\tabl_x_start_partition}
763\permanent\protected\def\startxtablebody{\begingroup\c_tabl_x_mode\plusfour \tabl_x_start_partition}
764
765\permanent\tolerant\protected\def\tabl_x_start_partition[#S#settings]#spacer
766 {\ifarguments\or
767 \tabl_x_set_checked{#settings}
768 \fi}
769
770\permanent\protected\def\tabl_x_stop_partition
771 {\endgroup}
772
773\aliased\let\stopxtablehead\tabl_x_stop_partition
774\aliased\let\stopxtablefoot\tabl_x_stop_partition
775\aliased\let\stopxtablenext\tabl_x_stop_partition
776\aliased\let\stopxtablebody\tabl_x_stop_partition
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807\appendtoks
808 \letcsname\??xtablecheck\currentxtable\endcsname\relax
809\to \everysetupxtable
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826\permanent\protected\def\startxgroup
827 {\begingroup
828 \doifelsenextoptionalcs\tabl_x_start_group_delayed_one\relax}
829
830\permanent\protected\def\stopxgroup
831 {\endgroup}
832
833\protected\def\tabl_x_start_group_delayed_one[#tag]
834 {\ifcsname\??xtablecheck\detokenize\expandafter{\normalexpanded{#tag}}\endcsname
835 \expandafter\tabl_x_start_group_delayed_two
836 \else
837 \expandafter\setupcurrentxtable
838 \fi[#tag]}
839
840\protected\def\tabl_x_start_group_delayed_two[#tag]
841 {\ifempty\currentxtable \else
842 \chaintocurrentxtable{#tag}
843 \fi
844 \cdef\currentxtable{#tag}
845 \doifelsenextoptionalcs\setupcurrentxtable\relax}
846
847\aliased\let\startxrowgroup \startxgroup
848\aliased\let\stopxrowgroup \stopxgroup
849\aliased\let\startxcellgroup\startxgroup
850\aliased\let\stopxcellgroup \stopxgroup
851
852
853
854\permanent\protected\def\startxcell
855 {\begingroup
856 \doifelsenextoptionalcs\tabl_x_start_cell_delayed_one\tabl_x_start_cell_nop}
857
858\protected\def\tabl_x_start_cell_delayed_one[#tag]
859 {\ifcsname\??xtablecheck\detokenize\expandafter{\normalexpanded{#tag}}\endcsname
860 \expandafter\tabl_x_start_cell_delayed_two
861 \else
862 \expandafter\tabl_x_start_cell_yes
863 \fi[#tag]}
864
865\tolerant\protected\def\tabl_x_start_cell_delayed_two[#tag]#spacer
866 {\ifempty\currentxtable \else
867 \chaintocurrentxtable{#tag}
868 \fi
869 \cdef\currentxtable{#tag}
870 \doifelsenextoptionalcs\tabl_x_start_cell_yes\tabl_x_start_cell_nop}
871
872\permanent\protected\def\stopxcell
873 {\tabl_x_stop_cell
874 \endgroup}
875
876
877
878\permanent\protected\def\startxrow
879 {\begingroup
880 \doifelsenextoptionalcs\tabl_x_start_row_delayed_one\tabl_x_start_row_nop}
881
882\protected\def\tabl_x_start_row_delayed_one[#tag]
883 {\ifcsname\??xtablecheck\detokenize\expandafter{\normalexpanded{#tag}}\endcsname
884 \expandafter\tabl_x_start_row_delayed_two
885 \else
886 \expandafter\tabl_x_start_row_yes
887 \fi[#tag]}
888
889\permanent\protected\def\tabl_x_start_row_delayed_two[#tag]
890 {\ifempty\currentxtable \else
891 \chaintocurrentxtable{#tag}
892 \fi
893 \cdef\currentxtable{#tag}
894 \doifelsenextoptionalcs\tabl_x_start_row_yes\tabl_x_start_row_nop}
895
896\permanent\protected\def\stopxrow
897 {\tabl_x_stop_row
898 \endgroup}
899
900
901
902\protected\def\tabl_x_nc
903 {\startxrow
904 \enforced\let\NC\tabl_x_nc_next
905 \enforced\let\NR\tabl_x_nr
906 \startxcell}
907
908\protected\def\tabl_x_nc_next
909 {\stopxcell
910 \startxcell}
911
912\protected\def\tabl_x_nr
913 {\stopxcell
914 \stopxrow
915 \enforced\let\NC\tabl_x_nc}
916
917\appendtoks
918 \enforced\let\NC\tabl_x_nc
919 \enforced\let\NR\tabl_x_nr
920\to \everypreparextable
921
922
923
924\protected\def\tabl_x_c_cell_start#settings
925 {\begingroup
926 \tabl_x_set_checked{#settings}
927 \doifelsenextoptionalcs\tabl_x_start_cell_yes\tabl_x_start_cell_nop}
928
929\protected\def\tabl_x_c_cell_stop
930 {\tabl_x_stop_cell
931 \endgroup}
932
933
934
935
936
937\mutable\let\t_tabl_x_swapped\relax
938
939\def\tabl_x_flush_swapped
940 {\dorecurse\c_tabl_x_swapped_max
941 {\expandafter
942 \startxrow
943 \the\csname\??xtableswap##1\endcsname\relax
944 \stopxrow}}
945
946\def\tabl_x_collect_allocate
947 {\expandafter\newtoks\csname\??xtableswap\the\c_tabl_x_swapped\endcsname
948 \expandafter\let\expandafter\t_tabl_x_swapped\csname\??xtableswap\the\c_tabl_x_swapped\endcsname}
949
950\def\tabl_x_collect_advance
951 {\global\advanceby\c_tabl_x_swapped\plusone
952 \ifnum\c_tabl_x_swapped>\c_tabl_x_swapped_max
953 \global\c_tabl_x_swapped_max\c_tabl_x_swapped
954 \fi
955 \mutable\expandafter\let\expandafter\t_tabl_x_swapped\csname\??xtableswap\the\c_tabl_x_swapped\endcsname
956 \ifrelax\t_tabl_x_swapped
957 \tabl_x_collect_allocate
958 \fi}
959
960\protected\def\tabl_x_collect_cell_start
961 {\doifelsenextoptionalcs
962 \tabl_x_collect_cell_start_yes
963 \tabl_x_collect_cell_start_nop}
964
965\def\tabl_x_collect_cell_start_nop#content\stopxcell
966 {\tabl_x_collect_advance
967 \ifempty\m_tabl_x_swapped_settings
968 \gtoksapp\t_tabl_x_swapped{\tabl_x_c_cell_start{}#content\tabl_x_c_cell_stop}
969 \else
970 \gtoksapp\t_tabl_x_swapped\expandafter{\expandafter\tabl_x_c_cell_start\expandafter{\m_tabl_x_swapped_settings}#content\tabl_x_c_cell_stop}
971 \fi}
972
973\def\tabl_x_collect_cell_start_yes[#S#settings]#content\stopxcell
974 {\tabl_x_collect_advance
975 \ifempty\m_tabl_x_swapped_settings
976 \gtoksapp\t_tabl_x_swapped{\tabl_x_c_cell_start{}[#settings]#content\tabl_x_c_cell_stop}
977 \else
978 \gtoksapp\t_tabl_x_swapped\expandafter{\expandafter\tabl_x_c_cell_start\expandafter{\m_tabl_x_swapped_settings}[#settings]#content\tabl_x_c_cell_stop}
979 \fi
980 \getdummyparameters[\c!ny=1,#settings]
981 \scratchcounter{(\dummyparameter\c!ny)\plusone}
982 \ifcase\scratchcounter\else
983 \dorecurse\scratchcounter\tabl_x_collect_advance
984 \fi}
985
986\permanent\tolerant\protected\def\startxcolumn[#S#settings]#spacer
987 {\begingroup
988 \global\c_tabl_x_swapped\zerocount
989 \enforced\let\startxcell\tabl_x_collect_cell_start
990 \enforced\let\stopxcell \relax
991 \xdef\m_tabl_x_swapped_settings{#settings}}
992
993\permanent\protected\def\stopxcolumn
994 {\endgroup}
995
996\appendtoks
997 \dorecurse\c_tabl_x_swapped_max
998 {\global\csname\??xtableswap\number#1\endcsname\emptytoks}
999\to \t_table_x_cleanup
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038\protect \endinput
1039 |