\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。