我有一系列问题。每个问题都有一些开头文字,然后是嵌套的枚举。下面我给出了一个示例,该示例导致 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{枚举} \结束{文档}