我正在尝试从同一个来源生成同一份文档(课堂讲义)的两个版本:一个版本打印了答案,另一个版本留有空白,供学生写答案。我希望可以选择留出比答案占用的更多空白,或者不留,但无论哪种方式,文档的两个版本都应具有相同的整体布局。也就是说,一个问题和下一个问题之间的间隙在两个版本中应该始终相同,唯一的变化应该是答案是否在该间隙中可见。
这个问题底部的代码几乎有效。(我已经包含了所有看起来可能相关的 documentclass 和包设置。重要的部分是环境的定义solution
。)唯一的问题是有时文档的一个版本或另一个版本中存在多余的空格。我搞不清楚多余的空格是从哪里来的。(下面的示例用法可能会也可能不会显示该问题。)请告知如何使一个问题和下一个问题之间的垂直间距在两个版本中始终相同。请注意,解决方案环境可能会也可能不会包装在其他环境中(例如 anenumerate
或 a theorem
),并且无论如何它都需要保持一致。
我们还希望得到关于如何使代码主体不成为低级 TeX 基元、LaTeX 用户命令和计算操作的混合体的建议。
\documentclass[
version=3.11b,
12pt,
paper=letter,
BCOR=0pt,
headings=small
]{scrartcl}
\usepackage[T1]{fontenc}
\usepackage{pxfonts}
\usepackage{microtype}
\KOMAoptions{DIV=11}
\usepackage{calc}
\usepackage{xstring}
\usepackage{xcolor}
\definecolor{solutioncolor}{HTML}{6c71c4}
\newif\ifprintanswers
\IfSubStr{\jobname}{\detokenize{-soln}}
{\printanswerstrue}
{\printanswersfalse}
\newsavebox{\solnbox}
\newlength{\solnminheight}
\newlength{\solnskip}
\makeatletter
\newenvironment{solution}[1][\z@]
{\setlength{\solnminheight}{#1}
\setbox\solnbox\vtop\bgroup\color@setgroup\color{solutioncolor}}
{\color@endgroup\egroup
\par
\ifprintanswers
\setlength{\solnskip}
{\maxof{\z@}{\solnminheight - (\ht\solnbox + \dp\solnbox)}}%
\box\solnbox
\vspace*{\solnskip}%
\else
\setlength{\solnskip}
{\maxof{\solnminheight}{\ht\solnbox + \dp\solnbox}}%
\vspace*{\solnskip}%
\fi}
\makeatother
\begin{document}
As with a low sucking sound it slowly disappeared again, Starbuck
still gazing at the agitated waters where it had sunk, with a wild
voice exclaimed---``Almost rather had I seen Moby Dick and fought him,
than to have seen thee, thou white ghost!''
``What was it, Sir?'' said Flask.
\begin{solution}[2ex]
``The great live squid, which, they say, few whale-ships ever beheld,
and returned to their ports to tell of it.''
\end{solution}
But Ahab said nothing; turning his boat, he sailed back to the vessel;
the rest as silently following.
\end{document}