f

アーカイブ

2013-11-24

Problem of longtable, booktabs and rowcolors

昨年から抱えていたLaTeXの表の着色に関する問題が解決したのでその方法をメモする。
主に欧米の学術系の文書で使われる表は、縦の罫線を引かずに以下3箇所にのみ罫線を引く形式を取っていることが多い。
  • 上端
  • ヘッダーの下
  • 下端
テキストで書くと以下の様な表である。
-----
header
-----
line1
line2
-----
この形式の表のことをフォーマル形式と呼ぶことがある。
LaTeXではbooktabsというパッケージがあり、このパッケージを使うことで論文などで使われるフォーマル形式の表を作れる。以下のようにして使う。
\begin{tabular}{ccc}
\toprule 
 &  & \tabularnewline
\midrule
 &  & \tabularnewline
 &  & \tabularnewline
\bottomrule
\end{tabular}
booktabsパッケージで定義されている\topruleと\bottomruleは少し太めの線で、\midruleは細めの線となる。
このパッケージは特にLyXでは便利である。Insert ▷ Tableから表を挿入した後、表を右クリック ▷ More… ▷ Settings… ▷ Bordersタブ ▷ Style ▷ Formalに✔をつけることでフォーマル形式の表に切り替わる。フォーマル形式に切り替えることで縦の罫線がすべて消える。
このフォーマル形式の表は罫線が最低限であるためすっきりしていて見やすい。そのため、自分で作っている表はすべてこの形式で作ることにしている。なお、セル内の項目が複数行にまたがったり、列数が増えて表が大きくなる場合行の対応がわかりづらくなる。そういう場合は行を交互に色を付ける(ストライプをかける)ことで、巨大な表でも行の対応がわかりやすくなる。
LaTeXでこうした表のストライプを実現するにはxcolorパッケージで定義されているrowcolorsコマンドを使う。
\usepackage[table]{xcolor}
\usepackage{booktabs}
​
\begin{tabular}{ccc}
\toprule 
\rowcolors{2}{white}{yellow} &  & \tabularnewline
\midrule
 &  & \tabularnewline
 &  & \tabularnewline
\bottomrule
\end{tabular}
こうすることで非常にすっきりとしてみやすい表を作ることができる。
しかし、longtale環境ではここまで説明してきた色付きのフォーマル形式の表を作るときに問題が生じる。booktabsパッケージの\tobruleと\midruleコマンドと\rowcolorsコマンドが競合するようでうまく色が塗られない。例えば、上記の例のtabularをlongtableで置き換えた場合、本来なら1行目のヘッダーは白色(無色)であるはずなのだが、黄色になってしまう。この現象は\topruleや\midruleが表にあると、rowcolorsではそのコマンド自体を1行とカウントして色が塗られているためだと推測できる(詳細の原因は不明)。
今までの対処法は以下2通り。
  1. 罫線(\miderule)を使わない。
  2. 表の1行目に以下のコマンドを記入して無理やり白色で上塗り
    \rowcolor{white}
    
フォーマル形式の表でも項目をはっきりと区別するときに途中で行罫線を引きたいことはありえるし、tabularとlongtableで表の着色を統一するためにもこの問題は解決したい。ネットで探したがこういう問題があることは認識されている程度で解決方法は見当たらなかった。
この問題は\topruleと\midruleコマンドを再定義することで解決した。booktabsパッケージを見ると、\topruleと\bottomruleの罫線太さは\heavyrulewidthとなっており、\midruleの太さは\lightrulewidthとなっている。これらの標準値を以下の表にまとめた。

Table 1 booktabsパッケージの長さ・太さの標準値
booktabs lengthdefault
\heavyrulewidth0.08 em
\lightrulewidth0.05 em
\abovetopsep0 pt
\aboverulesep0.4 ex
\belowrulesep0.65 ex
この長さに対応するhlineを割り当てることでmidruleとtopruleコマンドを代替する(bottomruleはrowcolorに影響を与えないので無視)。以下が修正のためのコマンド。

\usepackage{booktabs} % フォーマル形式の表(縦線なし) [121112]
%% longtableでtopruleとmiddleruleがrowcolorsに対応しないので同長のhlineで再定義[20131123]
% ただし二重線は線同士の余白がないのでくっつく
\def\midrule{\noalign{\global\arrayrulewidth0.05em}\hline\noalign{\global\arrayrulewidth 0.4pt}}
\def\toprule{\noalign{\global\arrayrulewidth0.08em}\hline\noalign{\global\arrayrulewidth 0.4pt}}
これでlongtableでもrowcolorsが正しく動作する。ただし、midruleが2回連続してもmidrule同士の余白が調整されず重なってしまうため、====のような二重の罫線を引くことができないので注意すること。

0 件のコメント:

コメントを投稿