使用 siunitx 调整指数以在符号之间切换

使用 siunitx 调整指数以在符号之间切换

我对该siunitx包裹有一个很大的疑问,我希望有人可以帮助我。

首先我想使用包的自动数字转换。所以我定义了:

\sisetup{scientific-notation = engineering}

但是现在每个数字都转换为工程格式。例如:0.01=>10x10^3但我希望这个数字不会自动转换。

是否有一个可以调整的选项,可以告诉包应在哪个最大指数数上scientific-notation进行此转换?

我的论文中确实有很多数字,手动为每个数字打开或关闭科学记数法真的很困难。

答案1

我在文档中没有看到任何可以控制这种行为的内容。

对于存在少数例外的情况,您可以使用 手动关闭您想要的例外\num[scientific-notation=false]{}

或者,如果你可以准确定义何时添加指数,则可以\num根据其值重新定义行为。下面我已定义为\num适用scientific-notation=false

-\Threshold <= number <= \Threshold

其中\Threshold是您定义的值。使用\Threshold=0.09您将得到结果新的下面的列中给出了值數量柱子:

在此处输入图片描述

笔记:

  • 问题中建议使用最大指数来确定是否使用科学计数法。我不确定这种解决方案是否普遍可行。也许基于位数的解决方案可能有效。一旦确定了更好的算法,就可以\IfLessThanOrEqual调整宏以适应。

代码:

下面我已经调整这个解决方案来自如何测试数字是否为负数界定\IfLessThanOrEqual

\documentclass{article}
\usepackage{siunitx}
\usepackage{tikz}

\sisetup{scientific-notation = engineering}
\newcommand*{\Threshold}{0.09}%

\newcommand\IfLessThanOrEqual[4]{%
    \begingroup%
        \pgfmathsetmacro{\var}{abs(#1)-#2}%
        \pgfmathparse{ifthenelse(\var<=0,1,0)}%
        \ifdim\pgfmathresult pt= 1 pt%
                #3%
            \else%
                #4%
        \fi%
    \endgroup%
}%

\let\OldNum\num%
\renewcommand*{\num}[2][]{%
    \IfLessThanOrEqual{#2}{\Threshold}{%
        \OldNum[scientific-notation=false,#1]{#2}%
    }{%
        \OldNum[#1]{#2}%
    }%
}%


\begin{document}
\newcommand{\Row}[1]{#1 & \OldNum{#1} & \num{#1}}%

\begin{tabular}{l l l}
Num & Old & New\\
\Row{0.01}\\
\Row{0.09}\\
\Row{0.091}\\
\end{tabular}
\end{document}

答案2

相关问题仅适用于大数的科学记数法刚刚从 Bruno le Floch 那里得到了一个完美的答案,我想在这里展示它也会有所帮助。

答案使用包expl3并定义一个新命令来测试要打印的数字是否超过阈值:\fpcmpTF

\documentclass{article}
\usepackage{expl3,siunitx}
\sisetup{scientific-notation=true}
\ExplSyntaxOn
    \cs_new_eq:NN \fpcmpTF \fp_compare:nTF
\ExplSyntaxOff

\newcommand*{\ThresholdLow}{0.01} % Change to your taste
\newcommand*{\ThresholdHigh}{100}

\let\OldNum\num%
\renewcommand*{\num}[2][]{%
    \fpcmpTF{abs(#2)<=\ThresholdLow}{%
        \OldNum[scientific-notation=true,#1]{#2}%
    }{%
        \fpcmpTF{abs(#2)>=\ThresholdHigh}{%
            \OldNum[scientific-notation=true,#1]{#2}%
        }{%
            \OldNum[scientific-notation=false,#1]{#2}%
        }%
    }%
}%
\begin{document}
\newcommand{\Row}[1]{#1 & \OldNum{#1} & \num{#1}}%
\begin{tabular}{l l l}
Num & Old & New\\
\Row{0.01}\\
\Row{0.1}\\
\Row{1}\\
\Row{10}\\
\Row{100}\\
\end{tabular}
\end{document}

在此处输入图片描述

如果你喜欢这个,那么一定要把票投给 Bruno 的答案如何减去非常大的数字和小于一的数字?

相关内容