ヘッダー内の相互参照、fancyhdr と hyperref の衝突

ヘッダー内の相互参照、fancyhdr と hyperref の衝突

私は論文を書いていて、fancyhdrヘッダーに を使用しています。標準の「奇数ページに章名、偶数ページに節名」だけです。また、hyperref参考文献の長い URL を分割するために パッケージを使用する必要があります。問題は、このパッケージ (およびbreakurl) を使用すると、ヘッダー内の相互参照が疑問符として表示されることです。つまり、たとえば、名前に方程式への参照が含まれるセクション/章がある場合、その参照はヘッダーに適切に表示されません。

以下は最小限の例です。コンパイル後、例えば15ページのヘッダーを見てください。コメントアウトすると

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

ヘッダーに参照が正しく表示されます。

これを回避する理由や方法について何かアイデアはありますか?

\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}

答え1

問題はヘッダーが大文字になっていることです。大文字でなくてもhyperref次のような警告が表示されます。

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

がロードされている場合hyperref、 は\ref展開できず、その引数は参照データの取得に使用される前に大文字に変換されます。

これに対処するにはいくつかの方法があります。 1 つの方法は、とその引数を含む堅牢なマクロを使用することです\ref。 このコマンドは で使用されても展開されず\MakeUppercase、引数は大文字に変換されません。

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

\protected\defLaTeX の代わりにe-TeX を使用すると\DeclareRobustCommand、ブックマークがあるため役に立ちません。\MakeUppercase無効にすると、コマンドが再び展開可能になります。代替方法は次のとおりです\pdfstringdefDisableCommands

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

便宜上、これをマクロに組み込むことができます。例:

\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}}

の拡張性のため\headref、ラベル名では babel ショートカットはサポートされません。

リンクが必要ない場合は、\getrefnumberパッケージの をrefcount使用できます。 \getrefnumberは展開可能なので、ラベル名ではなく参照の内容が大文字に変換されます。

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

3 番目の方法は、最初から大文字のラベル名を使用することです。

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

答え2

Stephan が述べたように、ラベルをすべて大文字で記述すると、明らかに存在しない の引数が に変更されるため、問題は解決するはずです。\MakeUppercaseただし、補助マクロを使用して の大文字と小文字の変更を非表示にすることもできます。\ref{sec:thirdSection}\ref{SEC:THIRDSECTION}\MakeUppercase

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

\protect使用されるマクロにも注意が必要です。

この提案はTeX FAQのエントリから来ています大文字小文字の変換に関する奇妙な現象

答え3

ドキュメントへの変更を最小限に抑える解決策(新しいマクロや既存のラベル/参照の変更なし)は、大文字バージョンを次のように追加することです。2番参照されている項目のラベル。たとえば、問題のある参照が

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

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

別のラベルを追加すると、他の変更を加えなくてもヘッダー内で参照が機能するようになります。

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

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

これは、参照を大文字変換から保護するほどエレガントではありませんが、同じ項目に 2 つのラベルを付けることが意味をなすまれなケースとして、興味深いものです。

関連情報