我有一个包含多个列表的文档,我不想在其中设置分页符。在以下文档中:
\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}
先进行),或者它是否是第一个这样的项目。