自定义 \label 和 \ref

自定义 \label 和 \ref

这一定很容易,但我的 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 的可选参数,因此我修复了这个问题,并将该情况下的标签文本定义为提供的可选参数。

相关内容