背景

背景

背景

テキストが列の末尾に達すると、空白ページの挿入がトリガーされます。テキストが列の環境外でページの末尾に達した場合は、この処理は行われません。

問題

サンプル コードでは、 では\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 自体にパッチを適用する必要がある可能性があります。

関連情報