
Ich habe eine Tabelle in ConTeXt wie diese:
\starttext
\chapter{This is a title}
\bTABLE
\bTABLEhead
\bTR \bTD a \eTD \bTD b \eTD \bTD c \eTD \eTR
\eTABLEhead
\bTABLEbody
\dorecurse{100}{%
\bTR \bTD 1 \eTD \bTD 2 \eTD \bTD 3 \eTD \eTR
}
\eTABLEbody
\eTABLE
\stoptext
Wie kann ich die Rekursion so einstellen, dass die Zelle nur so oft wiederholt wird, wie für die Füllung des restlichen Teils der Seite nötig ist?
Antwort1
Ein möglicher Algorithmus wäre, die Tabelle in einer Schleife zu setzen und so lange Zeilen hinzuzufügen, bis die verbleibende Höhe der Seite überschritten wird. Beachten Sie, dass dies ziemlich langsam ist.
\startbuffer[table]
\bTABLE
\bTABLEhead
\bTR \bTD a \eTD \bTD b \eTD \bTD c \eTD \eTR
\eTABLEhead
\bTABLEbody
\dorecurse{\the\scratchcounter}{%
\bTR \bTD 1 \eTD \bTD 2 \eTD \bTD 3 \eTD \eTR
}
\eTABLEbody
\eTABLE
\stopbuffer
\showframe
\starttext
\chapter{This is a title}
\scratchcounter=1
\scratchdimen=0pt
\loop\ifdim\scratchdimen<\dimexpr\pagegoal-\pagetotal-2\lineheight\relax % why 2\lineheight?
\setbox\scratchbox=\vbox{\getbuffer[table]}
\scratchdimen=\dimexpr\ht\scratchbox+\dp\scratchbox\relax
\advance\scratchcounter by 1
\repeat
\advance\scratchcounter by -1
\vbox{\getbuffer[table]}
\stoptext
Antwort2
Dies ist die gleiche Idee wie die Lösung von Henri Menke, aber anstatt die Zeilen einzeln hinzuzufügen, messe ich zuerst die Höhe der Reihe und verwende dann den integrierten Befehl, \getrawnoflines
um die Anzahl der Zeilen zu ermitteln, die in den verbleibenden Platz passen.
\define\calculatelines
{\setbox\scratchbox\hbox{\bTABLE
\bTR \bTD 1 \eTD \bTD 2 \eTD \bTD 3 \eTD \eTR
\eTABLE}%
\openlineheight=\htdp\scratchbox
\ifdim\pagegoal=\maxdimen % we are at the beginning of the page
\scratchdimen=\dimexpr\textheight - 2\openlineheight\relax
\else
\scratchdimen=\dimexpr\pagegoal - \pagetotal - 2\openlineheight \relax
\fi
\getrawnoflines\scratchdimen}
\define\fillTABLE
{\blank
\bgroup
\calculatelines
\bTABLE
\bTABLEhead
\bTR \bTD a \eTD \bTD b \eTD \bTD c \eTD \eTR
\eTABLEhead
\bTABLEbody
\dorecurse{\the\noflines}
{\bTR \bTD 1 \eTD \bTD 2 \eTD \bTD 3 \eTD \eTR}
\eTABLEbody
\eTABLE
\egroup}
\setuppapersize[A5]
\showframe
\starttext
\fillTABLE
\page
\section{New section}
\fillTABLE
\page
\section{With some text}
\input knuth
\fillTABLE
\stoptext