科学记数法仅适用于大数——具有不确定性

科学记数法仅适用于大数——具有不确定性

我一直在使用Betohaku 和 Bruno Le Floch 的回答仅适用于大数的科学记数法将的科学计数法转换为如下形式:

\documentclass{standalone}
\RequirePackage[
    per-mode=reciprocal,
    scientific-notation=true,
    retain-explicit-plus,
    table-space-text-post=\textsuperscript{~a},
    table-align-text-post=true,
    table-align-exponent,
    table-align-uncertainty,
    separate-uncertainty = true,
]{siunitx}
\usepackage{expl3}
\ExplSyntaxOn
    \cs_new_eq:NN \fpcmpTF \fp_compare:nTF
\ExplSyntaxOff
\let\OldSI\SI%
\renewcommand*{\SI}[3][]{%
    \fpcmpTF{abs(#2)<=.001}{%
        \OldSI[scientific-notation=true,#1]{#2}{#3}%
    }{%
        \fpcmpTF{abs(#2)>=1000}{%
            \OldSI[scientific-notation=true,#1]{#2}{#3}%
        }{%
            \OldSI[scientific-notation=false,#1]{#2}{#3}%
        }%
    }%
}
\begin{document}
\SI{83}{\mega\pascal} looks good, \SI{83(22)}{\mega\pascal} doesn't.
\end{document}

问题是我有一些不确定性的值(如上面的 MWE 所示)并且(当然)与阈值(这里硬编码)的比较失败,所以上面的代码给出: 上述 .tex 代码的渲染

现在 siunitx 可以将 83(22) 解析为两部分,所以这一定是可能的,但是花了一些时间盯着 siunitx.sty 和 expl3 手册后,我还是不明白。

显然,我可以通过在后一个示例之前说明来解决这个问题[scientific-notation=false],但基于代码的解决方案的重点是一致性(避免小的指数)。

那么有没有简单的方法可以从我的输入中获得 (83 ± 22) MPa 这样的输出?或者有初学者在 expl3 中编写的指南?

答案1

这里我引入了一个辅助解析器\parseuncertainty,它将平均值与变化值分离出来,并将它们填充到两个单独的标记中。然后,您的命令可以与而不是\SI进行比较。\SImeanvalue#2

\documentclass{article}
\RequirePackage[
    per-mode=reciprocal,
    scientific-notation=true,
    retain-explicit-plus,
    table-space-text-post=\textsuperscript{~a},
    table-align-text-post=true,
    table-align-exponent,
    table-align-uncertainty,
    separate-uncertainty = true,
]{siunitx}
\usepackage{expl3}
\ExplSyntaxOn
    \cs_new_eq:NN \fpcmpTF \fp_compare:nTF
\ExplSyntaxOff
\let\OldSI\SI%
\renewcommand*{\SI}[3][]{%
    \parseuncertainty#2()\relax%                             NEW
    \fpcmpTF{abs(\SImeanvalue)<=.001}{%                      ALTERED
        \OldSI[scientific-notation=true,#1]{#2}{#3}%
    }{%
        \fpcmpTF{abs(\SImeanvalue)>=1000}{%                  ALTERED
            \OldSI[scientific-notation=true,#1]{#2}{#3}%
        }{%
            \OldSI[scientific-notation=false,#1]{#2}{#3}%
        }%
    }%
}
\def\parseuncertainty#1(#2)#3\relax{%                        NEW
  \def\SImeanvalue{#1}\def\SIuncertainty{#2}}%               NEW
\begin{document}
\SI{83}{\mega\pascal} looks good, \SI{83(22)}{\mega\pascal} does too.\par
And \SI{12345(456)}{\mega\pascal} also.
\end{document}

在此处输入图片描述

相关内容