summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/qcm/qcm.dtx
blob: 5a0f89f1edc43142a532198a528ebb7545723360 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
% \iffalse                                                 -*- mode: LaTeX -*-
%
% qcm.dtx --- Doc file for QCM (code and documentation)
%
% Copyright (C) 2004 Didier Verna.
%
% PRCS: $Id: qcm.dtx 1.10.1.15 Sat, 27 Nov 2004 17:03:01 +0100 didier $
%
% Author:        Didier Verna <didier@lrde.epita.fr>
% Maintainer:    Didier Verna <didier@lrde.epita.fr>
% Created:       Mon Dec 18 10:18:50 2000
% Last Revision: Tue Nov  9 17:47:21 2004
%
% This file is part of QCM.
%
% QCM may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either version 1.1
% of this license or (at your option) any later version.
% The latest version of this license is in
% http://www.latex-project.org/lppl.txt
% and version 1.1 or later is part of all distributions of LaTeX
% version 1999/06/01 or later.
%
% QCM consists of the files listed in `README'.
%
%
% Commentary:
%
% Contents management by FCM version 0.1-b2.
%
%
% Code:
%
%<*driver>
\documentclass[a4paper]{ltxdoc}
% \OnlyDescription
% \CodelineIndex
% \RecordChanges
\begin{document}
\DocInput{qcm.dtx}
\end{document}
%</driver>
%
% \fi
%
% \catcode`\¡=14
% \CheckSum{557}
%% \CharacterTable
%%  {Upper-case    \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
%%   Lower-case    \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
%%   Digits        \0\1\2\3\4\5\6\7\8\9
%%   Exclamation   \!     Double quote  \"     Hash (number) \#
%%   Dollar        \$     Percent       \%     Ampersand     \&
%%   Acute accent  \'     Left paren    \(     Right paren   \)
%%   Asterisk      \*     Plus          \+     Comma         \,
%%   Minus         \-     Point         \.     Solidus       \/
%%   Colon         \:     Semicolon     \;     Less than     \<
%%   Equals        \=     Greater than  \>     Question mark \?
%%   Commercial at \@     Left bracket  \[     Backslash     \\
%%   Right bracket \]     Circumflex    \^     Underscore    \_
%%   Grave accent  \`     Left brace    \{     Vertical bar  \|
%%   Right brace   \}     Tilde         \~}
%
% ^^A $Format: "% \\newcommand{\\version}{v$Version$}"$
% \newcommand{\version}{v2.1}
% ^^A $Format: "% \\newcommand{\\classreleasedate}{$ClassReleaseDate$}"$
% \newcommand{\classreleasedate}{2004/11/27}
% ^^A $Format: "% \\newcommand{\\stylereleasedate}{$StyleReleaseDate$}"$
% \newcommand{\stylereleasedate}{2004/11/27}
% ^^A $Format: "% \\newcommand{\\packagecopyright}{$LaTeXCopyright$}"$
% \newcommand{\packagecopyright}{Copyright \copyright{} 2004 Didier Verna}
% \newcommand{\qcm}{\textsf{QCM}}
% \newcommand{\auctex}{AUC-\TeX}
% \date{\today}
% \title{\qcm{} -- A \LaTeXe{} package for making \textbf{M}ultiple
%        \textbf{C}hoices \textbf{Q}uestionnaires\thanks{This document
%        describes \qcm{} \version, class release date \classreleasedate,
%        style release date \stylereleasedate.}}
% \author{Didier Verna\\
% \texttt{mailto:didier@lrde.epita.fr}\\
% \texttt{http://www.lrde.epita.fr/\~{}didier}}
% \maketitle
%
% \begin{abstract}
% \qcm{} is a package for making multiple choices questionnaires
% (``\textsc{QCM}'' is the corresponding French acronym) under \LaTeXe. A
% special environment allows you to define questions and possible answers. You
% can specify which answers are correct and which are not. \qcm{} not only
% formats the questions for you, but also generates a ``form'' (a grid that
% your students will have to fill in), and a ``mask'' (the same grid, only
% with correct answers properly checked in). You can then print the mask on a
% slide and correct the questionnaires more easily by superimposing the mask
% on top of students' forms.\par
% The \qcm{} package is \packagecopyright{}, and distributed under the terms
% of the LPPL license.
% \end{abstract}
%
% \section{Using \qcm{} (attention users of version 1)}
% As of version 2.0, \qcm{} comes both in style and class form. The style
% provides all the basic features: making questions, generating the form and
% the mask\ldots You can use it with any class you want, which is useful when
% you want to incorporate multiple choice questions in a larger document (a
% full exam for instance).\par
% If you want to make simple multiple choice questionnaires, with just a list
% of questions, you can alternately use the class which provides some basic
% formatting on top of the style itself.
%
% \section{The \qcm{} Style}
% First of all, please note that \qcm{} requires the packages \texttt{ifthen},
% \texttt{calc} and \texttt{tabularx}. As of version 2.1, the
% \texttt{verbatim} package is also required. You don't have to require these
% packages explicitly though. As long as \LaTeXe{} is able to locate them,
% they will be used automatically.\par
% In order to use the \qcm{} style, say |\usepackage[|\meta{options}|]{qcm}|
% in the preamble of your document. The available options are described along
% the text, where appropriate.
%
% \subsection{Creating Questions}
% Here's a simple example demonstrating how to produce a new question:
% \begin{verbatim}
% \begin{question}{What is the color of Henri the Fourth's white horse?}
%   \false black,
%   \true white,
%   \false yellow,
%   \false red.
% \end{question}
% \begin{correction}
% The correct answer is white, because it's in the question.
% \end{correction}
% \end{verbatim}
%
% \subsubsection{The \texttt{question} environment}
% \DescribeEnv{question}
% The |question| environment allows you to insert questions into your
% document. It takes one mandatory argument which specifies the actual
% question's text. The question will be displayed in a frame box, the size of
% the line.\par
% \DescribeMacro{\true}\DescribeMacro{\false}
% The proposed answers are displayed below the question in a list fashion (the
% |question| environment is a list-based one). Instead of using |\item|
% however, use either |\true| or |\false| to insert a possible answer.\par
%
% \subsubsection{Question Numbers}
% The |question| environment is associated with a \LaTeX{} counter named
% |question|. This counter stores the number of the next (or current)
% question. It is initialized to 1, and automatically incremented at the end
% of |question| environments. You might want to use it to format question
% titles. For instance, you could decide that each question belongs to a
% subsection in the |article| class, and use something like this before each
% question: |\subsection*{Question \thequestion}|
%
% \subsection{The Form and the Mask}
% Based on the questions appearing in your document, \qcm{} has the ability to
% generate a ``form'' (a grid that your students will have to fill in), and a
% ``mask'' (the same grid, only with correct answers properly checked in).
% This can make the correction process easier.\par
% \DescribeMacro{\makeform}
% \DescribeMacro{\makemask}
% To generate a form and a mask, use the macros |\makeform| and |\makemask|.
% \qcm{} uses two auxiliary files to build them. These files have respectively
% an extension of \texttt{frm} and \texttt{msk}. If you use these macros, you
% will need two passes of \LaTeXe{} in order to get a correctly formatted
% document.\par
%
% \subsection{Typesetting corrections}
% \DescribeEnv{correction}
% As of version 2.1, \qcm{} comes with a ``correction'' mode which allows you
% to automatically typeset and distribute corrections to your students. These
% corrections are slightly modified versions of your questionnaire: each
% possible answer is prefixed with a small symbol (a visual clue) indicating
% whether the answer was correct or wrong. In addition, you can typeset
% explanations below each question.\par
% To activate the correction mode, use the |correction| option. It is off by
% default.\par
% To typeset explanations below the questions, use the |correction|
% environment (no argument). The contents of this environment is displayed
% only in |correction| mode. In normal mode, it is simply discarded.\par
% In addition, note that \qcm{} cancels the actions performed by |\makeform|
% and |\makemask| in |correction| mode. This is to avoid further edition of
% the source when typesetting a correction.
%
% \subsection{Important Note}
% Currently, \qcm{} requires that you provide a constant number of proposed
% answers across all questions in your \textsc{QCM}. This is something natural
% when you want to build forms, but this might me too restrictive otherwise,
% I'm not sure, so it is possible that this restriction will be removed in
% future versions.\par
% Currently, there is a built-in mechanism for checking that the number of
% proposed answers remains constant: when \qcm{} encounters the first
% occurrence of the |question| environment, it remembers the number of proposed
% answers from there. Afterwards, any noticed difference in subsequent
% occurrences will generate an error. As a consequence, you never have to tell
% \qcm{} explicitly what that number is.
%
% \subsection{Customizing the \qcm{} style}
% \subsubsection{The question environment}
% \DescribeMacro{\questionspace}
% |\questionspace| is the amount of extra vertical space to put under the
% question, before the list of proposed answers. This is a \LaTeX{} length
% that defaults to \texttt{0pt}.\par
% \DescribeMacro{\answerstitlefont}
% Before the list of possible answers, a short title is displayed (for
% English, it reads ``Possible answers:''). The |\answerstitlefont| macro
% takes one mandatory argument which redefines the font to use for the answers
% title. By default, |\bfseries| is used.\par
% \DescribeMacro{\answernumberfont}
% Each proposed answer in the list is numbered automatically (and
% alphabetically). The |\answernumberfont| macro takes one mandatory argument
% which redefines the font to use for displaying the answer number. By
% default, |\bfseries| is used.\par
%
% \subsubsection{The Form and the Mask}
% \DescribeMacro{\headerfont}
% The |\headerfont| macro takes one mandatory argument which redefines
% the font to use for the headers (first line and first column) of the form
% and mask arrays. By default, |\bfseries| is used.\par
% \DescribeMacro{\X}
% In the mask, correct answers are checked in by filling the corresponding
% cell with an ``X'' character. If you want to change this, call the |\X|
% macro with one (mandatory) argument.
%
% \subsubsection{The correction}
% \DescribeMacro{\truesymbol}
% \DescribeMacro{\falsesymbol}
% In correction mode, labels in front of answers are modified to give a visual
% clue about whether the answer was correct or wrong. By default, a cross and
% a small arrow are used. You can change these symbols by using the
% |\truesymbol| and |\falsesymbol| macros. For instance, you could give a
% fancier look to your correction by using the |pifont| package and issuing:
% \begin{verbatim}
% \truesymbol{\ding{'063}~}
% \truesymbol{\ding{'067}~}
% \end{verbatim}
% \DescribeMacro{\correctionstyle}
% The appearance of the contents of the |correction| environment can be
% adjusted by using the |\correctionstyle| macro. By default, |\itshape| is
% used.
% \subsubsection{Internationalization}
% \DescribeEnv{english}
% \DescribeEnv{french, francais}
% \qcm{} currently supports English, and French. You can select the language
% you want to use by using the corresponding option. The \texttt{french} and
% \texttt{francais} options are synonyms. If you want a finer grain on the
% language-dependent parts of \qcm, the following macros are provided.\par
% \DescribeMacro{\answerstitle}
% This macro takes one mandatory argument which lets you redefine the
% answers'titles. For English, the answers title defaults to
% ``Possible answers:''.\par
%
%
% \section{The \qcm{} Class}
% The \qcm{} class provides a wrapper around the style to allow you to format
% simple multiple choice questionnaires, with just a list of questions.\par
% In order to use the \qcm{} class, say
% |\documentclass[|\meta{options}|]{qcm}| at the beginning of your document.
% The available options are described along the text, where appropriate. Note
% that the underlying \qcm{} style is loaded automatically.
%
% \subsection{Standard Class Features}
%
% \subsection{Page Size and layout}
% \DescribeEnv{a4paper}
% \DescribeEnv{a5paper}
% \DescribeEnv{b4paper}
% \DescribeEnv{letterpaper}
% \DescribeEnv{legalpaper}
% \DescribeEnv{executivepaper}
% \DescribeEnv{landscape}
% The \texttt{a4}, \texttt{a5}, \texttt{b4}, \texttt{letter}, \texttt{legal}
% and \texttt{executive}  ``paper'' options allow you to select the type of
% page format you want. By default, \texttt{letterpaper} is used. The
% \texttt{landscape} options switches the horizontal and vertical settings.
% I'm not sure why I propose this option. Nobody wants to write a \textsc{QCM}
% in landscape mode, right?\par
%
% \DescribeEnv{oneside}
% \DescribeEnv{twoside}
% \qcm{} also supports the standard \texttt{oneside} and \texttt{twoside}
% class options. By default, \texttt{oneside} is used. In \texttt{twoside}
% mode, odd and even pages have a different geometry and headings layout.
%
% \subsection{Font Size}
% \DescribeEnv{10pt}
% \DescribeEnv{11pt}
% \DescribeEnv{12pt}
% The \texttt{10pt}, \texttt{11pt} and \texttt{12pt} options let you choose
% the size of the default font you want to use. By default, \texttt{10pt} is
% used.
%
% \subsection{Output Mode}
% \DescribeEnv{final}
% \DescribeEnv{draft}
% In \texttt{draft} mode, a black rule will be drawn at the end of overfull
% lines (as done by standard classes).
%
% \subsection{Page styles}
% \qcm{} supports the standard \LaTeX{} page style mechanism. Available styles
% are \texttt{empty}, \texttt{plain}, \texttt{headings} and
% \texttt{myheadings}. These styles have their usual meaning, except that
% there are no sectioning commands in the \qcm{} class. By default, the page
% style is \texttt{plain}. Also, note that the form and the mask have an empty
% page style, whatever the setting for the rest of the document.
%
% \subsection{Title}
% \DescribeMacro{\title}
% The |\title| macro takes one mandatory argument which defines a title for
% your questionnaire (repeated on the form and the mask). It can be used in
% the document's preamble only. The title will be centered on the page.\par
% \DescribeMacro{\titlefont}
% The |\titlefont| macro takes one mandatory argument which redefines the
% font to use for the title. By default, |\LARGE\bfseries| is used.\par
% \DescribeMacro{\titlespace}
% |\titlespace| is the amount of extra vertical space to put after the title.
% This is a \LaTeX{} length that defaults to \texttt{20pt}.\par
% \DescribeMacro{\maketitle}
% If you have defined a title, make it appear by calling |\maketitle| after
% the beginning of your document. If you call |\maketitle| without having
% defined a title, an error will be generated.
%
% \subsection{Modifications to the question environment}
% The \qcm{} class modifies the |question| environment so as to display a
% title before each question (something that you would probably do with a
% sectioning command in other classes). This title is displayed in a frame
% box, the size of a quarter of the line. For English, the default reads
% ``Question n.\meta{X}:''.\par
%
% \subsection{Modifications to \cs{makeform} and \cs{makemask}}
% The \qcm{} class modifies |\makeform| and |\makemask| along the following
% lines: each grid is printed on a page of its own, and the document's title
% is repeated on top of each. Also, the page style is set to |empty|.
%
% \subsection{Customizing the \qcm{} class}
% \subsubsection{The question titles}
% \DescribeMacro{\questiontitlefont}
% The |\questiontitlefont| macro takes one mandatory argument which redefines
% the font to use for each question title. By default, |\bfseries| is
% used.\par
% \DescribeMacro{\questiontitlespace}
% |\questiontitlespace| is the amount of extra vertical space to put after the
% question title (and before the questions' text). This is a \LaTeX{} length
% that defaults to \texttt{5pt}.\par
% \DescribeMacro{\questionsepspace}
% In addition, questions are separated from each other by some vertical space.
% |\questionsepspace| is the amount of extra vertical space to put between
% each question block. This is a \LaTeX{} length that defaults to
% \texttt{20pt}.
%
% \subsubsection{Internationalization}
% \DescribeEnv{english}
% \DescribeEnv{french, francais}
% \qcm{} currently supports English, and French. You can select the language
% you want to use by using the corresponding option. The \texttt{french} and
% \texttt{francais} options are synonyms. If you want a finer grain on the
% language-dependent parts of \qcm, the following macros are provided.\par
% \DescribeMacro{\questiontitle}
% This macro takes one mandatory argument which lets you redefine the
% questions'titles. For English, the question title defaults to
% ``|Question N.\thequestion:|''.\par
%
%
% \section{\auctex{} support}
% \auctex{} is a powerful major mode for editing \TeX{} documents in
% \textsf{Emacs} or \textsf{XEmacs}. In particular, it provides automatic
% completion of macro names once they are known. \qcm{} supports \auctex{}
% by providing a style file named \texttt{qcm.el} which contains \auctex{}
% definitions for the relevant macros. This file should be installed to a
% location where \auctex{} can find it (usually in a subdirectory of your
% \LaTeX{} styles directory). Please refer to the \auctex{} documentation for
% more information on this.\par
% For people already knowing \auctex: note that the \auctex{} command
% \texttt{LaTeX-insert-item} (usually bound to \texttt{M-Ret}) inserts
% |\false| by default in a \textsc{QCM}, since it replaces |\item|. If you
% want to insert a |\true|, use a prefix.
%
% \StopEventually{\par Well, I think that's it. Enjoy using \qcm{}!
%   \vfill\hfill\small\packagecopyright{}.}
%
% \iffalse
%<*qcmstyle>
% \fi
% \section{Style Code}
%    \begin{macrocode}
\NeedsTeXFormat{LaTeX2e}
¡ $Format: "\\ProvidesPackage{qcm}[$StyleReleaseDate:$ v$Version$"$
\ProvidesPackage{qcm}[2004/11/27 v2.1
                      Multiple Choice Questionnaire style for LaTeX2e]

\RequirePackage{ifthen}
\RequirePackage{calc}
\RequirePackage{verbatim}
\RequirePackage{tabularx}

%    \end{macrocode}
% \subsection{The Form and Mask}
% Here are the customization parameters:
%    \begin{macrocode}
\def\@headerfont{\bfseries}
\newcommand\headerfont[1]{\gdef\@headerfont{#1}}

\def\@X{X}
\newcommand\X[1]{\gdef\@X{#1}}

%    \end{macrocode}
% We use two new column types in the form and mask arrays: |Q| for header
% cells and |D| for data cells. We also use centered cells for the X
% specification. Note that this might clash with a user setting one day, but
% let's not anticipate problems.
%    \begin{macrocode}
\def\pbs#1{\let\tmp=\\#1\let\\=\tmp}
\newcolumntype{D}{>{\pbs\centering}X}
\newcolumntype{Q}{>{\@headerfont}X}

\renewcommand\tabularxcolumn[1]{m{#1}}

%    \end{macrocode}
%    \begin{macrocode}
\newcommand\makeform@nocorrection{%
  \addtocontents{frm}{\protect\end{tabularx}}
  \@starttoc{frm}}
\newcommand\makeform@correction{%
  \addtocontents{frm}{\protect\end{tabularx}}}

\newcommand\makemask@nocorrection{%
  \addtocontents{msk}{\protect\end{tabularx}}
  \@starttoc{msk}}
\newcommand\makemask@correction{%
  \addtocontents{msk}{\protect\end{tabularx}}}

%    \end{macrocode}
% \subsection{The \texttt{question} Environment}
% Here are the customization parameters:
%    \begin{macrocode}
\newlength\questionspace
\setlength\questionspace{0pt}

\newcommand\answerstitle[1]{\gdef\@answerstitle{#1}}

\def\@answerstitlefont{\bfseries}
\newcommand\answerstitlefont[1]{\gdef\@answerstitlefont{#1}}

\def\@answernumberfont{\bfseries}
\newcommand\answernumberfont[1]{\gdef\@answernumberfont{#1}}

%    \end{macrocode}
% The |question| counter starts at one, and is incremented at the end of each
% question.
%    \begin{macrocode}
\newcounter{question}\stepcounter{question}
\newcounter{@choice}

%    \end{macrocode}
% The macro |\@initorcheck| is called at the end of each question. After the
% first one, it initializes the number of proposed answers (this must be
% constant across all questions). This is used to build the form and mask
% arrays description lines, and initialize the auxiliary files. Afterwards, it
% redefines itself so that subsequent calls will just check that the number of
% answers remains the same across all questions.
%    \begin{macrocode}
\def\@initorcheck{%
  \xdef\@choices{\the@choice}%
  \setcounter{@choice}{1}%
  \gdef\@arraydesc{|Q||}%
  \gdef\@headerline{}%
  \whiledo{\not{\value{@choice}>\@choices}}{
    \xdef\@arraydesc{\@arraydesc D|}
    \def\@appendheader{\g@addto@macro\@headerline}
    \@appendheader{&\protect\@headerfont}
    \edef\@the@choice{{\alph{@choice}}}
    \expandafter\@appendheader\@the@choice
    \stepcounter{@choice}}%
  \addtocontents{frm}{%
    \protect\begin{tabularx}{\protect\linewidth}{\@arraydesc}
    \protect\hline
    \@headerline\protect\\\protect\hline\protect\hline}%
  \addtocontents{msk}{%
    \protect\begin{tabularx}{\protect\linewidth}{\@arraydesc}
    \protect\hline
    \@headerline\protect\\\protect\hline\protect\hline}%
  \gdef\@initorcheck{%
    \ifthenelse{\value{@choice} = \@choices}{}{%
      \ClassError{QCM}{Question \thequestion: wrong number of choices
        (\the@choice\space instead of \@choices)}{%
        Questions must all have the same number of proposed answers.%
        \MessageBreak
        Type X <return> to quit, fix your QCM and rerun LaTeX.}}}}

%    \end{macrocode}
% A minipage environment is used in order to prevent page breaks in the middle
% of a question.
%    \begin{macrocode}
\newenvironment{question}[1]{%
  %% \begin{question}
  \begin{minipage}{\textwidth}
%    \end{macrocode}
% Each line in the form and mask arrays is stored in the macros
% |\@formanswerline| and |\@maskanswerline|. They are initialized here,
% updated progressively by each call to |\true| or |\false|, \ldots
%    \begin{macrocode}
    \xdef\@formanswerline{\@questionheader}%
    \xdef\@maskanswerline{\@questionheader}%
    \fbox{\parbox[c]{\linewidth}{#1}}
    \vspace\questionspace\par
    {\@answerstitlefont\@answerstitle}
    \begin{list}{\@answernumberfont\alph{@choice}.~}{\usecounter{@choice}}}{%
  %% \end{question}
    \end{list}
    \@initorcheck%
%    \end{macrocode}
% \ldots and added to the form and mask auxiliary files here:
%    \begin{macrocode}
    \addtocontents{frm}{\@formanswerline\protect\\\protect\hline}%
    \addtocontents{msk}{\@maskanswerline\protect\\\protect\hline}%
  \end{minipage}
  \stepcounter{question}}

\def\@truesymbol{$\rightarrow$~}
\def\@falsesymbol{$\times$~}
\newcommand\truesymbol[1]{\gdef\@truesymbol{#1}}
\newcommand\falsesymbol[1]{\gdef\@falsesymbol{#1}}

\def\@true@nocorrection{\item}
\def\@false@nocorrection{\item}
\def\@true@correction{\item[\@truesymbol\refstepcounter{@choice}]}
\def\@false@correction{\item[\@falsesymbol\refstepcounter{@choice}]}

\newcommand\true{%
  \xdef\@formanswerline{\@formanswerline&}%
  \xdef\@maskanswerline{\@maskanswerline&\@X}%
  \@true}%
\newcommand\false{%
  \xdef\@formanswerline{\@formanswerline&}%
  \xdef\@maskanswerline{\@maskanswerline&}%
  \@false}%

%    \end{macrocode}
% \subsection{The correction environment}
% Here, we only define the visible version of the |correction| environment.
% The other one is provided by |verbatim|'s comment environment.
%    \begin{macrocode}
\def\@correctionstyle{\itshape}
\newcommand\correctionstyle[1]{\gdef\@correctionstyle{#1}}

\newenvironment{@correction}{\@correctionstyle}{}

%    \end{macrocode}
% \subsection{Internationalization}
%    \begin{macrocode}
\DeclareOption{english}{%
  \def\@questionheader{Question n.\thequestion}
  \answerstitle{Possible answers:}}
\DeclareOption{french}{%
  \def\@questionheader{Question n$^o$~\thequestion}
  \answerstitle{R\'eponses possibles~:}}
\DeclareOption{francais}{%
  \ExecuteOptions{french}}

%    \end{macrocode}
% \subsection{Options Processing}
% Note that we don't use |\let| but |\def| to implement the correct behavior
% of |\makeform| and |\makemask|. This is because when using the class, the
% underlying macros might be redefined, so we want to use their latest
% definition.
%    \begin{macrocode}
\DeclareOption{nocorrection}{%
  \let\@true\@true@nocorrection
  \let\@false\@false@nocorrection
  \let\correction\comment
  \let\endcorrection\endcomment
  \def\makeform{\makeform@nocorrection}
  \def\makemask{\makemask@nocorrection}}
\DeclareOption{correction}{%
  \let\@true\@true@correction
  \let\@false\@false@correction
  \let\correction\@correction
  \let\endcorrection\end@correction
  \def\makeform{\makeform@correction}
  \def\makemask{\makemask@correction}}

\ExecuteOptions{english,nocorrection}
\ProcessOptions

%    \end{macrocode}
% \iffalse
%</qcmstyle>
% \fi
%
% \iffalse
%<*qcmclass>
% \fi
% \section{Class Code}
%    \begin{macrocode}
\NeedsTeXFormat{LaTeX2e}
¡ $Format: "\\ProvidesClass{qcm}[$ClassReleaseDate$ v$Version$"$
\ProvidesClass{qcm}[2004/11/27 v2.1
                    Multiple Choice Questionnaire class for LaTeX2e]

\RequirePackage{qcm}[2004/11/09]

%    \end{macrocode}
% \subsection{The Title}
%    \begin{macrocode}
\def\@titlefont{\LARGE\bfseries}
\newcommand\titlefont[1]{\gdef\@titlefont{#1}}
\@onlypreamble\titlefont

\newlength\titlespace
\setlength\titlespace{20pt}

\@onlypreamble\title

%    \end{macrocode}
% |\maketitle| informs \qcm{} that the title should be repeated on the form
% and mask pages by defining |\@maketitle|.
%    \begin{macrocode}
\def\@make@title{%
  \begin{center}
    \@titlefont\@title
  \end{center}
  \vspace\titlespace}
\let\@maketitle\empty
\newcommand\maketitle{%
  \@make@title%
  \let\@maketitle\@make@title}

%    \end{macrocode}
% \subsection{The Form and Mask}
% The qcm{} style |\makeform| and |\makemask| macros are saved and wrapped
% into new ones that first repeat the document's title on a new page. The page
% style is also set to |empty|.\par
% For a reason I don't recall anymore, |\addtocontents| fails to write
% anything in the auxiliary files when nothing has been written on the page
% yet. To cope with this problem, we restate the title first.
%    \begin{macrocode}
\let\old@makeform@nocorrection\makeform@nocorrection
\def\makeform@nocorrection{%
  \newpage
  \@maketitle
  \thispagestyle{empty}
  \old@makeform@nocorrection}

\let\old@makemask@nocorrection\makemask@nocorrection
\def\makemask@nocorrection{%
  \newpage
  \@maketitle
  \thispagestyle{empty}
  \old@makemask@nocorrection}

%    \end{macrocode}
% \subsection{The \texttt{question} Environment}
%    \begin{macrocode}
\newcommand\questiontitle[1]{\gdef\@questiontitle{#1}}

\def\@questiontitlefont{\bfseries}
\newcommand\questiontitlefont[1]{\gdef\@questiontitlefont{#1}}

\newlength\questiontitlespace
\setlength\questiontitlespace{5pt}

\newlength\questionsepspace
\setlength\questionsepspace{20pt}
%    \end{macrocode}
% The real space used is |\@questionsepspace|. It is initialy set to 0 to
% prevent extra space from appearing before the first question. It is
% redefined to the real value at the end of the |question| environment.
%    \begin{macrocode}
\gdef\@questionsepspace{0pt}

%    \end{macrocode}
% The qcm{} style |question| environment is saved and wrapped into a new one
% that outputs a question title.
%    \begin{macrocode}
\let\old@question\question
\let\old@endquestion\endquestion
\renewenvironment{question}[1]{%
  %% \begin{question}
  \vspace\@questionsepspace
  \fbox{\parbox[c]{0.25\linewidth}{\@questiontitlefont\@questiontitle}}
  \nopagebreak\vspace\questiontitlespace\par
  \old@question{#1}}{%
  %% \end{question}
  \old@endquestion
  \gdef\@questionsepspace{\questionsepspace}}

%    \end{macrocode}
% \subsection{Language Processing}
%    \begin{macrocode}
\DeclareOption{english}{%
  \questiontitle{Question N.\thequestion:}}
\DeclareOption{french}{%
  \questiontitle{Question N$^{o}$~\thequestion~:}}
\DeclareOption{francais}{%
  \ExecuteOptions{french}}

%    \end{macrocode}
% \subsection{Standard Class Processing}
%    \begin{macrocode}
\DeclareOption{a4paper}{
  \setlength\paperheight{297mm}
  \setlength\paperwidth{210mm}}
\DeclareOption{a5paper}{
  \setlength\paperheight{210mm}
  \setlength\paperwidth{148mm}}
\DeclareOption{b5paper}{
  \setlength\paperheight{250mm}
  \setlength\paperwidth{176mm}}
\DeclareOption{letterpaper}{
  \setlength\paperheight{11in}
  \setlength\paperwidth{8.5in}}
\DeclareOption{legalpaper}{
  \setlength\paperheight{14in}
  \setlength\paperwidth{8.5in}}
\DeclareOption{executivepaper}{
  \setlength\paperheight{10.5in}
  \setlength\paperwidth{7.25in}}
\DeclareOption{landscape}{
  \setlength\@tempdima{\paperheight}
  \setlength\paperheight{\paperwidth}
  \setlength\paperwidth{\@tempdima}}

\DeclareOption{10pt}{\def\@ptsize{0}}
\DeclareOption{11pt}{\def\@ptsize{1}}
\DeclareOption{12pt}{\def\@ptsize{2}}

\DeclareOption{oneside}{\@twosidefalse\@mparswitchfalse}
\DeclareOption{twoside}{\@twosidetrue\@mparswitchtrue}

\DeclareOption{draft}{\setlength\overfullrule{5pt}}
\DeclareOption{final}{\setlength\overfullrule{0pt}}

\ExecuteOptions{english,letterpaper,10pt,oneside,final}
\ProcessOptions

\input{size1\@ptsize.clo}
\setlength\parindent{0pt}
\setlength\parskip{0pt}
\setlength\tabcolsep{6pt}
\setlength\arrayrulewidth{0.4pt}
\raggedbottom
\onecolumn
\pagestyle{plain}
\pagenumbering{arabic}

\if@twoside
  \def\ps@headings{%
    \let\@oddfoot\@empty\let\@evenfoot\@empty
    \def\@evenhead{\thepage\hfil\slshape\leftmark}%
    \def\@oddhead{{\slshape\rightmark}\hfil\thepage}%
    \let\@mkboth\markboth
  }
\else
  \def\ps@headings{%
    \let\@oddfoot\@empty
    \def\@oddhead{{\slshape\rightmark}\hfil\thepage}%
    \let\@mkboth\markboth
  }
\fi
\def\ps@myheadings{%
  \let\@oddfoot\@empty\let\@evenfoot\@empty
  \def\@evenhead{\thepage\hfil\slshape\leftmark}%
  \def\@oddhead{{\slshape\rightmark}\hfil\thepage}%
  \let\@mkboth\@gobbletwo
}

%    \end{macrocode}
% \iffalse
%</qcmclass>
% \fi
%
% ^^A \PrintChanges
% ^^A \PrintIndex
% \Finale
%
% ^^A qcm.dtx ends here.