考试类别:计算小计分数的宏

考试类别:计算小计分数的宏

我有一个问题(代码如下),它有子部分。部分 (a) 进一步分为 3 个部分:i、ii 和 iii,而部分 (b) 不包含任何子部分。此问题的总分为 15 分,其中部分 (a) 为 11 分,部分 (b) 为 4 分。

考试类包中有一个宏\totalpoints,它能为整个问题给出 11 + 4 = 15 分。但是没有宏可以只计算部分 (a) 的分数(分数)。我想要一个宏,它还能将部分 (a) 的分数相加,即 2 + 6 + 3,得到 11 分。按照今天的代码,我必须手动编写\part[11],即我必须手动进行 2 + 6 + 3 的加法。我想要一个可以直接使用的宏,因为\part[\mymacro]它相当于\part[11]

\totalpoints还应该识别宏,这样我仍然可以得到 11 + 4 = 15 作为该问题的总分。宏可能只对整个问题的一个子问题可见,以便它可以在其他问题的其他子问题中用于计算那里的相应总和。

\documentclass[addpoints,12pt]{exam}

\begin{document}

\pointpoints{mark}{marks}


\begin{questions}

\qformat{Question: \thequestion \dotfill {\bfseries \totalpoints\ marks}}
\question


\begin{parts}

\addpoints
\boxedpoints
\part[11]
\noboxedpoints

\noaddpoints

Some background words about the first question.\\[-6.5mm]

\begin{subparts}

  \subpart[2] Show that John is a boy.

  \subpart[6] Show that Jane is a girl.

  \subpart[3] Show that Janice is a monkey.

\end{subparts}

\vspace{5mm}


\addpoints
\boxedpoints
\part[4]
\noboxedpoints


My second question is here and it is worth 4 points. There are no subparts.

\end{parts}


\end{questions}

\end{document}

根据@John Kormylo 提出的答案,为了让宏也能满足半点要求,无法获得正确的输出。请参阅下面的输出: 在此处输入图片描述

我们确实得到了 9 1/2 分,这是该子部分总分的要求subtotal然而,第 (ii) 部分和第 (iii) 部分之间插入了三个附加内容 1/2而且现在\totalpoints忽略了1/2的分数.aux文件显示如下:

\relax

\gdef\subtotal@i@i{9\half}

\gdef\pointsofq@i{13}

\gdef\bonuspointsofq@i{0}

\PgInfo{question@1}{1}

\PgInfo{question1@object1}{1}

\newlabel{question@1}{{1}{1}}

\PgInfo{part@1@1}{1}

\PgInfo{question1@object2}{1}

\newlabel{part@1@1}{{a}{1}}

\PgInfo{subpart@1@1@1}{1}

\PgInfo{question1@object3}{1}

\newlabel{subpart@1@1@1}{{i}{1}}

\newlabel{firstpoints@onpage@1}{{i}{1}}

\PgInfo{subpart@1@1@2}{1}

\PgInfo{question1@object4}{1}

\newlabel{subpart@1@1@2}{{ii}{1}}

\PgInfo{subpart@1@1@3}{1}

\PgInfo{question1@object5}{1}

\newlabel{subpart@1@1@3}{{iii}{1}}

\PgInfo{part@1@2}{1}

\PgInfo{question1@object6}{1}

\newlabel{part@1@2}{{b}{1}}

\gdef\exam@lastpage{1}

\gdef\exam@lastcoverpage{0}

\gdef\exam@totalpages{1}

\gdef\exam@numpoints{13}

\gdef\exam@numbonuspoints{0}

\gdef\exam@numquestions{1}

\gdef\exam@numparts{2}

\gdef\exam@numsubparts{3}

\gdef\exam@numsubsubparts{0}

\gdef\pointsonpage@i{13}

\gdef\lastpage@withpoints{1}

\gdef\lastpage@withbonuspoints{0}

编译是TeXLive 2014使用dvi > ps > pdf工作流完成的。

答案1

我添加了一个\subtotal与问题和部分相关的宏。它的工作原理是在辅助文件中存储一个数字,与\totalpoints(more of less)相同。

有趣的是,这个数字被忽略了\addpoints

\documentclass[addpoints,12pt]{exam}

\makeatletter
\newcommand{\subtotal}{\@ifundefined{subtotal@\roman{question}@\roman{partno}}%
  {}%
  {\csname subtotal@\roman{question}@\roman{partno}\endcsname}}

\new@hlfcntr{part@subtotal}

\let\normal@subparts=\subparts
\let\endnormal@subparts=\endsubparts
\renewenvironment{subparts}% no arguments?
 {\set@hlfcntr{part@subtotal}{0}%
  \normal@subparts
  \let\normal@subpart=\@doitem
  \let\@doitem=\my@subpart
 }{%
  \endnormal@subparts
  \ifnum\c@part@subtotal>0
    \immediate\write\@auxout{\string\gdef\string\subtotal@\roman{question}@\roman{partno}%
      {\prtaux@hlfcntr{part@subtotal}}}%
  \fi
 }

\newcommand{\my@subpart}[1][\@empty]{%
  \ifx\@empty#1\relax
    \expandafter\normal@subpart
  \else
    \ifx\@empty\@details
    \else
      \addto@hlfcntr{part@subtotal}{#1}%
    \fi
    \expandafter\normal@subpart\expandafter[\expandafter#1\expandafter]%
  \fi
}%
\makeatother

\begin{document}

\pointpoints{mark}{marks}


\begin{questions}

\qformat{Question: \thequestion \dotfill {\bfseries \totalpoints\ marks}}
\question


\begin{parts}

\addpoints
\boxedpoints
\part[\subtotal]

Some background words about the first question.\\[-6.5mm]

\begin{subparts}
  \noboxedpoints
  \subpart[2] Show that John is a boy.

  \subpart[6] Show that Jane is a girl.

  \subpart[3 \half] Show that Janice is a monkey.

\end{subparts}

\vspace{5mm}

\boxedpoints
\part[4]
\noboxedpoints


My second question is here and it is worth 4 points. There are no subparts.

\end{parts}


\end{questions}

\end{document}

相关内容