我创建了一个表格,其列(除第一列外)仅包含一个减号或加号,因此可以非常窄。
但是这些列的标题太长了。我无法很好地将它们放进去,所以决定将它们旋转 90 度。
现在看起来好多了,但我遇到了一个新问题——我找不到在标题中引入换行符的方法,这使得它们将表格高度拉伸到超出必要的程度:
有没有办法限制高度,或者手动在标题中引入换行符?
上表的代码:
\documentclass[british]{article}
\usepackage{array}
\usepackage{multirow}
\usepackage{rotating}
\usepackage{babel}
\begin{document}
\begin{table}[!tbh]
\begin{tabular}{|l|>{\centering}p{1.5cm}|>{\centering}p{1.5cm}|>{\centering}p{1.5cm}|>{\centering}p{1.5cm}|>{\centering}p{1.5cm}|}
\hline
\multirow{2}{*}{\textbf{Strategy}} & \multicolumn{5}{c|}{\textbf{Requirement}}\tabularnewline
\cline{2-6} \cline{3-6} \cline{4-6} \cline{5-6} \cline{6-6}
& \begin{turn}{90}
First requirement
\end{turn} & \begin{turn}{90}
Second requirement
\end{turn} & \begin{turn}{90}
And so on
\end{turn} & \begin{turn}{90}
And so forth
\end{turn} & \begin{turn}{90}
And so fifth
\end{turn}\tabularnewline
\hline
\hline
\emph{Bla} & + & -- & -- & -- & +\tabularnewline
\hline
\emph{Bla bla} & -- & -- & + & -- & +\tabularnewline
\hline
\emph{Bla bla bla} & -- & + & + & -- & --\tabularnewline
\hline
\end{tabular}
\caption{\textbf{This is a table.} It shows things.}
\end{table}
\end{document}
答案1
\documentclass[british]{article}
\usepackage{array}
\usepackage{multirow}
\usepackage{rotating}
\usepackage{babel}
\begin{document}
\begin{table}[!tbh]
\begin{tabular}{|l|>{\centering}p{1.5cm}|>{\centering}p{1.5cm}|>{\centering}p{1.5cm}|>{\centering}p{1.5cm}|>{\centering}p{1.5cm}|}
\hline
\multirow{2}{*}{\textbf{Strategy}} & \multicolumn{5}{c|}{\textbf{Requirement}}\tabularnewline
\cline{2-6} \cline{3-6} \cline{4-6} \cline{5-6} \cline{6-6}
& \begin{turn}{90}
{\tabular{@{}l@{}}First\\ requirement\endtabular}
\end{turn} & \begin{turn}{90}
{\tabular{@{}l@{}}Second\\ requirement\endtabular}
\end{turn} & \begin{turn}{90}
And so on
\end{turn} & \begin{turn}{90}
And so forth
\end{turn} & \begin{turn}{90}
And so fifth
\end{turn}\tabularnewline
\hline
\hline
\emph{Bla} & + & -- & -- & -- & +\tabularnewline
\hline
\emph{Bla bla} & -- & -- & + & -- & +\tabularnewline
\hline
\emph{Bla bla bla} & -- & + & + & -- & --\tabularnewline
\hline
\end{tabular}
\caption{\textbf{This is a table.} It shows things.}
\end{table}
\end{document}
或者
\documentclass[british]{article}
\usepackage{array}
\usepackage{multirow}
\usepackage{rotating,booktabs}
\usepackage{babel}
\begin{document}
\begin{table}[!tbh]
\begin{tabular}{l>{\centering}p{1cm}>{\centering}p{1cm}>{\centering}p{1cm}>{\centering}p{1cm}>{\centering}p{1cm}}
\toprule
\multirow{2}{*}{\textbf{Strategy}} & \multicolumn{5}{c}{\textbf{Requirement}}\tabularnewline
\cline{2-6} \cline{3-6} \cline{4-6} \cline{5-6} \cline{6-6}
& \begin{turn}{90}
{\tabular{@{}l@{}}First\\ requirement\endtabular}
\end{turn} & \begin{turn}{90}
{\tabular{@{}l@{}}Second\\ requirement\endtabular}
\end{turn} & \begin{turn}{90}
And so on
\end{turn} & \begin{turn}{90}
And so forth
\end{turn} & \begin{turn}{90}
And so fifth
\end{turn}\tabularnewline
\hline
\hline
\emph{Bla} & + & -- & -- & -- & +\tabularnewline
\hline
\emph{Bla bla} & -- & -- & + & -- & +\tabularnewline
\hline
\emph{Bla bla bla} & -- & + & + & -- & --\tabularnewline
\bottomrule
\end{tabular}
\caption{\textbf{This is a table.} It shows things.}
\end{table}
\end{document}
答案2
一些建议:
如果您希望限制一段文本的宽度 - 是的,在 TeX 看来,“第一个要求”、“第二个要求”等对象都是段落 - 并保留自动换行,您可以将段落粘贴到
\parbox
语句中。\parbox
需要两个参数:(i) 整体宽度(\widthof{And so forth\ }
在下面的示例中设置为)和 (ii) 文本。我选择这个特定宽度是为了将需要换行的标题单元格数量限制为可管理的较小数量。您可以选择设置固定宽度,例如“3cm”,或任何您喜欢的宽度,而不是“动态”计算宽度。不要使用
\begin{turn} ... \end{turn}
包装器,而要使用\rotatebox{90}{...}
指令。由于该表具有 5 个数据列,因此有 5 个旋转的标题单元格,因此创建一个专用的宏(
\mybox
如下所示,但您显然可以自由选择其他名称)来管理\rotatebox
和\parbox
执行杂务很有用。由于 5 个数据列中不需要(水平)换行,我建议您将
p
列类型替换为w
列类型。(w
列类型由包提供array
。)顺便说一句,数据列的宽度为 1.5 厘米似乎太多了;在下面的代码中,我将其宽度设置为 0.75 厘米。最后但同样重要的一点是,请通过省略所有垂直线并使用更少但间距适当的水平线,使表格“看起来”更加开放。
\documentclass[british]{article}
\usepackage{array} % for 'w' column type and '\newcolumntype' macro
\newcolumntype{W}{>{$}w{c}{0.75cm}<{$}} % '1.5cm' seems excessive
\usepackage{graphicx} % \rotatebox macro
\usepackage{babel}
\usepackage{booktabs} % \toprule, \midrule, \bottomrule, \cmidrule
\usepackage{calc} % \widthof macro
%% handy shortcut macro:
\newcommand\mybox[1]{\rotatebox{90}{%
\parbox{\widthof{And so forth\ }}{\raggedright #1}}}
\begin{document}
\begin{table}[!tbh]
\centering % <-- important
\begin{tabular}{@{} >{\em}l *{5}{W} @{}}
\toprule
\textbf{\textup{Strategy}}
& \multicolumn{5}{c@{}}{\textbf{Requirements}} \\
\cmidrule(l){2-6}
& \mybox{First requirement}
& \mybox{Second requirement}
& \mybox{And so on}
& \mybox{And so forth}
& \mybox{And so fifth} \\
\midrule
Bla & + & - & - & - & + \\
Bla bla & - & - & + & - & + \\
Bla bla bla & - & + & + & - & - \\
\bottomrule
\end{tabular}
\caption{\textbf{This is a table.} It shows things.}
\end{table}
\end{document}
答案3
具有nicematrix
(≥ 2023-08-14 的 6.22)和booktabs
(并本着 的精神booktabs
):
\documentclass[british]{article}
\usepackage{babel}
\usepackage{nicematrix}
\usepackage{booktabs}
\begin{document}
\begin{table}[!tbh]
\centering
\begin{NiceTabular}{@{} >{\itshape}l *{5}{w{c}{0.75cm}} @{}}
\toprule
\RowStyle[bold]{\upshape}
Strategy
& \Block{1-5}{Requirements} \\
\cmidrule(l){2-6}
\RowStyle{\rotate}
& \Block{}{First\\ requirement}
& \Block{}{Second\\ requirement}
& And so on
& And so forth
& And so fifth \\
\midrule
Bla & $+$ & $-$ & $-$ & $-$ & $+$ \\
Bla bla & $-$ & $-$ & $+$ & $-$ & $+$ \\
Bla bla bla & $-$ & $+$ & $+$ & $-$ & $-$ \\
\bottomrule
\end{NiceTabular}
\caption{\textbf{This is a table.} It shows things.}
\end{table}
\end{document}