mirror of
https://github.com/GaloisInc/cryptol.git
synced 2024-09-11 22:17:18 +03:00
660 lines
26 KiB
TeX
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'.
|