Beschriftung und Referenzbeschreibung von Elementen mit Enumitem

Beschriftung und Referenzbeschreibung von Elementen mit Enumitem

Ziel

Ich möchte in der Lage sein, Elemente in descriptionmit 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:

Fehlerhafte Artikelreferenz

Diese Ausgabe weist drei Mängel auf:

  1. Die Referenz hat die gleiche serifenlose Schrift wie das Etikett selbst, ich möchte sie aber normalfontan den umgebenden Text anpassen.
  2. Die Referenz enthält überflüssige Satzzeichen (:), ich möchte aber nur den Namen des Elements und keine abschließenden Satzzeichen. (Beachten Sie, dass describedie abschließenden Satzzeichen in verschiedenen Umgebungen unterschiedlich sein können, z. B. ein Punkt statt eines Doppelpunkts.)
  3. 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 \itemoptionalen Arguments.

Was ich syntaktisch umständlich finde, ist, dass das optionale Argument \itemein 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}

Ausgabe: OK-Ausgabe, aber umständliche Syntax

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 \descriptionlabelinterpretiert 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 \hfilaus 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 \relaxwä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 \phantomsectionund der Einstellung von \@currentlabelin 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:

Bildbeschreibung hier eingeben

verwandte Informationen