KTUG 한국 텍 사용자 그룹

Menu

KTUG :: 마당정보글 › \vsplit : 수직 박스 쪼개기

DohyunKim | 2011.07.06 11:40:01 | 메뉴 건너뛰기 쓰기

아래 기사의 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}

수직 모드에 대해서는 필자가 잘 알지 못하므로 위 코드는 분명 불안정하고 엉성할 테지만 다만 기본적인 작동원리를 보이고자 할 따름이다.

댓글 [6]

댓글 쓰기

목록

KTUG 한국 텍 사용자 그룹