根据数字大小决定的轮询模式

根据数字大小决定的轮询模式

我希望给出精确到小数点后三位的数字,除非它们太小以至于四舍五入为零。在这种情况下,我希望给出三位有效数字。

这是一个最小的非工作示例:

\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函数可以处理任意精度的舍入。)

相关内容