如何交叉引用描述列表中的项目?

如何交叉引用描述列表中的项目?

我时不时地会使用描述列表环境

\begin{description}
\item[foo]  foo is good
\item[bar]  bar is bad
\end{description}

创建带有非数字标签的列表。不幸的是,描述列表不支持像普通 latex 那样的标签-参考对:也就是说,如果我写

\begin{description}
\item[foo] \label{foo} foo is good
....
\end{description}
....
For good things (see, for example \ref{foo})... 

引用不指向列表中的项目。而是指向支持标签的最近环境(通常是子部分)。因此,它不会显示文本 foo(粗体),而是显示类似 2.2.1 的内容(与描述环境所在的子部分相对应)。

我的问题是:是否有方法或包允许引用描述列表项?我目前的解决方法是自己在位置键入文本(因为我自己命名了它,并且它没有编号,所以格式不太可能改变标签 =)。但是 latex 中标签/参考对的优点之一是 pdflatex 中的实现允许在 PDF 中引用和引用的对象之间建立超链接,这是我自己无法复制的。

编辑:让我重新表述一下我的问题。主要目标是不是显示\ref为 LaTeX 认为不是的内容\label。有很多方法可以解决这个问题,其中一些方法在下面 Michael Underwood 的有用回答中概述。我正在寻找的是是否存在列表环境的实现,它类似于内置环境,其中description列表项的显示“标题”是完全自定义的,同时支持\labels。(内置description环境不支持\labels,而内置enumerate环境不支持自定义“标题”。)该enumitem包为环境增加了一些可定制性,但据我所知,它并不完全支持我想要的。

答案1

我不知道有哪个预构建的包允许您执行此操作,但如果我正确理解了您的要求,那么通过将计数器与自定义命令和包相结合即可实现此目的hyperref。第一步是为所述项目创建一个新计数器,以及一对用于代替和的新命令\item\ref在序言中,输入以下内容:

\newcounter{desccount}
\newcommand{\descitem}[1]{%
  \item[#1] \refstepcounter{desccount}\label{#1}
}
\newcommand{\descref}[1]{\hyperref[#1]{#1}}

新命令\descitem将用于环境\itemdescription。它接受一个参数并创建一个标有该参数的项目。它还会增加新计数器,将其设置为命令的当前值\ref,并使用项目的描述符标记位置。新命令\descref接受相同的参数并创建指向标签的超链接引用,显示参数而不是计数器的值。

这些命令一起工作如下:

\begin{description}
  \descitem{foo} foo is good
  \descitem{bar} bar is bad
\end{description}
...
For good things (see, for example \descref{foo})... 

答案2

好的,在 Michael 的第二个回答之后,我有了一个想法,我想在这里记录下来。除了使用环境之外description,似乎另一种方法是滥用环境list。以下代码片段是可以做的

\newcounter{foobarcounter}
\renewcommand{\thefoobarcounter}
      {({\ifcase\value{foobarcounter}\or foo\or bar\else ehhh\fi\relax})}
\begin{list}{\thefoobarcounter}{\usecounter{foobarcounter}}
 \item\label{foodesc} Foo is good
 \item Bar is bad
 \item This list was not supposed to be this long
\end{list}
......
.. Something good, see \ref{foodesc}.

欢迎评论。

答案3

一种快速而肮脏的方法可能是修补底层的\@item-command 以放置一个\phantomsection,即超链接的锚点,并重新定义\@currentlabel以扩展到可选参数的内容。

使用这种方法时,请不要在 -environment中\label的可选参数中使用 -command ...\itemmydescription

\documentclass{article}
\usepackage{hyperref}
\begin{document}
\makeatletter
\newcommand\my@saved@item{}
\newcommand\mydescriptionitem{}
\def\mydescriptionitem[#1]{%
  \my@saved@item[{\csname phantomsection\endcsname#1}]%
  \def\@currentlabel{\unexpanded{\unexpanded{#1}}}%
}%
\newenvironment{mydescription}%
               {%
                  \let\my@saved@item=\@item
                  \let\@item=\mydescriptionitem
                  \description
               }%
               {\csname enddescription\endcsname}
\makeatother

\begin{mydescription}
\item[foo]  \label{foo} foo is good
\item[bar]  \label{bar} bar is bad
\end{mydescription}

For good things (see, for example \ref{foo})\dots

For bad things (see, for example \ref{bar})\dots

\end{document}

在此处输入图片描述

答案4

老实说,我不建议在你的任务中使用描述/枚举/条目,但从我现在提供的答案中,你可以得出如何覆盖\item宏/命令,如果你真的想要使用描述环境。

以下是我要做的事情:

\newcounter{foocnt}   %% define a counter
\setcounter{foocnt}{0} %% set the counter to some initial value (not really important)
%%%% Parameters
% #1: Title
\newenvironment{fooEnvironment}[1]
{
    \renewcommand{\thefoocnt}{\textbf{#1}}  %% this is where the display of the counter is overwritten/modified
    \refstepcounter{foocnt} %% increment counter (in this case we write the custom label/title to a temp. file which is read when the document resolves a \ref)
    \par  %% start new paragraph (this is just an example for format modifications)
    \textbf{#1:}  %% display the title before the content of the environment is displayed
}{
    \par  %% another paragraph after the environment
}

该解决方案可以按如下方式使用,以等同于您的示例:


\begin{fooEnvironment}{foo}
foo is good
\label{fooLabel}
\end{fooEnvironment}
\begin{fooEnvironment}{bar}
bar is bad
\label{barLabel}
\end{fooEnvironment}
For good things (see, for example \ref{fooLabel})...

这里学到的教训是:在具有名称的计数器的定义中,blubb定义了一个名为的宏\theblubb,其中包含引用计数器时在文档中打印的字符串。显然,也可以采用一种解决方案,即向环境提供附加参数,使引用的显示不同于标题。

相关内容