我正在尝试对可能包含数字或符号的大矩阵的单元格进行颜色编码。(末尾为 MWE。)数字应该在单元格内齐平,但符号应该居中。通常的做法是使用\multicolumn
。我发现这会导致绘制的彩色框\cellcolor
向左延伸的程度不如应有的程度——有时如此。下面屏幕截图的“左侧错误”部分显示了这个问题;仔细查看红色箭头指向的位置。
我尝试使用一些\hfill
hack来解决这个问题\multicolumn
,但效果更糟;现在彩色框始终不会一直延伸到正确的。下面屏幕截图的“右侧错误”部分显示了这个问题;没有红色箭头,因为它一点也不微妙。
如何让单元格背景框始终保持相同的大小?
注 1:我真正想要的是所有数据单元格的宽度完全相同,无论其内容如何。
注 2:真正的表格(MWE 从中删减而来)是机器生成的,所以我不关心标记有多丑陋。
注 3:本 MWE 中的“符号”为<
和1
。
\documentclass{article}
\usepackage[table]{xcolor}
\setlength{\tabcolsep}{1pt}
\begin{document}
\section*{Wrong on the left}
\begin{tabular}{l@{\hspace{6pt}}r@{\hspace{6pt}}rrr}
& (size) & aaa & bbb & ccc \\
Aaaa aaaa & $5\,130$ &\multicolumn{1}{c}{\cellcolor{blue!75}$1$} &\multicolumn{1}{c}{\cellcolor{blue!10}\color{black!50}$<$} &\cellcolor{blue!26}$.01$ \\
Bbbb bbbb & $7\,402$ &\multicolumn{1}{c}{\cellcolor{blue!10}\color{black!50}$<$} &\multicolumn{1}{c}{\cellcolor{blue!75}$1$} &\cellcolor{blue!33}$.08$ \\
Cccc cccc & $1\,336$ &\cellcolor{blue!26}$.01$ &\cellcolor{blue!33}$.08$ &\multicolumn{1}{c}{\cellcolor{blue!75}$1$} \\
\end{tabular}
\section*{Wrong on the right}
\begin{tabular}{l@{\hspace{6pt}}r@{\hspace{6pt}}rrr}
& (size) & aaa & bbb & ccc \\
Aaaa aaaa & $5\,130$ &\cellcolor{blue!75}$1$\hfill\hbox{} &\cellcolor{blue!10}\color{black!50}$<$\hfill\hbox{} &\cellcolor{blue!26}$.01$ \\
Bbbb bbbb & $7\,402$ &\cellcolor{blue!10}\color{black!50}$<$\hfill\hbox{} &\cellcolor{blue!75}$1$\hfill\hbox{} &\cellcolor{blue!33}$.08$ \\
Cccc cccc & $1\,336$ &\cellcolor{blue!26}$.01$ &\cellcolor{blue!33}$.08$ &\cellcolor{blue!75}$1$\hfill\hbox{} \\
\end{tabular}
\end{document}
答案1
获取右侧边界\cellcolor
是一个常见问题。它无法适应不同的列分隔符,因此会将@{\hspace{6pt}}
其抛出。一种解决方法是将水平空间附加到前一列,而不是修改列分隔符(在表格规范中使用<
而不是@
)。
至于使所有数据单元的大小相同,我建议定义一个新的列类型,R
以设置所有数据列的宽度(请参阅这个答案)。
\documentclass{article}
\usepackage[table]{xcolor}
\setlength{\tabcolsep}{1pt}
\newcolumntype{R}{>{\raggedleft\arraybackslash}p{0.25in}}
\begin{document}
\section*{Correct on both}
\begin{tabular}{l@{\hspace{6pt}}r<{\hspace{6pt}}RRR}
& (size) & aaa & bbb & ccc \\
Aaaa aaaa & $5\,130$ &\multicolumn{1}{c}{\cellcolor{blue!75}$1$} &\multicolumn{1}{c}{\cellcolor{blue!10}\color{black!50}$<$} &\cellcolor{blue!26}$.01$ \\
Bbbb bbbb & $7\,402$ &\multicolumn{1}{c}{\cellcolor{blue!10}\color{black!50}$<$} &\multicolumn{1}{c}{\cellcolor{blue!75}$1$} &\cellcolor{blue!33}$.08$ \\
Cccc cccc & $1\,336$ &\cellcolor{blue!26}$.01$ &\cellcolor{blue!33}$.08$ &\multicolumn{1}{c}{\cellcolor{blue!75}$1$} \\
\end{tabular}
\end{document}
答案2
该软件包中nicematrix
有专门用于解决此类问题的工具。
在您的第一个 MWE 的代码中,我已经加载nicematrix
并{tabular}
用{NiceTabular}
密钥color-inside
(别名colortbl-like
:) 替换了。
输出直接符合预期(因为,使用nicematrix
,彩色面板是用 PGF/Tikz 绘制的,而不是用 的机制绘制的colortbl
)。
\documentclass{article}
\usepackage{xcolor}
\setlength{\tabcolsep}{1pt}
\usepackage{nicematrix}
\begin{document}
\begin{NiceTabular}{l@{\hspace{6pt}}r@{\hspace{6pt}}rrr}[color-inside]
& (size) & aaa & bbb & ccc \\
Aaaa aaaa & $5\,130$ &\multicolumn{1}{c}{\cellcolor{blue!75}$1$} &\multicolumn{1}{c}{\cellcolor{blue!10}\color{black!50}$<$} &\cellcolor{blue!26}$.01$ \\
Bbbb bbbb & $7\,402$ &\multicolumn{1}{c}{\cellcolor{blue!10}\color{black!50}$<$} &\multicolumn{1}{c}{\cellcolor{blue!75}$1$} &\cellcolor{blue!33}$.08$ \\
Cccc cccc & $1\,336$ &\cellcolor{blue!26}$.01$ &\cellcolor{blue!33}$.08$ &\multicolumn{1}{c}{\cellcolor{blue!75}$1$} \\
\end{NiceTabular}
\end{document}
此外,如果有几个相邻的单元格具有完全相同的颜色,则无论您使用哪种 PDF 查看器,都不会看到单元格之间的细白线。