From e0c6872cf40896c7be36b11dcc744620f10adf1d Mon Sep 17 00:00:00 2001 From: Norbert Preining Date: Mon, 2 Sep 2019 13:46:59 +0900 Subject: Initial commit --- macros/latex/contrib/exercise/README | 109 ++ macros/latex/contrib/exercise/exercise.dtx | 1806 ++++++++++++++++++++++++++++ macros/latex/contrib/exercise/exercise.ins | 66 + macros/latex/contrib/exercise/exercise.pdf | Bin 0 -> 321470 bytes 4 files changed, 1981 insertions(+) create mode 100644 macros/latex/contrib/exercise/README create mode 100644 macros/latex/contrib/exercise/exercise.dtx create mode 100644 macros/latex/contrib/exercise/exercise.ins create mode 100644 macros/latex/contrib/exercise/exercise.pdf (limited to 'macros/latex/contrib/exercise') diff --git a/macros/latex/contrib/exercise/README b/macros/latex/contrib/exercise/README new file mode 100644 index 0000000000..8bd6efcd13 --- /dev/null +++ b/macros/latex/contrib/exercise/README @@ -0,0 +1,109 @@ +Typesetting exercises: the exercise package +=========================================== + +The package helps to typeset exercises or list of exercises within any +document. + +Exercises, questions, sub-questions are automatically numbered. It is +possible to put answers in the same document, and display them +immediately, later in the document or not at all. + +The layout of exercise is fully customisable. It is then possible to typeset +long problems, short exercises, questionnaires, etc. + +Usage of the babel package is detected, but not fully supported by now +(only english and french are implemented). See documentation for more +information. + +Copyright: +---------- + +Copyright (C) 2004 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. + + +Installation: +------------- + +- execute latex on exercise.ins + +- execute latex on exercise.dtx + +- produce Index and Change History with + + makeindex -s gind.ist -o exercise.ind exercise.idx + makeindex -s gglo.ist -o exercise.gls exercise.glo + +- and then execute latex on exercise.dtx (again !) + +- copy exercise.sty and exercise.pdf to the correct places in the texmf +tree. exercise.sty could be put in + + $LOCALTEXMF\tex\latex\exercise + +exercise.pdf is the documentation of the package: it could take place +in + + $TEXMF\doc\latex\exercise + +- run texhash or the corresponding command of your distribution + + +To do: +------ + +- Add more languages. + + +Change log: +----------- +- v1.6 2014-10-20 Added \AtBeginExercise and \AddBeginAnswer + (following a suggestion of Daniel Turner) + Portuguese translation fixed. + Russian translation added + (thx to Andreï V. Kostyrka) + Added \AnswerSkipBefore and \AnswerSkipAfter + (thx to Alexander Malkis) + Bugs corrected. +- v1.58 2012-05-08 Minor modification to avoid pagebreak after + exercise and answer heading + (thx to Mathias Magdowski) +- v1.57 2011/07/19 Bug correction on exercise selection + (thx to Tobias Isenberg) +- v1.56 2011/05/10 Portuguese translation added + (thx to José Romildo Malaquias) +- v1.55 2011/03/13 Command \refAnswer added (thx to Ferenc Wettl) +- v1.54 2010/12/14 Corrected a bug with infinite loop in Answer +- v1.53 2010/11/27 Exercise selection now works correctly +- v1.52 2010/10/09 New skip added + German support added (thx to Peter Zimmermann) +- v1.5 2010/10/03 Label and reference now corrects + Dutch support added (thx to Frank Koenders) +- v1.4 2010/08/27 Many bugs corrected + Exercise selection reviewed +- v1.31 2009/03/28 Italian support added +- v1.3 2009/03/26 Spanish support added + List of exercices support + Bug corrected +- v1.2 2006/04/22 A basic exercice selection mechanism added. +- v1.11 2004/09/08 Corrected a bug preventing the correct + use of the babel package. +- v1.1 2004/09/05 Added the \renewcounter command +- v1 2004/08/19 First release + +19 aout 2004 +Paul Pichaureau +paul.pichaureau@alcandre.net diff --git a/macros/latex/contrib/exercise/exercise.dtx b/macros/latex/contrib/exercise/exercise.dtx new file mode 100644 index 0000000000..9ffb04cf2e --- /dev/null +++ b/macros/latex/contrib/exercise/exercise.dtx @@ -0,0 +1,1806 @@ +% \iffalse meta-comment +% +% Copyright (C) 2003-2006 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 +% +% \fi +% \iffalse +%\NeedsTeXFormat{LaTeX2e}[1999/12/01] +%\ProvidesPackage{exercise} +% [2014/10/20 v1.6 Exercise package (P.Pichaureau)] +%<*driver> +\documentclass{ltxdoc} +\usepackage{exercise} +\usepackage[latin1]{inputenc} +\usepackage{xspace,fancyvrb} +\usepackage{hyperref} +%% \IfFileExists{hyperref.sty}{\usepackage[bookmarksopen]{hyperref}}{} +%% \def\PrintDescribeMacro#1{} +%% \def\PrintDescribeEnv#1{} +\newenvironment{decl}[1][]% + {\par\small\addvspace{4.5ex plus 1ex}% + \vskip -\parskip + \ifx\relax#1\relax + \def\@decl@date{}% + \else + \def\@decl@date{\NEWfeature{#1}}% + \fi + \noindent\hspace{-\leftmargini}% + \begin{tabular}{|l|}\hline\ignorespaces}% + {\\\hline\end{tabular}\nobreak\@decl@date\par\nobreak + \vspace{2.3ex}\vskip -\parskip} +\makeatletter + \EnableCrossrefs \PageIndex +\makeatother +\begin{document} + \DocInput{exercise.dtx} +\end{document} +% +% \fi +%% \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 \~} +%% +% \DoNotIndex{\#,\$,\%,\&,\@,\\,\{,\},\^,\_,\~,\ } +% \DoNotIndex{\@ne,\@auxout,\@ifnextchar,\@ifstar,\@ifundefined,\@bsphack,\@esphack,\@fleqnfalse} +% \DoNotIndex{\advance,\begingroup,\begin,\bgroup,\catcode,\closein,\closeout} +% \DoNotIndex{\day,\def,\edef,\else,\empty,\endgroup,\end,\egroup,\errmessage} +% \DoNotIndex{\expandafter,\fi,\futurelet,\gdef,\global,\if,\ifeof} +% \DoNotIndex{\ifx,\immediate,\let,\loop,\m@ne,\message,\month} +% \DoNotIndex{\newcount} +% \DoNotIndex{\newif,\newlinechar,\newread,\newtoks,\newwrite} +% \DoNotIndex{\noexpand,\openin,\openout,\par,\quad,\read,\relax,\repeat} +% \DoNotIndex{\space,\the,\undefined,\write,\xdef,\year,\z@} +% \DoNotIndex{\item,\copy,\arabic,\addto,\addtolength,\alph} +% \DoNotIndex{\ref,\Roman,\rmdefault,\or,\number,\medskip,\makebox} +% \DoNotIndex{\fbox,\label,\ifcase,\ifnum,\ignorespaces,\newcommand} +% \DoNotIndex{\renewenvironment,\renewcommand,\refstepcounter,\newenvironment} +% \DoNotIndex{\setlength,\string,\textbf,\textsc,\emph,\whiledo,\vbox} +% \DoNotIndex{\unvbox,\usefont,\usecounter,\value,\vskip,\setbox,\setcounter} +% +%\CheckSum{2004} +% +% +% \GetFileInfo{exercise.sty} +% +% \makeatletter +% \IndexPrologue{\section*{Index}% +% \markboth{Index}{Index}% +% For entries in type-writer font, numbers written in italic +% refer to the page where the corresponding entry is +% described; numbers underlined refer to the +% \ifcodeline@index code line of the \fi definition; +% numbers in roman refer to the \ifcodeline@index code +% lines \else pages \fi where the entry is used. } +% \makeatother +%\title{\texttt{exercise.sty} : a package to typeset exercises} +% +%\date{\today} +% +%\author{Paul Pichaureau\\ \texttt{paul.pichaureau@alcandre.net}} +% +%\maketitle +% +%\begin{abstract} +% This package offers a simple environment to typeset exercises, +% and their questions, sub-questions, indications, answers and so +% on. +% +% The layout of the exercises is fully customisable. Moreover, the +% answers of the exercise could be typeset immediately or +% later in the document. +%\end{abstract} +% +% \tableofcontents +%\section{Options of the package} +% +%\index{package>options}\index{options>of the package} +% +%Here we list the options of the package |exercise.sty|: +% +%\begin{description} +% \item[|noexercise|] hide all the exercises +% of a document. +% +% \item[|noanswer|] hide all the answers +% of a document. The default behaviour is to show both the exercises +% and the answers. +% +% +% \item[|exerciseonly|] is a synonym of |noanswer|. +% +% \item[|answeronly|] is a synonym of |noexercise|. +% +% \item[|nothing|] hide answers and exercises (synonym of +% |noanswer| and |noexercise|). +% +% \item[|answerdelayed|] save the answers instead of typeset +% them. The answers can be included later in the document with the +% command |\shipoutAnswer|. +% +% More precisely, the answers are stored +% in a vertical box. When |\shipoutAnswer| is encountered, this box +% is emptied and its contents is placed in the main vertical +% list. The answers defined later are placed in this emptied +% vertical box. In this way, you can have many group of answers in +% the same document. +% +% \item[|exercisedelayed|] saves the exercises instead of +% typeset them. The exercises can be included later with the command +% |\shipoutExercise|. +% +% \item [|lastexercise|] if no references is given for an +% answer, then the answer is supposed to refer to the last +% exercise (see section \ref{sec:lastexercise}). +% +%\end{description} +% +% +%\section{Commands} +% +%\label{sec:option} +% +%\subsection{Exercises and answers} +% +% +%\begin{decl} +% |\begin{Exercise}| \oarg{key val list} ... |\end{Exercise}| \\ +% |\begin{Exercise*}| \oarg{key val list} ... |\end{Exercise*}| +%\end{decl} +% +%\DescribeEnv{Exercise}\DescribeEnv{Exercise*} +%The |Exercise| environment is used to typeset just one exercise. We +%use the \textsf{keyval} package to give different informations about +%an exercise. +% +%The |Exercise*| environment typeset an exercise without number, and +% without puting it in the |listofexercices|. +% +%\vspace*{-\baselineskip} +% +%\index{options>of \texttt{Exercise}} +%\index{keys>of \texttt{Exercise}} +%\begin{decl} +%|label|=\marg{string}\\ +%|title|=\marg{string}\\ +%|difficulty|=\marg{number}\\ +%|origin|=\marg{string}\\ +%|name|=\marg{string}\\ +%|counter|=\marg{counter}\\ +%|number|=\marg{string} +%|exam|=\marg{string} +%|year|=\marg{string} +%\end{decl} +%All these keys define commands that will be available later to typeset +%the exercise. They are all optional. +%\begin{description} +% \item[|label|] The label of the exercise. This label can be +% used later in cross-reference, or to link an answer to this +% exercise. +% \item[|title|] The title of the exercise. It will be available +% later with the command |\ExerciseTitle|. +% \item[|difficulty|] The difficulty of the exercise (a number). +% It will be available later with the counter +% |\ExerciseDifficulty|. +% \item[|origin|] The origin of the exercise. +% It will be available later with the command |\ExerciseOrigin|. +% \item[|name|] In document, exercises can have multiple +% denomination, like problem, exam, or even question. This key +% allows to change the denomination. This denomination is accessible +% with the command |\ExerciseName|. +% \item[|counter|] Use the given counter to number this +% exercise. Here, \marg{counter} must be a pre-defined counter. +% \item[|number|] Use the given number for the exercise. In +% fact, this number is a string, so you can number the exercise +% with letters. +% \item[|exam|] To keep track of exams associated with the exercise. +% \item[|year|] To keep track of the year you have given the +% exercise. +%\end{description} +% +%\bigskip[1] +% +%As an example, with the default definitions, the following code: +%\medskip +%\begin{verbatim} +%\begin{Exercise}[title={Euler's constant}, difficulty=2, label=ex1, +% origin={P.Paelw}] +%\end{Exercise} +%\end{verbatim} +%\noindent will give \par \medskip +%\index{example} +%\noindent \fbox{\begin{minipage}[t]{.95\textwidth} +%\begin{Exercise}[title={Euler's constant}, difficulty=2, label=ex1, +% origin={P.Paelw}] +%\end{Exercise} +%\end{minipage}} +% +%\DescribeEnv{Problem} +%It is possible to define different type of exercise. For example, +%you can define a |Problem| environment with the two lines: +%\begin{verbatim} +% \newcounter{Problem} +% \newenvironment{Problem}{\begin{Exercise}[name={Problem}, +% counter={Problem}]} +% {\end{Exercise}} +%\end{verbatim} +%Anyway, all type of exercise will have the same layout in the document. +% +%\begin{decl} +% |\begin{Answer}| \oarg{key val list} ... |\end{Answer}| +%\end{decl} +% +%\DescribeEnv{Answer} +%The |Answer| environment is used to typeset the answer of an +%exercise. To determine to which exercise this answer is attributed +%to, you can use the two following keys. +% +%\vspace*{-\baselineskip} +%\index{options>of \texttt{Answer}} +%\index{keys>of \texttt{Answer}} +%\begin{decl} +%|ref|=\marg{string}\\ +%|number|=\marg{string} +%\end{decl} +%\begin{description} +% \item[|ref|] a \LaTeX\ reference. \emph{Must} correspond to the |label| +% key of an exercise. +% \item[|number|] if the answer refers to an exercise in +% another document, you can set the number of the exercise with this +% key. It is in fact a string. +%\end{description} +% +%\label{sec:lastexercise} If the package is loaded with the option +% |lastexercise| and if no |ref| and no |number| key is given, then +% the last exercise is taken as a reference for the answer. +% +%If no |ref| and no |number| key is given and the option |lastexercise| +%is not activated, a Package Warning is displayed. +% +%\begin{decl} +% |\begin{ExerciseList}| \\ +% \quad |\Exercise|\oarg{key val list} \\ +% \quad |\Answer|\oarg{key val list} \\ +% |\end{ExerciseList}| +%\end{decl} +% +%\DescribeEnv{ExerciseList} +%The |ExerciseList| environment is a convenience to typeset a list of +%small exercises. In |ExerciseList|, everything between two |\Exercise| +%or |\Answer| tags is interpreted as the body of an exercise (or an +%answer). +% +%\DescribeMacro{\Exercise} +%\DescribeMacro{\Exercise*} +%\DescribeMacro{\Answer} +%The command |\Exercise| inside |ExerciseList| accepts the same keys +%than the |Exercise| environment. The command |\Answer| inside +%|ExerciseList| accepts the same keys than the |Answer| environment and +%behaves in the same way. +% +%\subsection{Parts and questions} +% +%\begin{decl} +% |\ExePart|\oarg{key val list} \\ +% |\ExePart*|\oarg{key val list} +%\end{decl} +%\DescribeMacro{\ExePart} +%\DescribeMacro{\ExePart*} +%It is common to split large exercise in parts: it is the purpose of +%the |\ExePart| command. +%\index{options>of \texttt{\bslash ExePart}} +%\index{keys>of \texttt{\bslash ExePart}} +%The keys |title|, |name| and |difficulty| are +%available for this command. +% +%For example, a non-numbered preliminary part is obtained with +%\begin{verbatim} +% \ExePart*[name={Preliminary}] +%\end{verbatim} +% +%\begin{decl} +% |\Question|\oarg{key val list}\\ +% |\subQuestion|\oarg{key val list}\\ +% |\subsubQuestion|\oarg{key val list} +%\end{decl} +%\DescribeMacro{\Question} +%\DescribeMacro{\subQuestion} +%\DescribeMacro{\subsubQuestion} +%These three commands define the hierarchy of questions. A +%|\subsubQuestion| cannot be preceded by a |\Question| or a +%|\begin{Exercise}|. A |\subQuestion| cannot be preceded by a +% |\begin{Exercise}|. If one of these cases is detected, a Package +% Error is displayed. +% +%\index{options>of \texttt{\bslash Question}} +%\index{keys>of \texttt{\bslash Question}} +%\index{options>of \texttt{\bslash subQuestion}} +%\index{keys>of \texttt{\bslash subQuestion}} +%\index{options>of \texttt{\bslash subsubQuestion}} +%\index{keys>of \texttt{\bslash subsubQuestion}} +%Two keys are available for these commands: |title| and |difficulty|. +% +%\begin{decl} +% |\ExeText| +%\end{decl} +%\DescribeMacro{\ExeText} +%The text following this command has the same status that the first +%indications of the exercise. So, the next level of the hierarchy must +%be a |\ExePart| or a |\Question|. +% +% +% +%\subsection{Exercise selection} +%\begin{decl} +% |\ExerciseSelect|\oarg{key val list}\\ +% |\ExerciseSelect*|\oarg{key val list}\\ +% |\ExerciseStopSelect| +%\end{decl} +%\DescribeMacro{\ExerciseSelect} +%\DescribeMacro{\ExerciseStopSelect} +% +% A very basic exercise selection mechanism is provided. When +% |\ExerciseSelect| is used, an exercise is printed if and only +% if the value of its keys are within the values specified after +% |\ExerciseSelect|. For example, the following command +%\begin{verbatim} +% \ExerciseSelect[type={short}, difficulty={0,1}] +%\end{verbatim} +%selects the short exercises of difficulties 0 and 1, whereas +%\begin{verbatim} +% \ExerciseSelect[label={exe1,exe10,exe11}] +%\end{verbatim} +%selects the exercises with label |exe1|, |exe10| and |exe11|. It is important +%to \emph{not} have spaces before or after the commas. +% +%With |\ExerciseStartSelect*|, the exercises which fit the conditions +%are \emph{omited} instead of selected. +% +%Last, |\ExerciseStopSelect| stops the processus of selection: every +%exercise will be displayed later. +% +%The purpose of these commands is to select exercises within a long list +%stored on an auxiliary file. +% +%\subsection{References} +% +%If you want to make a cross-reference to an exercise, you must use +%the |label| key of the |Exercise| command. Afterward, you can use the +%usual \LaTeX commands |\ref|, |\pageref| and so on. +% +%The |hyperref| package should work normaly, but you must load it +%\emph{before} the |exercise| package. +% +%\begin{decl} +% |\refAnswer|\marg{label} +%\end{decl} +%\DescribeMacro{\refAnswer} Whenever an answer is connected to an +%exercise \emph{via} the |ref| key, a label \emph{Exercise +%label}|-Answer| is created. In this way, you can easily make +%reference to a given exercise. +% +%The |\refAnswer| command is another way to reference the answer of a +%given exercise : its argument is the label of an exercise without the +%postfix |-Answer|. +% +%In this way +%\begin{verbatim} +% \ref{ex1-Answer} \refAnswer{ex1} +%\end{verbatim} +%are two equivalent ways to reference the answer of the preceding +%exercise labeled~|ex1|. +% +%Remember that inside an |Exercise| the command |\ExerciseLabel| +%stores the label of the exercise. So another way to reference the +%exercise \emph{inside} is own code is +%\begin{verbatim} +% \ref{\ExerciseLabel} +%\end{verbatim} +% +%\subsection{Extra stuff} +%\DescribeMacro{\marker} +%\DescribeMacro{\DifficultyMarker} +%The difficulty of an exercise is represented by a certain amount of +%stars. The command |\marker| is used to typeset the difficulty of an +%exercise. +%\begin{verbatim} +% \marker +%\end{verbatim} +%displays || repeated || times. For example |\marker*2| +% gives **, and |\marker+{14}| gives ++++++++++++++ +% +%By default, the difficulty is symbolized by star. You can customise +%this by redefining the command |\DifficultyMarker|. +% +%\bigskip +%\changes{v1.3}{2009/03/26}{Added the 'listofexercices' features.} +%\DescribeMacro{\listofexercises} +%This command add a list of all the exercise in your document. +% +%\begin{decl} +% |\ListOfExerciseInToc|\\ +% |\ExerciseLevelInToc|\marg{level of exercices} +%\end{decl} +%\DescribeMacro{\ListOfExerciseInToc} +%\DescribeMacro{\ExerciseLevelInToc} +%If you prefer to display this list of exercises in the table of +%contents, then use the command |\ListOfExerciseInToc|. +% +%By default, the exercises appear in the table of content at the same +% level as the paragraphs. The command |\ExerciseLevelInToc| is used +% to customize this behaviour. For example with the command +% |\ExerciseLevelInToc{subsection}| the exercises will appear at the +% same level as the subsctions. Avalaible levels are: section, +% subsection, subsubsection, paragraph and subparagraph. +% +%\section{Customisation} +% +%\label{sec:custom} +% +%\subsection{Internationalisation} +% +%\begin{decl} +%|\ExerciseName|\\ +%|\ExerciseListName|\\ +%|\AnswerName|\\ +%|\AnswerListName|\\ +%|\ExePartName|% +%\end{decl} +%\DescribeMacro{\ExerciseName} +%\DescribeMacro{\ExerciseListName} +%\DescribeMacro{\AnswerName} +%\DescribeMacro{\AnswerListName} +%\DescribeMacro{\ExePartName} +%\DescribeMacro{\ExePartListName} +%These commands store various hard-wired string. |\ExerciseListName| +%is used in the |ExerciseList| environment: it is possibly an +%abbreviation of the word ``Exercise". +% +%\textsf{Exercise.sty} automatically detects the usage of +% \textsf{babel} and translate these terms in the language loaded... +% if I (the author) know the translation! +% +% By now, and thanks to many contributors, english, french, spanish, +% italian, dutch, german, portugese and russian are supported. +% +%If you sent me the translations in your language, I will be happy to +%add them in the package. Anyway, you can redefine these +%commands (with a |\renewcommand|). +% +%You must load the \textsf{exercise} package \emph{after} +%\textsf{babel} to activate this option. +% +%\subsection{Layout} +% +%\subsubsection{Exercises, answers and parts} +% +%For the layout of the exercises, two levels of customisation are +%available. First, you can customise the way the informations will be +%typeset, and then you can customise the way these pieces of +%informations are typeset together. +% +%\begin{decl} +% |\ExerciseHeaderTitle| \\ +% |\ExerciseHeaderDifficulty| \\ +% |\ExerciseHeaderOrigin|\\ +% |\ExerciseHeaderNB| +%\end{decl} +%\DescribeMacro{\ExerciseHeaderTitle} +%\DescribeMacro{\ExerciseHeaderDifficulty} +%\DescribeMacro{\ExerciseHeaderOrigin} +%\DescribeMacro{\ExerciseHeaderNB} +%These commands are used to typeset the corresponding information: +%\\ |\ExerciseHeaderTitle| corresponds to the |title| key, \\ +%|\ExerciseHeaderDifficulty| to the |difficulty| key, +%|\ExerciseHeaderOrigin| to the |origin| key and |\ExerciseHeaderNB| to +%the number of the exercise. +% +%In these commands, you specify the fonts to use, the space around the +%information, some symbols (like dash or dot) you want to put here, and +%so on. If the key is not present in the definition of the exercise, +%then the corresponding part of the header will be emptied by the package. +% +%For example the default definition of |\ExerciseHeaderTitle| is +%\begin{verbatim} +% \newcommand{\ExerciseHeaderTitle}{\quad---\quad\ExerciseTitle} +%\end{verbatim} +%If an exercise has a title, then this title will be displayed preceded +%by an emdash (as you can see in exercise \ref{ex1} of this +%document). If an exercise doesn't have a title, then this command is +%set to nothing (precisely to |{}|) during the exercise. +% +%These commands can be redefined with a |\renewcommand|. You don't have +%to worry about the ``undefinition" mechanism: the package manages that +%by itself. +% +%\begin{decl} +% |\ExerciseHeader| \\ +% |\ExerciseListHeader| +%\end{decl} +%\DescribeMacro{\ExerciseHeader} +%\DescribeMacro{\ExerciseListHeader} +%When the layout of all the elements has been fixed, they are collected +%in the |\ExerciseHeader| command (or in |\ExerciseListHeader|). +%Here, you specify the way the different elements are mixed +%together. +% +%The default definition of |\ExerciseHeader| is +%\begin{verbatim} +% \newcommand{\ExerciseHeader}{\centerline{\textbf{\large +% \ExerciseName\ExerciseHeaderNB\ExerciseHeaderTitle +% \ExerciseHeaderOrigin\medskip}}} +%\end{verbatim} +%\noindent which displays all the informations in a centered line, using +%a large bold default font. +% +%\begin{decl} +% |\AnswerHeader| \\ +% |\AnswerListHeader| +%\end{decl} +%\DescribeMacro{\AnswerHeader} +%\DescribeMacro{\AnswerListHeader} +%The same mechanism is implemented for the answers. +%|\AnswerHeader| and |\AnswerListHeader| specifies the way the header +%of answers are typeset. In the definition of these commands, you can +%use freely the informations of the related exercise. For example, this +%is the default definition of |\AnswerHeader|: +% +%\begin{verbatim} +% \newcommand{\AnswerHeader}{\medskip\centerline{\textbf{ +% Answer of \ExerciseName\ \ExerciseHeaderNB}\smallskip}} +%\end{verbatim} +% +% +%\begin{decl} +% |\ExePartHeaderTitle| \\ +% |\ExePartHeaderDifficulty| \\ +% |\ExePartHeaderNB|\\ +% |\ExePartHeader|\\ +% |\ExePartListHeader| +%\end{decl} +%\DescribeMacro{\ExePartHeaderTitle} +%\DescribeMacro{\ExePartHeaderDifficulty} +%\DescribeMacro{\ExePartHeaderNB} +%\DescribeMacro{\ExePartHeader} +%\DescribeMacro{\ExePartListHeader} +%The same kind of customisation is available for the |\ExePart| +%command: |\ExePartHeaderTitle|, |\ExePartHeaderDifficulty| and +%|\ExePartHeaderNB| \\ control the way the title (|\ExePartTitle|), the +%difficulty (|\ExePartdifficulty|) and the number (|\theExePart|) of +%the part are displayed. +% +%These pieces are collected in the command |\ExePartHeader| or +%\\ |\ExePartListHeader|. +% +%\DescribeMacro{\AtBeginExercise} +%\DescribeMacro{\AtBeginAnswer} +%Finally, you can use the commands |\AtBeginExercise| +%and |\AtBeginAnswer|. They are executed respectively at the beginning +%of each exercise/each answer. +% +%For example, if you want all the answer typeset in italic shape, use +% \begin{verbatim} +%\newcommand{\AtBeginAnswer}{\itshape} +% \end{verbatim} +% +%\changes{v1.6}{2014/10/20}{Added new commands |\AtBeginExercise| +%and |\AtBeginAnswer|.} +% +% +%\subsubsection{Questions, sub-questions and sub-sub-questions} +% +%The layout of the questions is a little more rigid. Somehow, it can be +%customised. +% +%\begin{decl} +% |\QuestionHeaderTitle| \\ +% |\QuestionHeaderDifficulty| \\ +% |\QuestionHeaderNB| +%\end{decl} +% +%\DescribeMacro{\QuestionHeaderTitle} +%\DescribeMacro{\QuestionHeaderDifficulty} +%\DescribeMacro{\QuestionHeaderNB} +%\DescribeMacro{\subQuestionHeaderTitle} +%\DescribeMacro{\subQuestionHeaderDifficulty} +%\DescribeMacro{\subQuestionHeaderNB} +%\DescribeMacro{\subsubQuestionHeaderTitle} +%\DescribeMacro{\subsubQuestionHeaderDifficulty} +%\DescribeMacro{\subsubQuestionHeaderNB} +%These commands plays the same role that the corresponding command +%relating to exercises. But here, no |\QuestionHeader| is defined. +% +%The |subQuestion| and |subsubQuestion| versions of these commands are +%also defined. +% +%All of these commands can be changed using |\renewcommand|. +% +% +%\subsection{Lengths} +% +%\changes{v1.52}{2011/11/09}{Added the 'ExerciseSkipBefore' +%and 'ExerciseSkipAfter' skip.} +%\changes{v1.6}{2014/10/20}{Added the 'AnswerSkipBefore' +%and 'AnswerSkipAfter' skip.} +%\begin{decl} +% \begin{tabular}{l} +% |\ExerciseSkipBefore| \\ +% |\ExerciseSkipAfter| \\ +% |\AnswerSkipBefore| \\ +% |\AnswerSkipAfter| +%\end{tabular} +%\end{decl} +%\DescribeMacro{ExerciseSkipBefore} +%\DescribeMacro{ExerciseSkipAfter} +%\DescribeMacro{AnswerSkipBefore} +%\DescribeMacro{AnswerSkipAfter} +%Before every |Exercise| environment the vertical skip +%|ExerciseSkipBefore| is added. The corresponding |ExerciseSkipAfter| +%vertical skip is added after every |Exercise| environment. +%|AnswerSkipBefore| and |AnswerSkipAfter| are the amount of vertical +%spaces inserted before an after each answer. +%\begin{decl} +% \begin{tabular}{llll} +% |\Exesep| & |\Exetopsep| & |\Exeparsep| & +% |\Exepartopsep| \\ +% |\Exeleftmargin| & |\Exerightmargin| & |\Exelabelwidth| +% & |\Exelabelsep| +%\end{tabular} +%\end{decl} +%\DescribeMacro{Exesep} +%\DescribeMacro{Exetopsep} +%\DescribeMacro{Exeparsep} +%\DescribeMacro{Exepartopsep} +%\DescribeMacro{Exeleftmargin} +%\DescribeMacro{Exerightmargin} +%\DescribeMacro{Exelabelsep} +%These lengths have an effect only inside an |ExerciseList| environment. +%This environment is nothing more than a |list| +%environment. All the parameters of \LaTeX's lists are +%available. Please consult your favourite source of information to have +%the exact definitions of these lengths. +% +%\begin{decl} +% \begin{tabular}{ll} +% |\QuestionBefore| & |\QuestionIndent| \\ +% |\subQuestionBefore| & |\subQuestionIndent| \\ +% |\subsubQuestionBefore| & |\subsubQuestionIndent| \\ +% \end{tabular} +%\end{decl} +%\DescribeMacro{QuestionBefore} +%\DescribeMacro{QuestionIndent} +%\DescribeMacro{subQuestionBefore} +%\DescribeMacro{subQuestionIndent} +%\DescribeMacro{subsubQuestionBefore} +%\DescribeMacro{subsubQuestionIndent} +%Here, |\QuestionBefore| is the vertical space above |\Question|, and\\ +%|\QuestionIndent| it the horizontal distance added to the margin in +%question. Same thing for |\subQuestion| and |\subsubQuestion|. +% +% \subsection{The \texttt{\textbackslash renewcounter} command} +% +%\changes{v1.1}{2004/09/05}{Added the 'renewcounter' command.} +% +% In a document, you will probably want to customise the way the +% |Exercise| counter will reseted. Strangely, it is impossible to +% redefined counter with \LaTeX. There is no equivalent of the +% |\renewcommand| command for the counters. +% +% We provide such an equivalent with the command |\renewcounter|. +%\DescribeMacro{\renewcounter} +% +%\begin{decl} +% |\renewcounter|\marg{foo}\oarg{counter} +%\end{decl} +% The |\renewcounter| command defines a new counter named |foo|. The +% counter is initialized to zero. +% +% The optional argument \oarg{counter} causes the counter |foo| to be +% reset whenever the counter named in the optional argument is +% incremented. +% +% If the counter |foo| was not previously defined, a \LaTeX\ error +% occurs. +% +%\section{Known problems} +% +%The commands |\Question|, |\subQuestion|, etc. are heavily based +%on |list| environment. These lists are hidden (I know it's bad!) to +%simplify the syntax of the source file (I think it's nice!). +% +%In fact, every |\Question| is like the beginning of an environment, +%which is closed at the next |\Question| (the exact mechanism is a +%little bit more complicated). +% +%Consequently it's dangerous to put questions inside environment. +%The following code will lead to an error: +%\vspace*{-.5\baselineskip} +%\begin{verbatim} +% \begin{Exercise} +% \begin{multicols}{2} +% \Question ... +% \Question ... +% \end{multicols} +% \end{Exercise} +%\end{verbatim} +%Of course, you can put entire exercise inside other environment (like +%|minipage|). The following code will work: +%\vspace*{-.5\baselineskip} +%\begin{verbatim} +% \begin{multicols}{2} +% \begin{Exercise} +% \Question ... +% \Question ... +% \end{Exercise} +% \end{multicols} +%\end{verbatim} +% +%\begin{decl} +% |\EndCurrentQuestion|\\ +% |\EndCurrentsubQuestion|\\ +% |\EndCurrentsubsubQuestion| +%\end{decl} +%\DescribeMacro{\EndCurrentQuestion} +%\DescribeMacro{\EndCurrentsubQuestion} +%\DescribeMacro{\EndCurrentsubsubQuestion} +%If you really need to put some questions inside environment, you must +%use the command |\EndCurrentQuestion| just before ending the +%environment. This command ends the question's ``environment". So, +%this code will work: +%\vspace*{-.5\baselineskip} +%\begin{verbatim} +% \begin{Exercise} +% \begin{multicols}{2} +% \Question ... +% \Question ... +% \EndCurrentQuestion +% \end{multicols} +% \end{Exercise} +%\end{verbatim} +% +% +% +% +% +%In |ExerciseList| environment, the command |\Exercise| shouldn't be +%followed by an empty line. +% +% \PrintChanges +% +%\makeatletter\c@IndexColumns = 2\makeatother +% \StopEventually{\PrintIndex\newpage\tableofcontents } +% +% \section{Implementation} +% +% \subsection{Package options} +% This part deals with the package options. Nothing more than an +% affair of boolean. +% \begin{macrocode} +\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} {\@AnswerOutputtrue\@ExerciseOutputfalse} +\DeclareOption{noexercise} {\@ExerciseOutputfalse} +\DeclareOption{exerciseonly} {\@AnswerOutputfalse} +\DeclareOption{outputnothing}{\@ExerciseOutputfalse\@AnswerOutputfalse} +\DeclareOption{exercisedelayed}{\@ExerciseDelaytrue} +\DeclareOption{answerdelayed}{\@AnswerDelaytrue} +\DeclareOption{lastexercise} {\@AswLastExetrue} +% \end{macrocode} +% The following option, which displays the exercise label in margin, is +% not implemented yet. +% \begin{macrocode} +\newif\if@ShowLabel \@ShowLabelfalse +\DeclareOption{showlabel} {\@ShowLabeltrue} + +\ProcessOptions +% \end{macrocode} +% The only required package are \textsf{keyval} and \textsf{ifthen}. +% \begin{macrocode} +\RequirePackage{keyval, ifthen} +% \end{macrocode} +% +%\subsection{Customisation} +% +%\subsubsection{Internationalisation} +%\changes{v1.11}{2004/09/08}{Corrected a bug preventing the correct +%use of the \textsf{babel} package.} +% \begin{macrocode} +\def\listexercisename{List of exercises}% +\def\ExerciseName{Exercise}% +\def\AnswerName{Answer of exercise}% +\def\ExerciseListName{Ex.}% +\def\AnswerListName{Answer}% +\def\ExePartName{Part}% +\def\ArticleOf{of\ }% +\@ifpackageloaded{babel}{ +\addto{\captionsfrenchb}{ + \def\listexercisename{Liste des exercices}% + \def\ExerciseName{Exercice}% + \def\AnswerName{Solution de l'exercice}% + \def\ExerciseListName{Ex.}% + \def\AnswerListName{Solution}% + \def\ExePartName{Partie}% +} +\addto{\captionsspanish}{ + \def\listexercisename{\'{I}ndice de \es@uclc Eejercicios}% + \def\ExerciseName{Ejercicio}% + \def\AnswerName{Soluci\'on del ejercicio}% + \def\ExerciseListName{Ej.}% + \def\AnswerListName{Soluci\'on}% + \def\ExePartName{Parte}% + \def\ArticleOf{del\ }% + } +\addto\captionsitalian{% + \def\listexercisename{Indice degli esercizi} + \def\ExerciseName{Esercizio}% + \def\AnswerName{Soluzione dell'esercizio}% + \def\ExerciseListName{Es.}% + \def\AnswerListName{Soluzione}% + \def\ExePartName{Parte}% +} +\addto\captionsdutch{% + \def\listexercisename{Lijst van opdrachten} + \def\ExerciseName{Opdracht} + \def\AnswerName{Oplossing van opdracht} + \def\ExerciseListName{Opg.} + \def\AnswerListName{Oplossing} + \def\ExePartName{Deel} + \def\ArticleOf{van\ } +} +\addto\captionsgerman{% + \def\listexercisename{Liste der {\"U}bungen}% + \def\ExerciseName{{\"U}bung}% + \def\AnswerName{L{\"o}sung zu {\"U}bung}% + \def\ExerciseListName{{\"U}b.}% + \def\AnswerListName{L{\"o}sung}% + \def\ExePartName{Teil}% + \def\ArticleOf{von\ }% +} +\addto\captionsngerman{% + \def\listexercisename{Liste der {\"U}bungen}% + \def\ExerciseName{{\"U}bung}% + \def\AnswerName{L{\"o}sung zu {\"U}bung}% + \def\ExerciseListName{{\"U}b.}% + \def\AnswerListName{L{\"o}sung}% + \def\ExePartName{Teil}% + \def\ArticleOf{von\ }% +} +\addto\captionsportugese{% +\def\listexercisename{Lista de exerc\'icios}% +\def\ExerciseName{Exerc\'icio}% +\def\AnswerName{Solução do exerc\'icio}% +\def\ExerciseListName{Ex.}% +\def\AnswerListName{Solu\c{c}\~ao}% +\def\ExePartName{Parte}% +\def\ArticleOf{de\ }% +} +\addto{\captionsrussian}{ + \def\listexercisename{Список упражнений}% + \def\ExerciseName{Упражнение}% + \def\AnswerName{Ответ к упражнению}% + \def\ExerciseListName{Упр.}% + \def\AnswerListName{Ответ}% + \def\ExePartName{Часть}% + \def\ArticleOf{из\ }% +} +}{} +% \end{macrocode} +%\subsubsection{Layout} +% First a bunch of length definitions. +% \begin{macrocode} +\newlength{\ExerciseSkipBefore} +\setlength{\ExerciseSkipBefore}{1\baselineskip} +\newlength{\ExerciseSkipAfter} +\setlength{\ExerciseSkipAfter}{0\baselineskip} +\newlength{\AnswerSkipBefore} +\setlength{\AnswerSkipBefore}{0\baselineskip} +\newlength{\AnswerSkipAfter} +\setlength{\AnswerSkipAfter}{0\baselineskip} +\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} +% \end{macrocode} +% Now the counters +% \begin{macrocode} +\newcounter{Exercise} +\newcounter{Answer} +\gdef\@ExerciseCounter{Exercise} %default exercise counter +\gdef\@AnswerCounter{Answer} %default answer counter +\@ifpackageloaded{hyperref}{ +\def\@setAnswerref#1#2#3#4{% + \ifx#1\relax + \protect\G@refundefinedtrue + \nfss@text{\reset@font\bfseries ??}% + \PackageWarning{exercise}{Reference to Answer of `#3' on page + \thepage \space undefined}% + \else + \hyperref[#4]{\expandafter#2#1}\null + \fi} +\def\refAnswer#1{\expandafter\@setAnswerref\csname r@#1\endcsname\@firstoffive{#1}{#1-Answer}}} +{\let\refAnswer\ref} +\newcounter{ExePart}[Exercise] +\newcounter{Question}[Exercise] +\newcounter{subQuestion}[Question] +\newcounter{subsubQuestion}[subQuestion] +% \end{macrocode} +% Presentation of these labels in cross references +% \begin{macrocode} +\renewcommand{\theExercise}{\if@ExeStared\else\arabic{\@ExerciseCounter}\fi} +\renewcommand{\theExePart}{\Roman{ExePart}} +\renewcommand{\theQuestion}{\arabic{Question}} +\renewcommand{\thesubQuestion}{\alph{subQuestion}} +\renewcommand{\thesubsubQuestion}{\roman{subsubQuestion}} +% \end{macrocode} +% For internal purposes +% \begin{macrocode} +\newcounter{savedQuestion} +\newcounter{savedsubQuestion} +\newcounter{savedsubsubQuestion} +% \end{macrocode} +% The |\marker| command. +% \begin{macrocode} + \def\marker#1#2{\@tempcnta#2\whiledo{\@tempcnta>0}{#1\advance + \@tempcnta by -1 }} +% \end{macrocode} +% Symbol used to indicate the difficulty of an exercise or a question +% \begin{macrocode} +\def\DifficultyMarker{*} +% \end{macrocode} +% Commands executed respectively at the begin of an exercise and at the +% beginning of an Answer (in both case, \emph{after} the header). +% \begin{macrocode} +\newcommand{\AtBeginExercise}{} +\newcommand{\AtBeginAnswer}{} +% \end{macrocode} +% Presentation of informations in the header of exercises +% \begin{macrocode} +\newcommand{\ExerciseHeaderTitle}{\qquad\ExerciseTitle} +\newcommand{\ExerciseHeaderExam}{\ExerciseExam} +\newcommand{\ExerciseHeaderYear}{\ \ExerciseYear} +\newcommand{\ExerciseHeaderDifficulty}{\theExerciseDifficulty\ } +\newcommand{\ExerciseHeaderOrigin}{% +\ ({\usefont{\encodingdefault}{\rmdefault}{m}{it}\ExerciseOrigin})} +\newcommand{\ExerciseHeaderNB}{\theExercise} +\newcommand{\ExerciseHeaderLabel}{\fbox{\textsc{\ExerciseLabel}}} +% \end{macrocode} +% The header itself +% \begin{macrocode} +\newcommand{\ExerciseHeader}{\centerline{% +\textbf{\large\ExerciseHeaderDifficulty\ExerciseName\ % +\ExerciseHeaderNB\ExerciseHeaderTitle\ExerciseHeaderOrigin}}\medskip} +% \end{macrocode} +% The header of exercise in ExerciseList environment +% \begin{macrocode} +\newcommand{\ExerciseListHeader}{\ExerciseHeaderDifficulty% +\textbf{\ExerciseListName\ \ExerciseHeaderNB% +\ --- \ \ExerciseHeaderTitle}% +\ExerciseHeaderOrigin\ignorespaces} +% \end{macrocode} +% Presentation of informations in the header of ExePart +% \begin{macrocode} +\newcommand{\ExePartHeaderNB}{\ \theExePart} +\newcommand{\ExePartHeaderTitle}{\quad --- \quad {\ExePartTitle}} +\newcommand{\ExePartHeaderDifficulty}{\theExePartDifficulty\ } +% \end{macrocode} +% The header of |ExePart| +% \begin{macrocode} +\newcommand{\ExePartHeader}{% +\medskip\centerline{\emph{\large\ExePartHeaderDifficulty\ExePartName% +\ExePartHeaderNB\ExePartHeaderTitle}}} +\newcommand{\ExePartListHeader}{\bigskip% +\emph{\ExePartHeaderDifficulty\ExePartName% +\ExePartHeaderNB\ExePartHeaderTitle}\par\medskip} +% \end{macrocode} +% Presentation of Questions +% \begin{macrocode} +\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}} +% \end{macrocode} +% \subsection{Macros definition} +% \begin{macrocode} +\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} +% \end{macrocode} +% +% \subsubsection{Definition of \texttt{Exercise}} +% +% The keyval package is used to specify various information about an exercise. +% \begin{macrocode} +\newif\if@ExeTitle \@ExeTitlefalse +\newif\if@ExeExam \@ExeExamfalse +\newif\if@ExeYear \@ExeYearfalse +\newif\if@ExeReName \@ExeReNamefalse +\global\newcount\ExerciseDifficulty \ExerciseDifficulty=0 +\newif\if@ExeDifficulty \@ExeDifficultyfalse +\newif\if@ExeOrigin \@ExeOriginfalse +\newif\if@ExeType \@ExeTypefalse +\newif\if@ExeLabel \@ExeLabelfalse +\newif\if@ExeNB \@ExeNBfalse +% +\def\theExerciseDifficulty{\marker{\DifficultyMarker}{\ExerciseDifficulty}} +% +\define@key{PPExercise}{title}% +{\global\@ExeTitletrue\gdef\ExerciseTitle{#1}} +\define@key{PPExercise}{exam}% +{\global\@ExeExamtrue\gdef\ExerciseExam{#1}} +\define@key{PPExercise}{year}% +{\global\@ExeYeartrue\gdef\ExerciseYear{#1}} +\define@key{PPExercise}{difficulty}% +{\global\@ExeDifficultytrue\global\ExerciseDifficulty=\number#1} +\define@key{PPExercise}{name}% +{\global\@ExeReNametrue\gdef\@ExerciseName{#1}} +\define@key{PPExercise}{origin}% +{\global\@ExeOrigintrue\gdef\ExerciseOrigin{#1}} +\define@key{PPExercise}{type}% +{\global\@ExeTypetrue\gdef\ExerciseType{#1}} +\define@key{PPExercise}{counter}% +{\gdef\@ExerciseCounter{#1}} +\define@key{PPExercise}{label}% +{\global\@ExeLabeltrue\gdef\ExerciseLabel{#1}\gdef\ExerciseTrueLabel{#1}} +\define@key{PPExercise}{number}% +{\global\@ExeNBtrue\gdef\ExerciseLocalNB{#1}} +\define@key{PPExercise}{class}% +{\gdef\ExerciseClass{#1}} +% +\newif\if@ExeStared +\@ExeStaredfalse +% +\def\@InitExe{\@savemathindent\global\@echapqfalse% +\gdef\ExerciseTitle{}% +\gdef\ExerciseExam{}% +\gdef\ExerciseYear{}% +\gdef\@ExerciseName{}% +\gdef\ExerciseOrigin{}% +\gdef\ExerciseType{}% +\gdef\ExerciseTrueLabel{}% +\global\ExerciseDifficulty=0% +\global\@ExeTitlefalse% +\global\@ExeExamfalse% +\global\@ExeYearfalse% +\global\@ExeReNamefalse% +\global\@ExeDifficultyfalse% +\global\@ExeOriginfalse% +\global\@ExeTypefalse% +\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@ExeExam\else\def\ExerciseHeaderExam{}\fi% +\if@ExeYear\else\def\ExerciseHeaderYear{}\fi% +\if@ExeOrigin\else\def\ExerciseHeaderOrigin{}\fi% +\if@ExeType\else\def\ExerciseHeaderType{}\fi% +\if@ExeNB\setcounter{Exercise}{\ExerciseLocalNB} +\protected@edef\@currentlabel{\p@Exercise\theExercise}% +\fi% +\if@ExeDifficulty\else\def\ExerciseHeaderDifficulty{}\fi% +\if@ExeStared\def\ExerciseHeaderNB{}\fi% +\if@ExeLabel\recordExerciseLabel{\ExerciseLabel}\else\def\ExerciseHeaderLabel{}\fi% +} +% +\def\refstepExecounter{\if@ShipThisExercise\if@ExeStared\else\if@ExeNB\else% +\refstepcounter{\@ExerciseCounter}\fi\fi\fi} +% +\def\recordExerciseLabel#1{\label{#1}} +% +\def\@BeginExeBox{\global\setbox\@Exercisebox\vbox\bgroup} +\def\@EndExeBox{\egroup\if@Answer\if@AnswerOutput\@DelayAnswerBox\fi% +\else\if@ExerciseOutput\@DelayExerciseBox\fi\fi} +% +\def\@DelayAnswerBox{% +\if@ShipThisAnswer\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\unvbox\@Exercisebox\fi\fi} +% +\newcommand{\shipoutAnswer}{\if@AnswerOutput\unvbox\all@Answerbox\fi} +\newcommand{\shipoutExercise}{\if@ExerciseOutput\unvbox\all@Exercisebox\fi} +% \end{macrocode} +% The commands for the \texttt{Exercise} environment. +% \begin{macrocode} +\def\beginExerciseEnv{\@InitExe\@ifnextchar[\@@ExeEnv{\@@ExeEnv[]}}%] +% +\def\@@ExeEnv[#1]{\setkeys{PPExercise}{#1}% +\@selectExercise\global\@Answerfalse\@BeginExeBox\@@@ExeEnv} +% +\newcommand{\@@@ExeEnv}{% + \pagebreak[1]\vskip\ExerciseSkipBefore + \@QuestionLevel1 + \refstepExecounter + \begingroup\@getExerciseInfo\ExerciseHeader + \addcontentsline{\ext@exercise}{\toc@exercise}{\ExerciseName\ + \theExercise\ \expandafter{\itshape \ExerciseTitle}\hspace{.66em}} + \endgroup\AtBeginExercise} +% +% +\def\endExerciseEnv{\termineliste{1}\@EndExeBox% +\vskip\ExerciseSkipAfter} +% \end{macrocode} +% The commands for exercise within environment +% \begin{macrocode} +\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 + \global\@Answerfalse\@BeginExeBox\refstepExecounter% + \addcontentsline{\ext@exercise}{\toc@exercise}{\ExerciseName\ + \theExercise\ \expandafter{\itshape \ExerciseTitle}\hspace{.66em}} + \item\ignorespaces\AtBeginExercise +} +% +\def\defineExePartInEnv{\def\@ExePartHeader{\ExePartHeader}} +\def\defineExePartInList{\def\@ExePartHeader{\ExePartListHeader}} +\def\defineExerciseEnv{% + \defineExePartInEnv + \renewenvironment{Exercise}{\global\@ExeStaredfalse\global\beginExerciseEnv}% +{\endExerciseEnv} + \renewenvironment{Exercise*}{\global\@ExeStaredtrue\beginExerciseEnv}% +{\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} +% \end{macrocode} +% \subsubsection{Definition of \texttt{questions}} +% \begin{macrocode} +\def\QuestionTitle{} +\newif\if@QuestionTitle \@QuestionTitlefalse +\global\newcount\QuestionDifficulty \QuestionDifficulty=0 +\newif\if@QuestionDifficulty \@QuestionDifficultyfalse +% +\define@key{PPQuestion}{title}{% +\global\@QuestionTitletrue\gdef\QuestionTitle{#1}} +\define@key{PPQuestion}{difficulty}{% +\global\@QuestionDifficultytrue\global\QuestionDifficulty=\number#1} +% +\def\@InitQuestion{\nopagebreak +\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 .33em + \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 +} +% \end{macrocode} +% \subsubsection{Definition of \texttt{sub-questions} and +%\texttt{sub-sub-questions}} +% Here a good factorization is possible, but I prefer readibility over +% efficacity. +% \begin{macrocode} +\def\subQuestionTitle{} +\newif\if@subQuestionTitle\@subQuestionTitlefalse +\global\newcount\subQuestionDifficulty\subQuestionDifficulty=0 +\newif\if@subQuestionDifficulty\@subQuestionDifficultyfalse +% +\define@key{PPsubQuestion}{title}{% +\gdef\subQuestionTitle{#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 .33em + \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{#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 .33em + \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 +} +% \end{macrocode} +% \subsubsection{ Presentation of part (within an exercise)} +% \begin{macrocode} +\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{#1}% +\global\@ExePartTitletrue} +\define@key{PPExePart}{name}{\gdef\@ExePartName{#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} +% +% \end{macrocode} +% \subsubsection{Presentation of answers} +% \begin{macrocode} +\newbox\@Answerbox +% +%\changes{v1.3}{2009/03/26}{Header of answers are now correct.} +% +\newcommand{\AnswerHeader}{\medskip\centerline{\textbf{\AnswerName\ % + \ExerciseHeaderNB}\smallskip}} +% +\newcommand{\AnswerListHeader}{\textbf{\AnswerListName\ + (\ExerciseListName\ \ExerciseHeaderNB)\ ---\ }} +% +% The commands for environment +% +\def\@InitAnswer{\@savemathindent\global\@echapqfalse% +\gdef\AnswerRef{}% +\global\@AnswerReffalse% +\gdef\AnswerNB{}% +\global\@AnswerNBfalse% +\setcounter{ExePart}{0}% +\setcounter{Question}{0}} +% +\def\@getAnswerInfo{% +\if@AnswerRef% +\def\theExercise{\ref{\AnswerRef}}% +\refstepcounter{Answer}% +\recordExerciseLabel{\AnswerRef-Answer}% +\else +\if@AnswerNB +\def\ExerciseTitle{}% +\def\ExerciseName{}% +\def\ExerciseOrigin{}% +\def\ExerciseType{}% +\ExerciseDifficulty=0% +\def\theExercise{\AnswerNB}% +\else +\if@AswLastExe +\else +\PackageWarning{Exercise}% +{An 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{#1}} +\define@key{PPAnswer}{number}{\global\@AnswerNBtrue\gdef\AnswerNB{#1}} +% +\def\beginAnswerEnv{\@InitAnswer\@ifnextchar[\@@AnswerEnv{\@@AnswerEnv[]}}%] +% +\def\@@AnswerEnv[#1]{\setkeys{PPAnswer}{#1}% +\global\@Answertrue\@selectAnswer\@BeginExeBox\@@@AnswerEnv} +% +\newcommand{\@@@AnswerEnv}{% + \pagebreak[1]\vskip\AnswerSkipBefore\@QuestionLevel1 + \begingroup\@getAnswerInfo\AnswerHeader\endgroup\AtBeginAnswer} +% +\gdef\endAnswerEnv{\termineliste{1}\@EndExeBox\termineliste{0}\vskip\AnswerSkipAfter} +% +\newenvironment{Answer}{}{} +\gdef\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\@selectAnswer\@BeginExeBox% + \item[\bgroup\@getAnswerInfo\AnswerListHeader\egroup]\AtBeginAnswer\ignorespaces +} +% +\def\defineAnswerCmd{\gdef\@AnswerHeaderRef{\AnswerListHeader}% +\def\Answer{\AnswerCmd}} +% \end{macrocode} +% \subsubsection{Exercises selection} +% +%\changes{v1.4}{2010/08/27}{Exercises selection completly review.} +% +% \begin{macrocode} + + +\newif\if@ShipThisExercise \@ShipThisExercisetrue +\newif\if@@ShipThisExercise \@@ShipThisExercisetrue +\newif\if@ExerciseSelected \@ExerciseSelectedtrue +\newif\if@ShipThisAnswer \@ShipThisAnswertrue +\newif\if@@ShipThisAnswer \@@ShipThisAnswertrue +\newif\if@ExeSelectExam \@ExeSelectExamfalse +\newif\if@ExeSelectYear \@ExeSelectYearfalse +\newif\if@ExeSelectDifficulty \@ExeSelectDifficultyfalse +\newif\if@ExeSelectOrigin \@ExeSelectOriginfalse +\newif\if@ExeSelectClass \@ExeSelectClassfalse +\newif\if@ExeSelectType \@ExeSelectTypefalse +\newif\if@ExeSelectLabel \@ExeSelectLabelfalse + +\define@key{PPExerciseSelect}{exam}% +{\global\@ExeSelectExamtrue\gdef\ExerciseSelectExam{#1}} +\define@key{PPExerciseSelect}{year}% +{\global\@ExeSelectYeartrue\gdef\ExerciseSelectYear{#1}} +\define@key{PPExerciseSelect}{difficulty}% +{\global\@ExeSelectDifficultytrue\gdef\ExerciseSelectDifficulty{#1}} +\define@key{PPExerciseSelect}{type}% +{\global\@ExeSelectTypetrue\gdef\ExerciseSelectType{#1}} +\define@key{PPExerciseSelect}{origin}% +{\global\@ExeSelectOrigintrue\gdef\ExerciseSelectOrigin{#1}} +\define@key{PPExerciseSelect}{class}% +{\global\@ExeSelectClasstrue\gdef\ExerciseSelectClass{#1}} +\define@key{PPExerciseSelect}{label}% +{\global\@ExeSelectLabeltrue\gdef\ExerciseSelectLabel{#1}} + +\newcommand{\ExerciseStopSelect}{ + \@ExeSelectExamfalse + \@ExeSelectYearfalse + \@ExeSelectDifficultyfalse + \@ExeSelectTypefalse + \@ExeSelectOriginfalse + \@ExeSelectClassfalse + \@ExeSelectLabelfalse + \@ExeSelectTypefalse +} + +\newcommand{\ExerciseSelect}{\@ifstar{\global\@ExerciseSelectedfalse\@ExerciseSelect}{\global\@ExerciseSelectedtrue\@ExerciseSelect}} +\newcommand{\@ExerciseSelect}[1][]{\setkeys{PPExerciseSelect}{#1}} + +\def\@selectExercise{% + \global\@ShipThisExercisetrue + \global\@@ShipThisExercisefalse + \if@ExeSelectExam + \@for\@exam:=\ExerciseSelectExam\do + {\ifthenelse{\equal{\@exam}{\ExerciseExam}}{ + \global\@@ShipThisExercisetrue + }{} + } + \if@@ShipThisExercise\else\@ShipThisExercisefalse\fi + \global\@@ShipThisExercisefalse + \fi + % + \if@ExeSelectYear + \@for\@year:=\ExerciseSelectYear\do + { \ifthenelse{\equal{\@year}{\ExerciseYear}}{ + \global\@@ShipThisExercisetrue + }{} + } + \if@@ShipThisExercise\else\@ShipThisExercisefalse\fi + \global\@@ShipThisExercisefalse + \fi + % + \if@ExeSelectDifficulty + \@for\@difficulty:=\ExerciseSelectDifficulty\do + { \ifthenelse{\equal{\@difficulty}{\ExerciseDifficulty}}{ + \global\@@ShipThisExercisetrue + }{} + } + \if@@ShipThisExercise\else\@ShipThisExercisefalse\fi + \global\@@ShipThisExercisefalse + \fi + % + \if@ExeSelectOrigin + \@for\@origin:=\ExerciseSelectOrigin\do + { \ifthenelse{\equal{\@origin}{\ExerciseOrigin}}{ + \global\@@ShipThisExercisetrue + }{} + } + \if@@ShipThisExercise\else\@ShipThisExercisefalse\fi + \global\@@ShipThisExercisefalse + \fi + % + \if@ExeSelectClass + \@for\@origin:=\ExerciseSelectClass\do + { \ifthenelse{\equal{\@origin}{\ExerciseClass}}{ + \global\@@ShipThisExercisetrue + }{} + } + \if@@ShipThisExercise\else\@ShipThisExercisefalse\fi + \global\@@ShipThisExercisefalse + \fi + % + \if@ExeSelectLabel + \@for\@label:=\ExerciseSelectLabel\do + { \ifthenelse{\equal{\@label}{\ExerciseLabel}}{ + \global\@@ShipThisExercisetrue + }{} + } + \if@@ShipThisExercise\else\@ShipThisExercisefalse\fi + \global\@@ShipThisExercisefalse + \fi + % + \if@ExeSelectType + \@for\@type:=\ExerciseSelectType\do + { \ifthenelse{\equal{\@type}{\ExerciseType}}{ + \global\@@ShipThisExercisetrue + }{} + } + \if@@ShipThisExercise\else\@ShipThisExercisefalse\fi + \global\@@ShipThisExercisefalse + \fi + \if@ExerciseSelected\else\if@ShipThisExercise\global\@ShipThisExercisefalse\else\global\@ShipThisExercisetrue\fi\fi +} +\def\@selectAnswer{% + \global\@ShipThisAnswertrue + \global\@@ShipThisAnswerfalse + % + \if@ExeSelectLabel + \@for\@label:=\ExerciseSelectLabel\do + { \ifthenelse{\equal{\@label}{\AnswerRef}}{ + \global\@@ShipThisAnswertrue + }{} + } + \if@@ShipThisAnswer\else\@ShipThisAnswerfalse\fi + \global\@@ShipThisAnswerfalse + \fi + \if@ExerciseSelected\else\if@ShipThisAnswer\global\@ShipThisAnswerfalse\else\global\@ShipThisAnswertrue\fi\fi +} +% \end{macrocode} +% \subsubsection{Some extra stuff} +% \begin{macrocode} +\newcommand{\ExeText}{\setcounter{savedQuestion}{\value{Question}}% +\termineliste{1}\@echapqtrue} +% \end{macrocode} +% \subsubsection{Secret stuff} +% \begin{macrocode} +% +% Il est possible de présenter un niveau de sectionnement sur +% deux colonnes avec la commande \colonnesLevel +% +\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}} +% +% Tenir compte de l'option fleqn +% +\@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 +% \end{macrocode} +% \subsection{The \texttt{\textbackslash renewcounter} command} +% This commands is the equivalent of the well--known |\renewcommand|, +% but for counter. It allows you to redefine the |Exercise| counter, +% in order to reset it at each chapter (for example). +% \begin{macrocode} +\def\renewcounter#1{% + \@ifundefined{c@#1} + {\@latex@error{counter #1 undefined}\@ehc}% + \relax + \let\@ifdefinable\@rc@ifdefinable + \@ifnextchar[{\@newctr{#1}}{}} +% \end{macrocode} +% \begin{macrocode} +\def\ext@exercise{loe} +\newcommand{\ExerciseLevelInToc}[1]{\def\toc@exercise{#1}} +\ExerciseLevelInToc{exercise} +\newcommand{\ListOfExerciseInToc}{\def\ext@exercise{toc}\ExerciseLevelInToc{paragraph}} +\newcommand\listofexercises{% + \section*{\listexercisename}% + \@mkboth{\MakeUppercase\listexercisename}% + {\MakeUppercase\listexercisename}% + \@starttoc{\ext@exercise}% +} +\newcommand*\l@exercise{\@dottedtocline{2}{1.5em}{2.3em}} +% \end{macrocode} + +% \Finale +\endinput diff --git a/macros/latex/contrib/exercise/exercise.ins b/macros/latex/contrib/exercise/exercise.ins new file mode 100644 index 0000000000..c2a5b09dcd --- /dev/null +++ b/macros/latex/contrib/exercise/exercise.ins @@ -0,0 +1,66 @@ +%% 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 + +\input docstrip.tex + +%\keepsilent + +\usedir{tex/latex/exercise} + +\preamble + +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 + +\endpreamble + +\generate{\file{exercise.sty}{\from{exercise.dtx}{package}}} + +\Msg{*********************************************************} +\Msg{*} +\Msg{* To finish the installation you have to move the} +\Msg{* following file into a directory searched by TeX:} +\Msg{*} +\Msg{* \space\space exercise.sty} +\Msg{*} +\Msg{* To produce the documentation run the file exercise.dtx} +\Msg{* through LaTeX.} +\Msg{*} +\Msg{* Don't forget to produce Index and Change History with} +\Msg{* makeindex -s gind.ist -o exercise.ind exercise.idx} +\Msg{* makeindex -s gglo.ist -o exercise.gls exercise.glo} +\Msg{*} +\Msg{* Happy TeXing!} +\Msg{*********************************************************} + +\endbatchfile \ No newline at end of file diff --git a/macros/latex/contrib/exercise/exercise.pdf b/macros/latex/contrib/exercise/exercise.pdf new file mode 100644 index 0000000000..b3792cdaa6 Binary files /dev/null and b/macros/latex/contrib/exercise/exercise.pdf differ -- cgit v1.2.3