我想在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@headings
book.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}