了解框架章節標題上方的「彈性」負垂直空間

了解框架章節標題上方的「彈性」負垂直空間

這個問題和我之前的問題有些相關使用 KOMA 腳本在章節標題上方/下方顯示過多的水平框,因為(部分)問題是透過添加頂線和底線的各種/所有方法發生的(不僅是mdframed我發現最容易控制的方法)。

給出以下最小範例來展示該問題

\documentclass[
    parskip=full,
    open=any,
]{scrreprt}
\usepackage{mdframed}
\usepackage{lipsum}

\RedeclareSectionCommand[
    beforeskip=0pt,
    afterskip=0pt,
]{chapter}

\newmdenv[
    skipabove=16pt, % why is this necessary?
    leftline=false,
    rightline=false,
    innerleftmargin=0.5mm,
    innerrightmargin=0.5mm,
    innertopmargin=4pt,
    innerbottommargin=1pt,
    linewidth=.6pt,
]{chapterframe}

\makeatletter
\renewcommand{\chapterlinesformat}[3]{%
\begin{chapterframe}%
    \raggedchapter%
    \@hangfrom{\vphantom(#2}{#3}%
\end{chapterframe}%
\nointerlineskip}

\widowpenalty10000
\clubpenalty10000
\begin{document}
\flushbottom
\chapter{Foo}
\lipsum[1-4]
\chapter{Bar}
\lipsum[1-4]

% just the right amount of text to cause paragraph spacing to stretch
Fusce mauris. Vestibulum luctus nibh at lectus. Sed
bibendum, nulla a faucibus semper, leo velit ultricies
tellus, ac venenatis arcu wisi vel nisl. Vestibulum
diam. Aliquampellentesque, augue quis sagittis posuere,
turpis lacus congue quam, in hendrerit risus eros eget
felis.
\end{document}

我遇到以下兩個問題:

  1. 我需要定義一個跳過,以便標題的上一行不會超出文字方塊。這似乎表明,beforeskipin\RedeclareSectionCommand不會導致零跳躍,而是負跳躍。
  2. 當拉伸段落間距以防止孤行/寡行時,章節標題相對於頁面的位置會發生變化,因為顯然負空間不僅存在而且「有彈性」。

因此我的問題如下:為什麼會有負空間,如何刪除它或至少防止它拉伸以使章節標題保持在固定位置?

經過一些實驗,以下似乎可以解決問題,但我仍然想知道原因(也歡迎更簡潔的解決方案!):

\makeatletter
\renewcommand{\chapterlinesformat}[3]{%
\makebox[.65\linewidth][l]{%
\begin{minipage}{\linewidth}%
\vspace{1.6pt}
\begin{chapterframe}%
    \raggedchapter%
    \@hangfrom{\vphantom(#2}{#3}%
\end{chapterframe}%
\end{minipage}%
}}

需要\makebox避免原來的水平盒過滿的問題,而迷你頁的出現是為了解決間距問題。仍有一個較小的負值,但顯然是恆定的,vspace 為 1.6pt。這可能是也可能不是線寬和內底邊距的總和。

答案1

查看顯示框輸出,程式碼僅補償\parskip其自然長度,因此您最終會得到(僅)標題之前的拉伸組件。我沒有準確追蹤位置,但如果您本地使用固定的 parskip,兩個標題都會出現在同一點:

\documentclass[
    parskip=full,
    open=any,
]{scrreprt}
\usepackage{mdframed}
\usepackage{lipsum}

\RedeclareSectionCommand[
    beforeskip=0pt,
    afterskip=0pt,
]{chapter}

\newmdenv[
    skipabove=16pt, % why is this necessary?
    leftline=false,
    rightline=false,
    innerleftmargin=0.5mm,
    innerrightmargin=0.5mm,
    innertopmargin=4pt,
    innerbottommargin=1pt,
    linewidth=.6pt,
]{chapterframe}

\makeatletter

\showoutput
\showboxdepth=1
\renewcommand{\chapterlinesformat}[3]{%
\begin{chapterframe}%
    \raggedchapter%
    \@hangfrom{\vphantom(#2}{#3}%
\end{chapterframe}%
\nointerlineskip}

\widowpenalty10000
\clubpenalty10000
\begin{document}
\flushbottom
{\parskip=1\parskip\chapter{Foo}}

\lipsum[1-4]

{\parskip=1\parskip\chapter{Bar}}
\lipsum[1-4]

% just the right amount of text to cause paragraph spacing to stretch
Fusce mauris. Vestibulum luctus nibh at lectus. Sed
bibendum, nulla a faucibus semper, leo velit ultricies
tellus, ac venenatis arcu wisi vel nisl. Vestibulum
diam. Aliquampellentesque, augue quis sagittis posuere,
turpis lacus congue quam, in hendrerit risus eros eget
felis.
\end{document}

原版產生

Underfull \vbox (badness 1783) has occurred while \output is active
\vbox(595.80026+0.0)x418.25555, glue set 2.61316
.\write-{}
.\write1{\@writefile{toc}{\protect \contentsline {chapter}{\protect \numberline
 \ETC.}
.\write1{\@writefile{lof}{\protect \addvspace {10\p@ }}}
.\write1{\@writefile{lot}{\protect \addvspace {10\p@ }}}
.\glue(\topskip) 11.0
.\vbox(0.0+0.0)x0.0, glue set 13.6fil []
.\glue -13.6 plus -1.36008
.\glue -13.6

加 -1.360008 永遠不會得到補償,並且當頁面未滿時,任何數量的任何拉伸組件都可以拉伸以填充空間。

相關內容