我想要排版一个带有 rotatetd 列标题的表格(到目前为止它可以工作)跨越多行。
问题似乎在于multirow
无法调整表格的行高,因此我必须手动进行调整,而我对此很纠结。
采用 Werner 稍加改进的解决方案(https://tex.stackexchange.com/a/32687/19326),我得到了旋转并且可以换行。
我现在想计算一下我需要拉伸“拉伸列”的高度。我需要计算的值显然是旋转框的高度减去我跨越的行的高度。
如何获取行高?最简单的计算方法是什么objectheight - rowheight1 -rowheight2
?
这是我目前拥有的代码:
\documentclass{report}
\usepackage{xparse}
\usepackage{booktabs}
\usepackage{multirow}
\usepackage{graphicx}
\usepackage{pbox}
\usepackage{rotating}
\usepackage{calc}
%\NewDocumentCommand{\rot}{O{90} O{1em} m}{\makebox[#2][l]{\rotatebox{#1}{\pbox[t]{\textwidth}{#3}}}}%
\NewDocumentCommand{\rot}{O{90} O{1em} m}{\makebox[#2][l]{\begin{turn}{#1}{\pbox[t]{\textwidth}{#3}}\end{turn}}}%
\begin{document}
\newlength{\myl}
\settowidth{\myl}{Long Long}
\the\myl
\begin{tabular}{cccc}
\toprule
& \multirow{3}{*}{\rot{Long Long\\ text}}& & \\[\the\myl] %column which I want to stretch
Sample & & \multicolumn{2}{c}{Group} \\
\rot{a} & & A & B \\
\midrule
data & data & data & data \\
\bottomrule
\end{tabular}
\widthof{test}
\end{document}
注意:我想使用,\widthof{test}
因为这对我来说比长度摆弄更容易,但是在我的情况下\widthof{test}
命令实际上是排版。test
我在看旋转多行单元格中的文本超出表格边框(基本上,我从哪里得到了调整行高的想法,但我不确定我的行高是否总是\normalbaselineskip
)和如何旋转多行表中的文本?这没有帮助,因为它关注的是旋转文本的定位,而不是拉伸行组以容纳文本。
答案1
该makecell
软件包提供了实现该功能所需的所有工具。它允许在单元格中换行、对列标题进行通用格式设置以及多行旋转标题。以下是可以非常简单地完成的三种变体:
\documentclass{report}
\usepackage{booktabs}
\usepackage{graphicx}
\usepackage{rotating, multirow}
\usepackage{makecell}
\renewcommand\theadfont{\bfseries}
\begin{document}
\settowidth{\rotheadsize}{\bfseries Long long\quad}
\begin{tabular}[t]{cccc}
\toprule
\addlinespace[-2ex]
\thead{Sample }& \rothead{Long long\\ text}& \multicolumn{2}{c}{\thead{Group}} \\
\turnbox{90}{a} & & A & B \\
\midrule
data & data & data & data \\
\bottomrule
\end{tabular}
\qquad
\renewcommand\theadalign{bc}
\begin{tabular}[t]{cccc}%
\toprule
\addlinespace[6.5ex]%
\thead{Sample } && \multicolumn{2}{c}{\thead{Group}} \\%[6.5ex]
\turnbox{90}{a} &\multirowthead{-4}[0.3ex]{\rothead{\\[5ex]Long long\\ text}} & A & B \\
\midrule
data & data & data & data \\
\bottomrule
\end{tabular}
\vskip1cm
\begin{tabular}[t]{cccc}%
\toprule
\addlinespace[4ex]%
\thead{Sample } && \multicolumn{2}{c}{\thead{Group}} \\[3ex]
\turnbox{90}{a} &\multirowthead{-4}[0.3ex]{\rothead{\\[5ex]Long long\\ text}} & A & B \\
\midrule
data & data & data & data \\
\bottomrule
\end{tabular}
\end{document}
答案2
我希望这会对你有帮助,试试这个
\settototalheight{\myl}{\hbox{%
\begin{tabular}{cccc}
\\
Sample & & \multicolumn{2}{c}{Group} \\
\rot{a} & & A & B \\
\end{tabular}}}
\the\myl
\settototalheight{\myl}{\hbox{%
\begin{tabular}{cccc}
Sample & & \multicolumn{2}{c}{Group} \\
\rot{a} & & A & B \\
\end{tabular}}}
\the\myl
所以我认为你需要使用\\[\dimexpr\myl-3em\relax]
答案3
我根据@Bernards 的回答进行了研究。但是,正如所指出的,必须猜测multirow
和的正确值垂直对齐 在多行中 是 难的。(我发现的所有答案都是这样的:不要使用多行,而是用这种方法解决。
咆哮似乎是时候实现更好的多行了。然而,我确实不是知道表中的机制,所以我不确定是否可行。/咆哮
我使用 tikz 解决了这个问题。我标记坐标,稍后添加文本。这样文本就不会拉伸它所在的行,因此我必须自己处理拉伸。但是,如示例所示,我不想拉伸包含文本的列,所以这是预期的。
现在终于是代码了:
\documentclass{report}
\usepackage{booktabs}
\usepackage{pbox}
\usepackage{rotating}
\usepackage{tikz}
\usepackage{xparse}
\NewDocumentCommand{\rot}{O{90} O{1em} m}{\makebox[#2][l]{%
\rotatebox{#1}{\pbox[t]{#2}{#3}}}%
}
\begin{document}
\begin{table*}
\centering
\begin{tabular}{llcccc}
\toprule
&&&&&\\[2.em]
\bfseries{Example} & \bfseries{Platform} & &
& \multicolumn{2}{c}{\bfseries{Peak Bandwidth}}\\
\cmidrule(l){5-6}
&
&\,\begin{tikzpicture}[remember picture, baseline=0]\coordinate (h1);\end{tikzpicture}\,
&\,\begin{tikzpicture}[remember picture, baseline=0]\coordinate (h2);\end{tikzpicture}\, & Read & Write \\
\midrule
\bottomrule
\end{tabular}
\begin{tikzpicture}[remember picture, overlay,
every node/.append style={
rotate=90, anchor=west, inner sep=0, align=left,
execute at begin node=\setlength{\baselineskip}{1.5ex}}]
\node at (h1) {Open Source};
\node at (h2) {Multi\\Row};
\end{tikzpicture}
\end{table*}
\end{document}
注意:你需要运行 tex 两次,以便更新放置文本的位置
您仍然需要猜测间隔表行的参数(或使用答案中的方法,但除此之外它应该是直截了当的)。