我有一段代码,有时编译正确,有时却会出现错误。
软件包是否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