標的
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 つの欠陥があります。
- 参照の書体はラベル自体と同じサンセリフ体ですが、
normalfont
周囲のテキストと一致させたいと思います。 - 参照には余分な句読点 (:) がありますが、必要なのは項目の名前だけで、末尾の句読点は不要です。(
describe
環境によって末尾の句読点が異なる場合があることに注意してください。たとえば、コロンではなくピリオドなどです。) - 参照とそれに続くテキスト「上記...」の間に余分な空白があります。
これらの欠陥はどうすれば修復できるでしょうか?
機能するが、扱いにくい構文を使用しているもの
以下のバージョンのソースは、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}
答え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}
結果は次のようになります: