Mirar
Quero poder rotular e referenciar itens em description
ambientes criados usando o enumitem
pacote.
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:
Existem três defeitos nesta saída:
- A face da referência é a mesma sem serifa do próprio rótulo, mas quero
normalfont
corresponder ao texto ao redor. - 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
describe
ambientes diferentes, a pontuação final pode ser diferente, por exemplo, um ponto final em vez de dois pontos.) - 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 \item
argumento opcional.
O que acho sintaticamente estranho é que o argumento opcional inclui \item
uma nova macro \namedlabel
que 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}
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 \descriptionlabel
devem 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 \hfil
da 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 \relax
enquanto 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 \phantomsection
e configurar \@currentlabel
na 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: