Itens de descrição de rótulo e referência com enumitem

Itens de descrição de rótulo e referência com enumitem

Mirar

Quero poder rotular e referenciar itens em descriptionambientes criados usando o enumitempacote.

O que não funciona

O exemplo a seguir modifica a resposta aceita emComo posso rotular/referenciar itens de descrição que contêm macros por nome?.

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

Saída:

Referência de item com defeito

Existem três defeitos nesta saída:

  1. A face da referência é a mesma sem serifa do próprio rótulo, mas quero normalfontcorresponder ao texto ao redor.
  2. Há pontuação supérflua (:) na referência, mas quero apenas o nome do item e não qualquer pontuação final. (Observe que para describeambientes diferentes, a pontuação final pode ser diferente, por exemplo, um ponto final em vez de dois pontos.)
  3. Há um espaço extra em branco entre a referência e o texto "acima de ..." que a segue.

Como esses defeitos podem ser reparados?

O que funciona, mas usa sintaxe estranha

A seguinte versão da fonte, com base na resposta aceita emNome de referência do item da lista de descrição em LaTeX, cura todos os três defeitos — mas ao custo de uma sintaxe estranha dentro do \itemargumento opcional.

O que acho sintaticamente estranho é que o argumento opcional inclui \itemuma nova macro \namedlabelque recebe dois argumentos - o identificador do rótulo e o nome do item - e então qualquer pontuação tem que ir para fora e depois do 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}

Saída: Saída OK, mas sintaxe estranha

Responder1

Eu (como gernot em seus comentários à sua pergunta) não vejo problema com a sintaxe de \namedlabel. No entanto, você pode definir comandos adicionais para marcar partes do rótulo do item para que não façam parte da referência. Você também pode definir como as partes automáticas do argumento \descriptionlabeldevem ser interpretadas ao expandi-lo para definir a referência. E você poderia adicionar um comando para definir qual parte do argumento deveria chegar à referência. Aqui está um exemplo que remove automaticamente o \hfilda referência (mas não a opção de fonte nem o :), remove manualmente o :ou como alternativa define toda a parte da referência:

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

Você também pode tornar o :ativo e defini-lo como vazio ou \relaxenquanto o arquivo \protected@edef. Você pode até redefinir temporariamente os comandos de fonte. Mas não creio que alguma dessas sugestões seja realmente melhor que a sua solução.


Como uma alternativa completamente diferente, você pode colocar os dois pontos como parte do formato do rótulo e corrigir \phantomsectione configurar \@currentlabelna lista de descrição 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}

Isso resultará em:

insira a descrição da imagem aqui

informação relacionada