Fancyhdr 没有应用正确的样式

Fancyhdr 没有应用正确的样式

这是我第一次使用 Latex,用来写论文。

我将我的工作组织为一个主文件,并使用 调用其他几个文件subfiles,因为我喜欢在编写单个章节时对其进行编译。但是,以这种方式生成的章节与主文件的布局不同(这只是最终版本的问题,我必须将其发送给我的主管)。我解决了这个问题,编译了主文件,其中包含所有注释代码,但编写我感兴趣的章节所需的代码,并进行了更改\setcounter{chapter}{}以获得正确的编号。

它工作正常,但我发现如果我\pagestyle{plain}在下面的代码中注释,包fancyhdr不会应用我定义的页面样式。有人能解释一下为什么吗?我预计,自从我输入\pagestyle{MyStyle}后,这个命令后面的页面样式应该是MyStyle

\documentclass[12pt,twoside,openright]{report}

\usepackage[english]{babel}

% Page layout
\usepackage[a4paper,
            inner=41mm,
            outer=32mm,
            top=43mm,
            bottom=44mm,
            headheight=20pt,
            headsep=\baselineskip,
            bindingoffset=0mm]{geometry}

\usepackage{emptypage}

\usepackage[T1]{fontenc}
\usepackage{mathptmx}

\usepackage{lipsum}

\usepackage{subfiles}

% Page style
\usepackage{fancyhdr}
% Defining MyStyle
\fancypagestyle{MyStyle}{%
    \fancyhead{}
    \fancyhead[RO]{\rightmark \ \ {\vrule height 13pt width 1pt} \ \textbf{\thepage}}
    \fancyhead[LE]{\textbf{\thepage} \ {\vrule height 13pt width 1pt} \ \leftmark}
    \fancyfoot{}
    \fancyfoot[RO,LE]{}
    \renewcommand{\headrulewidth}{0pt}
    \renewcommand{\chaptermark}[1]{\markboth{\thechapter. \ \textsc{##1}}{}}
    \renewcommand{\sectionmark}[1]{\markright{\thesection\ {##1}}}
}
% Redefining the PLAIN style
\fancypagestyle{plain}{%
    \fancyhead{}
    \fancyhead[RO]{{\vrule height 13pt width 1pt} \ \textbf{\thepage}}
    \fancyhead[LE]{\textbf{\thepage} \ {\vrule height 13pt width 1pt}}
    \fancyfoot{}
    \fancyfoot[RO,LE]{}
    \renewcommand{\headrulewidth}{0pt}
}

\begin{document}

\pagenumbering{Roman}
\pagestyle{plain}

%Abstract

%Table of Contents

%Lists of Figures

%Lists of Tables

\clearpage

\pagenumbering{arabic}
\pagestyle{MyStyle}

% Previous chapters...

\setcounter{chapter}{3}
\chapter{Chapter Title}
\section{First section title}
\lipsum
\section{Second section title}
\lipsum

% Following chapters...

\end{document}

答案1

摘自包装手册第 9 节“有关 LATEX 标记的独家新闻”(第 9 页):

您可以通过重新定义 \chaptermark、\sectionmark 和 \subsectionmark 命令来影响章节、章节和小节信息(仅其中两个!)的显示方式。您必须将重新定义放在第一次调用 \pagestyle{fancy} 之后,因为这会设置默认值。

更具体地说,第一次调用 \ps@fancy 会设置默认值。

的定义\fancypagestyle(来自fancyhdr.sty):

\newcommand{\fancypagestyle}[2]{%
  \@namedef{ps@#1}{\let\fancy@gbl\relax#2\relax\ps@fancy}}

请注意,\fancypagestyle{MyStyle}直到第一次调用\pagestyle{MyStyle}完成才会执行。因此,如果\pagestyle{MyStyle}是 fancyhdr pagestyle 的第一次调用,那么它也是 的第一次调用。因此,第二个参数中的和的\ps@fancy重新定义将被默认值覆盖。但是,如果您之前调用过其他 fancyhdr pagestyle或再次使用,它就可以正常工作。\chaptermark\sectionmark\fancypagestyleMyStyle\pagestyle{MyStyle}

\documentclass[12pt,twoside,openright]{report}
\usepackage{emptypage}
\usepackage[T1]{fontenc}
\usepackage{lipsum}

% Page style
\usepackage{fancyhdr}
\pagestyle{fancy}% <- !
% Defining MyStyle
\fancypagestyle{MyStyle}{%
    \fancyhead{}
    \fancyhead[RO]{\rightmark \ \ {\vrule height 13pt width 1pt} \ \textbf{\thepage}}
    \fancyhead[LE]{\textbf{\thepage} \ {\vrule height 13pt width 1pt} \ \leftmark}
    \fancyfoot{}
    \fancyfoot[RO,LE]{}
    \renewcommand{\headrulewidth}{0pt}
    \renewcommand{\chaptermark}[1]{\markboth{\thechapter. \ \textsc{##1}}{}}
    \renewcommand{\sectionmark}[1]{\markright{\thesection\ {##1}}}
}
% Redefining the PLAIN style
\fancypagestyle{plain}{%
    \fancyhead{}
    \fancyhead[RO]{{\vrule height 13pt width 1pt} \ \textbf{\thepage}}
    \fancyhead[LE]{\textbf{\thepage} \ {\vrule height 13pt width 1pt}}
    \fancyfoot{}
    \fancyfoot[RO,LE]{}
    \renewcommand{\headrulewidth}{0pt}
}

\begin{document}
\pagestyle{MyStyle}
% Previous chapters...
\setcounter{chapter}{3}
\chapter{Chapter Title}
\section{First section title}
\lipsum
\section{Second section title}
\lipsum
% Following chapters...
\end{document}

也可以使用

\documentclass[12pt,twoside,openright]{report}
\usepackage{emptypage}
\usepackage[T1]{fontenc}
\usepackage{lipsum}

% Page style
\usepackage{fancyhdr}

% Defining MyStyle
\fancypagestyle{MyStyle}{%
    \fancyhead{}
    \fancyhead[RO]{\rightmark \ \ {\vrule height 13pt width 1pt} \ \textbf{\thepage}}
    \fancyhead[LE]{\textbf{\thepage} \ {\vrule height 13pt width 1pt} \ \leftmark}
    \fancyfoot{}
    \fancyfoot[RO,LE]{}
    \renewcommand{\headrulewidth}{0pt}
    \renewcommand{\chaptermark}[1]{\markboth{\thechapter. \ \textsc{##1}}{}}
    \renewcommand{\sectionmark}[1]{\markright{\thesection\ {##1}}}
}
% Redefining the PLAIN style
\fancypagestyle{plain}{%
    \fancyhead{}
    \fancyhead[RO]{{\vrule height 13pt width 1pt} \ \textbf{\thepage}}
    \fancyhead[LE]{\textbf{\thepage} \ {\vrule height 13pt width 1pt}}
    \fancyfoot{}
    \fancyfoot[RO,LE]{}
    \renewcommand{\headrulewidth}{0pt}
}

\begin{document}
\pagestyle{MyStyle}% or \pagestyle{fancy} or \pagestyle{plain}
\pagestyle{MyStyle}
% Previous chapters...
\setcounter{chapter}{3}
\chapter{Chapter Title}
\section{First section title}
\lipsum
\section{Second section title}
\lipsum
% Following chapters...
\end{document}

请注意,仅当被重新定义\pagestyle{plain}\pagestyle{MyStyle}时才有效。plain\fancypagestyle{plain}{...}


另外这里还有另一个建议使用scrlayer-scrpage

\documentclass[12pt,twoside,openright]{report}
\usepackage{emptypage}
\usepackage[T1]{fontenc}
\usepackage{lipsum}

% Page style
\usepackage[automark,markcase=noupper]{scrlayer-scrpage}
\addtokomafont{pagehead}{\normalfont}
\addtokomafont{pagenumber}{\bfseries}
\providepairofpagestyles{MyStyle}{
  \rohead%
    [{\vrule height 13pt width 1pt} \ \pagemark]%
    {\headmark \ \ {\vrule height 13pt width 1pt} \ \pagemark}
  \lehead%
    [\pagemark \ {\vrule height 13pt width 1pt}]%
    {\pagemark \ {\vrule height 13pt width 1pt} \ \scshape{\headmark}}
  \renewcommand\chaptermarkformat{\thechapter. \ }
}
\DeclarePageStyleAlias{plain}{plain.MyStyle}

\begin{document}
\pagestyle{MyStyle}
% Previous chapters...
\setcounter{chapter}{3}
\chapter{Chapter Title}
\section{First section title}
\lipsum
\section{Second section title}
\lipsum
% Following chapters...
\end{document}

相关内容