Latex文档中的超链接从页面开头开始。

5
我有一个latex文档。我正在使用hyperref、makeidx和glossary包来编写我的文档。
所有的东西都创建得很好;目录(所有引用都可以正常工作)、词汇表和索引都没问题,只是在词汇表和索引中打印的页码是正确的,但它们指向从文档开头开始的页码,其中最初的10页是阿拉伯数字,然后从1开始的罗马数字。
例如,我有10页的前言(摘要、声明、目录等等)。之后,正文开始,罗马数字从1开始。所以在这一页1上,我有一个索引条目“hello”。
现在在索引中,它打印了“hello 1”,这是正确的,但当你点击1时,它会跳转到文档开头的正确位置,而不是编号为1的页面。
非常感谢您的帮助。
谢谢, Omer

这对我来说是新的。你使用标准类(文章,书籍,报告...)还是自定义类? - dmckee --- ex-moderator kitten
这里提供了使用\phantomsection的解决方案:https://dev59.com/sXRA5IYBdhLWcg3w6SXZ谢谢! - user2551225
相关问题:https://tex.stackexchange.com/questions/516267/compatibility-of-hypertexnames-false-and-indexes - Albert
6个回答

4

好的,使用Google搜索技巧可查到TeX FAQ中标题为“超链接和重复页码”的条目。它指出这是一个已知问题,并建议将两个选项传递给hyperref宏包:

  • plainpages=false
  • pdfpagelabels

尽管它警告这些选项不会在所有情况下起作用(但我相信在你的情况下会有效)。应用程序将类似于以下内容:

\usepackage[plainpages=false,pdfpagelabels,pagebackref]{hyperref}

在你的导言中。

如果失败,这篇维基文章提供了一个更加笨重的技巧,可以在上述方法无效的地方使用。(请向下滚动到“链接问题”部分。)

(*) 结果发现我是因为打错字才找到这些东西的,我向谷歌搜索了“"hyperef frontmatter"”,而不是“"hyperref frontmatter"”。有些日子你就会很幸运。


我正在尝试使用pdfpagelables,但不确定在哪里使用?另外,plainpages = false没有起作用。 - okm
这里是:\usepackage[pdfpagelabels]{hyperref} - Thomas
我已经尝试了所有选项,包括“链接问题”,但都没有起作用。 - okm
我想我已经没有更多的想法了。抱歉。 - dmckee --- ex-moderator kitten
考虑到目录(TOC)运行得很完美,我在想问题可能出在hyperref上。由于\makeindex和\makeglossary在前言部分被调用,我认为这会创建错误的链接,尽管(奇怪的是)页码在索引和词汇表中正确打印。 - okm

2

好的,这个问题很旧了,但我遇到了同样的问题,必须找到解决方法。解决方法涉及一些TeX编程,不是通用的,但你应该能够将其适应于你的特定情况。

问题

索引包使用\hyperpage宏生成链接,该宏只需要一个参数:它将打印这个数字并链接到具有该绝对编号页面。

临时解决方案

在前置部分中保存页面数量的宏,然后将所有页面锚点移位相同的数量。

实践中

这个解决方案很脆弱,因为如果你的书籍样式代码或hyperref包发生变化,就不再起作用。尽管如此,这对我来说仍然是一个可行的解决方案。 我修改了我的书籍样式中的\frontmatter宏:

(添加的新行是第2和第3行,注意我们需要减去1,因为计算发生在新页面上,编号为'1')

 \newcommand\mainmatter{\clearemptydoublepage
    \count0=\value{page}\advance\count0 by -1
    \xdef\pagesfrontmatter{\the\count0}
    \@mainmattertrue\pagenumbering{arabic}}

接下来是更棘手的部分。 \hyperpage 嵌入了很多代码,并且可以处理例如 '2,4' 或 '3-5' 这样的参数,因此我们需要修改实际输出文本和超链接的终止宏。如果您查看 hyperref.sty,您会发现它被命名为 \HyInd@removespaces。我们需要仅重新定义它用于索引,以便每个链接具有相同的文本,但锚点偏移正确的量(修改的行包括对 \count0 的引用):

{ % open local group
% locally change how hyperpage creates hyperlinks to take
% frontmatter pages into account
\makeatletter
\def\HyInd@removespaces#1 #2\@nil{%
  \toks@=\expandafter{\the\toks@#1}%
  \ifx\\#2\\%
    \edef\x{\the\toks@}%
    \ifx\x\@empty
    \else
      \count0=\the\toks@\advance\count0 by \pagesfrontmatter%
      \hyperlink{page.\the\count0}{\the\toks@}%
    \fi
  \else
    \ltx@ReturnAfterFi{%
      \HyInd@removespaces#2\@nil
    }%
  \fi
}
\makeatother

\printindex
} % close local group

1

我之前写过一篇博客文章,讲解了如何简单地将页面编号为1...n,摆脱罗马数字。这可以解决你的问题,并且在PDF阅读器中也能得到合理的页面编号。如果这正是你想要的,请将以下代码放入导言区:

\let\oldsetcounter=\setcounter
\renewcommand\setcounter[2]{%
  \ifx\not{#1}{page}\oldsetcounter{#1}{#2}\fi}

谢谢Thomas...但是我需要在我的文档中使用阿拉伯数字和罗马数字来表示不同的章节。 - okm

0

这是一个不太光彩的技巧,但它确实有效

\newcounter{glshyperpage}%
\def\glshyper#1#2{%
\setcounter{glshyperpage}{#2}%
\addtocounter{glshyperpage}{6}%number of front-matter pages
(\hyperlink{#1.\theglshyperpage}{#2})}

对我没用:在索引中点击“xvi”会直接跳转到书的第一页。但至少没有破坏任何东西。 - schremmer

0

我不确定这是否有效,但你尝试在适当的位置添加以下内容了吗?

\frontmatter

\mainmatter

\backmatter

请注意,这仅适用于书籍和类似书籍的类,而不适用于文章、信函等。


是的!一切都正常工作。这不是前言、正文和后记的问题;如果您阅读我的第一条消息,我描述了除了词汇表和索引中的超链接打印正确的页面但链接错误之外,其他一切都很好。 - okm
听起来像是一个页面计数器的问题。你尝试在 \frontmatter 的开头设置一个计数器,然后在 \mainmatter 再设置另一个计数器了吗? - Mica

0

只需在您的\usepackage{hyperref}中加入选项hypertextnames=true,例如:

\usepackage[hypertexnames=true]{hyperref}

将此代码添加到您的导言部分。

成功了!但是,我之前按照某人的建议设置了hypertexnames=false,并查看了[https://tex.stackexchange.com/questions/3188/what-does-the-hyperref-option-hypertexnames-do],但我仍然无法理解。无论如何,现在我已经按照您的建议将其设置为`hypertexnames=true`,但是在继续工作时,我会留意是否有意外情况发生。因此,以上内容是提醒其他人也要注意的。 - schremmer
@ewi 请不要删除代码高亮显示。没有它,你的答案会更难阅读。 - samcarter_is_at_topanswers.xyz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接