我有一个像这样的多列嵌套列表:
\begin{multicols}[2]
\begin{list}
\item main item1
\begin{list}
\item this is a very long item
\item this is a short item
\end{list}
\item main item2
\begin{list}
\item short item here
\end{list}
\item main item3
\begin{list}
\item this is a long item
\item this is a short item
\end{list}
\item ....
\end{list}
\end{multicols}
\item
但是,多列包或 LaTeX 会在第一级之后和 之前立即中断列或页面\begin{list}
。这看起来真的很糟糕。还会发生这种情况,即\item
位于页面的最后一行,而嵌套列表从下一页开始。
有谁知道如何改变这一点,以便不再在那个不太好的位置出现列/分页符(而不必\columnbreak
每次都手动插入),因为该文档很长并且是从数据库自动生成的。
最短的例子(但只是特例):
\documentclass{article}
\usepackage{multicol}
\begin{document}
\begin{multicols}{2}
\begin{list}{}{}
\item{Item 1}
\begin{list}{}{}
\item{Sub Item 1}
\end{list}
\end{list}
\end{multicols}
\end{document}
答案1
您可以通过将\@beginparpenalty
内部列表设置为 10000 来禁止该中断,因为此惩罚由每个\item
命令(启动 LR 模式)插入;第二个参数包含\begin{list}
在列表启动时要执行的命令。这是一个例子;没有\nobreaklist
中断会按照您描述的方式发生。
\documentclass[a4paper]{article}
\usepackage{multicol,lipsum}
\textheight=.5\textheight
\advance\textheight\baselineskip % just to show the example
\makeatletter
\newcommand*\nobreaklist{\@beginparpenalty=\@M}
\makeatother
\begin{document}
\begin{multicols}{2}
\lipsum[1]
\begin{list}{}{}
\item{Item 1}
\begin{list}{}{\nobreaklist}
\item{Sub Item 1}
\end{list}
\end{list}
\lipsum
\end{multicols}
\end{document}
在此示例中,外部列表的第一项与内部列表一起放入新列中。但是,如果内部列表的长度超过一列,则此技巧将失败,必须尝试其他方法。
我认为无法区分“栏末”和“页末”。