Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Hyper reference links in Latex document starts from the beginning of the page

I have a latex document. I am using hyperref, makeidx and glossary packages for my document.

Every thing is created fine; table of content (all references works nicely), glossary and index except that page numbers printed in the glossary and index are correct but they point to page numbers starting from the beginning of the document where initial 10 pages are in arabic numbers and then roman numbers from 1 starts.

e.g. I have 10 pages for initial front matter (abstract, declaration, table of contents etc etc). After that, mainmatter begins and so does the page numbers in roman from 1. So on this page 1, I have an index entry "hello"

Now in the index, it prints "hello 1" which is correct except that when one clicks on 1, then it goes to the right at the beginning of the document rather then numbered page 1.

Your help would be much appreciated.

Thanks, Omer

like image 847
okm Avatar asked Sep 21 '09 16:09

okm


2 Answers

OK, googlefu(*) yields the TeX FAQ entry titled Hyperref and repeated page numbers where it says that this is a known problem, and suggests passing two options to the hyperref package:

  • plainpages=false
  • pdfpagelabels

though it warns that these will not work in every situation (but I believe it will in yours). The application would look something like:

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

in your preamble.

Failing that this Wiki article provides an even clunkier trick which will work in places where the above fails. (Scroll down to the "Problems with Links" section.)

(*) Turns out I found this stuff due to a typo, and asked google for "hyperef frontmatter" rather than "hyperref frontmatter". Some days you just get lucky.

like image 101
dmckee --- ex-moderator kitten Avatar answered Nov 06 '22 14:11

dmckee --- ex-moderator kitten


Ok this question is old, but I encountered the same problem and had to find a solution. The solution involves a bit of tex hacking and is not generic but you should be able to adapt it to your particular case.

The problem

The index package generates links using the \hyperpage macro, which takes only one argument: it will print this number and link to the page that has this absolute number.

Ad-hoc solution

Saving the number of pages in the front matter in a macro, then shifting all page anchors by that same number.

In practice

This solution is fragile since if the code of your book style or the hyperref packages changes, it will not work anymore. Still this is a working solution for me. I modified the \frontmatter macro in my book style:

(New lines added are lines 2 and 3, note that we need to decrement by 1 as the computation occurs on the new page numbered '1')

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

Then comes a trickier part. The \hyperpage embeds a lot of code, and can handle for instance arguments like '2,4' or '3-5', so we need to modify the end macro that actually outputs the text and hyperlink. If you look at hyperref.sty, you will find it named \HyInd@removespaces. We need to redefine it only for the index so that each link has the same text but the anchor is shifted by the right amount (modified lines are those including references to \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
like image 2
Sparshong Avatar answered Nov 06 '22 15:11

Sparshong