Hintergrund

Hintergrund

Hintergrund

Wenn der Text das Ende einer Spalte erreicht, wird das Einfügen einer leeren Seite ausgelöst. Dies geschieht nicht, wenn der Text das Ende einer Seite außerhalb einer spaltenorientierten Umgebung erreicht.

Problem

Im Beispielcode \dorecurse{3}bewirkt , dass eine leere Seite angezeigt wird, d. h. \dorecurse{2}es wird jedoch nicht angezeigt. Der einzige Unterschied besteht darin, dass bei der Einstellung auf 3zusätzlicher Text in die letzte Zeile der letzten Spalte geschrieben wird. Dieses Szenario führt zu einer leeren Seite.

Minimales Arbeitsbeispiel

Code, der das Problem zeigt:

\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

Ausgabe

Ausgabe, bevor der Text die letzte Zeile erreicht:

Text vor der letzten Zeile

Ausgabe, nachdem der Text die letzte Zeile erreicht hat:

Text in der letzten Zeile

Frage

Irgendwelche Ideen, wie die leere Seite unterdrückt werden kann?

Ideen

Vorschläge aus der Mailingliste scheinen die Seite nicht zu unterdrücken:

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

Auswurfseite unterdrücken

Die columnsetBefehle sind Aliase zu pagegridBefehlen, daher sollte das Folgende äquivalent sein. Die Ausgabe im folgenden Beispiel weist einige unangenehme Überlappungen auf, zeigt aber dennoch, wie man die leeren Seiten eliminiert. Durch \unprotectdie Verwendung des \page_grd_stopMakros ist es möglich, das Makro neu zu definieren, um Seitenumbrüche zu unterdrücken.

Dies bringt jedoch einige Nebenwirkungen mit sich, da einige Seiten möglicherweise nicht in das endgültige Dokument geschrieben werden (d. h. die Seiten werden nicht exportiert).

\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

Ausführung

$ 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

Antwort1

Teillösung

Der folgende Code unterdrückt Seitenumbrüche, wenn Text in einer mehrspaltigen Umgebung das Ende der letzten Spalte erreicht:

\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

Allerdings hat diese Lösung ihren Preis. Erstens wird dadurch das Löschen von Textseiten unterbunden, dienichtbis zur letzten Zeile der letzten Spalte eines mehrspaltigen Textes. Zweitens bricht das folgende Szenario zusammen:

\setuplayout[grid=yes]

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

Probleme

Die columnsetBefehle sind Aliase zu pagegridBefehlen, daher sollte das Folgende äquivalent sein. Die Ausgabe im folgenden Beispiel weist einige unangenehme Überlappungen auf, zeigt aber dennoch, wie man die leeren Seiten eliminiert. Durch \unprotectdie Verwendung des \page_grd_stopMakros ist es möglich, das Makro neu zu definieren, um Seitenumbrüche zu unterdrücken.

\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

Weitere Details

Um dieses Problem zu beheben, sodass sich Mehrspalten (also Seitenraster) wie normale Seiten und andere spaltenbasierte Umgebungen verhalten, ist wahrscheinlich ein Patchen von ConTeXt selbst erforderlich.

verwandte Informationen