備忘録:TeXの自作カウンター:addtocounter{num}{1}とstepcounter{num}の違い,親カウンターと子カウンター

レポート課題をTeXで作成するにあたって,レポート番号を自作カウンターで振っていた.各レポートの最初に出力されるヘッダーで,カウンターが1つずつ更新される仕組みにしていた.

%宿題のヘッダー
\newcommand{\header}{
\addtocounter{reportnumber}{1}
\setcounter{problemcounter}{0}
\clearpage
\textbf{\LARGE レポート課題\arabic{reportnumber} }
\par\vspace{3mm}
\begin{shadebox}
\begin{itemize}
\item 提出課題を解きkibacoに答を入力して下さい.
\item 自習課題は提出する必要はありません.理解を深めるために自習しましょう.
\end{itemize}
\end{shadebox}
}

図表の番号は,各レポートごとに分けて出力したい.そこで
http://rexpit.blog29.fc2.com/blog-entry-99.html
などを参照して

\makeatletter
	\renewcommand{\thefigure}{% 図番号の付け方
	\thereportnumber.\arabic{figure}}
	\@addtoreset{figure}{reportnumber}
	\renewcommand{\thetable}{% 表番号の付け方
	\thereportnumber.\arabic{table}}
	\@addtoreset{table}{reportnumber}
\makeatother

としてみた.

ところが,これでは各レポートごとに図表番号が初期化されない.レポート1で図1.1,図1.2と出力されたあと,レポート2では図2.1と出力して欲しいのに,図2.3になってしまう.

上記の参照記事だと,カウンターはデフォルトでリセットされるはずなんだけど…

問題は

\addtocounter{reportnumber}{1}

にあった.カウンターを1つずつ進めるには

\stepcounter{reportnumber}

を使う.そうすると@addtoresetというコマンドによって,カウンター
reportnumber がstepcounterによって増えるたびにリセットされるようだ.

\@addtoreset{カウンタ}{親カウンタ}:親カウンタが増えると(子)カウンタがリセットされる.

なるほど,親カウンターと子カウンターという概念があるんだ.知らなかった.

あれ?そうすると,待てよ.problemcounterというカウンター(問題番号をカウントする)を作っているんだが...レポート番号をリセットするためにヘッダーに

カウンターの定義
\newcounter{problemcounter}

各問題ごとにカウンターを進めるとき
\addtocounter{reportnumber}{1}  %これまで
\setcounter{problemcounter}{0}  %ヘッダーでカウンターをリセット

としてきた.こちらも親カウンターをreportnumberと考えて

カウンターの定義
\newcounter{problemcounter}[reportnumber]
\stepcounter{reportnumber}

とすれば良くて,\setcounter{problemcounter}{0} はいらないのではないかな?

やってみると,うまく行って,その通りだった.なるほど!!