我时不时地会使用描述列表环境
\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
列表项的显示“标题”是完全自定义的,同时支持\label
s。(内置description
环境不支持\label
s,而内置enumerate
环境不支持自定义“标题”。)该enumitem
包为环境增加了一些可定制性,但据我所知,它并不完全支持我想要的。
答案1
我不知道有哪个预构建的包允许您执行此操作,但如果我正确理解了您的要求,那么通过将计数器与自定义命令和包相结合即可实现此目的hyperref
。第一步是为所述项目创建一个新计数器,以及一对用于代替和的新命令\item
。\ref
在序言中,输入以下内容:
\newcounter{desccount}
\newcommand{\descitem}[1]{%
\item[#1] \refstepcounter{desccount}\label{#1}
}
\newcommand{\descref}[1]{\hyperref[#1]{#1}}
新命令\descitem
将用于环境\item
中description
。它接受一个参数并创建一个标有该参数的项目。它还会增加新计数器,将其设置为命令的当前值\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 ...\item
mydescription
\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
,其中包含引用计数器时在文档中打印的字符串。显然,也可以采用一种解决方案,即向环境提供附加参数,使引用的显示不同于标题。