Проблема с использованием `totcount` для создания счетчика баллов для каждого вопроса экзамена

Проблема с использованием `totcount` для создания счетчика баллов для каждого вопроса экзамена

На титульном листе экзамена я хочу создать таблицу вопросов и их итоговых баллов. (Это часть пакета, который я пишу. Я знаю о нем exam.sty, но он мне не подходит.) У меня есть цикл, который генерирует таблицу, но в моем MWE ниже я просто создаю таблицу вручную: проблема во вспомогательном файле.

Я пытаюсь использовать totcount. Он отлично подходит для отслеживания количества вопросов и подсчета баллов, но я не могу заставить его записывать общее количество баллов за каждый вопрос в aux.

Примечание: Я не против простого использования a \defдля подсчета баллов за вопросы, но идея в том, что я хочу иметь возможность добавлять подвопросы, которые увеличивают счетчик вопросов.

Мои вопросы

  1. Есть ли лучший подход, чем в нижеприведенном MWE?
  2. Что не так?
  3. Если я не собираюсь отказываться от этого подхода, как мне это исправить?

МВЭ

В приведенном ниже 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 вопросов aux-файл гласит:

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

После двух запусков вы получите

введите описание изображения здесь

Связанный контент