Implementar rótulo fixo no livro de memórias

Implementar rótulo fixo no livro de memórias

Gostaria de implementar um comando chamado \newfixedlabelem analogia às memórias \newfixedcaptionde tal forma que:

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

Produz o mesmo resultado com cleveref(ou qualquer outro pacote) que:

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

O raciocínio por trás dessa macro é que sempre posso alterar um float para um nonfloat em qualquer estágio do processo de escrita (do documento) sem perder os recursos de rótulo e legenda de um float.

Um exemplo completo pode ser assim:

\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 alguma razão, o \label{keyb}comando aponta para a seção B em vez de My Float.

Sal. Eu sei como configurar o intelligentef com \crefname, o problema está na criação da \newfixedlabelmacro. Tentei o mesmo truque que o livro de memórias usa para imitar um ambiente flutuante, definindo \@captype mas sem sucesso.

Responder1

Ao usar \captiondentro de um grupo, certas atualizações não sobrevivem além disso. Em particular, \captionas atualizações \cref@currentlabelnecessárias paracleverefpara detectar o tipo de referência apropriado.

Você pode atualizar seu \cftonlycaptionpara fazer referência específica ao myfloattipo usando o seguinte:

\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

A \cref@currentlabelatualização finalforao grupo armazenará o tipo de referência atual como myfloat.

Alternativamente, se isso parecer muito rígido, você sempre poderá substituir o tipo de referência localmente usando

\label[myfloat]{keyb}

Abaixo está um exemplo mínimo usando a abordagem anterior:

insira a descrição da imagem aqui

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

Observe que a anulação \@makecaption(via \let\@makecaption\@gobbletwo) causahyperrefperder o local de salto apropriado.

informação relacionada