目录链接到图片/表格不起作用

目录链接到图片/表格不起作用

有很多相关问题:

然而,在尝试了许多建议的解决方案(有时是矛盾的)几个小时后仍然失败后,我想我现在将其作为另一个问题发布在这里(希望我可以稍后为这个案例添加解决方案)。

在我的代码的早期版本中,甚至词汇表和参考书目的链接都坏了,但现在似乎可以正常工作了。在这个最新版本中,除了图表链接之外,一切似乎都正常。

请注意,该代码来自博士论文的模板,原则上我认为我不应该在其中进行太多更改。

示例代码test.tex

\documentclass[listof=totoc]{scrbook}

\usepackage{amsmath}
\usepackage[Bjarne]{fncychap}
\usepackage{hyperref}

% for original fncychap
\makeatletter
\DeclareOldFontCommand{\rm}{\normalfont\rmfamily}{\mathrm}
\makeatother

\title{Thesis}

\begin{document}

\frontmatter

\tableofcontents

\mainmatter
\pagestyle{headings}

\chapter{Introduction}
...

\backmatter

\listoffigures
\listoftables

\end{document}

作为参考,我的 Latex 版本:

$ pdflatex --version
pdfTeX 3.14159265-2.6-1.40.19 (TeX Live 2018)
kpathsea version 6.3.0
Copyright 2018 Han The Thanh (pdfTeX) et al.
There is NO warranty.  Redistribution of this software is
covered by the terms of both the pdfTeX copyright and
the Lesser GNU General Public License.
For more information about these matters, see the file
named COPYING and the pdfTeX source.
Primary author of pdfTeX: Han The Thanh (pdfTeX) et al.
Compiled with libpng 1.6.34; using libpng 1.6.34
Compiled with zlib 1.2.11; using zlib 1.2.11
Compiled with xpdf version 4.00

我已经尝试了多种方法,但可能是组合错误、导入顺序错误、选项错误等。

  • \phantomsection有点起作用,但它链接到上一章的结尾,而不是新章节的开头。
  • \usepackage{tocbibind}(或使用某些选项)似乎不起作用。更具体地说:
    • \usepackage{tocbibind}(无选项) 添加“目录”章节(我不想要)并破坏目录中的参考书目章节链接。词汇表链接仍然有效,表格/图表列表链接仍然无效。
    • \usepackage[nottoc]{tocbibind}就像没有选项,但没有额外的“内容”章节。
    • \usepackage[nottoc,notlof,notlot]{tocbibind}和 是一样的\usepackage[nottoc]{tocbibind}notlof或者notlot好像没有什么效果。
  • index=totoc在 documentclass 选项中(通过) 似乎没有效果。
  • \usepackage{nomencl}(使用选项的变体)似乎没有效果。

选项可能也相关hyperref。我认为我需要hypertexnames=false在那里添加,因为原始模板就是这样的。此外,更改它似乎会破坏其他东西。

此外,有些地方规定hyperref应该放在最前面。而有些地方规定 应该放在最后。还有地方规定 应该glossaries放在 之后hyperref

我注意到,这\usepackage[Bjarne]{fncychap}似乎导致了这个问题。如果我删除它,它就可以正常工作。但是,我需要使用它。(此外,我注意到模板附带了fncychapv1.34 包。但是,如果我使用普通的模板(来自 Tex Live 2018),我会遇到同样的问题。此外,可能存在一些Class scrbook Error: undefined old font command \rm错误,但这很容易解决,与此无关。)


编辑:在随机尝试之后,根据 Ulrike Fischer 的回答,在没有真正理解自己在做什么的情况下,我添加了这个(就在最后一个之后\usepackage):

\makeatletter
\renewcommand\@schapter[1]{%
    \begingroup
      \let\@mkboth\@gobbletwo
      \Hy@GlobalStepCount\Hy@linkcounter
      \xdef\@currentHref{\Hy@chapapp*.\the\Hy@linkcounter}%
      \Hy@raisedlink{%
        \hyper@anchorstart{\@currentHref}\hyper@anchorend
      }%
    \endgroup
    \H@old@schapter{#1}%
   }
\makeatother

/usr/local/texlive/2018/texmf-dist/tex/latex/koma-script/hyperref.hak(我从我的文件中获取了此代码。)

这似乎解决了问题...也许有人可以解释一下为什么它有效?或者它是否真的解决了问题,或者可能引发其他问题?


进一步编辑:在我的 中fncychap.sty,我发现了这一点:

%%% Begin: To avoid problem with scrbook.cls (fncychap version 1.32)

%%OUT:
%\def\@schapter#1{\if@twocolumn
%                   \@topnewpage[\@makeschapterhead{#1}]%
%                 \else
%                   \@makeschapterhead{#1}%
%                   \@afterheading
%                 \fi}

%%IN:
\def\@schapter#1{%
\if@twocolumn%
  \@makeschapterhead{#1}%
\else%
  \@makeschapterhead{#1}%
  \@afterheading%
\fi}

%%% End: To avoid problem with scrbook.cls (fncychap version 1.32)

如果我删除它,似乎也能解决我的问题?不过我想知道,fncychap这里试图修复的是什么?也就是说,“避免 scrbook.cls 出现问题”是什么意思?


作为一个侧面节点,daleif 在评论中争辩说,如果可以的话,你最好避免。fncychap最后更新于 2007 年。scrbookfncychap

答案1

scrbook 包含加载 hyperref 后执行的补丁。在此补丁中,它恢复了 chapter 命令的定义,因此覆盖了 hyperref 中的补丁。scrbook 显然不希望 chapter 命令被其他软件包更改。

您可以尝试以下操作:

\documentclass[listof=totoc,
enabledeprecatedfontcommands]{scrbook}
%disable scrbook patch:
\makeatletter
\renewcommand\scr@chapter@after@hyperref@patch{}
\makeatother
\usepackage[Bjarne]{fncychap}


\usepackage[%
hypertexnames=false,%
bookmarks=true,%                   %%% generate bookmarks ...
bookmarksnumbered=true,%           %%% ... with numbers
]{hyperref}

\title{Thesis}

\begin{document}
\frontmatter
\tableofcontents

\mainmatter

\chapter{Introduction}
\chapter{Conclusion}

\backmatter

\listoffigures

\listoftables
\end{document}

答案2

下载最新fncychap软件包这里,并将其复制fncychap.sty到你的 Latex 代码目录中。

打开文件。你会发现一些这样的代码:

%%% Begin: To avoid problem with scrbook.cls (fncychap version 1.32)

%%OUT:
%\def\@schapter#1{\if@twocolumn
%                   \@topnewpage[\@makeschapterhead{#1}]%
%                 \else
%                   \@makeschapterhead{#1}%
%                   \@afterheading
%                 \fi}

%%IN:
\def\@schapter#1{%
\if@twocolumn%
  \@makeschapterhead{#1}%
\else%
  \@makeschapterhead{#1}%
  \@afterheading%
\fi}

%%% End: To avoid problem with scrbook.cls (fncychap version 1.32)

删除此代码,或者将其注释掉。

这似乎解决了问题。

scrbook有其自己的定义,\@schapter而这打破了它。

相关内容