備忘録: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{…}で親カウンターを含めて参照するにはどうしたらいいんだ??