Joey McCollum schrieb am 16.05.2020 um 05:45:
All right, I've found a tentative solution that appears to work in all cases, but I'd like to know more about why the code I'm patching was implemented in the first place, because I don't want to break anything else. According to the code in page-pcl.mkiv, the \stoppagecolumns macro has two implementations, \page_col_stop_yes and \page_col_stop_nop. The choice of which implementation is used is determined by which of two implementations of \startpagecolumns (\page_col_start_yes and \page_col_start_nop) is used. That choice, in turn, is made in the \page_col_start macro, in the following lines:
``` \c_page_col_n_of_columns\pagecolumnsparameter\c!n\relax \ifnum\c_page_col_n_of_columns>\plusone \expandafter\page_col_start_yes \else \expandafter\page_col_start_nop \fi ```
so if the number of columns (i.e., the n option for the pagecolumns environment) is more than one, the "yes" implementation of the start and stop commands is used.
But this seems wrong. The naming convention for the two implementations ("yes" and "nop") suggests that they should be related the parameters "page=yes" and "page=no" (hence, no page, which is what I think "nop" abbreviates), but the choice of which implementation to use is determined not by the page parameter, but by the n parameter. Is this an error in the code, or am I just understanding this incorrectly? Is there some reason why a layout with more than one column would need special instructions to add a blank page after stopping the environment?
Why do you think "yes" and "nop" are related to the page-key?
In any event, I was able to solve the problem by patching the \page_col_start_yes macro to invoke the \page_col_start_nop macro as follows:
```
\unprotect
\def\page_col_stop_yes {\page_col_stop_nop}
\protect
```
With this fix, the MWE I provided works regardless of which column the text ends in. I'm content to consider the problem solved, but I would certainly appreciate any feedback on my thoughts and questions about page-pcl.mkiv.
You broke now now normal single columns text after the pagecolumns environment. A better fix is to add a check for the \column command at the end of the environment and add it only when we aren't in the last column. \unexpanded\def\page_col_stop_yes {%\column % \page_otr_eject_page \ifnum\c_page_col_current<\c_page_col_n_of_columns \column \fi \page \endgroup % \setupoutputroutine[\s!singlecolumn]% \page_otr_command_set_vsize \page_otr_command_set_hsize \page \endgroup} Wolfgang