这一定很容易,但我的 TeX 知识不足。
我怎样才能\label{key}
在枚举环境中引用项目enumi
而不是项目\theenumi
(这似乎是默认的)。
问题:我已经使用了\renewcommand\theenumi{\footnotesize{\emph{Element~\arabic{enumi}}}}
,因此\ref{key}
(例如在第三项中)返回“元素 3”而不是简单的“3”---这正是我所寻找的。
如有任何建议我将不胜感激。
答案1
这其实很容易enumitem
因为它允许您为列表指定单独label
且正确的键:ref
\documentclass{article}
\usepackage{enumitem}
\begin{document}
\begin{enumerate}[label={\footnotesize\emph{Element~\arabic*}},ref=\arabic*]
\item First item\label{item1}
\item[(b)] Second item
\item Third item\label{item3}
\end{enumerate}
This should be one: \ref{item1}
This should be two: \ref{item3}
\end{document}
使用特殊*
形式来识别实际的计数器格式。
答案2
通过执行一些\show
,您可以看到\label
使用命令\@currentlabel
来确定引用应该是什么。因此使用etoolbox
,我们可以说:
\newif\if@mynoitemarg
\@mynoitemargfalse
\def\item{\@inmatherr\item\@ifnextchar[%
\@item
{\@noitemargtrue\@mynoitemargtrue\@item[\@itemlabel]}%
}%]
\apptocmd\@item{
\xdef\@currentlabel{\if@mynoitemarg\arabic{enumi}\else #1\fi}
\if@mynoitemarg\@mynoitemargfalse\fi\ignorespaces
}
它就会按照你期望的方式运行。
这是一个完整的例子:
\documentclass{article}
\usepackage{enumerate}
\usepackage{etoolbox}
\makeatletter
\newif\if@mynoitemarg
\@mynoitemargfalse
\def\item{\@inmatherr\item\@ifnextchar[%
\@item
{\@noitemargtrue\@mynoitemargtrue\@item[\@itemlabel]}%
}%]
\apptocmd\@item{
\xdef\@currentlabel{\if@mynoitemarg\arabic{enumi}\else #1\fi}
\if@mynoitemarg\@mynoitemargfalse\fi\ignorespaces
}
\makeatother
\begin{enumerate}[(a)]
\item this \label{a}
\item[hi] \label{hi}
\item again \label{b}
\item[there] \label{there}
\end{enumerate}
This should be one: \ref{a}
This should be two: \ref{b}
This should be hi: \ref{hi}
This should be there: \ref{there}
\end{document}
编辑:Werner 指出我之前的解决方案不适用于 \item 的可选参数,因此我修复了这个问题,并将该情况下的标签文本定义为提供的可选参数。