我想让 LaTeX (LyX) 使其页面以句号 ( .
) 结束。换句话说,不会将不完整的句子带到下一页。
我希望使用 \raggedbottom
这样当 Fullstoppenalty 对 Latex 进行分页的方式起作用时,页面会缩短几行。
有谁能帮我编写\fullstoppenalty
一个新的惩罚命令宏的代码吗?你能告诉我如何将它构建到我的 tex 系统中,或者至少是构建到 Memoir 类中吗?我希望我能将命令放在\fullstoppenalty= -5000
序言中。我认为,作为一个负面惩罚,它会倾向于在句号处分页,并有助于\raggedbottom
减少页面上的行数。
答案1
正如我在别处说过,TeX 对这种特殊情况没有惩罚。我认为尝试这样做不是一个好主意(反而限制了 TeX 换行的能力),但你可以尝试
\AtBeginDocument{
\let\savedfullstop.
\catcode`\.=\active
\def.{\savedfullstop\penalty-1000\relax}%
}
这将使句子变得.
活跃,并强烈鼓励在句号后换行。危险在于,如果.
在句子结尾以外的其他情况下使用,这可能会“爆炸”(例如在文件名中)。请谨慎使用!
答案2
Tex 并不真正允许您这样做,因为它使用 2 阶段流程。在第一阶段,段落被分成几行。在第二阶段,行被分布在页面上。不幸的是,您要求的需要从第二阶段反馈到第一阶段。
Joseph Wright 的建议将有力地鼓励文档中的每个句号位于行尾,这会搞乱所有的格式,并且它仍然不会做任何特别的事情来鼓励分页符落在句号处而不是段落的其他行之一。
或者,如果您使用一些附录 D 级别的技巧来对以句号结尾的行实现垂直模式的全停惩罚,这仍然是不够的,因为没有任何内容可以保证页面上的任何行都以句号结尾,所以您仍然需要将这个技巧与约瑟夫的建议(以及它的所有警告)结合起来。
为了得到你想要的结果,tex 必须对换行符和分页符进行逐章优化,而不是像 Knuth-Plass 算法那样逐段优化。逐章优化要困难得多,因为你必须解决一个更难的问题(浮点数存在时 NP 完全问题),而动态编程技巧无法解决这个问题,而正是这种技巧让 Knuth-Plass 变得如此高效。