Как добавлять рекурсивные строки в таблицу, пока они не достигнут конца страницы в ConTeXt?

Как добавлять рекурсивные строки в таблицу, пока они не достигнут конца страницы в ConTeXt?

У меня есть таблица в ConTeXt, вот такая:

\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

Как настроить рекурсию так, чтобы ячейка повторялась ровно столько раз, сколько нужно для заполнения оставшейся части страницы?

решение1

Один из возможных алгоритмов — это набор таблицы в цикле, добавляя строки до тех пор, пока она не превысит оставшуюся высоту, доступную на странице. Имейте в виду, что это довольно медленно.

\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

решение2

Это та же идея, что и в решении Анри Менке, но вместо того, чтобы добавлять строки одну за другой, я сначала измеряю высоту строки, а затем использую встроенную команду, \getrawnoflinesчтобы получить количество строк, которые поместятся в оставшемся пространстве.

\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

Связанный контент