能够手动定义书的每个部分/章节的标题

能够手动定义书的每个部分/章节的标题

考虑以下代码,灵感来自egreg 的回答这个话题

\documentclass[11pt,a4paper]{book}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[french]{babel}
\usepackage[top=1in, bottom=1in, left=1in, right=1in, headheight=13.6pt]{geometry}
\usepackage{fancyhdr}
\usepackage{etoolbox}
\usepackage{hyperref}
\usepackage{lipsum}

\pagestyle{fancy}
\fancyhf{}
\renewcommand{\headrulewidth}{1pt}
\renewcommand{\footrulewidth}{0pt}
\fancyhead[LE]{\leftmark}
\fancyhead[RO]{\rightmark}

\begingroup\lccode`~=`:
\lowercase{\endgroup
  \newcommand{\partmark}[1]{%
    \markboth{\MakeUppercase{\partname\space\thepart~ #1}}{}%
  }
  \renewcommand{\chaptermark}[1]{%
    \markright{\MakeUppercase{\chaptername\space\thechapter~ #1}}%
  }
}% end of \lowercase
\makeatletter
\patchcmd{\H@old@part}% would be \@part without hyperref
  {\markboth{}{}}
  {\partmark{#1}}
  {}{}
\makeatother

\begin{document}
\frontmatter
\part*{Préambule}
\tableofcontents
\chapter{Introduction}
\lipsum
\section{Première section}
\lipsum
\lipsum
\lipsum
\section{Deuxième section}
\lipsum
\lipsum
\lipsum

\mainmatter
\part{Premiere partie}
\chapter{Premier chapitre}
\lipsum
\section{Première section}
\lipsum
\lipsum
\lipsum
\section{Deuxième section}
\lipsum
\lipsum
\lipsum
\chapter{Second chapitre}
\lipsum
\section{Première section}
\lipsum
\lipsum
\lipsum
\section{Deuxième section}
\lipsum
\lipsum
\lipsum

\part{Deuxieme partie}
\chapter{Troisieme chapitre}
\lipsum
\section{Première section}
\lipsum
\lipsum
\lipsum
\section{Deuxième section}
\lipsum
\lipsum
\lipsum
\chapter{Quatrieme chapitre}
\lipsum
\section{Première section}
\lipsum
\lipsum
\lipsum
\section{Deuxième section}
\lipsum
\lipsum
\lipsum

\appendix
\part*{Annexes}
\chapter{Premère annexe}
\lipsum
\section{Première section}
\lipsum
\lipsum
\lipsum
\section{Deuxième section}
\lipsum
\lipsum
\lipsum
\chapter{Seconde annexe}
\lipsum
\section{Première section}
\lipsum
\lipsum
\lipsum
\section{Deuxième section}
\lipsum
\lipsum
\lipsum

\end{document}

首先,对于该问题的主题标题来说,这不能正常工作:

  • 在前言中,标题中的章节标题(应为序言)是错误的。
  • 章节标题的格式很奇怪(例如:“Première PARTIE I: PREMIERE PARTIE”)
  • 在章节中,标题基于节而不是章

实际上,我希望能够在书中使用命令“手动”定义自己的标题(示例未显示这一点,但我的书的结构很复杂)。例如,通过在每个部分/章节上重新定义命令:

\renewcommand{\currentpartheader}{Blablabla}
\renewcommand{\currentchapterheader}{BLABLABLA}

知道我想要\currentpartheader显示在偶数页上并\currentchapterheader显示在奇数页上。

怎么做?

fancyhdr注意:如果其他包可以完成这项工作,我就不需要使用它。

答案1

\part*{}不会改变标题。如果您想要更改它们,您可以\markboth{}{}手动发出一个包含所需内容的 。为了避免标题中出现部分,您可以重新定义\sectionmark\relax。最后,使用 egreg 的前缀,标题中没有任何奇怪的大小写混合。

\documentclass[11pt,a4paper]{book}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[french]{babel}
\usepackage[top=1in, bottom=1in, left=1in, right=1in, headheight=13.6pt]{geometry}
\usepackage{fancyhdr}
\usepackage{etoolbox}
\usepackage{hyperref}
\usepackage{lipsum}

%Note: this is a very preliminary attempt...,
%Fancier solutions are welcome
%The page numbering does not work correctly
\pagestyle{fancy}
\fancyhf{}
\renewcommand{\headrulewidth}{1pt}
\renewcommand{\footrulewidth}{0pt}
\fancyhead[LE]{\leftmark}
\fancyhead[RO]{\rightmark}

\begingroup\lccode`~=`:
\lowercase{\endgroup
  \newcommand{\partmark}[1]{%
    \markboth{\MakeUppercase{\partname\space\thepart~ #1}}{}%
  }
  \renewcommand{\chaptermark}[1]{%
    \markright{\MakeUppercase{\chaptername\space\thechapter~ #1}}%
  }
}% end of \lowercase
\makeatletter
\patchcmd{\H@old@part}% would be \@part without hyperref
{\markboth{}{}}
{\partmark{#1}}
{}{}
\makeatother
\def\sectionmark#1{\relax}

\begin{document}

  \frontmatter
  \part*{Préambule}
  \tableofcontents
  \markboth{\MakeUppercase{Préambule}}{}
  \chapter{Introduction}
  \lipsum
  \section{Première section}
  \lipsum
  \lipsum
  \lipsum
  \section{Deuxième section}
  \lipsum
  \lipsum
  \lipsum

  \mainmatter
  \part{Premiere partie}
  \chapter{Premier chapitre}
  \lipsum
  \section{Première section}
  \lipsum
  \lipsum
  \lipsum
  \section{Deuxième section}
  \lipsum
  \lipsum
  \lipsum
  \chapter{Second chapitre}
  \lipsum
  \section{Première section}
  \lipsum
  \lipsum
  \lipsum
  \section{Deuxième section}
  \lipsum
  \lipsum
  \lipsum

  \part{Deuxieme partie}
  \chapter{Troisieme chapitre}
  \lipsum
  \section{Première section}
  \lipsum
  \lipsum
  \lipsum
  \section{Deuxième section}
  \lipsum
  \lipsum
  \lipsum
  \chapter{Quatrieme chapitre}
  \lipsum
  \section{Première section}
  \lipsum
  \lipsum
  \lipsum
  \section{Deuxième section}
  \lipsum
  \lipsum
  \lipsum

  \appendix
  \part*{Annexes}
  \chapter{Premère annexe}
  \lipsum
  \section{Première section}
  \lipsum
  \lipsum
  \lipsum
  \section{Deuxième section}
  \lipsum
  \lipsum
  \lipsum
  \chapter{Seconde annexe}
  \lipsum
  \section{Première section}
  \lipsum
  \lipsum
  \lipsum
  \section{Deuxième section}
  \lipsum
  \lipsum
  \lipsum

\end{document}

如果你想手动设置标题,为什么不直接说

\fancyhf[LE]{whatever}
\fancyhf[RO]{whatever else}

摆弄标记的唯一原因是为了让事情自动化。如果你不自动化,你就不需要那么复杂。

答案2

书籍类的默认标题如下

\def\@evenhead{\thepage\hfil\slshape\leftmark}%
\def\@oddhead{{\slshape\rightmark}\hfil\thepage}%

尽管默认情况下标题下不包含一行。这些使您可以完全控制标题内容,但对于您的目的,只需更改 \leftmark 和/或 \rightmark 即可。

只要关闭默认页眉,就可以使用 everypage 包创建更奇特的页眉或页脚。下图在页眉下方画了一条线。

\documentclass{book}
\usepackage{everypage}
\usepackage{lipsum}

\newif\ifspecialpage

\let\oldpagestyle=\thispagestyle
\renewcommand\thispagestyle[1]{\specialpagetrue\oldpagestyle{#1}}

\makeatletter
\AddEverypageHook{% draw line in \headsep
  \ifspecialpage\global\specialpagefalse\else
  \raisebox{\dimexpr -\topmargin-\headheight-0.5\headsep-.2pt}[0pt][0pt]%
  {\rlap{\ifodd\c@page\relax\hspace{\oddsidemargin}\else\hspace{\evensidemargin}\fi
  \rule{\textwidth}{.4pt}}}\fi}
\makeatother

\begin{document}

\chapter{Chapter One}
\lipsum[1-12]

\end{document}

相关内容