Word 에서 표를 만들다 행을 하나 지우면, 그 뒤 번호를 손으로 다시 맞춰야 했던 경험이 있을 겁니다. LaTeX 의 표는 접근이 다릅니다. 열의 구조를 한 번 정의해 두면, 칸을 채우는 일과 조판하는 일이 분리됩니다. 이 글은 그 구조를 만드는 도구 — tabular — 를 기본부터 전문 표까지 정리합니다.
여기서 다루는 것은 표의 내용 격자를 짜는 방법입니다. 이렇게 만든 표에 “표 3” 같은 번호를 붙이고 본문에서 참조하는 것은 그림과 완전히 같은 방식이라, 그 부분은 그림 편에서 표·그림을 함께 다룹니다. 이 글은 격자 자체에 집중합니다.
1. tabular — 표의 격자를 정의한다
가장 단순한 표부터 봅니다.
1
2
3
4
5
6
7
8
9
\begin{tabular}{|l|c|r|}
\hline
이름 & 나이 & 점수 \\
\hline
홍길동 & 25 & 92 \\
김철수 & 28 & 85 \\
이영희 & 23 & 97 \\
\hline
\end{tabular}
핵심은 \begin{tabular} 바로 뒤의 {|l|c|r|} 입니다. 이것이 열 정의(column spec) 로, 표가 몇 개의 열을 갖고 각 열이 어떻게 정렬되는지를 한 번에 정합니다.
lcr— 각 열의 정렬: 왼쪽 · 가운데 · 오른쪽|— 열 사이의 세로 구분선
{|l|c|r|} 은 “세 개의 열이고, 왼쪽·가운데·오른쪽 정렬이며, 모든 열 경계에 세로선을 둔다” 는 뜻입니다. 열 개수는 이 정의의 글자 수(l c r)로 결정되므로, 본문 각 행의 칸 수도 여기에 맞아야 합니다.
칸 안에서 쓰는 두 기호가 표의 뼈대를 만듭니다.
&— 칸과 칸을 가릅니다. 한 행에서 열 사이를 넘어갈 때마다 씁니다.\\— 행을 끝내고 다음 줄로 넘어갑니다.\hline— 그 자리에 가로선을 긋습니다.
여기서 가장 자주 만나는 오류가 칸 수 불일치입니다. 열 정의는 3열인데 어느 행에 & 가 하나 모자라거나 남으면 ! Extra alignment tab has been changed 또는 칸이 밀리는 결과가 납니다. 행을 추가할 때 & 개수(열 개수보다 하나 적어야 합니다)를 세는 습관이 안전합니다.
2. 열 너비 — 긴 텍스트가 넘칠 때
기본 tabular 는 내용 길이에 맞춰 열 너비를 자동으로 정합니다. 짧은 값에는 편하지만, 한 칸에 긴 문장이 들어가면 문제가 됩니다. 자동 너비는 줄바꿈을 하지 않아서, 긴 텍스트가 열 밖으로, 심하면 페이지 밖으로 넘칩니다. 이때 로그에는 Overfull \hbox 경고가 뜹니다 — 그 경고를 읽고 대처하는 법은 LaTeX 오류 메시지 해결 사전 2편 의 5부에 정리해 두었지만, 표에서는 애초에 넘치지 않도록 열 너비를 고정하는 쪽이 정답입니다.
고정 너비는 l/c/r 대신 p{너비} 열을 씁니다.
1
2
3
4
5
6
7
\begin{tabular}{|p{3cm}|p{4cm}|p{5cm}|}
\hline
항목 & 설명 & 비고 \\
\hline
LaTeX & 조판 시스템 & Donald Knuth 가 개발한, 수식과 참조에 강한 문서 조판 도구 \\
\hline
\end{tabular}
p{5cm} 은 “이 열은 폭 5cm 로 고정하고, 내용이 길면 그 안에서 줄바꿈하라” 는 뜻입니다. 긴 설명이 들어가는 열에 p{} 를 주면 텍스트가 칸 안에서 여러 줄로 접히고, 표가 페이지를 벗어나지 않습니다. 표 전체가 페이지보다 넓어지는 것을 막는 가장 확실한 방법입니다.
3. booktabs — 세로선을 걷어낸 학술지 표
앞의 예제들은 세로선(|)과 촘촘한 가로선으로 격자를 강조했습니다. 그런데 학술 논문의 표는 정반대 입니다. 세로선을 쓰지 않고, 가로선도 최소한만 — 위·중간·아래 세 줄만 — 남깁니다. 이 관례를 손쉽게 따르게 해 주는 것이 booktabs 패키지입니다.
1
2
3
4
5
6
7
8
9
10
11
\usepackage{booktabs} % 프리앰블에 추가
\begin{tabular}{lcr}
\toprule
방법 & 정확도 (\%) & 처리 시간 (ms) \\
\midrule
베이스라인 & 78.3 & 12.5 \\
제안 방법 & 85.7 & 14.2 \\
앙상블 & 89.1 & 28.6 \\
\bottomrule
\end{tabular}
\toprule · \midrule · \bottomrule 은 booktabs 가 제공하는 세 종류의 선입니다.
\toprule— 표 맨 위 굵은 선\midrule— 헤더와 내용을 가르는 중간 선\bottomrule— 표 맨 아래 굵은 선
열 정의도 {lcr} 처럼 | 없이 씁니다. 왜 이렇게 하냐면, 세로선과 이중선은 시선을 격자에 묶어 데이터를 읽기 어렵게 만들기 때문입니다. booktabs 문서 자체가 “세로선을 쓰지 말라, 이중선을 쓰지 말라” 를 원칙으로 제시합니다. 논문 표를 만든다면 처음부터 booktabs 로 시작하는 편이, 나중에 세로선을 걷어내는 것보다 낫습니다. \toprule 같은 명령은 booktabs 를 불러오지 않으면 Undefined control sequence 가 나므로, 프리앰블의 \usepackage{booktabs} 를 잊지 마세요.
4. 셀 병합 — 가로와 세로
표에서 헤더를 묶거나 같은 값을 여러 행에 걸치게 하려면 셀 병합이 필요합니다. 가로와 세로가 방식이 다릅니다.
가로 병합 — multicolumn
\multicolumn{열수}{정렬}{내용} 으로 여러 열을 하나로 묶습니다.
1
2
3
4
5
6
7
8
9
\begin{tabular}{|c|c|c|c|}
\hline
\multicolumn{2}{|c|}{그룹 A} & \multicolumn{2}{c|}{그룹 B} \\
\hline
항목1 & 항목2 & 항목3 & 항목4 \\
\hline
10 & 20 & 30 & 40 \\
\hline
\end{tabular}
\multicolumn{2}{|c|}{그룹 A} 는 “두 열을 합쳐 가운데 정렬로 ‘그룹 A’ 를 넣되, 좌우에 세로선을 둔다” 는 뜻입니다. 병합한 칸은 열 하나로 세므로, 그 행의 & 개수도 그만큼 줄어듭니다. \multicolumn 은 정렬을 그 칸만 따로 지정하는 용도로도 쓰입니다(\multicolumn{1}{c}{...}).
세로 병합 — multirow
세로 병합은 별도 패키지 multirow 가 필요합니다.
1
2
3
4
5
6
7
8
9
\usepackage{multirow} % 프리앰블에 추가
\begin{tabular}{|c|c|c|}
\hline
\multirow{2}{*}{공통} & A & 1 \\
\cline{2-3}
& B & 2 \\
\hline
\end{tabular}
\multirow{2}{*}{공통} 은 “이 칸을 아래로 두 행에 걸쳐 ‘공통’ 으로 채운다” 는 뜻입니다. 가운데의 * 는 너비를 내용에 맞게 자동으로 두라는 표시입니다. 병합된 아래 행에서는 그 열을 비워 둡니다(예제의 둘째 행 맨 앞이 빈 이유입니다). \cline{2-3} 은 \hline 과 달리 2열부터 3열까지만 가로선을 그어, 세로 병합된 첫 열을 가로선이 가로지르지 않게 합니다.
정리
| 목적 | 코드 | 비고 |
|---|---|---|
| 표 격자 | \begin{tabular}{lcr}...\end{tabular} | 열 정의가 열 개수·정렬 결정 |
| 정렬 | l c r | 왼쪽·가운데·오른쪽 |
| 세로선 | \| | 학술 표에서는 지양 |
| 행·칸 | \\ (행), & (칸) | 칸 수는 열 정의와 일치 |
| 가로선 | \hline / \cline{2-3} | 전체 / 일부 열 |
| 고정 너비 | p{5cm} | 긴 텍스트 줄바꿈, 넘침 방지 |
| 전문 표 | \toprule \midrule \bottomrule | booktabs 필요 |
| 가로 병합 | \multicolumn{2}{c}{...} | 기본 기능 |
| 세로 병합 | \multirow{2}{*}{...} | multirow 필요 |
표를 만들 때의 순서는 늘 같습니다 — 열 정의로 틀을 잡고({lcr}), & 와 \\ 로 칸을 채우고, 필요하면 p{} 로 너비를 고정하고, 논문이라면 booktabs 로 선을 정리합니다. 격자가 완성되면, 여기에 번호와 캡션을 붙여 본문에서 “표 3” 으로 참조하는 일이 남습니다 — 그 방식은 그림과 똑같아서, 다음 그림 편에서 함께 다룹니다.