特定の列の行が半分だけズレた表を作成方法を紹介します。
本記事で考える表の具体例は、以下の TeX フォーラムで提起された表を利用します。
すなわち、以下のような表を作ることを考えます。
■ 表作成の基本方針
セルの内容が互い違いの表を作成して、同じセルどうしを結合すれば良いでしょう。
以下の図のようなイメージです。
▽ 前提
各々の表でズレの量を指定することがありますが、この量は文書クラスに依存します。
本記事での文書クラスは 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}
▽ 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}
▽ 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}
余談
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}