过去几年,我构建了大量数学问题,这些问题存储在各种外部文件中。我通过 probsoln 包访问它们进行测验。
我通常使用相当多的随机生成的值来构造问题。当我尝试使用“第二遍”建议(第一遍生成测验,第二遍生成答案)来获取解决方案时,问题就出现了。
这是一个非常简短的 MWE。
\documentclass{article}
\usepackage{probsoln}
\newcounter{firstNum}
\newcounter{secondNum}
\newcounter{answerNum}
\begin{document}
\hideanswers
\loadallproblems{MWEQuestions}
Quiz:
\begin{enumerate}
\foreachproblem{%
\item \thisproblem
}
\end{enumerate}
\medskip
Answer Key:
\showanswers
\begin{enumerate}
\foreachproblem{%
\item \thisproblem
}
\end{enumerate}
\end{document}
问题存储在外部文件中,格式如下:
\newproblem{question1}{%
\random{firstNum}{1}{5}
\random{secondNum}{6}{10}
\defcounter{answerNum}{\thefirstNum+\thesecondNum}
\(\thefirstNum + \thesecondNum=\)
}{%
\thefirstNum+\thesecondNum = \theanswerNum
}
运行时,输出如下所示:
测验:
- 2 + 9 =
答案:
4 + 10 =
解决方案:4 + 10 = 14
显然,第二次迭代已经重新随机化了计数器值。我需要某种方法来防止所选值被覆盖,以便在生成解决方案时可以访问它们。
另一个(可能的)问题是,我的大多数问题都重复使用相同的计数器。因此,问题 2 的定义也会为计数器分配随机值。因此,这不仅仅是为了防止解决方案覆盖计数器值,而且是为了防止下一个问题。
谢谢你提供的所有帮助!
[编辑]
我可能找到了解决方案。它适用于我的 MWE,但在发布之前,我想在稍微更强大的设置中测试它。
答案1
以下代码似乎可行,至少对于简单情况而言。第一个代码块是测验本身。它打开一个写入流并从外部文件加载问题。第二个代码块是包含问题的文件,这是实际写入和读取解决方案的地方。
\documentclass{article}
\usepackage{probsoln}
\newwrite\answerfile %Going to store current values in an external file
%Counters to hold randomly generated values for the math questions
\newcounter{firstNum}
\newcounter{secondNum}
\newcounter{answerNum}
\begin{document}
\immediate\openout\answerfile=MWEAnswers.tex %Write to the files immediately
\loadallproblems{MWEQuestions} %Load all problems from external file
%Start typesetting the quiz questions
Quiz:
\begin{enumerate}
\foreachproblem{% %Iterates through the loaded problems
\item \thisproblem %Typesets the current problem
}
\end{enumerate}
\immediate\closeout\answerfile %Done writing to the answer file
\medskip
\immediate\openin\answerfile=MWEAnswers.tex %Now we want to read from the answer file
\showanswers %Boolean to allow typesetting the answers
% Start Answer Key
Answer Key:
\begin{enumerate}
\foreachproblem{ %Again, iterate through the loaded problems
\item \thisproblem
}
\end{enumerate}
\end{document}
这是问题文件的代码。请注意,为了确保多个问题不会引起问题,问题包含两个单独问题的定义。就代码而言,它们是相同的(除了一个是加法问题,另一个是减法问题)。
\newproblem{question1}{ %Define Question 1
\random{firstNum}{1}{5} %Randomly generate values
\random{secondNum}{6}{10}
\defcounter{answerNum}{\thefirstNum+\thesecondNum} %Calculate answer
\begin{onlyproblem} %This code only runs if the answers
%are NOT being typeset
\(\thefirstNum + \thesecondNum=\) %Typeset the question for the quiz
%Write question to external answer file
\immediate\write\answerfile{\thefirstNum+\thesecondNum=\theanswerNum}
\end{onlyproblem}
}{ %This reads in the solution.
\read\answerfile to \fileline
$\fileline$
}
%%% Second Question--Code Identical to the First
\newproblem{question2}{% % Define Question 2
\random{firstNum}{1}{5}
\random{secondNum}{6}{10}
\defcounter{answerNum}{\thefirstNum-\thesecondNum}
\begin{onlyproblem}
\(\thefirstNum - \thesecondNum=\) % Print the question
\immediate\write\answerfile{\thefirstNum-\thesecondNum=\theanswerNum}
\end{onlyproblem}
}{%
\read\answerfile to \fileline
$\fileline$
}
此代码的输出为