Ziel
Ich möchte in der Lage sein, Elemente in description
mit dem Paket erstellten Umgebungen zu kennzeichnen und anschließend darauf zu verweisen enumitem
.
Was funktioniert nicht
Das folgende Beispiel modifiziert die akzeptierte Antwort unterWie kann ich Beschreibungselemente, die Makros enthalten, namentlich kennzeichnen/referenzieren?.
\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}
Ausgabe:
Diese Ausgabe weist drei Mängel auf:
- Die Referenz hat die gleiche serifenlose Schrift wie das Etikett selbst, ich möchte sie aber
normalfont
an den umgebenden Text anpassen. - Die Referenz enthält überflüssige Satzzeichen (:), ich möchte aber nur den Namen des Elements und keine abschließenden Satzzeichen. (Beachten Sie, dass
describe
die abschließenden Satzzeichen in verschiedenen Umgebungen unterschiedlich sein können, z. B. ein Punkt statt eines Doppelpunkts.) - Zwischen der Referenz und dem darauf folgenden Text „über …“ befindet sich ein zusätzlicher Leerraum.
Wie können diese Defekte behoben werden?
Was funktioniert, aber eine umständliche Syntax verwendet
Die folgende Version der Quelle, basierend auf der akzeptierten Antwort unterReferenzname des Beschreibungslistenelements in LaTeX, behebt alle drei Mängel – allerdings auf Kosten einer umständlichen Syntax innerhalb des \item
optionalen Arguments.
Was ich syntaktisch umständlich finde, ist, dass das optionale Argument \item
ein neues Makro einschließt \namedlabel
, das zwei Argumente annimmt – die Beschriftungskennung und den Artikelnamen – und dass dann jegliche Satzzeichen außerhalb und nach diesem zweiten Argument stehen müssen.
\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}
Antwort1
Ich (wie gernot in seinen Kommentaren zu Ihrer Frage) sehe kein Problem mit der Syntax von \namedlabel
. Dennoch können Sie tatsächlich zusätzliche Befehle definieren, um Teile der Elementbezeichnung als nicht Teil der Referenz zu markieren. Sie können auch definieren, wie automatische Teile des Arguments von \descriptionlabel
interpretiert werden sollen, während es erweitert wird, um die Referenz zu definieren. Und Sie könnten einen Befehl hinzufügen, um zu definieren, welcher Teil des Arguments in die Referenz aufgenommen werden soll. Hier ist ein Beispiel, das das automatisch \hfil
aus der Referenz entfernt (aber nicht den Schriftartwechsel oder das :
), das manuell entfernt :
oder alternativ den gesamten Referenzteil definiert:
\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}
Sie könnten auch das :
aktive Element aktivieren und es als leer definieren oder \relax
während das \protected@edef
. Sie könnten sogar die Schriftartbefehle vorübergehend neu definieren. Aber ich glaube nicht, dass einer dieser Vorschläge wirklich besser ist als Ihre Lösung.
Als ganz andere Alternative könnten Sie den Doppelpunkt als Teil des Beschriftungsformats und des Patches \phantomsection
und der Einstellung von \@currentlabel
in die Beschreibungsliste von einfügen 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}
Dies führt zu: