표 배치와 스타일링

tabular가 조판하는 것은 표의 *내용* 뿐입니다. 그 표에 번호가 붙은 제목(캡션)을 달고, 페이지의 적절한 위치로 띄워 보내는 일은 부동체인 table 환경 의 역할입니다. 이 페이지에서는 tabular 바깥의 요소를 다룹니다. \begin{table}[htbp]의 배치 지정, \caption\label의 관례, 지면 폭을 넘는 표를 줄이거나 돌리는 방법, 그리고 표에 주석을 붙이는 threeparttable 입니다. 내용 자체를 만드는 법은 “tabular 기본”을 보세요.

표가 “떠다니는” 이유

표와 그림은 중간에서 페이지를 나눌 수 없습니다. 하나의 덩어리로 같은 페이지에 모두 들어가야 합니다. LaTeX가 원본에 나온 바로 그 위치에 넣으려 했는데 남은 공간이 부족하면 큰 빈칸이 생기거나 표가 어색하게 잘릴 수 있습니다. 그래서 LaTeX는 표와 그림을 부동체(float) 로 다루어 본문 흐름에서 떼어 내고, 대개 다음 페이지 맨 위 같은 알맞은 위치로 자동으로 띄워 보냅니다.

이 구조를 사용하는 것이 table 환경입니다. 그 안에 tabular를 넣고 \caption{…}으로 “표 1” 같은 번호 붙은 제목을 주며, \label{…}\ref{…}로 본문에서 참조할 수 있게 합니다. 그래서 본문에는 “표 1에서 보듯이…”처럼 번호로 참조 하면 됩니다. 표가 실제로 어느 페이지로 이동하든 참조는 항상 올바른 번호를 가리킵니다. 이것이 부동체의 장점입니다.

배치 지정 [htbp]와 [H]

\begin{table} 바로 뒤의 대괄호에는 어디에 두고 싶은지 를 한 글자씩 적어 넘깁니다. 지정자는 네 가지입니다.

지정자의미
h여기, 즉 소스 위치. 단 h 단독은 허용되지 않으며 자동으로 t가 보충됨Here
t본문 페이지의 위쪽Top
b본문 페이지의 아래쪽Bottom
p본문 없는 별도의 부동체 전용 페이지Page

아무것도 지정하지 않으면 articlebook 모두 기본값은 tbp 입니다. [htbp]처럼 여러 글자를 나열하면 “가능하면 here, 아니면 top, 그다음 bottom, 마지막으로 부동체 전용 페이지”라는 허용 위치의 집합 을 뜻합니다. 중요한 점은 쓴 순서가 LaTeX가 시도하는 순서를 바꾸지 않는다 는 것입니다. LaTeX는 항상 t→b→p 순서로 시도하므로 [htbp][bpht]는 똑같이 동작합니다. 첫 선택지가 맞지 않을 때 다음 후보로 넘어가는 안전장치라고 보면 됩니다.

[!ht]처럼 앞에 느낌표 ! 를 붙이면 “이 부동체에 한해 한 페이지에 놓을 부동체 개수나 본문과의 비율 같은 내부 제한을 무시하고 배치를 시도하라”는 뜻입니다. !는 “여기에 놓아라”라는 뜻이 아닙니다. 판단 기준을 느슨하게 할 뿐입니다. 정말 그 자리에 고정하고 싶다면 float 패키지가 정의하는 [H] 를 사용합니다. \usepackage{float}를 불러온 뒤 \begin{table}[H]라고 쓰면 표는 더 이상 떠다니지 않고 소스의 그 위치에 그대로 조판됩니다. 그 결과 페이지 아래쪽에 큰 빈칸이 생길 수도 있습니다. H는 엄밀히 말해 “떠다니지 않는 부동체”라고 이해하면 좋습니다.

document.tex
\usepackage{float}   % \begin{table}[H] のために

\begin{table}[htbp]
  \centering
  \caption{四半期ごとの売上}
  \label{tab:sales}
  \begin{tabular}{lrr}
    \hline
    四半期 & 売上 & 前年比 \\
    \hline
    Q1 & 1{,}200 & +5\% \\
    Q2 & 1{,}350 & +8\% \\
    \hline
  \end{tabular}
\end{table}

본문에서는 Table~\ref{tab:sales}처럼 참조합니다(~는 단어와 번호가 줄 끝에서 갈라지지 않게 하는 묶음 공백입니다). 배치가 도무지 원하는 대로 되지 않을 때의 대처는 “부동체와 배치” 페이지에서 자세히 다룹니다.

캡션, 레이블과 가운데 정렬

\caption{…}은 부동체에 번호 붙은 제목을 주며, article에서는 “Table 1:”, book에서는 “Table 1.1:” 같은 연속 번호 를 자동으로 붙입니다. 표와 그림은 별도 카운터를 쓰므로 번호가 섞이지 않습니다. \caption[short]{full caption}처럼 선택 인수를 붙이면 표 목록 에는 짧은 제목이, 본문에는 긴 제목이 실립니다.

두 가지 관례가 중요합니다. 첫째, 번호를 증가시키는 것은 \caption이므로 \label은 반드시 \caption 뒤에 와야 합니다. 순서를 바꾸면 \ref가 이전 번호를 가리킵니다. 둘째는 배치 관례 입니다. 일반적으로 표의 캡션은 위에, 그림의 캡션은 아래에 둡니다. 표는 제목을 먼저 보고 읽고, 그림은 본 뒤 설명을 읽는다는 생각입니다. LaTeX에서는 \captiontabular 에 쓰면 위, 에 쓰면 아래에 놓입니다.

\centering은 부동체 안의 내용을 기본 왼쪽 정렬에서 가운데 정렬로 바꾸는 선언입니다. 부동체 안에서는 center 환경(\begin{center}…\end{center})이 아니라 \centering을 쓰는 것이 관례입니다. center 환경은 앞뒤에 여분의 세로 공간을 넣지만, \centering은 선언일 뿐이라 불필요한 공백을 만들지 않습니다. 캡션의 형식(글꼴, 구분자, 폭 등)을 세밀하게 조정하려면 caption 패키지를 사용합니다. 자세한 내용은 “캡션과 하위 그림” 페이지를 보세요.

지면 폭을 넘는 표

l, c, r 열은 줄바꿈하지 않으므로 열이 많거나 내용이 길면 표가 본문 폭(\textwidth)을 넘습니다. 가장 빠른 대처는 graphicx\resizebox 로 표 전체를 줄이는 것입니다. 형식은 \resizebox{width}{height}{material}이고, 둘 중 하나를 ! 로 두면 다른 쪽 지정에 맞춰 가로세로 비율을 유지한 채 확대하거나 축소합니다.

latex
\resizebox{\textwidth}{!}{%
  \begin{tabular}{lrrrrr}
    \hline
    項目 & 1月 & 2月 & 3月 & 4月 & 5月 \\
    \hline
    売上 & 120 & 135 & 128 & 142 & 150 \\
    \hline
  \end{tabular}%
}

이렇게 하면 표가 본문 폭에 딱 맞습니다. 하지만 \resizebox는 내용을 “스케일링” 하므로 글자의 굵기, 줄의 굵기, 수식 기호까지 모두 같은 비율로 늘거나 줄어 주변 본문과 글자 크기가 어긋나 보이기 쉽습니다. 축소는 임시 조치로 보고, 제대로는 표 자체를 고치는 것이 맞습니다. 열을 줄이고, p{width}로 줄바꿈하고, 약어를 쓰는 식입니다. \resizebox 대신 adjustbox 패키지를 쓰면 주변 레이아웃과 더 잘 어울리며, \begin{adjustbox}{width=\textwidth}…\end{adjustbox}처럼 환경으로도 쓸 수 있습니다.

스케일링을 아예 피하고 싶다면 표 전체의 글자 크기를 한 단계 줄이는 방법도 있습니다. \begin{table} 안에서 \small이나 \footnotesize를 선언하면 줄이나 수식의 비율을 왜곡하지 않고 실제로 작은 글꼴로 조판됩니다. 가로 여유를 써서 가운데가 아니라 오른쪽으로 밀고 싶다면 내용 앞에 \hfill을 두는 식의 미세 조정도 가능합니다. 목표 폭에 맞춰 열을 자동으로 늘리는 tabularx 같은 더 근본적인 폭 제어는 “고급 표 환경” 페이지에서 다룹니다.

회전 — 가로 방향 표

세로 페이지에 도저히 들어가지 않는 큰 표는 가로 방향(landscape) 으로 돌려 한 페이지를 다 쓰는 방법이 있습니다. 표준 그래픽 기능 위에 만들어진 rotating 패키지가 제공하는 sidewaystable 환경을 table 대신 쓰면 됩니다. 표는 전용 한 페이지에 90도 회전되어 배치되고, 캡션과 번호도 함께 돌아가며, 표 목록에도 제대로 실립니다. 양면 조판에서는 펼침면에서 읽기 좋도록 회전 방향도 자동으로 조정됩니다. 그림에는 대응하는 sidewaysfigure가 있습니다.

document.tex
\usepackage{rotating}

\begin{sidewaystable}
  \centering
  \caption{多数の列を持つ横向きの表}
  \label{tab:wide}
  \begin{tabular}{lrrrrrrrr}
    \hline
    地域 & Q1 & Q2 & Q3 & Q4 & 合計 & 前年 & 増減 & 比率 \\
    \hline
    東日本 & 120 & 135 & 128 & 142 & 525 & 500 & +25 & 105\% \\
    \hline
  \end{tabular}
\end{sidewaystable}

표 전체가 아니라 일부만 임의의 각도로 돌리고 싶을 때 는 역시 graphicx / rotating\rotatebox{angle}{material} 을 사용합니다. 예를 들어 머리글 셀 하나만 \rotatebox{90}{long column name}로 세워 쓰는 방식입니다(양의 각도는 반시계방향). rotating이 다루는 것은 상자(box)의 회전 이며, 상자는 반드시 한 페이지 안에 들어갑니다. 여러 페이지에 걸친 가로 방향의 *본문* 을 만들고 싶다면 rotating이 아니라 lscape, 또는 PDF 페이지 자체를 회전하는 pdflscape를 사용합니다.

threeparttable — 주석이 있는 표

표의 셀에 각주를 붙이고 싶을 때가 있습니다. 하지만 tabular 안에서 \footnote를 쓰면 주석이 페이지 아래로 날아가거나 아예 출력되지 않는 등 잘 동작하지 않습니다. 이를 해결하는 것이 threeparttable 패키지입니다. 이름처럼 표를 제목(캡션), 본문(tabular), 주석(tablenotes)의 세 부분 으로 다루고, 주석을 표와 같은 폭으로 표 바로 아래에 배치합니다.

사용법은 threeparttable 환경 안에 \captiontabulartablenotes 환경 순서로 놓는 것뿐입니다. 주석 연결은 수동 입니다. 셀 안에 \tnote{a} 같은 표지를 놓고, tablenotes 안에는 같은 기호로 \item[a] …라고 주석을 씁니다. 한 주석을 여러 셀에서 참조하는 일이 많아 일부러 자동 번호로 만들지 않았다는 것이 저자의 설명입니다. threeparttable 자체는 부동체가 아니므로, 번호와 배치가 필요하면 전체를 table로 감쌉니다.

document.tex
\usepackage{threeparttable}

\begin{table}[htbp]
  \centering
  \begin{threeparttable}
    \caption{品種ごとの収量}
    \label{tab:yield}
    \begin{tabular}{lrr}
      \hline
      品種 & 収量\tnote{a} & 価格\tnote{b} \\
      \hline
      コシヒカリ & 540 & 380 \\
      あきたこまち & 520 & 360 \\
      \hline
    \end{tabular}
    \begin{tablenotes}
      \footnotesize
      \item[a] 単位は 10a あたりの kg。
      \item[b] 1kg あたりの卸売価格(円)。
    \end{tablenotes}
  \end{threeparttable}
\end{table}

이 예에서는 바깥쪽 table이 번호와 배치를 맡고, threeparttable이 캡션, 본문, 주석의 세 부분을 묶습니다. 머리글 셀의 \tnote{a}\tnote{b}는 작은 위첨자 표지로 붙고, 표 바로 아래에는 같은 a, b 주석이 표와 같은 폭으로 정렬됩니다. tablenotes 환경에는 다음과 같은 서식 옵션이 있습니다.

옵션효과
para여러 주석을 줄바꿈 없이 한 문단으로 이어서 조판주석을 연속 배치
flushleft주석의 내어쓰기를 없앰내어쓰기 없음
online\item 표지를 위첨자가 아니라 보통 크기로 출력보통 크기 표지
normal기본 서식으로 되돌림(문서 전체 설정을 무시할 때)기본값 복원

이 옵션들은 \usepackage[para]{threeparttable}처럼 문서 전체에 지정할 수도 있고, \begin{tablenotes}[flushleft]처럼 표마다 지정할 수도 있습니다. threeparttable은 캡션 서식 자체를 다듬지 않으므로, 제목다운 모양이 필요하면 caption 패키지와 함께 씁니다. 여러 페이지에 걸친 표(longtable)에 주석을 붙이려면 자매 패키지인 threeparttablex를 사용합니다.