到目前为止,我已经使用自制风格的文件来创建包含多组问题的试卷。
最近,我切换到exam
课程,并非常享受它提供的额外力量。现在,如果进行多组练习,我会在某个点卡住。
我的设置(所有配件都带条纹)看起来是这样的。我使用宏\setcode
,它与其他东西一起控制外部文件的包含和特定位置的字体使用。
\documentclass[addpoints]{exam}
\begin{document}
\def\setcode{1}
Total: \numpoints
\begin{questions}
\question[5] First question in Set 1.
\end{questions}
\def\setcode{2}
Total: \numpoints
\begin{questions}
\question[5] First question in Set 2.
\end{questions}
\end{document}
现在,上述场景的问题是,内部类似内容\numpoints
不正确。正如输出和有关多重定义标签的警告消息所证明的那样。
我发现标签不再使用\label
s 来处理。相反,它们直接写入 .aux 文件中。请参阅摘录
exam.cls
。
以前,这是通过
\pageref
命令完成的。当我停止使用时\pageref
(为了使其与兼容hyperref.sty
),创建了以下内容:
\gdef
exam@lastpage
、、、、、和的命令通过写入 文件。exam@numpoints
exam@numbonuspoints
exam@numquestions
exam@numparts
exam@numsubparts
exam@numsubsubparts
.aux
\AtEndDocument
我明白,如果我能侵入\setcode
上述内部结构,我的问题就能解决了。
您认为您能为此提出一个解决方法吗?
我知道一个全新的设置,说点什么像这样,也许可以解决我的问题。但另一方面,我已经有一个十多年的大型设置,必须完全重新设计才能使新设置正常工作。
答案1
一个实验(根据评论部分解决)
我还没完成,但我正在向其他解算器展示我的发现,以节省一些时间。下面是我的补丁/样式文件,用于捕获和清除大多数计数器。未解决的问题是:
- 如果需要,单个问题的分数和加分,
\pointsofq@
以及\bonuspointsofq@
问题的分数等i
。ii
- 还缺少诸如考试最后一页之类的基本信息。它只需要
\label
一个独特的标记,例如考试计数器。 - 如何卸载
\AtEndDocument{}
命令的内容而不触碰exam.cls
文件,例如通过删除该部分代码。原因是我们不喜欢关于多重定义标签的警告。 \label
例如,通过 s 实际捕获计数器,然后通过\ref
或将其加载回去\pageref
。此实验列出了值,但我们不能在实际考试的开始或中间使用它们。- 那个班还有其他计数器吗?
:-)
这是mal-patch.sty
包含两个命令的文件,正在自动\catchme
调用\clearme
,但我试图将这两个任务彼此分开。
\makeatletter
%\newcounter{pageof@pagepoints}
%\newcounter{pageof@pagebonuspoints}
\def\clearme{
\setcounter{numquestions}{0}
\setcounter{numparts}{0}
\setcounter{numsubparts}{0}
\setcounter{numsubsubparts}{0}
%
\set@hlfcntr{numpoints}{0}
\set@hlfcntr{numbonuspoints}{0}
\set@hlfcntr{pointsof@thisquestion}{0}
\set@hlfcntr{bonuspointsof@thisquestion}{0}
%
\set@hlfcntr{@pagepoints}{0}
\set@hlfcntr{@pagebonuspoints}{0}
\setcounter{pageof@pagepoints}{0}
\setcounter{pageof@pagebonuspoints}{0}
%
\set@hlfcntr{latest@points}{0}
\set@hlfcntr{latest@bonuspoints}{0}
}% End of \clearme...
\def\catchme{\indent\par
numquestions: \thenumquestions\par
numparts: \thenumparts\par
numsubparts: \thenumsubparts\par
numsubsubparts: \thenumsubsubparts\par
%
numpoints: \prtaux@hlfcntr{numpoints}\par
numbonuspoints: \prtaux@hlfcntr{numbonuspoints}\par
pointsofthisquestion: \prtaux@hlfcntr{pointsof@thisquestion}\par
bonuspointsofthisquestion: \prtaux@hlfcntr{bonuspointsof@thisquestion}\par
%
pagepoints: \prtaux@hlfcntr{@pagepoints}\par
pagebonuspoints: \prtaux@hlfcntr{@pagebonuspoints}\par
pageofpagepoints: \thepageof@pagepoints\par
pageofpagebonuspoints: \thepageof@pagebonuspoints\par
%
latestpoints: \prtaux@hlfcntr{latest@points}\par
latestbonuspoints: \prtaux@hlfcntr{latest@bonuspoints}\par
\clearme % before another set of questions...
}% End of \catchme...
\makeatother
到目前为止,这是从mal-exam.tex
文件中使用它的方法:
%! *latex mal-exam.tex
\documentclass[addpoints]{exam}
\usepackage{mal-patch}
\begin{document}
\def\setcode{1}
\begin{questions}
\question[5] First question in Set \setcode.
\end{questions}
\catchme
%%% Next set of questions...
\def\setcode{2}
\begin{questions}
\question[5] First question in Set \setcode.
\end{questions}
\catchme
\end{document}