我想创建一个列标题旋转的图表,如这个玩具示例所示:
我使用该rotating
包生成了上述内容。它有一些缺点:旋转命令没有为标题留出空间,所以我必须手动留出空间以防止重叠。相比之下,旋转命令会创建太多空间,其中每列的宽度等于整个旋转列标题的宽度。
也没有简单的方法将长标题分成多行。
是否有用于创建此类表格的软件包,或者至少可以减轻创建此类表格所需的一些手动放置和间距操作?
这个问题更多的是为了确保我不会错过任何简单的方法来做我想做的事情,而不是寻求手动完成的帮助,但上面的代码无论如何都包含在内:
\begin{tabular}{r|ccc}
&
\begin{rotate}{60} Property 1 \end{rotate} &
\begin{rotate}{60} Property 2 \end{rotate} &
\begin{rotate}{60} Property 3 \end{rotate} \\ \hline
System 1 & & & X \\
System 2 & X & X & X \\
System 3 & X & & X \\ \hline
\end{tabular}
答案1
您可以使用adjustbox
包来旋转内容并限制其官方宽度。我还建议使用单独的宏\newcolumntype
以及\rot
插入所需\multicolumn
命令的宏。您无法避免这一点。但是,这样的宏必须完全可扩展并直接以 开头\multicolumn
。如果您想要多行标题,请将minipage=<width>
选项添加到\adjustbox
。
\documentclass{article}
\usepackage{adjustbox}
\usepackage{array}
\newcolumntype{R}[2]{%
>{\adjustbox{angle=#1,lap=\width-(#2)}\bgroup}%
l%
<{\egroup}%
}
\newcommand*\rot{\multicolumn{1}{R{45}{1em}}}% no optional argument here, please!
\begin{document}
\begin{tabular}{r|ccc}
&
\rot{Property 1} &
\rot{Property 2} &
\rot{Property 3}
\\ \hline
System 1 & & & X \\
System 2 & X & X & X \\
System 3 & X & & X \\ \hline
\end{tabular}
\renewcommand*\rot{\multicolumn{1}{R{60}{1em}}}% no optional argument here, please!
\begin{tabular}{r|ccc}
&
\rot{Property 1} &
\rot{Property 2} &
\rot{Property 3}
\\ \hline
System 1 & & & X \\
System 2 & X & X & X \\
System 3 & X & & X \\ \hline
\end{tabular}
\renewcommand*\rot[2]{\multicolumn{1}{R{#1}{#2}}}% no optional argument here, please!
\begin{tabular}{r|ccc}
&
\rot{90}{1em}{Property 1} &
\rot{60}{1em}{Property 2} &
\rot{45}{2em}{Property 3}
\\ \hline
System 1 & & & X \\
System 2 & X & X & X \\
System 3 & X & & X \\ \hline
\end{tabular}
\end{document}
答案2
将旋转的内容包装在固定宽度的框中,您可以轻松操纵每个列标题的预期宽度。所有这些,包括旋转,都可以包装在宏中,这样您的代码读起来会更好一些。此外,一些旋转和宽度规范可以赋予默认值,因此您只需在特殊情况下担心它们。
在下面的最小示例中,命令以角度(默认为度)\rot[<angle>][<width>]{<stuff>}
旋转并将其固定为宽度(默认为)。前两个参数是可选的,而最后一个是必需的。<stuff>
<angle>
45
<width>
1em
\documentclass{article}
\usepackage{graphicx} % http://ctan.org/pkg/graphicx
\usepackage{booktabs} % http://ctan.org/pkg/booktabs
\usepackage{xparse} % http://ctan.org/pkg/xparse
% Rotation: \rot[<angle>][<width>]{<stuff>}
\NewDocumentCommand{\rot}{O{45} O{1em} m}{\makebox[#2][l]{\rotatebox{#1}{#3}}}%
\begin{document}
% ===== DEFAULT ROTATION PARAMETERS
\begin{tabular}{lccc}
& \rot{Property 1}
& \rot{Property 2}
& \rot{Property 3} \\
\midrule
System 1 & & & X \\
System 2 & X & X & X \\
System 3 & X & & X \\
\bottomrule
\end{tabular}
\bigskip
% ===== MODIFIED ANGLE ROTATION
\begin{tabular}{lccc}
& \rot[60]{Property 1}
& \rot[60]{Property 2}
& \rot[60]{Property 3} \\
\midrule
System 1 & & & X \\
System 2 & X & X & X \\
System 3 & X & & X \\
\bottomrule
\end{tabular}
\bigskip
% ===== MODIFIED ANGLE & WIDTH ROTATION
\begin{tabular}{lccc}
& \rot[25][3em]{Property 1}
& \rot[25][3em]{Property 2}
& \rot[25][3em]{Property 3} \\
\midrule
System 1 & & & X \\
System 2 & X & X & X \\
System 3 & X & & X \\
\bottomrule
\end{tabular}
\end{document}
对我来说,这可以减少手动交互,因为一些参数是默认设置的。
答案3
最简单的方法(至少对我来说):
在文档的序言中添加(任何您喜欢的位置):
\def\rot{\rotatebox}
然后,在表格内部,如果你想旋转某个单元格,只需将其包裹起来内容:
\rot{angle}{content}
在哪里角度去以度为单位。
就是这样!
答案4
还有一个可能的解决方案:使用\makecell
和rotating
包:
\documentclass{article}
\usepackage[english]{babel}
\usepackage{makecell,rotating}
\setcellgapes{5pt}
\begin{document}
\begin{center}
\makegapedcells
\settowidth\rotheadsize{\theadfont Property 1}
\renewcommand\cellrotangle{45}
\begin{tabular}{r|ccc}
& \rothead{Property 1} &
\rothead{Property 2} &
\rothead{Property 3} \\ \hline
System 1 & & & X \\
System 2 & X & X & X \\
System 3 & X & & X \\ \hline
\end{tabular}
\end{center}
\end{document}