
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 3
zusä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:
Ausgabe, nachdem der Text die letzte Zeile erreicht hat:
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 columnset
Befehle sind Aliase zu pagegrid
Befehlen, 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 \unprotect
die Verwendung des \page_grd_stop
Makros 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 columnset
Befehle sind Aliase zu pagegrid
Befehlen, 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 \unprotect
die Verwendung des \page_grd_stop
Makros 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.