如果新章节从页面中间开始,则在页眉中显示章节编号,除非章节从页面顶部开始

如果新章节从页面中间开始,则在页眉中显示章节编号,除非章节从页面顶部开始

我正在课堂上写论文oneside scrbook,希望章节编号和名称显示在所有页面的左上角(新章节开始的页面除外)。我面临的问题是,如果新章节从页面中间开始,那么新的章节编号和标题就会显示出来,而我想显示页面顶部的章节编号和标题。以下是我在网上找到的代码几乎修复了这个问题:

\documentclass[oneside]{scrbook}
\usepackage{lipsum}
\usepackage{xcolor}
\RequirePackage[headsepline=true,footsepline=false]{scrlayer-scrpage}

\makeatletter
\def\leftmark{\expandafter\@leftmark\topmark\@empty\@empty}
\makeatother

\renewcommand{\sectionmark}[1]{\markleft{\textcolor{black}{\thesection}\ ~ #1}}
\clearpairofpagestyles % clear default page style
\lohead{~\leftmark} % section name and number on top left

\begin{document}
\chapter{Introduction}
\section{First section}
\lipsum[1-8]
\section{Second section}
\lipsum[1-1]
\section{Third section}
\lipsum[1-2]
\end{document}

但是,在新部分从页面顶部开始的情况下,页眉仍显示前一节的编号和标题。最简单的方法是调整上述代码以保持相同的功能,但确保当新部分从页面顶部开始时,页眉显示章节编号和标题?

答案1

您可以使用\leftfirstmark并删除对的重新定义\leftmark。但是,对于所示的示例,我只会使用\automark[section]{section}

\documentclass[oneside]{scrbook}
\usepackage{lipsum}
\usepackage{xcolor}
\usepackage[headsepline=true,footsepline=false]{scrlayer-scrpage}% You should use \usepackage to load packages in documents.
\automark[section]{section}
\clearpairofpagestyles % clear default page style
\ihead{\headmark} % head mark as defined using \automark in the page head    
%\ofoot*{\pagemark}% Maybe adding pagination would be a good idea?

\begin{document}
\chapter{Introduction}
\section{First section}
\lipsum[1-8]
\section{Second section}
\lipsum[1-1]
\section{Third section}
\lipsum[1-2]
\end{document}

第 2 页和第 3 页包含预期的页眉

KOMA-Script 手册中描述了其他命令,例如:\lefttopmark,,\leftfirstmark\leftbotmark例如,如果您使用\lefttopmark

\documentclass[oneside]{scrbook}
\usepackage{lipsum}
\usepackage{xcolor}
\usepackage[headsepline=true,footsepline=false]{scrlayer-scrpage}% You should use \usepackage to load packages in documents.
\automark[section]{section}
\clearpairofpagestyles % clear default page style
\ihead{\lefttopmark} % See the KOMA-Script manual for the meaning of \lefttopmark.    
%\ofoot*{\pagemark}% Maybe adding pagination would be a good idea?

\begin{document}
\chapter{Introduction}
\section{First section}
\lipsum[1-8]
\section{Second section}
\lipsum[1-1]
\section{Third section}
\lipsum[1-2]
\end{document}

你会得到:

使用 \lefttopmark

因此没有标记,结果为:获取上一页的最后一个标记,除非该部分从最开始开始。因此,您需要额外的代码来处理这种情况,例如:

\documentclass[oneside]{scrbook}
\usepackage{lipsum}
\usepackage{xcolor}
\usepackage[headsepline=true,footsepline=false]{scrlayer-scrpage}% You should use \usepackage to load packages in documents.
\automark[section]{section}
\clearpairofpagestyles % clear default page style
\ihead{\lefttopmark} % See the KOMA-Script manual for the meaning of \lefttopmark.    
% \ofoot*{\pagemark}% Maybe adding pagination would be a good idea?
\newpairofpagestyles{sectionpagestyle}{\ihead{\leftfirstmark}}

\makeatletter
\AddtoDoHook{heading/postinit/section}{%
  \ifdim \dimexpr\pagegoal-\pagetotal\relax<3\baselineskip
    \pagebreak[4]%
    \thispagestyle{sectionpagestyle}%
    \typeout{Do it!}%
  \else
    \typeout{\the\pagegoal, \the\pagetotal, \the\baselineskip}%
  \fi
  \@gobble
}
\makeatother


\begin{document}
\chapter{Introduction}
\section{First section}
\lipsum[1-8]
\section{Second section}
\lipsum[1-1]
\section{Third section}
\lipsum[1-6]
\section{Fourth section}
\lipsum[1]

\end{document}

使用额外的代码来检测该部分是否位于页面开头

但请注意:这样的代码可能会失败,例如,如果节头后面跟着一个巨大的不可破坏的盒子。

顺便说一句:如果您想要在标题中的章节编号和章节标题之间留出额外的空格,请不要重新定义,\sectionmark例如\sectionmarkformat

\renewcommand*{\sectionmarkformat}{\thesection\autodot\hspace{1.5em}}

\automark有关、\leftfirstmark\headmark的更多信息,请参阅 KOMA-Script 手册\sectionmarkformat。有关使用 KOMA-Script 的页面样式的更多信息,请参阅,例如KOMA-Script Wiki 中的“如何更改页眉和页脚”提供德语版本

离题:在示例中,我建议使用scrreprt(without option) 而不是scrbookwith option oneside,但也许没有显示使用scrbook而不是 的原因scrreprt

相关内容