使用 siunitx 最小四舍五入时删除数字前的 = 符号

使用 siunitx 最小四舍五入时删除数字前的 = 符号

我正在创建宏来使用 siunitx 格式化 p 值。我希望它们四舍五入到小数点后三位,任何低于 0.001 的值都表示为 <0.001。这在单独打印 ap 值时工作正常,但在文本中打印时,它会给出 p=<0.001。我该如何设置它,以便在触发 round-minimum 时不打印 = 符号并打印 < 符号?MWE:

\documentclass{article}
\usepackage{siunitx}

\newcommand{\pvalue}[1]{%
    \num[round-mode=places, round-precision=3, round-minimum=0.001]{#1}%
}
\newcommand{\pequals}[1]{%
    \ensuremath{p=\pvalue{#1}}%
}

\begin{document}
\pvalue{0.0003}\\
\pequals{0.0123}\\
\pequals{0.0003}
\end{document}

答案1

\num您可以在执行操作之前将该值与 0.001 进行比较:

\documentclass{article}
\usepackage{siunitx}

\ExplSyntaxOn
\NewDocumentCommand{\pequals}{m}
 {
  \fp_compare:nTF { #1 < 0.001 }
   {
    \ensuremath{ p < \num{0.001} }
   }
   {
    \ensuremath{ p = \num[round-mode=places, round-precision=3]{#1} }
   }
 }
\ExplSyntaxOff

\begin{document}

\pequals{0.0123}  

\pequals{0.0003}

\end{document}

在此处输入图片描述

更精美的版本,您可以添加选项来pequalsmin指定数字的阈值,低于该阈值时,仅使用 < 打印n;其他选项被传递给sisetup,因此它们对于来说应该有意义\num

\documentclass{article}
\usepackage{siunitx}

\ExplSyntaxOn
\NewDocumentCommand{\pequals}{O{}m}
 {
  \group_begin:
  \keys_set:nn { pyrrhic/pequals }
   {
    min=0.001,
    round-mode=places,
    round-precision=3,
    #1
   }
  \fp_compare:nTF { #2 < \l_pyrrhic_pequals_min_fp }
   {
    \ensuremath{ p < \num{\fp_use:N \l_pyrrhic_pequals_min_fp} }
   }
   {
    \ensuremath{ p = \num{#2} }
   }
  \group_end:
 }
\keys_define:nn { pyrrhic/pequals }
 {
  min .fp_set:N = \l_pyrrhic_pequals_min_fp,
  unknown .code:n = \use:x { \sisetup { \l_keys_key_tl = \exp_not:n { #1 } } },
 }
\ExplSyntaxOff

\begin{document}

\pequals{0.0123}

\pequals{0.0003}

\pequals[min=0.0001,round-precision=4]{0.0003}

\pequals[min=0.0001,round-precision=4]{0.00003}

\end{document}

在此处输入图片描述

答案2

请注意,对于,和round-minimum=0.001之间没有空格。此外,(在 内使用)仅当其参数实际上小于 而不是 时才输出。(这是因为已通过选项 启用了舍入;检查和的输出以验证此声明。)此结果可能与普遍预期背道而驰,即(IMNSHO)当 的参数小于 时应生成字符串,而不是当 小于 时生成字符串。当然,这似乎是您所期望的,因为您写道您的目标之一是<0.001\num\pequals<0.0010.00050.001round-mode=places\pequals0.000510.00049<0.001\num0.0010.0005

低于 0.001 的任何值都表示为 <0.001。

为了使<符号周围的间距与符号周围的间距相同=,并确保截断的<0.001含义与读者有权认为的含义一致,最好从头开始编写例程。以下示例显示了如何使用 LuaLaTeX 完成此操作。左侧列显示新宏的输出,称为\ptest,右侧列显示 的输出\pequals

在此处输入图片描述

% !TEX TS-program = lualatex
\documentclass{article}
\usepackage{amsmath,luacode}
\begin{luacode}
function ptest ( i )
   if i<0.001 then
      tex.sprint ( "\\ensuremath{p<0.001}" )
   else
      tex.sprint ( "\\ensuremath{p="..string.format("%.3f",i).."}" )
  end
end
\end{luacode}
\newcommand\ptest[1]{\directlua{ptest(#1)}}

%% The OP's code for '\pvalue' and '\pequals':
\usepackage{siunitx}
\newcommand{\pvalue}[1]{\num[round-mode=places, 
         round-precision=3, round-minimum=0.001]{#1}}
\newcommand{\pequals}[1]{\ensuremath{p=\pvalue{#1}}}

\begin{document}
\ptest{0.3456},  \pequals{0.3456}

\ptest{0.0123},  \pequals{0.0123}

\ptest{0.00101}, \pequals{0.00101}

\ptest{0.00098}, \pequals{0.00098}

\ptest{0.00049}, \pequals{0.00049}
\end{document}

相关内容