
KOMAscript의 클래스를 사용하여 문서를 작성하고 있으며 상호 참조에 사용되는 텍스트 서식을 지정하기 위해 scrreprt
사용자 정의 매크로( )를 작성하고 있습니다 .\xref
이 매크로는 라벨 이름을 인수로 사용합니다.\xref{mylabel}
레이블이 장/섹션/하위 섹션(기본적으로 번호가 매겨져 있음)을 참조하는지 아니면 하위 섹션/단락(기본적으로 번호가 매겨져 있지 않음)을 참조하는지에 따라 다른 텍스트를 생성하고 싶습니다.
어떻게 확인할 수 있나요? 다음 두 가지 중 하나가 수행됩니다.
- 레이블이 장/섹션/하위 섹션을 참조하는지 확인하십시오(또는 그 반대: 레이블이 하위 섹션/단락을 참조하는지 확인).
- 라벨이 번호가 매겨진 항목을 참조하는지 확인하세요.
답변1
unnumbered/numbered
구조 단위에 대한 참조 및 마지막 확인은 업데이트를 참조하세요 .
추가 패키지를 사용하지 않고 등만 사용하고 파일 에 \renewcommand, \let, \pdfstrcmp
씁니다 .\@namedef
.aux
두 번의 실행이 필요합니다(라벨을 다루기 때문에 어쨌든 필요합니다!).
true/false 분기와 함께 \extractlabeltype{labelname}
및 를 사용하세요 .\checklabeltype
\label
and 와 관련된 다른 패키지는 없다고 가정합니다 \ref
. 즉, hyperref
or 가 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}