1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Last updated at Posted at 2023-11-08

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

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

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

tabularray1

■ 表作成の基本方針

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

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

policy

▽ 前提

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

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

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

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

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

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

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

\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 行ずつです。そのため、次のように指定します。

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 を利用して新たな指定子を作成しておきます。これは、今回作成する表がすべてのセルで数式となっているからです。
これによって、各セルを $~$ で囲う必要がなくなります。

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

▽ 標準 LaTeX のみの方法

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

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

コードと表(折りたたみ)

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

\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

▽ multirow を利用する方法

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

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

コードと表(折りたたみ)

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

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

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

% プリアンブル
\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

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

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

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

コードと表(折りたたみ)

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

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

% プリアンブル
\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

余談

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

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

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

\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

1
1
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
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?