防止枚举项跨页

防止枚举项跨页

首先,我知道这个问题在这个问题,但他们的解决方案在特定情况下对我来说不起作用,所以我正在寻找更好的解决方案。

最小工作示例 #1 如下所示。这里的想法是将枚举环境重新定义为名为 的新环境procedure。这个新环境的目的是将一些附加文本附加到环境中每个项目的末尾。这种方法效果很好,但是,如果该特定项目靠近页面边界,附加的文本通常会被发送到另一个页面。

上面链接的问题提供的解决方案是将项目放入迷你页面。这是在 MWE #2 中完成的。这可以很好地将特定项目放在一起,但这些项目会溢出页面!在特定项目前插入或\clearpage不会\newpage产生任何效果。我猜是因为 latex 不知道迷你页面项目的大小,因此无法正确预算它们的空间。

有人能在这里提供解决方案吗?我只是希望能够将整个项目放在程序环境中,如果当前页面末尾无法容纳所有项目,则自动将整个项目推送到下一页。


最大能量损失 #1

代码

\documentclass{article}

\usepackage{lipsum}

\def\initial{\par \vspace{2ex} Initial: \underline{\hspace{10em}}}
\let\olditem\item
\let\saveenumerate\enumerate
\let\saveendenumerate\endenumerate
\newenvironment{procedure}{%
    \def\newitem{\initial\olditem}
    \saveenumerate
    \def\step{%
        \let\step\newitem\olditem
    }
}{%
    \initial\saveendenumerate%
}

\begin{document}
    \begin{procedure}
        \step \lipsum[1]
        \step \lipsum[2]
        \step \lipsum[3]
        \step \lipsum[4]
        \step \lipsum[5]
    \end{procedure}
\end{document}

输出

第 4 项上自动附加的文本在下一页!我想将其与第 4 项放在一起,即使这意味着将第 4 项完全推到下一页。

在此处输入图片描述


最大能量损失 #2

代码

\documentclass{article}

\usepackage{lipsum}

\def\initial{\par \vspace{2ex} Initial: \underline{\hspace{10em}}}
\let\olditem\item
\let\saveenumerate\enumerate
\let\saveendenumerate\endenumerate
\newenvironment{procedure}{%
    \def\newitem{\initial\olditem}
    \saveenumerate
    \let\closepage\relax
    \def\step{%
        \closepage
        \let\step\newitem\olditem
        \minipage[t]{\linewidth}
        \let\closepage\endminipage
    }
}{%
    \initial\closepage\saveendenumerate%
}

\begin{document}
    \begin{procedure}
        \step \lipsum[1]
        \step \lipsum[2]
        \step \lipsum[3]
        \step \lipsum[4]
        \step \lipsum[5]
        \step \lipsum[6]
    \end{procedure}
\end{document}

输出

现在项目保持在一起,但项目 #6 溢出了页面边缘!这对我来说也不起作用。

在此处输入图片描述

答案1

您需要将首字母的最终代码放在 内minipage;而您当前的代码则将其放在 外。您可以直接修改代码来执行此操作,如下所示(这样做的好处是您可以只使用标准命令\item):

\documentclass{article}

\usepackage{lipsum}

\newcommand{\initial}{\par \vspace{2ex} Initial: \underline{\hspace{10em}}\par}
\let\saveenumerate\enumerate
\let\saveendenumerate\endenumerate

\newenvironment{procedure}{%
    \saveenumerate
    \newcommand{\closestep}{}%
    \newcommand{\step}{%
        \closestep
        \item
        \minipage[t]{\linewidth}%
        \renewcommand{\closestep}{\initial\endminipage}%
    }%
}{%
    \closestep\saveendenumerate%
}

\begin{document}

\begin{procedure}
  \step \lipsum[1]
  \step \lipsum[2]
  \step \lipsum[3]
  \step \lipsum[4]
  \step \lipsum[5]
  \step \lipsum[6]
\end{procedure}

\end{document}

这样会生成两页,其中第 4 项从第二页开始,不会跨页。

使用该包可以使保存标准定义的舞蹈enumerate变得更加自然environ,该包允许您定义一个新环境,将其\BODY放入某些给定的命令序列中:

\documentclass{article}

\usepackage{environ}
\usepackage{lipsum}

\newcommand{\initial}{\par \vspace{2ex} Initial: \underline{\hspace{10em}}\par}

\NewEnviron{procedure}{\newcommand{\closestep}{}
  \newcommand{\step}{\closestep
      \item
      \minipage[t]{\linewidth}%
      \renewcommand{\closestep}{\initial\endminipage}%
  }%
  \begin{enumerate}%
    \BODY
    \closestep
  \end{enumerate}%
}

\begin{document}

\begin{procedure}
  \step \lipsum[1]
  \step \lipsum[2]
  \step \lipsum[3]
  \step \lipsum[4]
  \step \lipsum[5]
  \step \lipsum[6]
\end{procedure}

\end{document}

请注意,我尽可能使用 LaTeX 的\newcommand/ 。\renewcommand

相关内容