Sie sind hier

pdflatex, hyperref und Sprungmarken bei unnummerierten sections

Hallo,

Folgendes Problem mit pdflatex, hyperref und secnumdepth und Klasse scrbook: Wenn ich im
über pdflatex erzeugten PDF in die Bookmarks klicke, so wird im Dokument nur bei nummerierten chapter/section/subsection an das richtige Sprungziel gesprungen. Bei nicht nummerierten Überschriften
springt der Acrobat Reader an den Beginn des Absatzes bzw. die nächst tiefere Überschrift, je nachdem, was zuerst kommt. Beispiel:

\documentclass[11pt,a4paper,openany]{scrbook}
\usepackage[colorlinks=true,linkcolor=black,bookmarksopen]{hyperref}
 
\begin{document}
\setcounter{secnumdepth}{1}
 
\tableofcontents
 
\addchap{Vorwort} % etc...
 
\addsec{foo}
 
\subsection{Falsches Sprungziel}
 
Hier springt Acrobat Reader bei einem Klick irrtümlicherweise hin.
\newpage
 
\addsec{bar}
 
\end{document}

Bis zu sections wird in diesem Fall korrekt gesprungen, zu subsections nicht mehr (weil nicht mehr nummeriert). Ich habe diese Frage vor einem Jahr schon mal in einer LaTeX-Newsgroup gestellt, und Markus hat angedeutet, dass er die Ursache des Problems kenne. Ich habe inzwischen einige Stunden mit der Lösungssuche verbracht (auch die komascr-Doku gelesen), bin keinen Schritt weiter und bitte freundlich um einen Hinweis.

Grüße,

Björn

forum: 
Bild von Markus Kohm

Das ist ein Problem von hyperref, nicht wirklich von KOMA-Script. Das Problem ist, dass beispielsweise in hpdftex.def für nicht nummerierte Kapitel definiert ist:

\let\H@old@schapter\@schapter
\def\@schapter#1{%
  \H@old@schapter{#1}%
  \begingroup
    \let\@mkboth\@gobbletwo
    \Hy@GlobalStepCount\Hy@linkcounter
    \xdef\@currentHref{\Hy@chapapp*.\the\Hy@linkcounter}%
    \Hy@raisedlink{%
      \hyper@anchorstart{\@currentHref}\hyper@anchorend
    }%
  \endgroup
}

Es wird also erst die Kapitelüberschrift per \H@old@schaper gesetzt und dann der Anker. Demgegenüber wird bei \chapter, wenn diese aufgrund von \frontmatter oder \backmatter oder secnumdepth nicht nummeriert werden, per:

  \def\@chapter{%
    \def\Hy@next{%
      \Hy@GlobalStepCount\Hy@linkcounter
      \xdef\@currentHref{\Hy@chapapp*.\the\Hy@linkcounter}%
      \Hy@raisedlink{%
        \hyper@anchorstart{\@currentHref}\hyper@anchorend
      }%
    }%
    \ifnum\c@secnumdepth>\m@ne
      \@ifundefined{if@mainmatter}%
      \iftrue{\csname if@mainmatter\endcsname}%
        \let\Hy@next\relax
      \fi
    \fi
    \Hy@next
    \Hy@org@chapter
  }%

korrekt erst der Anker gesetzt und dann per \Hy@org@chapter die Überschrift. Ich habe dieses Problem mit Lösungsvorschlag bereits vor Monaten (ich glaube im November) an den Maintainer von hyperref gemeldet, bisher aber keine Reaktion darauf bekommen. Dabei betrifft das Problem nicht allein KOMA-Script.

Per Mail ist von mir ein Paket zu bekommen, das an Stelle von hyperref verwendet wird (und selbst hyperref lädt) und das Problem für die Ebenen part, chapter und section und damit auch für \addpart, \addchap und \addsec beheben sollte. Eine Dauerlösung kann dieses Paket nicht sein. Eine korrekte Lösung wäre, das Problem in hyperref selbst bzw. den betroffenen Treiberdateien von hyperref zu beheben. Deshalb ist mein Fix nicht öffentlich verfügbar und darf auch nicht weitergegeben werden.

Meine dringende Empfehlung: Wende Dich an den Maintainer von hyperref. Die ideale Lösung wäre übrigens, wenn er bei der Gelegenheit endlich eine Schnittstelle implementieren und dokumentieren würde, über die Paketautoren selbst wählen können, wo der Anker stehen soll. Dann würde er bei KOMA-Script nicht nur bei Überschriften deutlich besser platziert werden. Eine solche Schnittstelle habe ich schon vor Jahren nachgefragt und wie mir ein anderer Paketautor geschrieben hat, bin ich nicht der einzige.

... für die schnelle Antwort, auch wenn sie mich nur schwach trösten kann. Ich habe bereits eine Mail an Heiko Oberdiek geschrieben und werde Bescheid geben, falls ich eine Antwort in irgend einer Form bekommen sollte. An dem Paket zum Workaround bin ich sehr interessiert und werde dich per E-Mail dazu kontaktieren.

Bild von Markus Kohm

Da der Maintainer von hyperref das Problem bisher nicht behoben hat und auch meinen entsprechenden Hinweis seit Monaten unbeantwortet gelassen hat, habe ich das Paket scrhack geschrieben. Dies ist in einer BETA-Version inzwischen Teil von KOMA-Script und wird seit einigen KOMA-Script-Versionen mit KOMA-Script ausgeliefert. Die Anleitung gibt es getrennt von der KOMA-Script-Anleitung als scrhack.pdf. In der Regel genügt ein

\usepackage{scrhack}

in der Dokumentpräambel. Das Paket verbessert dann neben hyperref auch andere Pakete und kann auch mit anderen Klassen als den KOMA-Script-Klassen verwendet werden.

Bild von Markus Kohm

Inzwischen wurde übrigens auf meine Anregung hin hyperref so geändert, dass scrhack dafür nicht mehr benötigt wird.

Comments for "pdflatex, hyperref und Sprungmarken bei unnummerierten sections" abonnieren