Понимание «растягивающегося» отрицательного вертикального пространства над обрамленными заголовками глав

Понимание «растягивающегося» отрицательного вертикального пространства над обрамленными заголовками глав

Этот вопрос в некоторой степени связан с моим предыдущим вопросом.переполненный hbox на главах со строкой выше/ниже названия главы с использованием KOMA-script, поскольку (частично) проблема возникает при различных/всех методах добавления верхних и нижних линий (не только при 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необходимо, чтобы избежать изначальной проблемы переполненного hbox, а мини-страница, похоже, решает проблему интервалов. Все еще есть небольшое отрицательное, но, по-видимому, постоянное, vspace в 1,6pt. Это может быть или не быть суммой ширины строки и внутреннего нижнего поля.

решение1

глядя на вывод showbox, код компенсирует, \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 никогда не компенсируется, и поскольку страница не заполнена, любой компонент растяжения любой величины может растянуться, чтобы заполнить пространство.

Связанный контент