Растягивание вертикального пространства и уменьшение недостатков в нижней части страницы

Растягивание вертикального пространства и уменьшение недостатков в нижней части страницы

Проблема

Есть ли в TeX/LaTeX способ как-то уменьшить неприятные последствия, возникающие из-за расстояния строки от целевой высоты страницы?

Контекст

Я создаю класс документов для своих студентов, чтобы они использовали LaTeX, а не MS Word, для автоматизации создания переносимых документов. Предполагается, что студенты вообще не знакомы с LaTeX, поэтому я хотел бы автоматически обрабатывать как можно больше угловых случаев в моем классе LaTeX.

В то же время в моем учреждении есть требования к типам документов, которые я пытаюсь охватить, когда речь идет о шрифтах, пробелах, выравнивании и т. д. Однако допускается, чтобы нижние поля страниц были несколько непоследовательными по всему документу.

В частности, требуется, чтобы в тезисах использовались определенные шрифты размером 14pt с межстрочным интервалом 1,5. Поэтому xelatexдля компиляции используется , и, что более важно, плохость, обусловленная вертикальным расстоянием строки от низа страницы, растет гораздо быстрее, чем в обычных документах TeX/LaTeX.

Следующий MWE воспроизводит проблему (с pdflatexдобавлением):

\documentclass{book}

\renewcommand{\section}[1]{\ifhmode\par\fi\addvspace{0.5em}\textbf{#1}\par
   \penalty201\addvspace{0.5em}}
\renewcommand{\subsection}[1]{\ifhmode\par\fi\addvspace{0.5em}\textbf{\textit{#1}}\par\penalty301}

\begin{document}

\parskip=1em\raggedbottom
\tracingonline=1\tracingpages=1

1\par2\par3\par4\par5\par6\par7\par8\par9\par10\par11\par12\par13\par14\par
15\par16\par17\par18\par19\par20\par21\par22

\section{Section 1}\section{Section 2}\subsection{Subsection}
\par23

\end{document}

что дает результат (здесь для удобства чтения я искусственно обрезал изображение и уменьшил поля страницы): обрезанный результат компиляции

Результаты трассировки страницы (часть между страницами):

% t=472.0 g=550.0 b=10000 p=0 c=100000#
% t=499.0 g=550.0 b=10000 p=201 c=100000#
% t=526.0 g=550.0 b=10000 p=201 c=100000#
% t=553.0 g=550.0 b=* p=301 c=*
[1]
%% goal height=550.0, max depth=5.0
% t=10.0 g=550.0 b=10000 p=301 c=100000#
% t=32.0 g=550.0 b=10000 p=0 c=100000#

В этом примере я хотел бы, чтобы раздел 2 находился на той же странице, что и подраздел, а подраздел — на той же странице, что и пункт «23», с учетом соответствующих штрафов.

Я знаю, что я мог бы просто назначить бесконечно плохо \penalty 10000после заголовка раздела, но это создало бы другую проблему. Мне кажется обычным делом, что люди сначала определяют структуру контента, размещая пустые главы/разделы/подразделы и т. д., а затем заполняют контент. С бесконечным штрафом все такие разделы были бы на одной странице и размещались бы за границей страницы. И вот что \@startsectionпроисходит.

То есть я хотел бы иметь возможность разрыва страницы между Разделом 1 и Разделом 2 в MWE, хотя и со штрафом.

Единственный способ достичь этих целей, который я смог найти, — это поиграть с \parskipрастяжением (5em в реальном примере) и сжатием, хотя это не кажется надежным решением, это может привести к нарушению требований учреждения, и я слышал, что это, как правило, нежелательно в типографике. Поэтому я бы предпочел сделать нижнее поле растягиваемым, но не делая badness бесконечным, чтобы соблюсти штрафы, и мой вопрос касается возможности сделать это в классе LaTeX.

Я также пробовал использовать \raggedbottomи \def\@textbottom{...}для него, но они никак не влияют на плохость/стоимость разрывов страниц. Я сравнил полученные PDF-файлы с помощью diff-pdfинструмента, размещение этих макросов не имеет никакого значения.

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