行が半分ズレた表を作成したい

<!-- # 行が半分ズレた表を作成したい -->

特定の列の行が半分だけズレた表を作成方法を紹介します。

本記事で考える表の具体例は、以下の TeX フォーラムで提起された表を利用します。

https://okumuralab.org/tex/mod/forum/discuss.php?d=2904

すなわち、以下のような表を作ることを考えます。

![tabularray1](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/e8be85cf-2df7-3574-7393-664c278877e0.png)

## ■ 表作成の基本方針

セルの内容が互い違いの表を作成して、同じセルどうしを結合すれば良いでしょう。

以下の図のようなイメージです。

![policy](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/44eb09af-dbd5-10b1-0c80-9449e73b059b.png)

### ▽ 前提

各々の表でズレの量を指定することがありますが、この量は文書クラスに依存します。
本記事での文書クラスは [jlreq][] を利用します。

[jlreq]: https://ctan.org/pkg/jlreq " jlreq- CTAN"

また、“Δ” は立体のデルタを利用したいため `\Diff` として定義しておきます。

```latex
% unicode-math を利用する場合
\newcommand{\Diff}{\upDelta}
```

## ■ tabularray パッケージを利用する方法

本記事の初めに示した表が、まさに [tabularray][] パッケージで作成した表になります。

[tabularray]: https://ctan.org/pkg/tabularray " tabularray- CTAN"

tabularray パッケージから提供される tblr 環境は、`\begin{tblr}` に続く `{}` の中でセルの細かな設定を課すことが出来ます。
これによって、表の内容とセルの設定を分けて表現することが出来ます。

本記事テーマの特定の列の行が半分だけズレた表は、次のように作成します。

```latex
\begin{tblr}{
    %
    % すべての列は中央揃え
    colspec = {ccc},
    %
    % 最左と最右に縦罫線を引く
    vline{1,Z},
    %
    % 左から 2 番目と 3 番目の縦罫線は、上を空ける
    vline{2} = {2-Z}{solid},
    vline{3} = {3-Z}{solid},
    %
    % 横罫線はすべて引く
    hlines,
    %
    % すべての列は数式環境かつ上下に中央揃え
    columns = { mode = dmath, valign = m },
    %
    % 結合するセル
    cell{even[1-Y]}{1} = { c = 1, r = 2 }{},
    cell{odd[1-Y]}{2-3} = { c = 1, r = 2}{},
    %
    % 1 行目の高さを調整（値は文書クラス依存）
    row{1} = { valign = h, belowsep = 10pt },
    %
    % ズレの大きさを微調整（値は文書クラス依存）
    row{2} = { belowsep = 8pt },
  }
  T_i    & \Diff T_i & v_i = \frac{\Diff L_i}{\Diff T_i} \\
  T_1    &           &                                   \\
  T_1    & \Diff T_1 & v_1                               \\
  T_2    & \Diff T_1 & v_1                               \\
  T_2    & \Diff T_2 & v_2                               \\
  T_3    & \Diff T_2 & v_2                               \\
  T_3    & \Diff T_3 & v_3                               \\
  T_4    & \Diff T_3 & v_3                               \\
  T_4    & \vdots    & \vdots                            \\
  \vdots & \vdots    & \vdots                            \\
\end{tblr}
```

結合するセルは、1 列目の偶数行、2-3 列目の奇数行のそれぞれ 2 行ずつです。そのため、次のように指定します。

```latex
cell{even[1-Y]}{1} = { c = 1, r = 2 }{},
cell{odd[1-Y]}{2-3} = { c = 1, r = 2}{},
```

`[1-Y]` は 1 行目から最後より 1 つ前の行までを意味しています。最終行まで指定 (`[1-Z]`) すると、存在しない行をセル結合しようとしてエラーになります。

結合されるセル内のテキスト情報は失われますが、編集する際にはすべて書き起こすと楽に編集できます。

## ■ 他の方法

tabularray を利用する方法がもっとも簡単だと思いますが、調べてみると他の方法もあるため紹介しておきます。

ここでは前提として新たに、[array][] パッケージの `\newcolumntype` を利用して新たな指定子を作成しておきます。これは、今回作成する表がすべてのセルで数式となっているからです。
これによって、各セルを `$`\~`$` で囲う必要がなくなります。

[array]: https://ctan.org/pkg/array " array- CTAN"

```latex
\usepackage{array}
\newcolumntype{C}{>{$}c<{$}}
```

### ▽ 標準 LaTeX のみの方法

各行の行間を短くし罫線の位置を調整することで、疑似的にセル結合をします。

参考：http://xyoshiki.web.fc2.com/tex/table037.tex

<details>
<summary>コードと表（折りたたみ）</summary>

行間詰めの値 (`\\[-0.9em]`) は文書クラスによって変わることに注意してください。

```latex
\begin{tabular}{|C|C|C|}
  \hline
  \multicolumn{1}{|C}{T_i} & \multicolumn{1}{C}{\Diff T_i } & \multicolumn{1}{C|}{\displaystyle v_i=\frac{\Diff L_i}{\Diff T_i}} \\
  \cline{1-1}
  T_1                      & \multicolumn{1}{c}{}           & \multicolumn{1}{C|}{} \\[-0.9em]
  \cline{2-3}
                           & \Diff T_1                      & v_1                   \\[-0.9em]
  \cline{1-1}
  T_2                      &                                &                       \\[-0.9em]
  \cline{2-3}
                           & \Diff T_2                      & v_2                   \\[-0.9em]
  \cline{1-1}
  T_3                      &                                &                       \\[-0.9em]
  \cline{2-3}
                           & \Diff T_3                      & v_3                   \\[-0.9em]
  \cline{1-1}
  T_4                      &                                &                       \\[-0.9em]
  \cline{2-3}
                           & \Diff T_4                      & v_4                   \\[-0.9em]
  \cline{1-1}
  \vdots                   &                                &                       \\[-0.9em]
  \cline{2-3}
                           & \vdots                         & \vdots                \\
  \hline
\end{tabular}
```

![standard LaTeX](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/e0c5690a-1bd2-92f6-7df5-5b6d32d26e1f.png)

</details>

### ▽ multirow を利用する方法

[multirow][] パッケージの `\multirow` コマンドを利用することで、縦方向のセルをセル結合します。

[multirow]: https://ctan.org/pkg/multirow " multirow- CTAN"

参考：https://okumuralab.org/tex/mod/forum/discuss.php?d=2904#p17022

<details>
<summary>コードと表（折りたたみ）</summary>

`\multirow` を `\mergeCell` として定義することで表内を簡略化しています。また、`\multirow` 内では列に指定した `C` が影響しないようです。

2 行 2 列目の `\multicolumn{1}{c}{}` は右側に縦罫線が引かれることを抑制しています。

セル結合をしていますが、`\hline` を使うとセル内に罫線が引かれてしまいます。

```latex
% プリアンブル
\newcommand{\mergeCell}[1]{\multirow{2}{*}{$#1$}}
%
\begin{tabular}{|C|C|C|}
  \hline
  \multicolumn{1}{|C}{T_i} & \multicolumn{1}{C}{\mergeCell{\Diff T_i}} & \multicolumn{1}{C|}{\mergeCell{\displaystyle v_i=\frac{\Diff L_i}{\Diff T_i}}} \\
  \cline{1-1}
  \mergeCell{T_1}          & \multicolumn{1}{c}{}                      &                    \\
  \cline{2-3}
                           & \mergeCell{\Diff T_1}                     & \mergeCell{v_1}    \\
  \cline{1-1}
  \mergeCell{T_2}          &                                           &                    \\
  \cline{2-3}
                           & \mergeCell{\Diff T_2}                     & \mergeCell{v_2}    \\
  \cline{1-1}
  \mergeCell{T_3}          &                                           &                    \\
  \cline{2-3}
                           & \mergeCell{\Diff T_3}                     & \mergeCell{v_3}    \\
  \cline{1-1}
  \mergeCell{T_4}          &                                           &                    \\
  \cline{2-3}
                           & \mergeCell{\vdots}                        & \mergeCell{\vdots} \\
  \cline{1-1}
  \vdots                   &                                           &                    \\
  \hline
\end{tabular}
```

![multirow](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/179ced5b-6a22-bc59-aa10-476982527a0e.png)

</details>

### ▽ collcell パッケージを利用する方法

[collcell][] パッケージを利用して、指定した列全体を下げるように構成します。

[collcell]: https://ctan.org/pkg/collcell " collcell- CTAN"

参考：https://tex.stackexchange.com/a/29542

<details>
<summary>コードと表（折りたたみ）</summary>

`\raisebox` の値は文書クラスによって変わることに注意してください。

また、横罫線を引くと奇妙な結果を得ます。（罫線自体は上下に移動しないため）

```latex
% プリアンブル
\usepackagae{collcell}
\newcommand*{\movedown}[1]{\smash{\raisebox{-5pt}{#1}}}
\newcolumntype{q}{>{\collectcell\movedown$}c<{$\endcollectcell}}
\newcommand{\headrow}[1]{\multicolumn{1}{C}{#1}}
%
\begin{tabular}{Cqq}
  \hline
  T_i    & \headrow{\Diff T_i} & \headrow{v_i = \frac{\Diff L_i}{\Diff T_i}} \\
  \hline
  T_1    & \Diff T_1           & v_1                                         \\
  T_2    & \Diff T_2           & v_2                                         \\
  T_3    & \Diff T_3           & v_3                                         \\
  T_4    & \vdots              & \vdots                                      \\
  \vdots                                                                     \\
  \hline
\end{tabular}
```

![collcell](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/af98ea2e-0e88-dc42-ea87-179b4890241a.png)

</details>

# 余談

tabularray パッケージを使えば簡単！
ほぼ自由自在に表を作成することが出来ます。

設定に関していくつか把握する必要がありますが、パッケージガイドを読めばある程度わかるようになります。
以下のような記事もあります。

https://qiita.com/Yarakashi_Kikohshi/items/b645de659cbfe8c12b36

また、tabularray パッケージであれば、ズラす列を変更した次のような図の場合でも、少しの変更で実現できます。

```diff_te_x
\begin{tblr}{
    colspec = {ccc},
    vline{1,Z},
    vline{2} = {2-Z}{solid},
-   vline{3} = {3-Z}{solid},
+   vline{3} = {2-Z}{solid},
    hlines,
    columns = { mode = dmath, valign = m },
-   cell{even[1-Y]}{1} = { c = 1, r = 2 }{},
+   cell{odd[1-Y]}{1} = { c = 1, r = 2 }{},
-   cell{odd[1-Y]}{2-3} = { c = 1, r = 2}{},
+   cell{even[1-Y]}{2-3} = { c = 1, r = 2}{},
    row{1} = { valign = h },
    row{2} = { belowsep = 8pt },
  }
  T_i    & \Diff T_i & v_i = \frac{\Diff L_i}{\Diff T_i} \\
+        & \Diff T_0 & v_0                               \\
- T_1    &           &                                   \\
+ T_1    & \Diff T_0 & v_0                               \\
  T_1    & \Diff T_1 & v_1                               \\
  T_2    & \Diff T_1 & v_1                               \\
  T_2    & \Diff T_2 & v_2                               \\
  T_3    & \Diff T_2 & v_2                               \\
  T_3    & \Diff T_3 & v_3                               \\
  T_4    & \Diff T_3 & v_3                               \\
  T_4    & \vdots    & \vdots                            \\
  \vdots & \vdots    & \vdots                            \\
\end{tblr}
```

![tabularray2](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/915302b1-9d3c-9b28-7f71-32f47795b005.png)