我正在使用出色的 exsheets 包,并且我希望在测试的不同版本中有不同的问题顺序。也就是说,我想\variant{1}
打印一个顺序的问题,\variant{2}
打印另一个顺序的问题,等等。因此,给定一个文档,如下所示:
\documentclass[12pt]{article}
\usepackage{exsheets}
\SetVariations{2}
\variant{1}
\begin{document}
\begin{question}
foo
\end{question}
\begin{question}
bar
\end{question}
\begin{question}
baz
\end{question}
\end{document}
因为\variant{1}
我希望它呈现类似这样的效果:
Exercise 1.
foo
Exercise 2.
bar
Exercise 3.
baz
因为\variant{2}
我希望它按其他顺序呈现,所以说:
Exercise 1.
baz
Exercise 2.
bar
Exercise 3.
foo
我已经设法通过定义类似以下命令来实现类似的目的,\varyreversethree
其工作方式如下:
\documentclass[12pt]{article}
\usepackage{exsheets}
\SetVariations{2}
\variant{2}
\newcommand{\varyreversethree}[3]{\vary{#1#2#3}{#3#2#1}}
\begin{document}
\varyreversethree{
\begin{question}
foo
\end{question}
}{
\begin{question}
bar
\end{question}
}{
\begin{question}
baz
\end{question}
}
\end{document}
我不喜欢这个解决方案的某些方面是,我必须为可能被逆转的每种可能数量的事情定义一个新版本,并且我不能在参数之间(例如问题之间)留下任何空行,否则后面的参数会丢失。
在 exsheets 中有没有更好的方法可以做到这一点?
答案1
有了exsheets
继任者xsim
,这样的事情就有可能了:
\documentclass{article}
\usepackage{xsim}
\DeclareExerciseCollection{exam}
\begin{document}
\collectexercises{exam}
\begin{exercise}
foo
\end{exercise}
\begin{exercise}
bar
\end{exercise}
\begin{exercise}
baz
\end{exercise}
\collectexercisesstop{exam}
\printrandomexercises[sort=false,collection=exam]{3}
\end{document}
aux
上面示例的文件有
\XSIM {random}{a}{3,1,2}
删除aux
文件或手动更改此行中的数字顺序将导致另一个顺序。(也就是说,删除文件可能会导致与第一次相同的顺序……)。例如\XSIM {random}{a}{1,3,2}
现在给出:
如果您想要更好地控制练习的打印顺序,您可以执行以下操作:
\documentclass{article}
\usepackage{xsim,pgffor}
\DeclareExerciseCollection{exam}
\begin{document}
\collectexercises{exam}
\begin{exercise}
foo
\end{exercise}
\begin{exercise}
bar
\end{exercise}
\begin{exercise}
baz
\end{exercise}
\collectexercisesstop{exam}
\foreach \x in {3,1,2}{
\XSIMexpandcode{\printexercise{exercise}{\x}}
}
\end{document}