Allgemeine Beschreibung des Problems

Allgemeine Beschreibung des Problems

Allgemeine Beschreibung des Problems

Ich habe einen Anhang, dessen Abschnittsnamen mit den Abschnittsnamen des Hauptteils der Dissertation identisch sein müssen. Dafür habe ich den \namerefBefehl des Pakets verwendet nameref.

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

Das funktioniert. Allerdings soll die Kopfzeile der linken Seite in der Buchklasse den Namen des ersten Abschnitts der Seite anzeigen. Bei Verwendung \namerefwird die Kopfzeile ??anstelle des Abschnittsnamens angezeigt. Warum verhält es sich so? Wie kann ich das umgehen?

Einfaches Beispiel

Erstellen Sie beispielsweise eine neue Datei main.texmit

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

Kompilieren Sie mit pdflatex main.tex. Oben auf der dritten Seite wird die Kopfzeile 0.2 ??anstelle von angezeigt 0.2 ALICE IN WONDERLAND.

Antwort1

Standardmäßig bookschreibt die Klasse alle Header groß. Die Art und Weise, wie diese Großschreibung funktioniert, bedeutet, dass beim \nameref{section:alice}Schreiben in den Header die eigentlichen Daten

\nameref{SECTION:ALICE}

Dies ist ein Verweis auf ein unbekanntes Label, das wir auch im Log des MWE sehen

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

Eine schmutzige Lösung wäre, \label{SECTION:ALICE}stattdessen tatsächlich zu verwenden.


Heutzutage kann die Verwendung von Überschriften in reinen Großbuchstaben als Geschrei aufgefasst werden, daher deaktiviere ich normalerweise einfach die automatische Großschreibung.

Normalerweise verwende ich die bookKlasse nie, sondern die memoirKlasse, die die namerefFunktion eingebaut hat, wie \titleref. Außerdem memoirist es sehr einfach, die standardmäßige Großschreibung zu deaktivieren über

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

Die memoirKlasse kann als Drop-In-Ersatz für die bookKlasse verwendet werden.

Antwort2

Sie könnenDiego Dias‘ Trick hierdas ist vom refcountPaket inspiriert.

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

Bildbeschreibung hier eingeben

Antwort3

Ihr \nameref{}, das ähnlich funktioniert wie \label{}muss außerhalb des \section{}Befehls stehen:

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

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

Wie von daleif angemerkt: Sowohl \label{}als auch \nameref{}in Großbuchstaben zu setzen funktioniert perfekt als schmutziger Workaround, ohne den Inhalt von zurückzugeben\label{}

verwandte Informationen