Referencias cruzadas en encabezados, choque entre fancyhdr e hyperref

Referencias cruzadas en encabezados, choque entre fancyhdr e hyperref

Estoy escribiendo mi tesis y utilizándola fancyhdrpara los encabezados. Sólo el estándar "Nombre del capítulo en páginas impares y nombre de sección en páginas pares". También necesito usar el hyperrefpaquete para dividir las URL largas en mi bibliografía. El problema que tengo es que cuando uso este paquete (y breakurl), las referencias cruzadas en el encabezado aparecen como signos de interrogación. Es decir, si tengo una sección/capítulo cuyo nombre incluye una referencia a una ecuación, por ejemplo, esa referencia no se muestra correctamente en el encabezado.

A continuación se muestra un ejemplo mínimo. Después de compilar, vea el encabezado en la página 15, por ejemplo. si comento

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

el encabezado muestra la referencia correctamente.

¿Alguna idea de por qué o cómo solucionar esto?

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

Respuesta1

El problema es el encabezado en mayúsculas. Incluso sin hyperrefrecibir advertencias como

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

Si hyperrefestá cargado, \refno se puede expandir y su argumento se convierte a mayúsculas antes de usarse para obtener los datos de referencia.

Hay varias maneras de lidiar con esto. Una forma es utilizar una macro robusta que incluya \refsu argumento. Entonces este comando no se expande si se usa \MakeUppercasey el argumento no se convierte a mayúsculas:

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

Usar e-TeX \protected\defen lugar de LaTeX \DeclareRobustCommandno ayudará debido a los marcadores. Se \MakeUppercasedesactiva y el comando se vuelve expandible nuevamente. La alternativa es \pdfstringdefDisableCommands:

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

Por conveniencia, esto se puede poner en una macro, por ejemplo:

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

Debido a la capacidad de expansión de \headref, las taquigrafías de Babel no se pueden admitir en el nombre de la etiqueta.

Si no desea un enlace, puede utilizar \getrefnumberel paquete . es expandible, por lo que el contenido de la referencia se convierte a mayúsculas, no el nombre de la etiqueta.refcount\getrefnumber

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

Una tercera forma es utilizar nombres de etiquetas en mayúsculas en primer lugar:

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

Respuesta2

Como mencionó Stephan, escribir etiquetas TODAS EN MAYÚSCULAS debería solucionar el problema, ya que \MakeUppercasemodifica el argumento de \ref{sec:thirdSection}que \ref{SEC:THIRDSECTION}obviamente no existe. Sin embargo, también puede ocultar el cambio de caso \MakeUppercaseutilizando una macro auxiliar:

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

Tenga en cuenta que también debe conocer \protectlas macros utilizadas.

Esta sugerencia surge de la entrada de preguntas frecuentes de TeX.Rarezas que cambian de caso.

Respuesta3

Una solución con cambios mínimos en el documento (sin nuevas macros ni cambios de etiquetas/referencias existentes) es agregar una versión en mayúsculas comosegundoetiqueta en el artículo al que se hace referencia. Por ejemplo, si la referencia problemática es

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

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

agregar otra etiqueta hace que la referencia funcione en los encabezados sin otros cambios.

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

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

Si bien esto no es tan elegante como proteger la referencia de la conversión a mayúsculas, es de cierto interés ya que es un caso raro en el que tiene sentido poner dos etiquetas en el mismo elemento.

información relacionada