假设我有一个环境\begin{sol} ... \end{sol}
用于编写测试练习的答案。出于实际原因,我希望两个或多个答案可以放在同一个页面中,但前提是它们的全部内容都只在这个页面上。
例如,如果练习 1 和 2 的解决方案只在同一页中,则可以将它们放在一起,但如果没有,则解决方案 1 必须是单独的,然后解决方案 2 必须从新的一页开始。
主要问题是解决方案的大小不固定,它们可能小于一页,也可能不止一页。它可能有一个小解决方案,后面跟着另一个小解决方案,也可能没有。
解决方案的数量也不是固定的。事实上,实际上我需要少于 10 个解决方案。
答案1
读过“不要将答案放在评论中”的说明后,这里是我的“\filbreak”答案作为答案。
\documentclass[12pt,a5paper]{article}
\usepackage[margin=20mm]{geometry}
\usepackage{lipsum}
\newenvironment{sol}{\paragraph{Solution:}}{\filbreak\bigbreak}
\begin{document}
\begin{sol} \lipsum[3] \end{sol}
\begin{sol} \lipsum[3] \end{sol}
\begin{sol} \lipsum[3-10] \end{sol}
\begin{sol} Very short one \end{sol}
\begin{sol} Very short one \end{sol}
\begin{sol} \lipsum[3] \end{sol}
\begin{sol} Very short one \end{sol}
\end{document}
答案2
这里有一种方法,可以允许解决方案长度超过一页。我们先排版它们,然后测量它们的高度,如果它们不适合当前页面,那么我们先发布一个\clearpage
。
\documentclass{article}
\usepackage{etoolbox,environ}
\newsavebox{\mytmpbox}
\newcounter{solution}
\NewEnviron{sol}{\setbox\mytmpbox\vbox{\bigskip
\stepcounter{solution}\noindent{\textbf{Solution~\thesolution.}} \BODY\par}%
\ifdimgreater{\ht\mytmpbox}{\pagegoal-\pagetotal}{\clearpage}{}%
\unvbox\mytmpbox\bigbreak
}
\usepackage{lipsum}
\begin{document}
\begin{sol}
\lipsum[1]
\end{sol}
\begin{sol}
\lipsum[2]
\end{sol}
\begin{sol}
\lipsum[3-10]
\end{sol}
\begin{sol}
\lipsum[11]
\begin{equation}
x = y
\end{equation}
\lipsum[12]
\end{sol}
\end{document}
这会将解决方案 1 和 2 放在第 1 页上,将解决方案 3 放在第 2 页的顶部并扩展到第 3 页,将解决方案 4 放在第 3 页的剩余空间中。
第 1 页:
第 2 和 3 页:
答案3
在下面的解决方案中,我为解决方案环境“设计”了一个非常简单的外观。您可以根据需要随意更改/自定义它。但是,样式对于解决方案来说并不重要,它只是将解决方案主体包装成\vbox
。这已经完成了工作。
在示例中,“解决方案 1”和“解决方案 2”可以保留在一页上,但“解决方案 3”不适合放在同一页上,因此它会跳转到下一页。
代码
\documentclass{article}
\usepackage{environ}
\usepackage{lipsum}
\newcounter{sol}
\providecommand{\solname}{Solution}
\NewEnviron{sol}{%
\parindent=0em
\par
\stepcounter{sol}
\vbox{%
\bgroup\itshape \solname\space\thesol.\egroup
\par
\BODY
}
\par\bigskip
}
\begin{document}
\begin{sol}
\lipsum[1]
\end{sol}
\begin{sol}
\lipsum[2]
\end{sol}
\begin{sol}
\lipsum[3-6]
\end{sol}
\end{document}
输出