我正在尝试设置一个 LaTeX 文档,该文档可创建考试的多个版本。我正在考虑在文档的早期定义一个整数变量,然后根据该变量的模数使用 switch-case 构造。
类似 C 的伪代码如下所示:
switch(integervariable % 3){
case 0: What is your name?
case 1: What is your quest?
case 2: What is your favorite color?
}
我怎样才能在 LaTeX 中实现这样的构造?
理想情况下,构造可以自行识别案例的数量。
答案1
\ifcase
可以使用原语。模数必须通过更复杂的公式来计算,因为运算/
符会进行舍入,而不会截断。
\newcount\integervariable
\integervariable=7
\ifcase\numexpr \integervariable - 3*((\integervariable+2)/3 -1) \relax
case 0: What is your name?\or
case 1: What is your quest?\or
case 2: What is your favorite color?\fi
如果要设置通用“模数”,则实现会更加复杂,因为/
运算符会根据零进行对称舍入,很遗憾没有截断。
如果您想从命令行设置一个整数值,那么另一种方法(使用\def\ivalue
)更为舒适。
如果要打印\def
ed,\ivalue
请使用 。如果要从上一个示例\ivalue
打印,请使用。\integervalue
\the\integervalue
\ifx\ivalue\undefined \def\ivalue{7}\fi
\def\imodul{4}
\def\modulo#1#2{\ifnum#1=0 0\else(#1-#2*((2*#1-#2)/(2*#2)))\fi}
\ifcase\numexpr \modulo\ivalue\imodul \relax
case 0: What is your name?\or
case 1: What is your quest?\or
case 2: What is your favorite color?\or
case 3: If you need something more, open new tread...\else
other cases\fi
\bye
\ivalue
您可以从 Unix 命令行设置:
pdftex '\def\ivalue{5} \input' document
答案2
有点“固定”随机化?
在这里,首先定义一组问题,然后\makeexam
使用整数参数调用n。
该命令将选择项目n对问题数量取模(实际上通过顺序反转来避免 0 的问题)。
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\tl_new:N \g_shuhalo_exam_questions_tl
\int_new:N \g_shuhalo_exam_modulo_int
\NewDocumentCommand{\cquestion}{m}
{
\item
\tl_item:nn { #1 }
{
\tl_count:n { #1 } - \int_mod:nn { \g_shuhalo_exam_modulo_int }{ \tl_count:n { #1 } }
}
}
\NewDocumentEnvironment{setexam}{b}
{
\tl_gset:Nn \g_shuhalo_exam_questions_tl { #1 }
}{}
\NewDocumentCommand{\makeexam}{m}
{
\int_gset:Nn \g_shuhalo_exam_modulo_int { #1 }
\begin{enumerate}
\tl_use:N \g_shuhalo_exam_questions_tl
\end{enumerate}
}
\ExplSyntaxOff
\begin{setexam}
\cquestion{
{What's your name?}
{What's your quest?}
{What's your favorite color?}
}
\cquestion{
{Who's your favorite actor?}
{What's your favorite pet?}
{Can pigs fly?}
{What's the ultimate question to life, universe and everything?}
}
\end{setexam}
\begin{document}
\section{exam}
\makeexam{1}
\section{exam}
\makeexam{2}
\section{exam}
\makeexam{3}
\section{exam}
\makeexam{4}
\section{exam}
\makeexam{5}
\section{exam}
\makeexam{6}
\end{document}