我正在寫論文並用於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 簡寫。
如果您不需要鏈接,則可以使用
\getrefnumber
of 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}}
雖然這不像保護引用不被大寫轉換那麼優雅,但它還是很有趣的,因為在同一個項目上放置兩個標籤是有意義的罕見情況。