
Фон
Когда текст достигает конца столбца, он запускает вставку пустой страницы. Этого не происходит, когда текст достигает конца страницы вне столбчатой среды.
Проблема
В примере кода \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.