Estoy escribiendo mi tesis y utilizándola fancyhdr
para 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 hyperref
paquete 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 hyperref
recibir advertencias como
LATEX WARNING: REFERENCE `SEC:THIRDSECTION' ON PAGE 13 UNDEFINED on input line 44.
Si hyperref
está cargado, \ref
no 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 \ref
su argumento. Entonces este comando no se expande si se usa \MakeUppercase
y 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\def
en lugar de LaTeX \DeclareRobustCommand
no ayudará debido a los marcadores. Se \MakeUppercase
desactiva 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
\getrefnumber
el 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 \MakeUppercase
modifica el argumento de \ref{sec:thirdSection}
que \ref{SEC:THIRDSECTION}
obviamente no existe. Sin embargo, también puede ocultar el cambio de caso \MakeUppercase
utilizando 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 \protect
las 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.