Descrição geral do problema

Descrição geral do problema

Descrição geral do problema

Tenho um apêndice cujos nomes das seções devem ser idênticos aos nomes das seções da parte principal da dissertação. Portanto usei o \namerefcomando do pacote nameref.

[...]
\mainmatter
\section{My section name}
\label{mySection}
[...]
\appendix
\section{\nameref{mySection}}
[...]

Isso funciona. No entanto, o cabeçalho da página esquerda na classe book deve exibir o nome da primeira seção da página. Ao usar \nameref, o cabeçalho é exibido ??em vez do nome da seção. Por que se comporta assim? Como posso contornar isso?

Exemplo simples

Por exemplo, crie um novo arquivo main.texcontendo

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

Ajuntar com pdflatex main.tex. Na parte superior da terceira página, o cabeçalho é exibido 0.2 ??em vez de 0.2 ALICE IN WONDERLAND.

Responder1

Por padrão, a bookclasse coloca todos os cabeçalhos em maiúsculas. A maneira como esse maiúsculo funciona significa que quando \nameref{section:alice}é gravado no cabeçalho, os dados reais são

\nameref{SECTION:ALICE}

que é uma referência a um rótulo desconhecido, que também vemos no log do MWE

LaTeX Warning: Reference `SECTION:ALICE' on page 3 undefined on input line 17

Uma solução suja seria realmente usar \label{SECTION:ALICE}.


Hoje em dia, usar cabeçalhos maiúsculos puros pode ser visto como um grito, então normalmente apenas desativo o uso automático de maiúsculas.

Normalmente eu nunca uso a bookclasse, em vez disso uso a memoirclasse, que tem o namerefrecurso integrado, como \titleref. Também memoiré muito fácil desativar a caixa alta padrão via

\nouppercaseheads
\pagestyle{headings} % reactivate the page style (\nou.. changes an internal macro in the headers, thus the header macros has to be applied again)

A memoirclasse pode ser usada como substituto da bookclasse.

Responder2

Você pode usarO truque de Diego Dias aquiisso é inspirado no refcountpacote.

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

insira a descrição da imagem aqui

Responder3

Seu \nameref{}, que funciona de forma semelhante \label{}tem que estar fora do \section{}comando:

\section{\nameref{section:alice}} %Header shows "??"

\section{ Alice in Wonderland} \nameref{section:alice} %works, returns label

Conforme apontado por daleif: Colocar ambos \label{}e \nameref{}em letras maiúsculas funciona perfeitamente como uma solução alternativa suja sem retornar o conteúdo de\label{}

informação relacionada