LoginSignup
6
6

tabularray で表作成をもっと簡単に

Last updated at Posted at 2023-08-16

tabularray パッケージは LaTeX3 を利用した新しい表作成パッケージです。

このパッケージの最大の利点は、スタイルと表コンテンツを完全に分離できる点です。ここで指定できるスタイルは、次のようなものがあります。

  • 表幅の指定
  • 列幅、列幅の比率の指定
  • 行幅の指定
  • 水平方向・垂直方向の揃い位置の指定
  • セルの結合
  • 特定のセル・行・列のスタイル指定
  • 特定のセル・行・列を数式モードに変更
  • 罫線、罫線のスタイル(太さ、破線、色)

したがって、これまで必要だった以下のようなパッケージの機能を包含しています。

  • \multicolumn(デフォルト)
  • multirow
  • array
  • tabularx
  • tabu
  • colortbl
  • threeparttable
  • langtable

このような機能を包含しているため、どのパッケージが必要かなどと考える必要がありません。(あくまで類似した機能が実装されているだけであり、パッケージそのものは読み込まれていません)

本記事では、tabularray パッケージの基本的な使い方を紹介します。また、# この節 では利用例を紹介しています。

■ tabularray の基本

tabularray パッケージは tblr 環境と longtblr 環境、talltblr 環境を提供します。longtblr 環境はページをまたぐ表を作成する環境、talltblr 環境は threeparttable パッケージに類似した環境です。
本記事では tblr 環境のみを取り扱います。

tblr 環境の基本構文は次のようになっています。

\begin{tblr}{
  % tabular style by key-value
}
%
% only tabular contents
%
\end{tblr}

tabular 環境における \begin{tabular} に続いて {lcr} などとしていたところに、表スタイルを key-value 形式で含めることが出来ます。
key-value 形式のため、それぞれの組の末尾には , が必要になることに注意してください。

表コンテンツの部分は & で区切り、\\ で改行します。\hline 等の罫線さえも必要ありません。スタイルで指定します。

セル内で改行したい場合は、セル全体を {} で囲って \\ で改行できます。

▽ ライブラリ

本記事で詳しく取り扱いませんが、いくつかのパッケージを利用したライブラリが存在します。これらのライブラリは \UseTblrLibrary から読み込みます。

ライブラリは以下があります。

  • amsmath
  • booktabs
  • counter
  • diagbox
  • functional
  • nameref
  • siunitx
  • varwidth
  • zref

特に、表内でカウンタを利用する counter、セルに斜めの罫線を引く diagbox、数値の . で揃える S を提供する siunitx は重要になる可能性があります。
また、varwidth はセル内のコンテンツにリスト等が含まれる場合に必要になります。

興味があれば、パッケージガイドを参照してください。

ちなみに、booktabs はイイ感じの太さの罫線を提供するライブラリですが、このライブラリを利用するとスタイルとコンテンツを分離できなくなります。手動で太さを指定した方が楽です。

そのため、booktabs から提供されるコマンドの横罫線の太さを覚えておくと、ちょっと便利です。

コマンド 太さ
\toprule 0.08em
\bottomrule 0.08em
\midrule 0.05em
\cmidrule 0.03em

▽ 色の指定

tabularray で色を利用する場合は xcolor を読み込む必要があります。また、xcolor が読み込まれると自動的に ninecolors が読み込まれます。

明示されていませんが、tabularray パッケージの作者は ninecolors を使って色付けするべきと主張しているようです。(と言うよりは、ninecolors と tabularray の作者は同じ人でした)

■ 揃え指定子

tabularray では、 lcr 等の基本的な指定子の他に X があります。(実際は、Q が提供されているのみです。ほかの指定子は \NewColumnType\NewRowType を利用して定義されています。)

lcr 等の指定子はこれまでと同じ効果を得るため詳細な説明は割愛しますが、代表的な以下の 9 つの指定子が利用できます。

水平 説明 垂直 説明
l 左揃え t 上揃え
c 左右中央揃え m 上下中央揃え
r 右揃え b 下揃え
j 均等割り付け h 上端揃え
f 下端揃え

tb は、コンテンツの上下が揃いますが、行全体のコンテンツはセル内で上下中央揃えになります。hf はこの行のコンテンツ全体をセルの上端・下端に揃えます。
そのため、hf は、セルの高さがセル内のコンテンツより十分に高い時に有意義になります。

加えて、非常に自由度の高い指定子 X があります。この指定子は tabularx パッケージで提供されている X のような効果に加えて、さまざまなオプションを指定できます。(tabu パッケージに着想を得ています)
例えば、次のようなオプションを含めることが出来ます。

  • 揃え指定子 (l, r, c ...etc.)
  • 列幅、行の高さ
  • 行・列の背景色・前景色

これらは , で区切って複数指定することが出来ます。例えば X[c,m] とすれば、上下・左右中央揃えになります。

さらに、X は各列幅の比率を受け付けます。
例えば X[1]X[1]X[2] とすると、次のような比率になります。

% X[1]X[1]X[2]
(1 列目の幅):(2 列目の幅):(3 列目の幅) = 1:1:2

表幅が指定されていない場合、\linewidth の表が作成されます。
また、この比率は負の数も受け付けます。

この他の指定子として、!@*| がありますが、どれも標準 LaTeX と同じ動作になります。
ただし、これらで表現するよりも column{i}vlinehline によってフォーカスされたスタイル指定の方が自由度が高いです。

■ 表幅の指定

LaTeX の表作成において最も面倒だった点は、表幅が無限に横に広がってしまう点でした。1 つのセル内に非常に長い文章を挿入すると、表は左方向へ無限大に広がってしまいます。

tblr 環境には width を指定することが出来ます。
列幅の指定には、少なくとも 1 つの指定子 X が必要になります。列の揃え位置を指定するには、colspec 内で指定します。

したがって、表幅を指定した表を作成する場合のスタイルは次のようにします。

% 幅を \linewidth の 0.8 倍に指定
width = { 0.8\linewidth },
%
% 各列幅が 1:2:3 の 3 列の表を作成
colspec = { X[1]X[2]X[3] },

■ スタイルの指定

特定のセル・行・列・罫線のスタイルを変更するには、key-value 形式で指定します。

例えば、次のようにします。
key でセル・行・列をフォーカスし、value でスタイルを指定しています。

スタイルの例
\begin{tblr}{
  column{1} = { valign = h, font = {\sffamily} },
  row{even} = { bg = blue9 },
  row{1,2} = { halign = c, font = {\bfseries\sffamily}, bg = green6, fg = white },
  cell{1}{1} = { r = 2, c = 1 }{ halign = c, valign = m },
  cell{1}{2} = { r = 2, c = 1 }{ halign = c, valign = m },
  cell{1}{3} = { r = 1, c = 2 }{ halign = c },
  cell{4}{1} = { r = 5, c = 1 }{ halign = c },
  }
  % ...
\end{tblr}

この節では、上のようなスタイル指定の概略を紹介します。

▽ 競合

複数のセルを同時にフォーカスすると、スタイルが競合する場合があります。競合した場合、後に指定されたスタイルが優先されます。

そのため、多くの場合 “列 → 行 → セル” の順でフォーカスするべきです。

▽ スタイルのフォーカス

スタイルを当てるセル・行・列・罫線のフォーカス方法は次のように行います。i には数字が入ります。

フォーカス方法 説明
cell{i}{j} ij 列のセル。{1}{1} は左上
row{i} i 番目の行。1 は最上
column{i} i 番目の列。1 は最左
hline{i} i 番目の横罫線。1 は最上
vline{i} i 番目の縦罫線。1 は最左

フォーカス位置は単独指定の他に、複数指定や範囲指定などが出来ます。

フォーカス位置 説明
{i} i 番目(単独指定)
{i,j} i 番目 と j 番目(複数指定)
{i-k} i から k 番目(範囲指定)
{odd} 奇数番目
{even} 偶数番目
{odd[i]}

{even[i]}
i 番目以降の奇数番目・偶数番目
{odd[i-k]}

{even[i-k]}
i から k 番目の奇数番目・偶数番目
{Z} 最後。ZY と続いて逆順に 6 番目の U まで指定可能

すべての要素を選択したい場合は、~s とします。

フォーカス方法 説明
cells すべてのセル
rows すべての行
columns すべての列
hlines すべての横罫線
vlines すべての縦罫線

cellsrowscolumns は実質的に同じ意味を持つことになるでしょう。

▽ 罫線のスタイル

罫線のスタイルは、罫線の太さ、色、実線・破線・点線を指定することが出来ます。
デフォルトの罫線は、太さ 0.4pt の solid(実線)、黒色となっています。

例えば、booktabs における \toprule\bottomrule の 0.08em の太さを指定する場合は、次のようにします。

% 表の最上と最下に太さ 0.08em の横罫線
hline{1,Z} = { 0.08em }

破線に変更する場合は dashed、点線にする場合は dotted を指定します。

% 1 行目と 2 行目の間に赤色破線の横罫線
hline{2} = { dashed, red }

この他にもスタイル指定キーがありますが、本記事では割愛します。

途中までの罫線

デフォルトにおける \cline のような途中までの罫線は、hline{i}vline{i} で作成することが出来ます。

例えば、2 行目と 3 行目の間(上から 3 番目)に 3 列から 5 列目までの横罫線を引く場合は、次のようにします。太さは \cmidrule に対応した 0.03em です。

% 上から 3 番目の横罫線
% 3 列目から 5 列目まで
% 太さ 0.03em、赤色、点線
hline{3} = {3-5}{ 0.03em, red, dotted }

booktabs における \cmidrule(lr){i-j} のような長さを少しトリミングするような横罫線を引くには、3 つのキーを利用します。

指定キー 説明
leftpos 左側のトリミング量
rightpos 右側のトリミング量
endpos 最左・最右端のみの調整にする(真偽値)
% 上から 2 番目の横罫線
% 3 列目から 5 列目まで
% 太さ 0.03em、左右のトリミング量 0.8、横罫線をつなげる
hline{2} = {3-5}{ 0.03em, leftpos = -0.8, rightpos = -0.8, endpos }
%
% 1 行目と 2 行目の間で `\cmidrule(lr){3-5}' とすることと同義

leftposrightpos\cmidrule における (lr) に対応し、左側・右側のトリミング量 (-1~1) を指定します。(lr) による横罫線のトリミング量は -0.8 に対応します。

endpos が無ければ横罫線がそれぞれの列に分裂してしまうので注意してください。

2 重罫線

2 重罫線にする場合は、それぞれの罫線に番号を与える必要があります。

% 1 行目と 2 行目の間の横罫線を 2 重罫線にする
%
% 2 重罫線上から 1 番目の罫線
hline{2} = {1}{-}{},
%
% 2 重罫線上から 2 番目の罫線
hline{2} = {2}{-}{},

value 側 1 つ目の {1}{2} は、上から順に引かれる横罫線のナンバリング指定となります。(vline の場合は左から順)
罫線はどれだけ重ねても問題ないようです。

value 側 2 つ目の {-} は、すべてに罫線を引くことを意味します。
そのため、横罫線で {1-5} になっていれば 1 列目から 5 列目まで引くことを意味します。

value 側 3 つ目には罫線のスタイルを指定します。

▽ セル・行・列のスタイル

セル・行・列のスタイルを指定するためのキーは、次のようなものがあります。
(この他にも、それぞれに特別なスタイル指定キーがありますが、本記事では割愛します)

指定キー 説明
halign 左右の揃え (l, c, r, j)
valign 上下の揃え (t, m, b, h, f)
bg セルの色 (background color)
fg 文字の色 (foreground color)
font フォント指定
mode セルモード (math, imath, dmath, text)
cmd セルの文字列へのコマンド(\color 等)
wd 列・セルの幅
co 各列幅の比率。co = 1X[1] に相当

例えば、1 行目のみを中央揃えやフォントを指定する場合は、次のようにします。

% 1 行目を中央揃え、フォントを太字ゴシック
row{1} = { halign = c, font = {\bfseries\sffamily} }

1 行目を特別な背景色にしつつ表の奇数番目の行に背景色をつける場合は、次のようにします。

% 1 行目:白抜きの濃い灰色
% 1 行目以外の奇数番目の行:薄い灰色
row{odd} = { bg = gray9 },
row{1} = { bg = gray4, fg = white },

上の例では、1 行目でスタイルが競合するため、row{1}row{odd} の後に指定する必要があります。

個人的に mode キーはかなり有用だと感じています。このキーによって、セル・行・列を個別に数式モードやテキストモードに変更できます。
これまでは、それぞれのセルを $ で囲むか、array パッケージで適当な数式環境用の指定子を作成する必要がありました。

■ セルの結合

セルを結合するには次のようにします。

cell{i}{j} = { 結合するセルの範囲 }{ 結合セルのスタイル }

結合セル内の文章とスタイルは cell{i}{j} でフォーカスしたセルの内容が反映されます。そのため、結合されたセル内の文章は無くなります。

例えば、1 行 1 列目から 2 行 3 列目まで 2 × 3 のセルを結合したい場合は、次のようにします。

% 1 行 1 列目のセル
% 行:下方向に 2 つ、列:右方向に 3 つを結合
% 結合セルは左右中央揃え、上下中央揃え
cell{1}{1} = { r = 2, c = 3 }{ halign = c, valign = m }

= 右側 1 つ目の括弧では、結合するセルを指定しています。r は行 (row) 下方向のセル数、c は列 (column) 右方向のセル数です。
rc が right・center ではないことに注意してください。

▽ 幅調整

セルの結合すると、列や行の幅が期待しない結果を得ることがあります。
これを hspanvspan キーを使うことで調整することが出来ます。

hspan には defaultevenminimal の 3 つの値、vspan には defaulteven の 2 つの値があります。

具体的な挙動の違いは、以下の図を参照してください。

hspace vspace
hspan option sample vspan option sample

&\\ を含んだコマンドを利用する

標準 LaTeX の tabular 環境内では、\newcommand で作成された &\\ を含むコマンドを用いることで表作成を簡易にすることが出来ます。

\newcommand{\rowContent}{ alpha & beta \\}

\begin{tabular}{ll} \hline
  \rowContent \hline
  \rowContent \hline
  \rowContent \hline
\end{tabular}

しかし、そのままの tabularray でこのような \newcommand を使ったテクニックが利用できません。
このようなテクニックを利用するには、expand キーを利用します。

\newcommand{\rowContent}{ alpha & beta \\}

\begin{tblr}[ expand = \rowContent ]{hlines}
  \rowContent
  \rowContent
  \rowContent
\end{tblr}

この expand\NewDocumentCommand で定義されたコマンドを利用できないことに注意してください。

また、functional ライブラリで作成された関数であれば、evaluate を使って同じようなテクニックを行うことが可能です。

% `\UseTblrLibrary{functional}' in preamble
\IgnoreSpacesOn
  \prgNewFunction \someFunc {m} { \prgReturn {#1 & #1 \\} }
  \prgNewFunction \otherFunc {} { \prgReturn {Other & Other \\} }
\IgnoreSpacesOff

\begin{tblr}[ evaluate = all ]{hlines}
  \someFunc{Some}
  \otherFunc
  \someFunc{Some}
  \otherFunc
\end{tblr}

\end{document}

evaluate は基本的に特定の関数を指定しますが、evaluate = all としておけば、複数の関数が利用可能になります。

■ 利用例

最後に、利用例を紹介します。

ここで紹介する利用例のプリアンブルは、以下のようになっています。

\documentclass{jlreq}
\usepackage{xcolor}
\usepackage{tabularray}

width を指定することで、セル内の長い文章を自動的に折り返されます。
また、1 行目のみすべての列を中央揃え、濃い灰色にしています。

example

LaTeX コード(折りたたみ)
\begin{tblr}{
    hline{1,Z} = { 0.08em },
    hline{2} = { 0.05em },
    width = { 0.6\linewidth },
    colspec = { X[1,c]X[4,l] },
    row{odd} = { gray9 },
    row{1} = { halign = c, font = { \sffamily\bfseries }, bg = gray6, fg = white },
  }
  文数 & 本文
    \\
  1 & 親譲の無鉄砲で小供の時から損ばかりしている。
    \\
  2 & 小学校に居る時分学校の二階から飛び降りて一週間ほど腰を抜かした事がある。
    \\
  3 & なぜそんな無闇をしたと聞く人があるかも知れぬ。
    \\
  4 & 別段深い理由でもない。
    \\
  5 & 新築の二階から首を出していたら、同級生の一人が冗談に、いくら威張っても、そこから飛び降りる事は出来まい。
    \\
  6 & 弱虫やーい。
    \\
  7 & と囃したからである。
    \\
  8 & 小使に負ぶさって帰って来た時、おやじが大きな眼をして二階ぐらいから飛び降りて腰を抜かす奴があるかと云ったから、この次は抜かさずに飛んで見せますと答えた。
\end{tblr}

counter ライブラリを利用すると、1 列目の連番を自動で作成することも出来ます。

% `\UseTblrLibrary{counter}' in preamble
\newcounter{lineNum}
\newcommand{\lineNum}{\stepcounter{lineNum}\arabic{lineNum}}
\begin{tblr}{
    hline{1,Z} = { 0.08em },
    hline{2} = { 0.05em },
    width = { 0.6\linewidth },
    colspec = { X[1,c]X[4,l] },
    row{odd} = { gray9 },
    row{1} = { halign = c, font = { \sffamily\bfseries }, bg = gray6, fg = white },
  }
  文数 & 本文
    \\
  \lineNum & 親譲の無鉄砲で小供の時から損ばかりしている。
    \\
  \lineNum & 小学校に居る時分学校の二階から飛び降りて一週間ほど腰を抜かした事がある。
    \\
  \lineNum & なぜそんな無闇をしたと聞く人があるかも知れぬ。
    \\
  \lineNum & 別段深い理由でもない。
    \\
  \lineNum & 新築の二階から首を出していたら、同級生の一人が冗談に、いくら威張っても、そこから飛び降りる事は出来まい。
    \\
  \lineNum & 弱虫やーい。
    \\
  \lineNum & と囃したからである。
    \\
  \lineNum & 小使に負ぶさって帰って来た時、おやじが大きな眼をして二階ぐらいから飛び降りて腰を抜かす奴があるかと云ったから、この次は抜かさずに飛んで見せますと答えた。
\end{tblr}

特定の行にコマンドを含めることで、表本体の書き込みを簡略しています。
また、1 行目のみすべての列を中央揃え、濃い灰色にしています。

example

LaTeX コード(折りたたみ)
\newcommand{\cmd}[1]{\texttt{\textbackslash #1}}
\begin{tblr}{
  width = { 0.6\linewidth },
  hline{1,Z} = { 0.08em },
  hline{2} = { 0.05em },
  colspec = { X[2,l]X[2,l]X[1,c] },
  column{2} = { cmd = { \cmd } },
  row{odd} = { gray9 },
  row{1} = { halign = c, bg = gray6, fg = white, font = { \bfseries\sffamily\gtfamily }, cmd = {} },
}
  記号名           & Input           & Output           \\
  キャレット       & textasciicircum & \textasciicircum \\
  チルダ           & textasciitilde  & \textasciitilde  \\
  バックスラッシュ & textbackslash   & \textbackslash   \\
  開き波括弧       & textbraceleft   & \textbraceleft   \\
  閉じ波括弧       & textbraceright  & \textbraceright  \\
  ドル記号         & textdollar      & \textdollar      \\
  アンダースコア   & textunderscore  & \textunderscore
\end{tblr}

1 列目はゴシック体にし、2 列目を mode=dmath にすることで、$ で囲まずに数式モードに変更しています。

example

LaTeX コード(折りたたみ)
\begin{tblr}{
    width = { 0.6\linewidth },
    hline{1,Z} = { 0.08em },
    hline{2-Y} = { dashed },
    colspec = { X[1,r]X[2,c] },
    column{1} = { mode = text, font = { \gtfamily } },
    column{2} = { mode = dmath },
  }
  三平方の定理   & c^2 = a^2 + b^2                                             \\
  正弦定理       & \frac{a}{\sin A} = \frac{b}{\sin B} = \frac{c}{\sin C} = 2R \\
  余弦定理       & c^2 = a^2 + b^2 - 2ab\cos C
\end{tblr}

セル結合を含んだ表です。

example

LaTeX コード(折りたたみ)
\begin{tblr}{
    width = { 0.65\linewidth },
    hline{1,Z} = { 0.08em },
    hline{3} = { 0.05em },
    hline{2} = {3-4}{ 0.04em },
    vline{4} = { dashed },
    colspec = { clX[1,l]X[1,l] },
    column{1} = { valign = h, font = {\sffamily} },
    row{even} = { bg = blue9 },
    % column{1} = { bg = {} },
    row{1,2} = { halign = c, font = {\bfseries\sffamily}, bg = green6, fg = white },
    cell{1}{1} = { r = 2, c = 1 }{ halign = c, valign = m }, % 島嶼
    cell{1}{2} = { r = 2, c = 1 }{ halign = c, valign = m }, % 地方
    cell{1}{3} = { r = 1, c = 2 }{ halign = c }, % 都道府県
    cell{4}{1} = { r = 5, c = 1 }{ halign = c }, % 本州
  }
  島嶼   & 地方               & 都道府県                 & 都道府県                                         \\
  島嶼   & 地方               & 政令指定都市あり         & 政令指定都市なし                                 \\
  北海道 & 北海道地方         & 北海道                   &                                                  \\
  本州   & 東北地方           & 宮城県                   & 青森県、岩手県、秋田県、山形県、福島県           \\
  本州   & 関東地方           & 埼玉県、千葉県、神奈川県 & 茨城県、栃木県、群馬県、東京都                   \\
  本州   & 中部地方           & 新潟県、静岡県、愛知県   & 富山県、石川県、福井県、山梨県、長野県、岐阜県   \\
  本州   & 近畿地方           & 京都府、大阪府、兵庫県   & 三重県、滋賀県、奈良県、和歌山県                 \\
  本州   & 中国地方           & 岡山県、広島県           & 鳥取県、島根県、山口県                           \\
  四国   & 四国地方           &                          & 徳島県、香川県、愛媛県、高知県                   \\
  九州   & {九州・\\沖縄地方} & 福岡県、熊本県           & 佐賀県、長崎県、大分県、宮崎県、鹿児島県、沖縄県
\end{tblr}

他の具体的な例に関しては以下の記事を参照してください。

余談

tabularray の主要な使い方を紹介しました。紹介した機能の他にもさまざまな機能があります。興味があればパッケージガイドを読んでみてください。

tabularray を使うことで、表に関するさまざまなパッケージを把握して使う必要がなくなるため、表を思い通りに作成しやすくなります。
個人的には、表作成の心的ハードルがかなり下がっているように感じます。

ただ、コンパイル速度がちょっとだけ遅くなる印象があるため、その点だけは注意が必要になります。スタイルをいじらないような表は、デフォルトの tabular 環境を利用する方が良いでしょう。

ところで、“tabularray” はどう読むのでしょうか。
個人的には「タブ・エル・アレイ」と読んでいます。tabular + array なので “l” を独立して読ますことに意味はないのですが、覚えやすかったのでこのような呼び方をしています。

6
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
6