고급 표 환경

기본 tabular는 각 열을 내용의 자연 너비만큼 넓힙니다. 그래서 표 전체를 본문 폭에 정확히 맞추거나, 긴 문장을 담은 열들을 같은 폭으로 나란히 두고 싶어지는 순간 어려워집니다. 이 문제를 해결하는 패키지는 tabularx(목표 폭에 맞게 열을 늘림), tabulary(각 열의 내용량에 따라 폭을 배분), 그리고 최근 표준으로 자리 잡아 가는 tabularray(tblr 환경, 키=값으로 표의 모든 것을 제어하는 현대적 패키지)입니다. 이 페이지에서는 세 가지의 차이와 각각의 실제 예를 살펴봅니다.

너비 문제

tabular에서 l, c, r 열은 줄바꿈하지 않고, p{width} 열은 줄바꿈하지만 폭을 직접 계산해 지정 해야 합니다. 열이 세 개이고 표를 본문 폭 \textwidth에 정확히 맞추고 싶을 때 p{0.3\textwidth}처럼 어림짐작으로 쓰면 선과 열 사이 공간(\tabcolsep)만큼 어긋나 표가 넘치거나 남게 됩니다.

여기서 생각을 바꿉니다. 먼저 폭을 정하고 열을 맞추게 하는 것tabularx입니다. 각 열의 내용량에 따라 폭을 자동 배분하는 것tabulary입니다. 둘 다 David Carlisle의 오래된 표준 패키지이며(tabularxtools 번들에 들어 있습니다), \usepackage{tabularx} 또는 \usepackage{tabulary}로 불러옵니다.

tabularx — 고정 폭에 맞춰 늘어나는 X 열

tabular와 달리 tabularx 환경은 첫 번째 인수로 표 전체의 목표 폭 을 받습니다. 형식은 \begin{tabularx}{width}{column spec}입니다. 열 지정에는 새로운 열 타입 X 를 사용할 수 있는데, 이는 남은 폭을 채우도록 자동으로 늘어나거나 줄어드는 p 스타일 열입니다. X 열이 여러 개 있으면 사용할 수 있는 폭을 균등하게 나눕니다.

작동 방식은 조금 특이합니다. tabularx는 표를 여러 번 시험 조판 해서 폭을 구합니다. 먼저 각 X 열을 목표 폭 전체로 잡아 조판합니다(그래서 표가 너무 넓어집니다). 그런 다음 초과분을 X 열의 개수로 나눠 각 X 열을 그만큼 줄이고 다시 조판합니다. 이 과정을 수렴할 때까지 반복합니다. 최종적으로 X는 내부에서 \tabularxcolumn이 정하는 열로 치환되며, 기본값은 다음과 같습니다.

latex
\newcommand{\tabularxcolumn}[1]{p{#1}}

따라서 X는 기본적으로 위쪽 정렬 단락 열입니다. 내용을 세로 가운데 에 맞추고 싶다면 \renewcommand{\tabularxcolumn}[1]{m{#1}}로 재정의합니다. 또한 X 열의 내용은 기본적으로 양쪽 정렬이지만, 왼쪽 정렬로 만들고 싶다면 열 지정에서 >{\raggedright\arraybackslash}X 라는 전처리를 붙입니다. 여기서 핵심은 \arraybackslash 입니다. \raggedright, \centering, \raggedleft는 내부에서 \\의 의미를 바꿔 표의 행 끝 \\와 충돌하므로, 이 선언들 뒤에 \arraybackslash를 두어 \\를 행 끝 기호로 되돌립니다.

같은 전처리를 여러 번 쓴다면 \newcolumntype로 한 글자 별명을 만들면 읽기 쉬워집니다. 다음 예는 1열을 내용 너비의 왼쪽 정렬 l로, 나머지 두 열을 왼쪽 정렬로 줄바꿈하는 같은 폭의 Y 로 두어 표 전체를 \textwidth에 맞춥니다.

document.tex
\usepackage{tabularx}
\newcolumntype{Y}{>{\raggedright\arraybackslash}X}
% ...
\begin{tabularx}{\textwidth}{l Y Y}
  \hline
  項目 & 長所 & 短所 \\
  \hline
  tabular  & 単純で速い & 幅を自分で調整する必要がある \\
  tabularx & 表幅を固定でき、列が自動で伸縮する & 試し組みのぶん処理が遅い \\
  \hline
\end{tabularx}

이 표는 지면의 좌우 전체(\textwidth)로 펼쳐지고, 1열 “Item”은 짧은 단어의 자연 너비를 유지하며, 2, 3열은 남은 폭을 절반씩 받아 긴 설명이 그 폭에서 줄바꿈됩니다. Y(왼쪽 정렬 X)를 사용했으므로 각 셀은 오른쪽이 들쭉날쭉한 왼쪽 정렬로 조판됩니다. 열의 비율을 다르게 하고 싶을 때는 아래에서 다룰 tabularrayX[2] 같은 계수 지정이 편리합니다. 기본 tabularx에는 계수 지정이 없습니다.

주의할 점이 있습니다. 본문이 여러 번 펼쳐지는 특성 때문에 tabularx 안에서는 부작용이 있는 명령(카운터 증가, 파일 쓰기, \verb 등)이 잘못 동작할 수 있습니다. 각주나 \verb를 포함해야 하는 셀은 보통 먼저 상자에 넣는 등의 처리가 필요합니다.

tabulary — 내용에 따라 폭 배분

tabularx는 각 X 열에 공간을 균등하게 배정합니다. 하지만 한쪽 열은 짧은 레이블이고 다른 쪽은 긴 설명처럼 열마다 분량이 크게 다르면 균등 배분은 오히려 어색합니다. 그래서 tabulary각 열 내용의 자연 너비에 비례 해 폭을 나누고, 전체를 지정한 폭에 맞춥니다.

문법은 tabularx와 비슷한 \begin{tabulary}{width}{column spec}입니다. 열 타입은 네 가지이며 모두 자동 폭 단락 열입니다. L 은 왼쪽, C 는 가운데, R 은 오른쪽, J 는 양쪽 정렬입니다. 일반 l, c, r, p{width} 등도 섞을 수 있는데, 이들은 측정 대상에서 제외 되어 자연 너비로 유지됩니다. 측정되는 각 열의 폭은 그 열에서 가장 넓은 셀의 자연 너비를 기준으로 가중되고, 전체가 지정 폭이 되도록 조정됩니다. 단, 자연 너비가 이미 더 작은 열은 그대로 남습니다.

극단적인 배분을 막기 위해 측정되는 열에는 두 길이 제한이 있습니다. 최소 폭 \tymin(기본 10pt)과 최대 폭 \tymax(기본 2\textwidth)입니다. 한 단어만 매우 긴 셀이 열 폭을 독점하는 것을 억제하고 싶을 때 사용합니다.

document.tex
\usepackage{tabulary}
% ...
\begin{tabulary}{\textwidth}{L L}
  \hline
  用語 & 説明 \\
  \hline
  X 列 & 表幅から固定部分を引いた残りを、X 列どうしで均等に分け合う列。 \\
  \hline
\end{tabulary}

여기서는 두 열 모두 L(왼쪽 정렬)이지만, 1열 “Term”은 내용이 짧아 좁고 2열 “Description”은 긴 글이라 더 넓게 배분됩니다. tabularx에서 X X라고 쓰면 두 열은 같은 폭이 되지만, tabulary내용의 무게 를 따르므로 레이블 열과 본문 열로 된 표가 자연스러운 비율이 됩니다. tabulary도 본문을 두 번 처리하므로 tabularx와 마찬가지로 각주와 카운터에 주의해야 합니다.

tabularray — 현대적인 tblr 환경

tabularray 는 최근 몇 년 동안 가장 활발히 개발되는 표 조판 패키지이며, 저자는 Jianrui Lyu(lvjr) 입니다. 오래된 \halign 기반 구현을 버리고 LaTeX3(expl3) 기능으로 표를 직접 해석하고 조판합니다. 가장 큰 특징은 예전에는 array, booktabs, multirow, colortbl, diagbox 등 여러 패키지를 함께 써야 했던 줄, 색, 셀 병합, 단락 서식, 열 너비하나의 키=값 인터페이스 로 통합한 점입니다. \usepackage{tabularray}로 불러오며, 주 환경은 tblr 입니다.

tblr의 구조는 tabular와 조금 다릅니다. 본문 앞에 \begin{tblr}{ … inner spec … }처럼 키=값을 쉼표로 나열한 하나의 인수(내부 지정) 를 둡니다. 열 정렬은 colspec 키로 선언합니다. colspec={lcr}처럼 익숙한 한 글자 지정도 가능하지만, 진짜 힘은 Q[…](정렬, 폭 등의 옵션을 대괄호로 넘기는 범용 열)와 X[…](tabularx와 같은 신축 열)에 있습니다. X[c]는 가운데 정렬 신축 열이고, X[2,l]계수 2(다른 X의 두 배 폭)의 왼쪽 정렬 신축 열입니다.

X 열을 사용할 때는 표가 넓어질 폭을 width 키로 지정합니다(지정하지 않으면 기본값은 \linewidth). 행간과 열간 여백은 rowsepcolsep 키로 제어하며, tblr의 기본값은 rowsep=2pt, colsep=6pt입니다. 줄은 선언적으로 지정합니다. hlines / vlines 라고 쓰면 모든 가로줄 / 세로줄을 그리고, hline{2}={1pt,solid}처럼 hline{n} / vline{n} 으로 특정 선의 두께와 종류를 지정할 수 있습니다. 본문에 \hline을 쓸 필요가 없습니다.

셀 결합은 본문 쪽에서 \SetCell 을 사용합니다. \SetCell[c=2]{c}2열을 가로지르는 가운데 정렬 셀(\multicolumn에 해당)이고, \SetCell[r=2]{c}2행을 가로지르는 셀(\multirow에 해당)입니다. c=r=는 열 / 행 결합 수, 중괄호는 그 셀의 정렬입니다. 행이나 열 전체를 꾸미려면 \SetRow / \SetColumn 을 사용하며, 예를 들어 \SetRow{cyan8}은 행을 옅은 청록색으로 칠합니다(색 이름은 패키지 기본 색상).

document.tex
\usepackage{tabularray}
% ...
\begin{tblr}{
  width = \textwidth,
  colspec = {Q[l] X[c] X[2,l]},
  rowsep = 3pt,
  hline{1,Z} = {1pt,solid},
  hline{2} = {0.5pt,solid},
  row{1} = {font=\bfseries},
}
  項目 & 区分 & 説明 \\
  \SetCell[r=2]{l} 表環境 & 固定幅 & 表全体の幅を固定し、X 列が残りを分け合う。 \\
   & 内容幅 & 各列の中身の量に応じて幅を配分する。 \\
  注記 & --- & 罫線・色・結合をキーで一括指定できる。 \\
\end{tblr}

tblrwidth=\textwidth로 표 폭을 본문 폭에 고정합니다. 세 열은 Q[l](왼쪽 정렬 기본 열), X[c](가운데 정렬 신축 열), X[2,l](계수 2의 왼쪽 정렬 신축 열)이며, 두 X 열은 남은 폭을 1 : 2 로 나누므로 3열 “Description”이 가장 넓어집니다. 본문에는 \hline이 나오지 않고, 선은 내부 지정의 hline{…} 키만으로 그립니다(Z는 마지막 행을 나타내는 특별한 번호). 첫 행은 row{1}={font=\bfseries}로 굵게, 1열의 “Table environment”는 \SetCell[r=2]{l}2행을 관통 하게 했습니다. booktabs, multirow, array를 함께 쓰지 않아도 이만큼 체재가 갖춰지는 것이 tabularray의 강점입니다.

페이지를 넘어가는 긴 표에는 longtblr 환경이 있으며, 머리글 행 반복, 캡션, 각주를 지원합니다. threeparttable처럼 주석이 있는 한 페이지짜리 표에는 talltblr 를 사용합니다. 이 환경들에서는 캡션, 레이블, note{…} 등을 본문 앞의 선택 인수 […](외부 지정) 에 씁니다.

무엇을 선택할까

사용 기준은 이렇습니다. 표를 정해진 폭에 딱 맞추고, 긴 글 열을 같은 폭 으로 나란히 두고 싶다면 tabularx를 씁니다. 폭은 고정하되 열마다 분량에 따라 자연스럽게 배분 하고 싶다면 tabulary를 씁니다. 새로 표를 작성하면서 줄, 색, 셀 결합, 열 너비까지 표 전체를 하나의 체계로 정리하고 싶다면 tabularray를 씁니다.

tabularray는 기능이 풍부하며, X 열과 width 키로 tabularx / tabulary가 해결하던 폭 문제까지 흡수합니다. 반면 tabularxtabulary는 성숙하고 가벼우며 기존 tabular 코드와도 잘 어울립니다. 짧은 기존 표에 폭 조정만 더하려면 기존 패키지를, 표 조판을 본격적으로 새로 만들려면 tabularray를 쓰는 식으로 이해하면 됩니다.

패키지폭 결정 방식주요 용도
tabularx전체 폭 고정, X 열 균등 분배본문 폭에 맞는 같은 폭의 글 열
tabulary전체 폭 고정, 내용량에 따라 배분분량이 다른 레이블+본문 표
tabularraywidth 키 + X 열(계수 포함)줄, 색, 결합을 통합한 현대적 표

열 지정 자체의 세부 사항(\multicolumn, array 패키지의 >{…} 등)은 “열 지정” 페이지에서, 셀 병합의 기본은 “셀 병합” 페이지에서, 페이지를 넘어가는 매우 긴 표는 “longtable” 페이지에서 다룹니다.