
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
이는 Henri Menke의 솔루션과 같은 아이디어이지만 선을 하나씩 추가하는 대신 먼저 행의 높이를 측정한 다음 내장된 명령을 사용하여 \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