我正在使用书籍类编写文档,索引的超链接使 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
并使用一个空行而不是两个:verbose
hyperref
\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.4hhyperref
:20112/11/06 v6.83mmakeidx
: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 的第一个解决方案中。我已经在 Adobe Reader 和 TeXworks 编辑器中测试过它。
目前的情况:
我的解决方案很糟糕,解决了这个问题(下图,放大300%,左边是点击前的状态,右边是点击后的情况)我的索引就像右图所示,但这不是一个推荐的解决方案,因为我已经使用该\chapter*
命令来获取索引名称和正确的锚点位置。
编辑2:请参阅 Heiko Oberdiek 的更新,它解决了这个问题。
请求的情况与此类似: