似乎当我将该[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}