diff options
Diffstat (limited to 'tex/context/base/mkiv/page-mix.mkxl')
-rw-r--r-- | tex/context/base/mkiv/page-mix.mkxl | 1092 |
1 files changed, 0 insertions, 1092 deletions
diff --git a/tex/context/base/mkiv/page-mix.mkxl b/tex/context/base/mkiv/page-mix.mkxl deleted file mode 100644 index 20f4ff3ca..000000000 --- a/tex/context/base/mkiv/page-mix.mkxl +++ /dev/null @@ -1,1092 +0,0 @@ -%D \module -%D [ file=page-mix, -%D version=2012.07.12, -%D title=\CONTEXT\ Page Macros, -%D subtitle=Mixed Columns, -%D author=Hans Hagen, -%D date=\currentdate, -%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] -%C -%C This module is part of the \CONTEXT\ macro||package and is -%C therefore copyrighted by \PRAGMA. See mreadme.pdf for -%C details. - -\writestatus{loading}{ConTeXt Page Macros / Mixed Columns} - -%D This is a very experimental module. Eventually it will replace the current -%D multi column mechanism (that then will be an instance). The \LUA\ part of -%D the interface will quite probably change so don't use that one directly -%D (yet). - -% todo: -% -% consult note class -% notes per page -% notes in each column -% notes in last column -% notes local/global -% top and bottom inserts -% wide floats -% move floats -% offsets (inner ones, so we change the hsize ... needed with backgrounds -% when no content we currently loose the page - -% luatex buglet: -% -% \ctxlua{tex.setbox("global",0,node.hpack(nodes.pool.glyph("a",font.current())))}\box0 - -\registerctxluafile{page-mix}{} - -\unprotect - -%D The mixed output routine replaces the traditional multi column handler that -%D started out in \MKII. One of the complications of a routine is that it needs -%D to align nicely when mixed in a single column layout. Instead of using all -%D kind of shift juggling in this mechanism we simply switch to grid mode -%D locally. After all, columns don't look nice when not on a. As the grid -%D snapper in \MKIV\ is more advanced not that much extra code is needed. - -%D We use the command handler but the parent settings are not to be changed. -%D Instead we could have used a dedicated root setup, but it's not worth the -%D trouble. - -\installcorenamespace{mixedcolumns} - -\installframedcommandhandler \??mixedcolumns {mixedcolumns} \??mixedcolumns - -% old multicolumns mechanism -% -% \c!ntop=1, -% \c!rule=\v!off, : now separator=rule -% \c!height=, -% \c!blank={\v!line,\v!fixed}, -% \c!rulethickness=\linewidth, -% \c!offset=.5\bodyfontsize, - -\setupmixedcolumns - [\c!distance=1.5\bodyfontsize, - \c!n=\plustwo, - %\c!align=, % inherit (also replaces tolerance) - %\c!before=, - %\c!after=, - %\c!separator=\v!none, - %\c!setups=, - %\c!balance=\v!no, - %\c!blank={\v!line,\v!fixed}, yes or no - \c!frame=\v!off, - \c!strut=\v!no, - \c!offset=\v!overlay, - \c!alternative=\v!local, - \c!maxheight=\textheight, - \c!maxwidth=\makeupwidth, - \c!grid=\v!tolerant, - \c!internalgrid=\v!line, - \c!step=.25\lineheight, % needs some experimenting - %\c!splitmethod=\v!fixed, % will be default - \c!direction=\v!normal, % new (also todo in the new columnsets) - \c!notes=\v!yes, - \c!method=\ifinner\s!box\else\s!otr\fi] % automatic as suggested by WS - -\let\startmixedcolumns\relax % defined later -\let\stopmixedcolumns \relax % defined later - -\appendtoks % could become an option - \setuevalue{\e!start\currentmixedcolumns}{\startmixedcolumns[\currentmixedcolumns]}% - \setuevalue{\e!stop \currentmixedcolumns}{\stopmixedcolumns}% -\to \everydefinemixedcolumns - -%D In order to avoid a mixup we use quite some local registers. - -\newdimen \d_page_mix_column_width -\newdimen \d_page_mix_max_height -\newdimen \d_page_mix_max_width -\newdimen \d_page_mix_distance -\newcount \c_page_mix_n_of_columns -\newdimen \d_page_mix_threshold -\newdimen \d_page_mix_leftskip -\newdimen \d_page_mix_rightskip - -\newdimen \d_page_mix_balance_step -\setnewconstant\c_page_mix_balance_cycles 500 - -\setnewconstant\c_page_mix_break_forced -123 - -\newbox \b_page_mix_preceding -\newdimen \d_page_mix_preceding_height - -\newbox \b_page_mix_collected - -\newconstant \c_page_mix_routine - -\setnewconstant\c_page_mix_routine_regular \zerocount -\setnewconstant\c_page_mix_routine_intercept\plusone -\setnewconstant\c_page_mix_routine_continue \plustwo -\setnewconstant\c_page_mix_routine_balance \plusthree -\setnewconstant\c_page_mix_routine_error \plusfour - -\newconditional\c_page_mix_process_notes -\newconditional\c_page_mix_grid_snapping - -%D The main environment is called as follows: -%D -%D \starttyping -%D \startmixedcolumns[instance][settings] -%D \startmixedcolumns[instance] -%D \startmixedcolumns[settings] -%D \stoptyping -%D -%D However, best is not to use this one directly but define an instance and -%D use that one. - -% % For the moment only on my machine: -% -% \definemixedcolumns -% [\v!columns] -% -% \protected\def\setupcolumns -% {\setupmixedcolumns[\v!columns]} - -%D In itemizations we also need columns, so let's define a apecial instance -%D for them. These need to work well in situations like this: -%D -%D \starttyping -%D \input zapf -%D -%D \startnarrower -%D \startitemize[columns,two,packed][before=,after=] -%D \dorecurse{10}{\startitem item #1 \stopitem} -%D \stopitemize -%D \stopnarrower -%D -%D \input zapf -%D -%D \startnarrower -%D \startitemize[columns,two][before=,after=] -%D \dorecurse{10}{\startitem item #1 \stopitem} -%D \stopitemize -%D \stopnarrower -%D -%D \input zapf -%D -%D \startnarrower -%D \startitemize[columns,two] -%D \dorecurse{10}{\startitem item #1 \stopitem} -%D \stopitemize -%D \stopnarrower -%D -%D \input zapf -%D \stoptyping - -\ifdefined\s!itemgroupcolumns \else \def\s!itemgroupcolumns{itemgroupcolumns} \fi - -\definemixedcolumns - [\s!itemgroupcolumns] - [\c!n=\itemgroupparameter\c!n, - \c!direction=\itemgroupparameter\c!direction, - \c!separator=\v!none, - \c!splitmethod=\v!none, - \c!grid=\v!tolerant, - \c!internalgrid=\v!halfline, % new, we may still revert to \v!line - \c!balance=\v!yes, - \c!notes=\v!no] % kind of hidden - -% better - -\setupmixedcolumns - [\s!itemgroupcolumns] - [\c!splitmethod=\v!fixed, - \c!grid=\v!yes, - \c!internalgrid=\v!line] - -% even better: - -\setupitemgroup - [\c!grid=\v!tolerant:10] % 10 pct tolerance in columns snapping - -\setupmixedcolumns - [\s!itemgroupcolumns] - [\c!grid=\itemgroupparameter\c!grid] - -% the fast hooks: - -\protected\def\strc_itemgroups_start_columns - {\startmixedcolumns[\s!itemgroupcolumns]} % we could have a fast one - -\protected\def\strc_itemgroups_stop_columns - {\stopmixedcolumns} - -%D The mixed output routine can be in different states. First we need to intercept -%D the already present content. This permits mixed single and multi column usage. -%D Then we have the continuous routine, one that intercepts pages in sequence. -%D Finally, when we finish the mixed columns mode, we can (optionally) balance the -%D last page. - -\protected\def\page_mix_command_routine - {\ifcase\c_page_mix_routine - \page_one_command_routine - \or - \page_mix_routine_intercept - \or - \page_mix_routine_continue - \or - \page_mix_routine_balance - \or - \page_mix_routine_error - \fi} - -%D The interceptor is quite simple, at least for the moment. - -\def\page_mix_routine_intercept - {\ifdim\pagetotal>\pagegoal - % testcase: preceding-001 ... if we don't do this, text can disappear as - % preceding is overwritten ... needs to be figured out some day - \page_one_command_routine - \fi - \global\setbox\b_page_mix_preceding\vbox % pack ? - {\forgetall - \page_otr_command_flush_top_insertions - \ifdim\htdp\b_page_mix_preceding=\zeropoint \else - \writestatus\m!columns{preceding error}% - \unvbox\b_page_mix_preceding - \fi - \unvbox\normalpagebox}} - -%D The error routine is there but unlikely to be called. It is a left-over from -%D the traditional routine that might come in handy some day. - -\def\page_mix_construct_and_shipout#1#2#3% - {\ifconditional\c_page_mix_grid_snapping\else\gridsnappingfalse\fi % maybe only for notes (bottom alignment) - \page_otr_construct_and_shipout#1#2#3% - \ifconditional\c_page_mix_grid_snapping \gridsnappingtrue \fi} - - -\def\page_mix_routine_error - {\showmessage\m!columns3\empty - \page_mix_construct_and_shipout\unvbox\normalpagebox\zerocount} % three arguments - -%D Some settings (and actions) depend on the current output routine and setting the -%D hsize and vsize is among them. The calculation of the hsize is done elsewhere. - -\protected\def\page_mix_command_set_hsize - {\hsize\d_page_mix_column_width - \columnwidth\d_page_mix_column_width} - -%D When setting the vsize we make sure that we collect a few more lines than needed -%D so that we have enough to split over the columns. Collecting too much is somewhat -%D tricky as they will spill over to the next page. - -\protected\def\page_mix_command_set_vsize - {\vsize\dimexpr\c_page_mix_n_of_columns\textheight+\c_page_mix_n_of_columns\lineheight\relax - \pagegoal\dimexpr - \vsize -% -\d_page_floats_inserted_top % needs checking -% -\d_page_floats_inserted_bottom % needs checking - -\c_page_mix_n_of_columns\insertheights - \relax} - -%D As we use \LUA\ there is the usual amount of tracing at that end. At the tex end -%D we only visualize boxes. - -\let\page_mix_hbox\hbox -\let\page_mix_vbox\vbox - -\installtextracker - {mixedcolumns.boxes} - {\let\page_mix_hbox\ruledhbox - \let\page_mix_vbox\ruledvbox} - {\let\page_mix_hbox\hbox - \let\page_mix_vbox\vbox} - -%D We provide a few column break options. Interesting is that while forcing a new -%D column in the traditional mechanism was a pain, here it works quite well. - -\installcolumnbreakmethod \s!mixedcolumn \v!preference - {\goodbreak} - -\installcolumnbreakmethod \s!mixedcolumn \v!yes - {\par - \penalty\c_page_mix_break_forced\relax} - -%D As we operate in grid snapping mode, we use a dedicated macro to enable this -%D mechamism. - -\def\page_mix_enable_grid_snapping - {\edef\p_grid{\mixedcolumnsparameter\c!grid}% - \setfalse\c_page_mix_grid_snapping - \ifempty\p_grid - % just follow the default grid settings - \else - \ifgridsnapping\settrue\c_page_mix_grid_snapping\fi - \gridsnappingtrue - \setsystemmode\v!grid - \spac_grids_snap_value_set\p_grid - \fi} - -%D Between columns there is normally just spacing unless one enforces a rule. -%D -%D \starttyping -%D \input zapf -%D -%D \startnarrower -%D \startmixedcolumns[n=2,background=color,backgroundcolor=red,rulethickness=1mm,rulecolor=green,separator=rule] -%D \input zapf -%D \stopmixedcolumns -%D \stopnarrower -%D -%D \input zapf -%D \stoptyping - -\installcorenamespace{mixedcolumnsseparator} - -\protected\def\installmixedcolumnseparator#1#2% - {\setvalue{\??mixedcolumnsseparator#1}{#2}} - -\installmixedcolumnseparator\v!rule - {\vrule - \s!width \mixedcolumnsparameter\c!rulethickness - \s!height\mixedcolumnseparatorheight - \s!depth \mixedcolumnseparatordepth - \relax} - -\protected\def\page_mix_command_inject_separator - {\begingroup - \setbox\scratchbox\hbox to \zeropoint \bgroup - \hss - \starttextproperties - \usemixedcolumnscolorparameter\c!rulecolor - \begincsname\??mixedcolumnsseparator\p_separator\endcsname % was \c!rule - \stoptextproperties - \hss - \egroup - \ht\scratchbox\zeropoint - \dp\scratchbox\zeropoint - \hss - \box\scratchbox - \hss - \endgroup} - -%D We've now arrived at the real code. The start command mostly sets up the -%D environment and variables that are used in the splitter. One of the last -%D things happening at the start is switching over to the mixed continuous -%D routine. - -\installcorenamespace{mixedcolumnsbefore} -\installcorenamespace{mixedcolumnsstart} -\installcorenamespace{mixedcolumnsstop} -\installcorenamespace{mixedcolumnsafter} - -%D For practical reasons there is always a first argument needed that -%D indicates the class. -%D -%D \starttyping -%D \startmixedcolumns[n=3,alternative=global] -%D \dorecurse{200}{Zomaar wat #1 met een footnote\footnote{note #1}. } -%D \stopmixedcolumns -%D \stoptyping - -\let\currentmixedcolumnsmethod\empty - -\installmacrostack\currentmixedcolumns -\installmacrostack\currentmixedcolumnsmethod - -\protected\def\startmixedcolumns - {\dodoubleempty\page_mix_start_columns} - -\def\page_mix_start_columns_checked#1#2% - {\edef\currentmixedcolumnsmethod{\mixedcolumnsparameter\c!method}% - \ifx\currentmixedcolumnsmethod\v!box - \singleexpandafter#1% - \orelse\ifinsidecolumns - \doubleexpandafter#2% - \else - \doubleexpandafter#1% - \fi} - -\protected\def\page_mix_start_columns - {\push_macro_currentmixedcolumns - \push_macro_currentmixedcolumnsmethod - \ifsecondargument - \singleexpandafter\page_mix_start_columns_a - \orelse\iffirstargument - \doubleexpandafter\page_mix_start_columns_b - \else - \doubleexpandafter\page_mix_start_columns_c - \fi} - -\def\page_mix_start_columns_a[#1]% [#2]% - {\edef\currentmixedcolumns{#1}% - \page_mix_start_columns_checked - \page_mix_start_columns_a_yes - \page_mix_start_columns_a_nop} - -\def\page_mix_start_columns_a_yes[#1]% - {\mixedcolumnsparameter\c!before\relax - \begincsname\??mixedcolumnsbefore\currentmixedcolumnsmethod\endcsname\relax - \begingroup - \setupcurrentmixedcolumns[#1]% - \page_mix_initialize_columns - \begincsname\??mixedcolumnsstart\currentmixedcolumnsmethod\endcsname - \let\stopmixedcolumns\page_mix_columns_stop_yes} - -\def\page_mix_start_columns_a_nop[#1]% - {\begingroup - \let\stopmixedcolumns\page_mix_columns_stop_nop} - -\def\page_mix_start_columns_b[#1][#2]% - {\doifelseassignment{#1}% - {\let\currentmixedcolumns\empty - \page_mix_error_b} - {\edef\currentmixedcolumns{#1}% - \firstargumentfalse}% - \page_mix_start_columns_checked - \page_mix_start_columns_b_yes - \page_mix_start_columns_b_nop - [#1]} - -\def\page_mix_start_columns_b_yes[#1]% - {\mixedcolumnsparameter\c!before\relax % so, it doesn't listen to local settings ! - \begincsname\??mixedcolumnsbefore\currentmixedcolumnsmethod\endcsname\relax - \begingroup - \iffirstargument - \setupcurrentmixedcolumns[#1]% - \fi - \page_mix_initialize_columns - \begincsname\??mixedcolumnsstart\currentmixedcolumnsmethod\endcsname % no \relax - \let\stopmixedcolumns\page_mix_columns_stop_yes} - -\def\page_mix_start_columns_b_nop[#1]% - {\begingroup - \let\stopmixedcolumns\page_mix_columns_stop_nop} - -\def\page_mix_error_b - {\writestatus\m!columns{best use an instance of mixed columns}} - -\def\page_mix_start_columns_c[#1][#2]% - {\let\currentmixedcolumns\empty - \page_mix_start_columns_checked - \page_mix_start_columns_c_yes - \page_mix_start_columns_c_nop} - -\def\page_mix_start_columns_c_yes - {\mixedcolumnsparameter\c!before\relax - \begincsname\??mixedcolumnsbefore\currentmixedcolumnsmethod\endcsname\relax - \begingroup - \page_mix_initialize_columns - \begincsname\??mixedcolumnsstart\currentmixedcolumnsmethod\endcsname - \let\stopmixedcolumns\page_mix_columns_stop_yes} - -\def\page_mix_start_columns_c_nop - {\begingroup - \let\stopmixedcolumns\page_mix_columns_stop_nop} - -\protected\def\page_mix_fast_columns_start#1% - {\push_macro_currentmixedcolumns - \push_macro_currentmixedcolumnsmethod - \edef\currentmixedcolumns{#1}% - \edef\currentmixedcolumnsmethod{\mixedcolumnsparameter\c!method}% - \mixedcolumnsparameter\c!before\relax % so, it doesn't listen to local settings ! - \begincsname\??mixedcolumnsbefore\currentmixedcolumnsmethod\endcsname\relax - \begingroup - \page_mix_initialize_columns - \begincsname\??mixedcolumnsstart\currentmixedcolumnsmethod\endcsname % no \relax - \let\page_mix_fast_columns_stop\page_mix_columns_stop_yes} - -%D When we stop, we switch over to the balancing routine. After we're done we -%D make sure to set the sizes are set, a somewhat redundant action when we -%D already have flushed but better be safe. - -\let\page_mix_fast_columns_stop\relax - -\newtoks\t_page_mix_at_the_end - -\def\page_mix_finalize_columns - {\ifconditional\c_page_mix_process_notes \else - \global\t_page_mix_at_the_end{\stoppostponingnotes}% - \fi} - -\protected\def\page_mix_columns_stop_yes - {\begincsname\??mixedcolumnsstop\currentmixedcolumnsmethod\endcsname % no \relax - \page_mix_finalize_columns - \endgroup - \begincsname\??mixedcolumnsafter\currentmixedcolumnsmethod\endcsname\relax - \mixedcolumnsparameter\c!after\relax - \pop_macro_currentmixedcolumnsmethod - \pop_macro_currentmixedcolumns - \the\t_page_mix_at_the_end\global\t_page_mix_at_the_end\emptytoks} - -\protected\def\page_mix_columns_stop_nop - {\page_mix_finalize_columns - \endgroup - \pop_macro_currentmixedcolumnsmethod - \pop_macro_currentmixedcolumns - \the\t_page_mix_at_the_end\global\t_page_mix_at_the_end\emptytoks} - -% \protected\def\page_mix_columns_stop_yes -% {\begincsname\??mixedcolumnsstop \currentmixedcolumnsmethod\endcsname % no \relax -% \endgroup -% \begincsname\??mixedcolumnsafter\currentmixedcolumnsmethod\endcsname\relax -% \mixedcolumnsparameter\c!after\relax -% \ifx\currentmixedcolumnsmethod\s!otr -% \pop_macro_currentmixedcolumnsmethod -% \pop_macro_currentmixedcolumns -% \synchronizeoutput % brrr, otherwise sometimes issues in itemize -% \else -% \pop_macro_currentmixedcolumnsmethod -% \pop_macro_currentmixedcolumns -% \fi -% } - -%D This is how the fast one is used: - -\protected\def\strc_itemgroups_start_columns - {\page_mix_fast_columns_start\s!itemgroupcolumns} - -\protected\def\strc_itemgroups_stop_columns - {\page_mix_fast_columns_stop} % set by start - -% not used nor documented so commented: -% -% \setupmixedcolumns -% [\s!itemgroupcolumns] -% [\c!grid=\itemgroupparameter\c!grid] -% -% \setupitemgroup -% [\c!grid=\v!yes] % we need a value - -% better - -%D The common initialization: - -\def\page_mix_initialize_columns - {\page_mix_enable_grid_snapping - % - \d_page_mix_distance \mixedcolumnsparameter\c!distance - \c_page_mix_n_of_columns\mixedcolumnsparameter\c!n - \d_page_mix_max_height \mixedcolumnsparameter\c!maxheight - \d_page_mix_max_width \mixedcolumnsparameter\c!maxwidth - \d_page_mix_balance_step\mixedcolumnsparameter\c!step - % - \d_page_mix_max_width\dimexpr\d_page_mix_max_width-\leftskip-\rightskip\relax - \d_page_mix_leftskip \leftskip - \d_page_mix_rightskip\rightskip - \leftskip \zeropoint - \rightskip\zeropoint - % - \doifelse{\mixedcolumnsparameter\c!notes}\v!yes\settrue\setfalse\c_page_mix_process_notes - \ifconditional\c_page_mix_process_notes \else - \startpostponingnotes - \fi - % - \d_page_mix_threshold\zeropoint - % - \d_page_mix_column_width\dimexpr(\d_page_mix_max_width-\d_page_mix_distance*\numexpr(\c_page_mix_n_of_columns-\plusone)\relax)/\c_page_mix_n_of_columns\relax - % - \columnwidth \d_page_mix_column_width - \columndistance\d_page_mix_distance - \nofcolumns \c_page_mix_n_of_columns - \textwidth \d_page_mix_column_width % kind of redundant but we had it so ... - % - \usemixedcolumnscolorparameter\c!color - % - \insidecolumnstrue % new - % - \usealignparameter \mixedcolumnsparameter - \useblankparameter \mixedcolumnsparameter - \useprofileparameter\mixedcolumnsparameter % new - % - \nofcolumns\c_page_mix_n_of_columns} % public - -%D The otr method related hooks are defined next: - -% \setvalue{\??mixedcolumnsbefore\s!otr}% -% {\par -% \ifdim\pagetotal=\zeropoint \else -% \verticalstrut % probably no longer needed -% \vskip-\struttotal % probably no longer needed -% \fi} - -\newcount\c_page_mix_otr_nesting - -% \setvalue{\??mixedcolumnsbefore\s!otr}% -% {\par -% \global\advance\c_page_mix_otr_nesting\plusone -% \ifcase\c_page_mix_otr_nesting\or -% \ifdim\pagetotal=\zeropoint \else -% \obeydepth % we could handle this in pre material -% \fi -% \fi} - -\setvalue{\??mixedcolumnsbefore\s!otr}% - {\par - \global\advance\c_page_mix_otr_nesting\plusone - \ifcase\c_page_mix_otr_nesting\or - \ifdim\pagetotal=\zeropoint \else - % make sure that whitespace an dblanks are done - \strut - \vskip-\lineheight - % no, bad spacing: \obeydepth % we could handle this in pre material - \fi - \fi} - -\setvalue{\??mixedcolumnsstart\s!otr}% - {\ifcase\c_page_mix_otr_nesting\or - \scratchwidth\textwidth - \setupoutputroutine[\s!mixedcolumn]% - \c_page_mix_routine\c_page_mix_routine_intercept - \page_otr_trigger_output_routine - % - \holdinginserts\maxdimen - % - \ifvoid\b_page_mix_preceding \else - % moved here, before the packaging - \page_postprocessors_linenumbers_deepbox\b_page_mix_preceding - % we need to avoid unvboxing with successive balanced on one page - \global\setbox\b_page_mix_preceding\vpack{\box\b_page_mix_preceding}% - \wd\b_page_mix_preceding\scratchwidth % \makeupwidth - \page_grids_add_to_one\b_page_mix_preceding - \fi - \global\d_page_mix_preceding_height\ht\b_page_mix_preceding - \c_page_mix_routine\c_page_mix_routine_continue - % - \page_mix_command_set_vsize - \page_mix_command_set_hsize - \fi - \usealignparameter\mixedcolumnsparameter - \usesetupsparameter\mixedcolumnsparameter} - -% \setvalue{\??mixedcolumnsstop\s!otr}% -% {\par -% \ifcase\c_page_mix_otr_nesting\or -% \c_page_mix_routine\c_page_mix_routine_balance -% \page_otr_trigger_output_routine -% \fi} - -\setvalue{\??mixedcolumnsstop\s!otr}% - {\par - \ifcase\c_page_mix_otr_nesting\or - \doifelse{\mixedcolumnsparameter\c!balance}\v!yes - {\c_page_mix_routine\c_page_mix_routine_balance}% - {\penalty-\plustenthousand}% weird hack, we need to trigger the otr sometimes (new per 20140306, see balancing-001.tex) - \page_otr_trigger_output_routine - \ifvoid\b_page_mix_preceding \else - % empty columns so we need to make sure pending content is flushed - \unvbox\b_page_mix_preceding % new per 2014.10.25 - \fi - \fi} - -\setvalue{\??mixedcolumnsafter\s!otr}% - {\ifcase\c_page_mix_otr_nesting\or - \prevdepth\strutdp - \page_otr_command_set_vsize - \page_otr_command_set_hsize - \fi - \global\advance\c_page_mix_otr_nesting\minusone} - -%D The splitting and therefore balancing is done at the \LUA\ end. This gives -%D more readable code and also makes it easier to deal with insertions like -%D footnotes. Eventually we will have multiple strategies available. - -\protected\def\page_mix_routine_construct#1% - {\d_page_mix_max_height\mixedcolumnsparameter\c!maxheight % can have changed due to header=high - \ifconditional\c_page_mix_process_notes - \totalnoteheight\zeropoint - \else - \settotalinsertionheight - \fi - \clf_mixsetsplit - box \b_page_mix_collected - nofcolumns \c_page_mix_n_of_columns - maxheight \d_page_mix_max_height - noteheight \totalnoteheight - step \d_page_mix_balance_step - cycles \c_page_mix_balance_cycles - preheight \d_page_mix_preceding_height - prebox \b_page_mix_preceding - strutht \strutht - strutdp \strutdp - threshold \d_page_mix_threshold - splitmethod {\mixedcolumnsparameter\c!splitmethod}% - balance {#1}% - alternative {\mixedcolumnsparameter\c!alternative}% - internalgrid {\mixedcolumnsparameter\c!internalgrid}% - grid \ifgridsnapping tru\else fals\fi e % - notes \ifconditional\c_page_mix_process_notes tru\else fals\fi e % - \relax - \deadcycles\zerocount} - -\newdimen\mixedcolumnseparatorheight -\newdimen\mixedcolumnseparatordepth -\newdimen\mixedcolumnseparatorwidth - -\def\page_mix_routine_package_step - {% needs packaging anyway - \setbox\scratchbox\page_mix_command_package_column - \page_lines_add_numbers_to_box\scratchbox\recurselevel\c_page_mix_n_of_columns\plusone % new - \page_marks_synchronize_column\plusone\c_page_mix_n_of_columns\recurselevel\scratchbox - % backgrounds - \anch_mark_column_box\scratchbox\recurselevel - % for the moment a quick and dirty patch .. we need to go into the box (hence the \plusone) .. a slowdowner - % moved to start: \page_lines_add_numbers_to_box\scratchbox\recurselevel\c_page_mix_n_of_columns\plusone - % the framed needs a reset of strut, align, setups etc - \mixedcolumnseparatorheight\ht\scratchbox - \mixedcolumnseparatordepth \dp\scratchbox - \inheritedmixedcolumnsframedbox\currentmixedcolumns\scratchbox} - -\def\page_mix_routine_package_separate - {\ifcsname\??mixedcolumnsseparator\p_separator\endcsname - \page_mix_command_inject_separator - \else - \hss - \fi} - -\protected\def\page_mix_routine_package - {\clf_mixfinalize - \setbox\b_page_mix_collected\vbox \bgroup - \ifvoid\b_page_mix_preceding \else - % \page_postprocessors_linenumbers_deepbox\b_page_mix_preceding % already done - \vpack\bgroup - \box\b_page_mix_preceding - \egroup - \global\d_page_mix_preceding_height\zeropoint - \nointerlineskip - % no no: - % \prevdepth\strutdepth - \fi - \hskip\d_page_mix_leftskip - \page_mix_hbox to \d_page_mix_max_width \bgroup - \edef\p_separator{\mixedcolumnsparameter\c!separator}% - \mixedcolumnseparatorwidth\d_page_mix_distance % \mixedcolumnsparameter\c!rulethickness\relax - \edef\p_direction{\mixedcolumnsparameter\c!direction}% - \ifx\p_direction\v!reverse - \dostepwiserecurse\c_page_mix_n_of_columns\plusone\minusone - {\page_mix_routine_package_step - \ifnum\recurselevel>\plusone - \page_mix_routine_package_separate - \fi}% - \else - \dorecurse\c_page_mix_n_of_columns - {\page_mix_routine_package_step - \ifnum\recurselevel<\c_page_mix_n_of_columns - \page_mix_routine_package_separate - \fi}% - \fi - \egroup - \hskip\d_page_mix_rightskip - \egroup - \wd\b_page_mix_collected\dimexpr - \d_page_mix_max_width - +\d_page_mix_rightskip - +\d_page_mix_leftskip - \relax } - -\protected\def\page_mix_command_package_column - {\page_mix_hbox to \d_page_mix_column_width \bgroup - % maybe intercept empty - \clf_mixgetsplit\recurselevel\relax - \hskip-\d_page_mix_column_width - \vbox \bgroup - \hsize\d_page_mix_column_width - \ifconditional\c_page_mix_process_notes - \placenoteinserts - \fi - \egroup - \hss - \egroup} - -% \protected\def\page_mix_command_package_column -% {\page_mix_hbox to \d_page_mix_column_width \bgroup -% % maybe intercept empty -% \ruledhpack\bgroup -% \clf_mixgetsplit\recurselevel\relax -% \egroup -% \hskip-\d_page_mix_column_width -% \ruledhpack \bgroup -% \hsize\d_page_mix_column_width -% \ifconditional\c_page_mix_process_notes -% \placenoteinserts -% \fi -% \egroup -% \hss -% \egroup} - -\protected\def\page_mix_routine_continue - {\bgroup - \forgetall - \dontcomplain - \setbox\b_page_mix_collected\vpack{\unvbox\normalpagebox}% brrr we need to make a tight box (combine this in lua) - \page_mix_routine_construct\v!no - \page_mix_routine_package - \page_mix_construct_and_shipout\box\b_page_mix_collected\zerocount % three arguments - \clf_mixflushrest - \clf_mixcleanup - \egroup} - -\protected\def\page_mix_routine_balance - {\bgroup - \forgetall - \dontcomplain - \setbox\b_page_mix_collected\vpack{\unvbox\normalpagebox}% brrr we need to make a tight box (combine this in lua) - \doloop - {%writestatus\m!columns{construct continue (\the\htdp\b_page_mix_collected)}% - \page_mix_routine_construct\v!no - \ifcase\clf_mixstate\relax - % 0 = okay, we can balance - \setbox\b_page_mix_collected\vpack{\clf_mixflushlist}% we could avoid this - %writestatus\m!columns{construct balance}% - \page_mix_routine_construct\v!yes - \page_mix_routine_package - \c_page_mix_routine\c_page_mix_routine_regular - % \setupoutputroutine[\s!singlecolumn]% - \page_otr_command_set_vsize - \page_otr_command_set_hsize - \par - %writestatus\m!columns{flush balance}% - \page_grids_add_to_mix\b_page_mix_collected % no linenumbers here - \box\b_page_mix_collected - \vskip\zeropoint % triggers recalculation of page stuff (weird that this is needed but it *is* needed, see mixed-001.tex) - \par - \nointerlineskip - \prevdepth\strutdp - \clf_mixflushrest% rubish - \clf_mixcleanup % rubish - \exitloop - \or - % 1 = we have stuff left, so flush and rebalance - %writestatus\m!columns{flush continue}% - \page_mix_routine_package - \page_mix_construct_and_shipout\box\b_page_mix_collected\zerocount % three arguments - \setbox\b_page_mix_collected\vpack{\clf_mixflushrest}% we could avoid this - \clf_mixcleanup - \ifdim\ht\b_page_mix_collected=\zeropoint - \exitloop - \fi - \fi}% - \egroup} - -%D We also implement a variant compatible with the so called simple columns -%D mechanism: -%D -%D \starttyping -%D \startboxedcolumns -%D \input zapf -%D \stopboxedcolumns -%D \stoptyping -%D -%D This is a rather mininimalistic variant. - -% Maybe we also need a variant with obeydepth before and prevdepth after so -% that we get a nice spacing. - -\definemixedcolumns - [boxedcolumns] - [\c!balance=\v!yes, - \c!n=2, - \c!method=\s!box, - \c!strut=\v!yes, - \c!maxwidth=\availablehsize] - -%D Boxed columns can be used nested: -%D -%D \starttyping -%D \setupmixedcolumns -%D [boxedcolumns] -%D [n=2, -%D background=color, -%D backgroundcolor=darkred, -%D color=white, -%D backgroundoffset=1mm] -%D -%D \definemixedcolumns -%D [nestedboxedcolumns] -%D [boxedcolumns] -%D [n=2, -%D background=color, -%D backgroundcolor=white, -%D color=darkred, -%D strut=yes, -%D backgroundoffset=0mm] -%D -%D \startboxedcolumns -%D \input zapf \par \input ward \par \obeydepth -%D \startnestedboxedcolumns -%D \input zapf -%D \stopnestedboxedcolumns -%D \par \input zapf \par \obeydepth -%D \startnestedboxedcolumns -%D \input zapf -%D \stopnestedboxedcolumns -%D \par \input zapf -%D \stopboxedcolumns -%D \stoptyping - -%D Next we define the hooks: - -\letvalue{\??mixedcolumnsbefore\s!box}\donothing -\letvalue{\??mixedcolumnsafter \s!box}\donothing - -\setvalue{\??mixedcolumnsstart\s!box}% - {\edef\p_page_mix_strut{\mixedcolumnsparameter\c!strut}% - \setbox\b_page_mix_collected\vbox \bgroup - \let\currentoutputroutine\s!mixedcolumn % makes \column work - \forgetall - \usegridparameter\mixedcolumnsparameter - % \useprofileparameter\mixedcolumnsparameter - \page_mix_command_set_hsize - \ifx\p_page_mix_strut\v!yes - \begstrut - \ignorespaces - \fi} - -\setvalue{\??mixedcolumnsstop\s!box}% - {\ifx\p_page_mix_strut\v!yes - \removeunwantedspaces - \endstrut - \fi - \egroup - \edef\p_profile{\mixedcolumnsparameter\c!profile}% - \ifempty\p_profile \else - % this can never be ok because we cheat with depth and height - % and glue in between and when we're too large we run into issues - % so mayb best limit correction to one line - \profilegivenbox\p_profile\b_page_mix_collected - \setbox\b_page_mix_collected\vpack{\unvbox\b_page_mix_collected}% - % tracing - % \addprofiletobox\b_page_mix_collected - \fi - \page_mix_box_balance} - -%D The related balancer is only a few lines: - -\protected\def\page_mix_box_balance - {\bgroup - \dontcomplain - \page_mix_routine_construct\v!yes - \page_mix_routine_package - \dontleavehmode\box\b_page_mix_collected - \clf_mixflushrest - \clf_mixcleanup - \egroup} - -%D As usual, floats complicates matters and this is where experimental code -%D starts. - -\let\page_mix_command_package_contents\page_one_command_package_contents -\let\page_mix_command_flush_float_box \page_one_command_flush_float_box - -\protected\def\page_mix_command_check_if_float_fits - {\ifpostponecolumnfloats - \global\setfalse\c_page_floats_room - \orelse\ifconditional\c_page_floats_not_permitted - \global\setfalse\c_page_floats_room - \else -% \bgroup -% \getcolumnstatus{\count255}{\dimen0}{\dimen2}% -% \page_floats_get_info\s!text -% \setbox\scratchbox\vbox % tricky met objecten ? -% {\blank[\rootfloatparameter\c!spacebefore] -% \snaptogrid\vbox{\vskip\floatheight}}% copy? -% \advance\dimen0\dimexpr\ht\scratchbox+2\openlineheight+.5\lineheight\relax\relax % needed because goal a bit higher -% \ifdim\dimen0>\dimen2 -% \global\setfalse\c_page_floats_room -% \else - \global\settrue\c_page_floats_room - \fi - \ifdim\floatwidth>\hsize - \showmessage\m!columns{11}\empty - \global\setfalse\c_page_floats_room - \fi} - -\protected\def\page_mix_command_flush_floats - {\page_one_command_flush_floats} - -\protected\def\page_mix_command_flush_saved_floats - {\page_one_command_flush_saved_floats} - -% \protected\def\page_mix_command_flush_top_insertions -% {\page_one_command_flush_top_insertions} - -\protected\def\page_mix_place_float_top - {\showmessage\m!columns4\empty\page_one_place_float_here} - -\protected\def\page_mix_place_float_bottom - {\showmessage\m!columns5\empty\page_one_place_float_here} - -\protected\def\page_mix_place_float_here - {\page_one_place_float_here} - -\protected\def\page_mix_place_float_force - {\page_one_place_float_force} - -\protected\def\page_mix_command_side_float_output - {\page_mix_construct_and_shipout\unvbox\normalpagebox\zerocount} % three arguments - -\protected\def\page_mix_command_synchronize_side_floats - {\page_sides_forget_floats} - -\protected\def\page_mix_command_flush_side_floats - {\page_sides_forget_floats} - -\protected\def\page_mix_command_next_page - {\page_otr_eject_page} - -\protected\def\page_mix_command_next_page_and_inserts - {\page_otr_eject_page_and_flush_inserts} - -%D Moved here and dedicated: - -\protected\def\page_mix_command_test_column - {\dodoubleempty\page_mix_command_test_column_indeed} - -\protected\def\page_mix_command_test_column_indeed[#1][#2]% works on last column - {\par - \begingroup - \scratchdimen\dimexpr#1\lineheight\ifsecondargument+#2\fi\relax - \ifdim\scratchdimen>\zeropoint - \c_attr_checkedbreak\number\scratchdimen % why \number - \penalty\c_page_mix_break_forced\relax - \fi - \endgroup} - -%D We need to hook some handlers into the output routine and we define -%D a dedicated one: - -\let\page_mix_command_flush_all_floats\page_one_command_flush_all_floats - -\defineoutputroutine - [\s!mixedcolumn] - [\s!page_otr_command_routine =\page_mix_command_routine, - \s!page_otr_command_package_contents =\page_mix_command_package_contents, - \s!page_otr_command_set_vsize =\page_mix_command_set_vsize, - \s!page_otr_command_set_hsize =\page_mix_command_set_hsize, - % \s!page_otr_command_synchronize_hsize =\page_mix_command_synchronize_hsize, - \s!page_otr_command_next_page =\page_mix_command_next_page, - \s!page_otr_command_next_page_and_inserts =\page_mix_command_next_page_and_inserts, - % \s!page_otr_command_set_top_insertions =\page_mix_command_set_top_insertions, - % \s!page_otr_command_set_bottom_insertions =\page_mix_command_set_bottom_insertions, - % \s!page_otr_command_flush_top_insertions =\page_mix_command_flush_top_insertions, - % \s!page_otr_command_flush_bottom_insertions=\page_mix_command_flush_bottom_insertions, - \s!page_otr_command_check_if_float_fits =\page_mix_command_check_if_float_fits, - % \s!page_otr_command_set_float_hsize =\page_mix_command_set_float_hsize, - \s!page_otr_command_flush_float_box =\page_mix_command_flush_float_box, - \s!page_otr_command_side_float_output =\page_mix_command_side_float_output, - \s!page_otr_command_synchronize_side_floats=\page_mix_command_synchronize_side_floats, - \s!page_otr_command_flush_floats =\page_mix_command_flush_floats, - \s!page_otr_command_flush_side_floats =\page_mix_command_flush_side_floats, - \s!page_otr_command_flush_saved_floats =\page_mix_command_flush_saved_floats, - \s!page_otr_command_flush_all_floats =\page_mix_command_flush_all_floats, - % \s!page_otr_command_flush_margin_blocks =\page_mix_command_flush_margin_blocks, % not used - \s!page_otr_command_test_column =\page_mix_command_test_column - ] - -%D Only a few float placement options are supported: - -\installfloatmethod \s!mixedcolumn \v!here \page_mix_place_float_here -\installfloatmethod \s!mixedcolumn \v!force \page_mix_place_float_force -\installfloatmethod \s!mixedcolumn \v!top \page_mix_place_float_top -\installfloatmethod \s!mixedcolumn \v!bottom \page_mix_place_float_bottom - -\installfloatmethod \s!mixedcolumn \v!local \somelocalfloat - -%D It ends here. - -\protect \endinput |