[Tex/LaTex] What does “you have forgotten to use \caption” mean

captionserrorshyperreftufte

I'm stumped by an error I'm getting, when I try to render a Tufte-LaTeX document using hypcap and hyperref. For example, even a minimal document consisting of

\documentclass[nohyper]{tufte-handout}

\makeatletter
\let\tufte@caption\@caption    % Protect caption from hyperref 
\RequirePackage{hyperref}   
\let\@caption\tufte@caption    % See -- http://tex.stackexchange.com/a/46838 
\makeatother
\RequirePackage[all]{hypcap}   % See -- http://tex.stackexchange.com/a/27349

\begin{document}

\begin{figure}\caption{An empty figure.}\end{figure}

\end{document}

causes an error:

Package hypcap Error: You have forgotten to use \caption.

What is causing this error, and how can I avoid it?


If it comes to it, I'd settle for giving up some features provided by either hypcap of hyperref (e.g., linking to figures) if that's what it takes to keep things stable. I don't want to give up the visible effects of the Tufte style.

Best Answer

Can you check the following on something larger? I'm certain we lose nameref support with this (because I wanted to avoid the parameters-of-@caption thing), but there might be more side effects, and I'm not familiar enough with tufte to spot if something's wrong from a single caption on an empty page:

\documentclass[nohyper]{tufte-handout}

\makeatletter
\let\mytufte@@caption\@caption    % Protect caption from hyperref 
\RequirePackage{hyperref}   

\RequirePackage[all]{hypcap}   % See -- http://tex.stackexchange.com/a/27349

\let\mytufte@caption\@tufte@caption
\def\@tufte@caption{%
  \global\@capstartfalse\mytufte@caption
}
% this should be highly conditional on presence
% of the right versions of hyperref et al.
\def\@caption{%
  \expandafter\ifx\csname if@capstart\expandafter\endcsname
                  \csname iftrue\endcsname
    \global\let\@currentHref\hc@currentHref
  \else
    \hyper@makecurrent{\@captype}%
  \fi
  \mytufte@@caption
}
\makeatother

\begin{document}
\begin{figure}
  \caption{An empty figure.}
\end{figure}

\end{document}