Auf dem Deckblatt einer Prüfung möchte ich eine tabellarische Auflistung der Fragen und ihrer Gesamtpunktzahlen erstellen. (Dies ist Teil eines Pakets, das ich schreibe. Ich weiß davon exam.sty
, aber es passt mir nicht.) Ich habe eine Schleife, die die Tabelle generiert, aber in meinem MWE unten tabelliere ich einfach manuell: Das Problem liegt in der AUX-Datei.
Ich versuche, zu verwenden totcount
. Damit kann ich die Anzahl der Fragen und die Punktzahl im Auge behalten, aber ich schaffe es nicht, die Gesamtpunktzahl jeder Frage im AUX aufzuzeichnen.
NB: Ich bin nicht abgeneigt, einfach ein zu verwenden, \def
um die Punktzahlen der Fragen zu speichern, aber die Idee ist, dass ich Unterfragen hinzufügen können möchte, die den Zähler der Frage erhöhen.
Meine Fragen
- Gibt es einen besseren Ansatz als den unten stehenden MWE
- Was läuft schief?
- Wenn ich diesen Ansatz nicht aufgeben möchte, wie kann ich das Problem beheben?
MWE
Im folgenden 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}
Die Gesamtpunktzahl der letzten Frage wird einfach mit dem Vielfachen der Anzahl der Fragen aufgezeichnet. In diesem speziellen Fall von 3 Fragen lautet die AUX-Datei:
\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}
und das Dokument (und das Protokoll) spiegeln das Fehlen von qpoints1
und wider qpoints2
:
Antwort1
\global\expandafter
tut nichts Nützliches. Sie müssen das Argument erweitern, bevor Sie es an \newtotcounter
und übergeben \setcounter
.
Auch mit den möglicherweise noch nicht vorhandenen Zählern muss gerechnet werden.
\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}
Nach zwei Durchläufen erhältst du