가로세로 줄

LaTeX으로 만든 표가 한눈에 “LaTeX 표”로 보이는 가장 큰 원인은 괘선입니다. \hline|로 그은 선은 글자에 딱 붙어 보이는데, 이는 인상이 아니라 실제로 잴 수 있는 이야기입니다. \hline이 행 사이에 넣는 것은 자기 자신의 두께 0.4pt뿐이고, 위아래 여백은 0 입니다. 반면 booktabs\midrule은 0.5pt 선에 더해 4.52pt의 여백을 함께 데려옵니다. 학술지의 표와 기본 LaTeX 표를 가르는 것이 바로 이 몇 포인트의 흰 공간입니다. 이 페이지에서는 표준 \hline, \cline, \vline, booktabs\toprule\midrule\bottomrule, 그리고 둘 다 닿지 못하는 교차점을 다루는 hhline을 모두 실측값과 함께 살펴봅니다.

표준 괘선 \hline, \cline, |가 답답해 보이는 이유

답은 “여백을 전혀 더하지 않기 때문”입니다. 두 행짜리 tabular의 높이를 재면 괘선 없이 24.0pt, 행 사이에 \hline을 하나 넣으면 24.4pt가 됩니다. 늘어난 값은 정확히 \arrayrulewidth(기본 0.4pt), 곧 선 자체의 두께뿐이고 위아래 여백은 더해지지 않습니다. 그래서 선이 글자에 닿아 보입니다. \cline은 한술 더 뜹니다. \cline{2-3}을 넣어도 높이는 24.0pt 그대로여서 증가분이 0 입니다. 선이 행 사이를 벌리는 것이 아니라, 원래 있던 행간 안에 그려지기 때문입니다.

도구 자체는 단순합니다. \hline 은 행 끝 \\ 뒤(또는 표의 맨 위나 맨 아래)에 두면 표 전체 폭으로 선을 하나 긋고, 두 번 이어 쓴 \hline\hline\doublerulesep(기본 2pt)만큼 떨어진 이중 괘선이 됩니다. 일부 열만 구분하려면 \cline{i-j} 를 씁니다. \cline{2-3}은 2, 3열 아래만 긋고, 떨어진 범위는 \cline{1-1}\cline{3-4}처럼 나열합니다. 세로 괘선은 본문이 아니라 열 지정의 몫 이어서, {|l|c|r|}처럼 쓰면 각 | 자리에 표 높이만큼의 세로선이, ||면 이중 세로선이 들어갑니다. 셀 하나 안에 국소적으로 세로선을 긋는 \vline 도 있습니다. |, \hline, \vline의 두께는 모두 \arrayrulewidth가 쥐고 있어서, \setlength{\arrayrulewidth}{0.8pt}라고 쓰면 표 안의 모든 선이 한꺼번에 굵어집니다.

latex
% every standard ruling feature at once -- and a specimen of what to avoid
\begin{tabular}{|l|c|r|}
  \hline
  Item & Qty & Price \\
  \hline\hline
  Apple & 3 & 380 \\
  \cline{2-3}
  Orange & 12 & 120 \\
  \hline
\end{tabular}

이 예는 세로 괘선 |로 모든 열을 둘러싸고, 머리글 아래를 \hline\hline 이중 괘선으로, 중간을 \cline{2-3}으로 나눕니다. 표준 기능을 한 번씩 다 써 본 예이자, 동시에 피해야 할 과도한 괘선의 표본 입니다. 조판 전통에서 괘선은 데이터를 가두는 울타리가 아니라 정보의 논리적 구분을 보여 주는 절제된 도구입니다. 세로 괘선은 열 사이에 벽을 세워 시선의 움직임을 막고, 이중 괘선은 얻는 것 없이 지면을 무겁게 만듭니다. 기본 \hline을 계속 쓸 생각이라면 최소한 표를 선으로 둘러싸지 말고, 머리글 아래와 표의 위아래에만 긋기를 권합니다. 다음 절의 booktabs는 그 작법을 패키지로 굳혀 놓은 것입니다.

booktabs 사용법 — \toprule, \midrule, \bottomrule

프리앰블에 \usepackage{booktabs}를 쓰고 \hline을 세 종류의 괘선으로 바꾸기만 하면 됩니다. 표 맨 위에 \toprule, 머리글과 본문의 경계에 \midrule, 맨 아래에 \bottomrule 을 두면 세로 괘선도 이중 괘선도 없는 학술지 표가 됩니다. 여기서 작동하는 것은 두 가지입니다. 굵기를 세 단계로 나누는 것과 괘선의 위아래에 여백을 넣는 것입니다. 숫자로 보면 차이가 분명합니다. 같은 3행 표가 \hline 판에서는 높이 37.20pt, booktabs 판에서는 47.14pt입니다. 같은 내용에 약 10pt의 흰 공간 이 더해진 셈입니다.

기본값은 booktabs.sty에 적혀 있습니다. \heavyrulewidth=.08em(\toprule\bottomrule), \lightrulewidth=.05em(\midrule), \cmidrulewidth=.03em(\cmidrule)입니다. 10pt 문서에서 재면 차례로 0.80002pt, 0.50003pt, 0.29999pt 로, \hline의 0.4pt를 위아래에서 감싸는 배치입니다. 설계의 묘는 단위에 있습니다. em 으로 주어져 있어서 본문이 11pt인 문서에서는 0.876pt, 12pt인 문서에서는 0.94pt가 되어 괘선이 본문 크기에 비례해 굵어집니다. 반면 \arrayrulewidth는 문서 클래스와 무관하게 0.4pt 고정이므로, 이 점만으로도 \hline은 자기 본문과 균형이 맞지 않습니다. 여백 쪽은 \aboverulesep=.4ex(10pt 문서에서 1.72218pt)와 \belowrulesep=.65ex(2.79857pt)입니다. 따라서 \midrule 한 줄이 행에 더하는 높이는 0.5+1.72+2.80 = 5.02pt 로, \hline의 0.4pt의 열두 배가 넘습니다.

latex
\usepackage{booktabs}

% \toprule goes right after \begin{tabular}{...}; the rest follow a row's \\
\begin{tabular}{@{}llr@{}}
  \toprule
  \multicolumn{2}{c}{Fruit} \\
  \cmidrule(lr){1-2}
  Kind & Grade & Price \\
  \midrule
  Apple  & premium & 380 \\
  Orange & second  & 120 \\
  \addlinespace
  Total  &         & 500 \\
  \bottomrule
\end{tabular}

합계 행 앞의 약간의 여백은 \addlinespace 에서 나옵니다. 행 끝 \\ 뒤에 두면 \defaultaddspace(.5em, 10pt 문서에서 5pt)만큼 벌어지고, \addlinespace[1ex]처럼 양을 지정할 수도 있습니다. \\[2pt]로 행을 늘이는 것보다 의도가 분명하고, 괘선 옆에 두었을 때의 간격도 정확합니다. 굵기와 위아래 여백을 전부 직접 정하고 싶을 때만 \specialrule{width}{above}{below}(세 인수 모두 필수)를 씁니다. 예외적인 상황을 위한 명령이며, 평소에는 세 가지 괘선으로 충분합니다. 괘선은 반드시 행의 경계에 두어야 합니다. 셀 중간에 \toprule을 쓰면 ! Misplaced \noalign.으로 멈추는데, \hline과 마찬가지로 이 명령들이 \noalign 안에서 동작하기 때문입니다.

명령 · 길이역할기본값(10pt 문서 실측)
\toprule표 맨 위의 괘선\heavyrulewidth = .08em = 0.80002pt
\midrule머리글과 본문을 나누는 괘선\lightrulewidth = .05em = 0.50003pt
\bottomrule표 맨 아래의 괘선\heavyrulewidth = .08em = 0.80002pt
\cmidrule(lr){a-b}a–b 열만 지나는 부분 괘선\cmidrulewidth = .03em = 0.29999pt, 트림 \cmidrulekern = .5em = 5pt
\aboverulesep모든 괘선 위에 들어가는 여백.4ex = 1.72218pt
\belowrulesep모든 괘선 아래에 들어가는 여백.65ex = 2.79857pt
\addlinespace행과 행 사이에 더하는 여백\defaultaddspace = .5em = 5pt
\specialrule굵기와 위아래 여백을 모두 지정하는 괘선세 인수 모두 필수(기본값 없음)

참고로 \heavyrulewidth의 “width”가 두께 를 가리키는 것은 영어를 잘못 쓴 것이 아닙니다. booktabs.dtx에는 용어에 관한 주석이 따로 있어서, 영국의 조판에서는 line을 언제나 rule이라고 부르고 rule의 thickness를 “흔히 그것의 width라고 부른다”고 설명합니다. 저자는 다른 사람들이라면 가로선을 두고 depth나 height라고 했을 자리라며 덧붙입니다. 그는 이 업계 용어를 그대로 명령 이름에 들여왔습니다. 하나 더 있습니다. TeX Live 2024에 들어 있는 booktabs의 버전은 1.61803398, 곧 황금비 φ입니다. .dtx 표제면 각주에 저자 본인의 말로 버전 번호가 “phi, 즉 황금비로 수렴한다”고 적혀 있으며, 릴리스마다 끝자리가 한 자리씩 늘어 왔습니다. 초록에는 1.618, 1.6180, 1.61803, 1.618033이 나열되어 있고, 이들은 저자가 부재한 동안 Danie Els가 낸 버그 수정판이라고 각주가 밝히고 있습니다.

\cline과 \cmidrule의 차이

눈에 보이는 차이는 여백과 끝 처리 로 요약됩니다. 같은 2행 표에서 재면 \cline{2-3}이 더하는 높이는 0.0pt, \cmidrule{2-3}은 4.82pt(선 0.29999pt + \aboverulesep 1.72218pt + \belowrulesep 2.79857pt)입니다. \cline이 글자를 파고드는 것처럼 보이는 이유가 여기에 있습니다. 다른 하나는 끝입니다. \cmidrule은 기본적으로 해당 열의 폭 전체에 닿아 이웃한 부분 괘선과 이어져 버리므로, 괄호로 트림 을 지정합니다. (l), (r), (lr)는 왼쪽, 오른쪽, 양끝을 \cmidrulekern(.5em = 5pt)만큼 물리며, (r{.75em})처럼 양을 적을 수도 있습니다. 전체 구문은 \cmidrule 뒤에 대괄호의 굵기, 소괄호의 트림, 그리고 {a-b} 순입니다. 경험칙으로, 열 머리글을 묶는 \multicolumn 아래에는 거의 언제나 \cmidrule(lr){…}을 붙인다고 생각해도 됩니다.

다만 섞어 쓰면 안 됩니다. 저자는 이 명령들이 “\hline이나 \cline과 함께 동작한다는 보장이 없으며… 둘을 섞어 쓰고 싶을 이유가 떠오르지 않는다”고 못박았습니다. 실제로 booktabs의 괘선은 열 지정의 |와 이어지지 않도록 만들어져 있고, 문서는 그것을 의도된 사양(a feature) 이라고 말합니다. 같은 높이에 이중 부분 괘선이 꼭 필요할 때만 두 개의 \cmidrule 사이에 \morecmidrules 를 넣습니다(\cmidrule{1-2}\morecmidrules\cmidrule{1-2}. 간격은 \cmidrulesep이며 기본값은 \doublerulesep과 같은 2pt입니다). 이중 괘선 자체가 권장되지 않으므로 이것도 일상적인 도구는 아닙니다.

세로 괘선을 쓰면 안 되는 이유

booktabs 설명서는 이 대목을 주저 없이 명령형으로 씁니다. 언제나 두 가지 간단한 지침만 기억하면 크게 어긋나지 않는다면서, “1. 세로 괘선은 절대로, 결코 쓰지 말 것. 2. 이중 괘선을 쓰지 말 것.” 이라고 적혀 있습니다. 이어서 “이 지침이 극단적으로 보일 수 있지만, 이를 어길 만한 좋은 근거를 나는 한 번도 찾지 못했다”고 덧붙입니다. 표의 왼쪽 절반과 오른쪽 절반이 세로선으로 나누고 싶을 만큼 다르다면, 저자의 답은 표를 둘로 나누라 는 것입니다. 다른 대목에서는 더 짧게, 표에 세로 괘선을 쓰지 말라, 그것으로 끝이라고 씁니다.

같은 문서에는 저자가 “전문 조판자와 정리 기자 바깥에서는 대체로 알려지지 않은” 것이라며 소개한 지침 세 가지 가 더 있는데, 상당히 실용적입니다. 단위는 열 머리글에 쓸 것(표 본문에 반복하지 말 것). 소수점 앞에는 반드시 숫자를 둘 것.1이 아니라 0.1. “상동” 같은 반복 기호를 쓰지 말 것 — 대개 빈칸으로 충분하고, 그것으로 부족하면 값을 다시 적으면 됩니다. 저자는 자기 규칙의 한계에도 솔직해서, 두 번째 지침에 대해 “합계 행 위에 가는 이중선을 넣으라고 고집하는 출판사와 일한 적이 있다. 그러나 그것이 내 선택은 아니었을 것이다”라고 덧붙입니다. 지침은 절대적인 것이 아니라, 깰 때는 이유를 갖고 깨는 것입니다.

hhline — 괘선이 만나는 방식을 지정하기

hhline\hline과 같은 가로 괘선을 긋지만, 세로 괘선과 만나는 지점에서 선을 끊을지 통과시킬지를 한 글자씩 지정할 수 있습니다. LaTeX의 tools 번들에 들어 있는 David Carlisle의 패키지이며, \usepackage{hhline}으로 불러옵니다. 기본 \hline\hline으로는 이중 괘선 자리에서 세로선이 끊길지 관통할지를 고를 수 없습니다. booktabs가 세로 괘선도 이중 괘선도 쓰지 말라고 하는 이상, hhline이 나설 자리는 그 조언을 따를 수 없는 경우 로 한정됩니다. 형식이 정해진 투고 규정, 재현해야 할 기존 문서, 회계 표 같은 것들입니다. 뒤집어 말하면 그 밖에서는 필요 없습니다.

\hhline{…}의 인수는 열 지정과 매우 닮은 토큰의 나열입니다. 가로 쪽은 =(열 폭만큼의 이중 괘선), -(홑선), ~(그 열에는 긋지 않음). 세로 쪽은 |(괘선을 관통하는 세로선), :(괘선에 끊기는 세로선), #(두 세로선 사이의 이중 괘선 한 구간)입니다. 이중 괘선의 모서리를 만들기 위한 t(위 절반)와 b(아래 절반)도 있어서 |t:가 왼쪽 위, :b|가 오른쪽 아래 모서리가 됩니다. 열 지정과 같은 *{n}{…} 반복 표기도 쓸 수 있습니다. 참고로 ||::처럼 이중 세로 괘선을 쓰면 가로 괘선이 그 자리에서 끊깁니다. 끊지 않고 통과시키려면 #을 쓰거나 세로 괘선 지정 자체를 빼십시오.

latex
\usepackage{hhline}

% the example from the package documentation: t/b build the corners,
% ~ leaves a column unruled, # is a double-rule segment between verticals
\begin{tabular}{||cc||c|c||}
  \hhline{|t:==:t:==:t|}
  a & b & c & d \\
  \hhline{|:==:|~|~||}
  1 & 2 & 3 & 4 \\
  \hhline{#==#~|=#}
  i & j & k & l \\
  \hhline{||--||--||}
  w & x & y & z \\
  \hhline{|b:==:b:==:b|}
\end{tabular}

첫 줄 |t:==:t:==:t|이 이중 괘선의 위쪽 절반과 모서리를, 마지막 줄 |b:==:b:==:b|이 아래쪽 절반을 만들어 바깥 테두리의 이중 괘선이 세로 괘선과 깔끔하게 이어집니다. 중간 행들은 ~(괘선 없음)와 #(세로선 사이의 이중 괘선 구간)을 섞어, 행마다 어디서 끊고 어디서 통과시킬지를 바꿉니다. 마지막으로 기술적인 주의 사항 하나. \hline은 하나의 TeX \hrule인 반면, \hhline의 선은 작은 구간 여러 개의 모음 입니다. DVI 안의 위치는 정확하지만, 뷰어나 드라이버에 따라 구간의 이음매가 보일 수 있습니다. 설명서는 다른 드라이버를 써 보거나 \arrayrulewidth를 아주 조금 키워 이음매가 눈에 띄지 않게 하라고 제안합니다.

어느 것을 쓸까

결론은 거의 하나로 좁혀집니다. 일반적인 표는 booktabs를 기본으로 삼으십시오. \toprule, \midrule, \bottomrule 세 줄과 필요할 때의 \cmidrule(lr){…}만으로도 학술지에서 보는 간결하고 읽기 좋은 표가 됩니다. “세로 괘선 금지, 이중 괘선 금지”를 따르면 괘선은 더 이상 고민거리가 아니게 됩니다.

  • booktabs — 거의 모든 표의 첫 번째 선택지. 가로 괘선만 쓰고, 굵기와 여백이 이미 조율되어 있으며, 출판 품질입니다.
  • 표준 \hline / \cline / | — 패키지가 필요 없다는 것이 장점. 격자형 표나 초고에 적합합니다. 괘선 과다에 주의하세요.
  • hhline — 이중 괘선과 세로 괘선이 만나는 방식을 정밀하게 정해야 하는 특수한 경우에만. 일상적인 도구가 아닙니다.
  • 괘선을 하나 더 긋고 싶어질 때 — 먼저 \addlinespace로 행의 묶음을 여백으로 나타낼 수 없는지 생각해 보십시오. 흰 공간은 괘선보다 가볍고 같은 일을 합니다.

괘선에 앞서 열을 어떻게 늘어놓고 어떻게 정렬하느냐가 표의 뼈대를 정합니다. &\\의 기초, Extra alignment tabMisplaced \noalign을 읽는 법은 “tabular 기초”에 있습니다. p{width}>{…}를 포함한 열 지정의 세부는 “열 지정, 정렬 및 너비”에서 다룹니다. \multicolumn\cmidrule을 조합한 다단 머리글은 “셀 병합”에 있습니다. 표를 table 환경에 담아 캡션을 붙이는 단계는 “표 배치와 스타일링”의 몫입니다.