如何检查章节标题(或任何标题)是否是新页面的第一行?

如何检查章节标题(或任何标题)是否是新页面的第一行?

我希望能够使用\if命令来检查是否\section出现在新页面的第一行。如果节标题是新页面的第一行,我希望通过修改来调整节标题和页眉之间的一些间距\headsep

有没有简单的方法可以做到这一点?

更多信息(编辑):只要您没有强制将新页面添加到单独的部分,就会出现此问题。如果您连续书写,那么每当 TeX 决定插入分页符时,原生的间距参数都会\section被抑制当且仅当分页符出现在新章节之前。

因此,如果你的标题很长,并且有横线,那么缺少间距看起来会很奇怪: 分页符抑制间距

据我所知,TeX 没有内置行号计数器,可用于检查标题是否出现在新页面的第一行。你也不知道什么时候可能发生分页符。因此,虽然我有一个特定的目的,想找到一种方法来检查某些东西是否在第一行(或第 n 个尽管它可以在页面的某一行显示,但仍可能帮助有不同目的的人。

答案1

该解决方案需要linenofancyhdrcolor包,因此并不优雅。

首先,开始lineno在您的文档中插入行号(\linenumbers在之后使用begin{document});lineno添加一个名为的计数器,您可以通过将其添加到您的(类/样式)文件来linenumber强制重置每个新页面。\@addtoreset{linenumber}{page}.cls

定义一个新的fancypagestyle{y},使用 在标题和第一行之间添加所需的额外空间(x)\setlength{\headsep}{x}

然后,当您定义\def\@makesectionhead#1{}创建或打印节号和名称的宏时,\ifnum\value{linenumber}=1\thispagestyle{y}\else\fi在用 结束之前将其添加为最后一行}

最后,将\renewcommand\linenumberfont{\color{white}}行号改为白色以隐藏行号。

答案2

这是一个相当可怕的黑客行为:

\makeatletter
\let\john@@section\section
\def\section{\goodbreak\@nobreaktrue
  \vspace*{3.5ex \@plus 1ex \@minus .2ex}\john@@section}
\makeatother

的参数\vspace已从的类定义复制而来\section

(很难理解这种必要性。)

相关内容