![在页眉中插入章节编号和名称(包括章节的首页)](https://linux22.com/image/331884/%E5%9C%A8%E9%A1%B5%E7%9C%89%E4%B8%AD%E6%8F%92%E5%85%A5%E7%AB%A0%E8%8A%82%E7%BC%96%E5%8F%B7%E5%92%8C%E5%90%8D%E7%A7%B0%EF%BC%88%E5%8C%85%E6%8B%AC%E7%AB%A0%E8%8A%82%E7%9A%84%E9%A6%96%E9%A1%B5%EF%BC%89.png)
通过使用 fancyhdr,我想获得部分姓名和号码在页眉中,如果相关的话,还有章节名称。
更清晰,问题是:如何在章节首页的页眉上放置名称和数字本章第一节如果本章第一页有多个新章节?
我的第一次尝试: (以下代码)
如果部分中没有章节,则没有问题。(例如 PartA)否则,章节页面上没有标题。为了解决这个问题,我重新定义了章节命令以保留章节页面上的页面样式(修改 1)。然后我得到了章节名称,但没有得到部分名称。目前尚未定义。
因此我重新定义了 \chaptermark 命令(修改 2),灵感来自由于小节原因,标题在章节页面上显示不正确。
它非常好,但是我仍然有两个问题:
- 如果章节页面中没有节,则使用上一章的节名(见图 1a)。我找到了一种解决方案,即在创建新章节时重置 firstsectiontitle。这种方法很有效,但使用 \def 或 \gdef 可能不是正确的方法。
在那个阶段我已经
% Modification 2
\renewcommand{\chaptermark}[1]{%
\markboth{\MakeUppercase{\chaptername\ \thechapter. \ #1}} % Chapter name appears in the header as previously.
{\noexpand\firstsectiontitle}
\gdef\firstsectiontitle{} % To remove the firstsectiontitle from last Chapter in case there is no section on the current chapter first page
}
\renewcommand{\sectionmark}[1]{%
\markright{ \thesection. \ \MakeUppercase{#1}}
\gdef\firstsectiontitle{\thesection. \ \MakeUppercase{#1}}}
\newcommand\firstsectiontitle{}
- 第二个问题我仍然无法处理:如果同一章页面中有两个或多个部分,则页面中最后一部分的名称将显示在页眉中。我更希望将 rightmark(“sectionmark”)作为章节第一部分的名称。参见图片 1b(8 而不是 10)。使用与前面提到的相同链接中相同的技巧,使用布尔值 firstsectionmark,我可以得到好的第一部分名称,但不能得到好的部分编号,因为 \section 不合适。(参见图片 1c)。
我非常理解,在 \sectionmark 重新定义中,{\thesection.\ #1} 不是一个好的定义。是否有可能在 sectionmark 定义中定义一个 firstsectiontitlenumber 来设置\gdef\firstsectiontitle{ \MakeUppercase{\thesection.\ #1}}
?有什么建议吗?
第二次尝试策略(下面的代码)灵感来自标题包含章节和章节开始页上的部分
标记命令设置三个变量:\topmark(上一页的最后一个标记)、firstmark(当前页的第一个标记)和 \botmark(当前页的最后一个标记)。\rightmark 使用 \markright 设置的 \firstmark 或 \markboth 的第二个参数。在章节页上,\markboth 的第一次调用由 \chapter 完成,通常使用一个空的第二个参数来重置标题条目。
在我们的例子中,firstmark 是空的。解决方法是改用 botmark。它几乎给出了我们预期的结果,但仍然给出了章节页最后一节的编号和名称。参见图片 2。
有人能帮我解决这个问题吗?
应该有一个简单的方法,因为如果部分中没有章节,就像 A 部分一样,它的行为就会按照我想要的方式进行。
第一次尝试,下面是经过两次修改的代码。这几乎是一个最小的例子
\documentclass[twoside, openright]{report}
\usepackage{remreset}
\usepackage{lipsum}
\usepackage{fancyhdr}
\usepackage{lmodern}
%
\pagestyle{fancy}
\renewcommand{\headrulewidth}{1pt}
\renewcommand{\footrulewidth}{1pt}
\fancyhf{}
\fancyhead[LE,RO]{\rightmark}
\fancyhead[RE,LO]{\leftmark}
\fancyfoot[LE,RO]{\thepage}
%
% Modification 1: redefinition of chapter from report.cls
\makeatletter
\renewcommand{\chapter}{\clearpage
%\thispagestyle{plain} % to keep the fancy style
\global\@topnum\z@
\@afterindentfalse
\secdef\@chapter\@schapter}
\makeatother
%
% Modification 2
\renewcommand{\chaptermark}[1]{%
\markboth{\MakeUppercase{\chaptername\ \thechapter. \ #1}} % Chapter name appears in the header as previously.
{\noexpand\firstsectiontitle}
\gdef\firstsectiontitle{} % To remove the firstsectiontitle from last Chapter in case there is no section on the current chapter first page
\global\firstsectionmarktrue % To get the title of the first subsection of the current chapter.
}
%
\renewcommand{\sectionmark}[1]{%
\markright{ \MakeUppercase{\thesection.\ #1}}
\iffirstsectionmark
\gdef\firstsectiontitle{ \MakeUppercase{\thesection.\ #1}}
\fi
\global\firstsectionmarkfalse
}
\newif\iffirstsectionmark
\newcommand\firstsectiontitle{}
\renewcommand*\thesection{\arabic{section}} % for section display
\makeatletter \@removefromreset{section}{chapter}\makeatother %to décorrelate sction and chapter counters (\usepackage{remreset})
%
\begin{document}
\part{PART A No chapter No Problem}
\section{Sectionn1 }
\section{Sectionn2 }
\part{PART B}
\chapter[ChapterBa OK]{ChapterBa It is OK,easy configuration 1 section}
\section{Sectionn3 }
\lipsum[1-4]
\section{Sectionn4 }
\lipsum[1]
\section{Sectionn5 }
\lipsum[1]
\chapter[ChaptBb no section]{ChapterBb No section in the page }
\lipsum[1-4]
\section{Sectionn6 }
\lipsum[1]
\section{Sectionn7 }
\lipsum[1-3]
\chapter{ChapterBc Several sections}
\section{Sectionn8 }
\lipsum[1]
\section{Sectionn9 }
\lipsum[1]
\section{Sectionn10 }
\lipsum[1]
\section{Sectionn11 }
\lipsum[1]
\part{PART C}
\lipsum[1-8]
\section{Sectionn12 }
\section{Sectionn13 }
\end{document}
以下是第二种策略的代码:
\documentclass[twoside, openright]{report}
\usepackage{remreset}
\usepackage{lipsum}
\usepackage{fancyhdr}
\usepackage{lmodern}
\makeatletter
\providecommand*{\rightbotmark}{\expandafter\@rightmark\botmark\@empty\@empty}
%\providecommand*{\rightfirstmark}{\expandafter\@rightmark\firstmark\@empty\@empty}
\makeatother
\fancypagestyle{myfancy}{
\renewcommand{\headrulewidth}{1pt}
\renewcommand{\footrulewidth}{1pt}
\fancyhf{}
\fancyhead[LE,RO]{\rightmark}
\fancyhead[RE,LO]{\leftmark}
\fancyfoot[LE,RO]{MYFANCY \thepage}
}
\fancypagestyle{myfancychap}{
\renewcommand{\headrulewidth}{1pt}
\renewcommand{\footrulewidth}{1pt}
\fancyhf{}
\fancyhead[LE,RO]{\rightbotmark} %HERE IS THE DIFFERENCE
%\fancyhead[LE,RO]{\rightfirstmark}
\fancyhead[RE,LO]{\leftmark}
\fancyfoot[LE,RO]{MYFANCYCHAP \thepage}
}
\pagestyle{myfancy}
\makeatletter
\renewcommand{\chapter}{\clearpage
\thispagestyle{myfancychap} % to keep the fancy style.
\global\@topnum\z@
\@afterindentfalse
\secdef\@chapter\@schapter}
\makeatother
\renewcommand*\thesection{\arabic{section}} % for section display
\makeatletter \@removefromreset{section}{chapter}\makeatother %to décorrelate sction and chapter counters (\usepackage{remreset})
%
\begin{document}
...
编辑:补充说明:我的问题与 twoside 选项有关,
- 章节是在左页还是右页打开(实际上,如果我们希望所有新章节都在左页打开,我们可以使用 titlesec 包和
\documentclass[twoside, openleft]{report}
下面的小代码,无论第一节的大小如何,它都可以工作) - 以及是否可以在章节开头有几个“小”部分。 (如果不能,可以使用下面的代码,无论文档的
\usepackage[pagestyles, botmarks]{titlesec}
选项是什么openleft
,openright
或者使用选项或上面提到的链接中给出的任何解决方案)openany
\usepackage[pagestyles, outermarks] {titlesec}
openright
\documentclass[twoside]{report}
\usepackage[pagestyles, extramarks]{titlesec}
\newpagestyle{mystyle}{
\headrule%
\sethead[\textsl{\ifthesection{\thesection. }{} \sectiontitle}][][\textsl{\ifthechapter{\thechapter.}{} \chaptertitle}]
{\textsl{\ifthechapter{\thechapter.}{} \chaptertitle}}{}{\textsl{\ifthesection{\thesection. }{} \sectiontitle}}
\footrule
\setfoot[\thepage][][]{}{}{\thepage}
}
\pagestyle{mystyle}
\assignpagestyle{\chapter}{mystyle}
esdd 给出的解决方案很棒,并且不依赖于前 2 个条件。
答案1
我确实建议plain
对章节页面使用默认页面样式。不过,这里有一个建议,定义一个附加标记。
\documentclass[twoside, openright]{report}
\usepackage{lipsum}
\usepackage{fancyhdr}
\usepackage{lmodern}
\usepackage{chngcntr}% defines \counterwithout
\usepackage{xpatch}
\usepackage{scrextend}% defines \ifstr
\makeatletter
\providecommand*{\rightbotmark}{\expandafter\@rightmark\botmark\@empty\@empty}
\makeatother
\fancypagestyle{myfancy}{
\renewcommand{\headrulewidth}{1pt}
\renewcommand{\footrulewidth}{1pt}
\fancyhf{}
\fancyhead[LE,RO]{\rightmark}
\fancyhead[RE,LO]{\leftmark}
\fancyfoot[LE,RO]{MYFANCY \thepage}
}
\fancypagestyle{myfancychap}{
\renewcommand{\headrulewidth}{1pt}
\renewcommand{\footrulewidth}{1pt}
\fancyhf{}
\fancyhead[LE,RO]{%
\ifstr{\rightmark}{}{%
\ifstr{\rightbotmark}{}{}{\MakeUppercase{\firstmarks\mysection}}%
}{%
\ifstr{\rightmark}{\leftmark}{}{\rightmark}%
}%
}
\fancyhead[RE,LO]{\leftmark}
\fancyfoot[LE,RO]{MYFANCYCHAP \thepage}
}
\pagestyle{myfancy}
\newmarks\mysection
\xapptocmd\sectionmark{\marks\mysection{\thesection. \ #1}}{}{}
\xpatchcmd{\chapter}{\thispagestyle{plain}}{\thispagestyle{myfancychap}}{}{}
\counterwithout{section}{chapter}
\begin{document}
\part{PART A No chapter No Problem}
\section{Sectionn1 }
\section{Sectionn2 }
\part{PART B}
\chapter[ChapterBa OK]{ChapterBa It is OK,easy configuration 1 section}
\section{Sectionn3 }
\lipsum[1-4]
\section{Sectionn4 }
\lipsum[1]
\section{Sectionn5 }
\lipsum[1]
\chapter[ChaptBb no section]{ChapterBb No section in the page }
\lipsum[1-4]
\section{Sectionn6 }
\lipsum[1]
\section{Sectionn7 }
\lipsum[1-3]
\chapter{ChapterBc Several sections}
\section{Sectionn8 }
\lipsum[1]
\section{Sectionn9 }
\lipsum[1]
\section{Sectionn10 }
\lipsum[1]
\section{Sectionn11 }
\lipsum[1]
\part{PART C}
\lipsum[1-8]
\section{Sectionn12 }
\section{Sectionn13 }
\end{document}