添加至数字

添加至数字

我想检查参数的值是否为负数。如果参数为负数,我想减去 0.5;如果参数为正数,我想加 0.5。

我能做的最好的就是像这样定义新变量

\ifnum#1<0 \def\xa{#1-0.5} \else \def\xa{#1+0.5}\fi

但这不起作用。在没有外部库的情况下,可以在 plan tex/latex 中做到这一点吗?

编辑:由于 #1 恰好是整数,因此可行\def\xa{#1.5}。但是,如果我想添加怎么办1.5

答案1

(发现它太长,不适合发表评论,所以我发布了这条评论)

要添加可能带有小数的一般数字,您需要

  1. 附加pt到每个数字
  2. 用来\the\dimexpr进行计算,并返回一个维度
  3. 定义一个宏来去除尾随pt,例如\pgf@sys@tonumberpgf\strip@pt在 latex2e 中。
% pgf, pgfsys.code.tex
{\catcode`\p=12\catcode`\t=12\gdef\Pgf@geT#1pt{#1}}

\def\pgf@sys@tonumber#1{\expandafter\Pgf@geT\the#1}

% latex2e, ltfssbas.dtx
% bonus: this also simplify 1.0pt to 1, not 1.0
\begingroup
  \catcode`P=12
  \catcode`T=12
  \lowercase{
    \def\x{\def\rem@pt##1.##2PT{##1\ifnum##2>\z@.##2\fi}}}
  \expandafter\endgroup\x
\def\strip@pt{\expandafter\rem@pt\the}

综合以上所有因素,

\documentclass{article}
\makeatletter
\newcommand{\addnum}[2]{\expandafter\strip@pt\dimexpr#2pt+#1pt\relax}
\makeatother

\begin{document}
\addnum{1}{1.3}
\addnum{1}{-1.3}
\end{document}

输出

2.3 -0.3

答案2

评论太长了。正如原始问题的评论中提到的那样,您只需附加到.5\xa对于扩展问题,您可以使用\the\numexpr它来添加整数。(如果您想添加非整数,您可以使用维度,但xfp在这种情况下使用它可能更有意义。)宏\mytest指的是原始问题,\anothertest指的是您想要添加/减去的情况1.5,并\generaltest允许您按一般整数移动,这是可选参数,其默认值为1

\documentclass{article}
\newcommand{\mytest}[1]{\edef\xa{#1.5}}
\newcommand{\anothertest}[1]{\ifnum#1<0\relax
 \edef\xa{\the\numexpr#1-1}%
\else 
 \edef\xa{\the\numexpr#1+1}%
\fi
\edef\xa{\xa.5}}
\newcommand{\generaltest}[2][1]{\ifnum#2<0\relax
 \edef\xa{\the\numexpr#2-#1}%
\else 
 \edef\xa{\the\numexpr#2+#1}%
\fi
\edef\xa{\xa.5}}
\begin{document}
\mytest{2}\xa

\mytest{-4}\xa

\anothertest{2}\xa

\anothertest{-4}\xa

\generaltest[1]{2}\xa

\generaltest[1]{-4}\xa

\generaltest[2]{2}\xa

\generaltest[6]{-4}\xa

\end{document}

答案3

问题主要在于你使用的是小数。在 (La)TeX 中处理小数的典型方式是将它们视为维度。因此,不要2.5(比如说),而是使用2.5pt。但是,这种方法有点麻烦。

你可以依赖三元运算符xfp它求值 acondition并分支求值 或truefalse具体取决于condition。具体来说,它具有以下格式:

条件 ? true : false

由于\fpeval(对于f浮点p操作)是可扩展的,因此您可以使用它来定义一些基于计算的宏:

\documentclass{article}

\usepackage{xfp}

\newcommand{\addnum}[1]{%
  %                <cond> ?  <true>  :  <false>
  \edef\xa{\fpeval{#1 < 0 ? #1 - 0.5 : #1 + 0.5}}%
}

\begin{document}

\addnum{2}$\xa$% 2 + 0.5 = 2.5

\addnum{-1}$\xa$% -1 - 0.5 = -1.5

\addnum{3.141}$\xa$% 3.141 + 0.5 = 3.641

\addnum{-2.718}$\xa$% -2.718 - 0.5 = -3.218

\end{document}

相关内容