我正在尝试根据以下条件为表格实现一种着色这个答案(此线程中上述优选方法不起作用,因为我的数字格式是德语,所以我用逗号作为小数分隔符);但是,此建议还有另一个(大概很小的)问题:我喜欢用颜色标记的数字范围从 0.01 到大约 1。但是,如果我将
\ifdim#1pt<5pt\cellcolor{green}
对于较小的数字(例如 0.1pt),会出现错误“zz 定义中的参数编号非法”。
关于如何解决这个问题,我有什么想法吗?
多谢!
编辑:MWE 导致 55 个错误,与我从答案中获得的原始代码唯一的区别是我将 1pt 更改为 .1pt:
\documentclass{article}
\usepackage{colortbl,dcolumn}
\def\zz#1{%
\ifdim#0.1pt<5pt\cellcolor{green}\else
\ifdim#1pt<50pt\cellcolor{yellow}\else
\cellcolor{red}\fi\fi
#1}
\begin{document}
\begin{tabular}{*3{D,,{2.2}}c}
\zz {0,2} &\zz {3,04} &\zz {5,44} \\
\zz {1,01}&\zz {77,5} &\zz {77,94} \\
\zz {3,42}&\zz {4,04} &\zz {51,04}
\end{tabular}
\end{document}
删除 0.1pt 之前的 # 可以解决错误,但它不能按预期工作。
答案1
我误解了 #1pt<5pt 这个术语是间隔,而 #1 对应于传递给比较的数字。因此
\def\zz#1{%
\ifdim#1pt<0.1pt\cellcolor{green}\else
\ifdim#1pt<0.5pt\cellcolor{yellow}\else
\cellcolor{red}\fi\fi
#1}
按预期工作。感谢您的评论。
答案2
下面添加了两个新的列类型,分别称为\sempftcolored
和。通过它们,您可以设置对齐方式,并根据的第一个和第二个参数中\SempftColored
指定的某些颜色范围为单元格着色。\sempftsetcolors
\SempftColored
\sempftsetcolors
它使用循环来查找正确的单元格颜色。或的第一个参数中使用的颜色规范列表\SempftColored
应该有一个逗号分隔的列表,每个列表包含两组,第一组是关系(例如,{<0.1}
小于 0.1),第二组是应该应用的颜色规范。和的第二个参数\sempftsetcolors
是\SempftColored
如果没有任何关系匹配则应用的颜色。
对于关系,您可以使用=
、>=
、<=
、!=
(理论上还有几个您不需要的)。将使用第一个匹配的关系(因此顺序很重要\sempftsetcolors
)。
的参数\sempftcolored
和的最后一个参数\SempftColored
是应该应用的单元格对齐。
\sempftcellcolor
(用于评估关系并设置单元格颜色的宏)使用,
(逗号)和.
(句点)作为参数(\sempftcolored
列中的单元格内容)的小数分隔符,而颜色列表中使用的数字必须使用句点。
\documentclass{article}
\usepackage[table]{xcolor} % just for more named colours
\usepackage{dcolumn,collcell,array}
%\usepackage{xparse} % not needed with newer LaTeX versions
\ExplSyntaxOn
\seq_new:N \l_sempft_color_ranges_seq
\tl_new:N \l_sempft_color_else_tl
\NewDocumentCommand \sempftsetcolors { m m }
{
\seq_set_from_clist:Nn \l_sempft_color_ranges_seq {#1}
\tl_set:Nn \l_sempft_color_else_tl {#2}
}
\NewExpandableDocumentCommand \sempftcellcolor { m }
{
\sempft_color_loop:e { \sempft_ensure_decimal_period:n {#1} }
#1
}
\cs_new:Npn \sempft_color_loop:n #1
{
\seq_map_tokens:Nn \l_sempft_color_ranges_seq
{ \__sempft_color_loop:nn {#1} }
\use:n { \cellcolor { \l_sempft_color_else_tl } }
}
\cs_generate_variant:Nn \sempft_color_loop:n { e }
\cs_new:Npn \__sempft_color_loop:nn #1#2
{
\__sempft_color_loop:nnn {#1} #2
}
\cs_new:Npn \__sempft_color_loop:nnn #1#2#3
{
\fp_compare:nT { #1 #2 }
{
\cellcolor {#3}
\seq_map_break:n { \use_none:nn }
}
}
% auxiliary function to parse floats correctly regardless of the decimal
% separator being a period or comma
\cs_new:Npn \sempft_ensure_decimal_period:n #1
{ \__sempft_ensure_decimal_period_auxi:w \q_nil #1 \q_mark , \q_stop }
\cs_new:Npn \__sempft_ensure_decimal_period_auxi:w #1 ,
{ \__sempft_ensure_decimal_period_auxii:w #1 . }
\cs_new:Npn \__sempft_ensure_decimal_period_auxii:w #1 \q_mark #2 \q_stop
{ \exp_not:o { \use_none:n #1 } }
\ExplSyntaxOff
\sempftsetcolors{{<0.1}{green}, {<0.5}{yellow}, {<1}{orange}}{red}
\newcolumntype\sempftcolored[1]
{>{\collectcell\sempftcellcolor}#1<{\endcollectcell}}
\newcolumntype\SempftColored[3]
{>{\sempftsetcolors{#1}{#2}\collectcell\sempftcellcolor}#3<{\endcollectcell}}
\begin{document}
\begin{tabular}
{
\sempftcolored{D,,{1.2}}
\SempftColored{{<10}{green},{<20}{orange}}{red}{D,,{2.1}}
}
0,44 & 5,2 \\
0,94 & 15,3 \\
0,04 & 20,4 \\
1,45 & 30,5 \\
\end{tabular}
\end{document}