
問題
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
。
也就是說,我希望 MWE 中第 1 節和第 2 節之間可以有分頁符,儘管會受到懲罰。
我找到的實現這些目標的唯一方法是使用\parskip
拉伸(在實際示例中為 5em)和收縮,儘管這似乎不是一個可靠的解決方案,但它可能會違反機構,我聽說這在排版中通常是不受歡迎的。因此,我寧願讓底部邊距可拉伸,但又不讓壞度無限,以尊重懲罰,我的問題是關於在 LaTeX 類中這樣做的可能性。
我也嘗試使用\raggedbottom
和\def\@textbottom{...}
,但它們不會以任何方式影響分頁符的壞處/成本。我使用該工具比較了生成的 PDF diff-pdf
,放置這些巨集根本沒有任何區別。