nameref 在引用章节时更改标题*

nameref 在引用章节时更改标题*

book我正在编写一个以作为文档类的LaTeX 文档并用 进行编译pdflatex。TexLive 版本是最新的 2012。

对于介绍(和结论)章节,我使用:

\chapter*{Introduction \markboth{INTRODUCTION}{}}
\label{intro}
\addcontentsline{toc}{chapter}{\hspace{12pt} Introduction}
  • chapter*因为我希望它是非编号的
  • \markboth因为否则标题就不是“INTRODUCTION”而是“CONTENTS”(参见页眉和章节*例如)
  • \addcontentsline使其出现在目录中

\nameref{intro}但是如果我在另一章中引用它( \chapter{my chapter}),那么该章的标题将变为“简介”而不是“第 1 章 - 我的章节”。

请注意,如果我不使用\markboth简介,则第 1 章的标题是正确的,但简介的标题不正确(它变成了“内容”)。

当然,如果就\nameref{}在第 1 章之后,我调用\markboth{CHAPTER 1 - MY CHAPTER}{}第 1 章的标题又是正确的,但这显然不切实际。

下面是显示该问题的最小代码:

\documentclass[a4paper,twoside]{book}

%\usepackage[english]{babel}
% nameref is buggy, when used, header names for chapter in which it is used are wrong
% if previous chapter is a chapter
% even version from 2012/07/31 is buggy ...
\usepackage{nameref}[2012/07/31]

\title{test}
\author{alex}

\begin{document}
\frontmatter
\maketitle
blabla
\tableofcontents

\mainmatter
%\markboth is needed otherwise header is "CONTENTS" instead of "INTRODUCTION" because this is a chapter*{}, not a chapter{}
\chapter*{Introduction \markboth{INTRODUCTION}{}}
\label{intro}
\addcontentsline{toc}{chapter}{\hspace{12pt} Introduction}
blabla.
\newpage
blabla.
\chapter{On the use of Foo in Bar}
\label{chap1}
blabla.
\newpage
And here if I namereference the \nameref{intro} it will break the nice header.
%And here if I namereference the \nameref{intro} with a \markboth{CHAPTER 1 - On the use of Foo in Bar}{} it will do what I need but it is *not* practical at all.

\chapter{On the use of Bar in Foo}
\label{chap2}
blabla.
\chapter*{Conclusions \markboth{CONCLUSIONS}{}}
\label{conclusions}
\addcontentsline{toc}{chapter}{\hspace{12pt} Conclusions}
blabla.
\newpage
blabla
\chapter{And here too}
\label{chap3}
blabla.
\newpage
blabla with a nameref. to the \nameref{chap1}. cause the same problem, header that should read "CHAPTER 3 - AND HERE TOO" is replaced by "INTRODUCTION".

\backmatter
blabla
\end{document}

答案1

\chapter*{简介 \markboth{INTRODUCTION}{}}

标题是什么?整个论点是:

Introduction \markboth{INTRODUCTION}{}

如果使用 \nameref 会发生什么情况?包括 \markboth 在内的整个标题都会被调用,并且执行会\markboth更改您的标题。

解决方案:

  • \markboth \chapter*

    \chapter*{Introduction}
    \markboth{INTRODUCTION}{}
    
  • 自 2009/12/08 版本起,v2.34 软件包nameref使用软件包gettitlestring。此软件包知道一个使用标题提取方法expansion,允许过滤掉内容,请参阅 的软件包文档gettitlestring

    \GetTitleStringSetup{expand}
    \GetTitleStringDisableCommands{%
      \def\markboth#1#2{\unskip}%
    }
    

在标题字符串提取期间,宏\markboth会删除其参数并调用 unskip以摆脱先前的空格。

相关内容