问题的一般描述
我有一个附录,其章节名称必须与论文主体部分章节名称相同。因此我使用了\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{}