我一直在编写多个方程式用于考试。我制作了一些新宏,这些宏在正数表达式前面显示正号,在负数表达式前面不显示正号。
下面是我的定义的一个简单版本的示例:
\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}