![如何确保 \sectionmark 命令从第一节页开始起作用而不影响章节开头的页眉?](https://linux22.com/image/457040/%E5%A6%82%E4%BD%95%E7%A1%AE%E4%BF%9D%20%5Csectionmark%20%E5%91%BD%E4%BB%A4%E4%BB%8E%E7%AC%AC%E4%B8%80%E8%8A%82%E9%A1%B5%E5%BC%80%E5%A7%8B%E8%B5%B7%E4%BD%9C%E7%94%A8%E8%80%8C%E4%B8%8D%E5%BD%B1%E5%93%8D%E7%AB%A0%E8%8A%82%E5%BC%80%E5%A4%B4%E7%9A%84%E9%A1%B5%E7%9C%89%EF%BC%9F.png)
我的问题本质上是第一节页面的页眉中忽略了节标记命令。解决方案是在 的定义中将 的\sectionmark
高级命令替换\markright
为 的低级命令\rightmark
。对于该问题的 MWE 来说,它非常有效。但是,它对我不起作用,因为在我的书中,有些章节以很长的序言开始,然后才出现任何章节命令。结果是运行头打印上一章最后一节的编号和标题(而使用 的标准定义\sectionmark
,这些无章节的页面上不会出现任何标题)。请注意,发出\sectionmark
after\chapter
命令并不能解决问题,因为运行头仍然包含错误的章节编号。以下是从上述问题中采用的 MWE:
\documentclass[10pt]{book}
\usepackage{kantlipsum}
\usepackage{fancyhdr}
\pagestyle{fancy}
\renewcommand{\chaptermark}[1]{\markboth{\chaptername\ \thechapter.\ #1}{}}
\renewcommand{\sectionmark}[1]{\gdef\rightmark{\thesection.\ #1}} %
\fancyhead[LO]{\rightmark}
\fancyhead[RE]{\leftmark}
\fancyhead[RO]{\thepage}
\fancyhead[LE]{\thepage}
\renewcommand{\headrulewidth}{0pt}
\begin{document}
\chapter{One}
\section{First section of chapter one}
\kant[1-3]
\section{Second section of chapter one}
\kant[8-15]
\chapter{Two}
\kant[1-10]
\section{First section of chapter two: Too much text for a running head}
\sectionmark{First section of chapter two}
\kant[11-15]
\end{document}
此外,参考书目中的页眉biblatex
也因 的定义而扭曲\sectionmark
,但这些在 MWE 中很难重现。在此先感谢您的帮助。
这里是进一步的 MWE 演示问题:如果命令\section
落在奇数页,则该页的运行头将显示完整标题,而不是给出的缩短标题\sectionmark
。
\documentclass[10pt]{book}
\usepackage{kantlipsum}
\usepackage{fancyhdr,etoolbox}
\pagestyle{fancy}
\renewcommand{\chaptermark}[1]
{\markboth{\chaptername\ \thechapter.\ #1}{\chaptername\ \thechapter.\ #1}}
\fancyhead[LO]{\rightmark}
\fancyhead[RE]{\leftmark}
\fancyhead[RO]{\thepage}
\fancyhead[LE]{\thepage}
\renewcommand{\headrulewidth}{0pt}
\begin{document}
\chapter{One}
\section{First section of chapter one}
\kant[1-3]
\section{Second section of chapter one}
\kant[8-15]
\chapter{Two}
\kant[1-15]
\section{First section of chapter two: Too much text for a running head}
\sectionmark{First section of chapter two}
\kant[11-15]
\end{document}
答案1
引用的答案看起来完全错误。\rightmark
不是低级对应:第一个命令检索一个值,而第二个命令存储它。LaTeX 使用命令而不是简单的命令\markright
来存储值是有充分理由的,答案破坏了这一点。\mark
\def
如果没有章节,您似乎想要一些文本,因此我建议您也将一些内容存储到带有章节的正确标记中:
\documentclass[10pt]{book}
\usepackage{kantlipsum}
\usepackage{fancyhdr,etoolbox}
\pagestyle{fancy}
\renewcommand{\chaptermark}[1]
{\markboth{\chaptername\ \thechapter.\ #1}{\chaptername\ \thechapter.\ #1}}
\fancyhead[LO]{\rightmark}
\fancyhead[RE]{\leftmark}
\fancyhead[RO]{\thepage}
\fancyhead[LE]{\thepage}
\renewcommand{\headrulewidth}{0pt}
\begin{document}
\chapter{One}
\section{First section of chapter one}
\kant[1-3]
\section{Second section of chapter one}
\kant[8-15]
\chapter{Two}
\kant[1-10]
\section{First section of chapter two: Too much text for a running head}
\sectionmark{First section of chapter two}
\kant[11-15]
\end{document}