beforeskip在页首时消失

发布于 2024-11-25 20:53:49

当标题出现在页首时,beforeskip消失。

正常:
image.png

页首:
image.png

在站里找到了之前的回答: https://wenda.latexstudio.net/answer/1911/2957.html

\usepackage{xpatch}
\makeatletter \xpatchcmd
    \@startsection {\addvspace} {\vspace*} {}{\fail}
\makeatother

patch之后空白变多了:

image.png

\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

查看更多

关注者
0
被浏览
764
1 个回答
尊咾哎哟
尊咾哎哟 2025-05-18
¥a^2+b^2=c^2¥. . .
有点久的提问了,不懂题主是否已经解决了...这个[空白变多]疑惑之前遇到过,所以小发表一下看法。

关于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中大致找到了答案:
image.png

image.png

可以理解为:\topskip用来保证本页第一个box的baseline能有一个最小的深度,当小于这个深度时,就会自动延伸直到\topskip值大小为止。

从实验来看,\topskip的值可能等于fontsize的大小。在文档类中设置fontsize然后在正文打印这个长度值便可发现。

Example:
image.png

于是我推测\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机制中的根本性质依旧存疑。

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友

手机
浏览

扫码手机浏览