Метка и ссылка на описание элементов с помощью enumitem

Метка и ссылка на описание элементов с помощью enumitem

Цель

Я хочу иметь возможность маркировать и ссылаться на элементы в 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}

Выход:

Неправильная ссылка на товар

В этом выводе есть три дефекта:

  1. Шрифт ссылки такой же без засечек, как и сама этикетка, но я хочу, normalfontчтобы он соответствовал окружающему тексту.
  2. В ссылке есть лишняя пунктуация (:), но мне нужно только название элемента, а не конечные знаки препинания. (Обратите внимание, что для разных describeсред конечные знаки препинания могут быть разными, например, точка вместо двоеточия.)
  3. Между ссылкой и текстом «выше на ...», который следует за ней, имеется дополнительный пробел.

Как можно устранить эти дефекты?

Что работает, но использует неудобный синтаксис

Следующая версия источника, основанная на принятом ответе наСправочное имя элемента списка описаний в 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}

Это приведет к:

введите описание изображения здесь

Связанный контент