更新

更新

假设我有两个宏\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}\pgfmathresult5.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

为了使原子与 (B) 和 (C) 中的间距匹配,请将其包裹在 中\mathbin。例如:

\( a \textnormal{+} b \) versus \( a \mathbin{\textnormal{+}} b \)

计算机现代样本

加号被排版为二元运算符 ( \mathbin),而您使用的是普通原子 ( \mathord)。

不应有额外空格的一元加号是\mathord{+}或者只是{+}

答案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}

在此处输入图片描述

相关内容