행이 많은 표는 곧 한 페이지에 들어가지 않아 다음 페이지로 이어져야 합니다. 하지만 보통의 tabular를 부동체인 table 환경 안에 넣은 표는 절대로 페이지를 넘어 나뉘지 않습니다. 부동체는 “한 페이지에 들어가는 덩어리”를 전제로 하기 때문입니다. 이 벽을 넘는 것이 longtable 패키지 입니다. longtable 환경은 부동체가 아니라 본문 흐름 속에 직접 놓이며, LaTeX의 일반적인 페이지 나눔 처리에 따라 여러 페이지에 걸칠 수 있습니다. 이 페이지에서는 왜 tabular만으로는 페이지를 나눌 수 없는지, longtable의 반복 머리와 꼬리(\endfirsthead, \endhead, \endfoot, \endlastfoot)가 어떻게 동작하는지, 캡션을 붙이는 법, 그리고 자동 폭 X 열도 페이지를 넘길 수 있는 xltabular 까지 살펴봅니다.
table 안의 표가 페이지를 나눌 수 없는 이유
“tabular 기본”에서 보았듯이 표의 내용을 조판하는 것은 tabular 환경이고, 그것을 “표 N”으로 배치하는 것은 부동체인 table 환경 입니다. table은 figure와 같은 부동체(float) 로, LaTeX는 이것을 한 페이지에 들어가는 하나의 덩어리로 보고 본문 중간에서 페이지 위나 아래로 전체를 이동 시킵니다. 덩어리인 이상 내부에서 페이지 나눔은 일어나지 않습니다. 따라서 안쪽 tabular가 아무리 세로로 길어져도 분할되지 않고, 페이지에 들어가지 않으면 다음 페이지 맨 위로 보내질 뿐이며, 최악의 경우 넘쳐 버립니다.
즉 “페이지를 넘어가는 표”는 부동체라는 구조 자체와 맞지 않습니다. 필요한 것은 표를 본문과 같은 글 흐름 속에 놓고, 문단처럼 자연스럽게 페이지를 나누게 하는 장치입니다. 그것이 바로 longtable입니다.
longtable 환경
longtable은 tabular의 기능을 거의 그대로 갖추면서도 TeX의 표준 페이지 나눔 알고리즘으로 분할할 수 있는 표 조판 환경입니다. 패키지 저자인 David Carlisle의 말로는 “tabular 환경의 대부분 기능을 가지지만 여러 페이지로 나눌 수 있는 표를 만든다”는 환경입니다. 사용법도 tabular와 매우 비슷하여 \begin{longtable}{spec}처럼 열 지정을 필수 인수 로 받고, 본문에서는 &로 열을 나누고 \\로 행을 닫습니다. 차이는 이것이 부동체가 아니라 본문에 직접 놓인다 는 점입니다. 따라서 \begin{longtable}…\end{longtable}를 table 환경으로 감싸면 안 됩니다.
프리앰블에서 \usepackage{longtable}로 불러옵니다. l, c, r, p{width} 같은 열 지정과 \hline, \multicolumn은 tabular와 완전히 같은 방식으로 사용할 수 있습니다. \begin{longtable}에는 열 지정 앞에 선택 인수 [c], [r], [l] 를 줄 수 있으며, 이는 표 전체를 좌우 어느 쪽으로 맞출지 정합니다(기본은 가운데). 페이지 나눔은 행과 행 사이 또는 \hline 위치에서만 일어나며, p 열의 한 행(셀) 중간에서는 분할되지 않습니다.
머리와 꼬리 반복
표가 여러 페이지로 나뉘면 두 번째 페이지 이후에도 머리글 행 을 다시 보이고 싶어집니다. longtable은 표의 앞부분에 “어떤 행을 어떤 페이지에서 반복할지” 선언하는 네 가지 마커 를 제공합니다. 각 마커는 해당 행(여러 행 가능)의 끝에서 \\ 대신 놓습니다.
\endfirsthead— 여기까지의 행은 첫 페이지 의 표 머리에만 나타납니다.\endhead—\endfirsthead뒤부터 이 마커까지의 행은 첫 페이지를 제외한 모든 페이지 의 표 머리에 반복됩니다.\endfoot—\endhead뒤부터 이 마커까지의 행은 표가 다음 페이지로 이어지는 페이지의 꼬리(즉 마지막 페이지 제외)에 나타납니다.\endlastfoot—\endfoot뒤부터 이 마커까지의 행은 표의 맨 끝, 마지막 페이지에만 나타납니다.
이 네 가지는 모두 생략할 수 있습니다. 예를 들어 모든 페이지에 같은 머리글만 내고 싶다면 \endhead만으로 충분합니다. \endfirsthead를 따로 쓰면 첫 페이지에는 캡션이 있는 다른 머리글을, 두 번째 페이지 이후에는 “(continued)” 같은 간단한 머리글을 줄 수 있습니다. \endfoot에는 다음 페이지로 이어짐을 알리는 “Continued on next page” 행을 넣는 것이 일반적입니다.
캡션과 번호
longtable은 tabular와 달리 자체 \caption{…} 를 가집니다. 번호에는 표준 table 카운터를 사용하므로 \caption{…}은 일반 표와 마찬가지로 “Table N”처럼 자동 번호 가 붙고 표 목록(\listoftables)에도 실립니다. 캡션은 표 레이아웃의 일부이므로 \caption{…}\\처럼 머리글 블록(\endfirsthead 앞)에 쓰고 끝을 \\로 닫는 것이 기본입니다.
몇 가지 실용적인 약속이 있습니다. 번호를 붙이고 싶지 않으면 \caption*{…}을 사용합니다(번호도 표 목록 항목도 없습니다). 두 번째 페이지 이후의 “(continued)” 같은 부속 캡션 은 표 목록에 중복으로 실리지 않도록 선택 인수를 비운 \caption[]{…} 로 씁니다. 상호 참조용 \label{…}은 반복되는 \endhead 머리글에 두면 안 됩니다. 여러 번 나타나기 때문입니다. \endfirsthead 안이나 표 본문에 둡니다. 캡션 폭의 기본값은 4인치이며, 바꾸고 싶다면 프리앰블에서 \setlength{\LTcapwidth}{…}를 설정합니다.
완전한 골격
네 가지 마커를 모두 사용한 longtable 골격은 다음과 같습니다. 읽는 법은 이렇습니다. 먼저 맨 앞에 첫 페이지 전용 머리글(캡션과 열 머리글)을 쓰고 \endfirsthead로 닫습니다. 이어서 두 번째 페이지 이후의 머리글(“(continued)”와 열 머리글)을 쓰고 \endhead로 닫습니다. 다음으로 계속되는 페이지의 꼬리에 나올 “Continued on next page” 행을 \endfoot으로 닫고, 마지막 페이지의 마무리 선을 \endlastfoot으로 닫습니다. 그 뒤에 진짜 데이터 행을 나열합니다. 마커들 아래에 쓴 행이 실제 표의 내용으로 각 페이지에 흘러 들어갑니다.
\documentclass{article}
\usepackage{longtable}
\begin{document}
\begin{longtable}{l l r}
% --- 1 ページ目だけの見出し ---
\caption{年間の売上記録}\\
\hline
日付 & 品目 & 金額 \\
\hline
\endfirsthead
% --- 2 ページ目以降の見出し ---
\multicolumn{3}{l}{\small (表のつづき)}\\
\hline
日付 & 品目 & 金額 \\
\hline
\endhead
% --- 続くページの脚 ---
\hline
\multicolumn{3}{r}{\small 次ページに続く}\\
\endfoot
% --- 最終ページの脚 ---
\hline
\endlastfoot
% --- ここから本物のデータ行 ---
2026-01-05 & りんご & 380 \\
2026-01-06 & みかん & 120 \\
% …行が続き、自動で改ページされる…
\end{longtable}
\end{document}이 표는 번호 붙은 캡션 “Table N: Annual sales log”를 첫 페이지에 내고, 페이지를 넘어갈 때마다 맨 위에 “(continued)”와 열 머리글을 반복하며, 계속되는 페이지 아래에는 “Continued on next page”를 붙입니다. 마지막 페이지에서는 꼬리 선만으로 조용히 마무리합니다. 데이터 행이 얼마나 늘어나도 longtable이 행의 경계에서 자동으로 페이지를 나눕니다.
한 가지 주의점이 있습니다. longtable은 열 너비와 페이지 나눔 위치를 확정하기 위해 LaTeX 처리가 두 번 이상 필요 합니다. 각 페이지의 폭을 맞추는 정보를 .aux 파일을 통해 주고받기 때문에 첫 컴파일에서는 열이 맞지 않을 수 있으며, 실제로 LaTeX는 “열 너비가 바뀌었다”는 경고를 냅니다(문서에도 “LaTeX를 여러 번 처리할 때까지 올바르게 정렬되지 않는다”고 명시되어 있습니다). latexmk 같은 빌드 도구는 필요한 횟수만큼 자동으로 다시 처리합니다.
자동 폭 줄바꿈 열: xltabular
longtable의 열 지정은 tabular와 같으므로 긴 글은 고정 폭 p{width} 열에 넣어 줄바꿈합니다. 하지만 행 폭 전체로 넓어지고 내용에 따라 폭이 자동 조정되는 열 이 필요하다면 tabularx의 X 열 이 편리합니다. “고급 표 환경(tabularx / tabularray)”에서 다루는 이 X 열은 본래 tabularx 환경의 것이며 페이지를 넘겨 분할할 수 없습니다.
이 두 장점을 하나로 합치는 것이 xltabular 패키지(Rolf Niepraschk, Herbert Voß)입니다. 저자들의 설명에 따르면 “tabularx처럼 동작하는 longtable, 한마디로 X 열 지정자를 가진 longtable”입니다. 내부에서 ltablex를 불러오지만 기존 tabularx 환경의 동작은 그대로 둡니다. 환경의 문법은 tabularx와 비슷하여 선택 배치 인수 [c] / [r] / [l], 이어서 표 전체의 총폭, 그리고 열 지정 을 받습니다. longtable의 머리 / 꼬리용 마커(\endfirsthead 등)도 그대로 사용할 수 있습니다.
\documentclass{article}
\usepackage{xltabular}
\begin{document}
\begin{xltabular}{\linewidth}{l X r}
\caption{用語と説明}\\
\hline
用語 & 説明 & 頁 \\
\hline
\endfirsthead
\hline
用語 & 説明 & 頁 \\
\hline
\endhead
longtable & ページをまたいで分割できる表組み環境。フロートではなく本文の流れに直接置かれる。 & 12 \\
xltabular & longtable と tabularx を組み合わせ、自動幅の X 列を改ページ可能にした環境。 & 34 \\
\end{xltabular}
\end{document}여기서는 총폭을 \linewidth(본문 폭)로 두고 가운데 설명 열을 X 열 로 했습니다. X 열은 남은 폭 전체로 자동 확장되어 긴 글을 줄바꿈하고, 표 전체는 longtable로서 페이지를 넘어갈 수 있습니다. 고정 폭 p{width}를 손으로 조정할 필요가 없습니다. 한 가지 작은 차이는 longtable은 항상 table 카운터를 증가시키지만, xltabular는 \caption을 쓰지 않으면 번호를 소비하지 않는다는 점입니다.