“FPeval”与“clip”乘以 10 时会给出错误答案,而其他数字则不会发生这种情况

“FPeval”与“clip”乘以 10 时会给出错误答案,而其他数字则不会发生这种情况
\newcounter{tenMarksQ}
\setcounter{tenMarksQ}{0}
\DTLforeach{Q}{\Marks=Marks}
{
    \ifnum\Marks=10
    \addtocounter{tenMarksQ}{1}
    \fi
}
\FPeval{\10}{clip(10*\thetenMarksQ)}
\section{ELABORATE ON: \hfill $\text{\thetenMarksQ\times10}=\text{\10}$}
\begin{questions}
\DTLforeach{Q}{\Marks=Marks, \Question=Question,
\Subquestion=Subquestion}
{\ifnum\Marks=10
    \question \Question
    \ifx\Subquestion\empty 
        \else
        \begin{parts}
            \part \Subquestion
        \end{parts}
    \fi
\fi
}
\end{questions}

上述代码对于 3 分、5 分来说效果很好,但是当涉及到 10 分时,问题数量(此处为 4)乘以 10 得到 400,但我预计会得到 40。 在此处输入图片描述

答案1

问题在于使用\10。显示相同问题的简化版本如下:

\documentclass{article}
\usepackage{fp}

\begin{document}

\FPeval{\10}{clip(10*4)}

\10

\end{document}

产生

400

为什么?因为您无法定义宏\10。宏名可以有两种形式:要么只有字母,要么只有一个非字母。

在您的情况下,操作的结果存储在\1并且由于实现0方式的原因而丢失。\FPeval

接下来,当你执行 时\10,存储在 中的值\1会被打印出来,并且它是 40;然后 TeX 会排版0

使用类似\byten或任何其他的东西。

那么,你可能用作10命令名称,但仅限于\csname...\endcsname构造内部。这将起作用:

\expandafter\FPeval\csname 10\endcsname{clip(10*4)}

\csname 10\endcsname

但是你只是为了拥有一个同名的宏而这么做吗?

顺便说一句,您不应该使用\thetenMarksQ,而是\arabic{tenMarksQ}

\documentclass{article}
\usepackage{fp}

\newcounter{tenMarksQ}
\setcounter{tenMarksQ}{4}

\begin{document}

\FPeval{\byten}{clip(10*\arabic{tenMarksQ})}

\byten

\end{document}

这将打印 40。

相关内容