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