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}

산출:

잘못된 항목 참조

이 출력에는 세 가지 결함이 있습니다.

  1. 참조의 서체는 라벨 자체와 동일한 산세리프체이지만 normalfont주변 텍스트와 일치시키고 싶습니다.
  2. 참조에 불필요한 구두점(:)이 있지만 항목 이름만 원하고 후행 구두점은 필요하지 않습니다. (환경에 따라 describe후행 구두점이 다를 수 있습니다(예: 콜론 대신 마침표 사용).)
  3. 참조와 그 뒤에 오는 "위의 ..." 텍스트 사이에 추가 공백이 있습니다.

이러한 결함을 어떻게 복구할 수 있습니까?

작동하지만 어색한 구문을 사용하는 것

다음 버전의 소스는 허용된 답변을 기반으로 합니다.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및 설정을 넣을 수 있습니다 .\@currentlabelenumitem

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

결과는 다음과 같습니다.

여기에 이미지 설명을 입력하세요

관련 정보