enumitem を使用したラベルと参照の説明項目

enumitem を使用したラベルと参照の説明項目

標的

descriptionパッケージを使用して作成された環境内のアイテムにラベルを付けて参照できるようにしたいと考えていますenumitem

何が機能しないのか

次の例では、受け入れられた回答を次のように変更します。マクロを含む説明項目に名前でラベルを付けたり参照したりするにはどうすればよいですか?

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

出力:

不良品の参照

この出力には 3 つの欠陥があります。

  1. 参照の書体はラベル自体と同じサンセリフ体ですが、normalfont周囲のテキストと一致させたいと思います。
  2. 参照には余分な句読点 (:) がありますが、必要なのは項目の名前だけで、末尾の句読点は不要です。(describe環境によって末尾の句読点が異なる場合があることに注意してください。たとえば、コロンではなくピリオドなどです。)
  3. 参照とそれに続くテキスト「上記...」の間に余分な空白があります。

これらの欠陥はどうすれば修復できるでしょうか?

機能するが、扱いにくい構文を使用しているもの

以下のバージョンのソースは、LaTeX の説明リスト項目の参照名は、3 つの欠陥すべてを解決しますが、オプションの引数内の構文が扱いにくくなります\item

構文的に奇妙だと思うのは、オプションの引数に、ラベル識別子と項目名の 2 つの引数を取る\item新しいマクロが含まれており\namedlabel、句読点はすべて 2 番目の引数の外側と後に記述する必要があることです。

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

出力: 出力はOKだが構文がぎこちない

答え1

私は(あなたの質問に対する gernot のコメントのように) の構文に問題はないと考えています\namedlabel。それでも、項目ラベルの一部を参照の一部としないようにマークする追加コマンドを定義することはできます。 が\descriptionlabelそれを展開して参照を定義するときに、 の引数の自動部分をどのように解釈するかを定義することもできます。また、引数のどの部分を参照に含めるかを定義するコマンドを追加することもできます。次に、 を\hfil参照から自動的に削除し(フォント スイッチや は削除しない:)、 を手動で削除する例を示します:。または、代わりに は参照部分全体を定義します。

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

:をアクティブにして、それを空にしたり、\relaxの間 に定義することもできます\protected@edef。フォント コマンドを一時的に再定義することもできます。しかし、これらの提案のどれもがあなたの解決策よりも優れているとは思いません。


まったく別の方法として、コロンをラベル形式の一部として入れ、 のパッチ\phantomsectionと設定を\@currentlabelの説明リストに入れることもできます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}

結果は次のようになります:

ここに画像の説明を入力してください

関連情報