Fundo

Fundo

Fundo

Quando o texto chega ao final de uma coluna, ele aciona a inserção de uma página em branco. Isso não acontece quando o texto chega ao final de uma página fora de um ambiente colunar.

Problema

No código de exemplo, \dorecurse{3}faz com que uma página em branco apareça, mas \dorecurse{2}não aparece. A única diferença é que quando definido como 3, o texto adicional é escrito na última linha da última coluna. Este cenário resulta em uma página em branco.

Exemplo mínimo de trabalho

Código mostrando o problema:

\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

Saída

Saída antes do texto chegar à última linha:

Texto antes da última linha

Saída após o texto atingir a última linha:

Texto na última linha

Pergunta

Alguma idéia de como a página em branco pode ser suprimida?

Ideias

As sugestões da lista de discussão não parecem suprimir a página:

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

Suprimir página de ejeção

Os columnsetcomandos têm alias de pagegridcomandos, portanto o seguinte deve ser equivalente. A saída no exemplo a seguir tem algumas sobreposições desagradáveis, mas mesmo assim mostra como eliminar as páginas em branco. Ao \unprotectexecutar a \page_grd_stopmacro, é possível redefinir a macro para suprimir a quebra de página.

No entanto, isso traz alguns efeitos colaterais, pois algumas páginas podem não ser gravadas no documento final (ou seja, as páginas não são exportadas).

\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

Versão

$ 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

Responder1

Solução Parcial

O código a seguir suprimirá quebras de página quando o texto em um ambiente de múltiplas colunas atingir o final da última coluna:

\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

No entanto, a solução tem um custo. Primeiro, isso suprimirá o fluxo de páginas de texto quenãoestender até a última linha da última coluna do texto com várias colunas. Em segundo lugar, surge o seguinte cenário:

\setuplayout[grid=yes]

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

Problemas

Os columnsetcomandos têm alias de pagegridcomandos, portanto o seguinte deve ser equivalente. A saída no exemplo a seguir tem algumas sobreposições desagradáveis, mas mesmo assim mostra como eliminar as páginas em branco. Ao \unprotectexecutar a \page_grd_stopmacro, é possível redefinir a macro para suprimir a quebra de página.

\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

detalhes adicionais

Corrigir esse problema para que multicolunas (ou seja, grades de páginas) se comportem como páginas normais e outros ambientes colunares provavelmente exigirá a correção do próprio ConTeXt.

informação relacionada