Sie sind hier

Fehler im Zusammenspiel mit hyperref

Beim zweiten LaTeX-Lauf des Dokuments

\documentclass{scrbook}
\usepackage[dvips,naturalnames=true]{hyperref}! Missing \endcsname inserted.
\begin{document}
\chapter{Kapitel}
Text
\section{Abschnitt}
Text
\end{document}

tritt ein Fehler auf. In der.out-Datei taucht der Befehl \relax auf.

Ich denke, der Fehler liegt im section-Befehl der Komascript-Klasse.

Bild von Markus Kohm

nämlich:

! LaTeX Error: Missing \begin{document}.
 
See the LaTeX manual or LaTeX Companion for explanation.
Type  H <return>  for immediate help.
 ...                                              
 
l.2 ...package[dvips,naturalnames=true]{hyperref}!

Du hast also nicht nur die Formatierungshinweise, auf die Du bereits beim Abschicken Deines Beitrags hingewiesen wurdest, komplett missachtet, sondern auch ein ungetestetes Beispiel gepostet. Nächstes Mal also bitte etwas mehr Sorgfalt!

Ansonsten ist das kein Fehler von KOMA-Script, sondern ggf. ein Problem von hyperref, denn die out-Datei wird nicht von KOMA-Script, sondern von hyperref geschrieben. Das Problem löst sich in Wohlgefallen auf, wen man auf die Option naturalnames=true verzichtet. Wenn Du das nicht kannst, wende Dich an den Maintainer von hyperref.

Zeile 2 meines Beispiels sollte wie folgt lauten

\usepackage[dvips,naturalnames=true]{hyperref}

Der Fehler liegt bei Komascript:
Der Fehler tritt erst beim zweiten Durchlauf auf. Hier die Antwort von
Heiko Oberdiek:

Das liegt an KOMA-Script, getestet mit aktueller TL2008:
scrbook.cls 2009/04/03 v3.03a KOMA-Script document class (book)

\thesection expandiert zu etwas, was \relax enthält und das
als Ankername hyperrefs Lesezeichenbaumaufbau stört.

Ausgabe von "\tracingmacros=1":
\thesection ->\ifnum \scr@compatibility >\@nameuse {scr@v@2.97d}\relax
\if@mainmatter \thechapter .\fi \else \thechapter .\fi \@arabic \c@section

Ein Leerzeichen anstelle des \relax und das Problem wäre behoben.
Oder die \scr@v@X.Yz-Befehle werden gleich als \chardef o.ä. definiert.
In hyperref kann ich da nicht viel machen, schließlich kann ich \relax
nicht als leer umdefinieren (Nach \numexpr wird das originale \relax
manchmal zwingend benötigt.)

Bild von Markus Kohm

In LaTeX2e ist nirgendwo dokumentiert, dass in \theCounter kein \relax vorkommen darf. Damit ist KOMA-Script korrekt.

Übrigens kann ich auch in er hyperref-Doku keinen Hinweis finden, dass es Probleme mit \relax in \theCounter hat. Nur weil es eventuell nicht ganz trivial ist, das Schreiben des \relax in die out-Datei zu verhindern, heißt das nicht, dass hyperref sich hier korrekt verhält und schon gar nicht, dass andere Klassen und Pakete fehlerhaft sind, weil hyperref dieses Problem hat.

Die Anweisung \relax ist übrigens eine in TeX häufig verwendete Anweisung. Allein im LaTeX-Kern, latex.ltx, finde ich 336 Zeilen, in denen min. ein \relax steht. In hyperref.sty selbst sind es immerhin noch 187, in scrbook nur 118. Sie dient u. a. dazu dem Parser zu erklären, dass das Einlesen einer Zahl zu beenden ist.

Bevor ich die \relax drin hatte, hatte ich übrigens mal ein Leerzeichen vorgesehen. Leerzeichen vergisst man aber leicht und machen den Code deutlich schwerer wartbar als leicht zu sehende \relax. Nachdem genau ein solches verlorenes Leerzeichen zu einem Bug führte, habe ich einheitlich die \relax bei den Vergleichen eingefügt.

Comments for "Fehler im Zusammenspiel mit hyperref" abonnieren