我正在使用该exam
包来创建课程练习题,并尝试根据解决方案的长度动态地留下空白,而不是设置静态值。
考试包提供了一个选项,可以打印答案,或者在未打印答案时留出空白处供学生回答。此选项由以下命令设置:
\printanswers
或者
\noprintanswers
一个问题和一个解决方案的格式如下:
\begin{questions}
\question This is a question text
\begin{solution}[2in]
\begin{itemize}
\item First answer
\item Second answer
\item A hundred answers maybe
\end{itemize}
\end{solution}
\end{questions}
此处的解决方案空间定义在此行中:
\begin{solution}[2in]
我目前正在做的是设置一个名为的变量\solspace
,并将其用于文档中的每个解决方案。我也可以根据解决方案的长度手动为解决方案空间设置一个适当的值,但这不是最好的方法。
我想要做的是(理想情况下)计算解决方案需要多少空间(当\printanswers
)并使用这个值\solution[2in]
而不是静态值2in
。也可以以某种方式估计解决方案的长度并使用适当的空间长度。请注意,解决方案不仅限于项目或文本,可以是公式或图像。
关于如何解决这个问题有什么想法吗?
例子:
答案1
问题是,你真的不知道宽度\linewidth
是多少,直到你进入解决方案环境,那时已经太晚了。此外,手写比排版占用更多空间,虽然我想你可以乘以某个因子。
这假设所有解决方案的宽度相同,这是\the\linewidth
在之前的运行中发现的。我还测量了一个空解决方案的高度,以便版本\printanswers
和\noprintanswers
能够对齐。
\documentclass{exam}
\noprintanswers
\usepackage{showframe}
\newsavebox\tempbox% note: \solutionbox already used (environment)
\newlength\solutionwidth
\setlength{\solutionwidth}{433.1772pt}
\newlength{\emptyheight}
\setlength{\emptyheight}{41.74443pt}% height of empty solution (printed)
\begin{document}
\begin{questions}
\question This is a question text
\savebox\tempbox{\parbox[t]{\solutionwidth}{%
\begin{itemize}
\item First answer
\item Second answer
\item A hundred answers maybe
\end{itemize}}}%
\begin{solution}[\dimexpr \emptyheight+\ht\tempbox+\dp\tempbox]%
%\the\linewidth% used to set \solutionwidth
\usebox\tempbox
\end{solution}
\question Next question.
\end{questions}
\end{document}
这是一个两遍解决方案。它使用 将高度存储在辅助文件中\saveheight
,然后在下一遍中使用 将高度存储在\tempheight
中\getheight
。
\documentclass{exam}
\noprintanswers
\usepackage{showframe}% debugging tool
\newcounter{tempcount}
\newsavebox\tempbox% note: \solutionbox already used (environment)
\newlength{\tempheight}% reserve global register
\newlength{\emptyheight}
\setlength{\emptyheight}{41.74443pt}% height of empty solution (printed)
\makeatletter
\newcommand{\saveheight}[1]{% text for solution environment
\setbox\tempbox=\vbox{#1}%
\tempheight=\dimexpr \ht\tempbox+\dp\tempbox\relax
\immediate\write\@auxout{\string\newheight{\the\tempheight}}%
\unvbox\tempbox}
\newcommand{\newheight}[1]{% called automatically from aux file
\stepcounter{tempcount}%
\expandafter\gdef\csname height\thetempcount\endcsname{#1}}%
\newcommand{\getheight}{\stepcounter{tempcount}%
\@ifundefined{height\thetempcount}{\tempheight=1in}%
{\tempheight=\csname height\thetempcount\endcsname\relax}%
}
\makeatother
\AtBeginDocument{\setcounter{tempcount}{0}}% reset
\begin{document}
\begin{questions}
\question This is a question text
\getheight%
\begin{solution}[\dimexpr \emptyheight+\tempheight]
\saveheight{%
\begin{itemize}
\item First answer
\item Second answer
\item A hundred answers maybe
\end{itemize}}%
\end{solution}
\question Next question.
\end{questions}
\end{document}
答案2
永远不要对答题空间太严格。:) 有些孩子写得大,有些孩子写得小。有些孩子可以扩大答案,有些孩子可以缩小答案。如果我的孩子抱怨考试的布局,他们大多抱怨没有足够的空间来回答问题。
你可以像这样工作:
\documentclass{exam}
\printanswers
\begin{questions}
\question blablabla
\ifprintanswer
\begin{itemize}
\item \dotfill
\item \dotfill
\item \dotfill
\end{itemize}
\else
\begin{itemize}
\item the answer
\item the answer
\item the answer
\end{itemize}
\fi
\begin{questions}
\end{document}