假设我有两个宏\numa
,\numb
我将一些外部计算的值导入其中。
我希望在方程中使用它们,使得二进制加/负运算符应始终打印在它们前面无需测试他们的体征事先。换句话说,我需要有正确的二进制正/负符号自动选择并打印根据他们的标志。
对于下面的 MWE,我想知道
1- 在情况 (a) 中如何将的加号转换\num[explicit-sign=+]
为二进制,以便在其周围有适当的间距,如情况 (b) 和 (c) 中一样
2- 为什么案例 (d)\pgfmathifthenelse
无法打印加号
\documentclass{article}
\usepackage{siunitx,tikz}
\parindent0pt
\begin{document}
\def\numa{5}
\def\numb{-3}
(a) $1 \num[explicit-sign=+]\numa \num{\numb}$\\
(b) $1 \ifnum\numa>0+\fi \numa \numb$\\
(c) $1 \pgfmathparse{ifthenelse(\numa>0,"+",)}\pgfmathresult \numa \numb$\\
(d) $1 \pgfmathifthenelse{\numa>0}{"+"}{} \numa \numb$
\end{document}
答案1
添加的建议\mathbin
是关键点,但组合解析要求需要小心。下面我定义了一个\snum
宏来为您执行此操作。它采用与相同的可选参数\num
,使用处理符号pgfmath
并使用打印出数字的绝对部分,颠覆了括号负数的机制。这是为了避免使用(在默认情况下打印)siunitx
而产生的不同格式。pgfmath
\pgfmathabs{5}\pgfmathresult
5.0
\documentclass{article}
\usepackage{siunitx,tikz}
\newcommand{\snum}[2][]{\pgfmathifthenelse{#2 >=0}{"+"}{"-"}%
\mathbin{\pgfmathresult}%
\num[#1,bracket-negative-numbers,close-bracket={},open-bracket={}]{#2}}
\begin{document}
\def\numa{5}
\def\numb{-3}
(a) $1 \snum{\numa} \snum{\numb}$
(b) $1 \ifnum\numa>0+\fi \numa \numb$
(c) $1 \pgfmathparse{ifthenelse(\numa>=0,"+",)}\pgfmathresult \numa \numb$
(d) $1 \pgfmathifthenelse{\numa>=0}{"\mathbin{+}"}{}\pgfmathresult \numa
\numb$
\end{document}
注意:情况 (b) 仅用于与原始问题进行比较,它仅适用于整数,而另一种情况也适用于小数。
更新
对于较新版本的siunitx
上述代码,可以按如下方式进行调整,但考虑到必须进入 expl 语法,最好使用 egreg 的解决方案https://tex.stackexchange.com/a/600885/15925
\documentclass{article}
\usepackage{siunitx,tikz}
\ExplSyntaxOn
\NewExpandableDocumentCommand{\snum}{O{} m}{
\tl_set:Nn \l__siunitx_number_bracket_open_tl { }
\tl_set:Nn \l__siunitx_number_bracket_close_tl { }
\ensuremath{\pgfmathifthenelse{#2 >=0}{"+"}{"-"}%
\mathbin{\pgfmathresult}%
\num[#1,bracket-negative-numbers]{#2}}}
\ExplSyntaxOff
\begin{document}
\def\numa{5}
\def\numb{-3}
(a) $1 \snum{\numa} \snum{\numb}$
(b) $1 \ifnum\numa>0+\fi \numa \numb$
(c) $1 \pgfmathparse{ifthenelse(\numa>=0,"+",)}\pgfmathresult \numa \numb$
(d) $1 \pgfmathifthenelse{\numa>=0}{"\mathbin{+}"}{}\pgfmathresult \numa
\numb$
With decimals
\def\numa{5.2}
\def\numb{-3.1}
(1) $1.2 \snum{\numa} \snum{\numb}$
(2) \snum{\numa} and \snum{\numb} in text
\end{document}
答案2
答案3
更简单的实现如下expl3
:
\documentclass{article}
\usepackage{siunitx,tikz}
\ExplSyntaxOn
\NewExpandableDocumentCommand{\snum}{O{}m}
{
\mathbin
{
\fp_compare:nTF { #2 >= 0 }
{ + }
{ - }
}
\num[#1]{ \fp_eval:n { abs(#2) } }
}
\ExplSyntaxOff
\begin{document}
\def\numa{5}
\def\numb{-3}
$1 \snum{\numa} \snum{\numb}$
\end{document}