\def 函数与算术宏

\def 函数与算术宏

我一直在编写多个方程式用于考试。我制作了一些新宏,这些宏在正数表达式前面显示正号,在负数表达式前面不显示正号。

下面是我的定义的一个简单版本的示例:

\def\dsignaddmulti#1#2#3#4{
\newcount\tmp
\newcount\ymp
\tmp=#1
\ymp=#3
\multiply\tmp by #2
\multiply\ymp by #4
\advance\tmp by \ymp
\FPifneg{\the\tmp}\else+\fi
}

我正在尝试构造相同的定义来乘以四个数字。该定义有效,但在“符号”后面显示数字,这是我不想要的。

以下是不起作用的代码:

\def\dsignmulti#1#2#3#4{
\newcount\tmp
\newcount\ymp
\tmp=#1
\ymp=#3
\multiply\tmp by #2
\multiply\ymp by #4
\multiply \tmp by \ymp
\FPifneg{\the\tmp} \else+\fi
}

我是不是遗漏了什么?

如果有帮助的话,这些在我的文件中定义esami.sty

抱歉,我从 egreg 的回复中移出了这句话:

@egreg:我想我应该更清楚地说明我如何使用该函数。在 esami 包中,您可以使用 esempli 函数对随机数执行算术运算。但是,当将其放在等式中时,如果结果为负数,我最终会得到一个正号和一个负号。

例如:

\begin{equation*}  x\dsignmulti{\a}{\b}{\c}{\d}+\esempli{a*b+c*d}{1} \end{equation*} 

如果 a*b+c*d 为负数,则结果在 x 后面有一个正号和一个负号。定义应该对正数显示正号,对负数不显示任何符号。这样,就不会出现连续两个符号。这就是我想在等式中使用的符号:

\begin{equation*}  x\dsignmulti{\a}{\b}{\c}{\d}\esempli{a*b+c*d}{1} \end{equation*} 

但是,您的代码在这里:

\newcommand{\dsignmulti}[4]{%
  \@tempcnta=\numexpr#1*#2+#3*#4\relax
  \ifnum\@tempcnta>\z@ +\fi\number\@tempcnta
}

当我只想显示符号时,解决方案输出两个数字。有没有简单的方法可以改变这种情况?

如果我之前表达得不清楚,我很抱歉。

答案1

首先,一个基本的错误是\newcount在定义中\dsignmulti:每次使用宏时都会分配两个新计数器。

LaTeX 内核已经提供了临时使用的计数器,\@tempcnta因此\@tempcntb更好的定义是

\newcommand{\dsignmulti}[4]{%
  \@tempcnta=#1\relax
  \@tempcntb=#3\relax
  \multiply\@tempcnta by #2\relax
  \multiply\@tempcntb by #4\relax
  \advance\@tempcnta by \@tempcntb
  \ifnum\@tempcnta>\z@ +\fi\number\@tempcnta
}

一种可能更简单的方法是直接使用\numexpr功能:

\newcommand{\dsignmulti}[4]{%
  \@tempcnta=\numexpr#1*#2+#3*#4\relax
  \ifnum\@tempcnta>\z@ +\fi\number\@tempcnta
}

你甚至可以让它可扩展,但代价是速度:

\newcommand{\dsignmulti}[4]{%
  \ifnum\numexpr#1*#2+#3*#4\relax>\z@ +\fi
  \number\numexpr#1*#2+#3*#4\relax
}

答案2

由于您正在使用fp,为什么不使用它的功能执行所有必要的计算?

在此处输入图片描述

\documentclass{article}
\usepackage[nomessages]{fp}% http://ctan.org/pkg/fp
\def\dsignaddmulti#1#2#3#4{
  ({#1}\times{#3})+({#2}\times{#4})=
  \FPeval\result{clip(((#1)*(#3))+((#2)*(#4)))}%
  \FPifneg\result\relax{\result}\else{+\result}\fi
}
\begin{document}
$\dsignaddmulti{1}{2}{3}{4}$

$\dsignaddmulti{-1}{-2}{3}{4}$
\end{document}

当然,以上内容可以改进,但这只是为了展示您可以做什么。

答案3

在此处输入图片描述

您可以使用 e-tex 算术,因此根本不需要使用计数寄存器,例如:

\documentclass{article}


\def\dsignmulti#1#2#3#4{%
\ifnum\numexpr#1*#2*#3*#4\relax>0{+}\fi
\the\numexpr#1*#2*#3*#4\relax}

\begin{document}

$\dsignmulti{1}{2}{3}{4}$

$\dsignmulti{1}{-2}{3}{4}$

\end{document}

相关内容