フレーム内の章タイトルの上にある「伸縮性のある」垂直方向のネガティブスペースを理解する

フレーム内の章タイトルの上にある「伸縮性のある」垂直方向のネガティブスペースを理解する

この質問は前回の質問と多少関連していますKOMA スクリプトを使用して、章タイトルの上または下に線が付いた章の hbox をオーバーフルにする問題の一部は、上部の線と下部の線を追加するさまざまな/すべての方法で発生します (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}

次の 2 つの問題が発生します。

  1. タイトルの上の行がテキスト ボックスの外に出ないように、スキップを定義する必要があります。これは、in がbeforeskipゼロ\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}%
}}

これは、元の hbox がいっぱいになる問題を回避するために必要であり\makebox、ミニページは間隔の問題を解決するように見えます。1.6 ポイントの vspace は、依然としてわずかにマイナスですが、一定であるように見えます。これは、線の幅と内側の下余白の合計である場合とそうでない場合があります。

答え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 を加えた値は補正されず、ページが不足しているため、任意の量のストレッチ コンポーネントがスペースを埋めるためにストレッチされる可能性があります。

関連情報