[Tex/LaTex] How to make sub figure referencing work in memoir + cleveref

cleverefcross-referencingmemoirsubfloats

In the following example:

\documentclass{memoir}
\usepackage{cleveref}
\newsubfloat{figure}
\begin{document}

\chapter{Example}
\begin{figure}
  \centering
  \subtop[apple]{fig 100a\label{fig:100a}}\\
  \subtop[orange]{fig 100b\label{fig:100b}}
  \caption{Can you handle subfigures?}
  \label{fig:100}
\end{figure}

\cref{fig:100a} and \namecref{fig:100b}.
\Cref{fig:100}
\end{document}

Both \cref{fig:100a} and \namecref{fig:100b} produce ??

The versions of packages used are: cleveref.sty 0.17.2 and memoir.cls v3.6.

Best Answer

You should contact Toby Cubitt, the author of cleveref. He is very responsive to bug reports and the memoir support of cleveref is very new and little tested.

The problem is that memoir redefines \label within subfigures, so the cleveref version does not get used...

In the meantime, it's not pretty, but this works for your example at least:

\documentclass{memoir}
\usepackage{cleveref}
\crefname{subfigure}{fig.}{figs.}
\Crefname{subfigure}{Figure}{Figures}


\newsubfloat{figure}
\begin{document}

\makeatletter
\let\old@sf@@memsub@label=\sf@@memsub@label
\renewcommand*{\sf@@memsub@label}[1]{%
    \@bsphack%
    \old@sf@@memsub@label{#1}%
    \protected@write\@auxout{}%
    {\string\newlabel{cref@#1}{{\cref@currentlabel}{\thepage}}}%
    \@esphack}
\makeatother


\chapter{Example}
\begin{figure}
  \centering
  \subtop[apple]{fig 100a\label{fig:100a}}\\
  \subtop[orange]{fig 100b\label{fig:100b}}
  \caption{Can you handle subfigures?}
  \label{fig:100}
\end{figure}

\cref{fig:100a} and \namecref{fig:100a}.
\Cref{fig:100}
\end{document}
Related Question