有点久的提问了,不懂题主是否已经解决了...这个[空白变多]疑惑之前遇到过,所以小发表一下看法。
关于patch的方法
在ctexart.cls
的\@startsection
的定义中,如下句子便是用来添加beforeskip
的:
\addvspace \CTEX@headingskip
于是原MWE中将\addvspace
替换为\vspace*
,效果如lshort中所说,可以使所添加的垂直间距在一页的顶端不被“吞掉”。
对此,直接在\ssection
命令之前\vspace*{0bp}
,效果基本是等价的。
在ctexart
类中,可以用\ctexset
命令,将语句\vspace*{0bp}
叠加到berak
键中。
beforeskip中多余的空白
我受了如下这个tse贴的启发:
https://tex.stackexchange.com/questions/7676/why-does-vspace0pt-add-vertical-space
进一步,在TeX by Topic的26.2中大致找到了答案:
可以理解为:\topskip
用来保证本页第一个box的baseline能有一个最小的深度,当小于这个深度时,就会自动延伸直到\topskip
值大小为止。
从实验来看,\topskip
的值可能等于fontsize的大小。在文档类中设置fontsize然后在正文打印这个长度值便可发现。
Example:
于是我推测:\section
命令(其他各级章节标题命令类似)在真正生成标题内容(即:运行\@sect
)之前,会先运行\vspace* \CTEX@headingskip
。而当页面第一行为\section
命令时,\vspace* \CTEX@headingskip
便直接成为了本页实质上的第一个box,但这个box没有没有其他任何实质内容,于是\topskip
的机制在这里多添加了除beforeskip
以外的垂直间距。
在视觉上是多加了一个空行。可以验证:在\newpage
之后先添加一行文本、再使用\section
命令,和在\newpage
之后直接使用\section
命令相比,\section
命令所生成标题的相对位置是(几乎)没发生改变的。
进一步的解决方案
对于消除\topskip
的影响呢,刚才提到的tse贴中给了一种方法:将topskip的值设为0。
原贴中还额外要加\offinterlineskip
,但这有点“野蛮”,我给删掉了
在原有MWE的导言区中,用钩子封装一下即可:
\AtBeginDocument{\topskip=0pt}
但这会造成一个问题:\topskip
设为0
,相当于(几乎)没有了\topskip
的延展,对于一些上方该有垂直间距的文本内容现在会直接“顶行”(虽然把geometry
包的showfram
效果去掉后看不出什么端倪)。且\topskip
好像是无法分页/按条件修改的(一经设置便对所有页统一作用)。可能会就此产生一些新的问题。
特别的,上述的推测基本为启发式的,我对\vspace*
在\topskip
机制中的根本性质依旧存疑。
问 beforeskip在页首时消失