cryptol/docs/ProgrammingCryptol/utils/exercise.sty
2014-04-17 15:34:25 -07:00

660 lines
26 KiB
TeX

%% This is a slightly older version of exercise.sty; hacked to add commands
%% AnswerBoxSectionMark and AnswerBoxExecute, and some other mods
%% The newer version of exercise.sty breaks the type-setting, and it's not worth trying to fix it!
%%
%% This is file `exercise.sty',
%% generated with the docstrip utility.
%%
%% The original source files were:
%%
%% exercise.dtx (with options: `package')
%%
%% This is a generated file.
%%
%% Copyright (C) 2003 by Paul Pichaureau
%%
%% This program is free software; you can redistribute it and/or
%% modify it under the terms of the GNU General Public License
%% as published by the Free Software Foundation; either version 2
%% of the License, or (at your option) any later version.
%%
%% This program is distributed in the hope that it will be useful,
%% but WITHOUT ANY WARRANTY; without even the implied warranty of
%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
%% GNU General Public License for more details.
%%
%% You should have received a copy of the GNU General Public License
%% along with this program; if not, write to the Free Software
%% Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
%% Public LaTeX Project Public
%%
\NeedsTeXFormat{LaTeX2e}[1999/12/01]
\ProvidesPackage{utils/exercise}
[2004/09/05 v1.1 Exercise package (P.Pichaureau)]
%% \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 \~}
%%
\newif\if@AnswerOutput \@AnswerOutputtrue
\newif\if@AnswerDelay \@AnswerDelayfalse
\newif\if@ExerciseOutput \@ExerciseOutputtrue
\newif\if@ExerciseDelay \@ExerciseDelayfalse
\newif\if@AswLastExe \@AswLastExefalse
\DeclareOption{noanswer} {\@AnswerOutputfalse}
\DeclareOption{answeronly} {\@ExerciseOutputfalse}
\DeclareOption{noexercise} {\@ExerciseOutputfalse}
\DeclareOption{exerciseonly} {\@AnswerOutputfalse}
\DeclareOption{outputnothing}{\@ExerciseOutputfalse\@AnswerOutputfalse}
\DeclareOption{exercisedelayed}{\@ExerciseDelaytrue}
\DeclareOption{answerdelayed}{\@AnswerDelaytrue}
\DeclareOption{lastexercise} {\@AswLastExetrue}
\newif\if@ShowLabel \@ShowLabelfalse
\DeclareOption{showlabel} {\@ShowLabeltrue}
\ProcessOptions
\RequirePackage{keyval, ifthen}
\def\ExerciseName{Exercise}%
\def\AnswerName{Answer}%
\def\ExerciseListName{Ex.}%
\def\AnswerListName{Answer}%
\def\ExePartName{Part}%
\@ifpackageloaded{babel}{
\addto{\captionsfrenchb}{
\def\ExerciseName{Exercice}%
\def\AnswerName{Solution}%
\def\ExerciseListName{Ex.}%
\def\AnswerListName{Sol.}%
\def\ExePartName{Partie}%
}}{}
\newlength{\Exesep}
\setlength{\Exesep}{1\baselineskip}
\newlength{\Exetopsep}
\setlength{\Exetopsep}\z@
\newlength{\Exeparsep}
\setlength{\Exeparsep}{\parskip}
\newlength{\Exepartopsep}
\setlength{\Exepartopsep}\z@
\newlength{\Exeleftmargin}
\setlength{\Exeleftmargin}\z@
\newlength{\Exerightmargin}
\setlength{\Exerightmargin}\z@
\newlength{\Exelabelwidth}
\setlength{\Exelabelwidth}\z@
\newlength{\Exelabelsep}
\setlength{\Exelabelsep}\z@
\newlength{\ExerciseBefore}
\setlength{\ExerciseBefore}{0em}
\newlength{\QuestionBefore}
\setlength{\QuestionBefore}{.25em}
\newlength{\subQuestionBefore}
\setlength{\subQuestionBefore}{0em}
\newlength{\subsubQuestionBefore}
\setlength{\subsubQuestionBefore}{0em}
\newlength{\QuestionIndent}
\setlength{\QuestionIndent}{3em}
\newlength{\subQuestionIndent}
\setlength{\subQuestionIndent}{2em}
\newlength{\subsubQuestionIndent}
\setlength{\subsubQuestionIndent}{2.5em}
\newcounter{Exercise}
\gdef\@ExerciseCounter{Exercise} %default exercise counter
\newcounter{ExePart}[Exercise]
\newcounter{Question}[Exercise]
\newcounter{subQuestion}[Question]
\newcounter{subsubQuestion}[subQuestion]
\renewcommand{\theExercise}{\arabic{\@ExerciseCounter}}
\renewcommand{\theExePart}{\Roman{ExePart}}
\renewcommand{\theQuestion}{\arabic{Question}}
\renewcommand{\thesubQuestion}{\alph{subQuestion}}
\renewcommand{\thesubsubQuestion}{\roman{subsubQuestion}}
\newcounter{savedQuestion}
\newcounter{savedsubQuestion}
\newcounter{savedsubsubQuestion}
\def\marker#1#2{\@tempcnta#2\whiledo{\@tempcnta>0}{#1\advance
\@tempcnta by -1 }}
\def\DifficultyMarker{*}
\newcommand{\ExerciseHeaderTitle}{\qquad \ExerciseTitle}
\newcommand{\ExerciseHeaderDifficulty}{\theExerciseDifficulty\ }
\newcommand{\ExerciseHeaderOrigin}{%
\ ({\usefont{\encodingdefault}{\rmdefault}{m}{it}\ExerciseOrigin})}
\newcommand{\ExerciseHeaderNB}{\ \theExercise}
\newcommand{\ExerciseHeaderLabel}{\fbox{\textsc{\ExerciseLabel}}}
\newcommand{\ExerciseHeader}{\centerline{%
\textbf{\large\ExerciseHeaderDifficulty\ExerciseName%
\ExerciseHeaderNB\ExerciseHeaderTitle\ExerciseHeaderOrigin}}\medskip}
\newcommand{\ExerciseListHeader}{\ExerciseHeaderDifficulty%
\textbf{\ExerciseListName\ExerciseHeaderNB%
\ --- \ \ExerciseHeaderTitle}%
\ExerciseHeaderOrigin\ignorespaces}
\newcommand{\ExePartHeaderNB}{\ \theExePart}
\newcommand{\ExePartHeaderTitle}{\quad --- \quad {\ExePartTitle}}
\newcommand{\ExePartHeaderDifficulty}{\theExePartDifficulty\ }
\newcommand{\ExePartHeader}{%
\medskip\centerline{\emph{\large\ExePartHeaderDifficulty\ExePartName%
\ExePartHeaderNB\ExePartHeaderTitle}}}
\newcommand{\ExePartListHeader}{\bigskip%
\emph{\ExePartHeaderDifficulty\ExePartName%
\ExePartHeaderNB\ExePartHeaderTitle}\par\medskip}
\newcommand{\QuestionNB}{\arabic{Question}.\ }
\newcommand{\QuestionHeaderTitle}{\emph{(\QuestionTitle)}\ }
\newcommand{\QuestionHeaderDifficulty}{\theQuestionDifficulty\ }
\newcommand{\theQuestionDifficulty}{\marker{\DifficultyMarker}%
{\QuestionDifficulty}}
\newcommand{\subQuestionNB}{\alph{subQuestion})}
\newcommand{\subQuestionHeaderTitle}{\emph{(\subQuestionTitle)}\ }
\newcommand{\subQuestionHeaderDifficulty}{\thesubQuestionDifficulty\ }
\newcommand{\subQuestionHeader}{\subQuestionHeaderDifficulty%
\subQuestionNB)\ \emph{\subQuestionHeaderTitle}}
\newcommand{\thesubQuestionDifficulty}{\marker{\DifficultyMarker}%
{\subQuestionDifficulty}}
\newcommand{\subsubQuestionNB}{\roman{subsubQuestion} -- }
\newcommand{\subsubQuestionHeaderTitle}{\emph{(\subsubQuestionTitle)}\ }
\newcommand{\subsubQuestionHeaderDifficulty}{\thesubsubQuestionDifficulty\ }
\newcommand{\subsubQuestionHeader}{\subsubQuestionHeaderDifficulty%
\subsubQuestionNB \emph{\subsubQuestionHeaderTitle} --}
\newcommand{\thesubsubQuestionDifficulty}{%
\marker{\DifficultyMarker}{\subsubQuestionDifficulty}}
\newcount\@QuestionLevel \@QuestionLevel=0
\newcommand{\the@QuestionLevel}{\number\@QuestionLevel}
\newbox\@Exercisebox
\newbox\all@Exercisebox
\newbox\temp@Exercisebox
\newbox\all@Answerbox
\newbox\temp@Answerbox
\newif\if@echapq \@echapqfalse
\newif\if@Answer \@Answerfalse
\def\termineliste#1{\global\@echapqfalse%
\whiledo{\@QuestionLevel>#1}%
{\ifnum\@QuestionLevel=\colonnesLevel\end{multicols}\colonnesLevel=-10\fi%
\end{list}\advance\@QuestionLevel by -1}%
\ifnum\@QuestionLevel=\colonnesLevel\end{multicols}\colonnesLevel=-10\fi}
\newif\if@ExeTitle \@ExeTitlefalse
\newif\if@ExeReName \@ExeReNamefalse
\global\newcount\ExerciseDifficulty \ExerciseDifficulty=0
\newif\if@ExeDifficulty \@ExeDifficultyfalse
\newif\if@ExeOrigin \@ExeOriginfalse
\newif\if@ExeLabel \@ExeLabelfalse
\newif\if@ExeNB \@ExeNBfalse
\def\theExerciseDifficulty{\marker{\DifficultyMarker}{\ExerciseDifficulty}}
\define@key{PPExercise}{title}%
{\global\@ExeTitletrue\gdef\ExerciseTitle{\string#1}}
\define@key{PPExercise}{difficulty}%
{\global\@ExeDifficultytrue\global\ExerciseDifficulty=\number#1}
\define@key{PPExercise}{name}%
{\global\@ExeReNametrue\gdef\@ExerciseName{\string#1}}
\define@key{PPExercise}{origin}%
{\global\@ExeOrigintrue\gdef\ExerciseOrigin{#1}}
\define@key{PPExercise}{counter}%
{\gdef\@ExerciseCounter{\string#1}}
\define@key{PPExercise}{label}%
{\global\@ExeLabeltrue\gdef\ExerciseLabel{\string#1}\gdef\ExerciseTrueLabel{#1}}
\define@key{PPExercise}{number}%
{\global\@ExeNBtrue\gdef\ExerciseLocalNB{\string#1}}
%% \define@key{PPExercise}{domain}{}
%% \define@key{PPExercise}{sdomain}{}
%% \define@key{PPExercise}{keyword}{}
\newif\if@ExeStared
\newif\if@staredpb
\newif\if@staredpart
\newif\if@renamepart
\@ExeStaredfalse
\@staredpbfalse
\@staredpartfalse
\@renamepartfalse
\def\@InitExe{\@savemathindent\global\@echapqfalse%
\gdef\ExerciseTitle{}%
\gdef\@ExerciseName{}%
\gdef\ExerciseOrigin{}%
\gdef\ExerciseTrueLabel{}%
\global\ExerciseDifficulty=0%
\global\@ExeTitlefalse%
\global\@ExeReNamefalse%
\global\@ExeDifficultyfalse%
\global\@ExeOriginfalse%
\global\@ExeNBfalse%
\gdef\@ExerciseCounter{Exercise}%
\setcounter{ExePart}{0}%
\setcounter{Question}{0}%
\global\@ExeLabelfalse}
\def\@getExerciseInfo{%
\if@ExeReName\def\ExerciseName{\@ExerciseName}\fi%
\if@ExeTitle\else\def\ExerciseHeaderTitle{}\fi%
\if@ExeOrigin\else\def\ExerciseHeaderOrigin{}\fi%
\if@ExeLabel\else\def\ExerciseHeaderLabel{}\fi%
\if@ExeDifficulty\else\def\ExerciseHeaderDifficulty{}\fi%
\if@ExeStared\def\ExerciseHeaderNB{}\fi%
\if@ExeNB\def\theExercise{\ExerciseLocalNB}\fi%
\if@ExeLabel\label{\ExerciseLabel}\recordExerciseLabel{\ExerciseLabel}\fi%
}
\def\refstepExecounter{\if@ExeStared\else\if@ExeNB\else%
\refstepcounter{\@ExerciseCounter}\fi\fi}
\def\recordExerciseLabel#1{\@bsphack
\protected@write\@auxout{}%
{\string\newlabel{PP#1}{{\@AnswerHeaderRef}{\thepage}}}%
\@esphack}
\def\@BeginExeBox{\global\setbox\@Exercisebox\vbox\bgroup}
\def\@EndExeBox{\egroup\if@Answer\if@AnswerOutput\@DelayAnswerBox\fi%
\else\if@ExerciseOutput\@DelayExerciseBox\fi\fi}
\def\AnswerBoxSectionMark#1{%
\global\setbox\temp@Answerbox%
\vbox{\unvbox\all@Answerbox\vskip\Exesep%
\section*{\vspace*{.5em}\hrule\hrule\vspace*{.5em}\hspace*{-\parindent}#1\vspace*{.5em}\hrule\hrule\markboth{#1}{}}%
\unvbox\@Exercisebox\vskip\z@}%
\global\setbox\all@Answerbox\copy\temp@Answerbox%
}
\def\AnswerBoxExecute#1{%
\global\setbox\temp@Answerbox%
\vbox{\unvbox\all@Answerbox#1\unvbox\@Exercisebox}%
\global\setbox\all@Answerbox\copy\temp@Answerbox%
}
\def\@DelayAnswerBox{%
\if@ShipThisExercise\if@AnswerDelay\global\setbox\temp@Answerbox%
\vbox{\unvbox\all@Answerbox\vskip\Exesep\unvbox\@Exercisebox\vskip\z@}%
\global\setbox\all@Answerbox\copy\temp@Answerbox%
\else\unvbox\@Exercisebox\fi\fi}
\def\@DelayExerciseBox{\if@ShipThisExercise\if@ExerciseDelay%
\global\setbox\temp@Exercisebox%
\vbox{\unvbox\all@Exercisebox\vskip\Exesep\unvbox\@Exercisebox\vskip\z@}%
\global\setbox\all@Exercisebox\copy\temp@Exercisebox%
\else\vskip\Exesep\unvbox\@Exercisebox\fi\fi}
\newcommand{\shipoutAnswer}{\if@AnswerOutput\unvbox\all@Answerbox\fi}
\newcommand{\shipoutExercise}{\if@ExerciseOutput\unvbox\all@Exercisebox\fi}
\def\beginExerciseEnv{\@InitExe\@ifnextchar[\@@ExeEnv{\@@ExeEnv[]}}%]
\def\@@ExeEnv[#1]{\setkeys{PPExercise}{#1}%
\global\@Answerfalse\@BeginExeBox\@@@ExeEnv}
\newcommand{\@@@ExeEnv}{%
\@selectExercise{\ExerciseTrueLabel}
\@QuestionLevel1
\refstepExecounter
\begingroup\@getExerciseInfo\ExerciseHeader\endgroup}
\def\endExerciseEnv{\termineliste{1}\@EndExeBox}
\def\ExerciseCmd{\@InitExe\@ifstar{\global\@ExeStaredtrue\@ExeCmd}%
{\global\@ExeStaredfalse\@ExeCmd}}
\def\@ExeCmd{\@ifnextchar[\@@ExeCmd{\@@ExeCmd[]}}%] for emacs
\def\@@ExeCmd[#1]{\setkeys{PPExercise}{#1}\@@@ExeCmd}
\newcommand{\@@@ExeCmd}{%
\ifnum\@QuestionLevel=0
\advance \@QuestionLevel by 1
\begin{list}{\@getExerciseInfo\ExerciseListHeader}%
{\partopsep\Exepartopsep \labelsep\Exelabelsep \itemsep \Exesep%
\parsep\Exeparsep \topsep\Exetopsep \labelwidth\Exelabelwidth%
\leftmargin\Exeleftmargin \rightmargin\Exerightmargin}
\else
\termineliste{1}\@EndExeBox
\fi
\@selectExercise{\ExerciseTrueLabel}
\global\@Answerfalse\@BeginExeBox\refstepExecounter%
\item\ignorespaces
}
\def\defineExePartInEnv{\def\@ExePartHeader{\ExePartHeader}}
\def\defineExePartInList{\def\@ExePartHeader{\ExePartListHeader}}
\def\defineExerciseEnv{%
\defineExePartInEnv
\renewenvironment{Exercise}{\global\beginExerciseEnv}%
{\@ExeStaredfalse\endExerciseEnv}
\renewenvironment{Exercise*}{\global\@ExeStaredtrue\beginExerciseEnv}%
{\@ExeStaredfalse\endExerciseEnv}
}
\newenvironment{Exercise}{}{}
\newenvironment{Exercise*}{}{}
\def\defineExerciseCmd{\def\Exercise{\ExerciseCmd}}
\renewcommand{\Exercise}{}
\defineExerciseEnv
\def\beginExerciseListEnv{\defineExerciseCmd\defineAnswerCmd%
\defineExePartInList}
\def\endExerciseListEnv{\termineliste{1}\@EndExeBox\termineliste{0}%
\defineExerciseEnv\defineAnswerEnv}
\newenvironment{ExerciseList}{\beginExerciseListEnv}{\endExerciseListEnv}
\def\QuestionTitle{}
\newif\if@QuestionTitle \@QuestionTitlefalse
\global\newcount\QuestionDifficulty \QuestionDifficulty=0
\newif\if@QuestionDifficulty \@QuestionDifficultyfalse
\define@key{PPQuestion}{title}{%
\global\@QuestionTitletrue\gdef\QuestionTitle{\string#1}}
\define@key{PPQuestion}{difficulty}{%
\global\@QuestionDifficultytrue\global\QuestionDifficulty=\number#1}
\def\@InitQuestion{\gdef\QuestionTitle{}%
\global\QuestionDifficulty=0%
\global\@QuestionTitlefalse%
\global\@QuestionDifficultyfalse}
\def\@getQuestionInfo{%
\if@QuestionTitle\else\def\QuestionHeaderTitle{}\fi
\if@QuestionDifficulty\else\def\QuestionHeaderDifficulty{}\fi
}
\def\EndCurrentQuestion{\termineliste{1}}
\def\Question{\@InitQuestion\@ifnextchar[\@@Question{\@@Question[]}}%]
\def\@@Question[#1]{\setkeys{PPQuestion}{#1}\@@@Question}
\def\@QuestionHeader{\item[{\makebox[0cm][r]{\begingroup\@getQuestionInfo%
\QuestionHeaderDifficulty\QuestionNB\endgroup}}]%
\begingroup\@getQuestionInfo\QuestionHeaderTitle\endgroup\ignorespaces}
\newcommand{\@@@Question}{%
\ifnum\@QuestionLevel=1
\advance \@QuestionLevel by 1
\begin{list}{}{\leftmargin \QuestionIndent
\partopsep0pt \parsep\parskip \topsep \QuestionBefore
\itemsep \QuestionBefore \labelwidth 2em
\labelsep .5em
\usecounter{Question}}
\if@echapq
\setcounter{Question}{\value{savedQuestion}}\global\@echapqfalse
\fi
\refstepcounter{Question}
\@restoremathindent
\@decalemathindent{\QuestionIndent}
\@QuestionHeader
\else
\ifnum\@QuestionLevel=2
\refstepcounter{Question}
\@QuestionHeader
\else
\ifnum\@QuestionLevel>2
\termineliste{2}
\refstepcounter{Question}
\@QuestionHeader
\else
\PackageError{exercise}{You don't respect the hierarchy of
questions}{Verify the Question}
\fi
\fi
\fi
}
\def\subQuestionTitle{}
\newif\if@subQuestionTitle\@subQuestionTitlefalse
\global\newcount\subQuestionDifficulty\subQuestionDifficulty=0
\newif\if@subQuestionDifficulty\@subQuestionDifficultyfalse
\define@key{PPsubQuestion}{title}{%
\gdef\subQuestionTitle{\string#1}\global\@subQuestionTitletrue}
\define@key{PPsubQuestion}{difficulty}{%
\global\@subQuestionDifficultytrue\global\subQuestionDifficulty=\number#1}
\def\@InitsubQuestion{\gdef\subQuestionTitle{}%
\global\subQuestionDifficulty=0%
\global\@subQuestionTitlefalse%
\global\@subQuestionDifficultyfalse}
\def\@getsubQuestionInfo{%
\if@subQuestionTitle\else\def\subQuestionHeaderTitle{}\fi
\if@subQuestionDifficulty\else\def\subQuestionHeaderDifficulty{}\fi
}
\def\EndCurrentsubQuestion{\termineliste{2}}
\def\subQuestion{\@InitsubQuestion%
\@ifnextchar[\@@subQuestion{\@@subQuestion[]}}%]
\def\@@subQuestion[#1]{\setkeys{PPsubQuestion}{#1}\@@@subQuestion}
\def\@subQuestionHeader{\item[{\makebox[0cm][r]%
{\begingroup\@getsubQuestionInfo\subQuestionHeaderDifficulty%
\subQuestionNB\endgroup}}]%
\begingroup\@getsubQuestionInfo\subQuestionHeaderTitle\endgroup%
\ignorespaces}
\newcommand{\@@@subQuestion}{%
\ifnum\@QuestionLevel=2
\advance \@QuestionLevel by 1
\begin{list}{}{\leftmargin \subQuestionIndent
\partopsep0pt \parsep\parskip \topsep \subQuestionBefore
\itemsep \subQuestionBefore \labelwidth 2em
\labelsep .5em
\usecounter{subQuestion}}
\if@echapq
\setcounter{subQuestion}{\value{savedsubQuestion}}%
\global\@echapqfalse
\fi
\refstepcounter{subQuestion}
\@restoremathindent
\@decalemathindent{\subQuestionIndent}
\@subQuestionHeader
\else
\ifnum\@QuestionLevel=3
\refstepcounter{subQuestion}
\@subQuestionHeader
\else
\ifnum\@QuestionLevel>3
\termineliste{3}
\refstepcounter{subQuestion}
\@subQuestionHeader
\else
\PackageError{exercise}{You don't respect the hierarchy of
subQuestion}{Verify the subQuestion}
\fi
\fi
\fi
}
\def\subsubQuestionTitle{}
\newif\if@subsubQuestionTitle\@subsubQuestionTitlefalse
\global\newcount\subsubQuestionDifficulty\subsubQuestionDifficulty=0
\newif\if@subsubQuestionDifficulty\@subsubQuestionDifficultyfalse
\define@key{PPsubsubQuestion}{title}{%
\gdef\subsubQuestionTitle{\string#1}\global\@subsubQuestionTitletrue}
\define@key{PPsubsubQuestion}{difficulty}{%
\global\@subsubQuestionDifficultytrue%
\global\subsubQuestionDifficulty=\number#1}
\def\@InitsubsubQuestion{\gdef\subsubQuestionTitle{}%
\global\subsubQuestionDifficulty=0%
\global\@subsubQuestionTitlefalse%
\global\@subsubQuestionDifficultyfalse}
\def\@getsubsubQuestionInfo{%
\if@subsubQuestionTitle\else\def\subsubQuestionHeaderTitle{}\fi
\if@subsubQuestionDifficulty\else\def\subsubQuestionHeaderDifficulty{}\fi
}
\def\EndCurrentsubsubQuestion{\termineliste{3}}
\def\subsubQuestion{\@InitsubsubQuestion%
\@ifnextchar[\@@subsubQuestion{\@@subsubQuestion[]}}%]
\def\@@subsubQuestion[#1]{\setkeys{PPsubsubQuestion}{#1}\@@@subsubQuestion}
\def\@subsubQuestionHeader{\item[{\makebox[0cm][r]%
{\begingroup\@getsubsubQuestionInfo\subsubQuestionHeaderDifficulty%
\subsubQuestionNB\endgroup}}]%
\begingroup\@getsubsubQuestionInfo\subsubQuestionHeaderTitle\endgroup%
\ignorespaces}
\newcommand{\@@@subsubQuestion}{%
\ifnum\@QuestionLevel=3
\advance \@QuestionLevel by 1
\begin{list}{}{\leftmargin \subsubQuestionIndent
\partopsep0pt \parsep\parskip \topsep \subsubQuestionBefore
\itemsep \subsubQuestionBefore \labelwidth 2em
\labelsep .5em
\usecounter{subsubQuestion}}
\if@echapq
\setcounter{subsubQuestion}{\value{savedsubsubQuestion}}%
\global\@echapqfalse
\fi
\refstepcounter{subsubQuestion}
\@restoremathindent
\@decalemathindent{\subsubQuestionIndent}
\@subsubQuestionHeader
\else
\ifnum\@QuestionLevel=4
\refstepcounter{subsubQuestion}
\@subsubQuestionHeader
\else
\ifnum\@QuestionLevel>4
\termineliste{4}
\refstepcounter{subsubQuestion}
\@subsubQuestionHeader
\else
\PackageError{exercise}{You don't respect the hierarchy of
subsubQuestion}{Verify the subsubQuestion}
\fi
\fi
\fi
}
\newif\if@ExePartStared \@ExePartStaredfalse
\newif\if@ExePartTitle \@ExePartTitlefalse
\newif\if@ExePartReName \@ExePartReNamefalse
\newif\if@ExePartDifficulty \@ExePartDifficultyfalse
\global\newcount\ExePartDifficulty \ExePartDifficulty=0
\def\theExePartDifficulty{\marker{\DifficultyMarker}{\ExePartDifficulty}}
\def\@InitExePart{\global\@echapqfalse%
\gdef\ExePartTitle{}%
\gdef\@ExePartName{}%
\global\ExePartDifficulty=0%
\global\@ExePartTitlefalse%
\global\@ExePartReNamefalse%
\global\@ExePartDifficultyfalse%
\setcounter{Question}{0}\termineliste{1}}
\define@key{PPExePart}{title}{\gdef\ExePartTitle{\string#1}%
\global\@ExePartTitletrue}
\define@key{PPExePart}{name}{\gdef\@ExePartName{\string#1}%
\global\@ExePartReNametrue}
\define@key{PPExePart}{difficulty}{\global\@ExePartDifficultytrue%
\global\ExePartDifficulty=\number#1}
\def\@getExePartInfo{%
\if@ExePartReName\def\ExePartName{\@ExePartName}\fi
\if@ExePartTitle\else\def\ExePartHeaderTitle{}\fi
\if@ExePartDifficulty\else\def\ExePartHeaderDifficulty{}\fi
\if@ExePartStared\def\ExePartHeaderNB{}\fi
}
\def\ExePart{\@InitExePart\@ifstar{\global\@ExePartStaredtrue\@ExePart}%
{\global\@ExePartStaredfalse\@ExePart}}
\def\@ExePart{\@ifnextchar[\@@ExePart{\@@ExePart[]}}%] for emacs
\def\@@ExePart[#1]{\setkeys{PPExePart}{#1}\@@@ExePart}
\newcommand{\@@@ExePart}{%
\if@ExePartStared\else\refstepcounter{ExePart}\fi
\begingroup\@getExePartInfo\@ExePartHeader\endgroup}
\newbox\@Answerbox
%% \newcommand{\AnswerHeaderRef}{Answer of \ExerciseName\ \theExercise}
%% \newcommand{\AnswerListHeaderRef}{Answer (ex.\ \theExercise)\ ---\ }
\newcommand{\AnswerHeader}{\medskip\centerline{\textbf{Answer of
\ExerciseName \ExerciseHeaderNB}\smallskip}}
\newcommand{\AnswerListHeader}{\textbf{Answer (ex.\
\ExerciseHeaderNB)\ ---\ }}
\def\@InitAnswer{\@savemathindent\global\@echapqfalse%
\gdef\AnswerRef{}%
\global\@AnswerReffalse%
\gdef\AnswerNB{}%
\global\@AnswerNBfalse%
\setcounter{ExePart}{0}%
\setcounter{Question}{0}}
\def\@getAnswerInfo{%
\if@AnswerRef%
\def\AnswerHeader{\ref{PP\AnswerRef}}%
\def\AnswerListHeader{\ref{PP\AnswerRef}}%
\else
\if@AnswerNB
\def\ExerciseTitle{}
\def\ExerciseName{}
\def\ExerciseOrigin{}
\ExerciseDifficulty=0
\def\theExercise{\AnswerNB}
\else
\if@AswLastExe
\else
\PackageWarning{Exercise}%
{A answer has no reference and no number}{}%
\def\AnswerHeaderRef{\AnswerName\ ???}%
\def\AnswerListHeaderRef{\AnswerName\ ???}%
\fi\fi\fi}
\newif\if@AnswerRef \@AnswerReffalse
\newif\if@AnswerNB \@AnswerNBfalse
\define@key{PPAnswer}{ref}{\global\@AnswerReftrue\gdef\AnswerRef{\string#1}}
\define@key{PPAnswer}{number}{\global\@AnswerNBtrue\gdef\AnswerNB{\string#1}}
\def\beginAnswerEnv{\@InitAnswer\@ifnextchar[\@@AnswerEnv{\@@AnswerEnv[]}}%]
\def\@@AnswerEnv[#1]{\setkeys{PPAnswer}{#1}%
\global\@Answertrue\@BeginExeBox\@@@AnswerEnv}
\newcommand{\@@@AnswerEnv}{%
\@QuestionLevel1
\begingroup\@getExerciseInfo\@getAnswerInfo\AnswerHeader\endgroup}
\def\endAnswerEnv{\termineliste{1}\@EndExeBox}
\newenvironment{Answer}{}{}
\def\defineAnswerEnv{
\gdef\@AnswerHeaderRef{\AnswerHeader}
\renewenvironment{Answer}{\beginAnswerEnv}{\endAnswerEnv}}
\defineAnswerEnv
\def\AnswerCmd{\@InitAnswer\@ifnextchar[\@@AnswerCmd{\@@AnswerCmd[]}}
\def\@@AnswerCmd[#1]{\setkeys{PPAnswer}{#1}\@@@AnswerCmd}
\newcommand{\@@@AnswerCmd}{%
\ifnum\@QuestionLevel=0
\advance \@QuestionLevel by 1
\begin{list}{}{\partopsep\Exepartopsep \labelsep\Exelabelsep
\itemsep \Exesep \parsep\Exeparsep
\topsep\Exetopsep \labelwidth\Exelabelwidth
\leftmargin\Exeleftmargin
\rightmargin\Exerightmargin }
\refstepExecounter
\else
\termineliste{1}\@EndExeBox
\fi
\global\@Answertrue\@BeginExeBox%
\item[\bgroup\@getAnswerInfo\AnswerListHeader\egroup]\ignorespaces
}
\def\defineAnswerCmd{\gdef\@AnswerHeaderRef{\AnswerListHeader}%
\gdef\Answer{\AnswerCmd}}
\newif\if@ExerciseSelected\@ExerciseSelectedfalse
\newif\if@ExerciseNoLabelSelected\@ExerciseNoLabelSelectedtrue
\newif\if@ExerciseOmitted\@ExerciseOmittedfalse
\newif\if@ShipThisExercise\@ShipThisExercisetrue
\newcommand{\ExerciseStartSelectNoLabel}{\@ExerciseNoLabelSelectedtrue}
\newcommand{\ExerciseStopSelectNoLabel}{\@ExerciseNoLabelSelectedfalse}
\newcommand{\ExerciseStopSelect}{\@ExerciseSelectedfalse}
\newcommand{\ExerciseStartSelect}{\@ExerciseSelectedtrue\@ifstar{\@ExerciseOmittedtrue\def@ListOfExercise}{\@ExerciseOmittedfalse\def@ListOfExercise}}
\def\def@ListOfExercise#1{\gdef\@ListOfExercise{#1}}
\def\@selectExercise#1{%
\ifx#1\@empty
\if@ExerciseNoLabelSelected
\global\@ShipThisExercisetrue
\else
\global\@ShipThisExercisefalse
\fi
\else
\if@ExerciseSelected
\global\@ShipThisExercisefalse
\@for\@label:=\@ListOfExercise\do
{ \ifthenelse{\equal{\@label}{#1}}{
\message{[\@label = #1] OK !!!}
\global\@ShipThisExercisetrue
}{}
}
\if@ExerciseOmitted
\if@ShipThisExercise
\global\@ShipThisExercisefalse
\else
\global\@ShipThisExercisetrue
\fi
\fi
\fi
\fi
}
\newcommand{\ExeText}{\setcounter{savedQuestion}{\value{Question}}%
\termineliste{1}\@echapqtrue}
\newcount\colonnesLevel \colonnesLevel=-10
\newskip\tempskipa
\newskip\tempskipb
\def\deuxcolonnes{\tempskipa=\multicolsep\colonnesLevel=\@QuestionLevel
\ifcase\@QuestionLevel \multicolsep=\QuestionBefore %
\or
\multicolsep=\subQuestionBefore\or\multicolsep=\subsubQuestionBefore\fi%
\begin{multicols}{2}}
\@ifundefined{if@fleqn}{\newif\if@fleqn\@fleqnfalse}{}
\newlength{\@savedmathindent}
\newcommand{\@savemathindent}{\relax}
\newcommand{\@decalemathindent}[1]{\relax}
\newcommand{\@restoremathindent}{\relax}
\if@fleqn %
\renewcommand{\@savemathindent}{\setlength{\@savedmathindent}{\mathindent}}
\renewcommand{\@decalemathindent}[1]{\addtolength{\mathindent}{#1}}
\renewcommand{\@restoremathindent}{\setlength{\mathindent}{\@savedmathindent}}
\else
\renewcommand{\@savemathindent}{\relax}
\renewcommand{\@decalemathindent}[1]{\relax}
\renewcommand{\@restoremathindent}{\relax}
\fi
\def\renewcounter#1{%
\@ifundefined{c@#1}
{\@latex@error{counter #1 undefined}\@ehc}%
\relax
\let\@ifdefinable\@rc@ifdefinable
\@ifnextchar[{\@newctr{#1}}{}}
\endinput
%%
%% End of file `exercise.sty'.