Etiqueta y descripción de referencia de artículos con enumitem

Etiqueta y descripción de referencia de artículos con enumitem

Apuntar

Quiero poder etiquetar y luego hacer referencia a elementos en descriptionentornos creados con el enumitempaquete.

Qué no funciona

El siguiente ejemplo modifica la respuesta aceptada en¿Cómo puedo etiquetar/hacer referencia a elementos de descripción que contienen macros por nombre?.

\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}

Producción:

Referencia de artículo defectuoso

Hay tres defectos con esta salida:

  1. La cara de la referencia es la misma sans-serif que la etiqueta misma, pero quiero normalfontque coincida con el texto circundante.
  2. Hay puntuación superflua (:) en la referencia, pero solo quiero el nombre del elemento y no ninguna puntuación final. (Tenga en cuenta que para diferentes describeentornos, la puntuación final podría ser diferente, por ejemplo, un punto en lugar de dos puntos).
  3. Hay un espacio en blanco adicional entre la referencia y el texto "arriba en ..." que le sigue.

¿Cómo se pueden reparar estos defectos?

¿Qué funciona pero utiliza una sintaxis incómoda?

La siguiente versión de la fuente, basada en la respuesta aceptada enNombre de referencia del elemento de la lista de descripción en LaTeX, soluciona los tres defectos, pero a costa de una sintaxis incómoda dentro del \itemargumento opcional.

Lo que encuentro sintácticamente incómodo es que el argumento opcional incluye \itemuna nueva macro \namedlabelque toma dos argumentos (el identificador de la etiqueta y el nombre del elemento) y luego cualquier puntuación tiene que ir fuera y después de ese segundo argumento.

\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}

Producción: Salida correcta pero sintaxis incómoda

Respuesta1

Yo (como Gernot en sus comentarios a su pregunta) no veo ningún problema con la sintaxis de \namedlabel. Sin embargo, puede definir comandos adicionales para marcar partes de la etiqueta del elemento para que no formen parte de la referencia. También puede definir cómo \descriptionlabelse deben interpretar las partes automáticas del argumento de mientras lo expande para definir la referencia. Y podría agregar un comando para definir qué parte del argumento debe llegar a la referencia. Aquí hay un ejemplo que elimina automáticamente \hfilde la referencia (pero no el cambio de fuente ni el :), elimina manualmente :o, como alternativa, define toda la parte de la referencia:

\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}

También puede activarlo :y definirlo para que esté vacío o \relaxmientras el archivo \protected@edef. Incluso podrías redefinir temporalmente los comandos de fuente. Pero no creo que ninguna de estas sugerencias sea realmente mejor que su solución.


Como alternativa completamente diferente, puede colocar los dos puntos como parte del formato de etiqueta, el parche \phantomsectiony la configuración \@currentlabelen la lista de descripción de 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}

Esto resultará en:

ingrese la descripción de la imagen aquí

información relacionada