使用命令作为其他命令的参数时出错

使用命令作为其他命令的参数时出错

我想使用两个单独的命令,首先对数字执行计算,然后使用以下代码显示加号或减号。

当我尝试运行它时,我收到各种错误。我认为这可能\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}

相关内容