Implementar etiqueta fija en memorias

Implementar etiqueta fija en memorias

Me gustaría implementar un comando llamado \newfixedlabelen analogía con memorias \newfixedcaptionde tal manera que:

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

Produce el mismo resultado con cleveref(o cualquier otro paquete) que:

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

El razonamiento detrás de esta macro es que siempre puedo cambiar un flotante a un no flotante en cualquier etapa del proceso de escritura (del documento) sin perder las funciones de etiqueta y título de un flotante.

Un ejemplo completo puede verse así:

\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}

Por alguna razón, el \label{keyb}comando apunta a la sección B en lugar de My Float.

PD. Sé cómo configurar Cleveref con \crefname, el problema radica en crear la \newfixedlabelmacro. Intenté el mismo truco que utilizan las memorias para imitar un entorno flotante definiendo \@captype pero fue en vano.

Respuesta1

Cuando se usa \captiondentro de un grupo, ciertas actualizaciones no sobreviven más allá de eso. En particular, \captionlas actualizaciones \cref@currentlabelnecesarias paracleverefpara detectar el tipo de referencia apropiado.

Puede actualizar su \cftonlycaptionpara hacer referencia específica al myfloattipo usando lo siguiente:

\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

La \cref@currentlabelactualización finalafuerael grupo almacenará el tipo de referencia actual como myfloat.

Alternativamente, si esto parece demasiado rígido, siempre puede anular el tipo de referencia localmente usando

\label[myfloat]{keyb}

A continuación se muestra un ejemplo mínimo que utiliza el enfoque anterior:

ingrese la descripción de la imagen aquí

\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}

Tenga en cuenta que anular \@makecaption(a través de \let\@makecaption\@gobbletwo) provocahyperrefperder el lugar de salto apropiado.

información relacionada