我希望给出精确到小数点后三位的数字,除非它们太小以至于四舍五入为零。在这种情况下,我希望给出三位有效数字。
这是一个最小的非工作示例:
\documentclass{article}
\usepackage[round-mode=places,round-precision=3]{siunitx}
\begin{document}
\num{0.0437} % gives 0.044
\num{0.00437} % gives 0.004
\num{0.000437}% I want this to give 0.000437
\end{document}
现在我通过覆盖序言中任何足够小的数字的设置来实现这一点。所以我会用 替换\num
。\num[round-mode=figures]
但如果可以的话,我想自动完成。
我读过源代码siunitx.sty
,但我仍然不理解 LaTeX3 风格的编程。我很感激任何建议。
答案1
这是一个基于 LuaLaTeX 的解决方案。它定义了一个名为的实用程序宏\mynum
,该宏依次调用 Lua 函数来完成实际工作。
% !TEX TS-program = lualatex
\documentclass{article}
\usepackage{siunitx}
\sisetup{round-precision=3,group-digits=false,round-mode=places}
\usepackage{luacode} % for '\luaexec' macro
%% Lua-side code:
\luaexec{%
function mynum ( n )
if n<0.001 then tex.sprint ( "\\num[round-mode=figures]{"..n.."}" )
else tex.sprint ( "\\num{"..n.."}" )
end
end
}
%% LaTeX-side code:
\newcommand\mynum[1]{\directlua{mynum(#1)}}
\begin{document}
\num{0.0437}, \mynum{0.0437} % both give 0.044
\num{0.00437}, \mynum{0.00437} % both give 0.004
\num{0.000437}, \mynum{0.000437} % only \mynum gives 0.000437
\end{document}
答案2
仅使用expl3
函数,并假设 v3siunitx
允许我们使用代码级 API 来执行此操作,我们可能会选择
\documentclass{article}
\usepackage{siunitx}
\sisetup{round-precision=3,group-digits=false}
\ExplSyntaxOn
\NewDocumentCommand \mynum { O { } m }
{
\mode_leave_vertical:
\group_begin:
\keys_set:nn { siunitx } {#1}
\fp_compare:nNnTF {#2} < { 0.001 }
{ \keys_set:nn { siunitx } { round-mode = none } }
{ \keys_set:nn { siunitx } { round-mode = places } }
\siunitx_number_format:nN {#2} \l___siunitx_number_tmp_tl
\siunitx_print_number:V \l___siunitx_number_tmp_tl
\group_end:
}
\ExplSyntaxOff
\begin{document}
\num{0.0437}, \mynum{0.0437} % both give 0.044
\num{0.00437}, \mynum{0.00437} % both give 0.004
\num{0.000437}, \mynum{0.000437} % only \mynum gives 0.000437
\end{document}
使用来自的演示Mico 的回答。
请注意,fp
此处的函数仅限于 IEEE754 范围/精度(例如16 位尾数),这在某些情况下可能会成为问题。(核心siunitx
函数可以处理任意精度的舍入。)