我想使用两个单独的命令,首先对数字执行计算,然后使用以下代码显示加号或减号。
当我尝试运行它时,我收到各种错误。我认为这可能\FPeval
是导致问题的原因。
\documentclass{scrbook}
\usepackage{fp}
\usepackage{ifthen}
\newcommand\MyHalf[1]{\FPeval\result{trunc(#1 / 2, 0)}\result}
\newcommand\MyDisplaySign[1]{\ifthenelse{#1<0}{$#1$}{$+#1$}}
\begin{document}
\MyHalf{12}
\MyDisplaySign{\MyHalf{12}}
\end{document}
答案1
问题在于,对于\ifthenelse
测试比较#1<0
,#1
必须是一个数字。但是,如果您传递一个包含数字的宏(或者以某种方式扩展为数字),则该宏必须是可扩展的,以便\ifthenelse
可以执行测试。正如 David 在评论中所说,问题是\FPeval
不可扩展,因为它将结果分配给了\result
。
但\fp_eval:n
可扩展:)
\documentclass{scrbook}
\usepackage{xparse}
\ExplSyntaxOn
\NewExpandableDocumentCommand\MyHalf
{ m }
{
\fp_eval:n { trunc ( #1 / 2, 0 ) }
}
\NewExpandableDocumentCommand\MyDisplaySign
{ m }
{
\int_compare:nTF
{ #1 <= \c_zero_int }
{ $ #1 $ }
{ $ + #1 $ }
}
\ExplSyntaxOff
\begin{document}
\MyHalf{12} % Prints 6
\MyDisplaySign{\MyHalf{12}} % Prints +6
\MyDisplaySign{\MyHalf{-12}} % Prints -6
\MyDisplaySign{\MyHalf{0}} % Doesn't print "+0" because 0 isn't larger than \c_zero_int, so the conditional evaluates to true
\MyDisplaySign{\MyHalf{-0}} % Prints -0 because of the leading sign
\end{document}
唯一的问题是0
。使用上面的代码,+
由于0=0
为真,所以您不会获得前导符号,因此取第一个(对于负数)。如果您想要前导+
符号,那么如果值也等于零,则必须打印符号,但是对于负零,您会得到+-0
,因为-0=+0
并且符号也被添加了:
\documentclass{scrbook}
\usepackage{xparse}
\ExplSyntaxOn
\NewExpandableDocumentCommand\MyHalf
{ m }
{
\fp_eval:n { trunc ( #1 / 2, 0 ) }
}
\NewExpandableDocumentCommand\MyDisplaySign
{ m }
{
\int_compare:nTF
{ #1 >= \c_zero_int }
{ $ + #1 $ }
{ $ #1 $ }
}
\ExplSyntaxOff
\begin{document}
\MyHalf{12} % Prints 6
\MyDisplaySign{\MyHalf{12}} % Prints +6
\MyDisplaySign{\MyHalf{-12}} % Prints -6
\MyDisplaySign{\MyHalf{0}} % Prints +0
\MyDisplaySign{\MyHalf{-0}} % Prints +-0
\end{document}
据我所知,如果不针对这种特定场景进行额外的测试,就没有办法获得-0
并纠正。+0
答案2
\documentclass{scrbook}
\usepackage{fp}
\usepackage{ifthen}
\newcommand\MyHalf[1]{\FPeval\result{trunc(#1 / 2, 0)}}
\newcommand\MyDisplaySign[1]{\ifthenelse{#1<0}{$#1$}{$+#1$}}
\begin{document}
\MyHalf{12}%
% Now the result is stored in the macro \result.
% Let's see the result:
\result
% Now let's see the result with preceding algebraic sign:
\MyDisplaySign{\result}
\end{document}