我根本找不到有关该samepage
环境的任何文档(除了 LaTeX 书第 229 页上的一条神秘评论“该\samepage
命令仍然有效,但现在用处不大”,这可能与同名环境相关,也可能不相关)。 这个答案并且环境的名称表明它应该将其内容保留在同一页面上,但事实并非如此,正如此 MWE 所示:
\documentclass{article}
\usepackage{lipsum}
\usepackage{parskip}
\begin{document}
\lipsum[4-8]
\begin{samepage}
foo
bar
\end{samepage}
\end{document}
这会破坏“foo”和“bar”之间的页面。我是否误用了环境samepage
?有记录吗?
此示例需要xelatex
而不是,但您可以通过在环境中添加第三行latex
来看到相同的效果。latex
samepage
答案1
samepage
在每个可以合理访问的地方,比如段落的行之间(但不是单行段落)以及 latex 可以控制的每个地方,例如列表项、数学显示等,都很容易发生中断。
也许令人惊讶的是, tex 有一个\interlinepenalty
原语来控制换行时的惩罚,但是没有任何东西可以控制断行时的惩罚\parskip
。
Latex 的新段落钩子最终可以访问段落的开始和结束(参见texdoc ltpara-doc
),因此您可以添加惩罚:
\documentclass{article}
\usepackage{lipsum}
\usepackage{parskip}
\AddToHook{env/samepage/begin}{%
\AddToHook{para/before}{\nopagebreak}%
\AddToHook{para/after}{\nopagebreak}%
}
\begin{document}
\lipsum[4-8]
\begin{samepage}
foo
bar
\end{samepage}
\end{document}