회고록에 고정 라벨 구현

회고록에 고정 라벨 구현

나는 다음과 같은 방식으로 \newfixedlabel회고록을 비유 한 명령을 구현하고 싶습니다 .\newfixedcaption

\begin{myfloat}
\caption{...}
\label{myfloat:a}
...
\end{myfloat}

cleveref다음과 같은 (또는 다른 패키지) 동일한 결과를 산출합니다 :

\myfloatfixedcaption{...}% setup via memoirs \newfixedcaption
\label{myfloat:a}
...

이 매크로의 이유는 플로트의 레이블 및 캡션 기능을 잃지 않고 (문서) 작성 프로세스의 모든 단계에서 항상 플로트를 플로트가 아닌 것으로 변경할 수 있다는 것입니다.

전체 예는 다음과 같습니다.

\documentclass{memoir}
\usepackage{etoolbox}
\usepackage{hyperref}
\usepackage{cleveref}

\makeatletter
\newcommand*{\cftonlycaption}[2][]%
{\begingroup
   \let\@makecaption\@gobbletwo
   \ifstrempty{#1}%
     {\caption{#2}}%
     {\caption[#1]{#2}}
 \endgroup}
\makeatother

\newfloat[chapter]{myfloat}{lmf}{My Float}
\newfixedcaption[\cftonlycaption]{\myfloatfixedcaption}{myfloat}

\crefname{myfloat}{My Float}{My Floats}

\begin{document}
\chapter{A}
\begin{myfloat}
\caption{A}% or \myfloatfixedcaption{A}
\label{keya}
\end{myfloat}
\section{B}
\myfloatfixedcaption{B}
\label{keyb}
\cref{keya}
\cref{keyb}
\end{document}

어떤 이유로 \label{keyb}명령은 My Float 대신 섹션 B를 가리킵니다.

추신. 나는 를 사용하여 Cleveref를 설정하는 것에 대해 알고 있습니다 \crefname. 문제는 \newfixedlabel매크로를 만드는 데 있습니다. 나는 memoir가 \@captype을 정의하여 부동 환경을 모방하기 위해 사용하는 것과 동일한 트릭을 시도했지만 소용이 없었습니다.

답변1

\caption그룹 내부에서 사용하는 경우 특정 업데이트는 그 이후에는 유지되지 않습니다. 특히, \caption업데이트가 \cref@currentlabel필요한 경우cleveref적절한 참조 유형을 감지하기 위해.

다음을 사용하여 유형 \cftonlycaption을 구체적으로 참조하도록 업데이트할 수 있습니다 .myfloat

\makeatletter
\newcommand*{\cftonlycaption}[2][]%
{\begingroup
   \let\@makecaption\@gobbletwo
   \ifstrempty{#1}%
     {\caption{#2}}%
     {\caption[#1]{#2}}
 \endgroup
 \protected@edef\cref@currentlabel{%
      \expandafter\cref@override@label@type%
        \cref@currentlabel\@nil{myfloat}}}
\makeatother

엔딩 \cref@currentlabel업데이트밖의그룹은 현재 참조 유형을 myfloat.

또는 이것이 너무 엄격해 보인다면 언제든지 다음을 사용하여 참조 유형을 로컬로 재정의할 수 있습니다.

\label[myfloat]{keyb}

다음은 이전 접근 방식을 사용한 최소한의 예입니다.

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

\documentclass{memoir}
\usepackage{etoolbox}
\usepackage{hyperref}
\usepackage{cleveref}

\makeatletter
\newcommand*{\cftonlycaption}[2][]%
{\begingroup
   \let\@makecaption\@gobbletwo
   \ifstrempty{#1}%
     {\caption{#2}}%
     {\caption[#1]{#2}}
 \endgroup
 \protected@edef\cref@currentlabel{%
      \expandafter\cref@override@label@type%
        \cref@currentlabel\@nil{myfloat}}}
\makeatother

\newfloat[chapter]{myfloat}{lmf}{My Float}
\newfixedcaption[\cftonlycaption]{\myfloatfixedcaption}{myfloat}

\crefname{myfloat}{My Float}{My Floats}

\begin{document}
\chapter{A}
\begin{myfloat}
\caption{A}% or \myfloatfixedcaption{A}
\label{keya}
\end{myfloat}
\section{B}
\myfloatfixedcaption{B}
\label{keyb}% or \label[myfloat]{keyb}
\cref{keya}
\cref{keyb}
\end{document}

\@makecaption(을 통한 \let\@makecaption\@gobbletwo) 보이드화는 다음을 유발한다는 점에 유의하십시오.hyperref적절한 점프 위치를 놓치는 것입니다.

관련 정보