嗨,我正在尝试添加这样的表格,我试过这个代码,但无法将它转换成这样的形式
\begin{document}
\begin{tabular}{|p{0.6in}|p{0.3in}|p{0.9in}|p{0.9in}|p{0.8in}|} \hline
\multicolumn{2}{|c|}{\multirow{2}{*}} &
\multicolumn{3}{|c|}{ } \\ \cline{3-5}
\multicolumn{2}{|c|}{} & S & M & H \\ \cline{1-5}
\multirow{3}{*}{SOC} & S & S & Z & VS \\ \cline{2-5}
& M & M & Z & H \\ \cline{2-5}
& H & M & Z & H \\ \hline
\end{tabular}
\end{document}
答案1
好吧,看看第 3 行,我发现您\multirow{2}{*}
没有指定单元格的内容¹。而且您没有在\multicolumn
第 4 行的内容中输入任何内容,但这是一个有希望的开始。
我会做反映表格主体的列规范,因此:
\begin{tabular}{|l| c| c| c| c| c| c| c|}
(请注意,每列都需要一个字母。另外,我建议在l
、r
或之前放置一个空格来指示列格式,以便您在使用 、c
或时更容易p
看到需要替换的内容\multicolumn
。)
对于您展示的表格,无需合并\multirow
,\multicolumn
因为您永远不会合并矩形单元格块。第一行将以两个\multirow{2}{*}{text}
命令开头,&
中间有一个。要居中,您需要
\RenewDocumentCommand{\multirowsetup}{}{\centering}
将这些标题居中。请注意,示例中的文本垂直放置是关闭的。\multirow
在放置时,假设所有行都是单行。由于第二行的标题单元格是多行的,因此定位短了半行。您可以使用第二个和第三个必需参数之间的可选参数来调整这一点:
\multirow{c}{*}[-6pt]{Operation}
(有点违反直觉,负值向下移动,正值向上移动,但我们通常会将文本向下移动)。
除了不在\multicolumn
命令的第二个参数中放置文本之外,您已经把这一点做得很好了,因为您确实需要\cline
在第一行和第二行之间使用以避免线条重叠\multicolumn
。
第二行标题将是p
列,但我们希望将它们居中。为此,我建议加载array
包以增强tabular
。然后我们可以定义一个通用的列类型,使段落居中:
\newcolumntype{H}{>{\centering}p{0.5in}}
然后对于标题单元格,我们可以这样写:
\multicolumn{1}{H|}{Gas price (in Gwei)}
或者,如果我们仍想指定列宽:²
\newcolumntype{H}[1]{>{\centering}p{#1}}
…
\multicolumn{1}{H{0.9in}|}{Gas price (in Gwei)}
这应该足以让你到达完成的桌子。
有点令人惊讶的是,这并没有给出错误。相反,它最终
\unskip
从扩展中获取\multicolumn
并使用它。现在你知道了。可能在优先级列表中排名较低,但如果被遵循.³语法的命令替换(或至少增强),这可能是一件好事(特别是如果
array
它被移入内核)\newcolumntype
\NewColumnType
\NewDocumentCommand
但是,我们真的想要让用户
C*[foo]{bar}[baz]
自己书写列规范吗?
答案2
您可以在@Don Hosek 的回答中找到全面的解释。这里只有两个“实际”示例,说明如何编写表格:
- 使用
array
和multirow
包:
\documentclass{article}
\usepackage{array, multirow}
\begin{document}
\centering
\setlength\extrarowheight{2pt}
\begin{tabular}{|p{0.6in}|p{0.3in}|p{0.9in}|p{0.9in}|p{0.8in}|}
\hline
\multicolumn{2}{|c|}{ }
& \multicolumn{3}{c|}{ } \\ \cline{3-5}
\multicolumn{2}{|c|}{ }
& S & M & H \\ \cline{1-5}
\multirow{3}{=}{SOC}
& S & S & Z & VS \\ \cline{2-5}
& M & M & Z & H \\ \cline{2-5}
& H & M & Z & H \\ \hline
\end{tabular}
\end{document}
这使:
(红线表示文本区域边框)
- 使用
tabularray
包
\documentclass{article}
\usepackage{tabularray}
\begin{document}
\centering
\begin{tblr}{width=0.915\linewidth,
colspec = {X[2,l] X[1,l] X[3,l] X[3,l] X[3,l]},
hlines, vlines
}
\SetCell[c=2,r=2]{c}
& & \SetCell[c=3]{c}
& & \\
& & S & M & H \\
\SetCell[c=1,r=3]{l} SOC
& S & S & Z & VS \\
& M & M & Z & H \\
& H & M & Z & H \\
\end{tblr}
\end{document}
这使:
如果您希望第二个表格示例具有与第一个表格相同的宽度,则可以将其宽度规定为:
\begin{tblr}{width=0.91\linewidth, % <---
colspec = {X[2,l] X[1,l] X[3,l] X[3,l] X[3,l]},
hlines, vlines
}
答案3
具有(2021-08-10{NiceTabular}
的nicematrix
≥ 6.0)。
\documentclass{article}
\usepackage{nicematrix}
\begin{document}
\centering
\begin{NiceTabular}[width=0.915\linewidth]{X[2,l] X[1,l] X[3,l] X[3,l] X[3,l]}[hlines, vlines]
\Block{2-2}{}
& & \Block{1-3}{}
& & \\
& & S & M & H \\
\Block[l]{3-1}{SOC}
& S & S & Z & VS \\
& M & M & Z & H \\
& H & M & Z & H \\
\end{NiceTabular}
\end{document}