我重新定义了\theenumii
,这相当简单,但是当我在文中引用它时,\ref{enumi21}
下面的结果是 22.1,而不是 2.1。
如果我重新定义\renewcommand{\theenumii}{\theenumi.\arabic{enumii}}
为\renewcommand{\theenumii}{.\arabic{enumii}}
,\ref{enumi21}
则会正确输出为 2.1,但标签当然会很混乱。
另一方面,如果这能解决问题:
\renewcommand{\labelenumii}{\arabic{enumi}.\arabic{enumii}}
\renewcommand{\theenumii}{.\arabic{enumii}}
文字还可以,但 \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}