我希望能够使用\if
命令来检查是否\section
出现在新页面的第一行。如果节标题是新页面的第一行,我希望通过修改来调整节标题和页眉之间的一些间距\headsep
。
有没有简单的方法可以做到这一点?
更多信息(编辑):只要您没有强制将新页面添加到单独的部分,就会出现此问题。如果您连续书写,那么每当 TeX 决定插入分页符时,原生的间距参数都会\section
被抑制当且仅当分页符出现在新章节之前。
因此,如果你的标题很长,并且有横线,那么缺少间距看起来会很奇怪:
据我所知,TeX 没有内置行号计数器,可用于检查标题是否出现在新页面的第一行。你也不知道什么时候可能发生分页符。因此,虽然我有一个特定的目的,想找到一种方法来检查某些东西是否在第一行(或第 n 个尽管它可以在页面的某一行显示,但仍可能帮助有不同目的的人。
答案1
该解决方案需要lineno
、fancyhdr
和color
包,因此并不优雅。
首先,开始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
。
(很难理解这种必要性。)