将 \num 宏与 \SI[parse-numbers=false] 结合使用

将 \num 宏与 \SI[parse-numbers=false] 结合使用

似乎当我将该[parse-numbers=false]选项应用于时\SI,这如果宏\num在数字参数中\SI。我意识到通常不需要这样做,但是当宏的“数字”部分\SI包含其他内容时,例如\frac(MWE 中的最后一个例子),就需要这样做。

这可能是故意的,但我觉得不应该这样。我认为\num宏与\SI宏是分开的。在我看来,一个选项应该仅有的应用于给定的宏。

问题:

有没有办法可以设置宏,\siunitx以便\num不是继承应用于的选项\SI

在此处输入图片描述


笔记:

可能的解决方法包括

  • 看来如果我使用\num[parse-numbers=true],那么事情就会起作用,但我宁愿不这样做。
  • 另一个选择是使用$\frac{1}{\num{100000}}\,\si{\meter}$,但我还是更喜欢使用\SI[parse-numbers=false]宏来保持一致性,而不是手动留出间距。

代码:

\documentclass{article}
\usepackage{amsmath}
\usepackage{siunitx}
\usepackage{xcolor}

\begin{document}
\textbf{OK}

Outside of \verb|\SI|: \num{100000}
 
In a \verb|\frac|: $\frac{1}{\num{100000}}$

Inside of \verb|\SI| without \verb|\num|: \SI{100000}{\meter} 

\medskip
\textbf{Problem}

Inside of \verb|\SI[parse-numbers=false]| with \verb|\num|: 
\SI[parse-numbers=false]{\color{red}\num{100000}}{\meter}
$\SI[parse-numbers=false]{\color{red}\frac{1}{\num{100000}}}{\meter}$
\end{document}

答案1

这个快速而粗糙的解决方案\num根据原始定义重新定义为siunitx.sty始终包含parse-numbers=true。要覆盖此定义,您仍然可以传递parse-numbers=false给新的\num

\documentclass{article}
\usepackage{siunitx}
\usepackage{xcolor}

\ExplSyntaxOn

\RenewDocumentCommand \num { o m } {
  \leavevmode
  \group_begin:
    \bool_set_false:N \l__siunitx_font_set_bool
    \IfNoValueTF {#1} % <- changed
      { \keys_set:nn { siunitx } {parse-numbers=true} } % <- changed
      { \keys_set:nn { siunitx } {parse-numbers=true,#1} } % <- changed
    \__siunitx_number_output:n {#2}
  \group_end:
}

\ExplSyntaxOff

\begin{document}

\textbf{OK}

Outside of \verb|\SI|: \num{100000}

In a \verb|\frac|: $\frac{1}{\num{100000}}$

Inside of \verb|\SI| without \verb|\num|: \SI{100000}{\meter} 

\medskip
\textbf{Problem}

Inside of \verb|\SI[parse-numbers=false]| with \verb|\num|: 
\SI[parse-numbers=false]{\color{red}\num{100000}}{\meter}
$\SI[parse-numbers=false]{\color{red}\frac{1}{\num{100000}}}{\meter}$

\end{document}

在此处输入图片描述

相关内容