有没有简单的方法来测试一个数字是否为负数?
我不需要通用解决方案,但它确实需要能够处理浮点值。我用的是这个TeX FAQ 中的解决方案直到我意识到它对正浮点数有问题。这是一个测试文件
\documentclass{article}
\def\IsPositive#1{%
TT\fi%
\ifcat_\ifnum0<0#1 _\else A\fi%
}
\newcommand{\PrintSignOfNumber}[1]{%
\if\IsPositive{#1}%
$#1 \ge 0$%
\else%
$#1 < 0$%
\fi%
}
\begin{document}
\PrintSignOfNumber{2}\par
\PrintSignOfNumber{-2}
\PrintSignOfNumber{2.0}\par % reported as negative
\PrintSignOfNumber{-2.0}
\end{document}
我不需要非常通用的解决方案。即使它只是测试第一个字符为负号,对我的应用程序来说也足够了。我认为可以etoolbox
轻松做到这一点,但我不知道该怎么做。如果有人知道一份包含使用示例的好文档,etoolbox
那就太好了。
答案1
如果您是 TikZ 的熟练者,那么下一个解决方案适合您(使用 pgf 2.1)
\documentclass[]{scrartcl}
\usepackage{tikz}
\newcommand\test[1]{
\pgfmathsetmacro{\var}{#1}
\pgfmathparse{ifthenelse(\var>=0,"positif","négatif")} \pgfmathresult}%
\begin{document}
\test{1} \test{-2} \test{cos(95)}
\end{document}
修改版本:
\documentclass[]{scrartcl}
\usepackage{tikz}
\newcommand\ifPositif[3]{
\begingroup
\pgfmathsetmacro{\var}{#1}
\pgfmathparse{ifthenelse(\var>=0,1,0)}
\ifdim\pgfmathresult pt= 1 pt
#2
\else
#3
\fi
\endgroup
}
\begin{document}
\ifPositif{1}{pos}{neg}
\ifPositif{2-2}{\pgfmathparse{sqrt(3)} \pgfmathresult}
{\pgfmathparse{sqrt(2)} \pgfmathresult}
\ifPositif{cos(95)+sqrt(2)}{\pgfmathparse{sqrt(5)} \pgfmathresult}
{\pgfmathparse{sqrt(6)} \pgfmathresult}
\ifPositif{-1e-2}{pos}{neg}
\ifPositif{1-5e2}{\var}{\foreach \x in {1,2}{\x}}
\ifPositif{1-5e2}{\var}{\var}
\end{document}
答案2
\documentclass{article}
\makeatletter
\newcommand\PrintSignOfNumber[1]{%
\ifdim#1pt<\z@ $#1<0$\else$#1\ge0$\fi}
\makeatother
\begin{document}
\PrintSignOfNumber{2}\par
\PrintSignOfNumber{-2}
\PrintSignOfNumber{2.0}\par
\PrintSignOfNumber{-2.0}
\end{document}
答案3
一个简单的方法是使用一个简单的宏并测试数字是否小于零。
\documentclass{article}
\begin{document}
\def\test#1{%
\expandafter\ifnum#1<0 isNegative \else isPositive\fi
}
\test{-23}
\test{23}
\end{document}
对于十进制数,修改为:
\documentclass{article}
\usepackage{fp}
\begin{document}
\def\test#1{%
\expandafter\ifnum#1<0 isNegative \else isPositive\fi
}
\test{-23}
\test{23}
\def\testReal#1{%
\FPiflt{#1}{0} isNegative\else isPositive\fi
}
\testReal{-23.789}
\end{document}
答案4
虽然很晚才加入,但这是一个通用的解决方案做存在。
\documentclass{article}
\usepackage{xfp}
\ExplSyntaxOn
\NewExpandableDocumentCommand{\FPCompareTF}{mmm}
{
\fp_compare:nTF { #1 } { #2 } { #3 }
}
\ExplSyntaxOff
\newcommand{\PrintSignOfNumber}[1]{%
\FPCompareTF{#1 >= 0}{$\fpeval{#1}\ge0$}{$\fpeval{#1}<0$}%
}
\begin{document}
\PrintSignOfNumber{0}\par
\PrintSignOfNumber{2}\par
\PrintSignOfNumber{2.0}\par
\PrintSignOfNumber{-2.37}\par
\PrintSignOfNumber{22/7-pi}\par
\PrintSignOfNumber{3+10/71-pi}\par
\edef\pson{\FPCompareTF{3+10/71-pi>0}{positive}{negative}}
\texttt{\meaning\pson}
\end{document}