Referências cruzadas em cabeçalhos, conflito entre fantasihdr e hyperref

Referências cruzadas em cabeçalhos, conflito entre fantasihdr e hyperref

Estou escrevendo minha tese e usando fancyhdros 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 hyperrefpacote 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 hyperrefvocê receber avisos como

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

Se hyperrefestiver carregado, \refnã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 \refseu argumento. Então este comando não será expandido se usado \MakeUppercasee 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\defem vez de LaTeX \DeclareRobustCommandnão vai ajudar, por causa dos marcadores. Está \MakeUppercasedesabilitado 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, \getrefnumbero pacote of refcountpode 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 \MakeUppercasemodifica 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 \MakeUppercaseusando 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 \protectdas 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.

informação relacionada