表を組むときに打つ & は、LaTeX にとって「アンパサンド」ではありません。TeX が カテゴリコード 4「alignment tab(整列タブ)」 と呼ぶ、特別扱いの文字です。だから列数を間違えたときのエラーは ! Extra alignment tab has been changed to \cr. という、画面のどこにも出てこない語で書かれています。このページでは tabular 環境の三つの約束——& で列を区切り、\\ で行を閉じ、\hline で罫線を引く——を、その裏で動いている仕組みごと見ていきます。仕組みが見えると、初心者がほぼ必ず踏む二つのエラー Extra alignment tab と Misplaced \noalign が、暗号ではなく指示に見えるようになります。
tabular 環境の三つの記号——& と \\ と \hline
tabular の本文で意味を持つ記号は三つだけです。& は同じ行のセルとセルを区切り、\\ は行を閉じ、\hline はその位置に表幅いっぱいの横罫線を一本引きます。そして \begin{tabular} は直後に 必須の引数(列指定) を取ります。\begin{tabular}{ccc} は「中央揃えの列が 3 本」という宣言で、ここで決めた列の本数が表全体の骨格になります。& の前後の空白は無視されるので、ソース側では読みやすいように桁をそろえてかまいません。
\begin{tabular}{ccc}
\hline
A & B & C \\
D & E & F \\
\hline
\end{tabular}\\ は表専用の記号ではなく、LaTeX 全体の 改行命令 です。同じ記号が数式の pmatrix や align でも「行の区切り」として働きます。つまり「& で桁を合わせ、\\ で行を改める」という感覚は、表から数式へそのまま持ち越せます。最終行のあとの \\ は省略できますが、その下に罫線を引きたいときは必ず \\ で行を閉じてから \hline を置きます——省略すると、このページの後半で扱う Misplaced \noalign にまっすぐ突き当たります。\\ には角括弧の任意引数もあり、\\[2pt] と書けばその行の下に追加の縦の空きが入ります(負の値で詰めることもできます)。
\begin{tabular} は列指定の 前 に、角括弧で垂直位置の任意引数も取ります。\begin{tabular}[t]{…} なら表の上端を、[b] なら下端を周囲の行のベースラインに合わせ、既定では表の上下方向の中央がそろいます。ただしここに落とし穴があり、表の先頭または末尾が \hline だと 罫線の位置で揃ってしまい、期待した見た目になりません。array パッケージはこの症状のために \firsthline と \lasthline を用意しています——\hline の代わりにこれらを置けば、本文の一行目・最終行に正しく揃います。
Extra alignment tab has been changed to \cr——列数が合っていない
このエラーは 「宣言した列数より & が多い」 という一点を意味します。{ll} と宣言した表の行に A & B & C と書けば必ず出ます。TeX は数え過ぎた & を行末(\cr)に読み替えて先へ進むので、出力は消えずに 行がずれた表 ができあがります。原因の大半は列指定の数え間違いですが、意外に多いのが次の三つ——\multicolumn{3}{c}{…} が 3 列ぶんを食べているのに & も書いてしまう、セルの中に \\ を書いてしまう、そして array の >{\raggedright} を 最終列 に付けてしまう場合です。最後のものは \raggedright が \\ を再定義するせいで行末が効かなくなり、次の行の & があふれて同じエラーになります——>{\raggedright\arraybackslash} と書けば直ります。
逆に & が 少ない ぶんには何も言われません。足りないセルは空欄として組まれ、エラーも警告も出ません。だから「列がずれているのにエラーが出ない」ときは、まず & の数え漏れを疑ってください。もう一つ、列指定に知らない文字を書いた場合のエラーは 読み込んでいるパッケージによって文面が変わります。素の LaTeX では ! LaTeX Error: Illegal character in array arg.、array を読み込んでいると ! Package array Error: Illegal pream-token になります。どちらが出たかで、いま自分の表がどの実装の上に載っているかが分かります。
Misplaced \noalign——\hline は行と行のあいだにしか置けない
このエラーの原因はほぼ常に 「行を \\ で閉じないまま \hline を書いた」 ことです。最終行のあとにうっかり \\ を省いて \hline を続けると、TeX Live 2024 のログには三つのエラーが連鎖して現れます——! Misplaced \noalign.、! You can't use \hrule here except with leaders.、! Missing number, treated as zero.。三つとも同じ一つの原因から出ています。理由は \hline の定義そのものにあり、latex.ltx を開くと \def\hline{\noalign{…\hrule \@height \arrayrulewidth …}} と書かれています。\noalign は TeX の原始命令で、「整列の 行と行のあいだ にこの材料を差し込む」という意味しか持ちません。だから行の途中で呼ばれると居場所がなく、\noalign と、その中身であるはずの \hrule が、順にむき出しでこぼれ落ちるのです。
% WRONG: the last row was never closed, so \hline has no gap to sit in
\begin{tabular}{ll}
A & B \\
C & D
\hline
\end{tabular}
% RIGHT: close the row first, then draw the rule
\begin{tabular}{ll}
A & B \\
C & D \\
\hline
\end{tabular}同じ理屈から、\hline を セルの途中 に書いても同じ三連のエラーになります。逆に \hline を \\ の直後に単独で置くのは常に安全で、\hline \\ のように空行を作るのもエラーではありません(見た目の空きが増えるだけです)。tabular 周りでもう一つよく出るのが ! LaTeX Error: \caption outside float. です。これは \caption を tabular の中に書いたときの典型で、次節で説明するとおり 見出しは table の仕事 だからです。\end{tabular} の書き忘れは ! LaTeX Error: \begin{tabular} on input line N ended by \end{document}. という、行番号まで教えてくれる親切なエラーになります。
罫線の引きかたと、引かないほうがよい罫線
横罫線は \hline、縦罫線は列指定に | を書き込みます。{|l|c|r|} と書けば 3 列の外側と各列の境に縦線が入り、\hline と組み合わせれば全セルが格子になります。\hline\hline は二重罫線で、二本の間隔は長さ \doublerulesep(既定 2pt)です。罫線の太さは \arrayrulewidth という長さで、標準クラスの既定値は 0.4pt。\cline{2-3} のように列番号の範囲を指定すれば、途中の列だけに罫線を引けます。ここまでが LaTeX 標準で引ける罫線のすべてです。
| 記法 | 働き | 注意 |
|---|---|---|
& | 同じ行のセルを区切る | カテゴリコード 4。多すぎると Extra alignment tab |
\\ | 行を閉じる | 数式の align・pmatrix でも同じ役割 |
\\[2pt] | 行の下に追加の空きを入れる | 負の値で詰められる |
\hline | 表幅いっぱいの横罫線 | 太さは \arrayrulewidth(既定 0.4pt) |
\hline\hline | 二重の横罫線 | 間隔は \doublerulesep(既定 2pt) |
\cline{2-3} | 2 列目から 3 列目だけに罫線 | セル結合の下に引くときの定石 |
| | 列指定に書く縦罫線 | 専門的な表では避けるのが定石 |
|| | 二重の縦罫線 | 間隔はやはり \doublerulesep |
ところが、いま挙げた道具のうち 縦罫線と二重罫線は使わないほうがよい というのが専門の組版の立場です。booktabs の説明書『Publication quality tables in LaTeX』(Simon Fear、TeX Live 2024 同梱版は 2020 年 1 月 12 日改訂)は、二つの指針を掲げます——「1. 縦罫線は絶対に使わないこと。2. 二重罫線も使わないこと」。著者は「左半分と右半分がそれほど違うなら、表を二つに分けるべきだ」とまで書き、二重罫線については「総計行の上に二重の細罫線を要求する出版社と仕事をしたことがあるが、自分の選択ではなかった」と正直に添えています。代わりに勧められるのが 太さの異なる横罫線と、その上下にたっぷり取った空き です。
大事なのは、この指針が どんな表にも当てはまるわけではない ことです。Fear は「ラベルの付いた列に値が並ぶもの」を formal table(正式な表) と呼び、アイコンや色を伴う一回きりのレイアウトである tableau と明確に区別したうえで、二つの指針は前者について述べたものだと断っています。前者のレイアウトは「何世紀もの経験によって確立されたもので、よほどの事情がないかぎり変えるべきではない」。逆にいえば、日程表や UI の説明図のような tableau に格子を引くのは、この指針の対象外です。数値表を論文に載せるなら booktabs の \toprule/\midrule/\bottomrule を使うのが現代の定石で、詳しくは「罫線とプロ品質の表」で扱います。
行が窮屈で罫線が文字に触れて見えるときは、\renewcommand{\arraystretch}{1.2} で行の高さの倍率を上げるのが手っ取り早い方法です(既定値は 1)。列と列のあいだの空きは \tabcolsep という長さで、片側 6pt が既定なので列間は合計 12pt になります。array パッケージを読み込んでいれば \setlength{\extrarowheight}{2pt} も使えます——こちらは行の 高さだけ を増やして深さを変えないので、罫線が大文字の頭に触れる症状にちょうど効きます。
tabular と table の違い——表はフロートではない
tabular は 表の中身 を組むだけの環境で、番号もキャプションも配置の裁量も持ちません。文字と同じように扱われるので、段落の途中にも、箇条書きの項目内にも、脚注の中にさえ置けます。一方 table は フロート(浮動体) の環境で、中に tabular を入れて使い、\caption{…} による自動採番の見出し、\label{…} と \ref{…} による相互参照、[htbp] のような配置指定を与えます。\caption を tabular の中に書くと ! LaTeX Error: \caption outside float. になるのは、この役割分担がそのままエラーになったものです。
\begin{table}[htbp]
\centering
\caption{Quarterly sales}
\label{tab:sales}
\begin{tabular}{lrr}
\hline
Quarter & Sales & YoY \\
\hline
Q1 & 1{,}200 & +5\% \\
Q2 & 1{,}350 & +8\% \\
\hline
\end{tabular}
\end{table}
% ... and refer to it from the running text:
See Table~\ref{tab:sales}.フロートにする理由は、番号が付くこと以上に tabular が改ページできない ことにあります。tabular は一枚の大きな箱として組まれるので、ページの残りに入らなければ箱ごと次ページへ押し出され、その手前に大きな空白が残ります。table に入れておけば、LaTeX はその箱を後続ページの上部などへ移し、空いた場所を本文で埋めてくれます。[htbp] は「ここ(here)/ページ上部(top)/ページ下部(bottom)/独立したページ(page)」という希望の並びで、LaTeX はこの順に置き場所を探します。それでも一枚に収まらないほど縦に長い表は、そもそもフロートでは扱えません——ページをまたいで分割できる longtable の出番です。
長い文章を含む表——p{幅} がないと紙からはみ出す
l・c・r の三つは列を 内容の自然な幅 に広げるだけで、行内では折り返しません。だから長い説明文をそのまま l 列に入れると、列は一行ぶんの長さまで横に伸び、表が版面をはみ出します。このとき出るのが警告 Overfull \hbox (…pt too wide) です——エラーではないので コンパイルは通ってしまい、PDF を見て初めて気づくのがこの症状の厄介なところです。折り返しが要るなら、素の tabular で使える列指定は p{幅} ただ一つ。指定した幅の段落ボックスとして組まれ、内容が幅を超えると自動的に次の行へ流れます。
\begin{tabular}{l p{5cm} r}
\hline
Item & Description & Price \\
\hline\hline
Apple & A large honey-cored variety, popular as a gift. & 380 \\
Orange & A small, sweet citrus that peels by hand. & 120 \\
\hline
\end{tabular}1 列目は自然な幅の左揃え、3 列目は右揃え、2 列目だけが幅 5cm の p 列です。長い説明はその 5cm で折り返し、そのセルだけが複数行になって行の高さが伸びます。同じ文章を l 列に入れれば折り返さずに横へ伸びるだけ——これが p{幅} との決定的な違いです。見出し行の下は \hline\hline の二重罫線、上端と下端は \hline の一本罫線にしてあります。p 列の中身は既定で上端揃え・両端揃えになり、段落の字下げ \parindent は 0 に設定されます。縦位置を行の中央や下端にしたい、あるいは左寄せ(ラグドライト)で組みたいというときは array パッケージの領域で、「列指定の詳細」で扱います。