Me gustaría implementar un comando llamado \newfixedlabel
en analogía con memorias
\newfixedcaption
de 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 \newfixedlabel
macro. Intenté el mismo truco que utilizan las memorias para imitar un entorno flotante definiendo \@captype pero fue en vano.
Respuesta1
Cuando se usa \caption
dentro de un grupo, ciertas actualizaciones no sobreviven más allá de eso. En particular, \caption
las actualizaciones \cref@currentlabel
necesarias paracleveref
para detectar el tipo de referencia apropiado.
Puede actualizar su \cftonlycaption
para hacer referencia específica al myfloat
tipo 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@currentlabel
actualizació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:
\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
) provocahyperref
perder el lugar de salto apropiado.