Descripción general del problema.
Tengo un apéndice cuyos nombres de secciones deben ser idénticos a los nombres de las secciones de la parte principal de la disertación. Por lo tanto utilicé el \nameref
comando del paquete nameref
.
[...]
\mainmatter
\section{My section name}
\label{mySection}
[...]
\appendix
\section{\nameref{mySection}}
[...]
Esto funciona. Sin embargo, se supone que el encabezado de la página izquierda en la clase de libro muestra el nombre de la primera sección de la página. Al usar \nameref
, se muestra el encabezado ??
en lugar del nombre de la sección. ¿Por qué se comporta así? ¿Cómo puedo solucionar eso?
Ejemplo sencillo
Como ejemplo, cree un nuevo archivo main.tex
que contenga
\documentclass[10pt,a4paper]{book}
\usepackage{nameref}
\begin{document}
\section{Alice in wonderland}
\label{section:alice}
\pagebreak
a %Dummy text otherwise calling \pagebreak twice only skips one page
\pagebreak %Need to skip two pages, not just one because only the header of the left page of the book class displays the section name, not the one of the right page
%\section{Alice in wonderland} %Writes the header correctly
\section{\nameref{section:alice}} %Header shows "??"
\end{document}
Compilar con pdflatex main.tex
. En la parte superior de la tercera página, se muestra el encabezado 0.2 ??
en lugar de 0.2 ALICE IN WONDERLAND
.
Respuesta1
De forma predeterminada, la book
clase escribe en mayúsculas todos los encabezados. La forma en que funcionan estas mayúsculas significa que cuando \nameref{section:alice}
se escribe en el encabezado, los datos reales se
\nameref{SECTION:ALICE}
que es una referencia a una etiqueta desconocida, que también vemos en el log del MWE
LaTeX Warning: Reference `SECTION:ALICE' on page 3 undefined on input line 17
Una solución sucia sería usarla en \label{SECTION:ALICE}
su lugar.
Hoy en día, usar encabezados exclusivamente en mayúsculas puede verse como un grito, por lo que normalmente desactivo las mayúsculas automáticas.
Normalmente nunca uso la book
clase, sino que uso la memoir
clase, que tiene la nameref
característica incorporada, como \titleref
. También memoir
es muy fácil desactivar las mayúsculas predeterminadas a través de
\nouppercaseheads
\pagestyle{headings} % reactivate the page style (\nou.. changes an internal macro in the headers, thus the header macros has to be applied again)
La memoir
clase se puede utilizar como reemplazo directo de la book
clase.
Respuesta2
Puedes usarEl truco de Diego Dias aquíeso está inspirado en el refcount
paquete.
\documentclass[10pt,a4paper]{book}
\usepackage{nameref}
\makeatletter
\newcommand{\getnamereftext}[1]{%
\@ifundefined{r@#1}{}{%
\unexpanded\expandafter\expandafter\expandafter{%
\expandafter\expandafter\expandafter\@thirdoffive\csname r@#1\endcsname
}%
}%
}
\makeatother
\begin{document}
\section{Alice in wonderland}
\label{section:alice}
\clearpage
a %Dummy text otherwise calling \pagebreak twice only skips one page
\clearpage %Need to skip two pages
\section{\getnamereftext{section:alice}}
\end{document}
Respuesta3
Tu \nameref{}
, que funciona de manera similar, \label{}
tiene que estar fuera del \section{}
comando:
\section{\nameref{section:alice}} %Header shows "??"
\section{ Alice in Wonderland} \nameref{section:alice} %works, returns label
Como señaló daleif: poner ambos \label{}
y \nameref{}
en mayúsculas funciona perfectamente como una solución sucia sin devolver el contenido de\label{}