当标题出现在页首时,beforeskip消失。
正常:
页首:
在站里找到了之前的回答: https://wenda.latexstudio.net/answer/1911/2957.html
\usepackage{xpatch}
\makeatletter \xpatchcmd
\@startsection {\addvspace} {\vspace*} {}{\fail}
\makeatotherpatch之后空白变多了:

\documentclass[zihao=5]{ctexart}
\usepackage[bodytextleadingratio=1.2]{zhlineskip}
\usepackage[pass, showframe]{geometry}
\usepackage{multicol}
\setlength{\columnsep}{\ccwd}
\setlength{\columnseprule}{0.4pt}
\ctexset
{
section={
fixskip=true,
format=\zihao{4}\heiti\centering,
beforeskip = 13.575bp,
afterskip = 13.575bp
},
subsection={
fixskip=true,
format=\zihao{-4}\heiti\raggedright,
beforeskip = 8.3bp,
afterskip = 8.3bp
}
}
\newcommand{\test}{\noindent\rule{\linewidth}{\ccwd}}
\usepackage{xpatch}
\makeatletter \xpatchcmd\@startsection {\addvspace} {\vspace*} {}{\fail} \makeatother
\raggedbottom
\begin{document}
\begin{multicols}{2}
\test
\section{测试}
\test
\test
\subsection{测试}
\test
\newcolumn
\test
一
二
三
\test
\test
一
二
\test
\end{multicols}
\newpage
\begin{multicols}{2}
% \test
\section{测试}
\test
\test
\subsection{测试}
\test
\newcolumn
% \test
一
二
三
\test
\test
一
二
\test
\end{multicols}
\end{document}可能有用?
https://ask.latexstudio.net/ask/question/17394.html
https://github.com/CTeX-org/ctex-kit/issues/207
https://github.com/CTeX-org/ctex-kit/issues/248
有点久的提问了,不懂题主是否已经解决了...这个[空白变多]疑惑之前遇到过,所以小发表一下看法。
在ctexart.cls的\@startsection的定义中,如下句子便是用来添加beforeskip的:
\addvspace \CTEX@headingskip于是原MWE中将\addvspace替换为\vspace*,效果如lshort中所说,可以使所添加的垂直间距在一页的顶端不被“吞掉”。
对此,直接在\ssection命令之前\vspace*{0bp},效果基本是等价的。
在ctexart类中,可以用\ctexset命令,将语句\vspace*{0bp}叠加到berak键中。
我受了如下这个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机制中的根本性质依旧存疑。
答主您好,我已经renew了section的命令,绕过ctex,用vbox实现上下居中。谢谢您的指点。
@u115385 不客气,解决了就好