표 안에서 여러 칸을 하나로 합치는, 이른바 셀 병합 은 방향과 도구가 명확히 나뉩니다. 가로 방향으로 여러 열을 가로지르는 것은 표준 명령 \multicolumn, 세로 방향으로 여러 행을 가로지르는 것은 multirow 패키지의 \multirow, 그리고 둘을 조합하면 직사각형 블록을 병합할 수 있습니다. 한 칸 안에서 줄만 나누고 싶다면 병합이 아니라 makecell 의 역할입니다. 이 페이지에서는 이 네 도구를 차례로, 정렬의 함정까지 함께 살펴봅니다.
가로 방향 병합 — \multicolumn
\multicolumn 은 같은 행 안에서 이웃한 열을 합칩니다. 표준 LaTeX에 내장되어 있어 패키지가 필요 없습니다. 형식은 세 인수 \multicolumn{n}{spec}{text} 입니다. n 은 가로지를 열의 수, spec 은 만들어진 하나의 셀을 어떻게 정렬할지(한 열짜리 열 지정), text 는 그 내용입니다. 예를 들어 \multicolumn{2}{c}{Header}는 두 열을 한 칸으로 병합하고 가운데 정렬합니다.
핵심은 spec가 “병합 후의 한 열”에 대한 지정이며, 원래 n개 열의 지정을 그대로 이어받지 않는다 는 점입니다. 그래서 l, c, r 중 하나를 반드시 씁니다. 또한 spec에는 세로줄 | 이나 @{…} 도 쓸 수 있어, 그 위치의 선과 열간 공간을 이 병합 셀에 대해서만 덮어쓸 수 있습니다. 이웃한 \multicolumn 중 한쪽이 끝에 |를, 다른 쪽이 시작에 |를 갖고 있으면 선은 중복되지 않고 하나만 그려집니다.
\begin{tabular}{lcc}
\hline
\multicolumn{3}{c}{売上集計} \\
\hline
項目 & 上期 & 下期 \\
\hline
国内 & 120 & 145 \\
海外 & 80 & 96 \\
\hline
\end{tabular}이 예의 첫 행은 원래 3열로 나뉘어야 할 행을 \multicolumn{3}{c}{Sales summary}로 하나의 가운데 정렬 셀 로 합쳐 표 전체의 제목으로 삼습니다. 병합된 행에서도 그 행의 셀 합계는 반드시 선언한 열 수(여기서는 3)와 일치 해야 합니다. \multicolumn{3}{…}가 세 열을 모두 맡으므로 이 행에는 &가 필요 없습니다.
또 하나 기억할 것은 n을 1로 두는 사용법 입니다. \multicolumn{1}{…}{…}는 열을 가로지르지 않지만 그 셀만 정렬을 덮어쓰거나, 그 위치의 세로줄 |를 없애는 데 사용할 수 있습니다. 예를 들어 숫자 열(r)의 머리글만 가운데에 두고 싶다면 \multicolumn{1}{c}{Header}라고 쓰고, 외곽선 있는 표에서 한 칸만 세로줄을 빼고 싶다면 | 없는 \multicolumn{1}{c}{…}를 씁니다.
세로 방향 병합 — multirow
세로로 여러 행을 가로지르는 셀은 표준 명령만으로 만들 수 없으므로 multirow 패키지 를 불러옵니다(프리앰블에 \usepackage{multirow}). 핵심은 \multirow{n}{width}{text} 입니다. n 은 가로지를 행 수, width 는 셀의 폭, text 는 내용입니다. 폭에 * 를 넘기면 내용의 자연 너비 로 조판됩니다. \multirow{3}{*}{Label}이 가장 단순한 형태입니다.
결정적으로 중요한 규칙은 \multirow가 가로지르는 아래 행의 셀을 비워 두는 것 입니다. \multirow는 위쪽 행에 놓고, 이어지는 행에서는 같은 열 위치에 내용 없이 &만 씁니다. 비워 두지 않으면 아래 행의 내용이 \multirow가 조판한 글자 위에 겹쳐 집니다. n이 양수이면 “이 행과 아래 n−1행”을, 음수이면 “이 행과 위 −n−1행”을 가로지릅니다(공식 문서의 설명).
\usepackage{multirow}
% ...
\begin{tabular}{|l|l|c|}
\hline
\multirow{2}{*}{果物} & りんご & 380 \\
& みかん & 120 \\
\hline
\multirow{2}{*}{野菜} & 人参 & 90 \\
& 大根 & 150 \\
\hline
\end{tabular}여기서는 1열의 “Fruit”와 “Vegetable”이 각각 2행을 세로로 가로지릅니다. 핵심은 \multirow{2}{*}{Fruit}를 위쪽 행에 쓰고, 그 아래 행의 1열은 아무것도 쓰지 않고 &로 넘긴다는 점입니다. width가 *이므로 레이블은 자연 너비로 조판되고 두 행의 세로 가운데에 놓입니다.
\multirow에는 선택 인수도 두 개 있습니다. 앞쪽의 [vpos] 는 세로 정렬을 정합니다(기본은 가운데 c, 위쪽 t, 아래쪽 b). text 뒤의 [vmove] 는 미세 조정용 길이 로, 본래 위치에서 위로, 음수이면 아래로 이동시킵니다. 선과 셀 경계에 대해 글자의 가운데가 조금 어긋나 보일 때 \multirow{3}{*}[2pt]{…}처럼 작은 값을 주어 다듬습니다. width를 절대값(예: \multirow{2}{4em}{…})으로 주면 내용은 그 폭의 parbox 로 조판되어 긴 레이블은 줄바꿈됩니다.
| 인수 | 역할 | 비고 |
|---|---|---|
[vpos] | 세로 정렬(선택, 앞쪽) | 기본 c, t / b도 가능 |
n | 가로지를 행 수(필수) | 양수는 아래쪽, 음수는 위쪽 |
width | 셀 폭(필수) | *는 자연 너비, 절대값은 parbox로 줄바꿈 |
[vmove] | 위치 미세 조정(선택, text 뒤) | 양수는 위로, 음수는 아래로 |
블록 병합 — \multicolumn 안의 \multirow
가로와 세로를 모두 가로지르는 직사각형 블록 을 만들려면 \multirow와 \multicolumn을 조합 합니다. 순서가 정해져 있으며, \multirow를 \multicolumn 안에 넣는 것 이 맞습니다. 공식 문서도 \multicolumn{2}{c}{\multirow{3}{*}{Multi-multi}}를 예로 들고, 반대로 중첩하면 “will not work”라고 명시합니다. 바깥쪽 \multicolumn이 가로 방향 열 수를, 안쪽 \multirow가 세로 방향 행 수를 맡는다고 기억하면 됩니다.
블록 주위에 선을 그을 때는 행 전체 폭의 \hline이 아니라 특정 열 범위에만 그어지는 선 을 쓰면 병합 부분을 가르지 않습니다. 표준 도구는 \cline{i-j}(i열부터 j열까지)이고, booktabs를 쓴다면 \cmidrule{i-j} 입니다. 병합 셀 아래에 해당하는 범위를 선에서 제외하면 블록의 외곽만 깔끔하게 둘러쌀 수 있습니다.
\usepackage{multirow}
% ...
\begin{tabular}{|l|l|c|}
\hline
\multicolumn{2}{|c|}{\multirow{2}{*}{地域・分類}} & 件数 \\
\multicolumn{2}{|c|}{} & \\
\hline
東日本 & 関東 & 12 \\
\cline{1-3}
西日本 & 関西 & 9 \\
\hline
\end{tabular}여기서는 왼쪽 위에 2열 × 2행 직사각형 블록을 만듭니다. 1행의 \multicolumn{2}{|c|}{\multirow{2}{*}{Region / class}}가 가로 2열, 세로 2행을 묶고, 2행에서는 같은 위치를 빈 \multicolumn{2}{|c|}{}로 받습니다. \multirow가 세로로 가로지르는 만큼 아래 행의 블록 부분은 비워 두는 것입니다. \cline{1-3}은 본문 쪽 행 구분에 쓰고, 블록 자체는 \hline으로 위아래를 감쌉니다.
한 셀 안에서 줄바꿈 — makecell
여기서 구분해 둘 것이 있습니다. “한 칸 안에서 줄을 나누고 싶다”는 것은 셀 병합이 아닙니다. l, c, r 열은 내용을 줄바꿈하지 않으므로 그런 셀 안에 \\를 직접 쓰면 오류가 납니다. 짧은 문자열을 원하는 위치에서 줄바꿈하고 싶을 뿐이라면 makecell 패키지 의 \makecell{…} 이 가장 간단합니다(\usepackage{makecell}).
\makecell{line1\\line2}는 내용을 작은 한 열짜리 tabular 로 조판하고 \\로 강제 줄바꿈 합니다. 선택 인수로 정렬도 지정할 수 있으며, \makecell[l]{…}(왼쪽), \makecell[t]{…}(위쪽)처럼 세로와 가로 정렬을 한 글자씩 넘깁니다(기본은 세로와 가로 모두 가운데). 머리글용으로는 공통 글꼴과 여백이 설정된 \thead{…} 도 준비되어 있습니다.
\usepackage{makecell}
% ...
\begin{tabular}{lc}
\hline
\thead{項目} & \thead{前年比\\(\%)} \\
\hline
売上高 & \makecell[r]{+8.2\\(過去最高)} \\
\hline
\end{tabular}이 예에서는 머리글 “Year-on-year (%)”을 \thead{Year-on-year\\(\%)}로 두 줄에 쌓고, 본문 쪽 숫자도 \makecell[r]{+8.2\\(record high)}로 오른쪽 정렬 두 줄로 조판합니다. 둘 다 한 칸 안에서 줄바꿈할 뿐이며, 이웃 셀과 병합되지 않는다는 점에 주의하세요. 내용이 길고 폭에 따라 자동으로 줄바꿈하고 싶다면 \makecell이 아니라 p{width} 열 또는 그 친척을 쓰는 것이 맞습니다.
정렬의 함정과 도구 선택
병합 주변에서 자주 막히는 점을 정리하면 다음과 같습니다. 첫째, 세로 가운데 입니다. \multirow의 글자는 기본적으로 행 가운데에 놓이지만 행 높이나 선 두께에 따라 조금 위아래로 치우쳐 보일 수 있습니다. 그럴 때는 [vpos]로 t / b를 고르거나 [vmove]에 작은 길이를 주어 미세 조정합니다. 둘째, 행 수의 정합성 입니다. \multicolumn이 들어간 행에서도 &의 개수와 병합 폭의 합이 선언한 열 수와 일치해야 합니다. 셋째, 중첩 순서 입니다. 블록 병합에서는 반드시 \multirow를 \multicolumn 안에 둡니다.
도구 선택은 단순합니다. 가로로 가로지르면 \multicolumn, 세로로 가로지르면 \multirow, 직사각형이면 둘을 함께 사용하고, 한 칸 안에서 줄만 나누고 싶을 때만 \makecell 을 씁니다. 긴 문장을 폭에 따라 줄바꿈하고 싶다면 이들이 아니라 p{width} 열(세로 가운데가 필요하면 array의 m{width})을 써서 자동으로 줄바꿈하는 것이 맞습니다. 열 지정 자체는 “열 지정, 정렬과 너비”, 지면을 넘는 큰 표는 “고급 표 환경” 페이지에서 다룹니다.