![如何使用 dcolumn 表格格式和彩色值进行处理?](https://linux22.com/image/395788/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%20dcolumn%20%E8%A1%A8%E6%A0%BC%E6%A0%BC%E5%BC%8F%E5%92%8C%E5%BD%A9%E8%89%B2%E5%80%BC%E8%BF%9B%E8%A1%8C%E5%A4%84%E7%90%86%EF%BC%9F.png)
我发现这里此技巧用于格式化文本着色,以便与 dcolumn 包一起使用。但是,它似乎粗略地重新定义了\DC@endright
语句,并对具有多个字符的值给出了两个错误的行为:
1)垂直对齐不良
\rowcolor
2)使用命令填充行颜色不正确
\documentclass{article}
\usepackage[table]{xcolor}
\usepackage{dcolumn}
\makeatletter
\def\DC@endright{$\hfil\egroup\@dcolcolor\box\z@\box\tw@\dcolreset}
\def\dcolcolor#1{\gdef\@dcolcolor{\color{#1}}}
\def\dcolreset{\dcolcolor{black}}
\dcolcolor{black}
\makeatother
\begin{document}
\begin{tabular}{|*{3}{D{.}{,}{1}|}}
\rowcolor{gray!20} 1 & 2 & 3 \\
\rowcolor{gray!50} -1 & 2 & 3 \\
\rowcolor{gray!20} 1 & 22 & 3 \\
\rowcolor{gray!50} 1 & 2 & \dcolcolor{red}3.3 \\
\end{tabular}
\end{document}
正如您所测试的,如果您注释掉技巧行,这些问题就会消失。不过,我想修补它们,以便为单元格中的值着色。
笔记:垂直规则只是为了控制发生的事情。
答案1
dcolumn
我建议你不要使用包,而是使用siunitx
包。siunitx
包提供了许多其他功能,其中包括S
列类型,它允许在(隐式或显式)小数标记上对齐数字。
\documentclass{article}
\usepackage[spanish]{babel}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{lmodern,dcolumn}
\usepackage[table,svgnames]{xcolor}
%% New:
\usepackage{siunitx}
\sisetup{output-decimal-marker={,}}
\usepackage{etoolbox} % for "\robustify" macro
\robustify{\cellcolor}
\begin{document}
\begin{tabular}{|*{3}{D{.}{,}{1}|}}
\rowcolor{gray!20} 1 & 2 & 3 \\
\rowcolor{gray!50} -1 & 2 & 3 \\
\rowcolor{gray!20} 1 & 22 & 3 \\
%\rowcolor{gray!20} 1 & 2 & \dcolcolor{red}3.3 \\
\rowcolor{gray!20} 1 & 2 & 3.3 \\
\end{tabular}
\smallskip vs.\par\smallskip
\begin{tabular}{|S[table-format=-1.0]
S[table-format=2.0]
S[table-format=1.1]|}
\rowcolor{gray!20} 1 & 2 & 3 \\
\rowcolor{gray!50} -1 & 2 & 3 \\
\rowcolor{gray!20} 1 & 22 & 3 \\
\rowcolor{gray!20} 1 & 2 & \cellcolor{pink}3.3 \\
\rowcolor{gray!20} 1 & 2 & 3.3 \\
\end{tabular}
\end{document}
答案2
自 v1.03dcolumn
包开始添加新的符号D{.}{.}{n.m}
,其中 n,m 分别是小数点分隔符左边和右边的位数。
它解决了上述对齐问题,似乎是最简单的解决方案。因此,该siunitx
包不是必需的。
此外,与前面引用的命令dcolumn
兼容。datatool
\excolloop
以下代码展示了不同的方法:
\documentclass{article}
\usepackage[table]{xcolor}
\usepackage{siunitx,dcolumn,datatool}
% first example configuration
\sisetup{output-decimal-marker = {,}} % optional for countries with a decimal comma
% needed in second example
\makeatletter
\def\DC@endright{$\hfil\egroup\@dcolcolor\box\z@\box\tw@\dcolreset}
\def\dcolcolor#1{\gdef\@dcolcolor{\color{#1}}}
\def\dcolreset{\dcolcolor{black}}
\dcolcolor{black}
\makeatother
% data for the third example
\begin{filecontents*}{datos.csv}
1,2,3
-1,2,3
1,22,3
1,2,3.3
\end{filecontents*}
\begin{document}
% first example
\begin{tabular}{|*{3}{S[table-format=2.1]|}}
\rowcolor{gray!20} 1 & 2 & 3 \\
\rowcolor{gray!50} -1 & 2 & 3 \\
\rowcolor{gray!20} 1 & 22 & 3 \\
\rowcolor{gray!50} 1 & 2 & \color{red}3.3 \\
\end{tabular}
\bigskip
% second example
\begin{tabular}{|*{3}{D{.}{,}{2.1}|}}
\rowcolor{gray!20} 1 & 2 & 3 \\
\rowcolor{gray!50} -1 & 2 & 3 \\
\rowcolor{gray!20} 1 & 22 & 3 \\
\rowcolor{gray!50} 1 & 2 & \dcolcolor{red}3.3 \\
\end{tabular}
\bigskip
% third example
\DTLloaddb[noheader]{tabla}{datos.csv}
\begin{tabular}{|*{3}{D{.}{,}{2.1}|}}
\rowcolor{gray!20}
\DTLforeach*{tabla}{\one=Column1,\two=Column2,\three=Column3}{%
\one & \two & \DTLifeq{\three}{3.3}{\dcolcolor{red}}{}\three%
\DTLiflastrow{}{\\ \DTLifoddrow{\rowcolor{gray!50}}{\rowcolor{gray!20}}}%
}\\
\end{tabular}
\end{document}