주어진 \ref가 어떤 유형의 섹션을 참조하는지 확인하는 방법

주어진 \ref가 어떤 유형의 섹션을 참조하는지 확인하는 방법

KOMAscript의 클래스를 사용하여 문서를 작성하고 있으며 상호 참조에 사용되는 텍스트 서식을 지정하기 위해 scrreprt사용자 정의 매크로( )를 작성하고 있습니다 .\xref

이 매크로는 라벨 이름을 인수로 사용합니다.\xref{mylabel}

레이블이 장/섹션/하위 섹션(기본적으로 번호가 매겨져 있음)을 참조하는지 아니면 하위 섹션/단락(기본적으로 번호가 매겨져 있지 않음)을 참조하는지에 따라 다른 텍스트를 생성하고 싶습니다.

어떻게 확인할 수 있나요? 다음 두 가지 중 하나가 수행됩니다.

  1. 레이블이 장/섹션/하위 섹션을 참조하는지 확인하십시오(또는 그 반대: 레이블이 하위 섹션/단락을 참조하는지 확인).
  2. 라벨이 번호가 매겨진 항목을 참조하는지 확인하세요.

답변1

unnumbered/numbered구조 단위에 대한 참조 및 마지막 확인은 업데이트를 참조하세요 .

추가 패키지를 사용하지 않고 등만 사용하고 파일 에 \renewcommand, \let, \pdfstrcmp씁니다 .\@namedef.aux

두 번의 실행이 필요합니다(라벨을 다루기 때문에 어쨌든 필요합니다!).

true/false 분기와 함께 \extractlabeltype{labelname}및 를 사용하세요 .\checklabeltype

\labeland 와 관련된 다른 패키지는 없다고 가정합니다 \ref. 즉, hyperrefor 가 cleveref지원되지 않습니다.

\documentclass{book}


\makeatletter
\let\latex@@refstepcounter\refstepcounter
\let\latex@@label\label%


\renewcommand{\refstepcounter}[1]{%
  \gdef\lastrefsteppedcounter{#1}%
  \latex@@refstepcounter{#1}%
}

\renewcommand{\label}[1]{%
  \immediate\write\@auxout{\string\global\string\@namedef{label#1}{\lastrefsteppedcounter}}
   \latex@@label{#1}%
}

\newcommand{\extractlabeltype}[1]{%
  \@nameuse{label#1}%
}

\makeatother

\newcommand{\checklabeltype}[4]{%
\ifnum0=\pdfstrcmp{\extractlabeltype{#1}}{#2}
#3%
\else
#4%
\fi
}


\begin{document}



\chapter{Foo} \label{foo}


\section{Foosection}\label{foosection}

\checklabeltype{foosection}{section}{Yes, it is section}{No, it is something different}

\checklabeltype{foo}{section}{Yes, it is section}{No, it is something different}


\end{document}

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

업데이트번호가 매겨지지 않은/번호가 매겨진 문제를 확인합니다.

이는 번호가 지정되지 않은 구조 단위의 앵커 이름에 이 포함되어 있다는 가정에 의도적으로 의존하므로 매크로를 *가지고 노는 것은 \theH...좋은 생각이 아닙니다. ;-)

\documentclass{book}

\usepackage{xparse}
\usepackage[hyperref,counter]{zref}% Using the counter mechanism behind `nameref`
\usepackage{hyperref}


\makeatletter
\AtBeginDocument{%
  \let\latex@@label\label%

  \renewcommand{\label}[1]{%
    \zref@label{#1}%
    \latex@@label{#1}%
  }
  % Get the underlying counter type
  \newcommand{\extractlabelcounter}[1]{%
    \zref@ifrefundefined{#1}{%
      ???????}{%
      \zref@extract{#1}{counter}%
    }%
  }
  % Get the anchor name for hyperref or nameref -> has a `*` inside if it is unnumbered
  \newcommand{\extractlabelanchor}[1]{%
    \zref@ifrefundefined{#1}{%
      ???????}{%
      \zref@extract{#1}{anchor}%
    }%
  }
}

% Check if there's a `*` inside of the anchor name
\ExplSyntaxOn
\cs_new:Npn \checkifnumbered#1#2#3{%
  \tl_set:Nx \l_tmpa_tl {\extractlabelanchor{#1}}
  \tl_if_in:NnTF \l_tmpa_tl {*} {#2} {#3}
}
\ExplSyntaxOff

\makeatother


\newcommand{\checklabeltype}[4]{%
  \ifnum0=\pdfstrcmp{\extractlabelcounter{#1}}{#2}
  #3%
  \else
  #4%
  \fi
}

\begin{document}
\chapter{Foo} \label{foo}

\section*{An unnumbered section} \label{unnumbered}

\section{Foosection}\label{foosection}

\checklabeltype{foosection}{section}{Yes, it is section}{No, it is something different}

\checklabeltype{foo}{section}{Yes, it is section}{No, it is something different}

\begin{enumerate}
\item First \label{enumfirst}
\item Second \label{enumsecond}
\end{enumerate}

\checklabeltype{enumsecond}{enumi}{It is a numbered item and has the value \ref{enumsecond}}{}

In \nameref{unnumbered} we have an \checkifnumbered{unnumbered}{unnumbered}{numbered} \extractlabelcounter{unnumbered}


In \nameref{foo} we have an \checkifnumbered{foo}{unnumbered}{numbered} \extractlabelcounter{foo} whereas
 \nameref{foosection} is a \checkifnumbered{foosection}{unnumbered}{numbered} \extractlabelcounter{foosection}.


\end{document}

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

관련 정보