Estou escrevendo minha tese e usando fancyhdr
os cabeçalhos. Apenas o padrão "Nome do capítulo nas páginas ímpares e nome da seção nas páginas pares". Também preciso usar o hyperref
pacote para quebrar URLs longos na minha bibliografia. O problema que tenho é que quando uso este pacote (e breakurl
), as referências cruzadas no cabeçalho aparecem como pontos de interrogação. Ou seja, se eu tiver uma seção/capítulo cujo nome inclui uma referência a uma equação, por exemplo, essa referência não aparece corretamente no cabeçalho.
Abaixo está um exemplo mínimo. Após a compilação, veja o cabeçalho na página 15, por exemplo. Se eu comentar
\usepackage[breaklinks=true]{hyperref}
\usepackage{breakurl}
o cabeçalho exibe a referência corretamente.
Alguma idéia de por que ou como contornar isso?
\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}
Responder1
O problema é o cabeçalho em maiúsculas. Mesmo sem hyperref
você receber avisos como
LATEX WARNING: REFERENCE `SEC:THIRDSECTION' ON PAGE 13 UNDEFINED on input line 44.
Se hyperref
estiver carregado, \ref
não será expansível e seu argumento será convertido para maiúsculas antes de ser usado para obter os dados de referência.
Existem várias maneiras de lidar com isso. Uma maneira é usar uma macro robusta que inclua \ref
seu argumento. Então este comando não será expandido se usado \MakeUppercase
e o argumento não for convertido para maiúsculas:
% before \tableofcontents
\DeclareRobustCommand*{\RefSecThirdSection}{\ref{sec:thirdSection}}
\begin{document}
...
\tableofcontents
...
\chapter{Some thoughts about Section~\RefSecThirdSection}
Usar e-TeX \protected\def
em vez de LaTeX \DeclareRobustCommand
não vai ajudar, por causa dos marcadores. Está \MakeUppercase
desabilitado e o comando se torna expansível novamente. Alternativa é \pdfstringdefDisableCommands
:
\protected\def\RefSecThirdSection{\ref{sec:thirdSection}}
\pdfstringdefDisableCommands{%
\def\RefSecThirdSection{\ref{sec:thirdSection}}%
}
Por conveniência, isso pode ser colocado em uma macro, por exemplo:
\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}}
Devido à capacidade de expansão de \headref
, as abreviações babel não podem ser suportadas no nome do rótulo.
Se você não quiser um link, \getrefnumber
o pacote of refcount
pode ser usado.
\getrefnumber
é expansível, portanto, o conteúdo da referência é convertido para letras maiúsculas, não o nome do rótulo.
\usepackage{refcount}
...
\refused{sec:thirdSection}
\chapter{Some thoughts about Section~\getrefnumber{sec:thirdSection}}
Uma terceira maneira é usar nomes de rótulos em letras maiúsculas:
\label{SEC:THIRDSECTION}
...
\chapter{Some thoughts about Section~\ref{SEC:THIRDSECTION}}
Responder2
Conforme mencionado por Stephan, escrever rótulos em MAIÚSCULAS deve resolver o problema, pois \MakeUppercase
modifica o argumento de \ref{sec:thirdSection}
to \ref{SEC:THIRDSECTION}
que obviamente não existe. No entanto, você também pode ocultar a alteração de maiúsculas e minúsculas \MakeUppercase
usando uma macro auxiliar:
\newcommand{\RthirdSection}{\ref{sec:thirdSection}}
\chapter{Some thoughts about Section~\protect\RthirdSection}
%...
\newcommand{\RmyEquation}{\ref{eq:myEquation}}
\section{About Equation~\protect\RmyEquation}
Observe que você também precisa \protect
das macros usadas.
Esta sugestão deriva da entrada do TeX FAQEstranhezas que mudam de caso.
Responder3
Uma solução com alterações mínimas no documento (sem novas macros ou alteração de rótulos/referências existentes) é adicionar uma versão em maiúscula comosegundoetiqueta no item que está sendo referenciado. Por exemplo, se a referência problemática for
\begin{theorem}\label{mainresult} Suppose...
\end{theorem}
\section{Proof of Theorem~\ref{mainresult}}
adicionar outro rótulo faz com que a referência funcione nos cabeçalhos sem outras alterações.
\begin{theorem}\label{mainresult}\label{MAINRESULT} Suppose...
\end{theorem}
\section{Proof of Theorem~\ref{mainresult}}
Embora isso não seja tão elegante quanto proteger a referência da conversão em maiúsculas, é de algum interesse, pois é um caso raro em que faz sentido colocar dois rótulos no mesmo item.