
Проблема
Есть ли в 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
инструмента, размещение этих макросов не имеет никакого значения.