Querverweise in Kopfzeilen, Konflikt zwischen fancyhdr und hyperref

Querverweise in Kopfzeilen, Konflikt zwischen fancyhdr und hyperref

Ich schreibe meine Abschlussarbeit und verwende fancyhdrfür die Überschriften. Einfach den Standard „Kapitelname auf ungeraden Seiten und Abschnittsname auf geraden Seiten“. Ich muss das hyperrefPaket auch verwenden, um lange URLs in meiner Bibliographie aufzuteilen. Das Problem, das ich habe, ist, dass, wenn ich dieses Paket (und breakurl) verwende, die Querverweise in der Überschrift als Fragezeichen erscheinen. Das heißt, wenn ich einen Abschnitt/ein Kapitel habe, dessen Name beispielsweise einen Verweis auf eine Gleichung enthält, wird dieser Verweis in der Überschrift nicht richtig angezeigt.

Nachfolgend ein Minimalbeispiel. Nach dem Kompilieren sehen Sie beispielsweise die Überschrift auf Seite 15. Wenn ich

\usepackage[breaklinks=true]{hyperref}
\usepackage{breakurl}

in der Kopfzeile wird der Verweis korrekt angezeigt.

Irgendwelche Ideen, warum das liegt oder wie man das umgehen kann?

\documentclass[a4paper,11pt,twoside]{book}

\usepackage[rmargin=2cm,includeheadfoot,bmargin=2cm,tmargin=3cm, lmargin=4cm]{geometry}
\usepackage{fancyhdr}
\pagestyle{fancy}
\lhead[]{\footnotesize{\leftmark}}
\rhead[\footnotesize{\rightmark}]{}
\bibliographystyle{plain}

%If I comment the following two lines, no problem.
\usepackage[breaklinks=true]{hyperref}
\usepackage{breakurl}


\begin{document}

\title{Fake Title}
\author{Me}
\date{\today}
\maketitle

\chapter{First Chapter}

\section{First}
a \newpage b \newpage c \newpage
\section{Second}
\begin{equation}
x=2
\label{eq:myEquation}
\end{equation}
a \newpage b \newpage c \newpage
\section{Third}
\label{sec:thirdSection}
a \newpage b \newpage c \newpage

\chapter{Some thoughts about Section~\ref{sec:thirdSection}}
\section{First}
a \newpage b \newpage c \newpage
\section{About Equation~\ref{eq:myEquation}}
a \newpage b \newpage c \newpage
\section{First}
a \newpage b \newpage c \newpage
\end{document}

Antwort1

Das Problem ist die Überschrift in Großbuchstaben. Auch ohne hyperreferhält man Warnungen wie

LATEX WARNING: REFERENCE `SEC:THIRDSECTION' ON PAGE 13 UNDEFINED on input line 44.

Wenn hyperrefgeladen ist, \refist es nicht erweiterbar und sein Argument wird in Großbuchstaben umgewandelt, bevor es zum Abrufen der Referenzdaten verwendet wird.

Es gibt mehrere Möglichkeiten, damit umzugehen. Eine Möglichkeit besteht darin, ein robustes Makro zu verwenden, das \refund sein Argument einschließt. Dann wird dieser Befehl nicht erweitert, wenn er in verwendet wird, \MakeUppercaseund das Argument wird nicht in Großbuchstaben umgewandelt:

% before \tableofcontents
\DeclareRobustCommand*{\RefSecThirdSection}{\ref{sec:thirdSection}}
\begin{document}
...
\tableofcontents
...
\chapter{Some thoughts about Section~\RefSecThirdSection}

Die Verwendung von e-TeX \protected\defstatt LaTeX \DeclareRobustCommandhilft wegen der Lesezeichen nicht. Diese \MakeUppercasewerden deaktiviert und der Befehl wieder erweiterbar gemacht. Alternative ist \pdfstringdefDisableCommands:

\protected\def\RefSecThirdSection{\ref{sec:thirdSection}}
\pdfstringdefDisableCommands{%
  \def\RefSecThirdSection{\ref{sec:thirdSection}}%
}

Der Einfachheit halber kann dies in ein Makro eingefügt werden, zum Beispiel:

\newcommand*{\headref}[1]{%
  \csname headref@#1\endcsname
}
\newcommand*{\declareheadref}[1]{%
  \protected\expandafter\def\csname headref@#1\endcsname{%
    \ref{#1}%
  }%
  \expandafter\pdfstringdefDisableCommands\expandafter{%
    \expandafter\def\csname headref@#1\endcsname{%
      \ref{#1}%
    }%
  }%
}
\declareheadref{sec:thirdSection}
\begin{document}
...
\tableofcontents
...
\chapter{Some thoughts about Section~\headref{sec:thirdSection}}

Aufgrund der Erweiterbarkeit von \headrefkönnen Babel-Abkürzungen im Bezeichnungsnamen nicht unterstützt werden.

Wenn kein Verweis gewünscht ist, kann auch \getrefnumberdas Paket „of“ verwendet werden. ist erweiterbar, daher wird der Inhalt der Referenz in Großbuchstaben umgewandelt, nicht der Labelname.refcount\getrefnumber

\usepackage{refcount}
...
\refused{sec:thirdSection}
\chapter{Some thoughts about Section~\getrefnumber{sec:thirdSection}}

Eine dritte Möglichkeit besteht darin, von vornherein Beschriftungsnamen in Großbuchstaben zu verwenden:

\label{SEC:THIRDSECTION}
...
\chapter{Some thoughts about Section~\ref{SEC:THIRDSECTION}}

Antwort2

Wie Stephan bereits erwähnt hat, sollte das Schreiben von Beschriftungen in GROSSBUCHSTABEN das Problem beheben, da \MakeUppercasees das Argument von ändert, \ref{sec:thirdSection}das \ref{SEC:THIRDSECTION}offensichtlich nicht existiert. Sie können die Änderung der Groß-/Kleinschreibung jedoch auch verbergen, \MakeUppercaseindem Sie ein Hilfsmakro verwenden:

\newcommand{\RthirdSection}{\ref{sec:thirdSection}}
\chapter{Some thoughts about Section~\protect\RthirdSection}
%...
\newcommand{\RmyEquation}{\ref{eq:myEquation}}
\section{About Equation~\protect\RmyEquation}

Beachten Sie dabei auch \protectdie verwendeten Makros.

Dieser Vorschlag stammt aus dem TeX-FAQ-EintragMerkwürdigkeiten, die den Fall verändern.

Antwort3

Eine Lösung mit minimalen Änderungen am Dokument (keine neuen Makros oder Änderung vorhandener Beschriftungen/Referenzen) besteht darin, eine Version in Großbuchstaben alszweiteLabel auf dem referenzierten Element. Wenn beispielsweise die problematische Referenz

\begin{theorem}\label{mainresult} Suppose... 
\end{theorem}

\section{Proof of Theorem~\ref{mainresult}}

Durch Hinzufügen eines weiteren Etiketts funktioniert die Referenz in Kopfzeilen ohne weitere Änderungen.

\begin{theorem}\label{mainresult}\label{MAINRESULT} Suppose... 
\end{theorem}

\section{Proof of Theorem~\ref{mainresult}}

Dies ist zwar nicht so elegant wie der Schutz der Referenz vor der Umwandlung in Großbuchstaben, ist aber in seltenen Fällen von Interesse, in denen es sinnvoll ist, zwei Beschriftungen auf dasselbe Element zu setzen.

verwandte Informationen