Apuntar
Quiero poder etiquetar y luego hacer referencia a elementos en description
entornos creados con el enumitem
paquete.
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:
Hay tres defectos con esta salida:
- La cara de la referencia es la misma sans-serif que la etiqueta misma, pero quiero
normalfont
que coincida con el texto circundante. - 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
describe
entornos, la puntuación final podría ser diferente, por ejemplo, un punto en lugar de dos puntos). - 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 \item
argumento opcional.
Lo que encuentro sintácticamente incómodo es que el argumento opcional incluye \item
una nueva macro \namedlabel
que 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}
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 \descriptionlabel
se 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 \hfil
de 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 \relax
mientras 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 \phantomsection
y la configuración \@currentlabel
en 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: