回想録に固定ラベルを実装する

回想録に固定ラベルを実装する

私は、次のようにして、\newfixedlabelmemoirs の類推で呼び出さ れるコマンドを実装したいと思います。\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 を指します。

Ps. 私は、 を使って cleveref を設定する方法については知っていますが\crefname、問題は\newfixedlabelマクロの作成にあります。memoir が \@captype を定義して float 環境を模倣するのに使用するのと同じトリックを試しましたが、効果はありませんでした。

答え1

グループ内で使用する場合、特定の更新は\captionそれ以降は保存されません。特に、\caption\cref@currentlabelcleveref適切な参照タイプを検出するためです。

次のようにして、タイプを\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適切なジャンプ場所を逃してしまう。

関連情報