\autoref 在 tufte-book 中使用时无法正常工作

\autoref 在 tufte-book 中使用时无法正常工作

我想使用文档类中的\autoref命令(来自包) 。hyperreftufte-book

小例子:

\documentclass{tufte-book}
\usepackage{hyperref}

\begin{document}

\section{Testsection}
\label{sec:test}

\begin{figure}
    \rule{20pt}{20pt}
    \caption{Testfigure}
    \label{fig:test}
\end{figure}

Cross Reference to \autoref{fig:test}

\end{document}

输出是

交叉引用第 1 节

并不是

交叉参考图1

可以期待什么。有什么想法可以解决这个问题吗?

答案1

解决这个问题的一个丑陋的方法是加载

 \usepackage[compatibility=false]{caption} 

在包裹之前hyperref。问题似乎在于tufte争夺hyperref霸权。

答案2

我有一个相当复杂的补丁,适用于我的测试用例(尽管它们显然不够彻底)。问题最终归结为宏的内部使用\@caption。我从其他人那里借用了一个补丁想法(链接我已经忘记了),这个两部分的补丁也不好看,尽管你可以把它放到你的tufte-common-local.tex文件中,这样就不会碍事,也不需要\makeatletter

(这也应该真正检查 hyperref 是否没有被禁用,在这种情况下,如果它没有其他错误,它可以直接放入 tufte-common.def 文件中。)

补丁分为两部分:

\usepackage{etoolbox}% http://ctan.org/pkg/etoolbox

% tufte \@caption doesn't invoke the hyperref bits.
% The fix is two parts, one to set up the type and
% one to provide the anchor.  It takes two patches
% to put this in...
\pretocmd{\@caption}%
  {\expandafter\ifx\csname if@capstart\expandafter\endcsname
                    \csname iftrue\endcsname
      \global\let\@currentHref\hc@currentHref
    \else
      \hyper@makecurrent{\@captype}%
    \fi
    \@ifundefined{NR@gettitle}{%
      \def\@currentlabelname{#2}%
    }{%
      \NR@gettitle{#2}%
    }%
  }
  {\typeout{patched captioning, part 1}}% success msg
  {\typeout{HELP - failed to patch captioning, part 1}}% fail msg
\patchcmd{\@caption}%
  {\ignorespaces#3\par}% search
  {\ignorespaces
   \ifHy@nesting
     \expandafter\hyper@@anchor\expandafter{\@currentHref}{#3}%
   \else
     \Hy@raisedlink{%
       \expandafter\hyper@@anchor\expandafter{%
         \@currentHref
       }{\relax}%
     }%
     #3\fi\par}% replace
  {\typeout{patched captioning, part 2}}% success msg
  {\typeout{HELP - failed to patch captioning, part 2}}% fail msg

首先,我并没有正确理解所有的 hyperref 代码:我通过比较\@caption两个文件(hyperref.stytufte-common.def)中的内部定义来拼凑它。

答案3

看上去 运行良好cleveref

\documentclass{tufte-book}
\usepackage{hyperref}
\usepackage{cleveref}

\crefname{figure}{figure}{figures} % cleveref by default has `fig.'
\Crefname{figure}{Figure}{Figures}

\setcounter{secnumdepth}{1}

\begin{document}

\chapter{Testchapter}

\section{Testsection}
\label{sec:test}

\begin{figure}
    \rule{20pt}{20pt}
    \caption{Testfigure}
    \label{fig:test}
\end{figure}

Cross reference to \cref{fig:test}
and to \cref{sec:test}

\end{document}

在此处输入图片描述

相关内容