我想重新定义enumerate
环境,以便每个环境都\item
自动设置\label{en:\arabic{page}\alph{enumi}}
。我已经尝试过了
\usepackage{etoolbox}
\gappto{\item}{\label{en:\arabic{page}\alph{enumi}}}
但这也会在center
环境中引发我不想要的情况。
我该如何做才能enumitem.sty
尽可能避免冲突?
(不必担心标签的非唯一性——文档布局保证了这一点。)
答案1
使用内部\@item
:
\documentclass{article}
\usepackage{xpatch}
\makeatletter
\xapptocmd{\@item}{\label{en:\arabic{page}\alph{enumi}}}{}{}
\makeatother
\begin{document}
\begin{enumerate}
\item First.
\item Second.
\item Third.
\end{enumerate}
\ref{en:1c}, \ref{en:1b} and~\ref{en:1a}
\end{document}
enumitem
以下是包含包和嵌套环境的示例:
\documentclass{article}
\usepackage{xpatch}
\usepackage{enumitem}
\makeatletter
\xapptocmd{\@item}{
\ifnum\@enumdepth=1\relax
\label{en:\arabic{page}\alph{enumi}}
\else
\ifnum\@enumdepth=2\relax
\label{en:\arabic{page}\arabic{enumii}}
\else
\ifnum\@enumdepth=3\relax
\label{en:\arabic{page}\roman{enumiii}}
\else
\ifnum\@enumdepth=4\relax
\label{en:\arabic{page}\Roman{enumiv}}
\fi\fi\fi\fi
}
{}{}
\makeatother
\setlist[enumerate,1]{label=\alph*)}
\setlist[enumerate,2]{label=\arabic*.,ref=\arabic*}
\setlist[enumerate,3]{label=(\roman*)}
\setlist[enumerate,4]{label=\Roman*.,label=\Roman*}
\begin{document}
\begin{enumerate}
\item First.
\begin{enumerate}
\item First subitem.
\item Second subitem.
\item Third subitem.
\item Fourth subitem.
\end{enumerate}
\item Second.
\item Third.
\end{enumerate}
Some cross-references for the first level: \ref{en:1c}, \ref{en:1b} and~\ref{en:1a} and some cross-references for the second level: \ref{en:14}, \ref{en:13}, \ref{en:12} and~\ref{en:11}.
\end{document}