防止枚举的 \item 内出现分页符

防止枚举的 \item 内出现分页符

我有一系列问题。每个问题都有一些开头文字,然后是嵌套的枚举。下面我给出了一个示例,该示例导致 PDF 输出中第二个问题的中间出现分页符。我用 标记了\newpage我希望(自动)插入分页符的位置。在这个特定的例子中,我希望第一个问题在第 1 页,第二个和第三个问题在第 2 页(因为它们恰好都合适)。

我还在下面注释了我的尝试。我尝试在开始时启动“samepage”环境,\item并尝试在(嵌套)枚举环境结束时结束它。该代码似乎适用于更简单的示例,但在当前示例中,它失败并出现错误! LaTeX Error: \begin{samepage} on input line 56 ended by \end{center}.无论如何,我的方法似乎很脆弱,所以我希望有更好的解决方案。

我认为我发现这很难的原因在于\item工作方式。如果是\item{contents}这样的话,我认为修补起来会更容易。这就是为什么我尝试拼凑一种与 的开头\item和结尾挂钩的方法\enumerate

我正在寻找一个可以修补\item和基础的解决方案enumerate(而不是使用\newitem或 enumitem)。即,我希望我可以放入一些前导代码。

还有相关问题。例如,枚举列表内的分页符是相关的,但与嵌套枚举无关,而且解决方案似乎使用了 enumitem。

\documentclass{article}

\makeatletter
%% my attempt:
%\let\OldItem\item
%\renewcommand{\item}{\OldItem \ifnum \@listdepth=1 \begin{samepage}\fi}
%\AfterEndEnvironment{enumerate}{\ifnum \@listdepth=1 \end{samepage}\fi}
\makeatother

\begin{document}

\begin{enumerate}
\item 2 + 2 = ? \\
filler\\
filler\\
filler\\
filler\\
filler\\
filler\\
filler\\
filler\\
filler\\
filler\\
filler\\
filler\\
filler\\
filler\\
filler\\
filler\\
filler\\
filler\\
filler\\
filler\\
filler\\
filler\\
filler\\
filler\\
  \begin{enumerate}
  \item 1
  \item 2
  \item 3
  \item 4
  \end{enumerate}

% I do not want to put this page break in manually:
% \newpage
\item Consider the joint probability distribution below:
filler\\
filler\\
filler\\
filler\\
filler\\
filler\\
filler\\
filler\\
\begin{center}
\begin{tabular}{|ccc|}
\hline 
 &
$X_{2}=0$ &
$X_{2}=1$\tabularnewline
\hline 
$X_{1}=0$ &
$\frac{1}{10}$ &
$\frac{3}{10}$\tabularnewline
\hline 
$X_{1}=1$ &
$\frac{2}{10}$ &
$\frac{4}{10}$\tabularnewline
\hline 
\end{tabular}
\par\end{center}

What is $P(X_{1}=1)$?
\begin{enumerate}
\item I do not know.
\item 4
\item 17
\item 88
\end{enumerate}

\item 2 - 2 + 5 =
filler\\
filler\\
filler\\
filler\\
filler\\
filler\\
filler\\
filler\\
filler\\
filler\\
filler\\
filler\\
filler\\
filler\\
filler\\
filler\\
filler\\
filler\\
filler\\
  \begin{enumerate}
  \item 1
  \item 2
  \item 3
  \item 4
  \end{enumerate}
\end{enumerate}

\end{document}

答案1

您可以尝试以下方法。不要\\在段落末尾使用。这只会给出未满的水平框消息。

\documentclass{article}

\makeatletter
\AddToHook{cmd/item/before}{%
 \if@nmbrlist %only for enumerate?
  \ifnum \@listdepth=1
   \penalty-200
   \samepage
  \fi
 \fi}
\makeatother

\begin{document}

\begin{enumerate}
\item 2 + 2 = ? \\
filler\\
filler\\
filler\\
filler\\
filler\\
filler\\
filler\\
filler\\
filler\\
filler\\
filler\\
filler\\
filler\\
filler\\
filler\\
filler\\
filler\\
filler\\
filler\\
filler\\
filler\\
filler\\
filler\\
filler\\
  \begin{enumerate}
  \item 1
  \item 2
  \item 3
  \item 4
  \end{enumerate}

% I do not want to put this page break in manually:
% \newpage

\item Consider the joint probability distribution below:
filler\\
filler\\
filler\\
filler\\
filler\\
filler\\
filler\\
filler

\begin{center}
\begin{tabular}{|ccc|}
\hline 
 &
$X_{2}=0$ &
$X_{2}=1$\tabularnewline
\hline 
$X_{1}=0$ &
$\frac{1}{10}$ &
$\frac{3}{10}$\tabularnewline
\hline 
$X_{1}=1$ &
$\frac{2}{10}$ &
$\frac{4}{10}$\tabularnewline
\hline 
\end{tabular}
\end{center}

What is $P(X_{1}=1)$?
\begin{enumerate}
\item I do not know.
\item 4
\item 17
\item 88
\end{enumerate}

\item 2 - 2 + 5 =
filler\\
filler\\
filler\\
filler\\
filler\\
filler\\
filler\\
filler\\
filler\\
filler\\
filler\\
filler\\
filler\\
filler\\
filler\\
filler\\
filler\\
filler\\
filler
  \begin{enumerate}
  \item 1
  \item 2
  \item 3
  \item 4
  \end{enumerate}
\end{enumerate}

\end{document}

在此处输入图片描述

答案2

\def一次,\let多次。

\documentclass{article}
\usepackage{blindtext}% MWE only
\usepackage{showframe}% alignment tool

\newcommand{\RepItem}[1]{\OldItem\parbox[t]{\linewidth}{#1}}
\AtBeginEnvironment{enumerate}{\let\OldItem=\item% in case enumerate changes \item first
  \let\item=\RepItem
  \addtolength{\itemsep}{0pt plus 1fil}}
% changes are local to enumerate, but could be passed to nested environments

\begin{document}
\begin{enumerate}
  \item{\blindtext}
  \item{\blindtext}
  \item{\blindtext}
  \item{\blindtext}
  \item{\blindtext}
\end{enumerate}
\end{document}

答案3

也许可以试试这个。几乎没有测试过,但似乎能达到人们的期望。

\documentclass[a4paper]{article}
% \usepackage{geometry}
\AddToHook{env/enumerate/begin}{\AddToHook{env/enumerate/begin}{\samepage}}%

\begin{document}

\begin{enumerate}
\item 2 + 2 = ? \\
filler\\
filler\\
filler\\
filler\\
filler\\
filler\\
filler\\
filler\\
filler\\
filler\\
filler\\
filler\\
filler\\
filler\\
filler\\
filler\\
filler\\
filler\\
filler\\
filler\\
filler\\
filler\\
filler\\
filler\\
  \begin{enumerate}
  \item 1
  \item 2
  \item 3
  \item 4
  \end{enumerate}

% I do not want to put this page break in manually:
% \newpage
\item Consider the joint probability distribution below:
filler\\
filler\\
filler\\
filler\\
filler\\
filler\\
filler\\
filler\\
\begin{center}
\begin{tabular}{|ccc|}
\hline 
 &
$X_{2}=0$ &
$X_{2}=1$\tabularnewline
\hline 
$X_{1}=0$ &
$\frac{1}{10}$ &
$\frac{3}{10}$\tabularnewline
\hline 
$X_{1}=1$ &
$\frac{2}{10}$ &
$\frac{4}{10}$\tabularnewline
\hline 
\end{tabular}
\par\end{center}

What is $P(X_{1}=1)$?
\begin{enumerate}
\item I do not know.
\item 4
\item 17
\item 88
\end{enumerate}

\item 2 - 2 + 5 =
filler\\
filler\\
filler\\
filler\\
filler\\
filler\\
filler\\
filler\\
filler\\
filler\\
filler\\
filler\\
filler\\
filler\\
filler\\
filler\\
filler\\
filler\\
filler\\
  \begin{enumerate}
  \item 1
  \item 2
  \item 3
  \item 4
  \end{enumerate}
\end{enumerate}

\end{document}

这将创建分页符,将所有文本从 移至What is $P(X_1=1)$?下一页。如果不使用 hack,分页符将出现在(b) 4和之间(c) 17

答案4

这是一种比较古老的风格,但是它很有效:

\def\RepItem#1{\OldItem\parbox[t]{\linewidth}{#1}}
\documentclass{文章}
\usepackage{blindtext}% 仅限 MWE
\usepackage{showframe}% 对齐工具

%\newcommand{\RepItem}[1]{\OldItem\parbox[t]{\linewidth}{#1}}
\AtBeginEnvironment{enumerate}{\let\OldItem=\item% 如果 enumerate 首先更改 \item
  \let\item=\RepItem
  \addtolength{\itemsep}{0pt 加 1fil}}
% 更改是本地枚举,但可以传递到嵌套环境

\开始{文档}
\开始{枚举}
  \item\盲文
  \item\盲文
  \item\盲文
  \item\盲文
  \item\盲文
\end{枚举}
\结束{文档}

相关内容