我有一个创建练习的框架,其中每个子问题的解决方案的内容被输入到一个\solution
宏中,只有当全局布尔值设置为 true 时才会显示其内容。
我感兴趣的是,有解和无解的版本都有独特的方程式/图形/表格/列表编号。特别是,我需要考虑解决方案中的计数器是否增加。这样做的好处是,学生在解决方案中可能引用的方程式编号(和其他东西)在解决方案稍后发布后不会改变其编号。
我第一次尝试这样做是尝试将所有内容排版到未打印的框中(例如,通过\sbox
或通过lrbox
-environment) - 希望这实际上会增加计数器 - 但我已经遇到了equation
环境麻烦。
下面是一个 MWE,其中欧拉公式应该(3)
对切换的两种设置都有方程编号。要使无解版本工作,必须注释掉inwith_solution
的第三个参数(内容) 。\iftoggle
\solution
编辑:规避该问题的一个解决方案是将所有相关计数器置于子问题之下,因为这样公式中的出现就是第一次,因此必然是唯一的(因为公式出现在两个版本中 - 有和没有解决方案)。但是,这对我来说不是一个有趣的解决方案,因为实际上(与简化的 MWE 相比),我的方程式对于(5.3.2)
练习 5 中问题 3 的方程 2 已经看起来像,而子问题看起来像“5.3a)”、“5.3b)”等(做出一致的符号 - 即(5.3a.2)
- 对我来说没有吸引力)。将计数器置于problem
无济于事,因为在每个子问题的不同公式之间,解决方案能够增加不同的计数器,这些计数器不会通过调用重置\subproblem
。
\documentclass{article}
\usepackage{etoolbox}
\usepackage{amsmath}
\usepackage{xparse}
\newtoggle{with_solution}
\newsavebox\tempbox
\NewDocumentCommand{\solution}{+m}{
\iftoggle{with_solution}{
\par\medskip\noindent\textbf{Solution:} #1
}
{
% \sbox\tempbox{#1}
\begin{lrbox}\tempbox
#1
\end{lrbox}
}
}
% \problem and \subproblem cut to bare bones for simplicity
\newcommand{\problem}[1]{\section{#1}}
\newcounter{subproblem}
\newcommand{\subproblem}{\par\medskip\noindent\stepcounter{subproblem}{\bfseries\alph{subproblem})}\quad}
\toggletrue{with_solution} % Set to true to include solution
%\togglefalse{with_solution} % Set to false to exclude solution
\begin{document}
\problem{A Problem}
\subproblem Problem Formulation
\solution{Solution}
\subproblem Problem Formulation with \eqref{eq:prb}
\begin{equation}\label{eq:prb}
a=b
\end{equation}
\solution{Solution with \eqref{eq:sol}
\begin{equation}\label{eq:sol}
x=y
\end{equation}
}
\subproblem Problem Formulation with \eqref{eq:prb2}, having the same number both with or without typesetting the solutions.
\begin{equation}\label{eq:prb2}
\mathrm{e}^{2\pi\mathrm{i}}=1
\end{equation}
\solution{The \texttt{$\backslash$solution}-macro should be able to handle \texttt{$\backslash$par}'s, figures, tables, listings (and also increase their counters accordingly, even when not typeset)...}
\end{document}
答案1
另一种方式
\NewDocumentCommand{\solution}{+m}{
\iftoggle{with_solution}
{\par\medskip\noindent\textbf{Solution:} #1\par}
%{\setbox\tempbox=\vbox{#1}}} % this line comes from egreg's comment
% The following line is my alternative
{\par\vbox to0cm{\vspace*{\paperheight}\medskip\noindent\textbf{Solution:} #1\vspace*{-\paperheight}}\par}}
请注意,像 这样的命令\addtocontents
是在输出例程期间执行的。因此,在我的答案中,\listoffigure
包含所有图形,无论它们是否显示。(事实上它们已经显示了……)而 egreg 的答案产生了\listofshownfigure
。
对于间距
处理负空间并不好玩。我想把它放在一边。实验表明,其\par\marginpar{}\par
表现为\par
。
\NewDocumentCommand{\solution}{+m}{
\iftoggle{with_solution}
{\par\medskip\noindent\textbf{Solution:} #1\par}
%{\setbox\tempbox=\vbox{#1}}} % this line comes from egreg's comment
% The following line is my alternative
{\par\marginpar{\moveright\paperwidth\vbox to0cm{\medskip\noindent\textbf{Solution:} #1}}\par}}