多行和旋转的列标题

多行和旋转的列标题

我想要排版一个带有 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 两次,以便更新放置文本的位置

您仍然需要猜测间隔表行的参数(或使用答案中的方法,但除此之外它应该是直截了当的)。

相关内容