新编辑:magula 提出的答案曾经适用于 版本,但现在2.5
不再exam.cls
适用于当前版本2.603
。 以下内容作为 版本的注释包含在内2.601
:“我们更改了代码中的命令和环境名称,这些代码来自 exam.cls 中包含的 framed.sty(略作修改),以便用户可以说 \usepackage{framed} 而不会产生冲突。这还允许用户使用加载 framed.sty 的软件包,例如 minted.sty。”我不确定现在所做的更改是否会使当前给出的答案/破解变得无用,但它只是不再起作用了。
问题:能TheSolution
更新环境,使得为解决方案提供的框架框不会分解为不同页面上的单独框,如图所示这个问题。
代码
\documentclass[answers]{exam}
\usepackage{lipsum}
\usepackage{mdframed}
\def\MakeFramed#1{\begin{mdframed}}
\def\endMakeFramed{\end{mdframed}}
\begin{document}
\begin{questions}
\question A short question.
\begin{solution}
A short solution.
\end{solution}
\question A question with a long solution.
\begin{solution}
The long solution continues onto another page: \lipsum[1-8]
\end{solution}
\end{questions}
\end{document}
产生如下分页符
而不是以下期望的外观:
在手册,第 74 页,其中提到,可以\renewenvironment
通过更改 的定义来完全自定义解决方案环境TheSolution
。我的问题是如何才能使框架以上面指示的所需方式延伸到下一页,以及此问题开头链接的问题。
答案1
使用新版本,您需要更改以重新实现原始解决方案的命令是exam@MakeFramed
和endexam@MakeFramed
所以你应该改变
\def\MakeFramed#1{\begin{mdframed}}
\def\endMakeFramed{\end{mdframed}}
到
\makeatletter
\def\exam@MakeFramed#1{\begin{mdframed}}
\def\endexam@MakeFramed{\end{mdframed}}
\makeatother
这是 TeX 中命名空间的一个经典示例,其中私有宏的名称以其所属包的名称作为前缀。
答案2
只需重新定义TheSolution
环境似乎就mdframed
可以了。您可以添加标题“解决方案:”,并提供额外的垂直间距以匹配原始样式:
带有分页符
\documentclass[answers]{exam}
\usepackage{lipsum}
\usepackage{mdframed}
\renewenvironment{TheSolution}{\begin{mdframed}[skipabove=\baselineskip,innertopmargin=\baselineskip,innerbottommargin=\baselineskip]
\textbf{Solution:}\enspace\ignorespaces}{\end{mdframed}}
\begin{document}
\begin{questions}
\question A short question.
\begin{solution}
A short solution.
\end{solution}
\question A question with a long solution.
\begin{solution}
The long solution continues onto another page: \lipsum[1-8]
\end{solution}
\end{questions}
\end{document}
答案3
\usepackage{mdframed}
\def\MakeFramed#1{\begin{mdframed}}
\def\endMakeFramed{\end{mdframed}}
这只是用 mdframed 命令替换 TheSolution 在内容开始和结束时使用的命令。