目的
我希望能够在description
使用该enumitem
包创建的环境中标记并引用项目。
什么不起作用
以下示例修改了如何通过名称标记/引用包含宏的描述项?。
\documentclass[12pt]{article}
\usepackage[colorlinks=true,linkcolor=red]{hyperref}
\usepackage[nameinlink,noabbrev,capitalize]{cleveref}
\usepackage{enumitem}
\newlist{describe}{description}{1}
\setlist[describe,1]{%
font=\normalfont\textsf,
itemindent=0pt,
wide,
itemsep=0pt,topsep=2pt,
}
% Redefine Description List Items
% (source: http://tex.stackexchange.com/a/1248/13552)
\makeatletter
\let\orgdescriptionlabel\descriptionlabel
\renewcommand*{\descriptionlabel}[1]{%
\let\orglabel\label
\let\label\@gobble
\phantomsection
\protected@edef\@currentlabel{#1}%
\let\label\orglabel
\orgdescriptionlabel{#1}%
}
\makeatother
\begin{document}
\Large
\section{Good eats}
\begin{describe}
\item [Fruit:] Oranges and apples.
\item [Vegetable:\label{item:veggie}] Kale and potatoes.
\end{describe}
\newpage
Refer to \ref{item:veggie} above on \cpageref{item:veggie}.
\end{document}
输出:
此输出有三个缺陷:
- 参考文献的字体与标签本身一样都是无衬线字体,但我想与
normalfont
周围的文本相匹配。 - 参考文献中有多余的标点符号 (:),但我只想要项目的名称,而不需要任何尾随标点符号。(请注意,对于不同的
describe
环境,尾随标点符号可能不同,例如,句号而不是冒号。) - 引用和其后的文字“above on ...”之间有多余的空白。
这些缺陷如何修复?
什么方法有效但语法不规范
以下版本的来源,基于接受的答案LaTeX 中描述列表项的参考名称,解决了所有三个缺陷——但是可选参数中的语法却很不合适\item
。
我发现语法上的尴尬之处在于,可选参数\item
包含一个新宏\namedlabel
,该宏接受两个参数 - 标签标识符和项目名称 - 然后任何标点符号都必须放在外面并位于第二个参数之后。
\documentclass[12pt]{article}
\usepackage[colorlinks=true,linkcolor=red]{hyperref}
\usepackage[nameinlink,noabbrev,capitalize]{cleveref}
\usepackage{enumitem}
% From
% https://tex.stackexchange.com/questions/1230/reference-name-of-description-list-item-in-latex
\makeatletter
\def\namedlabel#1#2{\begingroup
#2%
\def\@currentlabel{#2}%
\phantomsection\label{#1}\endgroup
}
\makeatother
\newlist{describe}{description}{1}
\setlist[describe,1]{%
font=\normalfont\textsf,
itemindent=0pt,
wide,
itemsep=0pt,topsep=2pt,
}
\crefname{page}{page}{page}
\begin{document}
\Large
\section{Good eats}
\begin{describe}
\item[Fruit:] Oranges and apples.
% Awkward syntax in optional argument to \item below:
\item[\namedlabel{item:veggie}{Vegetable}:] Kale and potatoes.
\end{describe}
%\newpage
Refer to \ref{item:veggie} above on \cpageref{item:veggie}.
\end{document}
答案1
我(和 gernot 对您的问题的评论一样)认为 的语法没有问题\namedlabel
。不过,您确实可以定义其他命令来标记项目标签的部分,使其不成为引用的一部分。您还可以定义\descriptionlabel
在扩展它以定义引用时应如何解释 的参数的自动部分。并且您可以添加一个命令来定义应该将参数的哪一部分传递给引用。下面是一个示例,它会自动\hfil
从引用中删除(但不会删除字体开关或:
),手动删除:
或作为替代方案定义整个引用部分:
\documentclass[12pt]{article}
\usepackage[colorlinks=true,linkcolor=red]{hyperref}
\usepackage[nameinlink,noabbrev,capitalize]{cleveref}
\usepackage{enumitem}
\newlist{describe}{description}{1}
\setlist[describe,1]{%
font=\normalfont\textsf,
itemindent=0pt,
wide,
itemsep=0pt,topsep=2pt,
}
% Redefine Description List Items
% (source: http://tex.stackexchange.com/a/1248/13552)
\makeatletter
\let\orgdescriptionlabel\descriptionlabel
\newcommand*{\@restrictlabeltext}[1]{#1\protected@edef\@currentlabel{#1}}
\newcommand*{\nolabel}[1]{#1}%
\renewcommand*{\descriptionlabel}[1]{%
\let\orglabel\label
\let\label\@gobble
\let\orig@hfil\hfil
\def\hfil{}%
\let\nolabel\@gobble
\let\restrictlabeltext\@firstofone
\phantomsection
\protected@edef\@currentlabel{#1}%
\let\hfil\orig@hfil
\let\label\orglabel
\let\restrictlabeltext\@restrictlabeltext
\orgdescriptionlabel{#1}%
}
\makeatother
\begin{document}
\Large
\section{Good eats}
\begin{describe}
\item [Fruit\nolabel{:}\label{item:fruit}] Oranges and apples.
\item [\restrictlabeltext{Vegetable}:\label{item:veggie}] Kale and potatoes.
\end{describe}
\newpage
Refer to \ref{item:veggie} above on \cpageref{item:veggie} or \ref{item:fruit}
on \cpageref{item:fruit}.
\end{document}
您还可以使 处于:
活动状态并将其定义为空或\relax
。\protected@edef
您甚至可以临时重新定义字体命令。但我不认为这些建议中的任何一个真的比您的解决方案更好。
作为一个完全不同的选择,您可以将冒号作为标签格式的一部分,并将补丁\phantomsection
和设置\@currentlabel
放入描述列表中enumitem
:
\documentclass[12pt]{article}
\usepackage[colorlinks=true,linkcolor=red]{hyperref}
\usepackage[nameinlink,noabbrev,capitalize]{cleveref}
\usepackage{enumitem}
\usepackage{xpatch}
\newlist{describe}{description}{1}
\setlist[describe,1]{%
font=\normalfont\textsf,
itemindent=0pt,
wide,
itemsep=0pt,topsep=2pt,
format={\normalfont\textsfcolor}
}
\newcommand*{\textsfcolor}[1]{\textsf{#1:}}
\makeatletter
\xpatchcmd{\enit@description@i}{%
\labelsep\z@
}{%
\phantomsection
\let\org@label\label
\let\label\@gobble
\protected@edef\@currentlabel{##1}%
\let\label\org@label
\labelsep\z@
}{}{\undefined}
\makeatother
\begin{document}
\Large
\section{Good eats}
\begin{describe}
\item [Fruit\label{item:fruit}] Oranges and apples.
\item [Vegetable\label{item:veggie}] Kale and potatoes.
\end{describe}
\newpage
Refer to \ref{item:veggie} above on \cpageref{item:veggie} or \ref{item:fruit}
on \cpageref{item:fruit}.
\end{document}
这将导致: