我想使用文档类中的\autoref
命令(来自包) 。hyperref
tufte-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.sty
和tufte-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}