在考试的封面上,我想生成问题及其总分的表格。(这是我正在编写的程序包的一部分。我知道exam.sty
,但它不适合我。)我有一个生成表格的循环,但在下面的 MWE 中,我只是手动制表:问题出在辅助文件中。
我正在尝试使用totcount
。它可以很好地跟踪问题数量和分数,但我无法让它在辅助系统中记录每个问题的总分数。
注意:我不仅仅使用来\def
保存问题的分数,而且我的想法是希望能够添加子问题来增加问题的计数器。
我的问题
- 有没有比下面的 MWE 更好的方法
- 出了什么问题?
- 如果我不放弃这种方法,我该如何解决它?
平均能量损失
在下面的 MWE 中,
\documentclass{article}
\RequirePackage{totcount}
\newcounter{questioncount}
\setcounter{questioncount}{0}
\regtotcounter{questioncount}%
\newcounter{scoretotal}
\setcounter{scoretotal}{0}
\regtotcounter{scoretotal}%
\newcommand{\setquestionpoints}[2]{%
\global\expandafter\newtotcounter{qpoints#1}%
\global\expandafter\setcounter{qpoints#1}{#2}%
}
\newcommand{\getquestionpoints}[1]{%
\ifnum\value{qpoints#1}>0
\arabic{qpoints#1}%
\else
0%
\fi
}
\newcommand{\nquestion}[1]{%
\stepcounter{questioncount}%
\setquestionpoints{\thequestioncount}{#1}%
\addtocounter{scoretotal}{#1}%
Question~\thequestioncount (#1 marks.)%
}
\begin{document}
\begin{tabular}{r@{:\quad}l}
Number of Questions & \total{questioncount} \\
Total points & \total{scoretotal} \\
Question 1 max & \total{qpoints1} \\
Question 2 max & \total{qpoints2} \\
Question 3 max & \total{qpoints3} \\
\end{tabular}
\vspace{2cm}
\nquestion{10}
\nquestion{12}
\nquestion{15}
\end{document}
最后一个问题的总分仅用问题数量的乘数来记录。在 3 个问题的特定情况下,辅助文件显示:
\relax
\expandafter\ifx\csname c@questioncount@totc\endcsname\relax\newcounter{questioncount@totc}\fi\setcounter{questioncount@totc}{3}
\expandafter\ifx\csname c@scoretotal@totc\endcsname\relax\newcounter{scoretotal@totc}\fi\setcounter{scoretotal@totc}{37}
\expandafter\ifx\csname c@qpoints3@totc\endcsname\relax\newcounter{qpoints3@totc}\fi\setcounter{qpoints3@totc}{15}
\expandafter\ifx\csname c@qpoints3@totc\endcsname\relax\newcounter{qpoints3@totc}\fi\setcounter{qpoints3@totc}{15}
\expandafter\ifx\csname c@qpoints3@totc\endcsname\relax\newcounter{qpoints3@totc}\fi\setcounter{qpoints3@totc}{15}
\gdef \@abspage@last{1}
并且文档(和日志)反映出qpoints1
和的缺失qpoints2
:
答案1
\global\expandafter
没什么用。您需要先扩展参数,然后再将其传递给\newtotcounter
和\setcounter
。
您还需要应对可能尚不存在的计数器。
\documentclass{article}
\RequirePackage{totcount}
\newcounter{questioncount}
\setcounter{questioncount}{0}
\regtotcounter{questioncount}%
\newcounter{scoretotal}
\setcounter{scoretotal}{0}
\regtotcounter{scoretotal}%
\newcommand{\setquestionpoints}[2]{%
\expanded{\noexpand\newtotcounter{qpoints#1}}%
\expanded{\noexpand\setcounter{qpoints#1}}{#2}%
}
\newcommand{\getquestionpoints}[1]{%
\ifnum\value{qpoints#1}>0
\arabic{qpoints#1}%
\else
0%
\fi
}
\newcommand{\nquestion}[1]{%
\stepcounter{questioncount}%
\setquestionpoints{\arabic{questioncount}}{#1}%
\addtocounter{scoretotal}{#1}%
Question~\thequestioncount (#1 marks.)%
}
\newcommand{\TOTAL}[1]{%
\ifcsname c@#1@totc\endcsname
\total{#1}%
\else
??%
\fi
}
\begin{document}
\begin{tabular}{r@{:\quad}l}
Number of Questions & \TOTAL{questioncount} \\
Total points & \TOTAL{scoretotal} \\
Question 1 max & \TOTAL{qpoints1} \\
Question 2 max & \TOTAL{qpoints2} \\
Question 3 max & \TOTAL{qpoints3} \\
\end{tabular}
\vspace{2cm}
\nquestion{10}
\nquestion{12}
\nquestion{15}
\end{document}
两次跑步后你会得到