罫線(標準 / booktabs / hhline)

LaTeX の表が「LaTeX で作った表」だと一目で分かってしまう最大の原因は、罫線です。\hline| で引いた線は、文字にぴったり貼り付いて見えます——これは印象ではなく実測できる話で、\hline が行間に挿入するのは自分自身の太さ 0.4pt だけ、上下の空きは ゼロ です。booktabs\midrule は 0.5pt の線に加えて 4.52pt の空白を連れてきます。学術誌の表と素の LaTeX の表を分けているのは、まさにこの数ポイントの白なのです。このページでは標準の \hline\cline\vlinebooktabs\toprule\midrule\bottomrule、そして両者では届かない交点を扱う hhline を、すべて実測値付きで見ていきます。

標準の罫線 \hline・\cline・| はなぜ窮屈に見えるのか

答えは「空きを一切足さないから」です。2 行の tabular の高さを実測すると、罫線なしで 24.0pt、あいだに \hline を一本入れると 24.4pt——増えたのは \arrayrulewidth(既定 0.4pt)ちょうど、つまり線そのものの太さだけで、上下の余白は足されていません。だから線が文字に触れて見えます。さらに極端なのが \cline で、\cline{2-3} を入れても高さは 24.0pt のまま、増分はゼロ。線は行間の隙間に割り込むのではなく、既にある行送りの中に描かれます。

道具そのものは素直です。\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 の 12 倍を超えます。

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{太さ}{上}{下}(三引数すべて必須)を使いますが、これは例外的な場面のための命令で、ふだんは三本の rule で足ります。なお、罫線は必ず行の切れ目に置いてください。セルの途中で \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 の題扉の脚注に「(黄金比 φ に収束していく)」と本人が書いており、リリースのたびに末尾へ 1 桁ずつ足されてきました。要旨には 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 が一本の \hrule であるのに対し、\hhline の線は 多数の小さな区間の集まり です。DVI 上の位置は正確ですが、ビューアやドライバによっては区間の継ぎ目が見えることがあります。説明書は、別のドライバを試すか、\arrayrulewidth をわずかに増やして目立たなくすることを提案しています。

どれを使うべきか

結論はほぼ一つに絞れます。通常の表は booktabs を既定にする こと。\toprule\midrule\bottomrule の三本と、必要に応じた \cmidrule(lr){…} だけで、学術誌で見るような簡素で読みやすい表になります。「縦罫線を使わない・二重罫線を使わない」に従えば、罫線はもう悩む対象ではなくなります。

  • booktabs — ほぼすべての表の第一候補。横罫線だけ、太さと空きが調整済み、出版品質。
  • 標準の \hline / \cline / | — パッケージ不要が利点。方眼状の表や下書きに。罫線の引きすぎに注意。
  • hhline — 二重罫線と縦罫線の交わり方を細かく決めなければならない特殊な場面だけ。日常の道具ではありません。
  • 罫線を増やしたくなったら — まず \addlinespace で行のグループを空きで示せないか考える。空白は罫線より軽く、同じ仕事をします。

罫線の前に、列の並べ方と揃え方が表の骨格を決めます。&\\ の基本、Extra alignment tabMisplaced \noalign の読み解きは「tabular の基本」へ。p{幅}>{…} を含む列指定の細部は「列指定・整列・幅」へ。\multicolumn\cmidrule を組み合わせた多段見出しは「セル結合」で扱っています。表を table 環境に載せてキャプションを付ける段は「表の配置・整形」です。