\ifdim 参数小于 1pt?

\ifdim 参数小于 1pt?

我正在尝试根据以下条件为表格实现一种着色这个答案(此线程中上述优选方法不起作用,因为我的数字格式是德语,所以我用逗号作为小数分隔符);但是,此建议还有另一个(大概很小的)问题:我喜欢用颜色标记的数字范围从 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}

在此处输入图片描述

相关内容