更正索引的超链接

更正索引的超链接

我正在使用书籍类编写文档,索引的超链接使 pdf 查看器有点太远,即当我单击时,屏幕顶部位于索引的开头,而不是显示索引标题。这是一个 MWE:

\documentclass{book}
\usepackage{hyperref}
\usepackage{makeidx}
\makeindex
\begin{document}


\cleardoublepage
\phantomsection
\addcontentsline{toc}{section}{Table of Contents}
\renewcommand{\contentsname}{Table of Contents}  % Original name = Contents
\tableofcontents
\index{foo}


\cleardoublepage
\phantomsection
\addcontentsline{toc}{chapter}{\indexname}
\printindex


\chapter{foo}
\end{document}

当我编译它并点击索引时,我到达该位置:

我怎样才能将索引的超链接准确发送到索引页,并使索引标题清晰显示在顶部?

编辑:修复了 phantomsection 和 addcontentsline 的顺序

编辑2:带有详细超引用的日志如下:

Package hyperref Info: Anchor `Doc-Start' on input line 18.
Package hyperref Info: Anchor `chapter*.1' on input line 20.
(D:\Travail\Bugtex\bug.toc
Package hyperref Info: bookmark on input line 1:
(hyperref)             thecounter {0}
(hyperref)             text {\contentsname }
(hyperref)             reference {chapter*.1}
(hyperref)             toclevel {0}
(hyperref)             type {toc}.
Package hyperref Info: Reference (link) `chapter*.1' on input line 2.
Package hyperref Info: Reference (link) `section*.2' on input line 3.
Package hyperref Info: Reference (link) `chapter.1' on input line 4.
)
\tf@toc=\write4
Package hyperref Info: Anchor `page.1' on input line 23.
 [1


{C:/Users/Arnaud/AppData/Local/MiKTeX/2.9/pdftex/config/pdftex.map}
Package `hyperref' Info: End of reference (link) `chapter*.1', line 2.
Package `hyperref' Info: End of reference (link) `section*.2', line 3.
Package `hyperref' Info: End of reference (link) `chapter.1', line 4.
]
 Package hyperref Info: Anchor `page.2' on input line 23.
 [2

]
Package hyperref Info: Anchor `section*.2' on input line 24.
Package hyperref Info: bookmark on input line 25:
(hyperref)             thecounter {0}
(hyperref)             text {\indexname }
(hyperref)             reference {section*.2}
(hyperref)             toclevel {0}
(hyperref)             type {toc}.
 (D:\Travail\Bugtex\bug.ind
Package hyperref Info: Reference (link) `page.1' on input line 3.
Package hyperref Info: Anchor `page.3' on input line 5.
 [3

Package `hyperref' Info: End of reference (link) `page.1', line 3.

])
Package hyperref Info: Anchor `page.4' on input line 28.
 [4


]
Package hyperref Info: Anchor `chapter.1' on input line 28.

Chapter 1.
Package hyperref Info: bookmark on input line 28:
(hyperref)             thecounter {1}
(hyperref)             text {\protect \numberline {\thechapter }foo}
(hyperref)             reference {chapter.1}
(hyperref)             toclevel {0}
(hyperref)             type {toc}.
Package atveryend Info: Empty hook `BeforeClearDocument' on input line 29.
Package hyperref Info: Anchor `page.5' on input line 29.

答案1

索引标题的锚点\twocolumn

同时,MWE 的问题(\phantomsection和的顺序\addcontentsline)已经解决,我们可以看看真正的问题:

\cleardoublepage
\phantomsection
\addcontentsline{toc}{chapter}{\indexname}

受到可选参数的副作用的影响\twocolumn。可选参数中的标题以单列模式放在页面顶部,但页面的当前内容(锚点设置)会停滞并添加到双栏模式的标题。

因此需要修补内部部分\begin{theindex}以使锚点处于正确的位置:

\listfiles
\documentclass{book}
\usepackage[verbose]{hyperref}
\usepackage{makeidx}
\makeindex

\usepackage{etoolbox}
\patchcmd{\theindex}{%
  \twocolumn[%
}{%
  \twocolumn[%
    \phantomsection
    \addcontentsline{toc}{chapter}{\indexname}%
}{}{\errmessage{Patching \string\begin{theindex} failed}}

\begin{document}

\cleardoublepage
\phantomsection
\addcontentsline{toc}{section}{Table of Contents}
\renewcommand{\contentsname}{Table of Contents}  % Original name = Contents
\tableofcontents
\index{foo}

\printindex

\chapter{foo}
\end{document}

旧 MWE 分析

分析部分被保留,因为它的方法对于调试类似问题仍然有用。

使用问题的旧 MWE,我得到一个链接页面提前。

以下 MWE 仅添加选项\listfiles并使用一个空行而不是两个:verbosehyperref

\listfiles
\documentclass{book}
\usepackage[verbose]{hyperref}
\usepackage{makeidx}
\makeindex
\begin{document}

\cleardoublepage
\phantomsection
\addcontentsline{toc}{section}{Table of Contents}
\renewcommand{\contentsname}{Table of Contents}  % Original name = Contents
\tableofcontents
\index{foo}

\cleardoublepage
\addcontentsline{toc}{chapter}{\indexname}
\phantomsection
\printindex

\chapter{foo} 
\end{document}

现在.log运行两次后文件包含pdflatex

Package hyperref Info: Anchor `Doc-Start' on input line 6.
Package hyperref Info: Anchor `section*.1' on input line 9.
Package hyperref Info: bookmark on input line 10:
(hyperref)             thecounter {0.0}
(hyperref)             text {Table of Contents}
(hyperref)             reference {section*.1}
(hyperref)             toclevel {1}
(hyperref)             type {toc}.
Package hyperref Info: Anchor `chapter*.2' on input line 12.
 (./test.toc
Package hyperref Info: bookmark on input line 1:
(hyperref)             thecounter {0}
(hyperref)             text {\contentsname }
(hyperref)             reference {chapter*.2}
(hyperref)             toclevel {0}
(hyperref)             type {toc}.
Package hyperref Info: Reference (link) `chapter*.1' on input line 2.
Package hyperref Info: Reference (link) `section*.2' on input line 3.
Package hyperref Info: Reference (link) `chapter.1' on input line 4.
)
\tf@toc=\write5
\openout5 = `test.toc'.

Package hyperref Info: Anchor `page.1' on input line 15.
 [1



{/home/one/tl/tldevsrc/Master/texmf-dist/fonts/map/pdftex/updmap/pdftex.map}
Package `hyperref' Info: End of reference (link) `chapter*.1', line 2.
Package `hyperref' Info: End of reference (link) `section*.2', line 3.
Package `hyperref' Info: End of reference (link) `chapter.1', line 4.
]
Package hyperref Info: Anchor `page.2' on input line 15.
 [2

]
Package hyperref Info: bookmark on input line 16:
(hyperref)             thecounter {0}
(hyperref)             text {\indexname }
(hyperref)             reference {chapter*.2}
(hyperref)             toclevel {0}
(hyperref)             type {toc}.
Package hyperref Info: Anchor `section*.3' on input line 17.
 (./test.ind
Package hyperref Info: Reference (link) `page.1' on input line 3.
Package hyperref Info: Anchor `page.3' on input line 5.
 [3

Package `hyperref' Info: End of reference (link) `page.1', line 3.

])

分析:

  • 锚点在文档的开头Doc-Start自动设置。hyperref
  • 锚点section*.1是由第一个\phantomsection之前\tableofcontents
  • 目录的书签之前使用的是锚点。
  • 锚点chapter*.2由 设定\chapter*{\contentsname...}。顺便说一句,此锚点可代替\phantomsection,见下文。
  • 目录中的链接:

    • section*.1: 先\phantomsection\tableofcontents
    • chapter*.2\tableofcontents
    • chapter.1\chapter{foo}
  • 带有锚点的第 1 页输出page.1

  • 带有锚点的第 2 页输出page.2

  • 索引的书签正在使用chapter*.2生成的链接\thetableofcontents

  • 锚定section*.3是由于\phantomsection \addcontentsline用于索引。

  • 索引条目链接到page.1, 的页面位置\index{foo}
  • 带有锚点的第 3 页输出page.3

版本:

  • LaTeX:2011/06/27
  • book:2007/10/19 v1.4h
  • hyperref:20112/11/06 v6.83m
  • makeidx:2000/03/29 v1.0m

概括:

书签和索引目录中的条目都指向第 1 页的目录,而不是第 3 页的索引。这可以通过正确的顺序来解决:

\cleardoublepage
\phantomsection
\addcontentsline{toc}{...}{...}

目录链接

前面的分析表明,第一个\phantomsection对于目录来说是不需要的:

\listfiles
\documentclass{book}
\usepackage[verbose]{hyperref}
\usepackage{bookmark}%
\usepackage{makeidx}
\makeindex

\usepackage{etoolbox}
\patchcmd{\theindex}{%
  \twocolumn[%
}{%
  \twocolumn[%
    \phantomsection
    \addcontentsline{toc}{chapter}{\indexname}%
}{}{\errmessage{Patching \string\begin{theindex} failed}}

\renewcommand*{\contentsname}{Table of Contents}

% Put `\addcontentsline` for the table of contents at the
% start of the table of contents to get on its first page
\AtBeginDocument{%
  \addtocontents{toc}{%
    \protect\addcontentsline{toc}{chapter}{\protect\contentsname}%
  }%
}

\begin{document}

\tableofcontents
\index{foo}

\printindex

\chapter{foo}
\end{document}

由于间接(嵌套\add(to)contents(line)),需要额外运行 LaTeX。诀窍是\addcontentsline必须位于目录标题和第一页末尾之间。

答案2

解决方法

我在放大页面并单击超链接后遇到了与楼主相同的问题。我使用命令\chapter*来获得想要的效果(提升锚点)。

% run: *latex mal-indextext.tex
% plus makeindex, plus another LaTeX run
\documentclass{book}
\usepackage{hyperref}
\usepackage{makeidx}
\makeindex
\begin{document}
\cleardoublepage
\phantomsection
\addcontentsline{toc}{section}{Table of Contents}
\renewcommand{\contentsname}{Table of Contents}
\tableofcontents
Index foo.\index{foo}
\cleardoublepage
\phantomsection
\def\indexname{My index}
\addcontentsline{toc}{chapter}{\indexname}
\chapter*{\indexname}
\begingroup
\def\clearpage{}
\IfFileExists{\jobname.ind}{\input{\jobname.ind}}{}
\endgroup
\chapter{foo}
\end{document}

编辑1:需要澄清的是,这是 OP 的问题,打开 PDF 文件后,放大(示例中为 600%)目录并单击指数术语它让我们进入正确的页面,但位置不正确(我们看不到索引名称)。第一张图片演示了这一点:左图是在单击之前拍摄的,右图是在单击之后拍摄的。这种情况发生在 OP 和 Christian Hupfer 的解决方案中,以及 Heiko Oberdiek 的第一个解决方案中。我已经在 Adob​​e Reader 和 TeXworks 编辑器中测试过它。

目前的情况:

mwe,错误解决方案

我的解决方案很糟糕,解决了这个问题(下图,放大300%,左边是点​​击前的状态,右边是点击后的情况)我的索引就像右图所示,但这不是一个推荐的解决方案,因为我已经使用该\chapter*命令来获取索引名称和正确的锚点位置。

编辑2:请参阅 Heiko Oberdiek 的更新,它解决了这个问题。

请求的情况与此类似:

mwe,好的解决方案,但糟糕的方法

相关内容