Цель
Я хочу иметь возможность маркировать и ссылаться на элементы в 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
сред конечные знаки препинания могут быть разными, например, точка вместо двоеточия.) - Между ссылкой и текстом «выше на ...», который следует за ней, имеется дополнительный пробел.
Как можно устранить эти дефекты?
Что работает, но использует неудобный синтаксис
Следующая версия источника, основанная на принятом ответе наСправочное имя элемента списка описаний в 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}
Это приведет к: