参照と再定義された列挙リスト

参照と再定義された列挙リスト

を再定義しました\theenumiiが、これはかなり単純です。しかし、これをテキストで参照すると、\ref{enumi21}以下の の結果は 2.1 ではなく 22.1 になります。

\renewcommand{\theenumii}{\theenumi.\arabic{enumii}}を として再定義すると\renewcommand{\theenumii}{.\arabic{enumii}}\ref{enumi21}正しく 2.1 として出力されますが、当然ラベルは乱雑になります。

一方、これが問題を解決する場合:

\renewcommand{\labelenumii}{\arabic{enumi}.\arabic{enumii}}
\renewcommand{\theenumii}{.\arabic{enumii}}

テキストはOKです。しかし \theenumii.1テキスト内の戻り値。もちろん、 を使用する必要はありません\theenumiiが、この背後にあるロジックを理解したいと思います。

\documentclass{article}


\renewcommand{\labelenumii}{\theenumi.\arabic{enumii}}
\renewcommand{\theenumii}{\theenumi.\arabic{enumii}}

\begin{document}
\begin{enumerate}
\item \label{enumi1}
\item Number 2
\begin{enumerate}
    \item Number 2.1 \label{enumi21}
\end{enumerate}
\end{enumerate}

\ref{enumi1}, \ref{enumi21}.

\theenumii \verb|\theenumii|

\theenumi \verb|\theenumi|
\end{document}

答え1

これは動作するようです:

\documentclass{article}

\usepackage{enumitem}
\setlist[enumerate,2]{label=\theenumi.\arabic*}
\usepackage{chngcntr}
\counterwithin{enumii}{enumi}

\begin{document}

\begin{enumerate}
\item \label{enumi1}
\item Number 2
\begin{enumerate}
    \item Number 2.1 \label{enumi21}
\end{enumerate}
\end{enumerate}
See \ref{enumi1}, \ref{enumi21}.

\theenumii \verb|\theenumii|

\theenumi \verb|\theenumi|

\end{document} 

ここに画像の説明を入力してください

あるいは、 をロードしたくない場合はchngcntr\counterwithin{…}次の行に置き換えます。

\renewcommand{\theenumii}{\theenumi.\arabic{enumii}}

答え2

\labelenumiiとの意味を尋ねると\theenumii

\labelenumii:
\long macro:->(\theenumii )

\theenumii:
\long macro:->\@alph \c@enumii 

(私は を使用しましたtexdef)。 を頼むと\p@enumii

\p@enumii:
\long macro:->\theenumi 

これが問題の鍵です。マクロは、ラベルが処理されるときに\p@enumiiによって指定された値の先頭に追加されます。\theenumii

\documentclass{article}

\renewcommand{\labelenumii}{\theenumi.\arabic{enumii}}
\renewcommand{\theenumii}{\arabic{enumii}}
\makeatletter
\renewcommand{\p@enumii}{\theenumi.}
\makeatother

\begin{document}

\begin{enumerate}
\item \label{enumi1}
\item Number 2
\begin{enumerate}
    \item Number 2.1 \label{enumi21}
\end{enumerate}
\end{enumerate}

\verb|\ref{enumi1}| $\to$ \ref{enumi1}.

\verb|\ref{enumi21}| $\to$ \ref{enumi21}.

\end{document}

ここに画像の説明を入力してください

関連情報