在回忆录中实现 fixedlabel

在回忆录中实现 fixedlabel

我想以这样的方式实现一个名为\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}命令指向 B 部分而不是 My Float。

附言:我知道如何使用来设置 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错过了合适的跳跃位置。

相关内容