我可以执行以下操作:
\begin{samepage}
\begin{exercise}
Long text question or maybe a table and some stuff etc.
\end{exercise}
\end{samepage}
但我更希望实现这个自动化(因为我觉得这是可能的)。
我尝试声明一个新的练习环境。尝试按照软件包手册\tcolorbox
中的示例进行xsim
操作,但不起作用。
\documentclass[]{article}
\usepackage{xsim}
\usepackage{lipsum}
\DeclareExerciseEnvironmentTemplate{customex}
{%
\begin{samepage}
\subsection*
{%
{
\XSIMmixedcase{\GetExerciseName}%
\IfInsideSolutionTF
{
%\GetExerciseParameter{exercise-name}%
~\GetExerciseProperty{counter}.%
}
{%
~\GetExerciseProperty{counter}
\GetExercisePropertyT{subtitle}
{ {\normalfont\itshape\PropertyValue}}%
}%
}
}
}
{\end{samepage}}
\xsimsetup{exercise/template = customex}
\begin{document}
\begin{exercise}
\lipsum[1-4]
\end{exercise}
\begin{exercise}
\lipsum[1]
\end{exercise}
\end{document}
结果是练习 1 被分成 2 页,而不是期望的练习 1 在第 1 页,练习 2 在第 2 页。
答案1
我得到了很好的结果
\xsimsetup{
exercise/begin-hook = \begin{samepage},
exercise/end-hook = \end{samepage},
solution/begin-hook = \begin{samepage},
solution/end-hook = \end{samepage},
}
@cgnieder 使用 pre-hook/post-hook 的解决方案产生了奇怪的效果。
答案2
无需定义任何模板的最简单的方法是
\BeforeBeginEnvironment{exercise}{%
\begin{samepage}%
}
\AfterEndEnvironment{exercise}{%
\end{samepage}%
}
由于\samepage
“仅”进行一些惩罚设置,因此这无法确保您的练习始终保持一致。(例如,这对您的示例没有帮助)。
如果你想真的确保练习保持在一页上,并且如果您还确定练习不会超过一页,您可以使用minipage
:
\BeforeBeginEnvironment{exercise}{%
\noindent\begin{minipage}{\linewidth}%
}
\AfterEndEnvironment{exercise}{%
\end{minipage}\par
}
如果增加一些垂直空间可能会更好:
\documentclass{article}
\usepackage{xsim,lipsum}
\BeforeBeginEnvironment{exercise}{%
\vspace{3.5ex plus 1ex minus .2ex}
\noindent\begin{minipage}{\linewidth}%
}
\AfterEndEnvironment{exercise}{%
\end{minipage}\par
}
\begin{document}
\begin{exercise}
\lipsum[1-4]
\end{exercise}
\begin{exercise}
\lipsum[1]
\end{exercise}
\begin{exercise}
\lipsum[1]
\end{exercise}
\end{document}