На титульном листе экзамена я хочу создать таблицу вопросов и их итоговых баллов. (Это часть пакета, который я пишу. Я знаю о нем exam.sty
, но он мне не подходит.) У меня есть цикл, который генерирует таблицу, но в моем MWE ниже я просто создаю таблицу вручную: проблема во вспомогательном файле.
Я пытаюсь использовать totcount
. Он отлично подходит для отслеживания количества вопросов и подсчета баллов, но я не могу заставить его записывать общее количество баллов за каждый вопрос в aux.
Примечание: Я не против простого использования a \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 вопросов 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}
После двух запусков вы получите