Общее описание проблемы
У меня есть приложение, названия разделов которого должны быть идентичны названиям разделов основной части диссертации. Поэтому я воспользовался командой \nameref
пакета nameref
.
[...]
\mainmatter
\section{My section name}
\label{mySection}
[...]
\appendix
\section{\nameref{mySection}}
[...]
Это работает. Однако заголовок левой страницы в классе книги должен отображать название первого раздела страницы. При использовании \nameref
заголовок отображается ??
вместо названия раздела. Почему он так себя ведет? Как это обойти?
Простой пример
В качестве примера создайте новый файл, main.tex
содержащий
\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}
Компилировать с помощью pdflatex main.tex
. В верхней части третьей страницы заголовок отображается 0.2 ??
вместо 0.2 ALICE IN WONDERLAND
.
решение1
По умолчанию book
класс заглавными буквами всех заголовков. То, как работает этот заглавный регистр, означает, что когда \nameref{section:alice}
записывается в заголовок, фактические данные
\nameref{SECTION:ALICE}
что является ссылкой на неизвестную метку, которую мы также видим в журнале MWE
LaTeX Warning: Reference `SECTION:ALICE' on page 3 undefined on input line 17
Более грязным решением было бы использовать \label{SECTION:ALICE}
вместо этого .
В настоящее время использование заголовков, состоящих исключительно из заглавных букв, может быть расценено как крик, поэтому я обычно просто отключаю автоматическое использование заглавных букв.
Обычно я никогда не использую book
класс, вместо этого я использую memoir
класс, в котором nameref
встроена функция, как \titleref
. Также в memoir
нем очень легко отключить верхний регистр по умолчанию через
\nouppercaseheads
\pagestyle{headings} % reactivate the page style (\nou.. changes an internal macro in the headers, thus the header macros has to be applied again)
Класс memoir
может быть использован в качестве замены классу book
.
решение2
Вы можете использоватьТрюк Диего Диаса здесьвдохновленное упаковкой refcount
.
\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}
решение3
Ваш \nameref{}
, который работает аналогично , \label{}
должен находиться за пределами \section{}
команды:
\section{\nameref{section:alice}} %Header shows "??"
\section{ Alice in Wonderland} \nameref{section:alice} %works, returns label
Как отметил daleif: размещение и \label{}
и \nameref{}
в верхнем регистре отлично работает как грязный обходной путь без возврата содержимого\label{}