(转载自堆栈溢出)
我想通过名称而不是编号来引用描述列表项。为此,我为每个项目添加了标签,但引用它们时,我只能获得部分的名称,而不是列表项的名称。我该如何更改它以显示每个项目的自定义标签?
\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 包来做到这一点,但我必须进一步研究它。