背景

背景

背景

當文字到達列末尾時,它會觸發插入空白頁。當文字到達柱狀環境之外的頁面末尾時,不會發生這種情況。

問題

在範例程式碼中,\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 本身。

相關內容