假设我有下表,其中列出了转换规则,其中行表示输入,列表示输出类型(因此,例如,转换int8_t -> int16_t
将使用b
,而int16_t -> int8_t
将使用g
):
这个答案列出了使用 a 的替代方案\slashbox
(我最初会使用 a),这些替代方案看起来更专业。但是,他们示例中的第二个表对我来说似乎不直观/不清楚,而对于第三个表,让我感到困惑的是,在他们的示例中,行和列的域不同,因此没有必要定义行是否映射到房间,列是否映射到日期或反之亦然。
考虑到这一点,我能想到的最好的方案就是上面的方案,但看起来不太好(并且使用了垂直线,我想避免这种情况,但如果没有它,表格的含义就根本不清楚)。排版这样的表格的最佳实践是什么?
上面示例的代码:
\begin{table}
\centering
\begin{tabular}{rr|rrrrrr}
\toprule
& & \multicolumn{6}{c}{Output} \\
\midrule
& & int8\_t & int16\_t & int32\_t & uint8\_t & uint16\_t & uint32\_t \\
\multirow{6}[0]{*}{\begin{sideways}Input\end{sideways}} & int8\_t & a & b & c & d & e & f \\
& int16\_t & g & h & i & j & k & l \\
& int32\_t & m & n & o & p & q & r \\
& uint8\_t & s & t & u & v & w & x \\
& uint16\_t & y & z & a & b & c & d \\
& uint32\_t & e & f & g & h & i & j \\
\bottomrule
\end{tabular}%
\label{tab:addlabel}%
\end{table}%
答案1
首先,正如我在评论中所建议的那样,我宁愿有\midrule
下面一行:
我认为将“输出”与标题分组在逻辑上更有意义,就像您对“输入”所做的那样。
作为替代方案,slashbox
还有diagbox
。文档中的描述指出:
diagbox
是 的现代替代品slashbox
。
我也更喜欢它,它更容易定制,对角线(现在用 绘制pict2e
)也好看多了。下面是一个使用它的例子:
\begin{table}
\centering
\begin{tabular}{l|*{6}r}
\toprule
\diagbox{Input}{Output} & int8\_t & int16\_t & int32\_t & uint8\_t & uint16\_t & uint32\_t \\
\midrule
int8\_t & a & b & c & d & e & f \\
int16\_t & g & h & i & j & k & l \\
int32\_t & m & n & o & p & q & r \\
uint8\_t & s & t & u & v & w & x \\
uint16\_t & y & z & a & b & c & d \\
uint32\_t & e & f & g & h & i & j \\
\bottomrule
\end{tabular}%
\label{tab:addanotherlabel}%
\end{table}%
总体来说,这是一个不错的结果,但我对“输出”的位置有点不满意,所以我调整了表格。(幸运的是,diagbox
它相当灵活。)我得出的最终结果是经过大量修改的版本(但在我看来,视觉上最吸引人):
\begin{table}
\centering
\begin{tabular}{l|*{6}r}
\toprule
%\backslashbox{Input}{Output} & int8\_t & int16\_t & int32\_t & uint8\_t & uint16\_t & uint32\_t \\
\diagbox[width=2.5cm, height=2.5cm]{\raisebox{5pt}{\hspace*{0.25cm}Input}}{\raisebox{-1.27cm}{\rotatebox{90}{Output}}} & \raisebox{-0.25cm}{\rotatebox{90}{int8\_t}} & \raisebox{-0.25cm}{\rotatebox{90}{int16\_t}} & \raisebox{-0.25cm}{\rotatebox{90}{int32\_t}} & \raisebox{-0.25cm}{\rotatebox{90}{uint8\_t}} & \raisebox{-0.25cm}{\rotatebox{90}{uint16\_t}} & \raisebox{-0.25cm}{\rotatebox{90}{uint32\_t}} \\
\midrule\\
\hspace*{0.25cm}int8\_t & a & b & c & d & e & f \\ \\
\hspace*{0.25cm}int16\_t & g & h & i & j & k & l \\ \\
\hspace*{0.25cm}int32\_t & m & n & o & p & q & r \\ \\
\hspace*{0.25cm}uint8\_t & s & t & u & v & w & x \\ \\
\hspace*{0.25cm}uint16\_t & y & z & a & b & c & d \\ \\
\hspace*{0.25cm}uint32\_t & e & f & g & h & i & j \\ \\
\bottomrule
\end{tabular}%
\label{tab:addlabel}%
\end{table}%
最后要说的是,我认为垂直线有时是必要的,在这里使用垂直线也没什么不妥。它是一种视觉指南,有助于将表格中的逻辑组(例如,标题和原始数据)区分开来。(有关讨论,请参见此处:为什么不在表格中使用垂直线('|')?)
答案2
没有垂直规则,也没有垂直单词。输入列顶部可以写上“输入”一词,输出列可以轻松分组。我建议两种可能性。
\documentclass{article}
\usepackage{booktabs}
\begin{document}
\begin{tabular}{l*{6}{c}}
\toprule
& \multicolumn{6}{c}{Output} \\
\cmidrule(lr){2-7}
Input & int8\_t & int16\_t & int32\_t & uint8\_t & uint16\_t & uint32\_t \\
\midrule
int8\_t & a & b & c & d & e & f \\
int16\_t & g & h & i & j & k & l \\
int32\_t & m & n & o & p & q & r \\
uint8\_t & s & t & u & v & w & x \\
uint16\_t & y & z & a & b & c & d \\
uint32\_t & e & f & g & h & i & j \\
\bottomrule
\end{tabular}
\bigskip
\begin{tabular}{l*{6}{c}}
\toprule
& \multicolumn{6}{c}{Output} \\
\cmidrule(lr){2-7}
Input & int8\_t & int16\_t & int32\_t & uint8\_t & uint16\_t & uint32\_t \\
\cmidrule(lr){1-1}
\cmidrule(lr){2-7}
int8\_t & a & b & c & d & e & f \\
int16\_t & g & h & i & j & k & l \\
int32\_t & m & n & o & p & q & r \\
uint8\_t & s & t & u & v & w & x \\
uint16\_t & y & z & a & b & c & d \\
uint32\_t & e & f & g & h & i & j \\
\bottomrule
\end{tabular}
\end{document}