tabular의 첫 번째 인수, 즉 {lcr} 같은 열 지정 은 단순히 정렬 방식을 나열하는 곳이 아닙니다. 이것은 작은 언어입니다. 열의 개수와 정렬뿐 아니라, LaTeX가 각 셀의 앞뒤에 선언을 끼워 넣도록 하거나, 열 사이의 공간을 바꾸거나, 열 묶음을 반복하도록 지정할 수 있습니다. 이 중 많은 기능은 기본 tabular에는 없고 array 패키지 가 더합니다. 이 페이지에서는 기본 l, c, r, p{width}에서 출발해 m{width}와 b{width}, >{…}와 <{…}, @{…}와 !{…}, *{n}{…}를 차례로 설명합니다.
열 지정이라는 작은 언어
기본 네 가지는 다른 페이지에서 다뤘습니다. l, c, r 은 왼쪽, 가운데, 오른쪽으로 정렬하고 열을 내용의 자연 너비 로 맞추며 줄바꿈하지 않습니다. p{width} 만 지정 폭의 단락 상자로 조판되고, 내용이 폭을 넘으면 줄바꿈 됩니다. array 패키지의 내부 표현으로는 p{width}가 \parbox[t]{width}와 같으므로, 위쪽 정렬 단락입니다. 이 “위쪽” 기본값이 이제 추가할 두 친척과의 대비점입니다.
이제부터 소개하는 기호들, 즉 m/b, >/<, @/!, *의 대부분은 프리앰블에 \usepackage{array} 를 써야 사용할 수 있습니다. array는 TeX Live와 MiKTeX에 표준으로 들어 있으며 tabularx, booktabs 등 많은 표 패키지가 내부에서 불러오므로 이미 활성화된 경우도 많습니다. 그래도 명시적으로 불러 두는 편이 안전합니다.
단락 열의 세로 위치 — p, m, b
줄바꿈하는 단락 열은 세 종류이며, 차이는 셀의 세로 위치, 즉 그 상자가 행 안에서 어떻게 세로로 맞춰지는가뿐입니다. array 매뉴얼의 정의대로 나열하면 p{width} 는 \parbox[t]로 위쪽 정렬, m{width} 는 내용을 행의 세로 가운데 에 놓는 정렬, b{width} 는 \parbox[b]로 아래쪽 정렬 입니다. m과 b는 array 패키지가 추가하는 것으로, 기본 tabular에는 없습니다.
이 차이는 같은 행에 키가 큰 셀(여러 줄로 접히는 p 열이나 큰 이미지)과 한 줄짜리 셀이 섞일 때 드러납니다. 기본 p(위쪽)에서는 이웃한 짧은 셀이 행의 위쪽에 붙어 키 큰 셀의 중간과 시선이 맞지 않습니다. m{width}를 쓰면 그 열의 내용이 행의 위아래 가운데에 오므로 옆의 한 줄 셀과 자연스럽게 맞습니다. 이미지를 넣은 셀이나, 레이블과 긴 설명을 좌우로 나란히 두는 표에서 유용합니다.
\usepackage{array}
% ...
\begin{tabular}{ p{3cm} m{3cm} b{3cm} }
\hline
上端揃え (p) & 縦中央 (m) & 下端揃え (b) \\
この列は parbox[t]。 & この列は行の上下中央に。 & この列は parbox[b]。 \\
\hline
\end{tabular}폭과 본문이 같아도 p, m, b에 따라 각 셀의 위아래 위치가 달라집니다. 또한 세 종류 모두 단락 열 내부에서는 \parindent(단락 들여쓰기)가 기본적으로 0 이 됩니다. 필요하다면 >{\setlength{\parindent}{1em}}처럼 다시 더할 수 있습니다.
| 지정자 | 세로 위치 | 동등한 parbox | 제공 |
|---|---|---|---|
p{wd} | 위쪽 | \parbox[t]{wd} | 표준 |
m{wd} | 가운데 | 행에서 세로 가운데 | array |
b{wd} | 아래쪽 | \parbox[b]{wd} | array |
셀 앞뒤에 끼워 넣기 — >{…}와 <{…}
array 패키지의 핵심은 >{decl} 와 <{decl} 입니다. >{decl}는 그 열의 각 셀 내용 바로 앞에 decl을 삽입하고, <{decl}는 반대로 바로 뒤에 삽입합니다. 예를 들어 >{\bfseries}l이라고 쓰면 왼쪽 정렬 열의 모든 셀이 매번 \bfseries를 쓰지 않아도 굵게 됩니다. >{\itshape}c는 가운데 정렬 기울임, >{\color{red}}r은 오른쪽 정렬 빨간색이 되는 식입니다.
>{…}에는 정렬 선언 도 쓸 수 있습니다. 단락 열(p, m, b)은 기본적으로 양쪽 정렬이지만, >{\raggedright}p{4cm}라고 하면 왼쪽 정렬(오른쪽은 들쭉날쭉) 열이 되고, >{\centering}은 가운데, >{\raggedleft}는 오른쪽 정렬 단락 열이 됩니다. 이렇게 “줄바꿈은 하되 양쪽 정렬은 싫다”는 세부 요구에 대응할 수 있습니다.
하지만 중대한 함정 이 있습니다. \raggedright, \raggedleft, \centering 세 명령은 내부에서 행 끝 표시 \\의 의미를 다시 정의 합니다. 이들을 >{…}에 넣은 열이 표의 마지막 열 이면 \\가 “행 끝”으로 동작하지 않아 오류나 깨진 출력이 생깁니다. 해결책은 array가 제공하는 \arraybackslash 를 선언의 끝 에 붙이는 것입니다. >{\raggedright\arraybackslash}p{4cm}라고 쓰면 \\의 행 끝 기능이 복구됩니다. \centering과 \raggedleft도 마찬가지입니다.
또 하나의 표준 기법은 열 전체를 수식 모드로 만드는 것입니다. >{$}c<{$}라고 쓰면 각 셀 앞뒤에 $가 들어가 그 열의 모든 셀이 인라인 수식 으로 조판됩니다. 숫자나 기호가 많은 열에서 매번 $…$를 쓰지 않아도 됩니다. 반대로 셀이 원래 수식 모드인 array 환경에서 >{$}…<{$}를 쓰면 두 $가 상쇄되어 그 열만 텍스트 모드 가 됩니다.
주의할 점은 >{…}와 <{…} 안에는 선언(declaration) 이 들어가야 한다는 것입니다. >{\bfseries}나 >{\itshape}처럼 뒤에 인수를 받지 않는 형태는 괜찮지만, 인수를 받는 명령으로 끝내면 안 됩니다. 예를 들어 >{\textbf}는 이어지는 셀 내용을 자신의 인수로 읽으려다가 망가집니다. 굵게 하려면 선언형 \bfseries를 사용합니다. array 매뉴얼도 >{\textbf}는 “열 전체를 굵게 하지도, 첫 글자를 굵게 하지도 않는다”고 경고합니다.
열 경계 다루기 — @{…}와 !{…}
열과 열 사이에는 기본적으로 \tabcolsep 만큼의 공간이 들어갑니다. 기본값은 한쪽 6pt이므로 양쪽 합계는 그 두 배입니다. 열 지정의 해당 위치에 @{decl} 를 놓으면 그곳의 열 사이 공간을 제거하고 대신 decl을 삽입합니다. array 매뉴얼의 표현으로는 “inter-column space를 억제하고 대신 decl.을 삽입”하는 것입니다.
주된 용도는 두 가지입니다. 첫째는 표 바깥 여백을 잘라내는 것 입니다. 열 지정 양끝에 @{}(빈 선언)을 두면 첫 열 왼쪽과 마지막 열 오른쪽의 \tabcolsep가 사라져 표가 본문 왼쪽 여백에 딱 맞습니다. booktabs 표에서 자주 보이는 관용구입니다. 둘째는 구분 문자를 삽입하는 것 입니다. 예를 들어 숫자를 소수점 기준으로 맞추고 싶다면 정수부 열과 소수부 열로 나눈 뒤 사이에 @{.}를 두면 마침표가 고정 위치에 나란히 서서 소수점 정렬 을 얻습니다.
@{…}와 짝을 이루는 것이 !{decl} 입니다. 이것은 세로줄 |가 올 위치에 쓸 수 있고, | 대신 임의의 decl을 삽입합니다. @{…}와의 결정적 차이는 !{…}는 일반적인 열 사이 공간을 없애지 않는다 는 점입니다. 따라서 “열 사이에 점선을 그리고 싶지만 열 간 여백은 유지하고 싶다”는 경우, 예를 들어 arydshln 패키지의 점선 명령을 !{…}에 넣는 경우에 알맞습니다.
덧붙이면, array 패키지를 불러오면 세로줄 |의 처리도 조금 달라져 선의 두께만큼 열 사이가 넓어집니다. 표준 LaTeX에서는 선이 기존 공간 안에 놓여 열 사이가 넓어지지 않습니다. 그렇다 해도 세로줄 자체는 전문적인 표에서 피하는 것이 정석이며, 이 이야기는 “줄과 출판 품질의 표” 페이지에서 다룹니다.
열 반복하기 — *{n}{…}
같은 지정의 열이 여러 개 이어질 때는 *{count}{spec} 로 반복을 접을 수 있습니다. array 매뉴얼의 정의대로 “spec을 count번 복사한 것”과 같습니다. 가운데 정렬 열이 여섯 개라면 cccccc 대신 *{6}{c} 라고 쓸 수 있습니다. 반복 단위는 여러 지정이어도 되어 *{3}{|c}|는 |c|c|c|로 펼쳐집니다. >{…}나 @{…}가 들어간 긴 지정을 반복할 때 특히 효과적입니다. 예를 들어 *{4}{>{$}c<{$}}는 수식 모드의 가운데 열 네 개를 한꺼번에 만듭니다.
여러 기능을 조합한 예
마지막으로 지금까지의 도구를 하나의 열 지정에 담은 예를 보겠습니다. 1열은 굵은 레이블 열(>{\bfseries}l), 2열은 왼쪽 정렬로 줄바꿈하는 단락 열(>{\raggedright\arraybackslash}p{5cm} — 마지막 열이 아니므로 필수는 아니지만 습관적으로 \arraybackslash를 붙였습니다), 3, 4열은 *{2}{…}로 함께 만든 수식 모드의 가운데 열이며, 바깥 여백은 양끝의 @{}로 잘라냈습니다.
\usepackage{array}
% ...
\begin{tabular}{@{} >{\bfseries}l >{\raggedright\arraybackslash}p{5cm} *{2}{c} @{}}
\hline
記号 & 意味 & 値 & 単位 \\
\hline
$c$ & 真空中の光速。物理定数のひとつ。 & $2.998\times10^{8}$ & m/s \\
$g$ & 標準重力加速度。地表付近での近似値。 & $9.807$ & m/s$^2$ \\
\hline
\end{tabular}결과적으로 기호 열은 모두 굵게 맞춰지고, 의미 열은 5cm 폭에서 왼쪽 정렬로 줄바꿈하며, 값 두 열은 가운데에 놓이고, 표 전체는 바깥 여백 없이 본문 왼쪽 끝에 맞습니다. 한 줄에 여러 장치를 쓸 수 있다는 것이 열 지정 언어의 강점입니다. 다만 읽기 어려워지기 쉬우므로 자주 쓰는 조합은 \newcolumntype{yourletter}{…}로 사용자 정의 열 지정 에 이름을 붙여 두면 {C C C}처럼 간결하게 재사용할 수 있습니다(array 패키지 기능).
참고로 숫자를 소수점 기준으로 맞추는 용도에는 여기서 언급한 @{.}보다 siunitx 패키지의 S 열 을 쓰는 것이 현대적이고 확실합니다. S 열은 각 숫자를 해석하여 정수부, 소수점, 소수부, 지수, 불확실성까지 올바르게 맞추고, 자릿수 구분과 유효 숫자 서식도 정리합니다. “넓은 표와 자동 너비” 페이지와 함께 참고하세요.