如何在具有嵌套列表的多列环境中控制列/分页符?

如何在具有嵌套列表的多列环境中控制列/分页符?

我有一个像这样的多列嵌套列表:

\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}

在此示例中,外部列表的第一项与内部列表一起放入新列中。但是,如果内部列表的长度超过一列,则此技巧将失败,必须尝试其他方法。

我认为无法区分“栏末”和“页末”。

相关内容