如何防止在逐项列举或枚举列表之前出现分页符?(续)

如何防止在逐项列举或枚举列表之前出现分页符?(续)

我的问题基本上与如何防止在逐项列表之前出现分页符?。首先,我不明白所提出的解决方案 ( \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\@itempenaltyenumerateitemize

答案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 提出的。如果是,那么这就是相同的“拼写”。

相关内容