備忘録:TeX自作カウンター:ラベルをつけて親カウンターを含め参照したい

※本をTeXで書いている。各章に例題1.1、例題1.2…などの章番号をつけ、例題を挿入したい。
※例題の中に\toiと打つと、自動的に問1、問2などの番号が振られるようにしたい。
※例題の途中で \kai と打ったところで [解] という太字が挿入されて、そこから回答を書きたい。解答も終わったら (問題1.1終) と入れたい。
※labelをつけておき、あとで参照したい。
※なので、与えられたnewtheoremを使えないので、自分で環境を作る。

コードの例

%%%%例題の環境の設定
\newcounter{questioncounter}[chapter] %例題のカウンター:親カウンターがchapter
\newcounter{toicounter}%問のカウンター
\renewcommand{\thequestioncounter}{\arabic{chapter}.\arabic{questioncounter}}
%ここがポイント。questioncounterの表示を、章番号も含めるように再定義
%再定義しないと、questioncounterの部分だけ参照してしまう
\newenvironment{question}[1]{ %例題の環境定義
\refstepcounter{questioncounter} %例題のカウンターを1つ進める
\setcounter{toicounter}{0} %問のカウンターは、0にリセット
\par\vspace{2mm}\noindent\textbf{例題\thequestioncounter}.
\label{#1} %ラベルをコマンドの引数としてつける。
}
{(例題\thequestioncounter 終)\vspace{2mm}}
%%%%問の設定
\newcommand{\toi}{
\refstepcounter{toicounter} \textbf{問\thetoicounter :}
}
%%%%解の定義
\newcommand{\kai}{%
\vspace{1mm}\par\textbf{[解]:}
\setcounter{toicounter}{0}
}

本文の例

\begin{document}

\chapter{これは}

これは練習です。

\begin{question}{q:nash}
\toi ナッシュ均衡を求めよ。
\toi 部分ゲーム完全均衡を求めよ。
\kai
\toi ナッシュ均衡はこう。
\toi 部分ゲーム完全均衡はこう。
\end{question}

それでは、例題\ref{q:nash}をよく勉強しておきなさいよ。

\end{document}

出力

こちら

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

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

%宿題の定型文
\newcommand{\teikei}{
\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} はいらないのではないかな?

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

次の問題:
\label{…}、\ref{…}で親カウンターを含めて参照するにはどうしたらいいんだ??