使用 enumitem 引用自定义标签

使用 enumitem 引用自定义标签

我想要如下的东西:

\begin{enumerate}
  \item[(A)] \label{hyp:a} foo 
  \item[(X)] \label{hyp:x} bar
  \item[(G)] \label{hyp:g} foo bar
\end{enumerate}

Now referencing to hypothesis \ref{hyp:a}, \ref{hyp:x} and \ref{hyp:g}.

最后一行应该输出:

现在参考(A)、(X)和(G)。

目前,它生产:

现在参考、和。


我使用了随机字母 A、X 和 G,以便您明白枚举\alph*列表不是我想要的。

(此外,如果它具有任何重要性,我实际上希望带有自定义标签的列表位于另一个通常枚举的列表的项目内。)

答案1

\item[foo]\label{foo}将不会放置正确的标签,无论是引用本身还是使用的链接hyperref,因为没有计数器涉及\item[]的版本\item

一种可能的解决方案是定义一个明确的\@currentlabel,然后应用\label,从而伪造某些计数器的使用。

crossreftools提供\crtcrossreflabel了此类情况。可选值是标签名称。但是,由于\item[...]使用了,因此{\crtcrossreflabel{}[]}必须应用以保护[]。正确的超锚点\phantomsection已在内部得到保证。

我提供了一个简单的inline方法,\optionaldesc\phantomsection行为基本与相同\crtcrossreflabel

\documentclass{article}
\usepackage{enumitem}
\usepackage{hyperref}

\usepackage{crossreftools}

\makeatletter
\newcommand{\optionaldesc}[2]{%
  \phantomsection
  #1\protected@edef\@currentlabel{#1}\label{#2}%
}
\makeatother

\begin{document}



\section{Foo} 
\clearpage
\begin{enumerate}
\item[{\crtcrossreflabel{(A)}[hyp:a]}] foo 
\item[\optionaldesc{(X)}{hyp:x}] bar
\item[{\crtcrossreflabel{(G)}[hyp:g]}] foo bar
\end{enumerate}
\clearpage
Now referencing to hypothesis \ref{hyp:a}, \ref{hyp:x}
and \ref{hyp:g}
\end{document}

在此处输入图片描述

相关内容