我的问题基本上与如何防止在逐项列表之前出现分页符?。首先,我不明白所提出的解决方案 ( \par\nobreak\@afterheading
) 是如何工作的。为什么不起作用\par\nobreak
?\nobreak
应该在以下粘合处放置不可能的分页惩罚。这有什么\@afterheading
用?
另一件事是,解决方案似乎占用了段落和 itemize 环境之间的空间。以下是显示该问题的最小示例。
\documentclass[12pt, a4paper]{article}
\makeatletter
\newcommand*{\NoBreakPar}{\par\nobreak\@afterheading}
\makeatother
\begin{document}
Let's see the following list:\NoBreakPar
\begin{itemize}
\item First.
\item Second.
\item Third.
\end{itemize}
\end{document}
答案1
\documentclass[12pt, a4paper]{article}
\usepackage{blindtext}
\begin{document}
\blindtext[3]
Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Etiam lobor-
tis facilisis sem. Nullam nec mi et neque pharetra sollicitudin. Praesent
imperdiet mi nec ante. Donec ullamcorper, felis non sodales commodo, lec-
tus velit ultrices augue, a dignissim nibh lectus placerat pede. Vivamus
nunc nunc, molestie ut, ultricies vel, semper in, velit. Ut porttitor.
\begin{samepage}
Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Etiam lobor-
tis facilisis sem. Nullam nec mi et neque pharetra sollicitudin. Praesent
imperdiet mi nec ante.
\begin{itemize}
\item First.
\item Second.
\item Third.
\end{itemize}
\end{samepage}
\end{document}
答案2
我开始认为最好的解决方案是@lockstep 对原始问题的回答中描述的方法(如何防止在逐项列表之前出现分页符?)。
itemize
总结一下:像和这样的环境enumerate
会自动将 放在\@beginparpenalty
列表和前一个段落之间、\@itempenalty
项目之间以及\@endparpenalty
列表之后。这就是为什么 放置\nobreak
不起作用的原因——惩罚被自动插入的惩罚所覆盖。
惩罚的默认值为-\@lowpenalty
-51,因此实际上鼓励在那里休息(如果项目包含更多段落,这是一件好事)。问题的解决方案是根据所需的行为在本地更改\@beginpenalty
、\@itempenalty
或的值。此更改应封装在宏中,例如将宏设置定义为 10000 或、或(如果我记得是 300),并定义类似的宏设置。更改的局部性由环境自动插入的组实现。\@endparpenalty
\NoListBreak
\@beginpenalty
\@lowpenalty
\@medpenalty
\@highpenalty
\NoItemBreak
\@itempenalty
enumerate
itemize
答案3
好吧,由于缺乏普通用户的判断力:
\documentclass[12pt, a4paper]{article}
\makeatletter
\newcommand*{\NoBreakPar}{\vspace{\baselineskip}\par\nobreak\@afterheading}
\makeatother
\begin{document}
Let's see the following list:\NoBreakPar
\begin{itemize}
\item First.
\item Second.
\item Third.
\end{itemize}
\end{document}
答案4
我正在寻找类似的解决方案,最终对我有用的是定义一个新的环境:
\makeatletter
\newenvironment{linkpartolist}{\@beginparpenalty=10000}{}
\makeatother
然后将段落和列表包装到其中。
\begin{linkpartolist}
Short paragraph
\begin{itemize}
\item First.
\item Second.
\item Third.
\end{itemize}
\end{linkpartolist}
也许这就是@user87690 提出的。如果是,那么这就是相同的“拼写”。