1
2
3
4
5
6
7
8
9
10
11
12
13
14\writestatus{loading}{ConTeXt Page Macros Mixed Columns}
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52\registerctxluafile{pagemix}{}
53
54\unprotect
55
56
57
58
59
60
61
62
63
64
65
66
67\installcorenamespace{mixedcolumns}
68
69\installframedcommandhandler \??mixedcolumns {mixedcolumns} \??mixedcolumns
70
71
72
73
74
75
76
77
78
79
80\setupmixedcolumns
81 [\c!distance=1.5\bodyfontsize,
82 \c!n=\plustwo,
83
84
85
86
87
88
89
90 \c!frame=\v!off,
91 \c!strut=\v!no,
92 \c!offset=\v!overlay,
93 \c!alternative=\v!local,
94 \c!maxheight=\textheight,
95 \c!maxwidth=\makeupwidth,
96 \c!grid=\v!tolerant,
97 \c!internalgrid=\v!line,
98 \c!step=.25\lineheight,
99
100 \c!direction=\v!normal,
101
102 \c!define=\v!yes,
103 \c!method=\ifinner\s!box\else\s!otr\fi]
104
105 \let\startmixedcolumns\relax
106\aliased\let\stopmixedcolumns \relax
107
108\appendtoks
109 \ifcstok{\mixedcolumnsparameter\c!define}\v!yes
110 \frozen\instance\protected\edefcsname\e!start\currentmixedcolumns\endcsname{\startmixedcolumns[\currentmixedcolumns]}
111 \frozen\instance\protected\edefcsname\e!stop \currentmixedcolumns\endcsname{\stopmixedcolumns}
112 \fi
113\to \everydefinemixedcolumns
114
115
116
117\newdimension \d_page_mix_column_width
118\newdimension \d_page_mix_max_height
119\newdimension \d_page_mix_max_width
120\newdimension \d_page_mix_distance
121\newinteger \c_page_mix_n_of_columns
122\newdimension \d_page_mix_threshold
123\newdimension \d_page_mix_leftskip
124\newdimension \d_page_mix_rightskip
125
126\newdimension \d_page_mix_balance_step
127\setnewconstant\c_page_mix_balance_cycles 500
128
129\setnewconstant\c_page_mix_break_forced 123
130
131\newbox \b_page_mix_preceding
132\newdimension \d_page_mix_preceding_height
133
134\newbox \b_page_mix_collected
135
136\newconstant \c_page_mix_routine
137
138\setnewconstant\c_page_mix_routine_regular \zerocount
139\setnewconstant\c_page_mix_routine_intercept\plusone
140\setnewconstant\c_page_mix_routine_continue \plustwo
141\setnewconstant\c_page_mix_routine_balance \plusthree
142\setnewconstant\c_page_mix_routine_error \plusfour
143
144\newconditional\c_page_mix_process_notes
145\newconditional\c_page_mix_grid_snapping
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197\ifdefined\s!itemgroupcolumns \else \def\s!itemgroupcolumns{itemgroupcolumns} \fi
198
199\definemixedcolumns
200 [\s!itemgroupcolumns]
201 [\c!n=\itemgroupparameter\c!n,
202 \c!direction=\itemgroupparameter\c!direction,
203 \c!separator=\v!none,
204 \c!splitmethod=\v!none,
205 \c!grid=\v!tolerant,
206 \c!internalgrid=\v!halfline,
207 \c!balance=\v!yes,
208 \c!notes=\v!no]
209
210
211
212\setupmixedcolumns
213 [\s!itemgroupcolumns]
214 [\c!splitmethod=\v!fixed,
215 \c!grid=\v!yes,
216 \c!internalgrid=\v!line]
217
218
219
220\setupitemgroup
221 [\c!grid=\v!tolerant:10]
222
223\setupmixedcolumns
224 [\s!itemgroupcolumns]
225 [\c!grid=\itemgroupparameter\c!grid]
226
227
228
229\protected\def\strc_itemgroups_start_columns
230 {\startmixedcolumns[\s!itemgroupcolumns]}
231
232\protected\def\strc_itemgroups_stop_columns
233 {\stopmixedcolumns}
234
235
236
237
238
239
240
241\protected\def\page_mix_command_routine
242 {\ifcase\c_page_mix_routine
243 \page_one_command_routine
244 \or
245 \page_mix_routine_intercept
246 \or
247 \page_mix_routine_continue
248 \or
249 \page_mix_routine_balance
250 \or
251 \page_mix_routine_error
252 \fi}
253
254
255
256\def\page_mix_routine_intercept
257 {\ifdim\pagetotal>\pagegoal
258
259
260 \page_one_command_routine
261 \fi
262 \global\setbox\b_page_mix_preceding\vbox
263 {\forgetall
264 \page_otr_command_flush_top_insertions
265 \ifzeropt\htdp\b_page_mix_preceding\else
266 \writestatus\m!columns{preceding error}
267 \unvbox\b_page_mix_preceding
268 \fi
269 \unvbox\normalpagebox}}
270
271
272
273
274\def\page_mix_construct_and_shipout#1#2#3
275 {\ifconditional\c_page_mix_grid_snapping\else\gridsnappingfalse\fi
276 \page_otr_construct_and_shipout#1#2#3
277 \ifconditional\c_page_mix_grid_snapping \gridsnappingtrue \fi}
278
279
280\def\page_mix_routine_error
281 {\showmessage\m!columns3\empty
282 \page_mix_construct_and_shipout\unvbox\normalpagebox\zerocount}
283
284
285
286
287\protected\def\page_mix_command_set_hsize
288 {\hsize\d_page_mix_column_width
289 \columnwidth\d_page_mix_column_width}
290
291
292
293
294
295\protected\def\page_mix_command_set_vsize
296 {\vsize{
297 \c_page_mix_n_of_columns\textheight
298 \c_page_mix_n_of_columns\lineheight
299 }
300 \pagegoal{
301 \vsize
302
303
304 \c_page_mix_n_of_columns\insertheights
305 }}
306
307
308
309
310\let\page_mix_hbox\hbox
311\let\page_mix_vbox\vbox
312
313\installtextracker
314 {mixedcolumns.boxes}
315 {\let\page_mix_hbox\ruledhbox
316 \let\page_mix_vbox\ruledvbox}
317 {\let\page_mix_hbox\hbox
318 \let\page_mix_vbox\vbox}
319
320
321
322
323\installcolumnbreakmethod \s!mixedcolumn \v!preference
324 {\goodbreak}
325
326\installcolumnbreakmethod \s!mixedcolumn \v!yes
327 {\par
328 \penalty\c_page_mix_break_forced\relax}
329
330
331
332
333\def\page_mix_enable_grid_snapping
334 {\edef\p_grid{\mixedcolumnsparameter\c!grid}
335 \c_page_mix_grid_snapping\conditionalfalse
336 \ifempty\p_grid
337
338 \else
339 \ifgridsnapping\c_page_mix_grid_snapping\conditionaltrue\fi
340 \gridsnappingtrue
341 \setsystemmode\v!grid
342 \spac_grids_snap_value_set\p_grid
343 \fi}
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359\installcorenamespace{mixedcolumnsseparator}
360
361\permanent\protected\def\installmixedcolumnseparator#1#2
362 {\defcsname\??mixedcolumnsseparator#1\endcsname{#2}}
363
364\installmixedcolumnseparator\v!rule
365 {\vrule
366 \s!width {\mixedcolumnsparameter\c!rulethickness}
367 \s!height\mixedcolumnseparatorheight
368 \s!depth \mixedcolumnseparatordepth
369 \relax}
370
371\protected\def\page_mix_command_inject_separator
372 {\begingroup
373 \setbox\scratchbox\hbox to \zeropoint \bgroup
374 \hss
375 \starttextproperties
376 \usemixedcolumnscolorparameter\c!rulecolor
377 \begincsname\??mixedcolumnsseparator\p_separator\endcsname
378 \stoptextproperties
379 \hss
380 \egroup
381 \ht\scratchbox\zeropoint
382 \dp\scratchbox\zeropoint
383 \hss
384 \box\scratchbox
385 \hss
386 \endgroup}
387
388
389
390
391
392
393\installcorenamespace{mixedcolumnsbefore}
394\installcorenamespace{mixedcolumnsstart}
395\installcorenamespace{mixedcolumnsstop}
396\installcorenamespace{mixedcolumnsafter}
397
398
399
400
401
402
403
404
405
406
407\mutable\lettonothing\currentmixedcolumnsmethod
408
409\installmacrostack\currentmixedcolumns
410\installmacrostack\currentmixedcolumnsmethod
411
412\permanent\tolerant\protected\def\startmixedcolumns[#S#1]#*[#S#2]
413 {\push_macro_currentmixedcolumns
414 \push_macro_currentmixedcolumnsmethod
415 \ifparameters
416 \expandafter\page_mix_start_columns_c
417 \or
418 \expandafter\page_mix_start_columns_b
419 \or
420 \expandafter\page_mix_start_columns_a
421 \fi[#1][#2]}
422
423\def\page_mix_start_columns_checked#1#2
424 {\edef\currentmixedcolumnsmethod{\mixedcolumnsparameter\c!method}
425 \ifx\currentmixedcolumnsmethod\v!box
426 \expandafter#1
427 \orelse\ifinsidecolumns
428 \expandafter#2
429 \else
430 \expandafter#1
431 \fi}
432
433\def\page_mix_start_columns_a[#1]
434 {\cdef\currentmixedcolumns{#1}
435 \page_mix_start_columns_checked
436 \page_mix_start_columns_a_yes
437 \page_mix_start_columns_a_nop}
438
439\def\page_mix_start_columns_a_yes[#S#1]
440 {\mixedcolumnsparameter\c!before\relax
441 \begincsname\??mixedcolumnsbefore\currentmixedcolumnsmethod\endcsname\relax
442 \begingroup
443 \setupcurrentmixedcolumns[#1]
444 \page_mix_initialize_columns
445 \begincsname\??mixedcolumnsstart\currentmixedcolumnsmethod\endcsname
446 \enforced\let\stopmixedcolumns\page_mix_columns_stop_yes}
447
448\def\page_mix_start_columns_a_nop[#S#1]
449 {\begingroup
450 \enforced\let\stopmixedcolumns\page_mix_columns_stop_nop}
451
452\def\page_mix_start_columns_b[#S#1][#S#2]
453 {\ifhastok={#1}
454 \lettonothing\currentmixedcolumns
455 \page_mix_error_b
456 \page_mix_start_columns_checked\page_mix_start_columns_b_yes\page_mix_start_columns_b_nop[#1]
457 \else
458 \cdef\currentmixedcolumns{#1}
459 \page_mix_start_columns_checked\page_mix_start_columns_b_yes\page_mix_start_columns_b_nop[#2]
460 \fi}
461
462\def\page_mix_start_columns_b_yes[#S#1]
463 {\mixedcolumnsparameter\c!before\relax
464 \begincsname\??mixedcolumnsbefore\currentmixedcolumnsmethod\endcsname\relax
465 \begingroup
466 \setupcurrentmixedcolumns[#1]
467 \page_mix_initialize_columns
468 \begincsname\??mixedcolumnsstart\currentmixedcolumnsmethod\endcsname
469 \enforced\let\stopmixedcolumns\page_mix_columns_stop_yes}
470
471\def\page_mix_start_columns_b_nop[#1]
472 {\begingroup
473 \enforced\let\stopmixedcolumns\page_mix_columns_stop_nop}
474
475\def\page_mix_error_b
476 {\writestatus\m!columns{best use an instance of mixed columns}}
477
478\def\page_mix_start_columns_c[#1][#2]
479 {\lettonothing\currentmixedcolumns
480 \page_mix_start_columns_checked
481 \page_mix_start_columns_c_yes
482 \page_mix_start_columns_c_nop}
483
484\def\page_mix_start_columns_c_yes
485 {\mixedcolumnsparameter\c!before\relax
486 \begincsname\??mixedcolumnsbefore\currentmixedcolumnsmethod\endcsname\relax
487 \begingroup
488 \page_mix_initialize_columns
489 \begincsname\??mixedcolumnsstart\currentmixedcolumnsmethod\endcsname
490 \enforced\let\stopmixedcolumns\page_mix_columns_stop_yes}
491
492\def\page_mix_start_columns_c_nop
493 {\begingroup
494 \enforced\let\stopmixedcolumns\page_mix_columns_stop_nop}
495
496\protected\def\page_mix_fast_columns_start#1
497 {\push_macro_currentmixedcolumns
498 \push_macro_currentmixedcolumnsmethod
499 \cdef\currentmixedcolumns{#1}
500 \edef\currentmixedcolumnsmethod{\mixedcolumnsparameter\c!method}
501 \mixedcolumnsparameter\c!before\relax
502 \begincsname\??mixedcolumnsbefore\currentmixedcolumnsmethod\endcsname\relax
503 \begingroup
504 \page_mix_initialize_columns
505 \begincsname\??mixedcolumnsstart\currentmixedcolumnsmethod\endcsname
506 \let\page_mix_fast_columns_stop\page_mix_columns_stop_yes}
507
508
509
510
511
512\let\page_mix_fast_columns_stop\relax
513
514\newtoks\t_page_mix_at_the_end
515
516\def\page_mix_finalize_columns
517 {\ifconditional\c_page_mix_process_notes \else
518 \global\t_page_mix_at_the_end{\stoppostponingnotes}
519 \fi}
520
521\protected\def\page_mix_columns_stop_yes
522 {\begincsname\??mixedcolumnsstop\currentmixedcolumnsmethod\endcsname
523 \page_mix_finalize_columns
524 \endgroup
525 \begincsname\??mixedcolumnsafter\currentmixedcolumnsmethod\endcsname\relax
526 \mixedcolumnsparameter\c!after\relax
527 \pop_macro_currentmixedcolumnsmethod
528 \pop_macro_currentmixedcolumns
529 \expand\t_page_mix_at_the_end\global\t_page_mix_at_the_end\emptytoks}
530
531\protected\def\page_mix_columns_stop_nop
532 {\page_mix_finalize_columns
533 \endgroup
534 \pop_macro_currentmixedcolumnsmethod
535 \pop_macro_currentmixedcolumns
536 \expand\t_page_mix_at_the_end\global\t_page_mix_at_the_end\emptytoks}
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555\protected\def\strc_itemgroups_start_columns
556 {\page_mix_fast_columns_start\s!itemgroupcolumns}
557
558\protected\def\strc_itemgroups_stop_columns
559 {\page_mix_fast_columns_stop}
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576\def\page_mix_initialize_columns
577 {\page_mix_enable_grid_snapping
578
579 \d_page_mix_distance {\mixedcolumnsparameter\c!distance}
580 \c_page_mix_n_of_columns{\mixedcolumnsparameter\c!n}
581 \d_page_mix_max_height {\mixedcolumnsparameter\c!maxheight}
582 \d_page_mix_max_width {\mixedcolumnsparameter\c!maxwidth}
583 \d_page_mix_balance_step{\mixedcolumnsparameter\c!step}
584
585 \d_page_mix_max_width{\d_page_mix_max_width\leftskip\rightskip}
586 \d_page_mix_leftskip \leftskip
587 \d_page_mix_rightskip\rightskip
588
589 \leftskip \zeroskip
590 \rightskip\zeroskip
591
592 \ifcstok{\mixedcolumnsparameter\c!notes}\v!yes
593 \c_page_mix_process_notes\conditionaltrue
594 \else
595 \c_page_mix_process_notes\conditionalfalse
596 \fi
597 \ifconditional\c_page_mix_process_notes \else
598 \startpostponingnotes
599 \fi
600
601 \d_page_mix_threshold\zeropoint
602
603 \d_page_mix_column_width{(\d_page_mix_max_width\d_page_mix_distance*\numexpr(\c_page_mix_n_of_columns\plusone)\relax)\c_page_mix_n_of_columns}
604
605 \columnwidth \d_page_mix_column_width
606 \columndistance\d_page_mix_distance
607 \nofcolumns \c_page_mix_n_of_columns
608 \textwidth \d_page_mix_column_width
609
610 \usemixedcolumnscolorparameter\c!color
611
612 \insidecolumnstrue
613
614 \usealignparameter \mixedcolumnsparameter
615 \useblankparameter \mixedcolumnsparameter
616 \useprofileparameter\mixedcolumnsparameter
617
618 \automigrationmode\zerocount
619
620 \nofcolumns\c_page_mix_n_of_columns}
621
622
623
624
625
626
627
628
629
630
631\newinteger\c_page_mix_otr_nesting
632
633
634
635
636
637
638
639
640
641
642\defcsname\??mixedcolumnsbefore\s!otr\endcsname
643 {\par
644 \global\advanceby\c_page_mix_otr_nesting\plusone
645 \ifcase\c_page_mix_otr_nesting\or
646 \ifzeropt\pagetotal\else
647
648 \strut
649 \vskip\lineheight
650
651 \fi
652 \fi}
653
654\defcsname\??mixedcolumnsstart\s!otr\endcsname
655 {\ifcase\c_page_mix_otr_nesting\or
656 \scratchwidth\textwidth
657 \setupoutputroutine[\s!mixedcolumn]
658 \c_page_mix_routine\c_page_mix_routine_intercept
659 \page_otr_trigger_output_routine
660
661 \holdinginserts\maxdimen
662
663 \ifvoid\b_page_mix_preceding \else
664
665 \page_postprocessors_linenumbers_deepbox\b_page_mix_preceding
666
667 \global\setbox\b_page_mix_preceding\vpack{\box\b_page_mix_preceding}
668 \wd\b_page_mix_preceding\scratchwidth
669 \page_grids_add_to_one\b_page_mix_preceding
670 \fi
671 \global\d_page_mix_preceding_height\ht\b_page_mix_preceding
672 \c_page_mix_routine\c_page_mix_routine_continue
673
674 \page_mix_command_set_vsize
675 \page_mix_command_set_hsize
676 \fi
677 \usealignparameter\mixedcolumnsparameter
678 \usesetupsparameter\mixedcolumnsparameter}
679
680
681
682
683
684
685
686
687\defcsname\??mixedcolumnsstop\s!otr\endcsname
688 {\par
689 \ifcase\c_page_mix_otr_nesting\or
690 \ifcstok{\mixedcolumnsparameter\c!balance}\v!yes
691 \c_page_mix_routine\c_page_mix_routine_balance
692 \else
693 \penalty\plustenthousand
694 \fi
695 \page_otr_trigger_output_routine
696 \ifvoid\b_page_mix_preceding \else
697
698 \unvbox\b_page_mix_preceding
699 \fi
700 \fi}
701
702\defcsname\??mixedcolumnsafter\s!otr\endcsname
703 {\ifcase\c_page_mix_otr_nesting\or
704 \prevdepth\strutdp
705 \page_otr_command_set_vsize
706 \page_otr_command_set_hsize
707 \fi
708 \global\advanceby\c_page_mix_otr_nesting\minusone}
709
710
711
712
713
714\protected\def\page_mix_routine_construct#1
715 {\d_page_mix_max_height{\mixedcolumnsparameter\c!maxheight}
716 \ifconditional\c_page_mix_process_notes
717 \totalnoteheight\zeropoint
718 \else
719 \settotalinsertionheight
720 \fi
721 \clf_mixsetsplit
722 box \b_page_mix_collected
723 nofcolumns \c_page_mix_n_of_columns
724 maxheight \d_page_mix_max_height
725 noteheight \totalnoteheight
726 step \d_page_mix_balance_step
727 cycles \c_page_mix_balance_cycles
728 preheight \d_page_mix_preceding_height
729 prebox \b_page_mix_preceding
730 strutht \strutht
731 strutdp \strutdp
732 threshold \d_page_mix_threshold
733 splitmethod {\mixedcolumnsparameter\c!splitmethod}
734 balance {#1}
735 alternative {\mixedcolumnsparameter\c!alternative}
736 internalgrid {\mixedcolumnsparameter\c!internalgrid}
737 grid \ifgridsnapping tru\else fals\fi e
738 notes \ifconditional\c_page_mix_process_notes tru\else fals\fi e
739 \relax
740 \deadcycles\zerocount}
741
742\newdimension\mixedcolumnseparatorheight
743\newdimension\mixedcolumnseparatordepth
744\newdimension\mixedcolumnseparatorwidth
745
746\def\page_mix_routine_package_step
747 {
748 \setbox\scratchbox\page_mix_command_package_column
749 \page_lines_add_numbers_to_box\scratchbox\recurselevel\c_page_mix_n_of_columns\plusone
750 \page_marks_synchronize_column\plusone\c_page_mix_n_of_columns\recurselevel\scratchbox
751
752 \anch_mark_column_box\scratchbox\recurselevel
753
754
755
756 \mixedcolumnseparatorheight\ht\scratchbox
757 \mixedcolumnseparatordepth \dp\scratchbox
758 \inheritedmixedcolumnsframedbox\currentmixedcolumns\scratchbox}
759
760\def\page_mix_routine_package_separate
761 {\ifcsname\??mixedcolumnsseparator\p_separator\endcsname
762 \page_mix_command_inject_separator
763 \else
764 \hss
765 \fi}
766
767\protected\def\page_mix_routine_package
768 {\clf_mixfinalize
769 \setbox\b_page_mix_collected\vbox \bgroup
770 \ifvoid\b_page_mix_preceding \else
771
772 \vpack\bgroup
773 \box\b_page_mix_preceding
774 \egroup
775 \global\d_page_mix_preceding_height\zeropoint
776 \nointerlineskip
777
778
779 \fi
780 \hskip\d_page_mix_leftskip
781 \page_mix_hbox to \d_page_mix_max_width \bgroup
782 \edef\p_separator{\mixedcolumnsparameter\c!separator}
783 \mixedcolumnseparatorwidth\d_page_mix_distance
784 \ifcstok{\mixedcolumnsparameter\c!direction}\v!reverse
785 \dostepwiserecurse\c_page_mix_n_of_columns\plusone\minusone
786 {\page_mix_routine_package_step
787 \ifnum\recurselevel>\plusone
788 \page_mix_routine_package_separate
789 \fi}
790 \else
791 \dorecurse\c_page_mix_n_of_columns
792 {\page_mix_routine_package_step
793 \ifnum\recurselevel<\c_page_mix_n_of_columns
794 \page_mix_routine_package_separate
795 \fi}
796 \fi
797 \egroup
798 \hskip\d_page_mix_rightskip
799 \egroup
800 \wd\b_page_mix_collected{
801 \d_page_mix_max_width
802 \d_page_mix_rightskip
803 \d_page_mix_leftskip
804 }}
805
806\protected\def\page_mix_command_package_column
807 {\page_mix_hbox to \d_page_mix_column_width \bgroup
808
809 \clf_mixgetsplit\recurselevel\relax
810 \hskip\d_page_mix_column_width
811 \vbox \bgroup
812 \hsize\d_page_mix_column_width
813 \ifconditional\c_page_mix_process_notes
814 \placenoteinserts
815 \fi
816 \egroup
817 \hss
818 \egroup}
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836\protected\def\page_mix_routine_continue
837 {\bgroup
838 \forgetall
839 \dontcomplain
840 \setbox\b_page_mix_collected\vpack{\unvbox\normalpagebox}
841 \page_mix_routine_construct\v!no
842 \page_mix_routine_package
843 \page_mix_construct_and_shipout\box\b_page_mix_collected\zerocount
844 \clf_mixflushrest
845 \clf_mixcleanup
846 \egroup}
847
848\protected\def\page_mix_routine_balance
849 {\bgroup
850 \forgetall
851 \dontcomplain
852 \setbox\b_page_mix_collected\vpack{\unvbox\normalpagebox}
853 \doloop
854 {
855 \page_mix_routine_construct\v!no
856 \ifcase\clf_mixstate\relax
857
858 \setbox\b_page_mix_collected\vpack{\clf_mixflushlist}
859
860 \page_mix_routine_construct\v!yes
861 \page_mix_routine_package
862
863 \setupoutputroutine[\s!singlecolumn]
864 \page_otr_command_set_vsize
865 \page_otr_command_set_hsize
866 \par
867
868 \page_grids_add_to_mix\b_page_mix_collected
869 \box\b_page_mix_collected
870
871
872
873 \nointerlineskip
874 \prevdepth\strutdp
875 \clf_mixflushrest
876 \clf_mixcleanup
877 \exitloop
878 \or
879
880
881 \page_mix_routine_package
882 \page_mix_construct_and_shipout\box\b_page_mix_collected\zerocount
883 \setbox\b_page_mix_collected\vpack{\clf_mixflushrest}
884 \clf_mixcleanup
885 \ifzeropt\ht\b_page_mix_collected
886 \exitloop
887 \fi
888 \fi}
889 \egroup}
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905\definemixedcolumns
906 [boxedcolumns]
907 [\c!balance=\v!yes,
908 \c!n=2,
909 \c!method=\s!box,
910 \c!strut=\v!yes,
911 \c!maxwidth=\availablehsize]
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949\letcsname\??mixedcolumnsbefore\s!box\endcsname\donothing
950\letcsname\??mixedcolumnsafter \s!box\endcsname\donothing
951
952\defcsname\??mixedcolumnsstart\s!box\endcsname
953 {\edef\p_page_mix_strut{\mixedcolumnsparameter\c!strut}
954 \setbox\b_page_mix_collected\vbox \bgroup
955 \let\currentoutputroutine\s!mixedcolumn
956 \forgetall
957 \usegridparameter\mixedcolumnsparameter
958
959 \page_mix_command_set_hsize
960 \ifx\p_page_mix_strut\v!yes
961 \begstrut
962 \ignorespaces
963 \fi}
964
965\defcsname\??mixedcolumnsstop\s!box\endcsname
966 {\ifx\p_page_mix_strut\v!yes
967 \removeunwantedspaces
968 \endstrut
969 \fi
970 \egroup
971 \edef\p_profile{\mixedcolumnsparameter\c!profile}
972 \ifempty\p_profile \else
973
974
975
976 \profilegivenbox\p_profile\b_page_mix_collected
977 \setbox\b_page_mix_collected\vpack{\unvbox\b_page_mix_collected}
978
979
980 \fi
981 \page_mix_box_balance}
982
983
984
985\protected\def\page_mix_box_balance
986 {\bgroup
987 \dontcomplain
988 \page_mix_routine_construct\v!yes
989 \page_mix_routine_package
990 \dontleavehmode\box\b_page_mix_collected
991 \clf_mixflushrest
992 \clf_mixcleanup
993 \egroup}
994
995
996
997
998\let\page_mix_command_package_contents\page_one_command_package_contents
999\let\page_mix_command_flush_float_box \page_one_command_flush_float_box
1000
1001\protected\def\page_mix_command_check_if_float_fits
1002 {\ifpostponecolumnfloats
1003 \global\c_page_floats_room\conditionalfalse
1004 \orelse\ifconditional\c_page_floats_not_permitted
1005 \global\c_page_floats_room\conditionalfalse
1006 \else
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017 \global\c_page_floats_room\conditionaltrue
1018 \fi
1019 \ifdim\floatwidth>\hsize
1020 \showmessage\m!columns{11}\empty
1021 \global\c_page_floats_room\conditionalfalse
1022 \fi}
1023
1024\protected\def\page_mix_command_flush_floats
1025 {\page_one_command_flush_floats}
1026
1027\protected\def\page_mix_command_flush_saved_floats
1028 {\page_one_command_flush_saved_floats}
1029
1030
1031
1032
1033\protected\def\page_mix_place_float_top
1034 {\showmessage\m!columns4\empty\page_one_place_float_here}
1035
1036\protected\def\page_mix_place_float_bottom
1037 {\showmessage\m!columns5\empty\page_one_place_float_here}
1038
1039\protected\def\page_mix_place_float_here
1040 {\page_one_place_float_here}
1041
1042\protected\def\page_mix_place_float_force
1043 {\page_one_place_float_force}
1044
1045\protected\def\page_mix_command_side_float_output
1046 {\page_mix_construct_and_shipout\unvbox\normalpagebox\zerocount}
1047
1048\protected\def\page_mix_command_synchronize_side_floats
1049 {\page_sides_forget_floats}
1050
1051\protected\def\page_mix_command_flush_side_floats
1052 {\page_sides_forget_floats}
1053
1054\protected\def\page_mix_command_next_page
1055 {\page_otr_eject_page}
1056
1057\protected\def\page_mix_command_next_page_and_inserts
1058 {\page_otr_eject_page_and_flush_inserts}
1059
1060
1061
1062\tolerant\protected\def\page_mix_command_test_column[#1]#*[#2]
1063 {\par
1064 \begingroup
1065 \scratchdimen{#1\lineheight\ifparameter#2\or#2\fi}
1066 \ifdim\scratchdimen>\zeropoint
1067 \c_attr_checkedbreak\number\scratchdimen
1068 \penalty\c_page_mix_break_forced\relax
1069 \fi
1070 \endgroup}
1071
1072
1073
1074
1075\let\page_mix_command_flush_all_floats\page_one_command_flush_all_floats
1076
1077\defineoutputroutine
1078 [\s!mixedcolumn]
1079 [\s!page_otr_command_routine =\page_mix_command_routine,
1080 \s!page_otr_command_package_contents =\page_mix_command_package_contents,
1081 \s!page_otr_command_set_vsize =\page_mix_command_set_vsize,
1082 \s!page_otr_command_set_hsize =\page_mix_command_set_hsize,
1083
1084 \s!page_otr_command_next_page =\page_mix_command_next_page,
1085 \s!page_otr_command_next_page_and_inserts =\page_mix_command_next_page_and_inserts,
1086
1087
1088
1089
1090 \s!page_otr_command_check_if_float_fits =\page_mix_command_check_if_float_fits,
1091
1092 \s!page_otr_command_flush_float_box =\page_mix_command_flush_float_box,
1093 \s!page_otr_command_side_float_output =\page_mix_command_side_float_output,
1094 \s!page_otr_command_synchronize_side_floats=\page_mix_command_synchronize_side_floats,
1095 \s!page_otr_command_flush_floats =\page_mix_command_flush_floats,
1096 \s!page_otr_command_flush_side_floats =\page_mix_command_flush_side_floats,
1097 \s!page_otr_command_flush_saved_floats =\page_mix_command_flush_saved_floats,
1098 \s!page_otr_command_flush_all_floats =\page_mix_command_flush_all_floats,
1099
1100 \s!page_otr_command_test_column =\page_mix_command_test_column
1101 ]
1102
1103
1104
1105\installfloatmethod \s!mixedcolumn \v!here \page_mix_place_float_here
1106\installfloatmethod \s!mixedcolumn \v!force \page_mix_place_float_force
1107\installfloatmethod \s!mixedcolumn \v!top \page_mix_place_float_top
1108\installfloatmethod \s!mixedcolumn \v!bottom \page_mix_place_float_bottom
1109
1110\installfloatmethod \s!mixedcolumn \v!local \somelocalfloat
1111
1112
1113
1114\protect \endinput
1115 |