Randex is a library that creates exams by randomizing multiple-choice questions selected from a user-defined pool of questions. The final exam is generated as a LaTeX document and compiled into a PDF. Multiple exams can be created at once.
Install randex:
pipx install randexDownload examples with questions:
randex download-examplesValidate the questions in the examples:
randex validate examples/en/folder_* -t examples/en/template-exam.yaml -o tmp --overwriteCreate a batch of exams with random questions:
randex batch "examples/en/folder_*" 5 -n 2 -t examples/en/template-exam.yaml -o tmp --overwrite --cleanCreate a csv file with random answers to the exams in the batch:
randex random-answers -e tmp/exams.yamlGrade the exams in the batch:
randex grade -e tmp/exams.yaml -g tmp/answers.csvRandex requires Python version 3.10 or higher and latexmk.
To install Randex, run:
pipx install randexIn order to compile the LaTeX files, you need to install latexmk,
From here:
Latexmk is a Perl script which you just have to run once and it does everything else for you... completely automagically.
and here
Latexmk is also available at CTAN at https://ctan.org/pkg/latexmk/, and is/will be
in the TeXLive and MiKTeX distributions.
If you have already Latex installed in your system, you will most
probably have already latexmk installed as well.
To download the latest examples from GitHub, run the following command:
randex download-examplesThis command validates a single question or all questions under a folder. Execute:
randex validate "examples/en/folder_*" -t examples/en/template-exam.yaml -o tmp --overwriteto validate all the questions under the folder examples/en that contains subfolders
with questions.
It will use the configuration from the file examples/en/template-exam.yaml.
The LaTeX compilation will run inside the tmp folder.
The --clean option will remove all intermediate files created by LaTeX,
and the -a flag will show the correct answers in the produced PDF.
Open the PDF file inside tmp to validate that all questions appear correctly.
Run:
randex validate --helpto see the help message for the command.
To create a batch of exams with random questions, execute:
randex batch "examples/en/folder_*" 5 -n 2 -t examples/en/template-exam.yaml -o tmp --overwrite --cleanThis command will create 5 exams using the questions inside the 3 folders with
names folder_0, folder_1, and folder_2 using the configuration from the file
examples/en/template-exam.yaml.
The --clean option will remove all intermediate files created by LaTeX.
The -n option specifies the number of questions randomly chosen from each folder.
It can appear once, meaning all folders will contribute the same number of questions,
or multiple times, e.g., -n 2 -n 1 -n 3, indicating the first folder will contribute
2 questions, the second folder will contribute 1 question, and the third folder will
contribute 3 questions.
The batch size (5 in this example) specifies the number of exams to create.
First create a batch of exams in a tmp folder.
Then create a csv file with random answers to the exams,
randex random-answers -e tmp/exams.yamlThen grade the exams,
randex grade -e tmp/exams.yaml -g tmp/answers.csvThe -n option can be used to specify the negative score for each wrong answer.
If not provided, the negative score is computed as 1 / (number of answers - 1)
for each question.
Set it to 0 to disable the negative scoring.
Randex requires two types of data files to create the exams.
The template-exam.yaml file is a YAML file that describes the LaTeX file that will
produce the exam. It contains the following keys:
documentclass(optional): String with the documentclass command of the file. Only theexamclass is supported. Default:\documentclass[11pt]{exam}
prebegin(optional): String containing everything that goes before the\begin{document}command. Default:\usepackage{amsmath} \usepackage{amssymb} \usepackage{bm} \usepackage{geometry} \geometry{ a4paper, total={160mm,250mm}, left=15mm, right=15mm, top=20mm, } \linespread{1.2} \pagestyle{head} \runningheadrule
postbegin(optional): String with all the commands right after the "\begin{document}" command. Default: empty string.preend(optional): String with all the commands right before the "\end{document}" command. Default: empty string.lhead(optional): String that is displayed on the left part of the head. Default: empty stringchead(optional): String that is displayed on the center part of the head. Default: empty string
The right part of the head is reserved for the serial number of the exam.
Each question is written in a YAML file with the following keys:
question(required): String with the question. Do not use double quotes around the string.answers(required): List of strings with the answers. Do not use double quotes around the strings.right_answer(required): Integer indicating the correct answer. The answer is non-negative and less than the length of theanswerslist.
The questions YAML files should be organized inside folders.
The randex commands take the template-exam.yaml file and the folders containing the questions as inputs.
Licensed under CC BY-NC 4.0. Commercial use is prohibited without prior permission.