Фон

Фон

Фон

Когда текст достигает конца столбца, он запускает вставку пустой страницы. Этого не происходит, когда текст достигает конца страницы вне столбчатой ​​среды.

Проблема

В примере кода \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.

Связанный контент