複数のカウンタの値をまとめて参照する

たとえばenumerateやsubsectionにおいては,その上位の階層のカウンタと,その時点でのカウンタを合わせたものを参照先として提供している.つまり,

\begin{enumerate}
    \item hoge
    \begin{enumerate}
        \item huga \label{huga}
        \item piyo
    \end{enumerate}
\end{enumerate}

\ref{huga} % 1a

というように,enumiienumiの値と合わせて参照できるようになっている.

さて,これを自前でやるにはどうするか,という話.

前提

\newcounter{hoge} % 一つ目カウンタ定義
\setcounter{hoge}{0} % カウンタリセット
\newcounter{huga} % 二つ目カウンタ定義
\setcounter{huga}{0} % カウンタリセット
\renewcommand{\thehuga}{\alph{huga}} % 二つ目のカウンタをアルファベットに
\newcommand{\hoge}{\refstepcounter{hoge}\setcounter{huga}{0}} % 呼び出すごとに一つ目のカウンタの値を進めると同時に,二つ目のカウンタをリセット
\newcommand{\huga}{\refstepcounter{huga}\thehoge\thehuga} % 二つ目のカウンタと一つ目のカウンタをまとめて呼び出す

\huga\label{huga} % 1a
\ref{huga} % a

このように,二つのカウンタの値を続けて出すだけの命令だと,参照時に後ろの一つしか参照することができない.

解決

\newcounter{hoge}
\setcounter{hoge}{0}
\newcounter{huga}
\setcounter{huga}{0} 
\renewcommand{\thehuga}{\hoge\alph{huga}} % 両方の値を出力するように\thehugaを再定義
\newcommand{\hoge}{\refstepcounter{hoge}\setcounter{huga}{0}}
\newcommand{\huga}{\refstepcounter{huga}\thehuga} % こっちは\thehugaだけ

\huga\label{huga} % 1a
\ref{huga} % 1a

出力命令を新規に作るときに二つの値を呼び出すのではなく,既存の出力命令\thehugaを加工して値を並べてやると,両方の値を並べて参照できる.これはjsarticle.clsなどのクラスファイルでenumerateのenumiiやsubsectionなどの定義において用いられている方法である.

つまり\labelと\refによる参照はカウンタそのものの値を参照しているというより,\theカウンタが呼び出している値を読んでいるということになる.この仕様はおそらくenumerateやsubsectionを実現するためのものだろうと思う.