아래 기사의 verbatim 배경색 칠하기는 박스를 이용하므로 페이지 끝에 박스가 걸렸을 때 잘라지지 않는다는 문제가 있거니와 이를 해결해주는 프리미티브가 \vsplit
이다. 예제를 보이고자 하는데 코드가 다소 복잡하므로 보고싶은 분만 보시면 된다. 다만 \vplit
명령으로 수직박스를 둘로 쪼갤 수 있고 따라서 박스를 두 쪽에 걸쳐 조판할 수 있다는 것만 알고 계시면 좋겠다. framed 패키지에서 바로 이 프리미티브가 사용되고 있다.
\usepackage{xcolor} \usepackage{etoolbox} \newbox\n \newbox\m % vsplit에서 사용할 박스 두 개의 주소를 선언한다 \preto\verbatim{\medbreak\setbox\n\vbox\bgroup\hsize.95\linewidth} \appto\endverbatim{\egroup\splitverbbox} \def\splitverbbox{% % 현재 페이지의 남은 수직 공간을 계산한다. \baselineskip은 실험값 \dimen0\dimexpr \ifdim\pagegoal=\maxdimen\vsize\else\pagegoal\fi -\pagetotal-\baselineskip \relax % 박스 높이가 남은 공간보다 크다면 \ifdim\dimen0<\ht\n % vsplit! 이게 핵심. 남은 길이만큼 쪼개서 \m에 할당. 나머지는 \n에 남는다 \setbox\m=\vsplit\n to\dimen0 % m이 빈 박스가 아니고 높이가 충분하다면(이것도 실험값) 배경색을 칠한다 \ifvoid\m\else \ifdim\ht\m>.5\baselineskip \noindent\colorbox{gray!30}{\box\m}\par \fi\fi % 페이지가 찼으므로 output으로 보내고 \n에 대해 재귀 \eject \expandafter\splitverbbox \else % \n을 위한 공간이 되므로 약간의 검사를 거쳐 배경색 칠한다 \ifvoid\n\else \ifdim\ht\n>.5\baselineskip \noindent\colorbox{gray!30}{\box\n}\medbreak \fi\fi \fi}
수직 모드에 대해서는 필자가 잘 알지 못하므로 위 코드는 분명 불안정하고 엉성할 테지만 다만 기본적인 작동원리를 보이고자 할 따름이다.
KTUG 한국 텍 사용자 그룹