\FPeval 的奇怪行为

\FPeval 的奇怪行为

我有一段代码,有时编译正确,有时却会出现错误。

软件包是否fp不稳定?或者其他软件包是否与 冲突fp?我该如何修复此错误?如果有其他选择,我也愿意改用其他软件包。

以下是该文件的相关代码(包含所有使用的包):

\documentclass[addpoints,12pt]{exam}
\usepackage{array}
\usepackage[nomessages]{fp}%Számoláshoz


\newcommand{\gradekey}[4]{\begin{tabular}{rcrl>{\bfseries}l}
        \FPeval{\result}{round(#4*\numpoints,0)}\result&-&\numpoints&&5\\
        \FPeval{\result}{round(#3*\numpoints,0)}\result&-&\FPeval{\result}{round(#4*\numpoints-1,0)}\result&&4\\
        \FPeval{\result}{round(#2*\numpoints,0)}\result&-&\FPeval{\result}{round(#3*\numpoints-1,0)}\result&&3\\
        \FPeval{\result}{round(#1*\numpoints,0)}\result&-&\FPeval{\result}{round(#2*\numpoints-1,0)}\result&&2\\
        0&-&\FPeval{\result}{round(#1*\numpoints-1,0)}\result&&1\\
    \end{tabular}
}
\newcommand{\defaultgradekey}{%
    \begin{center}\gradekey{0.35}{0.5}{0.75}{0.9}\end{center}
}
%%



\begin{document}

\defaultgradekey
\begin{questions}
    \question[50] Question 1
    \end{questions}
\end{document}

这是我的日志文件中的错误消息:

(行号较大,因为我保留了 MWE 中所有不相关的代码)

!FP 错误:在浮点数中发现非法字符 \unhbox!。\FP@errmessage #1->\errmessage {FP 错误:#1!}

l.145 \默认等级键

此错误消息是由 \errmessage 命令生成的,因此我无法提供任何明确的帮助。假设您是赫尔克里·波洛:检查所有线索,并按顺序和方法推断真相。

!FP 错误:在浮点数中发现非法字符 \voidb@x!。\FP@errmessage #1->\errmessage {FP 错误:#1!}

l.145 \默认等级键

(那是另一条 \errmessage。)

!FP 错误:在浮点数中发现非法字符 \hbox!。\FP@errmessage #1->\errmessage {FP 错误:#1!}

l.145 \默认等级键

(那是另一条 \errmessage。)

! 插入了缺失的控制序列。\inaccessible l.145 \defaultgradekey

请不要说\def cs{...}', say\def\cs{...}'。我插入了一个不可访问的控制序列,这样您的定义就可以完成,而不会让我感到困惑。如果您小心谨慎,您可以优雅地从此错误中恢复;请参阅 TeXbook 中的练习 27.2。

最后一部分(来自!Missing control sequence inserted)重复了很多次(无限次?)。我不知道它是否是无限次,因为我在一段合理的时间后终止了编译。

如果我注释掉包含 的行\FPeval,则不会出现错误,并且会生成 pdf 文件。 之后,即使我取消注释这些行也不会出现错误。

但是,如果我删除该.aux文件,错误又会出现。所以在我看来因为命令\FPeval(在 内部\newcommand),.aux文件无法以某种方式生成。

我用pdfTeX, Version 3.14159265-2.6-1.40.17 (TeX Live 2016/Debian)

(在 Windows 上,使用 MikTex 2.9 也可以重现我的问题)

答案1

exam.cls

\def\numpoints{\@ifundefined{exam@numpoints}%
  {\mbox{\normalfont\bf ??}}%
  \exam@numpoints
}% numpoints

如果\exam@numpoints未定义,则结果为\mbox{\normalfont\bf ??}。这显然不是适合包的数字fp

一种解决方法是定义\examnumpoints一个可扩展的版本,如果\exam@numpoints未定义,则仅使用零:

\makeatletter
\newcommand*{\examnumpoints}{%
  \@ifundefined{exam@numpoints}{0}{\exam@numpoints}%
}
\makeatother

然后,在 的调用\numpoints中用替换。\examnumpoints\FPeval

相关内容