背景

背景

背景

当文本到达列尾时,会触发插入空白页。当文本到达列环境之外的页面末尾时,不会发生这种情况。

问题

在示例代码中,\dorecurse{3}会导致出现空白页,但\dorecurse{2}实际上不会出现。唯一的区别是,当设置为 时3,会在最后一列的最后一行写入附加文本。这种情况会导致出现空白页。

最小工作示例

显示问题的代码:

\showgrid
\setuplayout[grid=yes]

\starttext
  \startcolumnset[n=2]
    \input knuth \input lorem \input lorem \input knuth
    \dorecurse{3}{No TV and no beer make Homer something something.}
  \stopcolumnset
\stoptext

输出

文本到达最后一行之前的输出:

末行之前的文本

文本到达最后一行后的输出:

最后一行的文本

问题

有什么想法可以抑制空白页吗?

想法

邮件列表中的建议似乎并未抑制该页面:

\setuppagenumbering[page=no]
\installpagebreakhandler{last}{}

禁止弹出页面

这些columnset命令是pagegrid命令的别名,因此以下内容应该是等效的。以下示例中的输出有一些令人不快的重叠,但它仍然显示了如何消除空白页。通过\unprotect运行\page_grd_stop宏,可以重新定义宏以抑制分页。

然而,这会带来一些副作用,因为有些页面可能不会写入最终文档(即,页面不会被导出)。

\showgrid
\setuppagenumbering[alternative=doublesided,page=no]
\setuplayout[grid=yes]

\definepagegrid[example][n=3,distance=.05\makeupwidth,page=no]

\setuppagegrid[example:1][width=.4\makeupwidth]
\setuppagegrid[example:2][width=.2\makeupwidth]
\setuppagegrid[example:3][width=.2\makeupwidth]

\setuppagegrid[example:4][width=.40\makeupwidth]
\setuppagegrid[example:5][width=.2\makeupwidth]
\setuppagegrid[example:6][width=.2\makeupwidth]

\unprotect
\def\page_grd_stop{%
  \endgraf % needed, else wrong vsize in one par case
  \vfill % otherwise weird \placenotes[endnotes]
  \page_grd_command_set_vsize % needed
  \penalty\c_page_otr_eject_penalty
  %\page_grd_command_flush_page
  \page_otr_fill_and_eject_page
  \page_grd_command_set_vsize % why here
  \egroup
  \page_otr_command_set_vsize
  \page_otr_command_set_hsize
}
\protect

\starttext
  \startpagegrid[example]
    \input knuth \input lorem \input lorem \input knuth \input lorem
    \dorecurse{3}{No TV and no beer make Homer something something.}
  \stoppagegrid
\stoptext

版本

$ context --version
mtx-context     | ConTeXt Process Management 1.03
mtx-context     |
mtx-context     | main context file: /opt/context/tex/texmf-context/tex/context/base/mkiv/context.mkiv
mtx-context     | current version: 2019.12.06 19:45
mtx-context     | main context file: /opt/context/tex/texmf-context/tex/context/base/mkiv/context.mkxl
mtx-context     | current version: 2019.12.06 19:45

答案1

部分解决方案

当多列环境中的文本到达最后一列的末尾时,以下代码将抑制分页符:

\unprotect
\def\page_grd_stop{%
   \endgraf % needed, else wrong vsize in one par case
   \vfill % otherwise weird \placenotes[endnotes]
   \page_grd_command_set_vsize % needed
   \penalty\c_page_otr_eject_penalty
   %\page_grd_command_flush_page
   \page_otr_fill_and_eject_page
   \page_grd_command_set_vsize % why here
   \egroup
   \page_otr_command_set_vsize
   \page_otr_command_set_hsize}
\protect

然而,这个解决方案是有代价的。首先,这将抑制刷新页面的文本,不要扩展到多列文本的最后一列的最后一行。其次,以下场景中断:

\setuplayout[grid=yes]

\starttext
   \startcolumnset[n=2]
     \dorecurse{100}{Line #1\par}
   \stopcolumnset
\stoptext

问题

这些columnset命令是pagegrid命令的别名,因此以下内容应该是等效的。以下示例中的输出有一些令人不快的重叠,但它仍然显示了如何消除空白页。通过\unprotect运行\page_grd_stop宏,可以重新定义宏以抑制分页。

\showgrid
\setuppagenumbering[alternative=doublesided,page=no]
\setuplayout[grid=yes]

\definepagegrid[example][n=3,distance=.05\makeupwidth,page=no]

\setuppagegrid[example:1][width=.4\makeupwidth]
\setuppagegrid[example:2][width=.2\makeupwidth]
\setuppagegrid[example:3][width=.2\makeupwidth]

\setuppagegrid[example:4][width=.4\makeupwidth]
\setuppagegrid[example:5][width=.2\makeupwidth]
\setuppagegrid[example:6][width=.2\makeupwidth]

\unprotect
\def\page_grd_stop{%
  \endgraf % needed, else wrong vsize in one par case
  \vfill % otherwise weird \placenotes[endnotes]
  \page_grd_command_set_vsize % needed
  \penalty\c_page_otr_eject_penalty
  %\page_grd_command_flush_page
  \page_otr_fill_and_eject_page
  \page_grd_command_set_vsize % why here
  \egroup
  \page_otr_command_set_vsize
  \page_otr_command_set_hsize
}
\protect

\starttext
  \startpagegrid[example]
    \input knuth \input lorem \input lorem \input knuth \input lorem
    \dorecurse{3}{No TV and no beer make Homer something something.}
  \stoppagegrid
\stoptext

额外细节

修复此问题,使得多列(即页面网格)​​的行为像常规页面和其他列环境一样,可能需要修补 ConTeXt 本身。

相关内容