목표
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}
산출:
이 출력에는 세 가지 결함이 있습니다.
- 참조의 서체는 라벨 자체와 동일한 산세리프체이지만
normalfont
주변 텍스트와 일치시키고 싶습니다. - 참조에 불필요한 구두점(:)이 있지만 항목 이름만 원하고 후행 구두점은 필요하지 않습니다. (환경에 따라
describe
후행 구두점이 다를 수 있습니다(예: 콜론 대신 마침표 사용).) - 참조와 그 뒤에 오는 "위의 ..." 텍스트 사이에 추가 공백이 있습니다.
이러한 결함을 어떻게 복구할 수 있습니까?
작동하지만 어색한 구문을 사용하는 것
다음 버전의 소스는 허용된 답변을 기반으로 합니다.LaTeX의 설명 목록 항목 참조 이름, 세 가지 결함을 모두 해결하지만 선택적 인수 내의 구문이 어색해집니다 \item
.
제가 구문상 어색하다고 생각하는 점은 선택적 인수에 두 개의 인수(레이블 식별자와 항목 이름)를 취하는 \item
새 매크로가 포함되어 있고 모든 구두점이 두 번째 인수 바깥쪽과 그 뒤에 나와야 한다는 것입니다.\namedlabel
\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}
결과는 다음과 같습니다.