我一直在使用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 所示)并且(当然)与阈值(这里硬编码)的比较失败,所以上面的代码给出:
现在 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}