Wie fügt man einer Tabelle rekursiv Zeilen hinzu, bis sie das Seitenende in ConTeXt erreichen?

Wie fügt man einer Tabelle rekursiv Zeilen hinzu, bis sie das Seitenende in ConTeXt erreichen?

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, \getrawnoflinesum 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

verwandte Informationen