如何在 Book 类中使用 fanchyhdr 删除 Chapter 名称

如何在 Book 类中使用 fanchyhdr 删除 Chapter 名称

这个问题类似于如何在报告类中删除带有 fanchyhdr 的章节名称。然而,在书籍类中情况就完全不同了。

我花了三天时间搜索了这个网站的各个角落,却没有找到一个可行的例子。对于初学者来说,这真是太令人沮丧了。我真的想完成我的报告。

挑战在于:

  • 甚至为章节第一页设置页眉。book类定义章节第一页要使用的plain样式。
  • 因此,我们可以通过以下方式覆盖普通样式:\fancypagestyle{plain}
  • 所在章节\frontmatter不应显示章节编号,因为它们为 0。
  • 书是一面。每一章都由 输出\clearpage

    \documentclass[a4paper,oneside,12pt]{book}
    \usepackage{fancyhdr}
    
    \makeatletter
    \renewcommand{\chaptermark}[1]{\markboth{\textit{Chapter \thechapter}\ #1}{}} % no effort command
    
    \fancypagestyle{plain}{%
        \fancyhf{}%
        % No effort comment from wikibooks: Note the ## here. It's required because \fancypagestyle is making a macro (\ps@fancybook).
        % If I just wrote #1, TeX would think that it's the argument to \ps@fancybook, but
        % \ps@fancybook doesn't take any arguments, so TeX would complain with an error message.
        % You are not expected to understand this.
        % \renewcommand*{\chaptermark}[1]{ \markboth{\thechapter\ \chaptername: ##1}{} }
    
        \fancyhead[R]{\textbf{\leftmark}}
        \fancyfoot[C]{\thepage}
    
        \renewcommand{\plainheadrulewidth}{0.4pt}
    }
    
    \pagestyle{plain}
    \begin{document}
    \frontmatter
    \chapter{Abstract}
    abstract
    \clearpage
    
    \mainmatter
    
    \chapter{Main}
    Show `1 Main` in the header.
    \clearpage
    \end{document}
    

答案1

使用book而不是完全没有区别report。(尝试切换到report进行测试。)

\renewcommand{\chaptermark}[1]{\markboth{\normalfont\thechapter.\space#1}{}}

但你需要告诉fancyhdr使用花哨的标题

\pagestyle{fancy}

真正造成差异的是 等的使用\frontmatter\mainmatter这确实是 所特有的book。更具体地说,这里重要的是您希望标题中的章节不编号,而 LaTeX 在标准样式中默认不这样做。您也会看到未编号章节的相同复杂性report

有几种方法可以实现您想要的功能。以下方法可能不是您的最佳选择,具体取决于您希望进行的其他更改。但是,对于 MWE 来说,至少它很简单。

LaTeX 的标准类支持未编号节的星号形式的节命令。这是您在 之前应该使用的\mainmatter。但它们的配置不同,默认情况下不会为标题创建“标记”。要更改此设置,我们可以从 重新定义命令book.cls

首先,我们创建一个特殊的命令来为带星号的章节做“标记”:

\newcommand{\schaptermark}[1]{\markboth{\normalfont #1}{}}

然后我们将其添加到定义中book。这\makeatletter... \makeatother是必需的,因为代码包含@通常不允许在文档中的命令名称中使用的符号。

\makeatletter
% modified from book.cls - don't use \def unless you **know** it is safe!
\def\@schapter#1{\if@twocolumn
  \@topnewpage[\@makeschapterhead{#1}]%
  \else
  \@makeschapterhead{#1}%
  \schaptermark{#1}% <= our addition here
  \@afterheading
  \fi}
\makeatother

然后我们设置页面样式:

\fancypagestyle{plain}{%
  \fancyhf{}%
  \fancyhead[R]{\textbf{\leftmark}}%
  \fancyfoot[C]{\thepage}%
  \renewcommand{\plainheadrulewidth}{0.4pt}%
}

假设您想要对非首页使用相同的配置:

\fancyhf{}
\fancyhead[R]{\textbf{\leftmark}}
\fancyfoot[C]{\thepage}
\renewcommand{\headrulewidth}{0.4pt}

然后我们可以写

\frontmatter
\chapter*{Abstract}% a * stops the numbering
abstract

我们不需要说\clearpage。这是自动处理的。

\mainmatter

\chapter{Main}% no * so it is numbered
Show `1 Main` in the header.

生产

带星号和不带星号的章节标题,打造精美的第一页

完整代码:

\documentclass[a4paper,oneside,12pt]{book}
\usepackage{fancyhdr}
\pagestyle{fancy}
\renewcommand{\chaptermark}[1]{\markboth{\normalfont\thechapter.\space#1}{}}
\newcommand{\schaptermark}[1]{\markboth{\normalfont #1}{}}
\makeatletter
% modified from book.cls - don't use \def unless you **know** it is safe!
\def\@schapter#1{\if@twocolumn
  \@topnewpage[\@makeschapterhead{#1}]%
  \else
  \@makeschapterhead{#1}%
  \schaptermark{#1}%
  \@afterheading
  \fi}
\makeatother
\fancypagestyle{plain}{%
  \fancyhf{}%
  \fancyhead[R]{\textbf{\leftmark}}%
  \fancyfoot[C]{\thepage}%
  \renewcommand{\plainheadrulewidth}{0.4pt}%
}
\fancyhf{}
\fancyhead[R]{\textbf{\leftmark}}
\fancyfoot[C]{\thepage}
\renewcommand{\headrulewidth}{0.4pt}
\begin{document}
\frontmatter
\chapter*{Abstract}% a * stops the numbering
abstract
% \clearpage is automatic
\mainmatter

\chapter{Main}% no * so it is numbered
Show `1 Main` in the header.
% \clearpage is automatic
\end{document}

相关内容