標題中的交叉引用,fancyhdr 和 hyperref 之間的衝突

標題中的交叉引用,fancyhdr 和 hyperref 之間的衝突

我正在寫論文並用於fancyhdr標題。只是標準的「奇數頁上的章節名稱和偶數頁上的章節名稱」。我還需要使用該hyperref套件來分解參考書目中的長網址。我遇到的問題是,當我使用此套件(和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不可擴展,且其參數在用於獲取參考資料之前會轉換為大寫。

有幾種方法可以解決這個問題。一種方法是使用包含\ref及其參數的強大巨集。那麼如果使用此命令,則不會擴展\MakeUppercase,且參數不會轉換為大寫:

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

由於書籤的原因,使用 e-TeX\protected\def代替 LaTeX\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 簡寫。

如果您不需要鏈接,則可以使用 \getrefnumberof package 。是可擴展的,因此引用的內容會轉換為大寫,而不是標籤名稱。refcount\getrefnumber

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

第三種方法是先使用大寫標籤名稱:

\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

對文件進行最小更改(沒有新巨集或更改現有標籤/引用)的解決方案是添加大寫版本作為第二所引用項目上的標籤。例如,如果有問題的參考是

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

雖然這不像保護引用不被大寫轉換那麼優雅,但它還是很有趣的,因為在同一個項目上放置兩個標籤是有意義的罕見情況。

相關內容