% \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.
