LaTeX 中描述列表项的参考名称

LaTeX 中描述列表项的参考名称

(转载自堆栈溢出

我想通过名称而不是编号来引用描述列表项。为此,我为每个项目添加了标签,但引用它们时,我只能获得部分的名称,而不是列表项的名称。我该如何更改它以显示每个项目的自定义标签?

\section{Definitions}
\begin{description}
    \item [Vehicle\label{itm:vehicle}] Something
    \item [Bus\label{itm:bus}] A type of \nameref{itm:vehicle}
    \item [Car\label{itm:car}] A type of \nameref{itm:vehicle} smaller than a \nameref{itm:bus}
\end{description}

结果是这样的:

1 定义

车辆某物
公共汽车一种定义
小于定义的定义类型

我想要以下内容:

1 定义

车辆某物
公共汽车车辆类型
比巴士小的车辆

另一种解决方案是使用小节并将它们显示为定义列表。有人知道该怎么做吗?

Stack Overflow 上的最佳答案引用了\制作字母破解:

\makeatletter
\def\namedlabel#1#2{\begingroup
   \def\@currentlabel{#2}%
   \label{#1}\endgroup
}
\makeatother
...
\section{Definitions}
\begin{description}
    \item [Vehicle\namedlabel{itm:vehicle}{Vehicle}] Something
    \item [Bus\namedlabel{itm:bus}{Bus}] A type of \ref{itm:vehicle}
    \item [Car\namedlabel{itm:car}{Car}] A type of \ref{itm:vehicle} smaller than a \ref{itm:bus}
\end{description}

它可以工作,但需要注意的是,链接会返回到节标题,而不是列表项。最好使用不会破坏的本机内容\ref

答案1

稍微扩展一下其他一些答案:这里有一个不改变描述环境语法的修改:

\documentclass{article}
\usepackage{hyperref}
\usepackage{nameref}

\makeatletter
\let\orgdescriptionlabel\descriptionlabel
\renewcommand*{\descriptionlabel}[1]{%
  \let\orglabel\label
  \let\label\@gobble
  \phantomsection
  \edef\@currentlabel{#1}%
  %\edef\@currentlabelname{#1}%
  \let\label\orglabel
  \orgdescriptionlabel{#1}%
}
\makeatother

\begin{document}

\section{Definitions}
\begin{description}
    \item [Vehicle\label{itm:vehicle}] Something
    \item [Bus\label{itm:bus}] A type of \ref{itm:vehicle}
    \item [Car\label{itm:car}] A type of \ref{itm:vehicle} smaller than a \ref{itm:bus}
\end{description} 

The item `\ref{itm:bus}' is listed on page~\pageref{itm:bus} in section~\nameref{itm:bus}.

\end{document}

答案2

这是一个似乎可行的版本。我认为,您尝试执行的操作有两个不同的问题。一个是简单地让标签成为您想要的,而不是根据某种自动编号方案。这就是 SO hack 所做的。另一个问题是确保这些标签指的是您认为它们指的是什么。SO hack 没有解决这个问题。关键是标签既是标签又是标记。在普通的 TeX 中,这种双重角色是不可见的,因为标记实际上并没有使用(好吧,它用于确定标签应该包含什么,但您想覆盖它)。但是当使用超链接包时,例如超链接,这个标记又有了意义:它是超链接指向的地方。

因此,您既需要更改标签,又需要将标记放在正确的位置。前者可以通过 SO hack 解决,但后者(正如我所说)不能。您可以明确添加标记,也可以颠覆某些会自动添加标记的方法。它们不存在的原因是您使用的环境description不会自动添加标记。通过使用不同的列表环境(例如enumerate,确实会添加标记),我们可以获得所需的行为。恐怕这仍然是一种“黑客行为”,但不是很大。

据我的测试显示,以下方法可以实现这一点:

\documentclass{article}
\usepackage{hyperref}

\makeatletter
\newcommand{\labitem}[2]{%
\def\@itemlabel{\textbf{#1}}
\item
\def\@currentlabel{#1}\label{#2}}
\makeatother

\begin{document}
\begin{enumerate}
\labitem{Vehicle}{itm:vehicle} Something
\labitem{Bus}{itm:bus} A type of \ref{itm:vehicle}
\labitem{Car}{itm:car} A type of \ref{itm:vehicle} smaller than a \ref{itm:bus}
\end{enumerate}

Let's refer to \ref{itm:vehicle} \ref{itm:bus} and \ref{itm:car}

\end{document}

答案3

根据第二条建议,假设您正在使用 hyperref,您可以将定义更改为:

\makeatletter
\def\namedlabel#1#2{\begingroup
   \def\@currentlabel{#2}%
   \phantomsection\label{#1}\endgroup
}
\makeatother

幻影部分应该锚定指向该项目的反向引用链接。

可能也有办法使用 enumitem 包来做到这一点,但我必须进一步研究它。

相关内容