为什么手动加载 hyperref 会改变 Tufte 文档中标题的字体大小?

为什么手动加载 hyperref 会改变 Tufte 文档中标题的字体大小?

我正在使用 Tufte 文档类,需要手动加载,hyperref而不是通过 Tufte 类加载。因此,我使用nohyper文档类的选项,然后\usepackage{hyperref}在代码中使用。

当我执行此操作时,标题(但不是脚注)的字体大小会更改为正文的字体大小:

\documentclass[nohyper]{tufte-handout}
\usepackage{inputenc}
\usepackage{graphicx}

\usepackage[pdftex,hyperfootnotes=false]{hyperref}

\begin{document}
Body text.
\begin{marginfigure}
\includegraphics[width=1\columnwidth]{agraphic}\caption{Caption text}
\end{marginfigure}

\end{document}

如果我删除该\usepackage[...]{hyperref}行,则标题字体大小是正确的(无论我nohyper是否指定)。据我所知,除了一些链接颜色细节和元数据分配外,我所做的与没有该选项的 Tufte 类所做的完全相同nohyper

答案1

我知道问题出在哪里,但我不确定我的解决方法是否正确。Hyperref 修改\caption

使用 diabonas 的评论更新代码

\documentclass[nohyper]{tufte-handout}
\usepackage{inputenc}
\usepackage{graphicx} 
\makeatletter
\let\tufte@caption\@caption  
\usepackage[hyperfootnotes=false]{hyperref}
\let\@caption\tufte@caption  
\begin{document}
Body text.
\begin{marginfigure}
\includegraphics[width=1\columnwidth]{guilloche.png}\caption{Caption text}
\end{marginfigure}

\end{document}

在此处输入图片描述

答案2

hyperref 确实需要修改\@caption。如果只关心字体,那么以下补丁就足够了:

\usepackage{etoolbox}% http://ctan.org/pkg/etoolbox
\makeatletter
\patchcmd
  {\@caption}% <cmd>
  {\normalsize}% <search>
  {\@tufte@caption@font\@tufte@caption@justification}% <replace>
  {\typeout{caption patched}}% <success>
  {}% <failure
\makeatother

在此处输入图片描述

它源于hyperref发出\normalsizewithin \@caption(从 within 调用的辅助宏\caption),该宏会重置字体。上面的补丁将其替换为常规 Tufte 类组件。

hyperref为什么即使您执行的操作“与在类级别加载完全相同”,也需要这样做?因为类hyperref首先加载,然后重新定义其自己的\caption\@caption宏,并覆盖hyperref。从这个意义上讲,@Altermundus 的回答也足够了。

相关内容