試験の表紙に、質問とその合計点の表を作成したいと考えています。(これは私が作成しているパッケージの一部です。 は認識していますexam.sty
が、私には適していません。) 表を生成するループがありますが、以下の MWE では手動で表を作成しています。問題は aux ファイルにあります。
を使用しようとしていますtotcount
。質問の数とポイントの合計を追跡するにはうまく機能しますが、各質問のポイント合計を aux に記録することはできません。
注意: 質問のスコアを保持するために を使用することに抵抗はありません\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}
2回実行すると、