将标题中的节名称更改为子节名称

将标题中的节名称更改为子节名称

我想在book类中插入一个标题,例如:

  • 奇数页仅显示左侧页眉上的书名:
  • 偶数页在右侧标题上显示章节名称或子章节(如果存在)

梅威瑟:

\documentclass[12pt]{book}
\usepackage[utf8]{inputenc}
\usepackage{fancyhdr}
\usepackage{hyperref}
\usepackage{lipsum}

\fancyhf{}
\fancyhead[LO]{Book title}\fancyfoot[CO]{\thepage}
\fancyhead[RE]{\nouppercase{\rightmark}}\fancyfoot[CE]{\thepage} %this should be defined in some other way
\pagestyle{fancy}

\author{Author}
\title{Test book}

\begin{document}
\maketitle
\tableofcontents

\chapter[Test chapter]{Test chapter}
\section{First section}
\lipsum[4-11]

\markedsection{Short section title}{Long section title}

\lipsum[1-6]
\end{document}

但是,即使页面不显示部分名称,它们也会显示已经“初始化”的子部分名称。我如何定义一个命令,将部分名称更改为标题的子部分名称?

答案1

对于该类book,没有真正的\subsectionmark命令——它使用\let\subsectionmark\@gobble来自的语句latex.ltx

\@startsection在所有用 定义并且最后使用 的节级命令中\@sect,都有一个调用\csname #1mark\endcsname{#7},如果 ,它将设置标记#1mark,即,如果\subsectionmark确实有用地定义,但它被用作\@gobble,即,丢弃 的参数book.cls

因此,一个可能的解决方案是定义,我使用了样式内\subsectionmark的定义并对其进行了稍加修改。\sectionmark\ps@headingsbook.cls

由于所有\....mark命令都使用\markboth设置内部变量,最后一次调用\markboth将设置真实的\@leftmark\@rightmark设置,因此页面上标记的最后一次调用是赢家!

\documentclass[12pt]{book}
\usepackage[utf8]{inputenc}
\usepackage{fancyhdr}
\usepackage[headheight=15pt]{geometry}
\usepackage{lipsum}
\usepackage{hyperref}

\makeatletter
\def\subsectionmark#1{%
  \markright {\MakeUppercase{%
      \ifnum \c@secnumdepth >\z@
      \thesubsection. \ %
      \fi
      #1}}}
\makeatother

\fancyhf{}
\fancyhead[LO]{Book title}\fancyfoot[CO]{\thepage}
\fancyhead[RE]{\nouppercase{\rightmark}}\fancyfoot[CE]{\thepage} %this should be defined in some other way
\pagestyle{plain}

\author{Author}
\title{Test book}

\begin{document}
\maketitle
\tableofcontents
\clearpage
\pagestyle{fancy}

\chapter[Test chapter]{Test chapter}
\section{First section}
\lipsum[4-11]

\subsection{Foo subsection}
%\markedsection{Short section title}{Long section title}

\lipsum[1-6]
\end{document}

在此处输入图片描述

在此处输入图片描述

相关内容