我正在创建宏来使用 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}
更精美的版本,您可以添加选项来pequals
:min
指定数字的阈值,低于该阈值时,仅使用 < 打印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.001
0.0005
0.001
round-mode=places
\pequals
0.00051
0.00049
<0.001
\num
0.001
0.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}