鼓励在项目之间分页,而不是在项目内部

鼓励在项目之间分页,而不是在项目内部

我有一个包含多个列表的文档,我不想在其中设置分页符。在以下文档中:

\documentclass{article}
\usepackage[totalheight=2in]{geometry}

\begin{document}
\begin{itemize}
    \item A top level item
    \begin{itemize}
        \item A second level item
        \item A second level item
        \item A second level item
        \item A second level item
        \item A second level item
    \end{itemize}
    %\newpage
    \item Another top level item
    \begin{itemize}
        \item A second level item
        \item A second level item
        \item A second level item
        \item A second level item
        \item A second level item
    \end{itemize}
\end{itemize}
\end{document}

在第二个列表的中间发生中断。我想在 的位置自动中断\newpage,即使这意味着中断不太理想。有没有办法优先在项目之间而不是项目内中断?

我试过\usepackage{enumitem} \setlist{midpenalty=5000},但这会将换行符移到“另一个顶级项目”之后。我可以通过将其括Another top level item...\end{itemize}在 中来获得所需内容\parbox[t]{\textwidth},但这似乎有点过分。有没有更好的方法?

看起来https://tex.stackexchange.com/a/76495/107497会提供一种(复杂的)方法来自动包装迷你页面中的所有项目,但我希望有更简单的东西。这似乎与ConTeXt:嵌套项目环境之间的分页符首选项,但那是使用 ConTeXt。

答案1

这显示了如何计算所需的空间。

\documentclass{article}
\usepackage{needspace}
\usepackage{lipsum}

\begin{document}
\rule{1em}{30\baselineskip}

\begin{itemize}
    \item A top level item
    \begin{itemize}
        \item A second level item
        \item A second level item
        \item A second level item
        \item A second level item
        \item A second level item
    \end{itemize}
    \setbox0=\vbox{\leftskip\csname @totalleftmargin\endcsname
    \item Another top level item
    \begin{itemize}
        \item A second level item
        \item A second level item
        \item A second level item
        \item A second level item
        \item A second level item
    \end{itemize}}
    \needspace{\ht0}
    \unvbox0
\end{itemize}

\lipsum[1-4]
\end{document}

答案2

我时间紧迫,没有时间进行测试,因此没有按 MWE 进行生产,——但如果你在谈论鼓励而不是阻止,我认为你可以用惩罚来做这样的事情(改编自我的列表格式之一,因此包括其他内容和我使用的特定编号格式)

使用 enumitem 包https://ctan.org/pkg/enumitem

\newlist{mylist}{enumerate}{6}
\setlist[mylist,1]{label=\Alph*.,ref=\Alph*,itemsep=6pt}
\setlist[mylist,2]{label=\Alph{mylisti}\arabic*.,ref=\Alph{mylisti}\arabic*,itemsep=3pt, beginpenalty=5000}
\setlist[mylist,3]{label=\alph*.,ref=\Alph{mylisti}\arabic{mylistii}.\alph*,itemsep=1pt, beginpenalty=5000}
\setlist[mylist,4]{label=(\arabic*),ref=\Alph{mylisti}\arabic{mylistii}.\alph{mylistiii}(\arabic*),itemsep=1pt, beginpenalty=5000}
\setlist[mylist,5]{label=(\alph*),ref=\Alph{mylisti}\arabic{mylistii}.\alph{mylistiii}(\arabic{mylistiv}\alph*),itemsep=1pt, beginpenalty=5000}
\setlist[mylist,6]{label=(\roman*),ref=\Alph{mylisti}\arabic{mylistii}.\alph{mylistiii}(\arabic{mylistiv}\alph{mylistv}-\roman*),itemsep=1pt, beginpenalty=5000}
\setlist[mylist]{align=left, parsep=3pt, topsep=1pt, itemindent=!, leftmargin=*}

我会回来修改此内容,等待其他回复

答案3

我已经将有问题的物品包装在一个环境中:

\documentclass{article}
\usepackage[totalheight=2in]{geometry}
\NewDocumentEnvironment{unbreakableitem}{o}{%
 \IfValueTF{#1}{\item[#1]}{\item}%
 \begin{minipage}[t]{\linewidth}%
}{%
 \end{minipage}%
}

\begin{document}
\begin{itemize}
    \item A top level item
    \begin{itemize}
        \item A second level item
        \item A second level item
        \item A second level item
        \item A second level item
        \item A second level item
    \end{itemize}
    \begin{unbreakableitem}
    Another top level item
    \begin{itemize}
        \item A second level item
        \item A second level item
        \item A second level item
        \item A second level item
        \item A second level item
    \end{itemize}
    \end{unbreakableitem}
\end{itemize}
\end{document}

我认为更好的解决方案可能是在这样的环境中自动包装所有项目。但似乎我需要一个布尔值来跟踪我是否已经在某个项目中(下一个\item需要\end{minipage}先进行),或者它是否是第一个这样的项目。

相关内容