在我写的考试中,我有一个简答题部分和一个多项选择题部分。每个部分都应该从 1 开始有题目。正如这个问题,如果您想这样做并避免出现有关问题标签名称冲突的警告,您需要修改问题标签以包含部分名称;我已经使用\xpatchcmd
以下示例所示完成了此操作。修补成功(通过查看 .aux 文件和缺少警告消息进行验证)。
问题是我不想按页面或成绩编号组织成绩表,而是按部分组织。由于似乎没有内置的方法来以这种方式创建成绩表,因此我使用自定义表中的 、 和 手动创建成绩表\begingraderange
。\endgraderange
我\pointsinrange
遇到的问题是总数\pointsinrange
不准确。我认为这是因为在对范围内的点求和时,除了问题标签之外还存在某种名称冲突;我认为这与 .aux 文件中的命令有关\newlabel
(下面用 标记<===
),其中定义了唯一的问题标签,但每个标签的值都相同。
当我运行以下代码时,在成绩表中,我发现简答题和多项选择题的总分均为 2 分,但实际应该分别为 10 分和 4 分。我得到了正确的总分值 (14)。关于如何让这个程序正常工作,您有什么想法吗?同时还可以将每个部分的问题数量重置为 1?
\documentclass[11pt,addpoints]{exam}
% The following patches avoid name collisions with questions
% of the same number in different sections by adding the section
% name to the question label.
\usepackage{xpatch}
\xpatchcmd{\questions}{question@\arabic{question}}
{question@\arabic{section}@\arabic{question}}{}{}
\xpatchcmd{\parts}{part@\arabic{question}@\arabic{partno}}
{part@\arabic{section}@\arabic{question}@\arabic{partno}}{}{}
\xpatchcmd{\first@questionobject}{question\arabic{question}}
{question\arabic{section}@\arabic{question}}{}{}
\xpatchcmd{\addquestionobject}{question\arabic{question}}
{question\arabic{section}@\arabic{question}}{}{}
\xpatchcmd{\questionobject@pluspagecheck}{question\arabic{question}}
{question\arabic{section}@\arabic{question}}{}{}
\begin{document}
\section{Short Answer}
\begin{questions}
\begingradingrange{section1}
\question[5] First Question
\question[5] Second Question
\endgradingrange{section1}
\end{questions}
\section{Multiple Choice}
\begin{questions}
\begingradingrange{section2}
\question[2] First Question
\question[2] Second Question
\endgradingrange{section2}
\end{questions}
\section{Extra Credit}
\begin{questions}
\bonusquestion[5] Bonus
\end{questions}
\begin{center}
\begin{tabular}{|r|c|c|}
\hline
\multicolumn{3}{|c|}{\textbf{Exam Score}} \\ \hline
\textbf{Section} & \textbf{Points} & \textbf{Score} \\ \hline
Short Answer & \pointsinrange{section1} & \\ \hline
Multiple Choice & \pointsinrange{section2} & \\ \hline
Bonus & \numbonuspoints & \\ \hline
Total & \numpoints & \\ \hline
\end{tabular}
\end{center}
\end{document}
.aux 文件摘录:
...
\PgInfo{question@1@2}{1}
\PgInfo{question1@2@object1}{1}
\newlabel{question@1@2}{{2}{1}} <=== Value same as question@2@2
...
\PgInfo{question@2@2}{1}
\PgInfo{question2@2@object1}{1}
\newlabel{question@2@2}{{2}{1}} <=== Value same as question@1@2
答案1
这是另一种使用假计数器打印假问题号的解决方案。
首先,我们定义计数器(每次重置\section
)以及标题问题和标题奖励问题的格式:
\newcounter{fakecount}[section]
\qformat{\thefakecount. (\thepoints) \thequestiontitle\hfill}
\bonusqformat{\thefakecount. (\thebonuspoints) \thequestiontitle\hfill}
一开始questions
我们重新定义\titledquestion
并\bonustitledquestion
增加假计数器:
\let\oldtitledquestion\titledquestion
\renewcommand{\titledquestion}{\stepcounter{fakecount}\oldtitledquestion}
\let\oldbonustitledquestion\bonustitledquestion
\renewcommand{\bonustitledquestion}{\stepcounter{fakecount}\oldbonustitledquestion}
此时,您只需使用\titledquestion
而不是\question
和\bonustitledquestion
而不是即可\bonusquestion
使其发挥作用。
MWE(注意使用\leavevmode
之前的EnvFullwidth
环境来避免不必要的行为......)
\documentclass[11pt,addpoints]{exam}
\usepackage{lipsum}
\newcounter{fakecount}[section]
\qformat{\thefakecount. (\thepoints) \thequestiontitle\hfill}
\bonusqformat{\thefakecount. (\thebonuspoints) \thequestiontitle\hfill}
\begin{document}
\begin{questions}
\let\oldtitledquestion\titledquestion
\renewcommand{\titledquestion}{\stepcounter{fakecount}\oldtitledquestion}
\let\oldbonustitledquestion\bonustitledquestion
\renewcommand{\bonustitledquestion}{\stepcounter{fakecount}\oldbonustitledquestion}
\begin{EnvFullwidth}
\section{Short Answer}
\lipsum[2]
\end{EnvFullwidth}
\begingradingrange{section1}
\titledquestion{First Question}[5]
\titledquestion{Second Question}[5]
\endgradingrange{section1}
\leavevmode
\begin{EnvFullwidth}
\section{Multiple Choice}
\lipsum[2]
\end{EnvFullwidth}
\begingradingrange{section2}
\titledquestion{First Question}[2]
\titledquestion{Second Question}[2]
\endgradingrange{section2}
\leavevmode
\begin{EnvFullwidth}
\section{Extra Credit}
\lipsum[2]
\end{EnvFullwidth}
\bonustitledquestion{Bonus}[5]
\end{questions}
\begin{center}
\begin{tabular}{|r|c|c|}
\hline
\multicolumn{3}{|c|}{\textbf{Exam Score}} \\ \hline
\textbf{Section} & \textbf{Points} & \textbf{Score} \\ \hline
Short Answer & \pointsinrange{section1} & \\ \hline
Multiple Choice & \pointsinrange{section2} & \\ \hline
Bonus & \numbonuspoints & \\ \hline
Total & \numpoints & \\ \hline
\end{tabular}
\end{center}
\end{document}
输出:
答案2
我知道这并不是您所寻找的,但是课堂积分计算背后的机制exam
非常复杂,因此我向您提出了一种不同的解决方案。
您可能知道,当您使用多个环境时就会出现问题,因此我的建议是仅在一个环境内的环境中questions
嵌入\section
s 和其他内容。EnvFullwidth
questions
通过这种方式,您还可以消除序言中的补丁。
梅威瑟:
\documentclass[11pt,addpoints]{exam}
\usepackage{lipsum}
\begin{document}
\begin{questions}
\begin{EnvFullwidth}
\section{Short Answer}
\lipsum[2]
\end{EnvFullwidth}
\begingradingrange{section1}
\question[5] First Question
\question[5] Second Question
\endgradingrange{section1}
\begin{EnvFullwidth}
\section{Multiple Choice}
\lipsum[2]
\end{EnvFullwidth}
\begingradingrange{section2}
\question[2] First Question
\question[2] Second Question
\endgradingrange{section2}
\begin{EnvFullwidth}
\section{Extra Credit}
\lipsum[2]
\end{EnvFullwidth}
\bonusquestion[5] Bonus
\end{questions}
\begin{center}
\begin{tabular}{|r|c|c|}
\hline
\multicolumn{3}{|c|}{\textbf{Exam Score}} \\ \hline
\textbf{Section} & \textbf{Points} & \textbf{Score} \\ \hline
Short Answer & \pointsinrange{section1} & \\ \hline
Multiple Choice & \pointsinrange{section2} & \\ \hline
Bonus & \numbonuspoints & \\ \hline
Total & \numpoints & \\ \hline
\end{tabular}
\end{center}
\end{document}
输出(表格):
答案3
抱歉,我对包一无所知。我只保留了示例代码中的标记,exam
并定义了序列\begingradingrange
、、、,以及它们的工作方式。我完全忽略了的功能。这可能是错误的,因为您需要将功能与此处描述的功能联系起来。但我的示例表明,如果我们知道 TeX 基元\endgradingrange
,那么我们就不需要使用外部包并对该包进行复杂的修补,因为编写自己的代码更简单。\question
\bonusquestion
\pointsinrange
\numbonuspoints
\numpoints
exam
exam
\documentclass[11pt,addpoints]{exam}
\newcount\qnum \newcount\points \newcount\totpoints
\def\begingradingrange#1{\bgroup\def\currrange{#1}}
\def\endgradingrange#1{%
\expandafter\xdef\csname p:\currrange\endcsname{\the\points}%
\egroup\vskip2\baselineskip}
\def\question[#1]{\par\everypar={}\smallskip
\advance\qnum by1 \advance\points by#1 \global\advance\totpoints by#1
\indent\llap{\the\qnum. }(#1 point\ifcase#1s\or\else s\fi)
\ignorespaces
}
\def\bonusquestion[#1]{%
\expandafter\gdef\csname p:bonus\endcsname{#1}%
\question[#1]%
}
\def\pointsinrange#1{\csname p:#1\endcsname}
\def\numpoints{\the\totpoints}
\def\numbonuspoints{\csname p:bonus\endcsname}
\begin{document}
\section{Short Answer}
%\begin{questions}
\begingradingrange{section1}
\question[5] First Question
\question[5] Second Question
\endgradingrange{section1}
%\end{questions}
\section{Multiple Choice}
%\begin{questions}
\begingradingrange{section2}
\question[2] First Question
\question[2] Second Question
\endgradingrange{section2}
%\end{questions}
\section{Extra Credit}
%\begin{questions}
\bonusquestion[5] Bonus
%\end{questions}
\bigskip
\begin{center}
\begin{tabular}{|r|c|c|}
\hline
\multicolumn{3}{|c|}{\textbf{Exam Score}} \\
\hline
\textbf{Section} & \textbf{Points} & \textbf{Score} \\
\hline
Short Answer & \pointsinrange{section1} & \\
\hline
Multiple Choice & \pointsinrange{section2} & \\
\hline
Bonus & \numbonuspoints & \\
\hline
Total & \numpoints & \\
\hline
\end{tabular}
\end{center}
\end{document}