Latex文档中的超级引用链接从页面开头开始

时间:2009-09-21 16:36:29

标签: latex indexing hyperlink

我有一份乳胶文件。我正在为我的文档使用hyperref,makeidx和glossary包。

每件事都创造得很好;内容表(所有参考文献都很好),词汇表和索引除了在词汇表和索引中打印的页码是正确的,但它们指向从文档开头开始的页码,其中最初的10页是阿拉伯数字,然后是罗马数字从1开始。

e.g。我有10页的初始事项(摘要,声明,目录等)。之后,mainmatter开始,罗马的页码从1开始。所以在这个页面1上,我有一个索引条目“hello”

现在在索引中,它打印“hello 1”,这是正确的,除非当单击1时,它会在文档的开头向右移动,而不是编号为第1页。

非常感谢您的帮助。

谢谢, 奥马尔

6 个答案:

答案 0 :(得分:4)

好的,googlefu(*)提供http://www.tex.ac.uk/cgi-bin/texfaq2html?label=pdfpagelabels 在哪里说这是一个已知问题,并建议hyperref包的两个选项:

  • plainpages=false
  • pdfpagelabels

虽然它警告说这些不会在每个情况下起作用(但我相信它会在你的情况下)。该应用程序看起来像:

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

在你的序言中。

失败,http://en.wikibooks.org/wiki/LaTeX/Hyperlinks提供了一些狡猾的技巧,可以在上述失败的地方使用。 (向下滚动到“链接问题”部分。)

希望有所帮助。

(*)结果我发现这个东西是由于拼写错误,并且谷歌要求"hyperef frontmatter"而不是"hyperref frontmatter"。有些日子你很幸运。

答案 1 :(得分:2)

我刚才写了一篇blog post,解释了如何简单地为你的页面编号1 ... n ,摆脱罗马数字。这解决了您的问题,并在PDF阅读器中进行合理的页面编号。如果这是你想要的,请将以下代码放在序言中:

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

答案 2 :(得分:1)

好的,这个问题很老,但我遇到了同样的问题,不得不找到解决方案。该解决方案涉及一些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

答案 3 :(得分:0)

我不确定这是否会起作用,但您是否尝试过添加

\ frontmatter

\ mainmatter

\ backmatter

在适当的地方?

请注意,这仅适用于本书和书本类,而不是文章,信件等。

答案 4 :(得分:0)

这是一个肮脏的伎俩,但它有效

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

答案 5 :(得分:0)

只需将hypertextnames=true选项放入\usepackage{hyperref}即可,例如

\usepackage[hypertexnames=true]{hyperref}

进入你的序言。