表の 1 行目だけ中央揃えにしたい

# 表の 1 行目だけ中央揃えにしたい

LaTeX で表を作成する場合、すべてのセルが `\begin{tabular}` に続く揃え位置に従います。そのため、`\begin{tabular}{lll}` のような表はすべて左揃えになり、1 行目は中央揃え、2 行目以降は左揃えのような表を作成することは出来ません。

HTML における表では、デフォルトで表の 1 行目のが太字中央揃えになっていますが、LaTeX ではそのようになっていません。そもそも、LaTeX には HTML における `<thead>` のような概念が無いようです。

本記事では、表の 1 行目だけ中央揃えにする方法を考えます。

## ■ 前提

本記事では、サンプルを作成する際に次の文書クラスとパッケージを利用します。

- 文書クラス：
    - [standalone][]
    - [jlreq][]
- 表作成：
    - [tabularx][]
    - [booktabs][]
- ダミーテキスト：
    - [lipsum][]
    - [bxjalipsum][]

また、実行は LuaLaTeX を利用します。特に制約はないので、(u)pLaTeX でも動作するはずです。

## ■ デフォルトでの対応

[`\multicolumn` コマンド][cmd-multicolumn] を使ってある種の悪用をします。

[cmd-multicolumn]: http://latexref.xyz/_005cmulticolumn.html "\multicolumn (LaTeX2e unofficial reference manual)"

`\multicolumn{}{}{}` は本来、横のセルを結合するコマンドです。1 つ目の引数に結合するセルの数、2 つ目の引数に揃え位置の指定、3 つ目の引数にセルの内容を与えます。

本来、1 つ目の引数には `2` 以上の数を与えることで横向きにセルを結合しますが、これに `1` を与えます。これに加えて、2 つ目の引数に `c`（中央揃え）を指定します。

```latex
\multicolumn{1}{c}{...}
```

これによって、特定のセルだけが中央揃えになります。

実際にこれをそのまま利用するには面倒なので、次のように新しいコマンドとして定義しておくと良いでしょう。太字にしたい場合は、`\textbf` で強調しておくと良いでしょう。

```latex
\newcommand{\thead}[1]{\multicolumn{1}{c}{#1}}
% or
\newcommand{\thead}[1]{\multicolumn{1}{c}{\textbf{#1}}}
```

これを利用することで、次のような表を作成することが出来ます。

```latex
\documentclass[ class = jlreq, border = 2pt ]{standalone}
\usepackage{lipsum, bxjalipsum}
\usepackage{booktabs, tabularx}
\newcommand{\thead}[1]{\multicolumn{1}{c}{\textbf{#1}}}
\begin{document}

\begin{tabularx}{0.8\linewidth}{XX}
  \toprule
  \thead{日本語}           & \thead{English} \\
  \midrule
  \jalipsum[1]{kusamakura} & \lipsum[1][1]   \\
  \jalipsum[2]{kusamakura} & \lipsum[1][2]   \\
  \bottomrule
\end{tabularx}

\end{document}
```

![define new command](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/80aeb2d0-41a6-9dd9-00c8-67d6912a4821.png)

期待した通りの結果を得ることが出来ました。

## ■ makecell パッケージの利用

[makecell][] パッケージでは、上述した機能を有した `\thead` コマンドが提供されています。

makecell パッケージから提供される `\thead` で指定されたセルは中央揃えになりますが、`\footnotesize` が適用されます。そのため、これを変更したい場合は `\theadfont` を再定義します。

太字にしたい場合は次のようにします。

```latex
\renewcommand{\theadfont}{\bfseries}
```

これを利用することで、次のような表を作成することが出来ます。

```latex
\documentclass[ class = jlreq, border = 2pt ]{standalone}
\usepackage{lipsum, bxjalipsum}
\usepackage{booktabs, tabularx}
\usepackage{makecell} \renewcommand{\theadfont}{\bfseries}
\begin{document}

\begin{tabularx}{0.8\linewidth}{XX}
  \toprule
  \thead{日本語}           & \thead{English} \\
  \midrule
  \jalipsum[1]{kusamakura} & \lipsum[1][1]   \\
  \jalipsum[2]{kusamakura} & \lipsum[1][2]   \\
  \bottomrule
\end{tabularx}

\end{document}
```

![use makecell package](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/e9ec4878-8c0c-fd99-8483-d471dc151116.png)

概ね `\multicolumn` を利用した方法と同じ結果になりました。

`\multicolumn` を用いた方法との大きな違いは、makecell パッケージの `\thead` コマンドはコマンド内部で改行を許すことです。

```latex
\documentclass[ class = jlreq, border = 2pt ]{standalone}
\usepackage{lipsum, bxjalipsum}
\usepackage{booktabs, tabularx}
\usepackage{makecell} \renewcommand{\theadfont}{\bfseries}
\begin{document}

\begin{tabularx}{0.8\linewidth}{XX}
  \toprule
  \thead{日\\本\\語}       & \thead{English} \\
  \midrule
  \jalipsum[1]{kusamakura} & \lipsum[1][1]   \\
  \jalipsum[2]{kusamakura} & \lipsum[1][2]   \\
  \bottomrule
\end{tabularx}

\end{document}
```

![thead command provided by makecell arrows break lines](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/afe3f719-667a-33ec-f2f2-d3e087306107.png)

あくまで縦書きではないことに注意してください。

この他にもさまざまなコマンドが提供されています。詳しくはパッケージガイドを参照してください。

## ■ tabularray パッケージの利用

[tabularray][] パッケージから提供される tblr 環境では、表作成で必要になる機能が揃っています。

tblr 環境の大きな特徴の 1 つとして、`\begin{tblr}` に続く引数に表のスタイルを指定できます。そのため、表自体にスタイルのためのコマンドを持ち込む必要がありません。

tblr 環境を利用することで、次のような表を作成できます。

```latex
\documentclass[ class = jlreq, border = 2pt ]{standalone}
\usepackage{lipsum, bxjalipsum}
\usepackage{tabularray}
\begin{document}

\begin{tblr}{
    width = { 0.8\linewidth },
    hline{1,Z} = { 0.08em },
    hline{2} = { 0.05em },
    colspec = { XX },
    row{1} = { halign = c, font = \bfseries },
  }
  日本語                   & English       \\
  \jalipsum[1]{kusamakura} & \lipsum[1][1] \\
  \jalipsum[2]{kusamakura} & \lipsum[1][2]
\end{tblr}

\end{document}
```

![use tabularray package](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/7e2857a5-9010-6e51-ccfb-bb556464ab51.png)

ざっくり解説すると、次のようになっています。

- `width`：表の幅を指定します
- `hline`：引数の位置に水平線を引きます
    - `hline{1,Z}` は、表の最上と最下に引きます
    - `hline{2}` は、表の 1 行目と 2 行目の間に引きます
    - 太さは booktabs パッケージに対応しています
        |           コマンド            |  太さ  |
        | :---------------------------: | :----: |
        | `\toprule` <br> `\bottomrule` | 0.08em |
        |          `\midrule`           | 0.05em |
    - 色や線のスタイルも変更できます
- `colspec`：列の揃い位置を指定します
    - tabularx パッケージと同様の `X` を指定しています
- `row{1}`：行 1 のスタイルを指定します
    - `halign` は水平方向の揃い位置を構成し、`c` によって中央揃えを指定しています
    - `font` はフォントを構成し、`\bfseries` を指定することで太字にしています

ちなみに、この表の設定は順序を問うため、`calspec` と `row{1}` を逆順にすると `row{1}` の `halign` 設定が無視されてしまいます。（例によって、後の設定が優先されます）

実例は避けますが、tblr 環境では `{}` でセルを囲うとセル内の改行が可能です。

# 余談

tabularray パッケージ便利〜〜。

記事内では `\textbf` あるいは `\bfseries` のみにしていますが、ラテン文字をサンセリフ体にしたい場合は次のようにしておくと良いでしょう。

```latex
{\bfseries\gtfamily\sffamily}
% or
{\gtfamily\sffamily}
```

otf パッケージを利用して多書体化している場合は、`\bfseries` を除いた `{\gtfamily\sffamily}` のみにしておくと良いです。

[standalone]: https://ctan.org/pkg/standalone "CTAN: Package standalone"
[jlreq]: https://ctan.org/pkg/jlreq "CTAN: Package jlreq"
[tabularx]: https://ctan.org/pkg/tabularx "CTAN: Package tabularx"
[booktabs]: https://ctan.org/pkg/booktabs "CTAN: Package booktabs"
[lipsum]: https://ctan.org/pkg/lipsum "CTAN: Package lipsum"
[bxjalipsum]: https://ctan.org/pkg/bxjalipsum "CTAN: Package bxjalipsum"
[makecell]: https://ctan.org/pkg/makecell "CTAN: Package makecell"
[tabularray]: https://ctan.org/pkg/tabularray "CTAN: Package tabularray"