Wie kann ich hyperref zusammen mit pdflatex verwenden? Ich erhalte den Fehler »pdfTeX error (ext4): link annotations can’t be nested.« (bei jedem Backend-Treiber).

Die genaue Fehlermeldung ist, egal welchen Backend-Treiber ich für
hyperref verwende (hypertex oder pdftex):

pdfTeX error (ext4): link annotations can't be nested.
    <to be read again>
                 endgroup

In LaTeX gibt es zwei verschiedene Arten von Befehlen: fragile und
robuste. Bei ihrer Verwendung ist im Normalfall zu beachten: Kommt ein fragiler
Befehl in einem »moving argument« vor, so ist er mit einem unmittelbar
vorausgehenden protect -Befehl zu schützen. Ein
»moving argument« ist ein Text (Argument eines Befehls), der
an andere Stellen im Dokument gesetzt werden kann – hauptsächlich
die Argumente von caption{ } (tauchen wieder in der Abbildungsliste
auf), section{ }, subsection{ } und
subsubsection{ } (tauchen wieder im Inhaltsverzeichnis auf).

Für pdfLaTeX bedeutet das: Ein »moving argument« wird im
Normalfall von hyperref zu einem Hyperlink gemacht. Enthält es selbst
einen Link, so müssten Links geschachtelt werden, was nicht möglich ist.
Genau darüber beschwert sich pdfLaTeX: »link annotations can’t be
nested«. Einige Fälle, in denen dieser Fehler auftrat, waren z.B.:

  • ref{ } innerhalb von caption{ }
  • ref{ } innerhalb von subsubsection{ }
  • cite[ ]{ } innerhalb von subsubsection{ }

Die Zeile, in der pdfLaTeX den Fehler anmerkt, stimmt ganz und gar nicht mit der
Zeile überein, die den Fehler enthält. Man muss den Fehler also
selbst zurückerfolgen.

Dazu kopiert man das Dokument (als .tex-Datei!) mit allen benötigten
Abbildungen usw. in einen eigenen Testordner und entfernt dann
stückweise die ref { } und cite[ ]{ }
-Befehle aus der Datei. Das geschieht effektiv mit Hilfe des vi-Befehls
:%s/\ref{.*}//gc, den man einfach nach dem Aufruf von
vi <dateiname>.tex eingibt und dann einige Ersetzungen
mit y bestätigt. Man behält sich jeweils die Dateiversion vor dem
letzten Schritt der Ersetzungen, versucht pdflatex laufen zu lassen und
vergleicht die Datei mit dem letzten Backup, wenn der Lauf gelang: diff
<dateiname>.tex <dateiname>Backup1.tex
. Die Ausgabe zeigt
dann, wo der Fehler liegt.

Achtung: Nur jeder zweite pdflatex-Lauf misslingt, denn nur in jedem zweiten
Lauf sind ungelöste Referenzen vorhanden, die zu Hyperlinks konvertiert
werden sollen.

Um diesen Fehler nicht auftreten zu lassen, verwende man keine Hyperlinks in
»moving arguments«. Es gibt auch noch die (von mir noch nicht getestete)
Möglichkeit, alternative Zeichenketten anzugeben:

documentclass{article}
usepackage{url}
usepackage[pdftex]{hyperref}
begin{document}
tableofcontents
section{New files at texorpdfstring{%
   protecturl{http://www.franken.de}}{%
   tetxtt{http://www.franken.de}}}
end{document}

Posted

in

,

by

Tags:

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.