나는 다음과 같은 방식으로 \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
적절한 점프 위치를 놓치는 것입니다.