Do not repeat yourselves or DRY way of working with AMC

Version 9 (Pieter Van den Hombergh, 01/19/2013 12:06 am) → Version 10/14 (Pieter Van den Hombergh, 01/19/2013 12:06 am)

h1. Do not repeat yourselves or DRY way of working with AMC

I am from a object oriented software engineering school and one main principle of OO is _do not repeat yourselves_ (DRY principle), that is,
optimize your design in such a way that you do not duplicate (your work on) anything.
Some people could say it is a way of being lazy, which is fine by me, as long as you compensate that with sufficient cleverness.

The way I use AMC in multiple courses is a follows:

I keep all questions in separate files, organised by course and subject.
I also keep them in a version control system. At the moment that is subversion.

h2. Directory structure

Say I teach course LNX, MOD and SEN.
Then for instance my directory structure looks a lot like this.
<pre>

├── lnx
│   └── exam
│   ├── builds
│   │   ├── 20110624
│   │   └── 20120627
│   └── questions
│   ├── chap1
│   ├── chap2
│   ├── chap3
│   ├── chap4
│   ├── chap5
│   ├── chap6
│   └── chap7
├── mod
│   └── exam
│   ├── builds
│   └── questions
└── sen
└── exam
├── builds
└── questions
</pre>

I keep the question below the questions directory as in @lnx/exam/questions/chap1/cmdline1.tex@, which contain the normal
amc *question* and *questionmult* environments. I prepare the questions with a normal editor (I normally use _emacs_, yes, I am already that old).

h3. Role of files

For each exam that I build from this I create one *exam.tex*, one *questions.tex* and one *students.csv* file in a sub directory specific to the exam instance or exam event.
I have the convention to use date in short iso8601 format, so 20120627 would be for the exam on 27th of June 2012.

The *exam.tex* file defines all the things that describe the exam and these details are put mostly on the frontpage of each exam.
Think of date, time of the exam, target group, subject title, teachers name and such.

The *questions.tex* file is a more or less simple file with one line specifying the question and the AMC-element group (the element group is what AMC uses to randomize the question order). A *questions.tex* file for a typical exam contains 30 or 40 such lines.
A line looks like this:
<pre>
\element{general}{\inputQ{chap1/cmdline1.tex}}
</pre>
The macro <pre>\inputQ</pre> is no more then an abbrivation of <pre>\input{\QuestionBaseDir/#1}</pre>, of which *\QuestionBaseDir* is explained below.

Keeping the questions separate from the exam file eases the way to create this file, for instance from a spread-sheet or a database query and also eases the comparison with earlier exams,
so one can easily see if there is not to much overlap in questions for instance for a resit of an exam with (a subset) of the same audience.

The *students.csv* file contains the id's and names (and in my case also the exam language) for the participating students.

h2. Using the AMC gui with the above setup

I can run (and do it for testing purposes of the exams) pdflatex on the *exam.tex* file, but for a real production I use the MC-projects directory and the AMC gui to do all the
nice things that AMC provides.

To make this work I use a symbolic link *source.tex* pointing to *exam.tex* the tree explained above, for instance in the lnx exam that would be
<pre>
hom@threehundred:~/MC-Projects/lnx_20120629
$ ls -l
source.tex -> ../courses/lnx/exam/builds/20120629/exam.tex
</pre>
but you could point anywhere.
To make sure AMC (or more precisely, pdflatex) can find the files to link and include I define a few macros that help latex.
These macros are
<pre>
\def\CourseDir{/home/hom/fthv/lnx/exam}
\def\QuestionBaseDir{\CourseDir/questions}
\def\ExamInstanceDir{\CourseDir/builds/20120629}
</pre>

*\CourseDir* specifies the course, the *\QuestionsBaseDir* should be obvious as is the *\ExamInstanceDir*.
Note that they specify absolute paths, so that pdflatex can find them, where ever your working directory and latex process directory is.

I also symbolically link the students.csv to the MC-projects subdirectory.

To make this exam known to AMC, I start it via the gui and let I create a new *empty* exam with an appropriate name like +lnx_20120629+. Then I press edit exam file, which brings up my editor with a new _source.tex_ file. Source.tex is the default file that AMC uses and I am fine with this name.

I save that file and close the editor, cd (in a terminal window) to the +~/MC-projects/lnx_20120629+ subdirectory and create the symbolic link with
<pre>
ln -s ../courses/lnx/exam/builds/20120629/exam.tex source.tex
</pre>
This of course removes the auto generated source.tex file and replaces it with a link to the real exam file.

Back in the AMC guy I then complete all steps to create the pdf file, check the layouts, print the stuff and after the exam process all.

To make the automatic association and thus producing a personal exam per student, I use the macros as proposed by Alexis Bienvenüe in ticket #32.

The toyexam.zip attached to this page is a copy of my current collection of test questions, which we can freely use and distribute (unless you teach European topology,
then you might want to use the questions in a real exam). Anyway, they are the same kind of questions that the maintainers of AMC use to test various features and question type.


Use them freely as a base to clarify questions and answers with respect to this DRY way of working.

h3. Use of the toyexam

Unzip it somewhere conventient.
Create a new exam in the AMC gui e.g., toyexam1 and let the source.tex file point to the *.../toyexam/40_exam/builds/exam1/source.tex* file.
The names of the directories may differ a bit from the description above, but that is the internal convention we use in our institute.