From e0c6872cf40896c7be36b11dcc744620f10adf1d Mon Sep 17 00:00:00 2001
From: Norbert Preining <norbert@preining.info>
Date: Mon, 2 Sep 2019 13:46:59 +0900
Subject: Initial commit

---
 macros/latex/contrib/sesamanuel/sesamanuel.dtx | 11949 +++++++++++++++++++++++
 1 file changed, 11949 insertions(+)
 create mode 100644 macros/latex/contrib/sesamanuel/sesamanuel.dtx

(limited to 'macros/latex/contrib/sesamanuel/sesamanuel.dtx')

diff --git a/macros/latex/contrib/sesamanuel/sesamanuel.dtx b/macros/latex/contrib/sesamanuel/sesamanuel.dtx
new file mode 100644
index 0000000000..57ae5c4ba9
--- /dev/null
+++ b/macros/latex/contrib/sesamanuel/sesamanuel.dtx
@@ -0,0 +1,11949 @@
+% \iffalse
+%
+%% sesamanuel.dtx
+%% Copyright 2014-2015 Sesamath, J.-C. Charpentier, S. Mengin
+%
+%% Class `sesamanuel' to use with LaTeX 2e
+%% Copyright (C) 2014-2015 Sesamath, Jean-C\^ome Charpentier, S\'ebastien
+%% Mengin.
+% \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         \~}
+%%
+% \iffalse
+%<*driver>
+\documentclass[a4paper]{ltxdoc}
+\IndexPrologue{%
+  \newpage
+  \section*{Index}%
+  Les num\'eros soulign\'es indiquent le num\'ero de ligne de la
+  d\'efinition de l'entr\'ee. Les num\'eros en roman indiquent les
+  num\'eros de ligne o\`u l'entr\'ee est utilis\'ee.
+}
+\makeatletter
+\renewenvironment{theglossary}{%
+    \glossary@prologue
+    \GlossaryParms \let\item\@idxitem \ignorespaces}%
+  {}
+\makeatother
+\GlossaryPrologue{%
+  \newpage
+  \section*{{Historique des changements}}
+  \markboth{{Historique des changements}}{{Historique des changements}}%
+}
+\DisableCrossrefs
+%\EnableCrossrefs
+%\CodelineIndex
+\RecordChanges
+%\OnlyDescription
+\usepackage{fontspec}
+\usepackage{xunicode}
+\usepackage{xltxtra}
+\usepackage[a4paper,left=2in]{geometry}
+\usepackage{makeidx}
+\usepackage{array}
+\let\iint\relax
+\let\iiint\relax
+\let\iiiint\relax
+\let\idotsint\relax
+\usepackage{amsmath}
+\usepackage{xcolor}
+\usepackage[french]{babel}
+\usepackage{xspace}
+\usepackage{hyperref}
+\makeindex
+\title{Code de la classe \class{sesamanuel}\\Classe pour les cahiers Sésamath}
+\author{%
+  Jean-Côme Charpentier\thanks{\ttfamily jean-come.charpentier@wanadoo.fr}
+  \and Sébastien Mengin\thanks{\ttfamily sebastien-mengin@edilibre.net}
+}
+\newcommand*\pgm[1]{\texttt{#1}}
+\newcommand*\file[1]{\texttt{#1}}
+\newcommand*\package[1]{\texttt{#1}}
+\newcommand*\class[1]{\texttt{#1}}
+\newcommand*\option[1]{\texttt{#1}}
+\newcommand*\key[1]{\texttt{#1}}
+\newcommand*\environ[1]{\texttt{#1}}
+
+\begin{document}
+\maketitle
+\newpage
+\tableofcontents
+\newpage
+\DocInput{sesamanuel.dtx}
+\PrintChanges
+\PrintIndex
+\end{document}
+%</driver>
+% \fi
+%
+% \changes{v0.1}{2013/07/16}{%
+%   Classe \class{sesacah} commencée.
+% }
+% \changes{v0.2}{2014/03/05}{%
+%   Classe \class{sesacah} utilisée en production.
+% }
+% \changes{v0.3}{2014/08/26}{%
+%   Quelques aménagements de la classe après écriture de la
+%   documentation.\endgraf
+%   Package \package{sesacah} pour une utilisation indépendante.
+% }
+% \changes{v0.4}{2014/10/31}{%
+%   Écriture de la partie libre.
+% }
+% \changes{v0.5}{2014/12/20}{%
+%   Changement de nom sesacah en sesamanuel.
+% }
+% \changes{v0.6}{2015/03/03}{%
+%   Mise en cohérence avec les sources du site Sesamath.\endgraf
+%   Package \package{sesamanuelTIKZ} ajouté au dtx.
+% }
+% \CheckSum{0}
+% \iffalse
+%<*class>
+% \fi
+% \section{Partie introductive}
+% La partie introductive de la classe n'a rien de particulier, on
+% retrouve la définition de version et de date de la classe ainsi que
+% les commandes \LaTeX{} pour communiquer ces informations à
+% l'utilisateur.
+%    \begin{macrocode}
+\def\filedate{2015/03/03}
+\let\smcfiledate\filedate
+\def\fileversion{0.6}
+\let\smcfileversion\fileversion
+\NeedsTeXFormat{LaTeX2e}[1995/06/01]
+\ProvidesClass{sesamanuel}[%
+  \filedate\space v\fileversion\space
+  Classe pour les cahiers Sesamath (SM/JCC/SM)%
+]
+%    \end{macrocode}
+% Dans cette partie introductive, on charge également la classe
+% \class{book}. Pour l'instant, il n'y a besoin d'aucune option
+% particulière, les options par défaut sont tout à fait suffisantes.
+%    \begin{macrocode}
+\LoadClass{book}
+%    \end{macrocode}
+% \section{Options de classe}
+% La classe gère le codage d'entrée en option. On retrouve tous les
+% codages possibles. En principe, la classe est sensée fonctionner
+% avec \XeTeX{} et alors uniquement un codage d'entrée UTF-8 mais on
+% permettra un fonctionnement sous \LaTeX{} et donc avec les codages
+% permis par \package{inputenc}. Comme il y a beaucoup de déclarations
+% différentes, on utilise une macro générale de déclaration d'option :
+%    \begin{macrocode}
+\def\smc@enc@opt#1{\DeclareOption{#1}{\def\smc@encoding{#1}}}
+\smc@enc@opt{ascii}
+\smc@enc@opt{latin1}
+\smc@enc@opt{latin2}
+\smc@enc@opt{latin3}
+\smc@enc@opt{latin4}
+\smc@enc@opt{latin5}
+\smc@enc@opt{latin9}
+\smc@enc@opt{latin10}
+\smc@enc@opt{decmulti}
+\smc@enc@opt{cp850}
+\smc@enc@opt{cp852}
+\smc@enc@opt{cp858}
+\smc@enc@opt{cp437}
+\smc@enc@opt{cp437de}
+\smc@enc@opt{cp865}
+\smc@enc@opt{applemac}
+\smc@enc@opt{macce}
+\smc@enc@opt{next}
+\smc@enc@opt{cp1250}
+\smc@enc@opt{cp1252}
+\smc@enc@opt{cp1257}
+\smc@enc@opt{ansinew}
+\smc@enc@opt{utf8}
+%    \end{macrocode}
+% On a également une option pour obtenir ou non les repères
+% photographique (et les débordements de pleine page). On donne sa
+% valeur par défaut qui est vraie.
+%    \begin{macrocode}
+\newif\ifsmc@crop
+\smc@croptrue
+\DeclareOption{crop}{\smc@croptrue}
+\DeclareOption{nocrop}{\smc@cropfalse}
+%    \end{macrocode}
+% Une dernière option permet de supprimer les numéros de page mais
+% uniquement pour un texte libre.
+%    \begin{macrocode}
+\newif\ifsmc@page
+\smc@pagetrue
+\DeclareOption{page}{\smc@pagetrue}
+\DeclareOption{nopage}{\smc@pagefalse}
+%    \end{macrocode}
+% Les options par défaut sont l'utilisation de UTF-8 et de repère
+% photgraphique et de la numérotation des pages en partie libre. On
+% aura également besoin d'une macro contenant la chaîne \og utf8 \fg{}.
+%    \begin{macrocode}
+\newcommand*\smc@string@utfviii{utf8}
+\ExecuteOptions{utf8}
+\ProcessOptions
+%    \end{macrocode}
+% \section{Chargement des extensions}
+% On chargera le minimum d'extensions dans la classe afin de limiter
+% les problèmes de compatibilités avec les différentes distributions
+% \TeX{} (distributions et versions de ces distributions). On aurait
+% pu choisir de charger les extensions \package{ifpdf},
+% \package{ifluatex} et \package{ifxetex} pour tester le mode de
+% compilation et agir en conséquence mais on n'a pas besoin de ce luxe
+% : comme on est en tout début de classe, on peut utiliser des
+% méthodes légèrement moins solides que celles fournies dans ces
+% extensions mais très largement suffisantes ici.
+%
+% On doit tester dans l'ordre :
+% \begin{enumerate}
+% \item si on compile avec PDF\LaTeX{} ou lua\LaTeX{} ce qui
+%   doit donner une erreur de compilation immédiate avec un message
+%   d'erreur explicite ;
+% \item si on compile avec \LaTeX{} ou avec \XeLaTeX{} ce qui donnera
+%   un chargement d'extensions différentes et, plus tard, une gestion
+%   des fontes différentes.
+% \end{enumerate}
+% Le code suivant est une recopie du code de \package{ifxetex} de Will
+% Robertson.
+%    \begin{macrocode}
+\newif\ifxetex
+\begingroup\expandafter\expandafter\expandafter\endgroup
+\expandafter\ifx\csname XeTeXrevision\endcsname\relax
+  \xetexfalse
+\else
+  \xetextrue
+\fi
+%    \end{macrocode}
+% Le code suivant est très largement suffisant pour détecter en tout
+% début de classe si on utilise PDF\LaTeX{} en mode PDF, PDF\LaTeX{}
+% en mode dvi, \XeLaTeX{} ou enfin lua\LaTeX{}.
+%    \begin{macrocode}
+\newif\ifpdftex
+\newif\ifpdfdvi
+\newif\ifluatex
+\ifx\luatexversion\undefined
+  \luatexfalse
+  \ifx\pdfoutput\undefined
+    \pdftexfalse
+    \pdfdvifalse
+  \else
+    \pdftextrue
+    \ifnum\pdfoutput=\z@
+      \pdfdvitrue
+    \else
+      \pdfdvifalse
+    \fi
+  \fi
+\else
+  \luatextrue
+\fi
+%    \end{macrocode}
+% On teste d'abord les modes qui conduisent à une erreur de
+% compilation.
+%    \begin{macrocode}
+\ifpdftex
+  \unless\ifpdfdvi
+    \ClassError{sesamanuel}{Vous ne pouvez pas compiler en mode pdflatex}
+                        {Compilez en mode latex.}%
+  \fi
+\fi
+\ifluatex
+  \ClassError{sesamanuel}{Vous ne pouvez pas compiler en mode lualatex}
+                      {Compilez en mode latex.}%
+\fi
+%    \end{macrocode}
+% On commence le chargement des extensions par celles qui dépendent du
+% mode de compilation. Au préalable, on charge le package
+% \package{etex} pour ne pas embêter ceux qui vont utiliser TikZ.
+%    \begin{macrocode}
+\RequirePackage{etex}
+\ifxetex
+  \RequirePackage{fontspec}
+  \RequirePackage{xunicode}
+  \defaultfontfeatures{Ligatures=TeX}
+%    \end{macrocode}
+% Si l'auteur a précisé un codage autre que utf8 dans les options de
+% classe, on va émettre un message d'erreur.
+%    \begin{macrocode}
+  \unless\ifx\smc@encoding\smc@string@utfviii
+    \ClassError{sesamanuel}{Vous ne pouvez pas utiliser un codage autre
+      que utf8 avec xelatex}{Changez les codages de tous vos fichiers
+      pour les transformer en utf8.}%
+  \fi
+%    \end{macrocode}
+% Si on n'est pas en mode \XeLaTeX{}, on considèrera qu'on est en mode
+% \LaTeX{}. Si ce n'est pas vrai, il y aura déjà eu un message
+% d'erreur auparavant. On déclare également des fontes annexes.
+%    \begin{macrocode}
+\else
+  \RequirePackage[T1]{fontenc}
+  \RequirePackage[\smc@encoding]{inputenc}
+\fi
+%    \end{macrocode}
+% On charge les fontes courantes. Le réglage de la fonte Helvetica
+% fait que l'œil est le même que pour Palatino.
+%    \begin{macrocode}
+\RequirePackage[scaled=0.87]{helvet}
+\RequirePackage{mathpazo}
+\renewcommand{\ttdefault}{lmtt}
+%    \end{macrocode}
+% Puis quelques autres à usage plus ponctuel.
+%    \begin{macrocode}
+\RequirePackage{mathrsfs}
+\RequirePackage{pifont}
+\RequirePackage[official]{eurosym}
+%    \end{macrocode}
+% Il est difficle de trouver une fonte directement installée dans les
+% distributions \TeX{} qui se rapproche du Comic Sans proposé par la
+% maquette. Un premier essai a été Comforta mais il semble que cette
+% fonte n'existait pas sur les versions un peu ancienne des
+% distributions \TeX{} (par exemple \TeX Live 2009). On fait un autre
+% essai avec la famille llcmss (\package{lxfonts}).
+%    \begin{macrocode}
+%%%\newcommand*\scriptfamily{\fontfamily{fco}\selectfont}
+\newcommand*\scriptfamily{\fontfamily{llcmss}\selectfont}
+%    \end{macrocode}
+% Tout ce qui est empagement est paramétré au maximum. |\smc@bleed|
+% indique le débordement des éléments en pleine page.
+%    \begin{macrocode}
+\newcommand*\smc@paperheight{27cm}
+\newcommand*\smc@paperwidth{19.5cm}
+\newcommand*\smc@marginleft{1.33cm}
+\newcommand*\smc@marginright{1.33cm}
+%    \end{macrocode}
+% Il y a une dimension en plus qui ne sera pas gérée par geometry : le
+% surplus de marge droite pour certains éléments de l'ouvrage.
+%    \begin{macrocode}
+\newcommand*\ExtraMarginRight{1.8cm}
+\newcommand*\smc@margintop{2.5cm}
+\newcommand*\smc@headheight{14.4pt}
+\newcommand*\smc@headsep{1.4cm}
+\newcommand*\smc@marginbottom{2cm}
+\newcommand*\smc@footskip{1.2cm}
+%    \end{macrocode}
+% Les éléments suivants dépendent de la demande ou non de repères
+% photographiques. On traite d'abord le cas où il y a une telle demande.
+%    \begin{macrocode}
+\ifsmc@crop
+  \newcommand*\smc@bleed{5mm}
+%    \end{macrocode}
+% On peut alors appeler l'extension geometry ainsi que crop. Avant
+% d'appeler geometry, on sauvegarde les éléments de mise en page dans
+% des macros privées. Tous les calculs de distances se feront avec des
+% macros (jamais de longueurs directes).
+%    \begin{macrocode}
+  \RequirePackage[driver=none,
+                  paperheight=\smc@paperheight,
+                  paperwidth=\smc@paperwidth,
+                  top=\smc@margintop,
+                  headheight=\smc@headheight,
+                  headsep=\smc@headsep,
+                  bottom=\smc@marginbottom,
+                  footskip=\smc@footskip,
+                  left=\smc@marginleft,
+                  right=\smc@marginright,
+                  nomarginpar]{geometry}
+  \RequirePackage[cam,a4,center]{crop}
+%    \end{macrocode}
+% Si on ne demande pas de repère photographique, l'extension
+% \package{crop} est inutile et les débordements de pleine page sont
+% supprimés. L'appel de \package{geometry} se fait exactement de la
+% même façon qu'avec l'option crop mais on garde quand même un double
+% code au cas où l'appel ne serait plus le même plus tard.
+%    \begin{macrocode}
+\else
+  \newcommand*\smc@bleed{0mm}
+  \RequirePackage[driver=none,
+                  paperheight=\smc@paperheight,
+                  paperwidth=\smc@paperwidth,
+                  top=\smc@margintop,
+                  headheight=\smc@headheight,
+                  headsep=\smc@headsep,
+                  bottom=\smc@marginbottom,
+                  footskip=\smc@footskip,
+                  left=\smc@marginleft,
+                  right=\smc@marginright,
+                  nomarginpar]{geometry}
+  \RequirePackage[off,a4,center]{crop}
+\fi
+%    \end{macrocode}
+% On continue avec d'autres extensions utiles
+%    \begin{macrocode}
+\RequirePackage{ifmtarg}
+\RequirePackage{mathtools}
+\RequirePackage{amssymb}
+\RequirePackage{longtable, tabularx}
+\RequirePackage{multirow}
+\RequirePackage[table]{xcolor}
+\RequirePackage{pst-all, pstricks-add}
+\RequirePackage{fancyhdr}
+\RequirePackage{fancyvrb}
+\RequirePackage{multicol}
+\RequirePackage[french]{babel}
+\RequirePackage[autolanguage]{numprint}
+%    \end{macrocode}
+% On crée quelques registres de brouillon
+%    \begin{macrocode}
+\newbox\smc@boxa
+\newbox\smc@boxb
+\newdimen\smc@dima
+\newdimen\smc@dimb
+%    \end{macrocode}
+% \section{Mise en page générale}
+% Suppression des retraits d'alinéa.
+%    \begin{macrocode}
+\setlength{\parindent}{0pt}
+%    \end{macrocode}
+% \begin{macro}{\cleardoubleoddpage}
+% Macro permettant de commencer sur une page impaire en remplissant si
+% besoin une page vide (pas totalement vide).
+%    \begin{macrocode}
+\newcommand*\cleardoubleoddpage{%
+  \clearpage
+  \pagestyle{empty}
+  \cleardoublepage
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\cleardoubleevenpage}
+% Macro permettant de commencer sur une page paire en remplissant si
+% besoin une page vide (pas totalement vide). Cette macro a besoin de
+% la commande intermédiaire |\clearevendoublepage| construite sur le
+% modèle de |\cleardoublepage| de \LaTeX. Il semble que la maquette
+% n'utilise plus l'ouverture en page paire mais on laisse quand même
+% les macros au cas où.
+%    \begin{macrocode}
+\newcommand*\clearevendoublepage{%
+  \clearpage
+  \ifodd\c@page
+    \hbox{}\newpage
+  \fi
+}
+\newcommand*\cleardoubleevenpage{%
+  \clearpage
+  \pagestyle{empty}
+  \clearevendoublepage
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\normalsize}
+% La classe définit un interlignage bien plus important que
+% d'habitude. Il faut donc redéfinir les commandes standards de taille
+% de caractère pour respecter cette marche typographique tout au long
+% du document. La demande est d'avoir un interlignage de 14 points au
+% lieu du 12 points habituel. On mettra plutôt 14.4 points pour garder
+% la progression géométrique habituelle. On ne touche pas au ressorts
+% verticaux pour les formules hors-texte.
+%    \begin{macrocode}
+\renewcommand\normalsize{%
+   \@setfontsize\normalsize{9.5}\@xivpt
+   \abovedisplayskip 10\p@ \@plus2\p@ \@minus5\p@
+   \abovedisplayshortskip \z@ \@plus3\p@
+   \belowdisplayshortskip 6\p@ \@plus3\p@ \@minus3\p@
+   \belowdisplayskip \abovedisplayskip
+   \let\@listi\@listI}
+\normalsize
+%    \end{macrocode}
+% Les autres commandes suivent le même procédé. On augmente
+% l'interlignage de un cran dans la progression géométrique.
+%    \begin{macrocode}
+\renewcommand\small{%
+   \@setfontsize\small{8.5}{12}%
+   \abovedisplayskip 8.5\p@ \@plus3\p@ \@minus4\p@
+   \abovedisplayshortskip \z@ \@plus2\p@
+   \belowdisplayshortskip 4\p@ \@plus2\p@ \@minus2\p@
+   \belowdisplayskip \abovedisplayskip
+}
+\renewcommand\footnotesize{%
+   \@setfontsize\footnotesize{7.5}{11}%
+   \abovedisplayskip 6\p@ \@plus2\p@ \@minus4\p@
+   \abovedisplayshortskip \z@ \@plus\p@
+   \belowdisplayshortskip 3\p@ \@plus\p@ \@minus2\p@
+   \belowdisplayskip \abovedisplayskip
+}
+\renewcommand\scriptsize{\@setfontsize\scriptsize{6.5}{9.5}}
+\renewcommand\tiny{\@setfontsize\tiny\@vpt\@viipt}
+\renewcommand\large{\@setfontsize\large\@xiipt\@xviipt}
+\renewcommand\Large{\@setfontsize\Large\@xivpt{22}}
+\renewcommand\LARGE{\@setfontsize\LARGE\@xviipt{25}}
+\renewcommand\huge{\@setfontsize\huge\@xxpt{30}}
+\renewcommand\Huge{\@setfontsize\Huge\@xxvpt{36}}
+\setlength\smallskipamount{3\p@ \@plus 1\p@ \@minus 1\p@}
+\setlength\medskipamount{6\p@ \@plus 2\p@ \@minus 2\p@}
+\setlength\bigskipamount{12\p@ \@plus 4\p@ \@minus 4\p@}
+%    \end{macrocode}
+% \end{macro}
+% \begin{environment}{itemize}
+% En fait, il n'y a pas un environnement |itemize| mais tout un tas
+% qui seront mis en place en fonction du contexte. On commence par
+% l'environnement qui indique qu'on a pas le droit d'utiliser cet
+% environnement ! On inhibe |\item| pour ne pas multipler les messages
+% d'erreur.
+%    \begin{macrocode}
+\newenvironment{smc@noitemize}{%
+  \ClassError{sesamanuel}{Il est interdit d'utiliser itemize ici}
+             {Consultez la documentation pour plus de renseignements.}%
+  \let\item\relax
+}{}
+%    \end{macrocode}
+% Par défaut, c'est l'environnement interdit qui est actif.
+%    \begin{macrocode}
+\let\itemize\smc@noitemize
+\let\enditemize\endsmc@noitemize
+%    \end{macrocode}
+% \begin{macro}{\DeclareCorrItemize}
+% On crée un spécificateur d'environnement itemize pour les
+% corrigés. Il ne s'agit pas de liste au sens \LaTeX ien du terme : il
+% n'y a pas de passage à la ligne avant le premier item, il n'y a pas
+% de retrait.
+%
+% Le premier argument est le nom de base (il sera précédé de smc@corr
+% et terminé par itemize), le
+% deuxième argument est le type de puce
+%    \begin{macrocode}
+\newcommand*\DeclareCorrItemize[2]{%
+  \newenvironment{smc@corr#1itemize}{%
+    \def\item{\par#2~}%
+    \ignorespaces
+  }
+  {\par}
+}
+%    \end{macrocode}
+% \end{macro}
+% Les espacements sont les mêmes pour toutes les listes sauf les
+% enumerate.
+% \emph{normales}.
+%    \begin{macrocode}
+\def\smc@setalllist{%
+  \setlength{\leftmargin}{\ListLabelWidth}%
+  \setlength{\rightmargin}{0mm}%
+  \setlength{\labelwidth}{\ListLabelWidth}%
+  \setlength{\labelsep}{0mm}%
+  \setlength{\itemindent}{0mm}%
+  \setlength{\listparindent}{0mm}%
+  \setlength{\topsep}{0mm}%
+  \setlength{\partopsep}{\baselineskip}%
+  \setlength{\itemsep}{0mm}%
+  \setlength{\parsep}{0mm}%
+  \def\makelabel##1{##1\hss}%
+}
+%    \end{macrocode}
+% Pour les enumerate de premier niveau, on peut avoir une largeur plus
+% importante d'étiquette afin de pouvoir composer des numéros sur deux
+% chiffres sans télescopage. Ce niveau utilise |\smc@setallfirstlist|
+% qui est par défaut égal à la macro précédente.
+%    \begin{macrocode}
+\let\smc@setallfirstlist\smc@setalllist
+%    \end{macrocode}
+% Pour les list enumerate de premier niveau, on pourra utiliser une
+% place plus importante pour le numéro afin de permettre une
+% numérotation sur deux chiffres. C'est l'environnement |bigenumerate|
+% qui utilisera cette possibilité.
+%    \begin{macrocode}
+\def\smc@setallbiglist{%
+  \setlength{\leftmargin}{\EnumerateLabelWidth}%
+  \setlength{\rightmargin}{0mm}%
+  \setlength{\labelwidth}{\EnumerateLabelWidth}%
+  \setlength{\labelsep}{0mm}%
+  \setlength{\itemindent}{0mm}%
+  \setlength{\listparindent}{0mm}%
+  \setlength{\topsep}{0mm}%
+  \setlength{\partopsep}{\baselineskip}%
+  \setlength{\itemsep}{0mm}%
+  \setlength{\parsep}{0mm}%
+  \def\makelabel##1{##1\hss}%
+}
+%    \end{macrocode}
+% Vient ensuite l'environnement de liste à puce dans les prérequis. On
+% donnera systématiquement la variante \og corr \fg de l'environnement
+% même si celle-ci ne sert à rien pour l'instant : c'est une réserve
+% pour l'avenir.
+%
+% On teste la profondeur des itemize pour pouvoir définir une puce
+% différente en fonction du niveau.
+%    \begin{macrocode}
+\newenvironment{smc@prerequisitemize}{%
+  \ifnum\@listdepth=\z@
+    \list{\textcolor{PrerequisItemColor}{$\blacktriangleright$}}
+         {\smc@setalllist}%
+  \else
+    \list{\textcolor{PrerequisItemColor}{$\blacktriangleright$}}
+         {\smc@setalllist}%
+  \fi
+}
+{\endlist}
+\DeclareCorrItemize{prerequis}
+                   {\textcolor{PrerequisItemColor}{$\blacktriangleright$}}
+%    \end{macrocode}
+% Puis l'environnement de liste à puce dans l'auto-évaluation.
+%    \begin{macrocode}
+\newenvironment{smc@AEitemize}{%
+  \ifnum\@listdepth=\z@
+    \list{\textcolor{AEItemColor}{$\bullet$}}
+         {\smc@setalllist}%
+  \else
+    \list{\textcolor{AEItemColor}{$\bullet$}}
+         {\smc@setalllist}%
+  \fi
+}
+{\endlist}
+\DeclareCorrItemize{AE}{\textcolor{AEItemColor}{$\bullet$}}
+%    \end{macrocode}
+% Puis l'environnement de liste à puce dans les méthodes.
+%    \begin{macrocode}
+\newenvironment{smc@exappitemize}{%
+  \ifnum\@listdepth=\z@
+    \list{\textcolor{ExAppItemColor}{$\bullet$}}
+         {\smc@setalllist}%
+  \else
+    \list{\textcolor{ExAppItemColor}{$\bullet$}}
+         {\smc@setalllist}%
+  \fi
+}
+{\endlist}
+\DeclareCorrItemize{exapp}{\textcolor{ExAppItemColor}{$\bullet$}}
+%    \end{macrocode}
+% Puis l'environnement de liste à puce dans les environnement de type
+% définition.
+%    \begin{macrocode}
+\newenvironment{smc@defitemize}{%
+  \ifnum\@listdepth=\z@
+    \list{%
+      \color{DefItemColor}%
+      \vrule width \ItemRuleWidth
+             height \ItemRuleHeight
+             depth \ItemRuleDepth
+      \relax}
+         {\smc@setalllist}%
+  \else
+    \list{%
+      \color{DefItemColor}%
+      \vrule width \ItemRuleWidth
+             height \ItemRuleHeight
+             depth \ItemRuleDepth
+      \relax}
+         {\smc@setalllist}%
+  \fi
+}
+{\endlist}
+\DeclareCorrItemize{def}{%
+  \textcolor{DefItemColor}{%
+    \vrule width \ItemRuleWidth
+           height \ItemRuleHeight
+           depth \ItemRuleDepth
+  }%
+}
+%    \end{macrocode}
+% Puis l'environnement de liste à puce dans les activités.
+%    \begin{macrocode}
+\newenvironment{smc@activiteitemize}{%
+  \ifnum\@listdepth=\z@
+    \list{\textcolor{ActiviteItemColor}{$\bullet$}}
+         {\smc@setalllist}%
+  \else
+    \list{\textcolor{ActiviteItemColor}{$\bullet$}}
+         {\smc@setalllist}%
+  \fi
+}
+{\endlist}
+\DeclareCorrItemize{activite}{\textcolor{ActiviteItemColor}{$\bullet$}}
+%    \end{macrocode}
+% Puis l'environnement de liste à puce dans les remarques.
+%    \begin{macrocode}
+\newenvironment{smc@remitemize}{%
+  \ifnum\@listdepth=\z@
+    \list{%
+      \color{RemItemColor}
+      \vrule width \ItemRuleWidth
+             height \ItemRuleHeight
+             depth \ItemRuleDepth
+             \relax}
+         {\smc@setalllist}%
+  \else
+    \list{%
+      \color{RemItemColor}
+      \vrule width \ItemRuleWidth
+             height \ItemRuleHeight
+             depth \ItemRuleDepth
+             \relax}
+         {\smc@setalllist}%
+  \fi
+}
+{\endlist}
+\DeclareCorrItemize{rem}{%
+  \textcolor{RemItemColor}{%
+    \vrule width \ItemRuleWidth
+           height \ItemRuleHeight
+           depth \ItemRuleDepth
+  }%
+}
+%    \end{macrocode}
+% Puis l'environnement de liste à puce dans les exemples.
+%    \begin{macrocode}
+\newenvironment{smc@exempleitemize}{%
+  \ifnum\@listdepth=\z@
+    \list{\textcolor{ExempleItemColor}{$\bullet$}}
+         {\smc@setalllist}%
+  \else
+    \list{\textcolor{ExempleItemColor}{$\bullet$}}
+         {\smc@setalllist}%
+  \fi
+}
+{\endlist}
+\DeclareCorrItemize{exemple}{\textcolor{ExempleItemColor}{$\bullet$}}
+%    \end{macrocode}
+% Puis l'environnement de liste à puce dans les preuves.
+%    \begin{macrocode}
+\newenvironment{smc@proofitemize}{%
+  \ifnum\@listdepth=\z@
+    \list{\textcolor{ProofItemColor}{$\bullet$}}
+         {\smc@setalllist}%
+  \else
+    \list{\textcolor{ProofItemColor}{$\bullet$}}
+         {\smc@setalllist}%
+  \fi
+}
+{\endlist}
+\DeclareCorrItemize{proof}{\textcolor{ProofItemColor}{$\bullet$}}
+%    \end{macrocode}
+% Puis l'environnement de liste à puce dans les parties Exercices de
+% base et Exercices d'approfondissement.
+%    \begin{macrocode}
+\newenvironment{smc@exerciceitemize}{%
+  \ifnum\@listdepth=\z@
+    \list{\textcolor{ExerciceItemColor}{$\bullet$}}
+         {\smc@setalllist}%
+  \else
+    \list{\textcolor{ExerciceItemColor}{$\bullet$}}
+         {\smc@setalllist}%
+  \fi
+}
+{\endlist}
+\DeclareCorrItemize{exercice}{\textcolor{ExerciceItemColor}{$\bullet$}}
+%    \end{macrocode}
+% Puis l'environnement de liste à puce pour les acquis.
+%    \begin{macrocode}
+\newenvironment{smc@acquisitemize}{%
+  \ifnum\@listdepth=\z@
+    \list{\textcolor{AcquisItemColor}{\footnotesize$\blacktriangleright$}}
+         {\smc@setalllist}%
+  \else
+    \list{\textcolor{AcquisItemColor}{$\bullet$}}
+         {\smc@setalllist}%
+  \fi
+}
+{\endlist}
+\DeclareCorrItemize{acquis}{\textcolor{AcquisItemColor}{$\bullet$}}
+%    \end{macrocode}
+% Puis l'environnement de liste à puce pour les commentaires. Dans cet
+% espace, on prend la forme la plus simple.
+%    \begin{macrocode}
+\newenvironment{smc@commentaireitemize}{%
+  \ifnum\@listdepth=\z@
+    \list{\textcolor{CommentaireItemColor}{$\bullet$}}
+         {\smc@setalllist}%
+  \else
+    \list{\textcolor{CommentaireItemColor}{$\bullet$}}
+         {\smc@setalllist}%
+  \fi
+}
+{\endlist}
+\DeclareCorrItemize{commentaire}{\textcolor{CommentaireItemColor}{$\bullet$}}
+%    \end{macrocode}
+% Puis l'environnement de liste à puce pour les récréations, énigmes.
+%    \begin{macrocode}
+\newenvironment{smc@recreationitemize}{%
+  \ifnum\@listdepth=\z@
+    \list{\textcolor{RecreationItemColor}{$\bullet$}}
+         {\smc@setalllist}%
+  \else
+    \list{\textcolor{RecreationItemColor}{$\bullet$}}
+         {\smc@setalllist}%
+  \fi
+}
+{\endlist}
+\DeclareCorrItemize{recreation}{\textcolor{RecreationItemColor}{$\bullet$}}
+%    \end{macrocode}
+% Puis l'environnement de liste à puce dans les annexes.
+%    \begin{macrocode}
+\newenvironment{smc@annexeitemize}{%
+  \ifnum\@listdepth=\z@
+    \list{%
+      \color{AnnexeItemColor}
+      \vrule width \ItemRuleWidth
+             height \ItemRuleHeight
+             depth \ItemRuleDepth
+             \relax}
+         {\smc@setalllist}%
+  \else
+    \list{%
+      \color{AnnexeItemColor}
+      \vrule width \ItemRuleWidth
+             height \ItemRuleHeight
+             depth \ItemRuleDepth
+             \relax}
+         {\smc@setalllist}%
+  \fi
+}
+{\endlist}
+%    \end{macrocode}
+% Liste pour le lexique
+%    \begin{macrocode}
+\newenvironment{smc@lexiqueitemize}{%
+  \ifnum\@listdepth=\z@
+    \list{\textcolor{LexiqueItemColor}{$\bullet$}}
+         {\smc@setalllist}%
+  \else
+    \list{\textcolor{LexiqueItemColor}{$\bullet$}}
+         {\smc@setalllist}%
+  \fi
+}
+{\endlist}
+%    \end{macrocode}
+% Puis l'environnement de liste à puce dans le texte libre.
+%    \begin{macrocode}
+\newenvironment{smc@libreitemize}{%
+  \ifnum\@listdepth=\z@
+    \list{%
+      \color{LibreItemColor}
+      \vrule width \ItemRuleWidth
+             height \ItemRuleHeight
+             depth \ItemRuleDepth
+             \relax}
+         {\smc@setalllist}%
+  \else
+    \list{%
+      \color{LibreItemColor}
+      \vrule width \ItemRuleWidth
+             height \ItemRuleHeight
+             depth \ItemRuleDepth
+             \relax}
+         {\smc@setalllist}%
+  \fi
+}
+{\endlist}
+\DeclareCorrItemize{libre}{\textcolor{LibreItemColor}{$\bullet$}}
+%    \end{macrocode}
+% \end{environment}
+% \begin{environment}{enumerate}
+% Tout ce qu'on a fait avec |itemize| se reporte de façon similaire
+% avec |enumerate| (sauf la largeur de l'étiquette). On ne modifiera
+% pas l'environnement |description| \emph{a priori}.
+%
+% On commence par déclarer l'interdiction d'utiliser |enumerate|.
+%    \begin{macrocode}
+\newenvironment{smc@noenumerate}{%
+  \ClassError{sesamanuel}{Il est interdit d'utiliser enumerate ici}
+             {Consultez la documentation pour plus de renseignements.}%
+  \let\item\relax
+}{}
+%    \end{macrocode}
+% Par défaut ce sont les environnements interdits qui sont activés.
+%    \begin{macrocode}
+\let\enumerate\smc@noenumerate
+\let\endenumerate\endsmc@noenumerate
+%    \end{macrocode}
+% On définit maintenant l'environnement |bigenumerate| qui ne fait
+% qu'appeler |enumerate| en ayant modifié au préalable la largeur des
+% étiquettes pour la liste de premier niveau.
+%    \begin{macrocode}
+\newenvironment{bigenumerate}
+  {%
+    \let\smc@setallfirstlist\smc@setallbiglist
+    \begin{enumerate}
+  }
+  {\end{enumerate}}
+%    \end{macrocode}
+% Les différentes environnements enumerate ne diffèrent que par la
+% couleur des numéros et le gras. On les déclarera grâce à la commande
+% générique |\DeclareEnumerate|. Sa syntaxe est : \\
+% |\DeclareEnumerate{nom\_environnement}{commande}{couleur}|\\
+%
+% La première définition globale permet d'afficher correctement la
+% couleur des références des item.
+%    \begin{macrocode}
+\newcommand\DeclareEnumerate[3]{%
+  \newenvironment{smc@#1enumerate}{%
+    \gdef\smc@curr@itemcmd{#2}%
+    \gdef\smc@curr@itemcolor{#3}%(
+    \renewcommand\labelenumi{\textcolor{#3}{#2\theenumi)}}%(
+    \renewcommand\labelenumii{\textcolor{#3}{#2\theenumii)}}%(
+    \renewcommand\labelenumiii{\textcolor{#3}{#2\theenumiii)}}%
+    \advance\@enumdepth \@ne
+    \ifnum\@enumdepth>\thr@@
+%    \end{macrocode}
+% Si on a plus de trois niveau d'imbrication de enumerate, c'est une
+% erreur.
+%    \begin{macrocode}
+      \ClassError{sesamanuel}{Pas plus de 3 niveaux de liste}
+                 {Consultez la documentation pour plus de renseignements.}
+    \else\ifnum\@enumdepth=\@ne
+%    \end{macrocode}
+% Si on est au premier niveau, on peut utiliser une largeur de label
+% plus importante pour permettre une numérotation à deux
+% chiffres.
+%    \begin{macrocode}
+      \edef\@enumctr{enum\romannumeral\the\@enumdepth}%
+      \expandafter
+      \list
+        \csname label\@enumctr\endcsname
+        {%
+          \usecounter{\@enumctr}%
+          \smc@setallfirstlist
+        }%
+    \else
+%    \end{macrocode}
+% Sinon, on garde la largeur habituelle.
+%    \begin{macrocode}
+      \edef\@enumctr{enum\romannumeral\the\@enumdepth}%
+      \expandafter
+      \list
+        \csname label\@enumctr\endcsname
+        {%
+          \usecounter{\@enumctr}%
+          \smc@setalllist
+        }%
+    \fi\fi
+  }
+  {\endlist}
+%    \end{macrocode}
+% On définit du même coup les environnements |smc@corr<nom>enumerate|
+% qui se comporte très différemment des listes enumerate classiques.
+%    \begin{macrocode}
+  \newenvironment{smc@corr#1enumerate}{%
+    \gdef\smc@curr@itemcmd{#2}%
+    \gdef\smc@curr@itemcolor{#3}%(
+%    \end{macrocode}
+% On remet tous les compteurs à zéros (même si un seul sera utilisé).
+%    \begin{macrocode}
+    \setcounter{enumi}{0}%
+    \setcounter{enumii}{0}%
+    \setcounter{enumiii}{0}%
+    \renewcommand\labelenumi{\textcolor{#3}{#2\theenumi)}}%(
+    \renewcommand\labelenumii{\textcolor{#3}{#2\theenumii)}}%(
+    \renewcommand\labelenumiii{\textcolor{#3}{#2\theenumiii)}}%
+    \advance\@enumdepth \@ne
+    \ifnum\@enumdepth>\thr@@
+      \ClassError{sesamanuel}{Pas plus de 3 niveaux de liste}
+                 {Consultez la documentation pour plus de renseignements.}
+    \else
+%    \end{macrocode}
+% On commence par crée une macro annexe qui affiche le numéro.
+%    \begin{macrocode}
+      \def\smc@enum{%
+        \refstepcounter{enum\romannumeral\@enumdepth}%
+        \csname labelenum\romannumeral\@enumdepth\endcsname~
+      }%
+%    \end{macrocode}
+% Ici, on ne redéfinit que la commande |\item|.
+%    \begin{macrocode}
+      \def\item{%
+%    \end{macrocode}
+% Au premier appel, on ne fait qu'afficher le numéro d'item.
+%    \begin{macrocode}
+        \smc@enum
+%    \end{macrocode}
+% Aux appels suivants, on commencera par passer au paragraphe
+% suivant. Pour cela la macro |\item| se redéfinit elle-même.
+%    \begin{macrocode}
+        \def\item{\par\smc@enum}%
+      }%
+    \fi
+    \ignorespaces
+  }
+  {\par}
+}
+%    \end{macrocode}
+% |enumerate| dans les prérequis.
+%    \begin{macrocode}
+\DeclareEnumerate{prerequis}{}{PrerequisItemColor}
+%    \end{macrocode}
+% |enumerate| dans les méthodes.
+%    \begin{macrocode}
+\DeclareEnumerate{exapp}{\bfseries}{ExAppItemColor}
+%    \end{macrocode}
+% |enumerate| dans les environnements de type définition.
+%    \begin{macrocode}
+\DeclareEnumerate{def}{\bfseries}{DefItemColor}
+%    \end{macrocode}
+% |enumerate| dans l'auto-évaluation.
+%    \begin{macrocode}
+\DeclareEnumerate{AE}{\bfseries}{AEItemColor}
+%    \end{macrocode}
+% |enumerate| dans les activités.
+%    \begin{macrocode}
+\DeclareEnumerate{activite}{\bfseries}{ActiviteItemColor}
+%    \end{macrocode}
+% |enumerate| dans les remarques.
+%    \begin{macrocode}
+\DeclareEnumerate{rem}{}{RemItemColor}
+%    \end{macrocode}
+% |enumerate| dans les exemples.
+%    \begin{macrocode}
+\DeclareEnumerate{exemple}{}{ExempleItemColor}
+%    \end{macrocode}
+% |enumerate| dans les preuves.
+%    \begin{macrocode}
+\DeclareEnumerate{proof}{}{ProofItemColor}
+%    \end{macrocode}
+% |enumerate| dans les parties Exercices de base et Exercices
+% d'approfondissement.
+%    \begin{macrocode}
+\DeclareEnumerate{exercice}{\bfseries}{ExerciceItemColor}
+%    \end{macrocode}
+% |enumerate| dans le cadre |acquis|.
+%    \begin{macrocode}
+\DeclareEnumerate{acquis}{\bfseries}{AcquisItemColor}
+%    \end{macrocode}
+% |enumerate| dans les commentaires.
+%    \begin{macrocode}
+\DeclareEnumerate{commentaire}{}{CommentaireItemColor}
+%    \end{macrocode}
+% |enumerate| dans les récréation, énigmes.
+%    \begin{macrocode}
+\DeclareEnumerate{recreation}{\bfseries}{RecreationItemColor}
+%    \end{macrocode}
+% |enumerate| dans les annexes.
+%    \begin{macrocode}
+\DeclareEnumerate{annexe}{}{AnnexeItemColor}
+%    \end{macrocode}
+% |enumerate| dans le lexique.
+%    \begin{macrocode}
+\DeclareEnumerate{lexique}{}{LexiqueItemColor}
+%    \end{macrocode}
+% |enumerate| dans le texte libre.
+%    \begin{macrocode}
+\DeclareEnumerate{libre}{}{LibreItemColor}
+%    \end{macrocode}
+% \end{environment}
+% \begin{environment}{colitemize}
+% En plus des environnements de liste classiques, on a deux autres
+% types de liste où on précise le nombre de colonnes sur lesquelles
+% sont composées chaque item. En revanche, on garde la même syntaxe
+% que les environnements standards, à savoir :\\
+% |\begin{colitemize}{<nombre colonnes>}|\\
+% |\item ...|\\
+% |\item ...|\\
+% |\item ...|\\
+% |\end{colitemize}|
+%
+% On commence en indiquant l'interdiction d'utiliser ce type
+% d'environnement.
+%    \begin{macrocode}
+\newenvironment{smc@nocolitemize}{%
+  \ClassError{sesamanuel}{Il est interdit d'utiliser colitemize ici}
+             {Consultez la documentation pour plus de renseignements.}%
+  \let\item\relax
+}{}
+%    \end{macrocode}
+% Les autres environnements seront déclarés de façon générique en
+% indiquant uniquement la couleur des étiquettes et leur code.
+%    \begin{macrocode}
+\newcount\smc@nbitem
+\newcount\smc@nbline
+\newcommand*\DeclareColItemize[3]{%
+%    \end{macrocode}
+% Tous les environnements |colitemize| doivent spécifier le nombre de
+% colonnes en premier argument.
+%    \begin{macrocode}
+  \newenvironment{#1}[1]{%
+    \par
+%    \end{macrocode}
+% On doit sauvegarder le nombre de colonnes car cette information ne
+% servira que dans la partie terminale de l'environnement.
+%    \begin{macrocode}
+    \def\smc@nbcolumn{##1}%
+%    \end{macrocode}
+% On initialise le nombre d'items
+%    \begin{macrocode}
+    \smc@nbitem \z@
+%    \end{macrocode}
+% Chaîne pour le test de fin d'environnement.
+%    \begin{macrocode}
+    \edef\StringColCurrent{\StringColitemize}%
+%    \end{macrocode}
+% et on lance la macro qui va lire la totalité du contenu de
+% l'environnement et la stoker dans le registre de lexèmes
+% |\toks@| en ayant vidé ce registre au préalable.
+%    \begin{macrocode}
+    \toks@{}%
+    \smc@getbody
+  }%
+  {%
+%    \end{macrocode}
+% En partie terminale de l'environnement, on relance la lecture du
+% corps de l'environnement par la macro |\smc@splititem| qui
+% sauvegarde chaque item dans une macro |\smc@item<num>|. Pour
+% permettre la détection facile de la fin, on ajoute un
+% |\item\@nil\item| à la fin du corps.
+%    \begin{macrocode}
+    \expandafter\smc@splititem\the\toks@\item\@nil\item
+%    \end{macrocode}
+% En sortie de la macro précédente, le nombre d'items est sauvegardé
+% dans le registre |\smc@nbitem|. On calcule le nombre de lignes que
+% cela va nécessiter avec la formule :\\
+% $\hbox{nb\_lignes}=\dfrac{\hbox{nb\_items}+\hbox{nb\_colonnes}-1}
+%                          {\hbox{nb\_colonnes}}$\\
+%    \begin{macrocode}
+    \smc@nbline \numexpr \smc@nbitem+\smc@nbcolumn-1
+    \divide\smc@nbline \smc@nbcolumn
+%    \end{macrocode}
+% On rentre dans la double boucle d'affichage. La boucle externe gère
+% les lignes.
+%    \begin{macrocode}
+    \multido{\n=1+1}{\smc@nbline}{%
+%    \end{macrocode}
+% La boucle interne va afficher tous les items de la ligne en
+% cours. Comme les items sont organisés en colonnes, on va afficher
+% les items ayant comme numéro le numéro de ligne pour l'item le plus
+% à gauche et en ajoutant le nombre de lignes à ce numéro à chaque
+% fois qu'on passe au numéro suivant.
+%
+% Par exemple, si on compose 10 items sur 3 colonnes, les calculs
+% suivants indiquent qu'il y aura 4 lignes. Les numéros d'items de la
+% première lignes seront donc 1 puis $1+4=5$ puis $5+4=9$. La deuxième
+% ligne accueillera les numéros d'items 2 puis $2+4=6$ puis
+% $6+4=10$. La troisième ligne accueillera les numéros d'items 3 puis
+% $3+4=7$ et comme le numéro $7+4=11$ n'existe pas, la dernière
+% colonne de la troisième ligne sera vide. Ce sera la même chose pour
+% la quatrième ligne.
+%    \begin{macrocode}
+      \multido{\ni=\n+\the\smc@nbline}{\smc@nbcolumn}{%
+%    \end{macrocode}
+% On n'affiche l'item que si le numéro existe.
+%    \begin{macrocode}
+        \unless\ifnum\ni>\smc@nbitem
+%    \end{macrocode}
+% La puce est composée dans une boîte de largeur fixée en se servant
+% des paramètres transmis à la macro |\DeclareColItemize|.
+%    \begin{macrocode}
+          \makebox[\ListLabelWidth]{\textcolor{#2}{#3}\hss}%
+%    \end{macrocode}
+% Le corps de l'item est alors composé dans une minipage alignée en
+% haut et de largeur tel qu'elle permet d'avoir le nombre de colonnes
+% et le nombre d'espaces intercolonnes nécessaires.
+%    \begin{macrocode}
+          \begin{minipage}[t]{\dimexpr
+              (\linewidth-\ListHSep*(\smc@nbcolumn-1))%
+                /\smc@nbcolumn-\ListLabelWidth}
+%    \end{macrocode}
+% Le contenu lui même est précédé et suivi d'un |\strut| pour assurer
+% un bon interlignage.
+%    \begin{macrocode}
+            \strut\@nameuse{smc@item\ni}\strut
+          \end{minipage}%
+%    \end{macrocode}
+% À la fin de la minipage, on place l'espace intercolonne.
+%    \begin{macrocode}
+          \hspace{\ListHSep}%
+        \fi
+      }%
+%    \end{macrocode}
+% À la fin de chaque ligne, on insère un saut de ligne. Pour ne pas
+% avoir de saut trop important, la dernière ligne utilisera
+% |\endgraf|.
+%    \begin{macrocode}
+      \ifnum\n=\smc@nbline
+        \endgraf
+      \else
+        \\
+      \fi
+    }%
+  }%
+}
+%    \end{macrocode}
+% La macro |\smc@getbody| permet de récupérer l'intégralité du corps
+% d'un environnement dans le registre de lexèmes |\toks@|. Cette macro
+% est une version simple de ce type de lecture qui ne permet pas
+% l'emboîtement d'environnements.
+%
+% Le principe est de tout lire jusqu'au premier |\end|, de le
+% sauvegarder et de tester le |\end| en mettant un |\smc@testend| dans
+% le flot de lecture.
+%    \begin{macrocode}
+\long\def\smc@getbody#1\end{%
+  \toks@\expandafter{\the\toks@#1}\smc@testend
+}
+%    \end{macrocode}
+% La macro |\smc@testend| permet de savoir si on est effectivement à
+% la fin de l'environnement de départ et de réagir en conséquence.
+%    \begin{macrocode}
+\long\def\smc@testend#1{%
+%    \end{macrocode}
+% On sauvegarde ce qui suit le |\end| pour regarder si c'est égal à la
+% chaîne correspondant à l'environnement de départ.
+%    \begin{macrocode}
+  \def\smc@arg{#1}%
+  \ifx\smc@arg\StringColCurrent
+%    \end{macrocode}
+% Si c'est le cas, il suffit de remettre le tout dans le flot de
+% lecture courant.
+%    \begin{macrocode}
+    \end{#1}%
+  \else
+%    \end{macrocode}
+% Si ce n'est pas le cas, le |\end{environnement}| doit être mis de
+% côté dans la suite du registre de lecture du corps d'environnement
+% et il faut reprendre la lecture en faisant un appel récursif à
+% |\smc@getbody|.
+%    \begin{macrocode}
+    \toks@\expandafter{\the\toks@\end{#1}}%
+    \expandafter\smc@getbody
+  \fi
+}
+%    \end{macrocode}
+% La macro |\smc@splititem| permet de répartir le contenu de chaque
+% item dans des macros ayant un nom comportant un numéro. En
+% l'occurrence |\smc@item<numéro>|.
+%    \begin{macrocode}
+\long\def\smc@splititem#1\item{%
+%    \end{macrocode}
+% En réalité, le premier appel ne sert qu'à passer la première balise
+% |\item| qui n'est normalement précédée d'aucun texte. On passe
+% directement à la macro de lecture effective.
+%    \begin{macrocode}
+  \smc@@splititem
+}
+%    \end{macrocode}
+% La macro |\smc@@splititem| est la macro de lecture recursive qui
+% permet de mémoriser les contenus de tous les items.
+%    \begin{macrocode}
+\long\def\smc@@splititem#1\item{%
+%    \end{macrocode}
+% On place le contenu dans une macro pour tester si c'est égal à
+% |\@nil|.
+%    \begin{macrocode}
+  \def\smc@arg{#1}%
+  \ifx\smc@arg\@nnil
+%    \end{macrocode}
+% Si le |\@nil| a été lu, il n'y a plus rien à faire.
+%    \begin{macrocode}
+  \else
+%    \end{macrocode}
+% Sinon on incrémente le compteur d'items, on sauvegarde le contenu de
+% l'item et on fait un appel récursif sur le prochain item.
+%    \begin{macrocode}
+    \advance\smc@nbitem\@ne
+    \@namedef{smc@item\the\smc@nbitem}{#1}%
+    \expandafter\smc@@splititem
+  \fi
+}
+%    \end{macrocode}
+% On peut maintenant déclarer les environnements colitemize des
+% différentes parties. On commence par les listes dans les prérequis.
+%    \begin{macrocode}
+\DeclareColItemize{smc@prerequiscolitemize}
+                  {PrerequisItemColor}{$\blacktriangleright$}
+%    \end{macrocode}
+% Ensuite le colitemize pour l'auto-évaluation.
+%    \begin{macrocode}
+\DeclareColItemize{smc@AEcolitemize}
+                  {AEItemColor}{$\bullet$}
+%    \end{macrocode}
+% Ensuite le colitemize pour les méthodes.
+%    \begin{macrocode}
+\DeclareColItemize{smc@exappcolitemize}
+                  {ExAppItemColor}{$\bullet$}
+%    \end{macrocode}
+% Ensuite le colitemize pour les environnements de type définition.
+%    \begin{macrocode}
+\DeclareColItemize{smc@defcolitemize}
+                  {DefItemColor}
+                  {%
+                    \vrule width \ItemRuleWidth
+                           height \ItemRuleHeight
+                           depth \ItemRuleDepth
+                    \relax
+                  }
+%    \end{macrocode}
+% Ensuite le colitemize pour les activités.
+%    \begin{macrocode}
+\DeclareColItemize{smc@activitecolitemize}
+                  {ActiviteItemColor}{$\bullet$}
+%    \end{macrocode}
+% Ensuite le colitemize pour les remarques.
+%    \begin{macrocode}
+\DeclareColItemize{smc@remcolitemize}
+                  {RemItemColor}
+                  {%
+                    \vrule width \ItemRuleWidth
+                           height \ItemRuleHeight
+                           depth \ItemRuleDepth
+                    \relax
+                  }
+%    \end{macrocode}
+% Ensuite le colitemize pour les exemples.
+%    \begin{macrocode}
+\DeclareColItemize{smc@exemplecolitemize}
+                  {ExempleItemColor}{$\bullet$}
+%    \end{macrocode}
+% Ensuite le colitemize pour les preuves.
+%    \begin{macrocode}
+\DeclareColItemize{smc@proofcolitemize}
+                  {ProofItemColor}{$\bullet$}
+%    \end{macrocode}
+% Ensuite le colitemize pour les parties Exercices de base et
+% Exercices d'approfondissement.
+%    \begin{macrocode}
+\DeclareColItemize{smc@exercicecolitemize}
+                  {ExerciceItemColor}{$\bullet$}
+%    \end{macrocode}
+% Ensuite le colitemize pour les acquis
+%    \begin{macrocode}
+\DeclareColItemize{smc@acquiscolitemize}
+                  {AcquisItemColor}{$\bullet$}
+%    \end{macrocode}
+% Ensuite le colitemize pour les commentaires.
+%    \begin{macrocode}
+\DeclareColItemize{smc@commentairecolitemize}
+                  {CommentaireItemColor}{$\bullet$}
+%    \end{macrocode}
+% Ensuite le colitemize pour les récréation, énigmes.
+%    \begin{macrocode}
+\DeclareColItemize{smc@recreationcolitemize}
+                  {RecreationItemColor}{$\bullet$}
+%    \end{macrocode}
+% Ensuite le colitemize pour les annexes.
+%    \begin{macrocode}
+\DeclareColItemize{smc@annexecolitemize}
+                  {AnnexeItemColor}
+                  {%
+                    \vrule width \ItemRuleWidth
+                           height \ItemRuleHeight
+                           depth \ItemRuleDepth
+                    \relax
+                  }
+%    \end{macrocode}
+% Ensuite le colitemize pour le lexique.
+%    \begin{macrocode}
+\DeclareColItemize{smc@lexiquecolitemize}
+                  {LexiqueItemColor}{$\bullet$}
+%    \end{macrocode}
+% Ensuite le colitemize pour le texte libre.
+%    \begin{macrocode}
+\DeclareColItemize{smc@librecolitemize}
+                  {LibreItemColor}
+                  {%
+                    \vrule width \ItemRuleWidth
+                           height \ItemRuleHeight
+                           depth \ItemRuleDepth
+                    \relax
+                  }
+%    \end{macrocode}
+% \end{environment}
+% \begin{environment}{colenumerate}
+% Les environnements |colenumerate| permettent les listes numérotées
+% sur plusieurs colonnes. Le code va être similaire à celui de
+% |colitemize|. Pour la déclaration, il y aura besoin du nom de
+% l'environnement d'une commande de fonte éventuelle et de la
+% couleur.
+%    \begin{macrocode}
+\newcommand*\DeclareColEnumerate[3]{%
+%    \end{macrocode}
+% Tous les environnements |colenumerate| doivent spécifier le nombre de
+% colonnes en premier argument.
+%    \begin{macrocode}
+  \newenvironment{#1}[1]{%
+    \par\leavevmode
+%    \end{macrocode}
+% On commence par initialiser le comportement global de la liste en
+% fonction de sa profondeur. Le compteur est indépendant des autres
+% listes. Il s'agira de |\ni| qui sera en fait la variable de boucle
+% interne des |\multido|. 
+%    \begin{macrocode}
+    \advance\@enumdepth \@ne
+    \ifnum\@enumdepth>\thr@@
+      \ClassError{sesamanuel}{Pas plus de 3 niveaux de liste}
+                 {Consultez la documentation pour plus de renseignements.}
+    \else
+%    \end{macrocode}
+% On définit la forme du compteur qui sera utilisé pour la
+% liste. Cette forme dépend des paramètres transmis ainsi que de la
+% profondeur de la liste.
+%    \begin{macrocode}
+      \ifcase\@enumdepth
+      \or %(
+        \def\@enumlabel{\textcolor{#3}{#2\ni)}}%(
+      \or
+        \def\@enumlabel{\textcolor{#3}{#2{\@alph\ni})}}%(
+      \or
+        \def\@enumlabel{\textcolor{#3}{#2{\@roman\ni)}}}%
+      \fi
+    \fi
+%    \end{macrocode}
+% La suite est maintenant assez proche de ce qui se passait pour la
+% macro |\DeclareColItemize|.
+%    \begin{macrocode}
+    \def\smc@nbcolumn{##1}%
+    \smc@nbitem \z@
+%    \end{macrocode}
+% Le test de fin se fait avec la chaîne \og colenumerate \fg{}.
+%    \begin{macrocode}
+    \edef\StringColCurrent{\StringColenumerate}%
+    \toks@{}%
+    \smc@getbody
+  }
+  {%
+    \expandafter\smc@splititem\the\toks@\item\@nil\item
+    \smc@nbline \numexpr \smc@nbitem+\smc@nbcolumn-1
+    \divide\smc@nbline \smc@nbcolumn
+    \multido{\n=1+1}{\smc@nbline}{%
+      \multido{\ni=\n+\the\smc@nbline}{\smc@nbcolumn}{%
+        \unless\ifnum\ni>\smc@nbitem
+%    \end{macrocode}
+% À ce niveau, le code diffère de ce qui se passait pour
+% |\DeclareColItemize| puisque l'étiquette consiste en un nombre
+% défini précédemment dans la macro |@enumlabel|.
+%    \begin{macrocode}
+          \makebox[\ListLabelWidth]{\@enumlabel\hss}%
+          \begin{minipage}[t]{\dimexpr
+              (\linewidth-\ListHSep*(\smc@nbcolumn-1))%
+                /\smc@nbcolumn-\ListLabelWidth}
+            \strut\@nameuse{smc@item\ni}\strut
+          \end{minipage}%
+          \hspace{\ListHSep}%
+        \fi
+      }%
+      \ifnum\n=\smc@nbline
+        \endgraf
+      \else
+        \\
+      \fi
+    }%
+  }%
+}
+%    \end{macrocode}
+% On peut maintenant déclarer les environnements colenumerate des
+% différentes parties. On commence par les listes dans les prérequis.
+%    \begin{macrocode}
+\DeclareColEnumerate{smc@prerequiscolenumerate}
+                    {}{PrerequisItemColor}
+%    \end{macrocode}
+% |colenumerate| dans les méthodes.
+%    \begin{macrocode}
+\DeclareColEnumerate{smc@exappcolenumerate}
+                    {\bfseries}{ExAppItemColor}
+%    \end{macrocode}
+% |colenumerate| dans les environnements de type définition.
+%    \begin{macrocode}
+\DeclareColEnumerate{smc@defcolenumerate}
+                    {\bfseries}{DefItemColor}
+%    \end{macrocode}
+% |colenumerate| dans l'auto-évaluation.
+%    \begin{macrocode}
+\DeclareColEnumerate{smc@AEcolenumerate}
+                    {\bfseries}{AEItemColor}
+%    \end{macrocode}
+% |colenumerate| dans les activités.
+%    \begin{macrocode}
+\DeclareColEnumerate{smc@activitecolenumerate}
+                    {}{ActiviteItemColor}
+%    \end{macrocode}
+% |colenumerate| dans les remarques.
+%    \begin{macrocode}
+\DeclareColEnumerate{smc@remcolenumerate}
+                    {}{RemItemColor}
+%    \end{macrocode}
+% |colenumerate| dans les exemples.
+%    \begin{macrocode}
+\DeclareColEnumerate{smc@exemplecolenumerate}
+                    {}{ExempleItemColor}
+%    \end{macrocode}
+% |colenumerate| dans les preuves.
+%    \begin{macrocode}
+\DeclareColEnumerate{smc@proofcolenumerate}
+                    {}{ProofItemColor}
+%    \end{macrocode}
+% |colenumerate| dans les parties Exercices de base et Exercices
+% d'approfondissement.
+%    \begin{macrocode}
+\DeclareColEnumerate{smc@exercicecolenumerate}
+                    {\bfseries}{ExerciceItemColor}
+%    \end{macrocode}
+% |colenumerate| dans la partie acquis.
+%    \begin{macrocode}
+\DeclareColEnumerate{smc@acquiscolenumerate}
+                    {\bfseries}{AcquisItemColor}
+%    \end{macrocode}
+% |colenumerate| dans les commentaires.
+%    \begin{macrocode}
+\DeclareColEnumerate{smc@commentairecolenumerate}
+                    {\bfseries}{CommentaireItemColor}
+%    \end{macrocode}
+% |colenumerate| dans les récréation, énigmes.
+%    \begin{macrocode}
+\DeclareColEnumerate{smc@recreationcolenumerate}
+                    {\bfseries}{RecreationItemColor}
+%    \end{macrocode}
+% |colenumerate| dans les annexes.
+%    \begin{macrocode}
+\DeclareColEnumerate{smc@annexecolenumerate}
+                    {\bfseries}{AnnexeItemColor}
+%    \end{macrocode}
+% |colenumerate| dans le lexique.
+%    \begin{macrocode}
+\DeclareColEnumerate{smc@lexiquecolenumerate}
+                    {\bfseries}{RecreationItemColor}
+%    \end{macrocode}
+% |colenumerate| dans le texte libre.
+%    \begin{macrocode}
+\DeclareColEnumerate{smc@librecolenumerate}
+                    {\bfseries}{LibreItemColor}
+%    \end{macrocode}
+% \end{environment}
+% \begin{environment}{changemargin}
+% Environnement général de changement de marge.
+%    \begin{macrocode}
+\newenvironment{changemargin}[2]{%
+  \begin{list}{}{%
+    \setlength{\topsep}{0pt}%
+    \setlength{\leftmargin}{0pt}%
+    \setlength{\rightmargin}{0pt}%
+    \setlength{\listparindent}{0pt}%
+    \setlength{\itemindent}{0pt}%
+    \setlength{\parsep}{\parskip}%
+    \addtolength{\leftmargin}{#1}%
+    \addtolength{\rightmargin}{#2}%
+  }%
+  \item\relax
+}
+{\strut \end{list}}
+%    \end{macrocode}
+% \end{environment}
+% \section{Cadres et mises en page ponctuelles}
+% \begin{environment}{cadre}
+% Cadre avec un coin inférieur gauche biseauté. On a deux arguments
+% optionnels pour indiquer les couleurs de cadre et de fond. Pour
+% cette raison, il faudra définir l'environnement sous forme de
+% macro.
+%    \begin{macrocode}
+\newcommand*{\cadre}[1][]{%
+%    \end{macrocode}
+% Le premier paramètre optionnel indique la couleur de ligne. Si il
+% est vide, c'est la couleur par défaut qui est utilisée.
+%    \begin{macrocode}
+  \ifx\relax#1\relax
+    \colorlet{CurrCadreLineColor}{CadreLineColor}%
+  \else
+%    \end{macrocode}
+% Sinon, c'est que la couleur de ligne est explicitement indiquée.
+%    \begin{macrocode}
+    \colorlet{CurrCadreLineColor}{#1}%
+  \fi
+%    \end{macrocode}
+% On appelle alors la macro auxiliaire permettant de lire le
+% deuxième argument optionnel et de commencer le travail véritable.
+%    \begin{macrocode}
+  \@cadre
+}
+\newcommand\@cadre[1][]{%
+%    \end{macrocode}
+% On refait le travail précédent pour la couleur de fond.
+%    \begin{macrocode}
+  \ifx\relax#1\relax
+    \colorlet{CurrCadreBkgColor}{CadreBkgColor}%
+  \else
+    \colorlet{CurrCadreBkgColor}{#1}%
+  \fi
+%    \end{macrocode}
+% On va stocker le corps de l'environnement dans une boîte contenant
+% une minipage de l'empagement moins deux fois |\CadreSep| moins deux
+% fois |\CadreLineWidth|.
+%    \begin{macrocode}
+  \def\smc@cadre@color{#1}%
+  \begin{lrbox}{\smc@boxa}%
+    \minipage{\dimexpr \linewidth-\CadreSep*2-\CadreLineWidth*2}%
+}
+%    \end{macrocode}
+% Partie terminale de l'environnement
+%    \begin{macrocode}
+\def\endcadre
+{%
+    \endminipage
+  \end{lrbox}%
+%    \end{macrocode}
+% La boîte est construite, il reste à construire le cadre biseauté à
+% la bonne taille et à placer la boîte dans le cadre.
+%    \begin{macrocode}
+  \par\addvspace{\BeforeCadreVSpace}
+%    \end{macrocode}
+% On peut maintenant construire le cadre
+%    \begin{macrocode}
+  \begin{pspicture}(0,\dimexpr\ht\smc@boxa+\CadreSep+\CadreLineWidth)
+                   (\linewidth,-\dimexpr\dp\smc@boxa+\CadreSep+\CadreLineWidth)
+%    \end{macrocode}
+% Pose des nœuds utiles. Tout est calculé automatiquement à partir des
+% deux coins opposés.
+%    \begin{macrocode}
+    \pnode(0,\dimexpr\ht\smc@boxa+\CadreSep+\CadreLineWidth){A}
+    \pnode(\linewidth,-\dimexpr\dp\smc@boxa+\CadreSep+\CadreLineWidth){C}
+    \pnode(A|C){B}
+    \pnode(C|A){D}
+    \pnode([nodesep=-\SquareWidth]C){C1}
+    \pnode([offset=\SquareWidth]C){C2}
+%    \end{macrocode}
+% Affichage du cadre.
+%    \begin{macrocode}
+    \pspolygon[linecolor=CurrCadreLineColor,
+    linewidth=\CadreLineWidth, fillstyle=solid,
+    fillcolor=CurrCadreBkgColor]
+              (A)(B)(C1)(C2)(D)
+%    \end{macrocode}
+% Affichage du contenu.
+%    \begin{macrocode}
+    \rput[Bl](\dimexpr\CadreSep+\CadreLineWidth,0)
+         {\usebox{\smc@boxa}}
+  \end{pspicture}
+  \par\addvspace{\AfterCadreVSpace}
+}
+%    \end{macrocode}
+% \end{environment}
+% \begin{environment}{smc@cadre}
+% Environnement général de construction d'un cadre avec fond coloré,
+% bord éventuel et coins arrondis à la demande. Pour cela,
+% l'environnement demande un argument optionnel, un
+% argument obligatoire et un troisième argument optionnel. Ils
+% indiquent, dans l'ordre :
+% \begin{itemize}
+% \item les coins devant être arrondis (en partant du coin inférieur
+% gauche et en tournant dans le sens inverse des aiguilles d'une
+% montre avec une suite de valeurs entières séparées par des virgules
+% qui donnent un multiple de dixième de la valeur |\FrameArc| donc 0
+% indique un coin carré et 10 un coint arrondi avec ce rayon) ;
+% \item la couleur de fond ;
+% \item la couleur de bordure.
+% \end{itemize}
+% S'il n'y a pas de couleur de bordure, il n'y a pas de bordure du
+% tout. Le cadre utilise les longueurs |\FrameSep| indiquant la
+% distance entre le texte et les bords du cadre, |\FrameLineWidth|
+% indiquant l'épaisseur du bord éventuel, |\FrameArc| indiquant le
+% rayon de l'arc.
+%
+% En raison de l'examen de paramètres dans un ordre non conventionnel
+% (pour \LaTeX{}), on définit l'environnement |smc@cadre| comme étant
+% le couple |\smc@cadre| |\endsmc@cadre|. La valeur par défaut du
+% premier argument optionnel est |0,0,0,0| ce qui donne quatre coins
+% carrés.
+%    \begin{macrocode}
+\newcommand*\smc@cadre[2][0,0,0,0]{%
+%    \end{macrocode}
+% Il faut sauvegarder les arguments car on ne s'en servira que dans la
+% partie terminale de l'environnement, en l'occurrence dans la macro
+% |\endcadre|.
+%    \begin{macrocode}
+  \def\smc@framecorner{#1}%
+  \def\smc@framebkgcolor{#2}%
+  \smc@@cadre
+}
+%    \end{macrocode}
+% La macro auxiliaire a une valeur par défaut vide pour le second
+% paramètre optionnel de l'environnement, c'est-à-dire qu'il n'y aura
+% pas de bord.
+%    \begin{macrocode}
+\newcommand*\smc@@cadre[1][]{%
+%    \end{macrocode}
+% On sauvegarde également l'argument optionnel pour la même raison que
+% ci-dessus.
+%    \begin{macrocode}
+  \def\smc@framelinecolor{#1}%
+%    \end{macrocode}
+% Le contenu de l'environnement sera composé dans une minipage de
+% largeur égale à l'empagement moins deux fois l'espace |\FrameSep|
+% et, si besoin, deux fois l'épaisseur |\FrameLineWidth|. On calcule
+% également le décalage horizontal de la boîte dans le cadre final.
+%    \begin{macrocode}
+  \ifx\smc@framelinecolor\empty
+    \edef\smc@framehoffset{\the\dimexpr\FrameSep*2}%
+    \edef\smc@framewidth
+      {\the\dimexpr\linewidth-\smc@framehoffset}%
+  \else
+    \edef\smc@framehoffset{\the\dimexpr\FrameSep*2+\FrameLineWidth*2}%
+    \edef\smc@framewidth
+      {\the\dimexpr\linewidth-\smc@framehoffset}%
+  \fi
+%    \end{macrocode}
+% Le code initiale se termine en mettant en boîte l'ensemble du corps
+% de l'environnement pour l'afficher ensuite avec son cadre
+% coloré.
+%    \begin{macrocode}
+  \setbox0=\hbox\bgroup
+    \minipage{\smc@framewidth}%
+      \ignorespaces
+}
+%    \end{macrocode}
+% La macro |\endsmc@cadre| correspond au code terminal de
+% l'environnement. C'est elle qui fera tout le travail de composition
+% après avoir refermé la minipage et sa boîte englobante.
+%    \begin{macrocode}
+\def\endsmc@cadre{%
+    \endminipage
+  \egroup
+%    \end{macrocode}
+% Le principe va être d'afficher d'abord le cadre et de placer le
+% texte au dessus. Comme les coins peuvent être ou non arrondis
+% individuellement, on va utiliser |\pscustom| pour construire le
+% pourtour. Le cadre à une largeur égal à |\linewidth| est une hauteur
+% égale à celle du texte plus deux fois |\FrameSep| et, éventuellement
+% plus deux fois |\FrameLineWidth|. On commence donc par calculer la
+% profondeur et la hauteur du cadre et on initialise les paramètres
+% PSTsicks pour le tracé du cadre. Pour faciliter le code ultérieur,
+% s'il n'y a pas de bord, on force la longueur |\FrameLineWith| à être
+% nulle.
+%    \begin{macrocode}
+  \ifx\smc@framelinecolor\empty
+    \edef\smc@ymin{\the\dimexpr-\dp0-\FrameSep}%
+    \edef\smc@ymax{\the\dimexpr\ht0+\FrameSep}%
+    \psset{linewidth=0pt, linestyle=none,
+           fillstyle=solid, fillcolor=\smc@framebkgcolor}
+  \else
+    \edef\smc@ymin{\the\dimexpr -\dp0-\FrameSep-\FrameLineWidth}%
+    \edef\smc@ymax{\the\dimexpr\ht0+\FrameSep+\FrameLineWidth}%
+    \psset{linewidth=\FrameLineWidth, linecolor=\smc@framelinecolor,
+           fillstyle=solid, fillcolor=\smc@framebkgcolor}
+    \def\FrameLineWidth{0pt}%
+  \fi
+%    \end{macrocode}
+% Avant de commencer le cadre proprement dit, il faut analyser la
+% chaîne d'indication des arrondis de coin. On va en fait mémoriser
+% les quatre nombres dans les quatre macros |\smc@corner@dl|,
+% |\smc@corner@dr|, |\smc@corner@ur| et |\smc@corner@ul|, dans l'ordre
+% où les valeurs sont lues.
+%    \begin{macrocode}
+  \smc@parse@corner{\smc@framecorner}%
+%    \end{macrocode}
+% Tout est en place pour procéder à la composition proprement dite
+%    \begin{macrocode}
+  \begin{pspicture}(0,\smc@ymin)(\linewidth,\smc@ymax)
+%    \end{macrocode}
+% Il n'y a pas besoin de spécifier les paramètres au niveau de la
+% commande |\pscustom| puisque ceux-ci ont été déclarés auparavant.
+%    \begin{macrocode}
+    \pscustom{%
+%    \end{macrocode}
+% Arc du coin inférieur gauche et ligne du coin inférieur gauche au
+% coin inférieur droit.
+%    \begin{macrocode}
+      \psarc(\dimexpr \FrameArc/10*\smc@corner@dl,
+             \dimexpr \smc@ymin+\FrameArc/10*\smc@corner@dl)
+            {\dimexpr \FrameArc/10*\smc@corner@dl}{180}{270}
+      \psline(\dimexpr \FrameArc/10*\smc@corner@dl,
+              \smc@ymin)
+             (\dimexpr \linewidth-\FrameArc/10*\smc@corner@dr,
+              \smc@ymin)
+%    \end{macrocode}
+% Arc du coin inférieur droit et ligne du coin inférieur droit au coin
+% supérieur droit.
+%    \begin{macrocode}
+      \psarc(\dimexpr \linewidth-\FrameArc/10*\smc@corner@dr,
+             \dimexpr \smc@ymin+\FrameArc/10*\smc@corner@dr)
+            {\dimexpr \FrameArc/10*\smc@corner@dr}{270}{360}
+      \psline(\linewidth,
+              \dimexpr \smc@ymin+\FrameArc/10*\smc@corner@dr)
+             (\linewidth,
+              \dimexpr \smc@ymax-\FrameArc/10*\smc@corner@ur)
+%    \end{macrocode}
+% Arc du coin supérieur droit et ligne du coin supérieur droit au
+% coin supérieur gauche.
+%    \begin{macrocode}
+      \psarc(\dimexpr \linewidth-\FrameArc/10*\smc@corner@ur,
+             \dimexpr \smc@ymax-\FrameArc/10*\smc@corner@ur)
+            {\dimexpr \FrameArc/10*\smc@corner@ur}{0}{90}
+      \psline(\dimexpr \linewidth-\FrameArc/10*\smc@corner@ur,
+              \smc@ymax)
+             (\dimexpr \FrameArc/10*\smc@corner@ul,
+              \smc@ymax)
+%    \end{macrocode}
+% Arc du coin supérieur gauche et ligne du coin supérieur gauche au
+% coin inférieur gauche.
+%    \begin{macrocode}
+      \psarc(\dimexpr \FrameArc/10*\smc@corner@ul,
+             \dimexpr \smc@ymax-\FrameArc/10*\smc@corner@ul)
+            {\dimexpr \FrameArc/10*\smc@corner@dr}{90}{180}
+      \psline(0,
+              \dimexpr \smc@ymax-\FrameArc/10*\smc@corner@ul)
+             (0,
+              \dimexpr \smc@ymin+\FrameArc/10*\smc@corner@dl)
+    }
+%    \end{macrocode}
+% Le cadre est terminé, il reste à placer le contenu de
+% l'environnement.
+%    \begin{macrocode}
+    \rput[Bl](\dimexpr \FrameSep+\FrameLineWidth,0){\box0}
+  \end{pspicture}%
+}
+%    \end{macrocode}
+% On définit maintenant la commande qui analyse les valeurs des coins
+% (afin de déterminer l'arrondi).
+%    \begin{macrocode}
+\newcommand*\smc@parse@corner[1]{%
+%    \end{macrocode}
+% On acceptera qu'il y ait moins de quatre argument et qu'un argument
+% vide équivaut à zéro. Pour cela, on ajoute quatre valeurs vides à
+% la suite de l'argument transmis. 
+%    \begin{macrocode}
+  \expandafter\smc@@parse@corner#1,,,,\@nil
+}
+\def\smc@@parse@corner#1,#2,#3,#4,#5\@nil{%
+%    \end{macrocode}
+% L'ordre des arguments est toujours inférieur-gauche,
+% inférieur-droite, supérieur-droit, supérieur-gauche.
+%    \begin{macrocode}
+  \def\smc@corner@dl{#1}%
+  \ifx\smc@corner@dl\empty
+    \def\smc@corner@dl{0}%
+  \fi
+  \def\smc@corner@dr{#2}%
+  \ifx\smc@corner@dr\empty
+    \def\smc@corner@dr{0}%
+  \fi
+  \def\smc@corner@ur{#3}%
+  \ifx\smc@corner@ur\empty
+    \def\smc@corner@ur{0}%
+  \fi
+  \def\smc@corner@ul{#4}%
+  \ifx\smc@corner@ul\empty
+    \def\smc@corner@ul{0}%
+  \fi
+%    \end{macrocode}
+% Le cinquième argument sert à faire le ménage au niveau des virgules
+% inutilisées.
+%    \begin{macrocode}
+}
+%    \end{macrocode}
+% \end{environment}
+% \begin{environment}{tableau}
+% Rien n'empèche d'utiliser les environnements de tableau de \LaTeX{}
+% mais l'environnement |tableau| permet d'automatiser la
+% présentation. En particulier, les cellules colorés seront toujours
+% de la même couleur, les filets utiliseront un gris particulier et
+% les colonnes de type X sont verticalement centrées.
+%
+% Le principe va être d'avoir un paramètre optionnel
+% indiquant le type du tableau et un ou plusieurs paramètres
+% obligatoires en fonction du type de tableau choisi. On aura :
+% \begin{itemize}
+% \item |t| Toutes les colonnes de même largeur, argument 1 $\to$
+%   largeur, argument 2 $\to$ nombre de colonnes.
+% \item |c| Toutes les colonnes de même largeur, colonne de gauche en
+%   jaune, argument 1 $\to$ largeur, argument 2 $\to$ nombre de
+%   colonnes (c'est le type par défaut).
+% \item |l| Toutes les colonnes de même largeur, ligne du haut en
+%   jaune, argument 1 $\to$ largeur, argument 2 $\to$ nombre de
+%   colonnes.
+% \item |cl| Toutes les colonnes de même largeur, ligne du haut et
+%   colonne de gauche en jaune, argument 1 $\to$ largeur, argument 2
+%   $\to$ nombre de colonnes.
+% \item |lc| synonyme de |cl|.
+% \item |T|, |C| |L|, |CL| |LC| comme précédemment sauf que la
+% première colonne aura un motif libre qu'il faudra renseigner avec le
+% dernier argument.
+% \item |pr| Le tableau prendra la largeur d'empagement, il aura trois
+% colonnes avec une colonne centrale environ deux fois plus large que
+% les colonnes externes et colorée. La troisième colonne sera centrée.
+% \end{itemize}
+% 
+% En revanche, la syntaxe des tableaux sera celle habituelle à
+% l'intérieur de l'environnement (utilisation des |&| et des commandes
+% |\\|, |\hline|, |\cline|, |\multicolumn|, etc. La classe charge les
+% extensions suivantes pour gérer tous ces cas :
+% \begin{itemize}
+% \item tabularx ;
+% \item multirow ;
+% \item xcolor avec la l'option table.
+% \end{itemize}
+% |\tableau| est bien un environnement mais on va le déclarer en tant
+% que commande car son code final dépend de l'option choisie et c'est
+% donc plus simple de le coder de cette façon.
+%    \begin{macrocode}
+\newcommand{\tableau}[1][c]{%
+%    \end{macrocode}
+% Quel que soit le type de tableau, on indique la couleur des filets
+% et les colonnes X sont centrées verticalement et horizontalement.
+%    \begin{macrocode}
+  \arrayrulecolor{FiletTableauColor}%
+  \renewcommand\tabularxcolumn[1]{>{\centering\arraybackslash}m{##1}}%
+%    \end{macrocode}
+% On construit maintenant le code initial et final en fonction de
+% l'argument optionnel. Pour cela, on teste si la macro
+% |\<lettre>tableau| existe. Si oui, c'est elle qui sera utilisée,
+% sinon, on émet un message d'erreur et on utilise le type c à la place.
+%    \begin{macrocode}
+  \ifcsname#1tableau\endcsname
+    \expandafter\let\expandafter\smc@next\csname#1tableau\endcsname
+    \expandafter\let\expandafter\endtableau\csname end#1tableau\endcsname
+  \else
+    \ClassError{sesamanuel}
+              {Le type de tableau #1 n'existe pas}
+              {Les types possibles sont 't', 'c', 'l', 'cl', 'T', 'C',
+                'L', 'CL' et 'pr'.}%
+    \let\smc@next\ctableau
+    \let\endtableau\endctableau
+  \fi
+%    \end{macrocode}
+% Il ne reste plus qu'à lancer l'environnement précédemment assigné
+% avec un espacement vertical précédent.
+%    \begin{macrocode}
+  \par\addvspace{\BeforeTableVSpace}
+  \smc@next
+}
+%    \end{macrocode}
+% On définit maintenant les véritables environnements de travail.
+%
+% L'environnement |ttableau| demande comme arguments la largeur du
+% tableau et le nombre de colonnes.
+%    \begin{macrocode}
+\newenvironment{ttableau}[2]
+{\tabularx{#1}{|*{#2}{X|}}}
+{\endtabularx\par\addvspace{\AfterTableVSpace}}
+%    \end{macrocode}
+% L'environnement |Ttableau| demande comme arguments la largeur du
+% tableau, le nombre de colonnes et le motif de la première colonne.
+%    \begin{macrocode}
+\newenvironment{Ttableau}[3]
+{\tabularx{#1}{|#3|*{\numexpr#2-1}{X|}}}
+{\endtabularx\par\addvspace{\AfterTableVSpace}}
+%    \end{macrocode}
+% L'environnement |ctableau| demande comme arguments la largeur du
+% tableau et le nombre de colonnes. Pour la colonne en couleur, on
+% utilise le premier argument optionnel de |\columncolor| pour
+% permettre un affichage complet du filet gauche.
+%    \begin{macrocode}
+\newenvironment{ctableau}[2]
+{%
+  \tabularx{#1}{%
+    |>{\columncolor{FondTableaux}[\dimexpr\tabcolsep-0.5pt]}X|
+    *{\numexpr#2-1}{X|}}%
+}
+{\endtabularx\par\addvspace{\AfterTableVSpace}}
+%    \end{macrocode}
+% L'environnement |Ctableau| demande comme arguments la largeur du
+% tableau, le nombre de colonnes et le motif de la première colonne.
+%    \begin{macrocode}
+\newenvironment{Ctableau}[3]
+{%
+  \tabularx{#1}{%
+    |>{\columncolor{FondTableaux}[\dimexpr\tabcolsep-0.5pt]}#3|
+    *{\numexpr#2-1}{X|}}%
+}
+{\endtabularx\par\addvspace{\AfterTableVSpace}}
+%    \end{macrocode}
+% L'environnement |ltableau| demande comme arguments la largeur du
+% tableau et le nombres de colonnes.
+%    \begin{macrocode}
+\newenvironment{ltableau}[2]
+{%
+  \tabularx{#1}{|*{#2}{X|}}
+  \rowcolor{FondTableaux}
+}
+{\endtabularx\par\addvspace{\AfterTableVSpace}}
+%    \end{macrocode}
+% L'environnement |Ltableau| demande comme arguments la largeur du
+% tableau, le nombres de colonnes et le motif de la première colonne.
+%    \begin{macrocode}
+\newenvironment{Ltableau}[3]
+{%
+  \tabularx{#1}{|#3|*{\numexpr#2-1}{X|}}
+  \rowcolor{FondTableaux}
+}
+{\endtabularx\par\addvspace{\AfterTableVSpace}}
+%    \end{macrocode}
+% L'environnement |cltableau| demande comme arguments la largeur du
+% tableau et le nombre de colonnes. Pour la colonne en couleur, on
+% utilise le premier argument optionnel de |\columncolor| pour
+% permettre un affichage complet du filet gauche.
+%    \begin{macrocode}
+\newenvironment{cltableau}[2]
+{%
+  \tabularx{#1}{%
+    |>{\columncolor{FondTableaux}[\dimexpr\tabcolsep-0.5pt]}X|
+    *{\numexpr#2-1}{X|}}%
+  \rowcolor{FondTableaux}
+}
+{\endtabularx\par\addvspace{\AfterTableVSpace}}
+%    \end{macrocode}
+% L'environnement |CLtableau| demande comme arguments la largeur du
+% tableau, le nombre de colonnes et le motif de la première colonne.
+%    \begin{macrocode}
+\newenvironment{CLtableau}[3]
+{%
+  \tabularx{#1}{%
+    |>{\columncolor{FondTableaux}[\dimexpr\tabcolsep-0.5pt]}#3|
+    *{\numexpr#2-1}{X|}}%
+  \rowcolor{FondTableaux}
+}
+{\endtabularx\par\addvspace{\AfterTableVSpace}}
+%    \end{macrocode}
+% Les environnements |lctableau| et |LCtableau| ne sont que  des alias
+% de |cltableau| et |CLtableau|.
+%    \begin{macrocode}
+\let\lctableau\cltableau
+\let\endlctableau\endcltableau
+\let\LCtableau\CLtableau
+\let\endLCtableau\endCLtableau
+%    \end{macrocode}
+% Le type |pr| permet de construire le tableau des propriétés dans la
+% partie annexe. il ne demande que la largeur de tableau en
+% paramètre. Il utilise la couleur |TablePropertyBkgColor| pour le
+% fond de la deuxième colonne et les couleurs
+% |TablePropertyTitleBkgColor| et |TablePropertyTitleTextColor| pour
+% les couleurs de fond et de texte du titre \og propriété \fg{}.
+%    \begin{macrocode}
+\newenvironment{prtableau}[1]
+{%
+%    \end{macrocode}
+% On redéfinit la macro |\propriete| à l'intérieur de l'environnement
+%    \begin{macrocode}
+  \def\propriete{%
+    \refstepcounter{propriete}%
+    \psframebox*[fillcolor=TablePropertyTitleBkgColor]{%
+      \ProprieteFont
+      \textcolor{TablePropertyTitleTextColor}{ \MakeUppercase{\StringPropriete}}
+      \NumProprieteFont
+      \textcolor{TablePropertyTitleTextColor}{\thepropriete}
+    }
+  }%
+%    \end{macrocode}
+% On peut ensuite composer le tableau proprement dit.
+%    \begin{macrocode}
+  \longtable{%
+%    \end{macrocode}
+% Après discussions et retouches diverses, on va partager partager
+% |#1| avec les facteurs 0.24/0.46/0.30. Il faut également prévoir les
+% 6 |\tabcolsep|.
+%    \begin{macrocode}
+    >{\leavevmode\endgraf\vspace{-0.3\baselineskip}}
+    m{0.24\dimexpr#1-6\tabcolsep}
+    <{\endgraf\vspace{-0.3\baselineskip}}
+    >{%
+      \leavevmode\endgraf\vspace{-0.3\baselineskip}
+      \columncolor{TablePropertyBkgColor}
+    }
+    m{0.46\dimexpr#1-6\tabcolsep}
+    <{\endgraf\vspace{-0.3\baselineskip}}
+    >{%
+      \centering\arraybackslash
+      \leavevmode\endgraf\vspace{-0.3\baselineskip}
+    }
+    m{0.30\dimexpr#1-6\tabcolsep}
+    <{\endgraf\vspace{-0.3\baselineskip}}
+  }%
+}
+{\endlongtable\par\addvspace{\AfterTableVSpace}}
+%    \end{macrocode}
+% \end{environment}
+% \begin{macro}{\tabX}
+% La macro |\tabX| permet d'obtenir des cases avec une croix à
+% l'intérieur qui joint les coins opposés. Cette macro admet un
+% argument optionnel indiquant la hauteur et la profondeur de la
+% cellule (par défaut hauteur et profondeur d'une ligne normale de
+% tableau).
+%    \begin{macrocode}
+\newcommand\tabX[1][\ht\@arstrutbox,\dp\@arstrutbox]{%
+%    \end{macrocode}
+% On commence par analyser l'argument optionnel pour placer les deux
+% valeurs séparées par une virgule dans les deux macros |\smc@htTabX|
+% et |\smc@dpTabX|.
+%    \begin{macrocode}
+  \smc@GetVTabX#1,,\@nil
+%    \end{macrocode}
+% On place un strut de la hauteur et profondeur indiquée pour forcer
+% effectivement la ligne a avoir ces dimensions verticales.
+%    \begin{macrocode}
+  \vrule width0pt height\smc@htTabX depth-\smc@dpTabX
+%    \end{macrocode}
+% On pose d'abord les nœuds gauches (supérieur puis inférieur).
+%    \begin{macrocode}
+  \pnode(-\tabcolsep,\smc@htTabX){ul}
+  \pnode(-\tabcolsep,\smc@dpTabX){dl}
+%    \end{macrocode}
+% On réalise un saut avec un ressort infini pour se placer sur la
+% droite de la cellule afin de placer les nœuds droits (supérieur et
+% inférieur).
+%    \begin{macrocode}
+  \hspace*{\stretch{1}}%
+  \pnode(\tabcolsep,\smc@htTabX){ur}
+  \pnode(\tabcolsep,\smc@dpTabX){dr}
+%    \end{macrocode}
+% Il ne reste plus qu'à tracer la croix.
+%    \begin{macrocode}
+  \psline(ul)(dr)
+  \psline(dl)(ur)
+}
+%    \end{macrocode}
+% Macro de sauvegarde d'une liste de deuc valeurs séparées par une
+% virgule en deux macros |\smc@htTabX| et |\smc@dpTabX|.
+%    \begin{macrocode}
+\def\smc@GetVTabX#1,#2,{%
+  \edef\smc@htTabX{\the\dimexpr#1}%
+  \edef\smc@dpTabX{-\the\dimexpr#2}%
+  \smc@gobblenil
+}
+\def\smc@gobblenil#1\@nil{} 
+%    \end{macrocode}
+% \end{macro}
+% \begin{environment}{debordedroite}
+% L'environnement |debordedroite| ajoute une marge de
+% |\ExtraMarginRight| à droite.
+%    \begin{macrocode}
+\newenvironment{debordedroite}{%
+  \changemargin{0mm}{-\ExtraMarginRight}%
+}
+{\par\endchangemargin}
+%    \end{macrocode}
+% \end{environment}
+% \begin{macro}{\habillage}
+% Cette macro permet d'habiller une image par le texte. Sa syntaxe est
+% la suivante :\\
+% |\habillage{<figure>}|\\
+%    \begin{macrocode}
+\newcommand*\habillage[1]{%
+%    \end{macrocode}
+% Le principe va être de placer la figure en la faisant déborder dans
+% la marge droite. Si la figure fait moins de |\ExtraMarginRight|
+% de large, elle n'ira pas jusqu'à la fin de cette marge
+% supplémentaire sinon, elle est placée pour aller jusqu'à cette marge
+% et le texte est composée sur une largeur adéquate de façon
+% automatique par la macro |\parpic|.
+%
+% Pour cela, on va tricher sur la largeur de la figure. Elle sera de
+% |<largeur>-\ExtraMarginRight| si cette quantité est positive ou bien
+% nulle sinon. En réalité, il y a un petit bug à ce niveau (de parpic
+% je pense) et il ne faut pas que la largeur soit totalement nulle,
+% d'où la valeur un peu étrange de |0.1pt|. Pour faire tous ces
+% calculs, il faut au préalable mettre le matériel en boîte.
+%    \begin{macrocode}
+  \setbox\smc@boxb=\hbox{#1}%
+  \smc@dimb = \dimexpr\wd\smc@boxb-\ExtraMarginRight\relax
+  \ifdim \smc@dimb<\z@
+    \smc@dimb = 0.1pt
+  \fi
+%    \end{macrocode}
+% On peut maintenant appeler la macro |\parpic|.
+%    \begin{macrocode}
+  \parpic[r]{\makebox[\smc@dimb][l]{{#1}}}
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\u}
+% La classe permet de gérer les unités de façon simple avec des macros
+% de type |\uxx| où |xx| indique l'unité choisie. Le nombre est mis en
+% forme selon les standards français.
+%
+% Au départ, on sauvegarde la valeur de la macro |\u| dans |\uori|. Il
+% s'agit de la macro d'accent rond inverse. On déclare alors les deux
+% macros qui ne demandent aucune unité.
+%    \begin{macrocode}
+\let\uori\u
+%    \end{macrocode}
+% Le |\U| est parfois défini. On le tue.
+%    \begin{macrocode}
+\let\Uori\U
+\let\U\relax
+\newcommand\U[1]{\ensuremath{#1}}
+\renewcommand\u[1]{\ensuremath{\nombre{#1}}}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\newunit}
+% Macro générale de création de macros d'unité. Cette macro demande
+% deux paramètres : le nom de la macro et l'unité à afficher (en mode
+% texte).
+%    \begin{macrocode}
+\newcommand\newunit[2]{%
+%    \end{macrocode}
+% On commence avec la macro où le nombre est écrit avec la macro
+% |\nombre|. Le nom de cette macro est |\u<unité>| où |<unité>| est le
+% premier argument de |\newunit|.
+%    \begin{macrocode}
+  \expandafter\newcommand\csname u#1\endcsname[1]{%
+%    \end{macrocode}
+% Si le nombre passé est totalement vide, on n'affiche que l'unité.
+%    \begin{macrocode}
+    \@ifmtarg{##1}
+      {\ensuremath{#2}}
+      {\ensuremath{\nombre{##1}\,#2}}%
+  }%
+%    \end{macrocode}
+% On fait exactement la même chose avec la macro |\U<unité>|. La
+% diiférence est que le nombre est composé directement en mode
+% mathématique (sans la macro |\nombre|). Cela permet de passer des
+% expressions mathématiques.
+%    \begin{macrocode}
+  \expandafter\newcommand\csname U#1\endcsname[1]{%
+    \@ifmtarg{##1}
+      {\ensuremath{#2}}
+      {\ensuremath{##1\,#2}}%
+  }%
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\renewunit}
+% La macro |\renewunit| permet à l'utilisateur de redéfinir des unités
+% existantes. C'est exactement le même code que ci-dessus mais avec un
+% |\renewcommand| à la place des |\newcommand|.
+%    \begin{macrocode}
+\newcommand\renewunit[2]{%
+  \expandafter\renewcommand\csname u#1\endcsname[1]{%
+    \@ifmtarg{##1}
+      {\ensuremath{#2}}
+      {\ensuremath{\nombre{##1}\,#2}}%
+  }%
+  \expandafter\renewcommand\csname U#1\endcsname[1]{%
+    \@ifmtarg{##1}
+      {\ensuremath{#2}}
+      {\ensuremath{##1\,#2}}%
+  }%
+}
+%    \end{macrocode}
+% \end{macro}
+% On utilise la macro |\newunit| pour créer des macros d'unités
+% de longueur.
+%    \begin{macrocode}
+\newunit{ym}{\text{ym}}
+\newunit{zm}{\text{zm}}
+\newunit{am}{\text{am}}
+\newunit{fm}{\text{fm}}
+\newunit{pm}{\text{pm}}
+\newunit{nm}{\text{nm}}
+\newunit{micron}{\mu\text{m}}
+\newunit{mm}{\text{mm}}
+\newunit{cm}{\text{cm}}
+\newunit{dm}{\text{dm}}
+\newunit{m}{\text{m}}
+\newunit{dam}{\text{dam}}
+\newunit{hm}{\text{hm}}
+\newunit{km}{\text{km}}
+\newunit{Mm}{\text{Mm}}
+\newunit{Gm}{\text{Gm}}
+\newunit{Tm}{\text{Tm}}
+\newunit{Pm}{\text{Pm}}
+\newunit{Em}{\text{Em}}
+\newunit{Zm}{\text{Zm}}
+\newunit{Ym}{\text{Ym}}
+%    \end{macrocode}
+% Unités de surface.
+%    \begin{macrocode}
+\newunit{mmq}{\text{mm}^2}
+\newunit{cmq}{\text{cm}^2}
+\newunit{dmq}{\text{dm}^2}
+\newunit{mq}{\text{m}^2}
+\newunit{damq}{\text{dam}^2}
+\newunit{hmq}{\text{hm}^2}
+\newunit{kmq}{\text{km}^2}
+\newunit{ha}{\text{ha}}
+%    \end{macrocode}
+% Unités de volume.
+%    \begin{macrocode}
+\newunit{mmc}{\text{mm}^3}
+\newunit{cmc}{\text{cm}^3}
+\newunit{dmc}{\text{dm}^3}
+\newunit{mc}{\text{m}^3}
+\newunit{damc}{\text{dam}^3}
+\newunit{hmc}{\text{hm}^3}
+\newunit{kmc}{\text{km}^3}
+%    \end{macrocode}
+% Unités de volume en litre.
+%    \begin{macrocode}
+\newunit{hl}{\text{hl}}
+\newunit{dal}{\text{dal}}
+\newunit{l}{\text{l}}
+\newunit{dl}{\text{dl}}
+\newunit{cl}{\text{cl}}
+\newunit{ml}{\text{ml}}
+%    \end{macrocode}
+% Unité de volume en litre (avec un joli \og l \fg{})
+%    \begin{macrocode}
+\newunit{hel}{\text{h$\ell$}}
+\newunit{dael}{\text{da$\ell$}}
+\newunit{el}{\text{$\ell$}}
+\newunit{del}{\text{d$\ell$}}
+\newunit{cel}{\text{c$\ell$}}
+\newunit{mel}{\text{m$\ell$}}
+%    \end{macrocode}
+% Unité de temps
+%    \begin{macrocode}
+\newunit{s}{\text{s}}
+\newunit{min}{\text{min}}
+\newunit{h}{\text{h}}
+\newunit{ms}{\text{m$\cdot$s}^{-1}}
+\newunit{mh}{\text{m$\cdot$h}^{-1}}
+\newunit{kms}{\text{km$\cdot$s}^{-1}}
+\newunit{kmmin}{\text{km$\cdot$min}^{-1}}
+\newunit{kmh}{\text{km$\cdot$h}^{-1}}
+%    \end{macrocode}
+% Unité de débit
+%    \begin{macrocode}
+\newunit{ls}{\text{$\ell\cdot$s}^{-1}}
+%    \end{macrocode}
+% Unités de masses
+%    \begin{macrocode}
+\newunit{mg}{\text{mg}}
+\newunit{cg}{\text{cg}}
+\newunit{dg}{\text{dg}}
+\newunit{g}{\text{g}}
+\newunit{dag}{\text{dag}}
+\newunit{hg}{\text{hg}}
+\newunit{kg}{\text{kg}}
+\newunit{T}{\text{T}}
+%    \end{macrocode}
+% Autres unité
+%    \begin{macrocode}
+\newunit{pc}{\%}
+\newunit{deg}{\text{\degre}}
+\newunit{degc}{\text{\degre C}}
+\newunit{euro}{\text{\euro}}
+%    \end{macrocode}
+% \begin{macro}{\algo}
+% Quelques cartouches de signalitique sont proposés. On commence avec
+% celle indiquant une activité ou un exercice traitant
+% d'algorithmique.
+%    \begin{macrocode}
+\newcommand*\algo{%
+  \psframebox[framesep=1pt,linewidth=\LogoLineWidth,
+              linecolor=AlgoLineColor, fillstyle=solid,
+              fillcolor=AlgoBkgColor, framearc=0.6]{%
+    \AlgoFont
+    \textcolor{AlgoTextColor}{\StringALGO}%
+  }
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\tice}
+% Le deuxième logo est celui dédié au TICE. Il se construit
+% exactement comme le logo Algo. Seul le texte (bien sûr) et les
+% couleurs changent.
+%    \begin{macrocode}
+\newcommand*\tice{%
+  \psframebox[framesep=1pt,linewidth=\LogoLineWidth,
+              linecolor=TiceLineColor, fillstyle=solid,
+              fillcolor=TiceBkgColor, framearc=0.6]{%
+    \TiceFont
+    \textcolor{TiceTextColor}{\StringTICE}%
+  }
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{environment}{oldalgorithme}
+% Dans une première version, l'environnement algorithme consistait
+% uniquement à afficher le contenu dans un cadre arrondi avec fond
+% coloré en respectant les saut de ligne et les espaces et avec une
+% numérotation des lignes.
+%
+% En fait, dans la deuxième version, toute la structure des
+% algorithmes est décrite en terme de macro. Tout l'arsenal de
+% traitement verbatim devient donc totalement inutile. On conserve
+% quand même l'ancien environnement sous le nom |oldalgorithme|.
+%
+% Le compteur |smc@line| va servir à numéroter les lignes.
+%    \begin{macrocode}
+\newcounter{smc@line}
+\newenvironment{oldalgorithme}{%
+%    \end{macrocode}
+% Les algorithmes sont affichés avec la fonte à chasse fixe. On remet
+% ensuite le compteur de ligne à zéro.
+%    \begin{macrocode}
+  \ttfamily
+  \c@smc@line \z@
+%    \end{macrocode}
+% Avant de rendre la fin de ligne active (et équivalente à |\par|)
+% avec la commande |\obeylines|, on redéfinit |\par|. Celle-ci doit
+% non seulement passer au paragraphe suivant mais aussi afficher le
+% numéro de ligne. On ne peut pas le faire de façion systématique
+% sinon, la ligne |\end{oldalgorithme}| provoquerait une ligne vide
+% numérotée dans le résultat. Pour cela, on regarde ce qui suit le
+% saut de ligne.
+%    \begin{macrocode}
+  \def\par{%
+    \@@par
+    \afterassignment\smc@displaynum\let\next=%
+  }%
+%    \end{macrocode}
+% Si ce qui suit le saut de ligne est |\end|, on réinjecte le |\end|
+% sans rien faire.
+%    \begin{macrocode}
+  \def\smc@displaynum{%
+    \ifx\next\end
+      \expandafter\end
+    \else
+%    \end{macrocode}
+% Sinon, on incrémente le compteur de ligne est on l'affiche dans sa
+% boîte.
+%    \begin{macrocode}
+      \global\advance\c@smc@line\@ne%
+      \leavevmode\hb@xt@\AlgorithmeNumWidth{\the\c@smc@line.\hss}%
+%    \end{macrocode}
+% L'unité lexicale lue doit être réinjectée après le numéro de ligne
+% et en faisant attention à terminer le développement de |\fi| au
+% préalable au cas où l'unité sera une macro à paramètre (par
+% exemple).
+%    \begin{macrocode}
+      \expandafter\next
+    \fi%
+  }%
+%    \end{macrocode}
+% Les ponctuations doubles ne doivent pas gérer seules les
+% espacements.
+%    \begin{macrocode}
+  \shorthandoff{;:!?}%
+%    \end{macrocode}
+% Tout est prêt pour activer les espaces (avec la commandes
+% \LaTeX{} |\@vobeyspaces| qui permet de garder les espaces de début
+% de ligne) et les sauts de ligne.
+%    \begin{macrocode}
+  \@vobeyspaces
+  \obeylines
+%    \end{macrocode}
+% Le reste de l'environnement consiste à placer le corps de
+% l'environnement dans une boîte dont la largeur doit prévoir les
+% marges et les filets.
+%    \begin{macrocode}
+  \begin{lrbox}{\smc@boxa}%
+  \minipage{\dimexpr\linewidth-\AlgorithmeRuleWidth*2-\AlgorithmeSep*2}%
+}
+{%
+%    \end{macrocode}
+% En fin d'environnement, on ferme la minipage et la boîte.
+%    \begin{macrocode}
+  \endminipage
+  \end{lrbox}%
+%    \end{macrocode}
+% On passe au paragraphe suivant (avec la primitive |\@@par|).
+%    \begin{macrocode}
+  \@@par\addvspace{\BeforeAlgorithmeVSpace}
+%    \end{macrocode}
+% On peut alors afficher le cadre et son contenu !
+%    \begin{macrocode}
+  \psframebox[linecolor=AlgorithmeRuleColor,
+              linewidth=\AlgorithmeRuleWidth,
+              fillstyle=solid,
+              fillcolor=AlgorithmeBkgColor,
+              framesep=\AlgorithmeSep,
+              cornersize=absolute,
+              linearc=\AlgorithmeSep]%
+             {\usebox{\smc@boxa}}%
+  \@@par\addvspace{\AfterAlgorithmeVSpace}
+}
+%    \end{macrocode}
+% \end{environment}
+% \begin{environment}{algorithme}
+% Le nouvel environnement |algorithme| dispose d'une batterie de
+% macros permettant de spécifier le code.
+%
+% Chaque commande commence une nouvelle ligne et place l'espace de
+% retrait constamment tenu à jour dans le compteur |\smc@indent|. Pour
+% gérer ce retrait de la façon la plus lisible possible, deux macros
+% sont définies pour l'augmenter et le diminuer. 
+%    \begin{macrocode}
+\newcount\smc@indent
+\newcommand*\smc@inc@indent{%
+  \advance\smc@indent\@ne
+}
+\newcommand*\smc@dec@indent{%
+  \ifnum\smc@indent>\z@
+    \advance\smc@indent\m@ne
+  \fi
+}
+\newcommand*\smc@write@indent{%
+  \par
+  \refstepcounter{smc@line}%
+  \dimen0 \dimexpr\AlgoIndent*\smc@indent
+  \leavevmode\hb@xt@\AlgorithmeNumWidth{\texttt{\the\c@smc@line.}\hss}%
+  \hspace*{\dimen0}%
+}
+\newcommand*\BlocVariables{%
+  \smc@dec@indent
+  \smc@write@indent
+  \textit{Liste des variables utilis\'ees}%
+  \smc@inc@indent
+}
+\newcommand*\BlocEntrees{%
+  \smc@dec@indent
+  \smc@write@indent
+  \textit{Entr\'ees}%
+  \smc@inc@indent
+}
+\newcommand*\BlocTraitements{%
+  \smc@dec@indent
+  \smc@write@indent
+  \textit{Traitements}
+  \smc@inc@indent
+}
+\newcommand*\BlocAffichage{%
+  \smc@dec@indent
+  \smc@write@indent
+  \textit{Affichage}
+  \smc@inc@indent
+}
+\newcommand\BlocTraitementsEtAffichage{%
+  \smc@dec@indent
+  \smc@write@indent
+  \textit{Traitements et affichage}
+  \smc@inc@indent
+}
+\newcommand*\DeclareVar[3]{%
+  \smc@write@indent
+  \texttt{#1 \string: }%
+  \textit{#2}\hfill
+  \textcolor{CouleurAlgoCommentaire}{#3}%
+}
+\newcommand*\TantQue[2]{%
+  \smc@write@indent
+  \texttt{\textcolor{CouleurAlgoTantque}{\bfseries Tant que} (\texttt{#1})}
+  \texttt{\bfseries faire}
+  \smc@inc@indent
+  #2
+  \smc@dec@indent
+  \smc@write@indent
+  \texttt{\textcolor{CouleurAlgoTantque}{\bfseries Fin Tant que}}%
+}
+\newcommand*\Pour[4]{%
+  \smc@write@indent
+  \texttt{\textcolor{CouleurAlgoPour}{\bfseries Pour}}
+  \texttt{#1}
+  \textcolor{CouleurAlgoPour}{\bfseries variant de}
+  \texttt{#2}
+  \textcolor{CouleurAlgoPour}{\bfseries \`a}
+  \texttt{#3}
+  \texttt{\bfseries faire}
+  \smc@inc@indent
+  #4
+  \smc@dec@indent
+  \smc@write@indent
+  \texttt{\textcolor{CouleurAlgoTantque}{\bfseries Fin Pour}}%
+}
+\newcommand*\PourAvecPas[5]{%
+  \smc@write@indent
+  \texttt{\textcolor{CouleurAlgoPour}{\bfseries Pour}}
+  \texttt{#1}
+  \textcolor{CouleurAlgoPour}{\bfseries variant de}
+  \texttt{#2}
+  \textcolor{CouleurAlgoPour}{\bfseries \`a}
+  \texttt{#3}
+  \textcolor{CouleurAlgoPour}{\bfseries avec un pas de}
+  \texttt{#4}
+  \texttt{faire}
+  \smc@inc@indent
+  #5
+  \smc@dec@indent
+  \smc@write@indent
+  \texttt{\textcolor{CouleurAlgoTantque}{\bfseries Fin Pour}}%
+}
+\newcommand*\SiAlors[2]{%
+  \smc@write@indent
+  \texttt{\textcolor{CouleurAlgoSi}{\bfseries Si}}
+  {#1}
+  \texttt{\textcolor{CouleurAlgoSi}{\bfseries  Alors}}
+  \smc@inc@indent
+  #2
+  \smc@dec@indent
+  \smc@write@indent
+  \texttt{\textcolor{CouleurAlgoSi}{\bfseries Fin Si}}%
+}
+\newcommand*\SiAlorsSinon[3]{%
+  \smc@write@indent
+  \texttt{\textcolor{CouleurAlgoSi}{\bfseries Si}}
+  {#1}
+  \texttt{\textcolor{CouleurAlgoSi}{\bfseries Alors}}
+  \smc@inc@indent
+  #2
+  \smc@dec@indent
+  \smc@write@indent
+  \texttt{\textcolor{CouleurAlgoSi}{\bfseries Sinon}}
+  \smc@inc@indent
+  #3
+  \smc@dec@indent
+  \smc@write@indent
+  \texttt{\textcolor{CouleurAlgoSi}{\bfseries Fin Si}}%
+}
+\newcommand*\AfficherVar[1]{%
+  \smc@write@indent
+  \textcolor{CouleurAlgoAffiche}{Afficher la valeur de}
+  \texttt{#1}%
+}
+\newcommand*\Afficher[1]{%
+  \smc@write@indent
+  \textcolor{CouleurAlgoAffiche}{Afficher}
+  #1%
+}
+\newcommand*\Calculer[1]{%
+  \smc@write@indent
+  \textcolor{CouleurAlgoCalcule}{Calculer}
+  #1%
+}
+\newcommand*\Demander[1]{%
+  \smc@write@indent
+  \textcolor{CouleurAlgoDemander}{Demander}
+  \texttt{#1}%
+}
+\newcommand*\Saisir[1]{%
+  \smc@write@indent
+  \textcolor{CouleurAlgoSaisir}{Saisir}
+  \texttt{#1}%
+}
+\newcommand*\Stocker[1]{%
+  \smc@write@indent
+  \textcolor{CouleurAlgoStocker}{Stocker} la r\'eponse dans
+  \texttt{#1}%
+}
+\newcommand*\DonnerValeur[2]{%
+  \smc@write@indent
+  \textcolor{CouleurAlgoDonnerValeur}{Donner} \`a \texttt{#1}
+  la valeur de \texttt{#2}%
+}
+\newcommand*\TitreAlgo[1]{%
+  \smc@write@indent
+  \textit{Algorithme \string: }#1
+}
+\newcommand*\FinAlgo{%
+  \smc@dec@indent
+  \smc@write@indent
+  \textit{Fin de l'algorithme}%
+} 
+%    \end{macrocode}
+% L'environnement proprement dit ne fait pas grand chose : il place
+% son contenu dans une minipage de la bonne largeur et compose alors
+% ce contenu dans un cadre à fond coloré (et arrondi).
+%    \begin{macrocode}
+\newenvironment{algorithme}{%
+%    \end{macrocode}
+% On commence par initialiser le compteur de ligne et on inhibe les
+% ponctuations doubles actices.
+%    \begin{macrocode}
+  \c@smc@line\z@
+  \shorthandoff{;:!?}%
+%    \end{macrocode}
+% On mémorise alors le contenu dans une boîte contenant la minipage à
+% la bonne largeur.
+%    \begin{macrocode}
+  \begin{lrbox}{\smc@boxa}%
+  \minipage{\dimexpr\linewidth-\AlgorithmeRuleWidth*2-\AlgorithmeSep*2}%
+}
+{%
+%    \end{macrocode}
+% En fin d'environnement, on ferme la minipage et la boîte.
+%    \begin{macrocode}
+  \endminipage
+  \end{lrbox}%
+%    \end{macrocode}
+% On passe au paragraphe suivant.
+%    \begin{macrocode}
+  \par\addvspace{\BeforeAlgorithmeVSpace}
+%    \end{macrocode}
+% On peut alors afficher le cadre et son contenu !
+%    \begin{macrocode}
+  \psframebox[linecolor=AlgorithmeRuleColor,
+              linewidth=\AlgorithmeRuleWidth,
+              fillstyle=solid,
+              fillcolor=AlgorithmeBkgColor,
+              framesep=\AlgorithmeSep,
+              cornersize=absolute,
+              linearc=\AlgorithmeSep]%
+             {\usebox{\smc@boxa}}%
+  \par\addvspace{\AfterAlgorithmeVSpace}
+}
+%    \end{macrocode}
+% \end{environment}
+% \begin{macro}{\Strut}
+% Pour pouvoir régler finement et individuellement l'interlignage, on
+% va définir une macro |\Strut| qui sera comme |\strut| mais avec un
+% paramètre optionnel indiquant un facteur
+% d'agrandissement-réduction. Par défaut, le facteur vaut 1 et la
+% macro se comportera comme le |\strut| de \LaTeX{}.
+%    \begin{macrocode}
+\newcommand*\Strut[1][1]{%
+  \leavevmode
+  \vrule \@height #1\ht\strutbox
+         \@depth #1\dp\strutbox
+         \@width\z@
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\TopStrut}
+% La commande |\TopStrut| se comporte comme |\Strut| mais elle ne
+% concerne que la hauteur.
+%    \begin{macrocode}
+\newcommand*\TopStrut[1][1]{%
+  \leavevmode
+  \vrule \@height #1\ht\strutbox
+         \@depth \z@
+         \@width \z@
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\BotStrut}
+% La commande |\BotStrut| se comporte comme |\Strut| mais elle ne
+% concerne que la profondeur.
+%    \begin{macrocode}
+\newcommand*\BotStrut[1][1]{%
+  \leavevmode
+  \vrule \@height \z@
+         \@depth #1\dp\strutbox
+         \@width \z@
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\RefExercice}
+% Fait référence à un exercice en plaçant le numéro dans un cadre. Les
+% couleurs sont les mêmes que pour les numéros d'exercice réels.
+%    \begin{macrocode}
+\newcommand*\RefExercice{%
+%    \end{macrocode}
+% La couleur du cadre va dépendre du fait que l'exercice ait ou non une
+% correction. On se sert d'une version étoilée de cette macro pour
+% gérer cela.
+%    \begin{macrocode}
+  \@ifstar{\smc@sRefExercice}{\smc@nsRefExercice}%
+}
+\newcommand*\smc@sRefExercice[1]{%
+  \psframebox*[linewidth=0pt, fillcolor=ExerciceCorrigeNumFrameColor,
+               framesep=2pt]{\textcolor{ExerciceNumColor}{\bfseries \ref{#1}}}%
+}
+\newcommand*\smc@nsRefExercice[1]{%
+  \psframebox*[linewidth=0pt, fillcolor=ExerciceNumFrameColor, framesep=2pt]
+              {\textcolor{ExerciceNumColor}{\bfseries \ref{#1}}}%
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\MethodeRefExercice}
+% Cette macro permet d'indiquer une référence à un exercice dans le
+% titre d'une méthode. Comme pour la macro précédente, il faut étoiler
+% la macro pour faire réference à un exercice corrigé.
+%    \begin{macrocode}
+\newcommand*\MethodeRefExercice{%
+  \@ifstar{\smc@sMethodeRefExercice}{\smc@nsMethodeRefExercice}%
+}
+\newcommand\smc@sMethodeRefExercice[1]{%
+%    \end{macrocode}
+% Tout est composé en taille normale et couleur normale. On passe donc
+% dans un groupe.
+%    \begin{macrocode}
+  \begingroup
+  \normalcolor
+  \normalfont
+  \MethodeRefExerciceFont
+%    \end{macrocode}
+% On trouve d'abord un espace |\quad| puis un triangle de la même
+% couleur que le cadre du numéro.
+%    \begin{macrocode}
+  \hfill
+  \begin{pspicture}(0,0)(0.8em,1.2ex)
+    \pspolygon*[linewidth=0pt, linecolor=MethodeTitleFrameColor]
+               (0,0)(0,1.2ex)(0.8em,0.6ex)
+  \end{pspicture}~%
+%    \end{macrocode}
+% On compose alors le texte Ex. <ref> p. <pageref>
+%    \begin{macrocode}
+  Ex.~\RefExercice*{#1}~p.~\pageref{#1}%
+  \endgroup
+}
+%    \end{macrocode}
+% La version non étoilée fait exactement la même chose à part la
+% couleur du cadre donc l'appel à |\RefExercice| sans étoile.
+%    \begin{macrocode}
+\newcommand\smc@nsMethodeRefExercice[1]{%
+  \begingroup
+  \normalcolor
+  \normalfont
+  \MethodeRefExerciceFont
+  \hfill
+  \begin{pspicture}(0,0)(0.8em,1.2ex)
+    \pspolygon*[linewidth=0pt, linecolor=MethodeTitleFrameColor]
+               (0,0)(0,1.2ex)(0.8em,0.6ex)
+  \end{pspicture}~%
+  Ex.~\RefExercice{#1}~p.~\pageref{#1}%
+  \endgroup
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\RefMethode}
+% Façon de faire référence à une méthode. Le numéro est composé avec
+% la couleur normalement utilisée pour les cadres de méthodes.
+%    \begin{macrocode}
+\newcommand*\RefMethode[1]{%
+  \textcolor{MethodeTitleFrameColor}{\bfseries \ref{#1}}%
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\ExerciceRefMethode}
+% Façon de faire référence à une méthode dans le titre d'un exercice.
+%    \begin{macrocode}
+\newcommand*\ExerciceRefMethode[1]{%
+  \begingroup
+  \quad
+  \begin{pspicture}(0,0)(0.8em,1.2ex)
+    \pspolygon*[linewidth=0pt, linecolor=MethodeTitleFrameColor]
+               (0,0)(0,1.2ex)(0.8em,0.6ex)
+  \end{pspicture}~%
+  \psframebox*[fillcolor=ExerciceRefMethodeColor]
+              {%
+                \textcolor{Blanc}{%
+                  {%
+                    \ExerciceRefMethodeFont
+                    \StringMETHODE~\ref{#1}%
+                  }%
+                }%
+              }%
+  \textcolor{Noir}{%
+    {%
+      \normalfont
+      \ExercicePageRefMethodeFont
+      ~p.~\pageref{#1}%
+    }%
+  }%
+  \endgroup
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\RefItem}
+% Façon de faire référence à un numéro de liste.
+%    \begin{macrocode}
+\newcommand*\RefItem[1]{%
+  \textcolor{\smc@curr@itemcolor}{\smc@curr@itemcmd\ref{#1}}%
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\RefQCM}
+% Façon de faire référence à un exercice de QCM. On reprend en fait un
+% code similaire à celui permettant de composer le numéro des
+% exercices de type QCM mais avec une autre taille de caractères.
+%    \begin{macrocode}
+\newcommand*\RefQCM[1]{%
+  \begingroup
+    \fboxsep \QCMRefHSep
+    \colorbox{QCMFrameColor}{\textcolor{QCMTextFrameColor}{\ref{#1}}}%
+  \endgroup
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\RefPartie}
+% Façon de faire référence à un numéro de partie.
+%    \begin{macrocode}
+\newcommand*\RefPartie[1]{%
+  \psframebox*[fillcolor=smc@curr@partiebkgcolor]
+    {\textcolor{smc@curr@partiecolor}{\smc@curr@partiefont \ref{#1}}}%
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{sudoku}
+% La classe prévoit la possibilité de construire des grilles de sudoku
+% de façon agréable pour l'utilisateur. La syntaxe est la suivante :
+% \begin{verbatim}
+% \sudoku[taille]{%
+% .........
+% .*.*.*.*.
+% 3..1..2..
+% etc.
+% }
+% \end{verbatim}
+% où \key{taille} indique la taille des cases de la grille (5mm par
+% défaut) et où l'argument de |\sudoku| indique soit une case vide
+% blanche (.) soit une case vide colorée (*) soit un caractère devant
+% figurer dans la case (avec des accolades en cas de caractère
+% complexe).
+%
+% En fait, la largeur par défaut est sous le contrôle de la macro
+% |\SudokuWidth|.
+%    \begin{macrocode}
+\newcommand*\SudokuWidth{5mm}
+\newcommand\sudoku[2][\SudokuWidth]{%
+  \begingroup
+%    \end{macrocode}
+% Avant même de faire le |\begin{pspicture}|, on fixe l'unité qui sera
+% la largeur des cases de la grille. C'est pour cela que tout se
+% déroule à l'intérieur d'un groupe.
+%    \begin{macrocode}
+    \psset{unit=#1, dimen=middle, linewidth=0.3pt, linecolor=FiletTableauColor}
+%    \end{macrocode}
+% L'environnement \environ{pspicture} prévoit 10 cases au lieu de 9
+% pour pouvoir placer les légendes des lignes et colonnes.
+%    \begin{macrocode}
+    \begin{pspicture}(0,0)(10,10)
+%    \end{macrocode}
+% Légende des lignes et colonnes. |96+\n| affiche a\ldots j et |74-\n|
+% affiche J\ldots A.
+%    \begin{macrocode}
+      \multido{\n=1+1}{9}{%
+        \rput[B](\n.5,9.25){\symbol{\numexpr 96+\n}}
+        \rput[B](0.5,\dimexpr\n\psyunit-0.75\psyunit){\symbol{\numexpr 74-\n}}
+      }
+%    \end{macrocode}
+% Avant de lire l'argument de la macro, c'est-à-dire le contenu des
+% cases, on initialise les compteurs de ligne et de colonne. On va
+% lire les lignes de haut en bas donc de 8 à 0 du point de vue de
+% \environ{pspicture}.
+%    \begin{macrocode}
+      \def\x{1}\def\y{8}%
+%    \end{macrocode}
+% La macro de lecture de l'argument (et de l'affichage du contenu des
+% cases) est une macro récursive. On initialise la macro |\smc@next|
+% avec le nom de cette macro pour préparer les appels récursifs.
+%    \begin{macrocode}
+      \let\smc@next\smc@parsesudoku
+%    \end{macrocode}
+% Appel de la macro récursive de lecture. Pour gérer tous les cas
+% (plus de 81 indications, moins de 81 indications) on dispose d'une
+% double balise de limitation d'argument.
+%    \begin{macrocode}
+      \smc@next#2\@nil\@@nil
+%    \end{macrocode}
+% Une fois que les cases sont remplies, on affiche les traits gras des
+% triples cases à l'intérieur de la grille générale de sudoku. Pour
+% que les jonctions des coins soient propres, on doit faire déborder
+% certaines lignes de la moitié de l'épaisseur des lignes.
+%    \begin{macrocode}
+      \psset{linewidth=1.2pt}
+      \multido{\n=0+3,\nn=1+3}{4}{%
+        \psline(1,\n)(10,\n)
+        \psline(\nn,-0.5\pslinewidth)(\nn,\dimexpr 9\psyunit+0.5\pslinewidth)
+      }
+    \end{pspicture}%
+  \endgroup
+}
+%    \end{macrocode}
+% La macro qui suit est celle qui va lire l'argument de |\sudoku| de
+% façon récursive et remplir la case correspondante selon le caractère
+% rencontré.
+%    \begin{macrocode}
+\def\smc@parsesudoku#1{%
+%    \end{macrocode}
+% On place le caractère (ou le groupe) lu dans une macro pour tester
+% s'il s'agit de la balise |\@nil|.
+%    \begin{macrocode}
+  \def\smc@arg{#1}%
+  \ifx\smc@arg\@nnil
+%    \end{macrocode}
+% Si la balise est atteinte, on passe au traitement final.
+%    \begin{macrocode}
+    \let\smc@next\smc@endsudoku
+  \else
+%    \end{macrocode}
+% Sinon, on place le résultat en |(\x,\y)|.
+%    \begin{macrocode}
+    \rput(\x,\y){%
+      \if#1.%
+%    \end{macrocode}
+% Le point donne une case vide à fond blanc.
+%    \begin{macrocode}
+        \psframe(0,0)(1,1)
+      \else\if#1*%
+%    \end{macrocode}
+% L'étoile donne une case vide à fond coloré.
+%    \begin{macrocode}
+        \psframe[fillstyle=solid, fillcolor=FondSudokuColor](0,0)(1,1)
+      \else
+%    \end{macrocode}
+% Tout autre contenu affiche le contenu centré dans la case.
+%    \begin{macrocode}
+        \psframe(0,0)(1,1)
+        \rput[B](0.5,0.3\psyunit){#1}
+      \fi\fi
+    }
+  \fi
+%    \end{macrocode}
+% On passe à la case suivante.
+%    \begin{macrocode}
+  \edef\x{\the\numexpr\x+1}%
+  \ifnum\x=10
+%    \end{macrocode}
+% Si la rangée est pleine, on revient au début de la rangée suivante.
+%    \begin{macrocode}
+    \def\x{1}%
+    \edef\y{\the\numexpr\y-1}%
+    \ifnum\y=-1
+%    \end{macrocode}
+% Si toutes les rangées ont été traitées, on termine le traitement.
+%    \begin{macrocode}
+      \let\smc@next\smc@endsudoku
+    \fi
+  \fi
+  \smc@next
+}
+%    \end{macrocode}
+% En fin de lecture récursive, il faut se débarasser des balises de
+% délimitation de l'argument. La double balise permet de gérer tous
+% les cas (plus de 81 indications, exactement 81 indications, moins de
+% 81 indications).
+%    \begin{macrocode}
+\def\smc@endsudoku#1\@@nil{%
+%    \end{macrocode}
+% On regarde s'il y a eu moins de 81 indications. Et si oui, on lance
+% la macro récursive de remplissage.
+%    \begin{macrocode}
+  \ifnum\y>-1
+    \let\smc@next\smc@@endsudoku
+    \smc@next
+  \fi
+}
+%    \end{macrocode}
+% La dernière macro va s'appeler récursivement pour remplir la fin de
+% la grille avec des cases vides.
+%    \begin{macrocode}
+\def\smc@@endsudoku{%
+  \rput(\x,\y){\psframe(0,0)(1,1)}
+  \edef\x{\the\numexpr\x+1}%
+  \ifnum\x=10
+%    \end{macrocode}
+% Si la rangée est pleine, on revient au début de la rangée suivante.
+%    \begin{macrocode}
+    \def\x{1}%
+    \edef\y{\the\numexpr\y-1}%
+    \ifnum\y=-1
+%    \end{macrocode}
+% Si toutes les rangées ont été traitées, on termine le traitement.
+%    \begin{macrocode}
+      \let\smc@next\relax
+    \fi
+  \fi
+  \smc@next
+}
+%    \end{macrocode}
+% \end{macro}
+% \section{En-têtes et pieds de page}
+% \begin{macro}{\smc@nobsbs}
+% Il est parfois nécessaire que la séquence de contrôle |\\| perde son
+% rôle de saut de ligne pour prendre celui d'une espace. On prendra
+% garde au fait que cette séquence de contrôle, qu'elle soit ou non
+% suivie d'un espace soit équivalente à une seule espace.
+%    \begin{macrocode}
+\newcommand\smc@nobsbs[1]{%
+  \begingroup
+    \def\\{\space\ignorespaces}%
+    \protected@edef\smc@tmp{#1}%
+    \smc@tmp
+  \endgroup
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\smc@headeven}
+% On gère ici toutes les en-têtes et pieds de page. On commence par
+% définir une macro qui servira systématiquement pour les
+% en-têtes. Ceux-ci sont constitués d'un cadre avec un titre et un
+% dégradé de carrés dans un coin. Il suffit de donner le nom de base
+% des couleurs qui seront utilisées (les noms seront construits selon
+% le procédé \texttt{<base><num>Color} où \texttt{<n>} est un nombre
+% entre 1 et 5 donnant les cinq couleurs différentes pour
+% l'en-tête et un numéro 0 pour la couleur du texte du titre. il
+% faudra également passer, en second argument, le titre.
+%
+% Les en-têtes de page paire et impaire ne sont pas construite de la
+% même façon. On commence par celles des pages paires.
+%    \begin{macrocode}
+\newcommand*\smc@headeven[2]{%
+%    \end{macrocode}
+% Sur les pages paires, le cadre est sur la gauche de l'en-tête en
+% pleine page : il faudra faire déborder à gauche (et en haut).
+%    \begin{macrocode}
+  \begin{pspicture}(0,0)(\HeadFrameWidth,0)
+    \psset{linewidth=0pt, linestyle=none, fillstyle=solid}
+    \psframe[fillcolor=#15Color]
+      (\dimexpr -\smc@marginleft-\smc@bleed,-\HeadFrameDepth)
+      (\HeadFrameWidth,\dimexpr \HeadFrameHeight+\smc@bleed)
+    \smc@diagonal(\HeadFrameWidth-\SquareWidth*3,-\HeadFrameDepth){#1}
+%    \end{macrocode}
+% Pour le titre, il faut d'abord vérifier qu'il loge dans la largeur à
+% disposition et, sinon, réaliser une contraction horizontale avant de
+% l'afficher. Pour cela on utilise la macro |\psscaleboxto| qui a
+% besoin de connaître les nouvelles hauteur totale et largeur. La
+% hauteur totale doit rester la même d'où le calcul
+% |\ht0+\dp0|. D'autre part, la commande PSTricks |\psscaleboxto| ne
+% semble pas fonctionner correctement ici. Enfin, pour que la commande
+% |\resizebox| de l'extension \package{graphicx} fonctionne comme il
+% faut, il faut que les commandes de changement de fontes soient
+% extérieures à l'argument terminal de |\resizebox|.
+%    \begin{macrocode}
+    \setbox0=\hbox{\textcolor{#10Color}{\HeadTitleFont #2}}%
+    \ifdim\wd0>\HeadTitleMaxWidth
+      \rput[Bl](0,0){%
+        {%
+          \HeadTitleFont\color{#10Color}%
+          \resizebox{\HeadTitleMaxWidth}{\dimexpr\ht0+\dp0}{#2}%
+        }%
+      }
+    \else
+      \rput[Bl](0,0){\unhbox0}
+    \fi
+  \end{pspicture}
+}
+%    \end{macrocode}  
+% \end{macro}
+% \begin{macro}{\smc@headodd}
+% La différence avec les en-têtes de pages paires est que le cadre est
+% à droite (donc déborde à droite et en haut) et que le texte est
+% cadré à droite.
+%    \begin{macrocode}
+\newcommand\smc@headodd[2]{%
+  \begin{pspicture}(0,0)(\HeadFrameWidth,0)
+    \psset{linewidth=0pt, linestyle=none, fillstyle=solid}
+    \psframe[fillcolor=#15Color]
+      (0,-\HeadFrameDepth)
+      (\dimexpr \HeadFrameWidth+\smc@marginright+\smc@bleed,
+       \dimexpr \HeadFrameHeight+\smc@bleed)
+    \smc@antidiagonal(0pt,-\HeadFrameDepth){#1}
+    \setbox0=\hbox{\textcolor{#10Color}{\HeadTitleFont #2}}%
+    \ifdim\wd0>\HeadTitleMaxWidth
+      \rput[Br](\HeadFrameWidth,0){%
+        {%
+          \HeadTitleFont\color{#10Color}%
+          \resizebox{\HeadTitleMaxWidth}{\dimexpr\ht0+\dp0}{#2}%
+        }%
+      }
+    \else
+      \rput[Br](\HeadFrameWidth,0){\unhbox0}
+    \fi
+  \end{pspicture}
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\smc@roundheadeven}
+% Certaines en-têtes ont un aspect arrondi. Il faudra des macros
+% dédiées pour les gérer. Voici celle pour les pages paires. Par
+% rapport à la macro précédente, il y a un argument de couleur
+% supplémentaire pour pouvoir faire l'arrondi du cadre avec la couleur
+% du fond.
+%    \begin{macrocode}
+\newcommand*\smc@roundheadeven[3]{%
+  \begin{pspicture}(0,0)(\RoundHeadFrameWidth,0)
+    \psset{linewidth=0pt, linestyle=none, fillstyle=solid}
+    \psframe[fillcolor=#15Color]
+      (\dimexpr -\smc@marginleft-\smc@bleed,-\HeadFrameDepth)
+      (\RoundHeadFrameWidth,\dimexpr \HeadFrameHeight+\smc@bleed)
+%    \end{macrocode}
+% En fait, l'arrondi sera fait par les disques.  Ici, on se contente
+% d'effacer un carré correspondant à un quart de disque
+%    \begin{macrocode}
+    \psframe[fillcolor=#2]
+      (\dimexpr \RoundHeadFrameWidth-\SquareWidth/2,
+       -\HeadFrameDepth)
+      (\RoundHeadFrameWidth,
+       \dimexpr -\HeadFrameDepth+\SquareWidth/2)
+    \smc@rounddiagonal(\RoundHeadFrameWidth-\SquareWidth*3,-\HeadFrameDepth){#1}
+    \setbox0=\hbox{\textcolor{#10Color}{\HeadTitleFont #3}}%
+    \ifdim\wd0>\RoundHeadTitleMaxWidth
+      \rput[Bl](0,0){%
+        {%
+          \HeadTitleFont\color{#10Color}%
+          \resizebox{\RoundHeadTitleMaxWidth}{\dimexpr\ht0+\dp0}{#3}%
+        }%
+      }
+    \else
+      \rput[Bl](0,0){\unhbox0}
+    \fi
+  \end{pspicture}
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\smc@roundheadodd}
+% Même chose que ci-dessus mais pour les pages impaires.
+%    \begin{macrocode}
+\newcommand\smc@roundheadodd[3]{%
+  \begin{pspicture}(0,0)(\RoundHeadFrameWidth,0)
+    \psset{linewidth=0pt, linestyle=none, fillstyle=solid}
+    \psframe[fillcolor=#15Color]
+      (0,-\HeadFrameDepth)
+      (\dimexpr \RoundHeadFrameWidth+\smc@marginright+\smc@bleed,
+       \dimexpr \HeadFrameHeight+\smc@bleed)
+    \psframe[fillcolor=#2]
+      (0, -\HeadFrameDepth)
+      (\dimexpr \SquareWidth/2, \dimexpr -\HeadFrameDepth+\SquareWidth/2)
+    \smc@roundantidiagonal(0pt,-\HeadFrameDepth){#1}
+    \setbox0=\hbox{\textcolor{#10Color}{\HeadTitleFont #3}}%
+    \ifdim\wd0>\RoundHeadTitleMaxWidth
+      \rput[Br](\RoundHeadFrameWidth,0){%
+        {%
+          \HeadTitleFont\color{#10Color}%
+          \resizebox{\RoundHeadTitleMaxWidth}{\dimexpr\ht0+\dp0}{#3}%
+        }%
+      }
+    \else
+      \rput[Br](\RoundHeadFrameWidth,0){\unhbox0}
+    \fi
+  \end{pspicture}%
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\smc@footpage}
+% Le pied de page est toujours constitué du numéro de page avec un
+% rectangle coloré au-dessous en pleine page. Comme il n'y a pas
+% nécessairement de titre accolé, on commence par définir cette partie
+% commune. Ici, il n'y a besoin que de la couleur de fond.
+%    \begin{macrocode}
+\newcommand*\smc@footpage[1]{%
+  \begin{pspicture}(0,0)(\FootFrameWidth,0)
+    \psset{linewidth=0pt, linestyle=none, fillstyle=solid}
+    \rput[B](.25,0){\FootPageFont \thepage}
+    \psframe[fillcolor=#1](0,-\FootFrameSep)
+            (\FootFrameWidth, \dimexpr \smc@footskip+\FootFrameSep
+                         -\smc@marginbottom-\smc@bleed)
+  \end{pspicture}%
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\smc@foottitleeven}
+% Les pieds de page de pages paires comportent généralement
+% l'abréviation du thème courant en capitale suivie du numéro de
+% chapitre et du titre de chapitre. Il faut tuer la macro |\\| pour ne
+% pas avoir de saut de ligne dans le pied de page.
+%    \begin{macrocode}
+\newcommand*\smc@foottitleeven{%
+  {%
+    \space
+    {%
+      \color{FootTitleHeadColor}%
+      \FootTitleHeadFont \@chapapp\space
+      \MakeUppercase{\smc@thema@init}\thechapter.
+    }\space
+    {%
+      \FootTitleChapterFont \smc@nobsbs{\smc@chaptertitle}%
+    }%
+  }%
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\smc@foottitleodd}
+% Les pieds de pages impaires sont généralement comme les pieds de
+% pages paires mais cadrés à droite. Il faut quitter le mode vertical
+% au début sinon on a un décalage vertical parasite.
+%    \begin{macrocode}
+\newcommand*\smc@foottitleodd{%
+  {%
+    \leavevmode
+    {%
+      \color{FootTitleHeadColor}%
+      \FootTitleHeadFont \@chapapp\space
+      \MakeUppercase{\smc@thema@init}\thechapter.
+    }\space
+    {%
+      \FootTitleChapterFont \smc@nobsbs{\smc@chaptertitle}%
+    }%
+  }%
+  \space
+}
+%    \end{macrocode} 
+% \end{macro}
+% \begin{macro}{\smc@bkgeven}
+% Les pages en fond colorés sont gérés directement par la classe et au
+% niveau des en-têtes. Cela permet de pouvoir avoir la main sur le
+% débordement de pleine page. Il faut distinguer les fonds de page
+% paire et de page impaire si les marges droite et gauche sont
+% différentes (ce n'est pas le cas ici mais autant prévoir).
+%
+% Il faut que ce soit le premier élément affiché dans une en-tête et
+% pour cela, il ne modifiera pas l'emplacement en cours du curseur. Il
+% faudra également l'afficher en tant qu'en-tête gauche de la page.
+%    \begin{macrocode}
+\newcommand*\smc@bkgeven[1]{%
+  \begin{pspicture}(0,0)(0,0)
+    \psset{linewidth=0pt, linestyle=none, fillstyle=solid}
+    \psframe[fillcolor=#1]
+            (\dimexpr -\smc@marginleft-\smc@bleed,
+             \dimexpr \smc@margintop-\smc@headsep+\smc@bleed)
+            (\dimexpr \linewidth+\smc@marginright+\smc@bleed,
+             \dimexpr -\smc@headsep-\textheight-\smc@marginbottom-\smc@bleed)
+  \end{pspicture}%
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\smc@bkgodd}
+% La seule chose qui change par rapport à la macro précédente est
+% l'inversion de la droite et de la gauche pour les marges.
+%    \begin{macrocode}
+\newcommand*\smc@bkgodd[1]{%
+  \begin{pspicture}(0,0)(0,0)
+    \psset{linewidth=0pt, linestyle=none, fillstyle=solid}
+    \psframe[fillcolor=#1]
+            (\dimexpr -\smc@marginright-\smc@bleed,
+             \dimexpr \smc@margintop-\smc@headsep+\smc@bleed)
+            (\dimexpr \linewidth+\smc@marginleft+\smc@bleed,
+             \dimexpr -\smc@headsep-\textheight-\smc@marginbottom-\smc@bleed)
+  \end{pspicture}%
+}
+%    \end{macrocode}
+% \end{macro}
+% Pour tous les styles, il n'y aura jamais de filets sur les en-têtes
+% et les pieds de page. On les supprime donc de façon globale.
+%    \begin{macrocode}
+\renewcommand{\headrulewidth}{0pt}
+\renewcommand{\footrulewidth}{0pt}
+%    \end{macrocode}
+% \begin{macro}{\ps@firstchapter}
+% Le style de première page de chapitre est très simple : rien pour
+% l'en-tête et numéro de page pour le pied de page. Bien qu'une
+% première page de chapitre ne puisse se situer sur une page paire, on
+% définit quand même ce style pour les deux parités.
+%    \begin{macrocode}
+\fancypagestyle{firstchapter}{%
+  \fancyhf{}
+  \fancyhead[LE]{}
+  \fancyhead[RO]{}
+  \fancyfoot[LE]{\smc@footpage{FirstChapterFootColor}}
+  \fancyfoot[RO]{\smc@footpage{FirstChapterFootColor}}
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\ps@activites}
+% Le style des pages d'activités d'approche suit le cadre général.
+%    \begin{macrocode}
+\fancypagestyle{activites}{%
+  \fancyhf{}
+  \fancyhead[LE]{\smc@headeven{ActiviteHeadFrame}{\StringActivitesApproche}}
+  \fancyhead[RO]{\smc@headodd{ActiviteHeadFrame}{\StringActivitesApproche}}
+  \fancyfoot[LE]{\smc@footpage{ActiviteFootColor}\smc@foottitleeven}
+  \fancyfoot[RO]{\smc@foottitleodd\smc@footpage{ActiviteFootColor}}
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\ps@cours}
+% Le style des pages de Cours et Méthodes suit le cadre général.
+%    \begin{macrocode}
+\fancypagestyle{cours}{%
+  \fancyhf{}
+  \fancyhead[LE]{\smc@headeven{CoursHeadFrame}{\StringCoursMethodes}}
+  \fancyhead[RO]{\smc@headodd{CoursHeadFrame}{\StringCoursMethodes}}
+  \fancyfoot[LE]{\smc@footpage{CoursFootColor}\smc@foottitleeven}
+  \fancyfoot[RO]{\smc@foottitleodd\smc@footpage{CoursFootColor}}
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\ps@exercicesbase}
+% Le style des pages de Exercices de base suit le cadre général.
+%    \begin{macrocode}
+\fancypagestyle{exercicesbase}{%
+  \fancyhf{}
+  \fancyhead[LE]{\smc@headeven{ExoBaseHeadFrame}{\StringExercicesBase}}
+  \fancyhead[RO]{\smc@headodd{ExoBaseHeadFrame}{\StringExercicesBase}}
+  \fancyfoot[LE]{\smc@footpage{ExoBaseFootColor}\smc@foottitleeven}
+  \fancyfoot[RO]{\smc@foottitleodd\smc@footpage{ExoBaseFootColor}}
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\ps@exercicesappr}
+% Le style des pages de Exercices de base suit le cadre général.
+%    \begin{macrocode}
+\fancypagestyle{exercicesappr}{%
+  \fancyhf{}
+  \fancyhead[LE]{\smc@headeven{ExoApprHeadFrame}{\StringExercicesAppr}}
+  \fancyhead[RO]{\smc@headodd{ExoApprHeadFrame}{\StringExercicesAppr}}
+  \fancyfoot[LE]{\smc@footpage{ExoApprFootColor}\smc@foottitleeven}
+  \fancyfoot[RO]{\smc@foottitleodd\smc@footpage{ExoApprFootColor}}
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\ps@connaissances}
+% Le style des pages de Je teste mes connaissances ne suit pas le
+% cadre général. Le fond de page en couleur sera géré par les
+% en-têtes. En fait, pour des raisons d'économie d'impression pour les
+% collègues, on ne fait plus de fond de page en couleur.
+%    \begin{macrocode}
+\fancypagestyle{connaissances}{%
+  \fancyhf{}
+  \fancyfoot[LE]{\smc@footpage{ConnFootColor}\smc@foottitleeven}
+  \fancyfoot[RO]{\smc@foottitleodd\smc@footpage{ConnFootColor}}
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\ps@firstconnaissances}
+% Le style de la première page de Je teste mes connaissances ne suit
+% pas le cadre général. L'en-tête est avec un cadre a coin arrondi et
+% des disques au lieu des carrés.
+%    \begin{macrocode}
+\fancypagestyle{firstconnaissances}{%
+  \fancyhf{}
+  \fancyhead[LE]{%
+    \smc@roundheadeven{ConnHeadFrame}{Blanc}
+                      {\StringTestConnaissances}%
+  }
+  \fancyhead[RO]{%
+    \smc@roundheadodd{ConnHeadFrame}{Blanc}
+                     {\StringTestConnaissances}%
+  }
+  \fancyfoot[LE]{\smc@footpage{ConnFootColor}\smc@foottitleeven}
+  \fancyfoot[RO]{\smc@foottitleodd\smc@footpage{ConnFootColor}}
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\ps@TP}
+% Le style des pages des travaux pratiques suit le cadre général.
+%    \begin{macrocode}
+\fancypagestyle{TP}{%
+  \fancyhf{}
+  \fancyhead[LE]{\smc@headeven{TPHeadFrame}{\StringTravauxPratiques}}
+  \fancyhead[RO]{\smc@headodd{TPHeadFrame}{\StringTravauxPratiques}}
+  \fancyfoot[LE]{\smc@footpage{TPFootColor}\smc@foottitleeven}
+  \fancyfoot[RO]{\smc@foottitleodd\smc@footpage{TPFootColor}}
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{ps@recreation}
+% Le style des pages récréation suit le cadre général.
+%    \begin{macrocode}
+\fancypagestyle{recreation}{%
+  \fancyhf{}
+  \fancyhead[LE]{\smc@headeven{RecreationHeadFrame}{\StringRecreation}}
+  \fancyhead[RO]{\smc@headodd{RecreationHeadFrame}{\StringRecreation}}
+  \fancyfoot[LE]{\smc@footpage{RecreationFootColor}\smc@foottitleeven}
+  \fancyfoot[RO]{\smc@foottitleodd\smc@footpage{RecreationFootColor}}
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\smc@firstheadevenannexe}
+% Les annexes partagent toutes le même type d'en-tête qui est en fait
+% des rectangles dans les marges. On définit ici la forme générale de
+% ces en-têtes. D'abord pour la première page si elle est
+% paire. L'argument est la couleur utilisée.
+%    \begin{macrocode}
+\newcommand*\smc@firstheadevenannexe[1]{%
+  \begin{pspicture}(0,0)(0,0)
+    \rput(-\smc@marginleft, \dimexpr \smc@margintop-\smc@headsep){%
+      \pspolygon[linestyle=none, linewidth=0pt,
+                 fillstyle=solid, fillcolor=#1]
+                (-\smc@bleed, \smc@bleed)
+                (-\smc@bleed, \dimexpr -\smc@paperheight-\smc@bleed)
+                (\CorrigeHeadFrameWidth, \dimexpr -\smc@paperheight-\smc@bleed)
+                (\CorrigeHeadFrameWidth, -\CorrigeHeadFrameWidth)
+                (\dimexpr \CorrigeHeadFrameWidth*2, -\CorrigeHeadFrameWidth)
+                (\dimexpr \CorrigeHeadFrameWidth*2, \smc@bleed)
+    }
+  \end{pspicture}%
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\smc@firstheadoddannexe}
+% Même chose que ci-dessus pour les premières pages impaires.
+%    \begin{macrocode}
+\newcommand*\smc@firstheadoddannexe[1]{%
+  \begin{pspicture}(0,0)(0,0)
+    \rput(\smc@marginright,\dimexpr \smc@margintop-\smc@headsep){%
+      \pspolygon[linestyle=none, linewidth=0pt, fillstyle=solid, fillcolor=#1]
+        (\smc@bleed, \smc@bleed)
+        (\smc@bleed, \dimexpr -\smc@paperheight-\smc@bleed)
+        (-\CorrigeHeadFrameWidth, \dimexpr -\smc@paperheight-\smc@bleed)
+        (-\CorrigeHeadFrameWidth, -\CorrigeHeadFrameWidth)
+        (\dimexpr -\CorrigeHeadFrameWidth*2, -\CorrigeHeadFrameWidth)
+        (\dimexpr -\CorrigeHeadFrameWidth*2, \smc@bleed)
+    }
+  \end{pspicture}%
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\smc@headevenannexe}
+% Rectangle pour les pages paires des annexes.
+%    \begin{macrocode}
+\newcommand*\smc@headevenannexe[1]{%
+  \begin{pspicture}(0,0)(0,0)
+    \rput(-\smc@marginleft, \dimexpr \smc@margintop-\smc@headsep){%
+      \pspolygon[linestyle=none, linewidth=0pt, fillstyle=solid, fillcolor=#1]
+        (-\smc@bleed, \smc@bleed)
+        (-\smc@bleed, \dimexpr -\smc@paperheight-\smc@bleed)
+        (\CorrigeHeadFrameWidth, \dimexpr -\smc@paperheight-\smc@bleed)
+        (\CorrigeHeadFrameWidth, \smc@bleed)
+    }
+  \end{pspicture}%
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\smc@headoddannexe}
+% Rectangle pour les pages paires des annexes.
+%    \begin{macrocode}
+\newcommand*\smc@headoddannexe[1]{%
+  \begin{pspicture}(0,0)(0,0)
+    \rput(\smc@marginright,\dimexpr \smc@margintop-\smc@headsep){%
+      \pspolygon[linestyle=none, linewidth=0pt,
+                 fillstyle=solid, fillcolor=#1]
+                (\smc@bleed,\smc@bleed)
+                (\smc@bleed, \dimexpr -\smc@paperheight-\smc@bleed)
+                (-\CorrigeHeadFrameWidth,
+                 \dimexpr -\smc@paperheight-\smc@bleed)
+                (-\CorrigeHeadFrameWidth, \smc@bleed)
+    }
+  \end{pspicture}%
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\ps@firstcorrige}
+% Le style pour les pages de corrigé n'a rien à voir avec les autres
+% styles. L'en-tête n'est constituée que d'une sorte de rectangle dans
+% la marge et le pied de page est beaucoup plus minimal celui des
+% autres styles.
+%    \begin{macrocode}
+\fancypagestyle{firstcorrige}{%
+  \fancyhf{}
+  \fancyhead[LE]{%
+    \smc@firstheadevenannexe{CorrigeHeadFrameColor}%
+  }
+  \fancyhead[RO]{%
+    \smc@firstheadoddannexe{CorrigeHeadFrameColor}%
+  }
+  \fancyfoot[LE]{%
+    {\FootAnnexePageFont \thepage}
+    {\FootAnnexeTxtFont \MakeUppercase{\StringCorriges}}%
+  }
+  \fancyfoot[RO]{%
+    {\FootAnnexeTxtFont \MakeUppercase{\StringCorriges}}
+    {\FootAnnexePageFont \thepage}%
+  }
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\ps@corrige}
+% Les pages suivantes des corrigés se font de la même façon sauf que
+% le rectangle de la marge n'a pas d'angle de retour en haut
+%    \begin{macrocode}
+\fancypagestyle{corrige}{%
+  \fancyhf{}
+  \fancyhead[LE]{%
+    \smc@headevenannexe{CorrigeHeadFrameColor}%
+  }
+  \fancyhead[RO]{%
+    \smc@headoddannexe{CorrigeHeadFrameColor}
+  }
+  \fancyfoot[LE]{%
+    {\FootAnnexePageFont \thepage}
+    {\FootAnnexeTxtFont \MakeUppercase{\StringCorriges}}%
+  }
+  \fancyfoot[RO]{%
+    {\FootAnnexeTxtFont \MakeUppercase{\StringCorriges}}
+    {\FootAnnexePageFont \thepage}%
+  }
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\ps@firstannexe}
+% Style des premières pages des annexes 
+%    \begin{macrocode}
+\fancypagestyle{firstannexe}{%
+  \fancyhf{}
+  \fancyhead[LE]{%
+    \smc@firstheadevenannexe{AnnexeHeadFrameColor}%
+  }
+  \fancyhead[RO]{%
+    \smc@firstheadoddannexe{AnnexeHeadFrameColor}%
+  }
+  \fancyfoot[LE]{%
+    {\FootAnnexePageFont \thepage}
+    {\FootAnnexeTxtFont \MakeUppercase{\smc@TitleAnnexe}}%
+  }
+  \fancyfoot[RO]{%
+    {\FootAnnexeTxtFont \MakeUppercase{\smc@TitleAnnexe}}
+    {\FootAnnexePageFont \thepage}%
+  }
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\ps@annexe}
+% Style des pages suivantes des annexes
+%    \begin{macrocode}
+\fancypagestyle{annexe}{%
+  \fancyhf{}
+  \fancyhead[LE]{%
+    \smc@headevenannexe{AnnexeHeadFrameColor}%
+  }
+  \fancyhead[RO]{%
+    \smc@headoddannexe{AnnexeHeadFrameColor}
+  }
+  \fancyfoot[LE]{%
+    {\FootAnnexePageFont \thepage}
+    {\FootAnnexeTxtFont \MakeUppercase{\smc@TitleAnnexe}}%
+  }
+  \fancyfoot[RO]{%
+    {\FootAnnexeTxtFont \MakeUppercase{\smc@TitleAnnexe}}
+    {\FootAnnexePageFont \thepage}%
+  }
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\ps@firstlexique}
+% Style des premières pages du lexique 
+%    \begin{macrocode}
+\fancypagestyle{firstlexique}{%
+  \fancyhf{}
+  \fancyhead[LE]{%
+    \smc@firstheadevenannexe{LexiqueHeadFrameColor}%
+  }
+  \fancyhead[RO]{%
+    \smc@firstheadoddannexe{LexiqueHeadFrameColor}%
+  }
+  \fancyfoot[LE]{%
+    {\FootAnnexePageFont \thepage}
+    {\FootAnnexeTxtFont \MakeUppercase{\StringLexique}}%
+  }
+  \fancyfoot[RO]{%
+    {\FootAnnexeTxtFont \MakeUppercase{\StringLexique}}
+    {\FootAnnexePageFont \thepage}%
+  }
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\ps@lexique}
+% Style des pages suivantes du lexique
+%    \begin{macrocode}
+\fancypagestyle{lexique}{%
+  \fancyhf{}
+  \fancyhead[LE]{%
+    \smc@headevenannexe{LexiqueHeadFrameColor}%
+  }
+  \fancyhead[RO]{%
+    \smc@headoddannexe{LexiqueHeadFrameColor}
+  }
+  \fancyfoot[LE]{%
+    {\FootAnnexePageFont \thepage}
+    {\FootAnnexeTxtFont \MakeUppercase{\StringLexique}}%
+  }
+  \fancyfoot[RO]{%
+    {\FootAnnexeTxtFont \MakeUppercase{\StringLexique}}
+    {\FootAnnexePageFont \thepage}%
+  }
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{ps@firstaffichemethode}
+%  Style des premières pages de la liste des méthodes.
+%    \begin{macrocode}
+\fancypagestyle{firstaffichemethode}{%
+  \fancyhf{}
+  \fancyhead[LE]{%
+    \smc@firstheadevenannexe{ListeMethodeHeadFrameColor}%
+  }
+  \fancyhead[RO]{%
+    \smc@firstheadoddannexe{ListeMethodeHeadFrameColor}%
+  }
+  \fancyfoot[LE]{%
+    {\FootAnnexePageFont \thepage}
+    {\FootAnnexeTxtFont \MakeUppercase{\StringListeMethode}}%
+  }
+  \fancyfoot[RO]{%
+    {\FootAnnexeTxtFont \MakeUppercase{\StringListeMethode}}
+    {\FootAnnexePageFont \thepage}%
+  }
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\ps@affichemethode}
+% Style des pages suivantes de la liste des méthodes
+%    \begin{macrocode}
+\fancypagestyle{affichemethode}{%
+  \fancyhf{}
+  \fancyhead[LE]{%
+    \smc@headevenannexe{ListeMethodeHeadFrameColor}%
+  }
+  \fancyhead[RO]{%
+    \smc@headoddannexe{ListeMethodeHeadFrameColor}
+  }
+  \fancyfoot[LE]{%
+    {\FootAnnexePageFont \thepage}
+    {\FootAnnexeTxtFont \MakeUppercase{\StringListeMethode}}%
+  }
+  \fancyfoot[RO]{%
+    {\FootAnnexeTxtFont \MakeUppercase{\StringListeMethode}}
+    {\FootAnnexePageFont \thepage}%
+  }
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\ps@firstlibre}
+% Style des premières pages des textes libres.
+%    \begin{macrocode}
+\fancypagestyle{firstlibre}{%
+  \fancyhf{}
+  \fancyfoot[LE]{%
+    {\ifsmc@page\FootLibrePageFont \thepage\fi}
+  }
+  \fancyfoot[RO]{%
+    {\ifsmc@page\FootLibrePageFont \thepage\fi}%
+  }
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\ps@libre}
+% Style des pages suivantes des textes libres.
+%    \begin{macrocode}
+\fancypagestyle{libre}{%
+  \fancyhf{}
+  \fancyfoot[LE]{%
+    {\ifsmc@page\FootLibrePageFont \thepage\fi}
+  }
+  \fancyfoot[RO]{%
+    {\ifsmc@page\FootLibrePageFont \thepage\fi}%
+  }
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\ps@empty}
+% Le style pour les pages vides n'est en fait pas totalement vide : il
+% reste le pied de page en cours. On détruit donc uniquement
+% l'en-tête.
+%    \begin{macrocode}
+\fancypagestyle{empty}{%
+  \fancyhead{}
+}
+%    \end{macrocode}
+% \end{macro}
+% \section{Couleurs}
+% Couleurs utilisées tout au long du document. On prend la
+% nomenclature du fichier tiré de la maquette Indesign (légèrement
+% révisée pour éviter les redondances).
+%    \begin{macrocode}
+\definecolor{A1}                {cmyk}{1.00, 0.00, 0.00, 0.50}
+\definecolor{A2}                {cmyk}{0.60, 0.00, 0.00, 0.10}
+\definecolor{A3}                {cmyk}{0.30, 0.00, 0.00, 0.05}
+\definecolor{A4}                {cmyk}{0.10, 0.00, 0.00, 0.00}
+\definecolor{B1}                {cmyk}{0.00, 1.00, 0.60, 0.40}
+\definecolor{B2}                {cmyk}{0.00, 0.85, 0.60, 0.15}
+\definecolor{B3}                {cmyk}{0.00, 0.20, 0.15, 0.05}
+\definecolor{B4}                {cmyk}{0.00, 0.05, 0.05, 0.00}
+\definecolor{C1}                {cmyk}{0.00, 1.00, 0.00, 0.50}
+\definecolor{C2}                {cmyk}{0.00, 0.60, 0.00, 0.20}
+\definecolor{C3}                {cmyk}{0.00, 0.30, 0.00, 0.05}
+\definecolor{C4}                {cmyk}{0.00, 0.10, 0.00, 0.05}
+\definecolor{D1}                {cmyk}{0.00, 0.00, 1.00, 0.50}
+\definecolor{D2}                {cmyk}{0.20, 0.20, 0.80, 0.00}
+\definecolor{D3}                {cmyk}{0.00, 0.00, 0.20, 0.10}
+\definecolor{D4}                {cmyk}{0.00, 0.00, 0.20, 0.05}
+\definecolor{F1}                {cmyk}{0.00, 0.80, 0.50, 0.00}
+\definecolor{F2}                {cmyk}{0.00, 0.40, 0.30, 0.00}
+\definecolor{F3}                {cmyk}{0.00, 0.15, 0.10, 0.00}
+\definecolor{F4}                {cmyk}{0.00, 0.07, 0.05, 0.00}
+\definecolor{G1}                {cmyk}{1.00, 0.00, 0.50, 0.00}
+\definecolor{G2}                {cmyk}{0.50, 0.00, 0.20, 0.00}
+\definecolor{G3}                {cmyk}{0.20, 0.00, 0.10, 0.00}
+\definecolor{G4}                {cmyk}{0.10, 0.00, 0.05, 0.00}
+\definecolor{H1}                {cmyk}{0.40, 0.00, 1.00, 0.10}
+\definecolor{H2}                {cmyk}{0.20, 0.00, 0.50, 0.05}
+\definecolor{H3}                {cmyk}{0.10, 0.00, 0.20, 0.00}
+\definecolor{H4}                {cmyk}{0.07, 0.00, 0.15, 0.00}
+\definecolor{J1}                {cmyk}{0.00, 0.50, 1.00, 0.00}
+\definecolor{J2}                {cmyk}{0.00, 0.20, 0.50, 0.00}
+\definecolor{J3}                {cmyk}{0.00, 0.10, 0.20, 0.00}
+\definecolor{J4}                {cmyk}{0.00, 0.07, 0.15, 0.00}
+\definecolor{FondOuv}           {cmyk}{0.00, 0.05, 0.10, 0.00}
+\definecolor{FondAutoEvaluation}{cmyk}{0.00, 0.03, 0.15, 0.00}
+\definecolor{FondTableaux}      {cmyk}{0.00, 0.00, 0.20, 0.00}
+\definecolor{FondAlgo}          {cmyk}{0.07, 0.00, 0.30, 0.00}
+\definecolor{BleuOuv}           {cmyk}{1.00, 0.00, 0.00, 0.00}
+\definecolor{PartieFonction}    {cmyk}{1.00, 0.00, 0.00, 0.00}
+\definecolor{PartieGeometrie}   {cmyk}{0.80, 0.80, 0.00, 0.00}
+%    \end{macrocode}
+% Les couleurs du bandeau de la partie statistique ont souvent bougé.
+%    \begin{macrocode}
+\definecolor{PartieStatistique} {cmyk}{0.60, 0.95, 0.00, 0.20}
+\definecolor{PartieStatistiqueOLD}{cmyk}{0.95, 0.60, 0.20, 0.00}
+\definecolor{PartieStatistique*}{cmyk}{0.30, 1.00, 0.00, 0.00}
+%    \end{macrocode}
+% Couleurs qui se sont ajoutées après la première version de la
+% maquette qui était accompagnée du nuancier.
+%    \begin{macrocode}
+\definecolor{U1}                {cmyk}{0.50, 0.10, 0.00, 0.10}
+\definecolor{U2}                {cmyk}{0.20, 0.15, 0.00, 0.00}
+\definecolor{U3}                {cmyk}{0.50, 0.00, 1.00, 0.00}
+\definecolor{U4}                {cmyk}{0.40, 0.00, 0.00, 0.00}
+%    \end{macrocode}
+% On ajoute le noir, le blanc et quelques gris.
+%    \begin{macrocode}
+\definecolor{Blanc}             {cmyk}{0.00, 0.00, 0.00, 0.00}
+\definecolor{Gris1}             {cmyk}{0.00, 0.00, 0.00, 0.20}
+\definecolor{Gris2}             {cmyk}{0.00, 0.00, 0.00, 0.40}
+\definecolor{Gris3}             {cmyk}{0.00, 0.00, 0.00, 0.50}
+\definecolor{Noir}              {cmyk}{0.00, 0.00, 0.00, 1.00}
+%    \end{macrocode}
+% Les couleurs effectives sont définies en termes des couleurs de
+% bases ci-dessous. On commence avec les éléments partagés dans tout
+% le document. En particulier, la première définition concerne la
+% couleur par défaut qui doit être un noir définie en CMYK pour que
+% overprint fonctionne correctement
+%    \begin{macrocode}
+\AtBeginDocument{\def\default@color{cmyk 0 0 0 1}\normalcolor}
+\colorlet{AlgoLineColor}{F3}
+\colorlet{AlgoBkgColor}{F1}
+\colorlet{AlgoTextColor}{Blanc}
+\colorlet{TiceLineColor}{A3}
+\colorlet{TiceBkgColor}{A1}
+\colorlet{TiceTextColor}{Blanc}
+\colorlet{CadreLineColor}{D3}
+\colorlet{CadreBkgColor}{Blanc}
+\colorlet{AlgorithmeRuleColor}{D2}
+\colorlet{AlgorithmeBkgColor}{FondAlgo}
+\colorlet{CouleurAlgoAffiche}{Noir}
+\colorlet{CouleurAlgoDemander}{Noir}
+\colorlet{CouleurAlgoSaisir}{Noir}
+\colorlet{CouleurAlgoStocker}{Noir}
+\colorlet{CouleurAlgoSi}{Noir}
+\colorlet{CouleurAlgoTantque}{Noir}
+\colorlet{CouleurAlgoPour}{Noir}
+\colorlet{CouleurAlgoCalcule}{Noir}
+\colorlet{CouleurAlgoInitialiser}{Noir}
+\colorlet{CouleurAlgoIncrementer}{Noir}
+\colorlet{CouleurAlgoCommentaire}{Noir}
+\colorlet{CouleurAlgoDonnerValeur}{Noir}
+\colorlet{CommentaireItemColor}{Noir}
+\colorlet{FiletTableauColor}{Gris3}
+\colorlet{FondSudokuColor}{FondTableaux}
+%    \end{macrocode}
+% Couleurs de la première page.
+%
+% Les couleurs pour les rectangles de pieds de pied de page sont
+% calculées à partir de la couleur du bandeau d'en-tête : on divise
+% toutes les composantes par deux.
+%    \begin{macrocode}
+\definecolor{FootFonctionColor}{cmyk}{0.50, 0.00, 0.00, 0.00}
+\definecolor{FootGeometrieColor}{cmyk}{0.40, 0.40, 0.00, 0.00}
+\definecolor{FootStatistiqueColor}{cmyk}{0.30, 0.48, 0.00, 0.10}
+\definecolor{FootStatistiqueOLDColor}{cmyk}{0.48, 0.30, 0.10, 0.00}
+\definecolor{FootStatistique*Color}{cmyk}{0.20, 0.00, 0.00, 0.00}
+\colorlet{ChapterBottomFrameColor}{J4}
+\colorlet{ThemaTopFrameColor}{J1}
+\colorlet{ThemaBottomFrameColor}{J2}
+\colorlet{ThemaTitleColor}{Blanc}
+\colorlet{ChapterNumBkgColor}{H2}
+\colorlet{ChapterNumSquare0Color}{Blanc}
+\colorlet{ChapterNumSquare1Color}{H1}
+\colorlet{ChapterNumSquare2Color}{H2}
+\colorlet{ChapterNumSquare3Color}{H4}
+\colorlet{ChapterTitleColor}{B1}
+\colorlet{ChapAppColor}{Blanc}
+\colorlet{ChapterNumColor}{Blanc}
+\colorlet{PrerequisTitleColor}{B2}
+\colorlet{PrerequisBkgColor}{A4}
+\colorlet{PrerequisItemColor}{B2}
+\colorlet{AEItemColor}{B2}
+\colorlet{AETitleFrame0Color}{Blanc}
+\colorlet{AETitleFrame1Color}{B2}
+\colorlet{AETitleFrame2Color}{B3}
+\colorlet{AETitleFrame3Color}{A4}
+\colorlet{AETitleFrame4Color}{A3}
+\colorlet{AETitleFrame5Color}{A2}
+\colorlet{AETitleColor}{Blanc}
+\colorlet{AEExoNumColor}{Blanc}
+\colorlet{AEExoNumFrameColor}{J1}
+\colorlet{AEFrameColor}{FondAutoEvaluation}
+\colorlet{AECartoucheCorrBkgColor}{J2}
+\colorlet{AECartoucheCorrArrowColor}{G2}
+\colorlet{AECartoucheCorrVCPColor}{B2}
+%    \end{macrocode}
+% Couleurs pour la partie \og Activités d'approche \fg{} ainsi que la
+% couleur du numéro de chapitre dans les pieds de page.
+%    \begin{macrocode}
+\colorlet{ActiviteHeadFrame0Color}{Blanc}
+\colorlet{ActiviteHeadFrame1Color}{C1}
+\colorlet{ActiviteHeadFrame2Color}{C2}
+\colorlet{ActiviteHeadFrame3Color}{C3}
+\colorlet{ActiviteHeadFrame4Color}{D3}
+\colorlet{ActiviteHeadFrame5Color}{G1}
+\definecolor{ActiviteFootColor}{cmyk}{0.50, 0.00, 0.25, 0.00}
+\colorlet{FootChapterNumColor}{U1}
+\colorlet{ActiviteSubtitleColor}{H1}
+\colorlet{ActiviteNumColor}{Blanc}
+\colorlet{ActiviteDebatTopColor}{G4}
+\colorlet{ActiviteDebatBottomColor}{D4}
+\colorlet{ActiviteActiviteTopColor}{D3}
+\colorlet{ActiviteActiviteBottomColor}{G2}
+\colorlet{ActiviteTitleColor}{C1}
+\colorlet{ActiviteItemColor}{C1}
+\colorlet{ActivitePartieColor}{A2}
+%    \end{macrocode}
+% Couleurs pour la partie \og Cours - Méthodes \fg{}.
+%    \begin{macrocode}
+\colorlet{CoursHeadFrame0Color}{Blanc}
+\colorlet{CoursHeadFrame1Color}{J1}
+\colorlet{CoursHeadFrame2Color}{J2}
+\colorlet{CoursHeadFrame3Color}{J4}
+\colorlet{CoursHeadFrame4Color}{A3}
+\colorlet{CoursHeadFrame5Color}{A2}
+\definecolor{CoursFootColor}{cmyk}{0.15, 0.00, 0.00, 0.03}
+\colorlet{SectionFrame1Color}{J4}
+\colorlet{SectionFrame2Color}{J2}
+\colorlet{SectionFrame3Color}{J1}
+\colorlet{SectionNumColor}{A1}
+\colorlet{SectionTitleColor}{A1}
+\colorlet{SubsectionNumColor}{B2}
+\colorlet{SubsectionTitleColor}{J1}
+\colorlet{DefSquareColor}{B2}
+\colorlet{DefTitleColor}{A1}
+\colorlet{DefSubtitleColor}{B2}
+\colorlet{DefItemColor}{B2}
+\colorlet{DefFrameColor}{J3}
+\colorlet{RemTitleColor}{H1}
+\colorlet{RemItemColor}{H1}
+\colorlet{ExempleRuleColor}{J1}
+\colorlet{ExempleEdgeFrameColor}{J2}
+\colorlet{ExempleBkgFrameColor}{F4}
+\colorlet{ExempleTitleColor}{A1}
+\colorlet{ExempleItemColor}{J1}
+\colorlet{MethodeTitleFrameColor}{A2}
+\colorlet{MethodeTitleColor}{Blanc}
+\colorlet{MethodeSubtitleColor}{B2}
+\colorlet{MethodeIntroBkgFrameColor}{A4}
+\colorlet{ExAppEdgeFrameColor}{A2}
+\colorlet{ExAppBkgFrameColor}{H1}
+\colorlet{ExAppTitleColor}{Blanc}
+\colorlet{ExAppCorrEdgeFrameColor}{H1}
+\colorlet{ExAppCorrBkgFrameColor}{A2}
+\colorlet{ExAppCorrTitleColor}{Blanc}
+\colorlet{ExAppItemColor}{A2}
+\colorlet{MethodeRuleColor}{A3}
+\colorlet{ProofRuleColor}{B1}
+\colorlet{ProofTitleColor}{A1}
+\colorlet{ProofTopFrameColor}{B4}
+\colorlet{ProofBottomFrameColor}{B3}
+\colorlet{ProofTriangleFrameColor}{B1}
+\colorlet{ProofItemColor}{J2}
+%    \end{macrocode}
+% Couleurs pour la partie \og Exercices de base \fg{}.
+%    \begin{macrocode}
+\colorlet{ExoBaseHeadFrame0Color}{Blanc}
+\colorlet{ExoBaseHeadFrame1Color}{G1}
+\colorlet{ExoBaseHeadFrame2Color}{G2}
+\colorlet{ExoBaseHeadFrame3Color}{G4}
+\colorlet{ExoBaseHeadFrame4Color}{J2}
+\colorlet{ExoBaseHeadFrame5Color}{J1}
+\definecolor{ExoBaseFootColor}{cmyk}{0.00, 0.25, 0.50, 0.00}
+\colorlet{ExerciceColumnRuleColor}{J1}
+\colorlet{ExercicesTitleColor}{C1}
+\colorlet{ExercicesTitleVRuleColor}{G2}
+\colorlet{ExercicesTitleSquareColor}{J1}
+\colorlet{ExercicesTitleHRuleColor}{C3}
+\colorlet{ExerciceNumColor}{Blanc}
+\colorlet{ExerciceTitleColor}{F1}
+\colorlet{ExerciceNumFrameColor}{G1}
+\colorlet{ExerciceCorrigeNumFrameColor}{J1}
+\colorlet{ExerciceItemColor}{G1}
+\colorlet{ExercicePartieColor}{J1}
+\colorlet{ExerciceRefMethodeColor}{A2}
+%    \end{macrocode}
+% Couleurs pour la partie \og Exercices d'approfondissement \fg{}.
+%    \begin{macrocode}
+\colorlet{ExoApprHeadFrame0Color}{Blanc}
+\colorlet{ExoApprHeadFrame1Color}{G1}
+\colorlet{ExoApprHeadFrame2Color}{G2}
+\colorlet{ExoApprHeadFrame3Color}{G4}
+\colorlet{ExoApprHeadFrame4Color}{J2}
+\colorlet{ExoApprHeadFrame5Color}{J1}
+\definecolor{ExoApprFootColor}{cmyk}{0.00, 0.25, 0.50, 0.00}
+%    \end{macrocode}
+% Couleurs pour la partie \og Je teste mes connaissances \fg{}.
+%    \begin{macrocode}
+\colorlet{ConnHeadFrame0Color}{Blanc}
+\colorlet{ConnHeadFrame1Color}{A2}
+\colorlet{ConnHeadFrame2Color}{A3}
+\colorlet{ConnHeadFrame3Color}{J2}
+\colorlet{ConnHeadFrame4Color}{J1}
+\colorlet{ConnHeadFrame5Color}{F1}
+\colorlet{ConnFootColor}{F2}
+\colorlet{AcquisTitleColor}{G1}
+\colorlet{AcquisBkgColor}{A4}
+\colorlet{AcquisItemColor}{F1}
+\colorlet{QCMAEFrameColor}{G1}
+\colorlet{QCMAETitleCircle1Color}{J1}
+\colorlet{QCMAETitleCircle2Color}{J2}
+\colorlet{QCMAETitleCircle3Color}{F1}
+\colorlet{QCMAETitleColor}{Blanc}
+\colorlet{QCMItemNumColor}{G1}
+\colorlet{QCMFrameColor}{J1}
+\colorlet{QCMTextFrameColor}{Blanc}
+\colorlet{QCMExoNumColor}{Blanc}
+\colorlet{QCMExoNumFrameColor}{J1}
+\colorlet{QCMLineColor}{A4}
+%    \end{macrocode}
+% Couleurs pour la partie \og Travaux pratiques \fg{} et pour la
+% partie Récréation, énigmes.
+%    \begin{macrocode}
+\colorlet{TPHeadFrame0Color}{Blanc}
+\colorlet{TPHeadFrame1Color}{H1}
+\colorlet{TPHeadFrame2Color}{H2}
+\colorlet{TPHeadFrame3Color}{H3}
+\colorlet{TPHeadFrame4Color}{C3}
+\colorlet{TPHeadFrame5Color}{C2}
+\definecolor{TPFootColor}{cmyk}{0.00, 0.30, 0.00, 0.10}
+\colorlet{TPTopColor}{J3}
+\colorlet{TPBottomColor}{C3}
+\colorlet{TPTitleColor}{H1}
+\colorlet{TPPartieColor}{J1}
+\colorlet{TPPartieBkgColor}{C2}
+\colorlet{TPPartieNumColor}{Blanc}
+\colorlet{RecreationHeadFrame0Color}{Blanc}
+\colorlet{RecreationHeadFrame1Color}{J1}
+\colorlet{RecreationHeadFrame2Color}{J2}
+\colorlet{RecreationHeadFrame3Color}{H4}
+\colorlet{RecreationHeadFrame4Color}{H2}
+\colorlet{RecreationHeadFrame5Color}{H1}
+\definecolor{RecreationFootColor}{cmyk}{0.20, 0.00, 0.50, 0.05}
+\colorlet{RecreationTitleColor}{H1}
+\colorlet{RecreationItemColor}{U3}
+\colorlet{RecreationPartieColor}{J1}
+%    \end{macrocode}
+% Couleurs pour la partie \og corrigés \fg (partie annexe).
+%    \begin{macrocode}
+\colorlet{CorrigeHeadFrameColor}{J2}
+\colorlet{CorrigeColumnRuleColor}{J1}
+\colorlet{CorrigeAETitleColor}{F1}
+\colorlet{CorrigeExercicesBaseTitleColor}{C2}
+\colorlet{CorrigeExercicesApprTitleColor}{C2}
+\colorlet{CorrigeConnaissancesTitleColor}{G1}
+\colorlet{CorrigeQCMItemNumColor}{G1}
+%    \end{macrocode}
+% Couleurs pour la liste des méthodes
+%    \begin{macrocode}
+\colorlet{ListeMethodeHeadFrameColor}{G3}
+\colorlet{ListeMethodeColumnRuleColor}{A1}
+\colorlet{ListeMethodeTitleColor}{B2}
+%    \end{macrocode}
+% Couleurs pour les annexes générales
+%    \begin{macrocode}
+\colorlet{TablePropertyBkgColor}{J4}
+\colorlet{TablePropertyTitleBkgColor}{PartieStatistique}
+\colorlet{TablePropertyTitleTextColor}{Blanc}
+\colorlet{AnnexePartieColor}{A1}
+%    \end{macrocode}
+% Couleurs pour le lexique
+%    \begin{macrocode}
+\colorlet{LexiqueHeadFrameColor}{F2}
+\colorlet{LexiqueColumnRuleColor}{B2}
+\colorlet{FirstLetterTxtColor}{B1}
+\colorlet{FirstLetterBkgColor}{J3}
+\colorlet{LexiqueEntreeColor}{B2}
+\colorlet{LexiqueItemColor}{B2}
+%    \end{macrocode}
+% Couleurs pour le texte libre.
+%    \begin{macrocode}
+\colorlet{LibrePartieColor}{A1}
+%    \end{macrocode}
+% \section{Fontes}
+% Fontes utilisées tout au long du document. La macro |\selectfont| à
+% la suite de |\fontsize| n'est obligatoire que dans la mesure où il
+% n'y a pas d'autres commandes \LaTeX{} de modification de fonte. On
+% commence avec les fontes partagées pour tout le document.
+%    \begin{macrocode}
+\newcommand*\AlgoFont{\fontsize{9.5}{9.5}\sffamily\bfseries}
+\newcommand*\TiceFont{\fontsize{9.5}{9.5}\sffamily\bfseries}
+%    \end{macrocode}
+% Fontes de la page de titre.
+%    \begin{macrocode}
+\newcommand*\ThemaTitleFont{\fontsize{20}{24}\sffamily}
+\newcommand*\ChapterTitleFont{\fontsize{40}{40}\sffamily\bfseries}
+\newcommand*\ChapAppFont{\fontsize{15}{18}\sffamily}
+\newcommand*\ChapterNumFont{\fontsize{88}{106}\sffamily}
+\newcommand*\PrerequisTitleFont{\fontsize{14.4}{17.28}\sffamily\bfseries}
+\newcommand*\PrerequisTextFont{\fontsize{9.5}{14.4}\sffamily}
+\newcommand*\AETitleFont{\fontsize{15}{18}\sffamily\bfseries}
+\newcommand*\AEExoNumFont{\fontsize{9.5}{14.4}\sffamily\bfseries}
+\newcommand*\AECartoucheCorrArrowFont{\fontsize{12}{14.4}}
+\newcommand*\AECartoucheCorrVCPFont{\fontsize{9.5}{14.4}\sffamily}
+\newcommand*\AEManuelFont{\fontsize{9.5}{10.5}\sffamily}
+\newcommand*\LogoManuelFont{\fontsize{9.5}{10.5}\sffamily\bfseries}
+\newcommand*\LogoURLManuelFont{\fontsize{9.5}{10.5}\sffamily\bfseries}
+%    \end{macrocode}
+% Fontes pour les en-têtes et pied de page.
+%    \begin{macrocode}
+\newcommand*\HeadTitleFont{\fontsize{24}{28.8}\sffamily\bfseries}
+\newcommand*\RoundHeadTitleFont{\fontsize{24}{28.8}\sffamily\bfseries\itshape}
+\newcommand*\FootChapterNumFont{\fontsize{12}{14.4}\sffamily\bfseries}
+\newcommand*\FootTitleHeadFont{\fontsize{9.5}{12}\sffamily\bfseries}
+\newcommand*\FootTitleChapterFont{\fontsize{9.5}{12}\sffamily}
+\newcommand*\FootPageFont{\fontsize{9.5}{12}\sffamily\bfseries}
+%    \end{macrocode}
+% Fontes pour la partie Activités d'approche
+%    \begin{macrocode}
+\newcommand*\ActiviteTitleFont{\fontsize{15}{18}\sffamily\bfseries}
+\newcommand*\ActiviteNumFont{\fontsize{15}{18}\sffamily\bfseries}
+\newcommand*\ActiviteSubtitleFont{\fontsize{15}{18}\sffamily\bfseries}
+\newcommand*\ActivitePartieFont{\fontsize{12}{14.4}\sffamily\bfseries}
+%    \end{macrocode}
+% Fontes pour la partie Cours - Méthodes.
+%    \begin{macrocode}
+\newcommand*\SectionNumFont{\fontsize{21}{25}\sffamily\bfseries}
+\newcommand*\SectionTitleFont{\fontsize{17.28}{21}\sffamily\bfseries}
+\newcommand*\SubsectionNumFont{\fontsize{17.28}{21}\sffamily\bfseries}
+\newcommand*\SubsectionTitleFont{\fontsize{14.4}{17.28}\sffamily\bfseries}
+\newcommand*\DefTitleFont{\fontsize{12}{14.4}\sffamily}
+\newcommand*\DefSubtitleFont{\fontsize{12}{14.4}\sffamily\bfseries}
+\newcommand*\RemTitleFont{\fontsize{9.5}{14.4}\scshape\bfseries}
+\newcommand*\ExempleTitleFont{\fontsize{9.5}{14.4}\sffamily}
+\newcommand*\MethodeTitleFont{\fontsize{12}{14.4}\sffamily\bfseries}
+\newcommand*\MethodeSubtitleFont{\fontsize{12}{14.4}\sffamily\bfseries}
+\newcommand*\MethodeRefExerciceFont{\fontsize{9.5}{14.4}\sffamily}
+\newcommand*\ExAppTitleFont{\normalsize\sffamily}
+\newcommand*\ExAppCorrTitleFont{\normalsize\sffamily}
+\newcommand*\ProofTitleFont{\fontsize{9.5}{14.4}\sffamily}
+%    \end{macrocode}
+% Fontes pour les parties Exercices de base et Exercices
+% d'approfondissement.
+%    \begin{macrocode}
+\newcommand*\ExercicesTitleFont{\fontsize{14.4}{17.28}\sffamily\bfseries}
+\newcommand*\ExerciceNumFont{\fontsize{10.5}{14.4}\sffamily\bfseries}
+\newcommand*\ExerciceTitleFont{\fontsize{10.5}{14.4}\sffamily\bfseries}
+\newcommand*\ExercicePartieFont{\fontsize{10.5}{14.4}\bfseries}
+\newcommand*\ExerciceRefMethodeFont{\fontsize{9.5}{14.4}\sffamily\bfseries}
+\newcommand*\ExercicePageRefMethodeFont{\fontsize{9.5}{14.4}\sffamily}
+%    \end{macrocode}
+% Fontes pour la partie Je teste mes connaissances.
+%    \begin{macrocode}
+\newcommand*\AcquisTitleFont{\fontsize{17.28}{17.28}\sffamily\bfseries}
+\newcommand*\AcquisTextFont{\fontsize{9.5}{14.4}\sffamily}
+\newcommand*\QCMAETitleFont{\fontsize{20}{20}\sffamily\bfseries}
+\newcommand*\QCMAEManuelFont{\fontsize{9.5}{10.5}\sffamily}
+\newcommand*\QCMAETextAfterTitleFont{\bfseries}
+\newcommand*\QCMExoNumFont{\fontsize{9.5}{14.4}\sffamily\bfseries}
+\newcommand*\QCMItemNumFont{\fontsize{9.5}{14.4}\sffamily\bfseries}
+%    \end{macrocode}
+% Fontes pour la partie TP.
+%    \begin{macrocode}
+\newcommand*\TPPartieFont{\fontsize{12}{14.4}\sffamily\bfseries}
+\newcommand*\RecreationFont{\fontsize{20}{20}\scriptfamily\bfseries}
+\newcommand*\RecreationTitleFont{\fontsize{12}{14.4}\sffamily\bfseries}
+\newcommand*\RecreationPartieFont{\fontsize{10}{14.4}\scshape\bfseries}
+\newcommand*\RecreationPartieTitleFont{\fontsize{10}{14.4}\bfseries}
+%    \end{macrocode}
+% Fontes pour la liste des méthodes.
+%    \begin{macrocode}
+\newcommand*\ListeMethodeChapterFont{\fontsize{40}{40}\sffamily}
+\newcommand*\ListeMethodeTitleFont{\fontsize{12}{14.4}\sffamily\bfseries}
+\newcommand*\ListeMethodePageFont{\fontsize{12}{14.4}\sffamily\bfseries}
+%    \end{macrocode}
+% Fontes pour la partie Corrigés (annexe).
+%    \begin{macrocode}
+\newcommand*\CorrigeTitleFont{\fontsize{40}{40}\sffamily}
+\newcommand*\CorrigeChapterFont{\fontsize{12}{14.4}\sffamily\bfseries}
+\newcommand*\CorrigePartieFont{\fontsize{11}{14.4}\sffamily\bfseries}
+\newcommand*\CorrigeNumExerciceFont{\fontsize{9.5}{14.4}\sffamily\bfseries}
+\newcommand*\CorrigeQCMItemNumFont{\fontsize{9.5}{14.4}\sffamily}
+%    \end{macrocode}
+% Fontes pour les annexes générales.
+%    \begin{macrocode}
+\newcommand*\FootAnnexeTxtFont{\fontsize{11}{14.4}\sffamily}
+\newcommand*\FootAnnexePageFont{\fontsize{11}{14.4}\sffamily\bfseries}
+\newcommand*\AnnexeTitleFont{\fontsize{35}{35}\sffamily}
+\newcommand*\AnnexeSectionTitleFont{\fontsize{14.4}{14.4}\sffamily\bfseries}
+\newcommand*\ProprieteFont{\fontsize{10}{14.4}\sffamily}
+\newcommand*\NumProprieteFont{\fontsize{10}{14.4}\sffamily\bfseries}
+\newcommand*\AnnexePartieFont{\fontsize{10.5}{14.4}\bfseries}
+%    \end{macrocode}
+% Fontes pour le lexique.
+%    \begin{macrocode}
+\newcommand*\LexiqueTitleFont{\fontsize{50}{50}\sffamily}
+\newcommand*\FirstLetterFont{\fontsize{16}{16}\sffamily\bfseries}
+\newcommand*\LexiqueEntreeFont{\fontsize{12}{14.4}\sffamily\bfseries}
+\newcommand*\LexiqueFont{\sffamily\upshape\bfseries}
+%    \end{macrocode}
+% Fontes pour le texte libre.
+%    \begin{macrocode}
+\newcommand*\FootLibrePageFont{\fontsize{11}{14.4}\sffamily\bfseries}
+\newcommand*\LibreSectionTitleFont{\fontsize{14.4}{14.4}\sffamily\bfseries}
+\newcommand*\LibrePartieFont{\fontsize{10.5}{14.4}\bfseries}
+%    \end{macrocode}
+% \section{Longueurs}
+% Longueurs utilisées tout au long du document. Il n'est pas
+% nécessaire que ce soit des registres de dimensions. On commence avec
+% les longueurs utilisées pour l'ensemble du document.
+%
+% Longueurs pour les en-têtes et pieds de page de tout le document.
+%    \begin{macrocode}
+\def\SquareWidth{3mm}
+\def\ItemRuleWidth{1.5mm}
+\def\ItemRuleHeight{1.5mm}
+\def\ItemRuleDepth{0mm}
+\def\ListLabelWidth{4mm}
+\def\EnumerateLabelWidth{5mm}
+\def\ListHSep{2mm}
+\def\AlgorithmeRuleWidth{1pt}
+\def\AlgorithmeSep{2mm}
+\def\AlgorithmeNumWidth{6mm}
+\def\HeadFrameWidth{11cm}
+\def\RoundHeadFrameWidth{12.8cm}
+\def\HeadTitleSep{1cm}
+\edef\HeadTitleMaxWidth
+     {\the\dimexpr \HeadFrameWidth-\SquareWidth*3-\HeadTitleSep}
+\edef\RoundHeadTitleMaxWidth
+     {\the\dimexpr \RoundHeadFrameWidth-\SquareWidth*3-\HeadTitleSep}
+\edef\HeadFrameHeight{\the\dimexpr \smc@margintop-\smc@headsep}
+\def\HeadFrameDepth{3mm}
+\def\FootFrameWidth{6mm}
+\def\FootFrameSep{1mm}
+\def\AlgoIndent{1em}
+%    \end{macrocode}
+% Longueurs pour les différents cadres.
+%    \begin{macrocode}
+\def\CadreSep{2mm}
+\def\CadreLineWidth{0.5mm}
+\def\FrameSep{3mm}
+\def\FrameLineWidth{1pt}
+\edef\FrameArc{\the\dimexpr \SquareWidth/2}
+\def\RuleWidth{1pt}
+\def\BeforeCadreVSpace{1.5mm}
+\def\AfterCadreVSpace{1.5mm}
+\def\BeforeTableVSpace{1.5mm}
+\def\AfterTableVSpace{1.5mm}
+\def\HabillageGap{2mm}
+\def\LogoLineWidth{1pt}
+\def\BeforeAlgorithmeVSpace{1.5mm}
+\def\AfterAlgorithmeVSpace{1.5mm}
+%    \end{macrocode}
+% Viennent ensuite les longueurs spécifiques à chaque partie du
+% document.
+%
+% Longueurs pour la page de titre.
+%    \begin{macrocode}
+\edef\ChapterTopFrameHeight{\the\dimexpr 2.1cm+\smc@bleed}
+\def\ChapterBottomFrameHeight{6cm}
+\edef\ChapterTotalFrameHeight{%
+  \the\dimexpr\ChapterTopFrameHeight+\ChapterBottomFrameHeight}
+\def\ChapterBottomPicture{5.5cm}
+\def\ChapterNumLeftFrame{13.4cm}
+%    \end{macrocode}
+% Les longueurs basées sur |\linewidth| ne peuvent être calculées
+% qu'au moment du |\begin{document}|.
+%    \begin{macrocode}
+\AtBeginDocument{%
+  \edef\ChapterTitleThemaWidth{%
+    \the\dimexpr\linewidth-\ChapterNumLeftFrame-6mm
+  }%
+}
+\def\ChapterNumBase{3.6cm}
+\def\ChapterNumBottomFrame{2.1cm}
+\edef\ChapterNumTopFrame{\the\dimexpr 8.1cm+\smc@bleed}
+\def\ChapterTitleBase{2.1cm}
+\def\ChapterTitleSep{1cm}
+\def\ThemaBottomFrame{5.7cm}
+\def\ThemaTopFrame{6.6cm}
+\def\PrerequisTitleVSpace{1mm}
+\def\AETitleWidth{8cm}
+\edef\AETitleHeight{\the\dimexpr \SquareWidth*3}
+\def\AEFrameVSep{4mm}
+\edef\AEFrameHSep{\SquareWidth}
+\edef\AEFrameRuleWidth{\the\dimexpr\SquareWidth/2}
+\edef\AEExoFrameWidth{\the\dimexpr \SquareWidth*2}
+\def\AEExoFrameTopSep{1mm}
+\def\AfterAEExoFrameHSpace{2mm}
+\def\AECartoucheCorrSep{4mm}
+\def\AECartoucheCorrHeight{6mm}
+\def\AECartoucheCorrWidth{50mm}
+\def\AEManuelWidth{55mm}
+\def\AEManuelRightSpace{1mm}
+\def\AELogoManuelWidth{9mm}
+\def\AfterAEManuelVSpace{3mm}
+%    \end{macrocode}
+% Longueurs pour la partie Activités d'approche.
+%    \begin{macrocode}
+\def\BeforeActiviteVSpace{5mm}
+%    \end{macrocode}
+% Pour la longueur suivante, comme on fait beaucoup de calcul où
+% interviennent une multiplication par $\sqrt{2}$ ou par
+% $\frac{\sqrt{2}}{2}$, on va en faire un registre de longueur au lieu
+% d'une macro.
+%    \begin{macrocode}
+\newdimen\ActiviteTitleTopHeight
+\ActiviteTitleTopHeight 6mm
+\def\ActiviteTitleBottomHeight{1.5mm}
+\def\ActiviteTitleLeftSpace{2mm}
+\def\ActiviteTitleRightSpace{1mm}
+\def\AfterActiviteTitleHSpace{2mm}
+\def\AfterActiviteTitleVSpace{3mm}
+\def\BeforeActivitePartieVSpace{1.5mm}
+\def\AfterActivitePartieVSpace{1mm}
+%    \end{macrocode}
+% Longueurs pour la partie Cours - Méthodes.
+%    \begin{macrocode}
+\def\BeforeSectionVSpace{10mm}
+\def\AfterSectionVSpace{2mm}
+\def\SectionNumTitleHSpace{3mm}
+\def\SectionCorrectionChassePoint{-0.25pt}
+\def\BeforeSubsectionVSpace{4mm}
+\def\AfterSubsectionVSpace{1mm}
+\def\BeforeDefVSpace{3mm}
+\def\AfterDefVSpace{1.5mm}
+\def\DefFrameHSep{3mm}
+\def\DefFrameVSep{1mm}
+\def\DefTitleFrameVSep{1mm}
+\def\BeforeRemVSpace{3mm}
+\def\AfterRemVSpace{1.5mm}
+\def\BeforeExempleVSpace{4mm}
+\def\ExempleVRuleWidthFrame{1.25mm}
+\def\ExempleHRuleWidthFrame{0.75mm}
+\def\ExempleWidthFrame{15mm}
+\def\ExempleHeightFrame{3mm}
+\def\BeforeMethodeVSpace{3mm}
+\edef\MethodeTitleLeftSpace{\SquareWidth}
+\edef\MethodeTitleRightSpace{\SquareWidth}
+\def\MethodeSubtitleLeftSpace{2mm}
+\def\AfterMethodeTitleVspace{1.5mm}
+\def\MethodeFrameHSep{3mm}
+\def\MethodeFrameTopSep{2mm}
+\def\MethodeFrameBottomSep{1mm}
+\def\ExAppWidthFrame{30mm}
+\def\ExAppHeightFrame{3mm}
+\def\ExAppDepthFrame{0.75mm}
+\def\ExAppCorrWidthFrame{15mm}
+\def\ExAppCorrHeightFrame{3mm}
+\def\ExAppCorrDepthFrame{0.75mm}
+\def\AfterCartoucheHSpace{1.5mm}
+\def\AfterExAppMethodeVSpace{3mm}
+\def\BeforeProofVSpace{3mm}
+\def\AfterProofVSpace{1.5mm}
+\def\ProofHeightFrame{3mm}
+\def\ProofDepthFrame{0.75mm}
+\def\ProofLeftSpace{1mm}
+\def\ProofRightSpace{1.5mm}
+\def\AfterProofTitleHSpace{1.5mm}
+%    \end{macrocode}
+% Longueurs pour les parties Exercices de base et Exercices
+% d'approfondissement.
+%    \begin{macrocode}
+\def\BeforeExercicesTitleVSpace{3mm}
+\def\AfterExercicesTitleVSpace{1.5mm}
+\def\ExercicesTitleHSep{3mm}
+\def\ExercicesTitleVSep{2mm}
+\def\BeforeExerciceVSpace{1.5mm}
+\def\ExerciceNumFrameWidth{6mm}
+\def\ExerciceNumFrameHeight{3.25mm}
+\def\ExerciceNumFrameDepth{0.75mm}
+\def\ExerciceTextHSep{2mm}
+\def\BeforeExercicePartieVSpace{1.5mm}
+\def\AfterExercicePartieVSpace{1mm}
+%    \end{macrocode}
+% Longueurs pour la partie Je teste mes connaissances.
+%    \begin{macrocode}
+\def\AcquisTitleVSpace{1mm}
+\def\BeforeQCMAEVSpace{6mm plus2mm minus2mm}
+\def\QCMAETitleHeight{9mm}
+\def\QCMAETitleWidth{110mm}
+\def\QCMAETitleLeftSpace{17mm}
+\def\QCMAEManuelWidth{40mm}
+\def\QCMAEManuelRightSpace{1mm}
+\def\QCMAELogoManuelWidth{9mm}
+\def\AfterQCMAEManuelVSpace{0mm}
+\def\AfterQCMAETitleVSpace{5mm plus2mm minus1mm}
+\def\AfterQCMAETextVSpace{3mm plus1mm minus1mm}
+\def\QCMRefHSep{1pt}
+\edef\QCMExoFrameWidth{\the\dimexpr \SquareWidth*2}
+\def\QCMExoFrameTopSep{1mm}
+\def\AfterQCMExoFrameHSpace{2mm}
+\def\QCMLabelWidth{6mm}
+\def\BeforeQCMVSpace{2mm plus1mm minus1mm}
+\def\AfterQCMVSpace{0mm plus1mm}
+\def\QCMLineWidth{2mm}
+\def\QCMFrameSep{1mm}
+\edef\QCMLineArc{\SquareWidth}
+%    \end{macrocode}
+% Longueurs pour la partie TP
+%    \begin{macrocode}
+\def\BeforeTPPartieVSpace{3mm plus1mm minus1mm}
+\def\AfterTPPartieVSpace{0mm plus1mm}
+\def\TPPartieHSep{2mm}
+\def\BeforeRecreationVSpace{6mm}
+\def\AfterRecreationVSpace{3mm}
+\def\BeforeRecreationPartieVSpace{1.5mm minus 1mm}
+\def\AfterRecreationPartieVSpace{1mm minus 0.5mm}
+%    \end{macrocode}
+% Longueurs pour la liste des méthodes.
+%    \begin{macrocode}
+\def\ListeMethodeRuleWidth{0.2pt}
+\def\AfterMethodeVSpace{3pt}
+\def\TriangleMethodeSize{1ex}
+%    \end{macrocode}
+% Longueurs pour la partie corrigés (annexe).
+%    \begin{macrocode}
+\def\CorrigeRuleWidth{0.2pt}
+\def\CorrigeHeadFrameWidth{9mm}
+\def\CorrigeChapterFrameHeight{5mm}
+\def\BeforeCorrigePartieTitleVSpace{1mm minus 0.5mm}
+\def\BeforeCorrigeChapterVspace{3mm plus1mm minus1mm}
+\def\QCMHSep{1mm}
+%    \end{macrocode}
+% Longueurs pour les annexes générales.
+%    \begin{macrocode}
+\def\BeforeAnnexeTitleVSpace{-20mm}
+\def\AfterAnnexeTitleVSpace{0mm plus0.5mm}
+\edef\AnnexeSectionRuleWidth{\SquareWidth}
+\def\AnnexeSectionRuleHSpace{1mm}
+\def\BeforeAnnexeSectionVSpace{5mm}
+\def\AfterAnnexeSectionVSpace{2mm}
+\def\BeforeAnnexePartieVSpace{1.5mm}
+\def\AfterAnnexePartieVSpace{1mm}
+%    \end{macrocode}
+% Longueurs pour le lexique.
+%    \begin{macrocode}
+\def\LexiqueRuleWidth{0.2pt}
+\def\AfterFirstLetterVSpace{2mm}
+\def\BeforeFirstLetterVSpace{2mm}
+\def\FirstLetterFrameHSep{1mm}
+\def\AfterEntreeVSpace{5mm}
+%    \end{macrocode}
+% Longueurs pour les textes libres.
+%    \begin{macrocode}
+\edef\LibreSectionRuleWidth{\SquareWidth}
+\def\LibreSectionRuleHSpace{1mm}
+\def\BeforeLibreSectionVSpace{5mm}
+\def\AfterLibreSectionVSpace{2mm}
+\def\BeforeLibrePartieVSpace{1.5mm}
+\def\AfterLibrePartieVSpace{1mm}
+%    \end{macrocode}
+% \section{Textes fixes}
+% La classe propose un certain nombre de textes fixes qui vont être
+% définis ici. Les macros sont rendus publiques pour pouvoir les
+% modifier facilement si besoin.
+%
+% Attention, en cas d'utilisation de codage autre que UTF-8 ainsi que
+% pour éviter des erreurs lors de développement précoce de macros,
+% toutes les diacritiques seront codées \og à la \TeX{} \fg{}.
+%    \begin{macrocode}
+\newcommand*\StringColitemize{colitemize}
+\newcommand*\StringColenumerate{colenumerate}
+\newcommand*\StringPrerequis{Connaissances du coll\`ege
+  n\'ecessaires \`a ce chapitre}
+\newcommand*\StringActivitesApproche{Activit\'es d'approche}
+\newcommand*\StringCoursMethodes{Cours~-~M\'ethodes}
+\newcommand*\StringExercicesBase{S'entra\^iner}
+\newcommand*\StringExercicesAppr{Approfondir}
+\newcommand*\StringTestConnaissances{Je teste mes connaissances}
+\newcommand*\StringConnaissances{Auto-\'evaluation QCM}
+\newcommand*\StringTravauxPratiques{Travaux pratiques}
+\newcommand*\StringAE{Auto-\'evaluation}
+\newcommand*\StringVoirCorriges{Voir solutions p.}
+\newcommand*\StringManuel{Des ressources num\'eriques pour pr\'eparer
+  le chapitre sur
+  \textcolor{U4}{\LogoURLManuelFont manuel.sesamath.net}}
+\newcommand*\StringALGO{ALGO}
+\newcommand*\StringTICE{INFO}
+\newcommand*\StringRecreation{R\'ecr\'eation, \'enigmes}
+\newcommand*\StringAcquisTitle{\`A la fin de ce chapitre, je dois
+  \^etre capable de\,:}
+\newcommand*\StringQCMAE{QCM d'auto-\'evaluation}
+%    \end{macrocode}
+% La chaîne |\StringQCM| ne doit pas être modifiée.
+%    \begin{macrocode}
+\newcommand*\StringQCM{QCM}
+\newcommand*\StringChapitre{Chapitre}
+\newcommand*\StringEnigme{\'Enigme}
+\newcommand*\StringPropriete{Propri\'et\'e}
+\newcommand*\StringPROPRIETE{PROPRI\'ET\'E}
+\newcommand*\StringDEFINITION{D\'EFINITION}
+\newcommand*\StringTHEOREME{TH\'EOR\`EME}
+\newcommand*\StringLexique{Lexique}
+%    \end{macrocode}
+% Le logo utilisé pour indiquer que le manuel se trouve sur internet
+% n'est pas à proprement parler une chaîne de caractères mais on va
+% tout de même le définir ici. En revanche, il faut tous les
+% renseignements inclus dans la macro.
+%    \begin{macrocode}
+\newcommand*\LogoManuel{\textcolor{U4}{\LogoManuelFont @}}
+\newcommand\StringDEBAT{D\'EBAT}
+\newcommand\StringACTIVITE{ACTIVIT\'E}
+\newcommand\StringTP{TP}
+\newcommand*\StringExemple{Exemple}
+\newcommand*\StringCorrection{Correction}
+\newcommand*\StringMETHODE{M\'ETHODE}
+\newcommand*\StringPREUVE{PREUVE}
+\newcommand*\StringMethode{M\'ethode}
+\newcommand*\StringExApp{Exercice d'application}
+\newcommand*\StringPartie{Partie}
+\newcommand*\StringListeMethode{Liste des m\'ethodes}
+\newcommand*\StringCorriges{Solutions}
+\newcommand*\StringListeMethodeF{Fonctions}
+\newcommand*\StringListeMethodeG{G\'eom\'etrie}
+\newcommand*\StringListeMethodeSP{Stat. et probabilit\'es}
+%    \end{macrocode}
+% \section{Éléments graphiques particuliers}
+% \begin{macro}{\smc@diagonal}
+% Plusieurs éléments graphiques utilisent des carrés disposés en
+% diagonale avec des couleurs dégradées, cette commande permet de
+% construire l'ensemble de ces carrés de façon automatique. Le
+% principe est que les coordonnées indiquent le coin inférieur gauche
+% du carré inférieur gauche et que le second paramètre indique le nom
+% de base \texttt{<base>} pour retrouver les couleurs. Les noms des
+% couleurs sont construits selon le principe \texttt{<base><n>Color}
+% où \texttt{<n>} est un nombre de 1 à 5. Il aurait été plus simple de
+% le faire avec un |\rput| mais bizarrement \XeLaTeX{} semble ne pas
+% bien gérer la situation (il y a un petit décalage que je ne
+% m'explique pas : très peu vers le haut et un peu plus vers la
+% gauche).
+%    \begin{macrocode}
+\def\smc@diagonal(#1,#2)#3{%
+  \psframe[linewidth=0pt, linestyle=none, fillcolor=#33Color]
+          (\dimexpr #1, \dimexpr #2)
+          (\dimexpr #1+\SquareWidth, \dimexpr #2+\SquareWidth)
+  \psframe[linewidth=0pt, linestyle=none, fillcolor=#32Color]
+          (\dimexpr #1+\SquareWidth, \dimexpr #2)
+          (\dimexpr #1+\SquareWidth*2, \dimexpr #2+\SquareWidth)
+  \psframe[linewidth=0pt, linestyle=none, fillcolor=#31Color]
+          (\dimexpr #1+\SquareWidth*2, \dimexpr #2)
+          (\dimexpr #1+\SquareWidth*3, \dimexpr #2+\SquareWidth)
+  \psframe[linewidth=0pt, linestyle=none, fillcolor=#34Color]
+          (\dimexpr #1, \dimexpr #2+\SquareWidth)
+          (\dimexpr #1+\SquareWidth, \dimexpr #2+\SquareWidth*2)
+  \psframe[linewidth=0pt, linestyle=none, fillcolor=#33Color]
+          (\dimexpr #1+\SquareWidth, \dimexpr #2+\SquareWidth)
+          (\dimexpr #1+\SquareWidth*2, \dimexpr #2+\SquareWidth*2) 
+  \psframe[linewidth=0pt, linestyle=none, fillcolor=#32Color]
+          (\dimexpr #1+\SquareWidth*2, \dimexpr #2+\SquareWidth)
+          (\dimexpr #1+\SquareWidth*3, \dimexpr #2+\SquareWidth*2)
+  \psframe[linewidth=0pt, linestyle=none, fillcolor=#35Color]
+          (\dimexpr #1, \dimexpr #2+\SquareWidth*2)
+          (\dimexpr #1+\SquareWidth, \dimexpr #2+\SquareWidth*3)
+  \psframe[linewidth=0pt, linestyle=none, fillcolor=#34Color]
+          (\dimexpr #1+\SquareWidth, \dimexpr #2+\SquareWidth*2)
+          (\dimexpr #1+\SquareWidth*2, \dimexpr #2+\SquareWidth*3)
+  \psframe[linewidth=0pt, linestyle=none, fillcolor=#33Color]
+          (\dimexpr #1+\SquareWidth*2, \dimexpr #2+\SquareWidth*2)
+          (\dimexpr #1+\SquareWidth*3, \dimexpr #2+\SquareWidth*3)
+  \ignorespaces
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\smc@antidiagonal}
+% C'est exactement la même chose que la macro précédente mais
+% l'orientation se fait selon la diagonale non principale.
+%    \begin{macrocode}
+\def\smc@antidiagonal(#1,#2)#3{%
+  \psframe[linewidth=0pt, linestyle=none, fillcolor=#31Color]
+          (\dimexpr #1, \dimexpr #2)
+          (\dimexpr #1+\SquareWidth, \dimexpr #2+\SquareWidth)
+  \psframe[linewidth=0pt, linestyle=none, fillcolor=#32Color]
+          (\dimexpr #1+\SquareWidth, \dimexpr #2)
+          (\dimexpr #1+\SquareWidth*2, \dimexpr #2+\SquareWidth)
+  \psframe[linewidth=0pt, linestyle=none, fillcolor=#33Color]
+          (\dimexpr #1+\SquareWidth*2, \dimexpr #2)
+          (\dimexpr #1+\SquareWidth*3, \dimexpr #2+\SquareWidth)
+  \psframe[linewidth=0pt, linestyle=none, fillcolor=#32Color]
+          (\dimexpr #1, \dimexpr #2+\SquareWidth)
+          (\dimexpr #1+\SquareWidth, \dimexpr #2+\SquareWidth*2)
+  \psframe[linewidth=0pt, linestyle=none, fillcolor=#33Color]
+          (\dimexpr #1+\SquareWidth, \dimexpr #2+\SquareWidth)
+          (\dimexpr #1+\SquareWidth*2, \dimexpr #2+\SquareWidth*2) 
+  \psframe[linewidth=0pt, linestyle=none, fillcolor=#34Color]
+          (\dimexpr #1+\SquareWidth*2, \dimexpr #2+\SquareWidth)
+          (\dimexpr #1+\SquareWidth*3, \dimexpr #2+\SquareWidth*2)
+  \psframe[linewidth=0pt, linestyle=none, fillcolor=#33Color]
+          (\dimexpr #1, \dimexpr #2+\SquareWidth*2)
+          (\dimexpr #1+\SquareWidth, \dimexpr #2+\SquareWidth*3)
+  \psframe[linewidth=0pt, linestyle=none, fillcolor=#34Color]
+          (\dimexpr #1+\SquareWidth, \dimexpr #2+\SquareWidth*2)
+          (\dimexpr #1+\SquareWidth*2, \dimexpr #2+\SquareWidth*3)
+  \psframe[linewidth=0pt, linestyle=none, fillcolor=#35Color]
+          (\dimexpr #1+\SquareWidth*2, \dimexpr #2+\SquareWidth*2)
+          (\dimexpr #1+\SquareWidth*3, \dimexpr #2+\SquareWidth*3)
+  \ignorespaces
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\smc@rounddiagonal}
+% Même chose que les carrés en diagonal mais avec des disques en diagonal
+%    \begin{macrocode}
+\def\smc@rounddiagonal(#1,#2)#3{%
+  \pscircle*[linecolor=#33Color]
+          (\dimexpr #1+\SquareWidth/2,
+           \dimexpr #2+\SquareWidth/2)
+          {\dimexpr \SquareWidth/2}
+  \pscircle*[linecolor=#32Color]
+          (\dimexpr #1+\SquareWidth/2+\SquareWidth,
+           \dimexpr #2+\SquareWidth/2)
+          {\dimexpr \SquareWidth/2}
+  \pscircle*[linecolor=#31Color]
+          (\dimexpr #1+\SquareWidth/2+\SquareWidth*2,
+           \dimexpr #2+\SquareWidth/2)
+          {\dimexpr \SquareWidth/2}
+  \pscircle*[linecolor=#34Color]
+          (\dimexpr #1+\SquareWidth/2,
+           \dimexpr #2+\SquareWidth/2+\SquareWidth)
+          {\dimexpr \SquareWidth/2}
+  \pscircle*[linecolor=#33Color]
+          (\dimexpr #1+\SquareWidth/2+\SquareWidth,
+           \dimexpr #2+\SquareWidth/2+\SquareWidth)
+          {\dimexpr \SquareWidth/2}
+  \pscircle*[linecolor=#32Color]
+          (\dimexpr #1+\SquareWidth/2+\SquareWidth*2,
+           \dimexpr #2+\SquareWidth/2+\SquareWidth)
+          {\dimexpr \SquareWidth/2}
+  \pscircle*[linecolor=#35Color]
+          (\dimexpr #1+\SquareWidth/2,
+           \dimexpr #2+\SquareWidth/2+\SquareWidth*2)
+          {\dimexpr \SquareWidth/2}
+  \pscircle*[linecolor=#34Color]
+          (\dimexpr #1+\SquareWidth/2+\SquareWidth,
+           \dimexpr #2+\SquareWidth/2+\SquareWidth*2)
+          {\dimexpr \SquareWidth/2}
+  \pscircle*[linecolor=#33Color]
+          (\dimexpr #1+\SquareWidth/2+\SquareWidth*2,
+           \dimexpr #2+\SquareWidth/2+\SquareWidth*2)
+          {\dimexpr \SquareWidth/2}
+  \ignorespaces
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\smc@roundantidiagonal}
+% C'est exactement la même chose que la macro précédente mais
+% l'orientation se fait selon la diagonale non principale.
+%    \begin{macrocode}
+\def\smc@roundantidiagonal(#1,#2)#3{%
+  \pscircle*[linecolor=#31Color]
+          (\dimexpr #1+\SquareWidth/2,
+           \dimexpr #2+\SquareWidth/2)
+          {\dimexpr \SquareWidth/2}
+  \pscircle*[linecolor=#32Color]
+          (\dimexpr #1+\SquareWidth/2+\SquareWidth,
+           \dimexpr #2+\SquareWidth/2)
+          {\dimexpr \SquareWidth/2}
+  \pscircle*[linecolor=#33Color]
+          (\dimexpr #1+\SquareWidth/2+\SquareWidth*2,
+           \dimexpr #2+\SquareWidth/2)
+          {\dimexpr \SquareWidth/2}
+  \pscircle*[linecolor=#32Color]
+          (\dimexpr #1+\SquareWidth/2,
+           \dimexpr #2+\SquareWidth/2+\SquareWidth)
+          {\dimexpr \SquareWidth/2}
+  \pscircle*[linecolor=#33Color]
+          (\dimexpr #1+\SquareWidth/2+\SquareWidth,
+           \dimexpr #2+\SquareWidth/2+\SquareWidth)
+          {\dimexpr \SquareWidth/2}
+  \pscircle*[linecolor=#34Color]
+          (\dimexpr #1+\SquareWidth/2+\SquareWidth*2,
+           \dimexpr #2+\SquareWidth/2+\SquareWidth)
+          {\dimexpr \SquareWidth/2}
+  \pscircle*[linecolor=#33Color]
+          (\dimexpr #1+\SquareWidth/2,
+           \dimexpr #2+\SquareWidth/2+\SquareWidth*2)
+          {\dimexpr \SquareWidth/2}
+  \pscircle*[linecolor=#34Color]
+          (\dimexpr #1+\SquareWidth/2+\SquareWidth,
+           \dimexpr #2+\SquareWidth/2+\SquareWidth*2)
+          {\dimexpr \SquareWidth/2}
+  \pscircle*[linecolor=#35Color]
+          (\dimexpr #1+\SquareWidth/2+\SquareWidth*2,
+           \dimexpr #2+\SquareWidth/2+\SquareWidth*2)
+          {\dimexpr \SquareWidth/2}
+  \ignorespaces
+}
+%    \end{macrocode}
+% \end{macro}
+% \section{Commandes de sectionnement}
+% \subsection{Thème}
+% \begin{macro}{\thema}
+% Les macros |\thema<t>| permet de spécifier le thème en cours. Pour
+% l'instant, la classe n'en prévoit que quatre :
+% \begin{itemize}
+% \item fonction ;
+% \item géométrie ;
+% \item statistiques probabilité ;
+% \item libre (pour les pages sans thème)
+% \end{itemize}
+% La macro mémorise le titre du thème, son abréviation et un certain
+% nombre de couleurs spécifiques.
+%    \begin{macrocode}
+\newcommand*\themaF{%
+  \cleardoubleoddpage
+  \def\smc@thema{fonctions}%
+  \def\smc@themacap{FONCTIONS}%
+  \def\smc@thema@init{f}%
+  \def\smc@thema@initcap{F}%
+  \smc@themaFColor
+%    \end{macrocode}
+% À chaque début de thème, on remet le compteur de chapitre à zéro.
+%    \begin{macrocode}
+  \setcounter{chapter}{0}%
+}
+%    \end{macrocode}
+% Pour les couleurs, comme on en a besoin à plusieurs endroits, on les
+% définis séparément.
+%    \begin{macrocode}
+\newcommand*\smc@themaFColor{%
+  \def\CorrigeChapterFrameColor{PartieFonction}%
+  \def\CorrigeChapterTextColor{Blanc}%
+  \colorlet{ChapterNumFrameColor}{PartieFonction}%
+  \colorlet{FootTitleHeadColor}{PartieFonction}%
+  \colorlet{ChapterTopFrameColor}{A3}%
+  \colorlet{ChapterNumSquare4Color}{A3}%
+  \colorlet{ChapterNumSquare5Color}{PartieFonction}%
+  \colorlet{FirstChapterFootColor}{FootFonctionColor}%
+}
+%    \end{macrocode}
+% Même chose pour la partie Géométrie
+%    \begin{macrocode}
+\newcommand*\themaG{%
+  \cleardoubleoddpage
+  \def\smc@thema{g\'eom\'etrie}%
+  \def\smc@themacap{G\'EOM\'ETRIE}%
+  \def\smc@thema@init{g}%
+  \def\smc@thema@initcap{G}%
+  \smc@themaGColor
+  \setcounter{chapter}{0}%
+}
+\newcommand*\smc@themaGColor{%
+  \def\CorrigeChapterFrameColor{PartieGeometrie}%
+  \def\CorrigeChapterTextColor{Blanc}%
+  \colorlet{ChapterNumFrameColor}{PartieGeometrie}%
+  \colorlet{FootTitleHeadColor}{PartieGeometrie}%
+  \colorlet{ChapterTopFrameColor}{G3}%
+  \colorlet{ChapterNumSquare4Color}{G3}%
+  \colorlet{ChapterNumSquare5Color}{PartieGeometrie}%
+  \colorlet{FirstChapterFootColor}{FootGeometrieColor}%
+}
+%    \end{macrocode}
+% Même chose pour la partie Statistiques et probabilités.
+%    \begin{macrocode}
+\newcommand*\themaS{%
+  \cleardoubleoddpage
+  \def\smc@thema{statistiques\\probabilit\'es}%
+  \def\smc@themacap{STATISTIQUES\\PROBABILIT\'ES}%
+  \def\smc@thema@init{sp}%
+  \def\smc@thema@initcap{SP}%
+  \smc@themaSColor
+  \setcounter{chapter}{0}%
+}
+\newcommand*\smc@themaSColor{%
+  \def\CorrigeChapterFrameColor{PartieStatistique}%
+  \def\CorrigeChapterTextColor{Blanc}%
+  \colorlet{ChapterNumFrameColor}{PartieStatistique}%
+  \colorlet{FootTitleHeadColor}{PartieStatistique}%
+  \colorlet{ChapterTopFrameColor}{U2}%
+  \colorlet{ChapterNumSquare4Color}{U2}%
+  \colorlet{ChapterNumSquare5Color}{PartieStatistique}%
+  \colorlet{FirstChapterFootColor}{FootStatistiqueColor}%
+}
+%    \end{macrocode}
+% Même chose pour la partie libre. Il n'y a pas de saut de page pour
+% ce thème.
+%    \begin{macrocode}
+\newcommand*\themaL{%
+  \def\smc@thema{}%
+  \def\smc@themacap{}%
+  \def\smc@thema@init{l}%
+  \def\smc@thema@initcap{L}%
+  \smc@themaLColor
+  \setcounter{chapter}{0}%
+}
+\newcommand*\smc@themaLColor{%
+  \def\CorrigeChapterFrameColor{Blanc}%
+  \def\CorrigeChapterTextColor{Blanc}%
+  \colorlet{ChapterNumFrameColor}{Blanc}%
+  \colorlet{FootTitleHeadColor}{Blanc}%
+  \colorlet{ChapterTopFrameColor}{Blanc}%
+  \colorlet{ChapterNumSquare4Color}{Blanc}%
+  \colorlet{ChapterNumSquare5Color}{Blanc}%
+  \colorlet{FirstChapterFootColor}{Blanc}%
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\NewThema}
+% La classe va proposer également la commande |\NewThema| pour pouvoir
+% définir d'autres thèmes que les quatre initiaux de la maquette. Cette
+% commande demande 7 arguments qui sont (dans l'ordre) :
+% \begin{itemize}
+% \item la lettre ou les lettres après |\thema| (normalement en
+% capitale) ;
+% \item la lettre ou les lettres correspondantes en minuscule ;
+% \item le titre du thème en minuscule ;
+% \item le titre du thème avec initiale en capitale ;
+% \item le titre du thème entèrement en capitale ;
+% \item la couleur du cadre pour le rectangle vertical de chapitre ;
+% \item la couleur de l'avant-dernier carré en bas à gauche du
+%   rectangle vertical de chapitre.
+% \end{itemize}
+%    \begin{macrocode}
+\newcommand*\NewThema[7]{%
+%    \end{macrocode}
+% Il est interdit de redéfinir un thème
+%    \begin{macrocode}
+  \ifcsname thema#1\endcsname
+    \ClassError{sesamanuel}
+               {le theme \string\thema#1 existe deja}
+               {Vous ne pouvez pas creer un theme deja existant.}%
+  \else
+%    \end{macrocode}
+% Déclaration du booléen pour la présence de méthodes dans ce thème.
+%    \begin{macrocode}
+    \protected@write\@auxout{}
+      {%
+        \protect\expandafter
+        \protect\newif \protect\csname ifsmc@lom#2\protect\endcsname
+      }%
+    \expandafter \newif \csname ifsmc@lom#2\endcsname
+%    \end{macrocode}
+% Déclaration des couleurs pour la liste des méthodes.
+%    \begin{macrocode}
+    \@namedef{smc@thema#1Color}{%
+      \def\CorrigeChapterFrameColor{#6}%
+      \def\CorrigeChapterTextColor{Blanc}%
+      \colorlet{ChapterNumFrameColor}{#6}%
+      \colorlet{FootTitleHeadColor}{#6}%
+      \colorlet{ChapterTopFrameColor}{#7}%
+      \colorlet{ChapterNumSquare4Color}{#7}%
+      \colorlet{ChapterNumSquare5Color}{#6}%
+      \colorlet{FirstChapterFootColor}{#7}%
+    }%
+%    \end{macrocode}
+% Définition du thème proprement dit avec sa commande d'appel.
+%    \begin{macrocode}
+    \expandafter\def\csname thema#1\endcsname{%
+      \cleardoubleoddpage
+      \def\smc@thema{#3}%
+      \edef\smc@themacap{#5}%
+      \def\smc@thema@init{#2}%
+      \def\smc@thema@initcap{#1}%
+      \def\CorrigeChapterFrameColor{#6}%
+      \expandafter\def\csname StringListeMethode#1\endcsname{#4}%
+      \def\CorrigeChapterTextColor{Blanc}%
+      \colorlet{ChapterNumFrameColor}{#6}%
+      \colorlet{FootTitleHeadColor}{#6}%
+      \colorlet{ChapterTopFrameColor}{#7}%
+      \colorlet{ChapterNumSquare4Color}{#7}%
+      \colorlet{ChapterNumSquare5Color}{#6}%
+      \colorlet{FirstChapterFootColor}{#7}%
+    }%
+  \fi
+}
+%    \end{macrocode}
+% \end{macro}
+% \subsection{Composants d'un chapitre}
+% \begin{macro}{\smc@fixwidth}
+% On va avoir besoin d'une macro composant son contenu dans une
+% largeur déterminée et qui accepte les coupures de lignes avec
+% |\\|. Le premier argument est la largeur imposée, la seconde est le
+% texte.
+%    \begin{macrocode}
+\newcommand\smc@fixwidth[2]{%
+  \smc@dima=0pt
+  \expandafter\smc@@width#2\\\@nil\\%
+  \setbox0=\hbox{%
+    \minipage[b]{\smc@dima}
+      #2%
+    \endminipage
+  }%
+  \smc@dima=\dimexpr\ht0+\dp0\relax
+  \psscaleboxto(#1,\the\smc@dima){%
+    \unhbox0
+  }%
+  \ignorespaces
+}
+\def\smc@@width#1\\{%
+  \def\smc@arg{#1}%
+  \unless\ifx\smc@arg\@nnil
+    \setbox0=\hbox{#1}%
+    \ifdim\wd0>\smc@dima
+      \smc@dima=\wd0\relax
+    \fi
+    \expandafter\smc@@width
+  \fi
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\smc@fixwidthcenter}
+% Même chose que précédemment mais le contenu est centré.
+%    \begin{macrocode}
+\newcommand\smc@fixwidthcenter[2]{%
+  \smc@dima=0pt
+  \expandafter\smc@@width#2\\\@nil\\%
+  \setbox0=\hbox{%
+    \minipage[b]{\smc@dima}
+      \centering
+      #2%
+    \endminipage
+  }%
+  \smc@dima=\dimexpr\ht0+\dp0\relax
+  \psscaleboxto(#1,\the\smc@dima){%
+    \unhbox0
+  }%
+  \ignorespaces
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@makechapterhead}
+% La commande de chapitre est à reprendre entièrement en ce qui
+% concerne la mise en page. On gardera tout le mécanisme de la
+% commande |\chapter| même si tout ne servira pas vraiment et c'est la
+% commande |\@makechapterhead| qui va être redéfinie.
+%    \begin{macrocode}
+\renewcommand*\@makechapterhead[1]{%
+%    \end{macrocode}
+% Avant de commencer, on mémorise le titre dans une variable qui
+% servira dans les pieds de page. On écrit également le titre du
+% chapitre dans le fichier de correction.
+%    \begin{macrocode}
+  \def\smc@chaptertitle{#1}%
+    \addtocontents{cor}{%
+      \protect\smc@corrigechapter{%
+        \StringChapitre{}
+        \smc@thema@initcap\the\c@chapter}
+      {\smc@chaptertitle}%
+      {\CorrigeChapterFrameColor}%
+      {\CorrigeChapterTextColor}%
+    }%
+  \begin{pspicture}(0,0)(\linewidth,\ChapterBottomPicture)
+    \psset{linewidth=0pt,linestyle=none,fillstyle=solid}
+%    \end{macrocode}
+% Cadre haut.
+%    \begin{macrocode}
+    \psframe[fillcolor=ChapterTopFrameColor]
+            (\dimexpr-\smc@bleed-\smc@marginleft,\ChapterBottomFrameHeight)
+            (\dimexpr\linewidth+\smc@marginright+\smc@bleed,
+             \ChapterTotalFrameHeight)
+%    \end{macrocode}
+% Cadre bas.
+%    \begin{macrocode}
+    \psframe[fillcolor=ChapterBottomFrameColor]
+            (\dimexpr-\smc@bleed-\smc@marginleft,0)
+            (\dimexpr\linewidth+\smc@marginright+\smc@bleed,
+            \ChapterBottomFrameHeight)
+%    \end{macrocode}
+% Cadre vert de fond du numéro de chapitre.
+%    \begin{macrocode}
+    \psframe[fillcolor=ChapterNumBkgColor]
+            (\ChapterNumLeftFrame,0)
+            (\linewidth,\ChapterTotalFrameHeight)
+%    \end{macrocode}
+% Cadre de fond du numéro de chapitre.
+%    \begin{macrocode}
+    \psframe[fillcolor=ChapterNumFrameColor]
+            (\ChapterNumLeftFrame,\ChapterNumBottomFrame)
+            (\linewidth,\ChapterNumTopFrame)
+%    \end{macrocode}
+% Carrés dégradés.
+%    \begin{macrocode}
+    \smc@antidiagonal(\ChapterNumLeftFrame,\ChapterNumBottomFrame)
+                     {ChapterNumSquare}
+%    \end{macrocode}
+% thème et numéro de chapitre.
+%    \begin{macrocode}
+    \rput[B](\dimexpr \linewidth/2+\ChapterNumLeftFrame/2,
+                       \ChapterBottomFrameHeight)
+            {\textcolor{ThemaTitleColor}
+                       {%
+                         \ChapAppFont
+                         \smc@fixwidthcenter{\ChapterTitleThemaWidth}
+                                            {\smc@themacap}%
+                       }%
+                     }
+    \rput[B](\dimexpr \linewidth/2+\ChapterNumLeftFrame/2,
+                       \ChapterNumBase)
+            {\textcolor{ChapterNumColor}
+                       {\ChapterNumFont \thechapter}}
+%    \end{macrocode}
+% Titre du chapitre.
+%    \begin{macrocode}
+    \rput[Bl](0,\ChapterTitleBase){%
+      \begin{minipage}[b]{\dimexpr\ChapterNumLeftFrame-\ChapterTitleSep}
+        \ChapterTitleFont \color{ChapterTitleColor}#1%
+      \end{minipage}
+    }
+  \end{pspicture}
+%    \end{macrocode}
+% Le style de page est défini dans la macro |\chapter| comme étant le
+% style \texttt{plain}. On aurait pu redéfinir |\chapter| pour
+% modifier ce point mais autant ne pas surcharger la classe et
+% redéfinir le style de page en fin de macro d'affichage.
+%    \begin{macrocode}
+  \thispagestyle{firstchapter}
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{environment}{prerecquis}
+% Cet environnement liste les connaissances antérieures nécessaires au
+% chapitre en cours.
+% 
+% Pour un livre de seconde, ce sera les \og Connaissances du collège
+% nécessaires à ce chapitre \fg{} mais ce titre étant susceptible de
+% varier, on le passe en paramètre à l'environnement. Pour faciliter
+% la vie de l'utilisateur, on le fournit sous forme d'un argument
+% optionnel, la valeur par défaut étant contenu dans la macro
+% |\StringPrerequis|. Pour commencer, cette macro est
+% initialisée avec le titre pour les secondes mais on pourra prévoir
+% un mécanisme plus général où il suffira d'indiquer le niveau du
+% livre en début de compilation.
+%
+% L'environnement |prerequis| compose son contenu en sans empattement,
+% dans un cadre bleu en deux colonnes.
+%    \begin{macrocode}
+\newenvironment{prerequis}[1][\StringPrerequis]
+{%
+%    \end{macrocode}
+% Si la première page de chapitre doit être calibrée pour faire
+% effectivement une seule page, alors, pour l'instant, je place un
+% ressort vertical infini entre chaque élément de la page.
+%    \begin{macrocode}
+  \par\vspace*{\stretch{1}}
+%    \end{macrocode}
+% Redéfinition locale des listes et autres.
+%    \begin{macrocode}
+  \let\itemize\smc@prerequisitemize
+  \let\enditemize\endsmc@prerequisitemize
+  \let\colitemize\smc@prerequiscolitemize
+  \let\endcolitemize\endsmc@prerequiscolitemize
+  \let\enumerate\smc@prerequisenumerate
+  \let\endenumerate\endsmc@prerequisenumerate
+  \let\colenumerate\smc@prerequiscolenumerate
+  \let\endcolenumerate\endsmc@prerequiscolenumerate
+  \let\partie\smc@nopartie
+  \let\exercice\smc@noexercice
+  \let\endexercice\endsmc@noexercice
+  \let\corrige\smc@nocorrige
+  \let\endcorrige\endsmc@nocorrige
+  \def\smc@currpart{Prerequis}%
+%    \end{macrocode}
+% Titre du prérequis.
+%    \begin{macrocode}
+  {%
+    \PrerequisTitleFont
+    \textcolor{PrerequisTitleColor}{#1}%
+    \par\vspace{\PrerequisTitleVSpace}%
+  }%
+%    \end{macrocode}
+% Avant d'appeler l'environnement de cadre, on explicite l'espace vide
+% entre le bord du cadre et le texte.
+%    \begin{macrocode}
+  \edef\FrameSep{\SquareWidth}%
+  \smc@cadre{PrerequisBkgColor}
+%    \end{macrocode}
+% L'environnement \environ{multicols} ajoute un espace vertical
+% au-dessus. Ce n'est pas lié à la longueur |\multicolsep| qui n'a
+% visiblement pas d'action à l'intérieur d'un environnement
+% \environ{minipage}. Pour équilibrer la présentation il faut placer
+% un saut négatif ad hoc.
+%    \begin{macrocode}
+    \vspace*{-4.5pt}
+    \begin{multicols}{2}
+      \PrerequisTextFont
+}
+{%
+    \end{multicols}%
+  \endsmc@cadre
+  \par
+}
+%    \end{macrocode}
+% \end{environment}
+% \begin{environment}{autoeval}
+% L'environnement \environ{autoeval} gère la partie \og
+% Auto-évaluation \fg{} de la première page de chapitre. Celle-ci se
+% compose d'un cartouche avec le titre (immuable ?) \og
+% Auto-évaluation \fg{} puis d'un cadre avec l'énoncé des exercices
+% comprenant (en bas à droite ?) un cartouche indiquant la page de
+% correction.
+%
+% L'environnement \environ{autoeval} ne demande aucun paramètre.
+%    \begin{macrocode}
+\newenvironment{autoeval}
+{%
+%    \end{macrocode}
+% On commence par placer une balise dans le fichier de correction
+%    \begin{macrocode}
+  \addtocontents{cor}{\protect\smc@corrigeautoeval}%
+%    \end{macrocode}
+% Comme pour l'environnement précédent, on équilibre les blancs
+% verticaux de la page.
+%    \begin{macrocode}
+  \par\vspace{\stretch{1}}
+%    \end{macrocode}
+% Le cartouche de titre peut être affiché avant de connaître le
+% contenu de l'environnement. On le fait donc dans la partie
+% initiale. Pour obtenir une hauteur de exactement 3 diamètres de
+% disque et une largeur de |\AETitleWidth|, on va tricher en demandant
+% une séparation nulle avec le texte et une construction de texte
+% ayant exactement les dimensions voulues. On va également tricher sur
+% la largeur d'empagement puisque l'environnement |cadre| est
+% normalement prévu pour des cadres occupant tout cet empagement.
+%    \begin{macrocode}
+  \begingroup
+    \linewidth=\AETitleWidth
+    \def\FrameSep{0pt}%
+    \edef\FrameArc{\the\dimexpr \SquareWidth/2}%
+    \def\FrameLineWidth{0pt}%
+    \begin{smc@cadre}[0,0,10,10]{AETitleFrame1Color}%
+      \minipage[b][\AETitleHeight]{\AETitleWidth}%
+        \begin{pspicture}(0,0)(\dimexpr\SquareWidth*3,\dimexpr\SquareWidth*2)
+          \smc@rounddiagonal(0mm,0mm){AETitleFrame}%
+        \end{pspicture}%
+        \hspace*{\stretch{1}}%
+        \AETitleFont
+        \raisebox{\dimexpr\SquareWidth*3/4}{\textcolor{AETitleColor}{\StringAE}}%
+        \hspace*{\stretch{1}}%
+      \endminipage
+    \end{smc@cadre}
+  \endgroup
+%    \end{macrocode}
+% On affiche ensuite le texte de référence au site manuel.sesamath.net
+%    \begin{macrocode}
+  \hspace*{\stretch{1}}%
+  \begin{minipage}[b]{\AEManuelWidth}
+    \raggedright
+    \AEManuelFont
+    \StringManuel
+    \par\vspace*{\AfterAEManuelVSpace}
+  \end{minipage}%
+%    \end{macrocode}
+% On affiche enfin  le logo.
+%    \begin{macrocode}
+  \hspace{\AEManuelRightSpace}%
+  \raisebox{\AfterAEManuelVSpace}
+           {\psscaleboxto(\AELogoManuelWidth,0){\LogoManuel}}%
+  \\[-1pt]
+%    \end{macrocode}
+% On redéfinit les listes et la macro d'exercice.
+%    \begin{macrocode}
+  \let\itemize\smc@AEitemize
+  \let\enditemize\endsmc@AEitemize
+  \let\colitemize\smc@AEcolitemize
+  \let\endcolitemize\endsmc@AEcolitemize
+  \let\enumerate\smc@AEenumerate
+  \let\endenumerate\endsmc@AEenumerate
+  \let\colenumerate\smc@AEcolenumerate
+  \let\endcolenumerate\endsmc@AEcolenumerate
+  \let\partie\smc@nopartie
+  \let\exercice\smc@AEexercice
+  \let\endexercice\endsmc@AEexercice
+  \let\corrige\smc@AEcorrige
+  \let\endcorrige\endsmc@AEcorrige
+  \def\smc@currpart{AE}%
+%    \end{macrocode}
+% On peut alors mémoriser l'intérieur de l'environnement. On utilise
+% une minipage de la largeur d'empagement moins |\AEFrameHSep*2|
+%    \begin{macrocode}
+  \begin{lrbox}{\smc@boxa}
+    \minipage[b]{\dimexpr\linewidth-\AEFrameHSep*2}%
+    \ignorespaces
+}
+{%
+%    \end{macrocode}
+% En fin d'environnement, on ferme la minipage et la lrbox. Avant
+% cela, on ajoute un espace vertical pour placer le cartouche de la
+% correction.
+%    \begin{macrocode}
+      \par
+      \vspace*{\dimexpr\AECartoucheCorrSep+\AECartoucheCorrHeight-\SquareWidth}
+      \hspace*{\stretch{1}}%
+    \endminipage
+  \end{lrbox}%
+%    \end{macrocode}
+% On va alors afficher la boîte dans un cadre.
+%    \begin{macrocode}
+  \psframebox[framesep=\the\dimexpr\AEFrameHSep-\AEFrameRuleWidth,
+    linewidth=\AEFrameRuleWidth, linecolor=AEFrameColor]{\box\smc@boxa}%
+%    \end{macrocode}
+% Le point de référence est alors positionné sur le coin inférieur
+% droit du cadre. On va placer le cartouche en revenant en arrière. On
+% va également tricher sur la hauteur pour que le cartouche se place à
+% l'intérieur du cadre.
+%    \begin{macrocode}
+  \hspace*{-\AECartoucheCorrWidth}%
+  \raisebox{-\SquareWidth}{%
+    \begin{pspicture}(0,0)(\AECartoucheCorrWidth,0)
+      \psframe*[linecolor=AECartoucheCorrBkgColor,
+                cornersize=absolute, linearc=\dimexpr\SquareWidth/2]
+               (0,0)(\AECartoucheCorrWidth,\AECartoucheCorrHeight)
+      \psframe*[linecolor=AECartoucheCorrBkgColor]
+               (0,0)(\AECartoucheCorrWidth,3mm)
+      \psframe*[linecolor=AECartoucheCorrBkgColor]
+               (3mm,0)(\AECartoucheCorrWidth,\AECartoucheCorrHeight)
+      \rput(\dimexpr\AECartoucheCorrWidth/2,\dimexpr\AECartoucheCorrHeight/2)
+      {%
+%    \end{macrocode}
+% Affichage du texte du cartouche de correction.
+%    \begin{macrocode}
+        \AECartoucheCorrArrowFont
+        \textcolor{AECartoucheCorrArrowColor}
+                  {\ding{228}\ding{228}\ding{228}}
+        \AECartoucheCorrVCPFont
+        \textcolor{AECartoucheCorrVCPColor}
+                  {\StringVoirCorriges\space\pageref{toutes-solutions}}%
+      }%
+    \end{pspicture}%
+  }%
+}
+%    \end{macrocode}
+% On définit maintenant l'environnement exercice pour
+% l'auto-évaluation.
+%    \begin{macrocode}
+\newcounter{AEexo}[chapter]
+\newenvironment{smc@AEexercice}{%
+  \par
+  \refstepcounter{AEexo}%
+%    \end{macrocode}
+% On place un cadre avec le numéro d'exercice dedans. Et c'est tout !
+%    \begin{macrocode}
+  \psframebox*[linestyle=none, linewidth=0pt,
+               fillcolor=AEExoNumFrameColor, framesep=\AEExoFrameTopSep]{%
+    \hbox to\dimexpr\AEExoFrameWidth-\AEExoFrameTopSep*2{%
+      \hss
+      \AEExoNumFont
+      \textcolor{AEExoNumColor}{\theAEexo}%
+      \hss
+    }%
+  }%
+  \hspace{\AfterAEExoFrameHSpace}%
+  \ignorespaces
+}
+%    \end{macrocode}
+% Pour l'instant, il n'y a rien à faire de spécial pour le code
+% final. Uniquement un saut de paragraphe.
+%    \begin{macrocode}
+{\par}
+%    \end{macrocode}
+% \end{environment}
+% \subsection{Activités}
+% \begin{macro}{\activites}
+% Cette macro introduit la partie \og Activités d'approche \fg{} dans
+% un chapitre. Elle interdit l'utilisation des listes et des macros
+% |\exercice|, |\correction| et |\partie| en dehors des environnements.
+%    \begin{macrocode}
+\newcommand*\activites{%
+  \clearpage
+  \pagestyle{activites}
+  \addtocontents{cor}{\protect\smc@corrigeactivite}%
+  \let\itemize\smc@noitemize
+  \let\enditemize\endsmc@noitemize
+  \let\colitemize\smc@nocolitemize
+  \let\endcolitemize\endsmc@nocolitemize
+  \let\enumerate\smc@noenumerate
+  \let\endenumerate\endsmc@noenumerate
+  \let\colenumerate\smc@nocolenumerate
+  \let\endcolenumerate\endsmc@nocolenumerate
+  \let\exercice\smc@noexercice
+  \let\correction\smc@nocorrection
+  \let\partie\smc@activite@partie
+  \let\exercice\smc@noexercice
+  \let\endexercice\endsmc@noexercice
+  \let\corrige\smc@activitecorrige
+  \let\endcorrige\endsmc@activitecorrige
+  \def\smc@currpart{Activite}%
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\DeclareActivityLike}
+% Les environnements d'activités d'approche propose au moins deux
+% types d'activités qui partagent le même aspect général. On les
+% déclare avec la macro |\DeclareActivityLike|. Celle-ci demande
+% quatre arguments :
+% \begin{enumerate}
+% \item le nom de l'environnement ;
+% \item le titre affiché ;
+% \item la couleur de la partie supérieure du cartouche ;
+% \item la couleur de la partie inférieure du cartouche ;
+% \item la couleur du titre et du losange de numéro.
+% \end{enumerate}
+%    \begin{macrocode}
+\newcounter{activite}[chapter]
+\newcounter{partie}[activite]
+\newcommand*\DeclareActivityLike[5]{%
+%    \end{macrocode}
+% Les environnements ont un argument optionnel pour le titre et un
+% deuxième pour le logo. On est donc obligé de les définir avec des
+% macros au lieu d'environnements.
+%    \begin{macrocode}
+  \expandafter\newcommand\csname#1\endcsname[1][]{%
+%    \end{macrocode}
+% On sauvegarde le titre et on appelle la macro auxiliaire pour le
+% deuxième paramètre optionnel.
+%    \begin{macrocode}
+    \def\smc@activite@title{##1}%
+    \csname#1@aux\endcsname
+  }%
+  \expandafter\newcommand\csname#1@aux\endcsname[1][]{%
+%    \end{macrocode}
+% L'environnement commence par placer un espacement vertical avant de
+% composer son titre et son sous-titre.
+%    \begin{macrocode}
+    \par
+    \addvspace{\BeforeActiviteVSpace}
+    \refstepcounter{activite}
+%    \end{macrocode}
+% On commence avec le titre. Pour pouvoir le composer correctement, il
+% va d'abord falloir le mettre dans une boîte.
+%    \begin{macrocode}
+    \setbox\smc@boxa=\hbox{%
+      \ActiviteTitleFont
+      #2%
+    }%
+%    \end{macrocode}
+% On peut maintenant composer réellement le titre en tenant commpte de
+% la longueur |\wd\smc@boxa|. On réalise le cartouche en faisant
+% croire que la frontière entre le cadre du bas et celui du haut est
+% la ligne de base. Le calcul de la largeur compte également la
+% diagonale d'un carré de côté |\ActiviteTitleTopHeight|, c'est-à-dire
+% cette longueur multipliée par $\sqrt{2}\approx1.4142$.
+%    \begin{macrocode}
+    \begin{pspicture}(0,0)
+      (\dimexpr \ActiviteTitleLeftSpace+\wd\smc@boxa+\ActiviteTitleRightSpace+1.4142\ActiviteTitleTopHeight,\ActiviteTitleTopHeight)
+%    \end{macrocode}
+% On commence par afficher les deux parties du fond. La largeur est ce
+% qui a été calculé pour l'image complète sauf qu'on ne prend qu'une
+% demi-diagonale au lieu d'une diagonale entière.
+%    \begin{macrocode}
+      \psframe*[linewidth=0, linecolor= #3]
+        (0,0)(\dimexpr\ActiviteTitleLeftSpace+\wd\smc@boxa+\ActiviteTitleRightSpace+0.7071\ActiviteTitleTopHeight,
+              \ActiviteTitleTopHeight)
+%    \end{macrocode}
+% Même chose pour la partie du bas en sachant qu'elle déborde de la
+% boîte englobante.
+%    \begin{macrocode}
+      \psframe*[linewidth=0, linecolor= #4]
+        (0,0)(\dimexpr\ActiviteTitleLeftSpace+\wd\smc@boxa+\ActiviteTitleRightSpace+0.7071\ActiviteTitleTopHeight,
+              -\ActiviteTitleBottomHeight)
+%    \end{macrocode}
+% On peut maintenant placer le titre.
+%    \begin{macrocode}
+      \rput[l](\ActiviteTitleLeftSpace,
+               0.5\dimexpr\ActiviteTitleTopHeight-\ActiviteTitleBottomHeight){%
+        \ActiviteTitleFont
+        \textcolor{#5}{#2}%
+      }
+%    \end{macrocode}
+% Il reste à placer la carré avec le numéro d'activité. Le carré est
+% placé verticalement au centre du cartouche. On place également le
+% numéro de l'activité.
+%    \begin{macrocode}
+      \rput
+        (\dimexpr\ActiviteTitleLeftSpace+\wd\smc@boxa+\ActiviteTitleRightSpace,
+         0.5\dimexpr\ActiviteTitleTopHeight-\ActiviteTitleBottomHeight)
+      {%
+        \pspolygon*[linewidth=0, linecolor=#5]
+          (0,0)
+          (0.7071\ActiviteTitleTopHeight,0.7071\ActiviteTitleTopHeight)
+          (1.4142\ActiviteTitleTopHeight,0)
+          (0.7071\ActiviteTitleTopHeight,-0.7071\ActiviteTitleTopHeight)
+        \rput(0.7071\ActiviteTitleTopHeight,0){%
+          \ActiviteNumFont
+          \textcolor{ActiviteNumColor}{\theactivite}%
+        }
+      }
+    \end{pspicture}%
+%    \end{macrocode}
+% Le cartouche est totalement réalisé. On va maintenant afficher le
+% sous-titre. Ce n'est pas la peine de tester si il est vide : on ne
+% modifie rien s'il y a ou non un sous titre.
+%    \begin{macrocode}
+    \hspace*{\AfterActiviteTitleHSpace}%
+%    \end{macrocode}
+% Pour permettre un titre sur plusieurs lignes, on place le sous-titre
+% dans une minipage dont la largeur doit être égale au reste de
+% l'empagement qui existe à ce moment précis, c'est-à-dire la largeur
+% du cartouche plus l'espace qu'on vient de placer auquel il faut
+% soustraire l'espace du à un éventuel logo. C'est pour cela qu'on
+% commence par tester la présence d'un tel élément.
+%    \begin{macrocode}
+    \@ifmtarg{##1}
+      {\setbox0=\hbox{}}
+      {\setbox0=\hbox{##1\ }}%
+    \minipage[t]{\dimexpr\linewidth-\ActiviteTitleLeftSpace-\wd\smc@boxa-\ActiviteTitleRightSpace-1.4142\ActiviteTitleTopHeight-\AfterActiviteTitleHSpace-\wd0}
+      \ActiviteSubtitleFont
+      \textcolor{ActiviteSubtitleColor}{\smc@activite@title}%
+    \endminipage
+    \@ifnotmtarg{##1}{\hfill##1}%
+    \par\vspace{\AfterActiviteTitleVSpace}
+%    \end{macrocode}
+% On règle les listes pour les activités.
+%    \begin{macrocode}
+    \let\itemize\smc@activiteitemize
+    \let\enditemize\endsmc@activiteitemize
+    \let\colitemize\smc@activitecolitemize
+    \let\endcolitemize\endsmc@activitecolitemize
+    \let\enumerate\smc@activiteenumerate
+    \let\endenumerate\endsmc@activiteenumerate
+    \let\colenumerate\smc@activitecolenumerate
+    \let\endcolenumerate\endsmc@activitecolenumerate
+    \let\partie\smc@activite@partie
+    \let\exercice\smc@noexercice
+    \let\endexercice\endsmc@noexercice
+    \let\corrige\smc@nocorrige
+    \let\endcorrige\endsmc@nocorrige
+    \def\smc@currpart{Activite}%
+%    \end{macrocode}
+% On peut maintenant composer le contenu de l'environnement. Celui-ci
+% sera placé dans un empagement réduit.
+%    \begin{macrocode}
+    \begin{changemargin}{\dimexpr\SquareWidth*4}{\ExtraMarginRight}
+  }%
+%    \end{macrocode}
+% Le code terminal est défini par la macro |\end<nom de base>|.
+% Attention, comme le nom commence par |\end|, on ne peut pas utiliser
+% |\newcommand|.
+%    \begin{macrocode}
+  \expandafter\def\csname end#1\endcsname{%
+    \end{changemargin}
+  }%
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{environment}{debat}
+% On va maintenant utiliser la macro |\DeclareActivityLike| pour créer
+% l'environnement |debat|. Il y a juste à préciser le nom de
+% l'environnement, le titre, la couleur du haut du cartouche et la
+% couleur du bas du cartouche.
+%    \begin{macrocode}
+\DeclareActivityLike{debat}{\StringDEBAT}
+                    {ActiviteDebatTopColor}
+                    {ActiviteDebatBottomColor}
+                    {ActiviteTitleColor}
+%    \end{macrocode}
+% \end{environment}
+% \begin{environment}{activite}
+% On procède de la même façon pour l'environnement |activite|.
+%    \begin{macrocode}
+\DeclareActivityLike{activite}{\StringACTIVITE}
+                    {ActiviteActiviteTopColor}
+                    {ActiviteActiviteBottomColor}
+                    {ActiviteTitleColor}
+%    \end{macrocode}
+% \end{environment}
+% \subsection{Cours}
+% \begin{macro}{\cours}
+% Cette macro introduit la partie \og Cours - Méthodes \fg{} dans un
+% chapitre. Elle interdit l'utilisation des listes et des macros
+% |\exercice|, |\correction| et |\partie| en dehors des environnements.
+%    \begin{macrocode}
+\newcommand*\cours{%
+  \clearpage
+  \pagestyle{cours}
+  \let\itemize\smc@noitemize
+  \let\enditemize\endsmc@noitemize
+  \let\colitemize\smc@nocolitemize
+  \let\endcolitemize\endsmc@nocolitemize
+  \let\enumerate\smc@noenumerate
+  \let\endenumerate\endsmc@noenumerate
+  \let\colenumerate\smc@nocolenumerate
+  \let\endcolenumerate\endsmc@nocolenumerate
+  \let\exercice\smc@noexercice
+  \let\endexercice\endsmc@noexercice
+  \let\corrige\smc@nocorrige
+  \let\endcorrige\endsmc@nocorrige
+  \let\correction\smc@nocorrection
+  \let\partie\smc@nopartie
+  \def\smc@currpart{Cours}%
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\section}
+% Les macros de sectionnement vont garder leur nom habituel. On
+% gardera également la syntaxe avec l'argument optionnel et l'étoile
+% mais cette dernière ne servira strictement à rien ! Le numéro de
+% section ne fait pas référence au numéro de chapitre.
+%    \begin{macrocode}
+\renewcommand\thesection{\arabic{section}}
+\renewcommand*\section{\@ifstar{\smc@sec}{\smc@sec}}
+\newcommand*\smc@sec[2][]{%
+%    \end{macrocode}
+% On commence par regarder si l'argument optionnel est vide. Si oui,
+% le titre court sera égal au titre long.
+%    \begin{macrocode}
+  \ifx\relax#1\relax
+    \smc@@sec{#2}{#2}%
+  \else
+    \smc@@sec{#1}{#2}%
+  \fi
+}
+%    \end{macrocode}
+% À ce stade, on a un titre court en premier argument et un titre long
+% en deuxième argument. Le travail effectif peut commencer.
+%    \begin{macrocode}
+\newcommand*\smc@@sec[2]{%
+  \par\goodbreak\addvspace{\BeforeSectionVSpace}%
+  \refstepcounter{section}%
+%    \end{macrocode}
+% Le titre court sera éventuellement utilisé pour une TDM. Ce sera à
+% voir plus tard.
+%    \begin{macrocode}
+  \relax
+%    \end{macrocode}
+% On compose ensuite le numéro et le titre de la section. On commence
+% avec le numéro composé dans un environnement |pspicture| avec un
+% décalage vers la bas pour aligner les lignes de base du numéro avec
+% celui de la première ligne du titre.
+%
+% L'ensemble du titre est placé dans une boîte pour pouvoir régler sa
+% hauteur ultérieurement : la boîte crée est trop haute sur la ligne
+% de base.
+%    \begin{macrocode}
+  \setbox\smc@boxa=\hbox{%
+    \begin{pspicture}[shift=-\SquareWidth]
+                     (0,0)(\dimexpr\SquareWidth*3,\dimexpr\SquareWidth*3)
+      \psframe*[linecolor=SectionFrame1Color,linewidth=0pt]
+               (0,0)(\dimexpr\SquareWidth*3,\dimexpr\SquareWidth*3)
+      \psframe*[linecolor=SectionFrame2Color,linewidth=0pt]
+               (0,0)(\SquareWidth,\dimexpr\SquareWidth*3)
+      \psframe*[linecolor=SectionFrame2Color,linewidth=0pt]
+               (0,0)(\dimexpr\SquareWidth*3,\SquareWidth)
+      \psframe*[linecolor=SectionFrame3Color,linewidth=0pt]
+               (0,0)(\SquareWidth,\SquareWidth)
+      \rput[Br](\dimexpr\SquareWidth*3,\SquareWidth){%
+        \SectionNumFont
+        \textcolor{SectionNumColor}{\thesection}%
+%    \end{macrocode}
+% Pour le point, on passe à la fonte de titre ou on garde la fonte du
+% numéro (en fonction du choix de fontes) pour avoir un point carré
+% comme ceux présents sur les \og i \fg{}. Il y a également une
+% correction horizontale pour que le point soit exactement sur la
+% frontière droite du cadre. Cette correction est sensible aux fontes
+% utilisées.
+%    \begin{macrocode}
+        \SectionNumFont
+        \textcolor{SectionNumColor}{.}%
+        \hspace*{\SectionCorrectionChassePoint}%
+      }
+    \end{pspicture}%
+%    \end{macrocode}
+% On affiche le titre après un certain décalage horizontal. Le titre
+% sera placé dans une minipage alilgné en haut pour que ce soit la
+% première ligne du titre qui soit alignée avec le numéro.
+%    \begin{macrocode}
+    \hspace{\SectionNumTitleHSpace}%
+    \begin{minipage}[t]{\dimexpr\linewidth-\SectionNumTitleHSpace-\SquareWidth*3}
+      \SectionTitleFont
+      \textcolor{SectionTitleColor}{#2}%
+    \end{minipage}%
+  }%
+%    \end{macrocode}
+% Avant d'afficher le contenu de la boîte |\smc@boxa|, on diminue sa
+% hauteur afin de l'afficher avec sa ligne de base correctement
+% placé. La longueur |\BeforeSectionVSpace| corrigera ce manque.
+%    \begin{macrocode}
+  \smc@dima=\dimexpr \ht\smc@boxa-\SquareWidth
+  \ht\smc@boxa \smc@dima
+  \leavevmode\box\smc@boxa
+%    \end{macrocode}
+% On termine en plaçant un espacement vertical donné et une
+% interdiction de coupe. Il n'y a pas besoin de s'occuper du retrait
+% d'alinéa puisqu'il n'y en a pas !
+%    \begin{macrocode}
+  \par\nobreak\addvspace{\AfterSectionVSpace}
+}
+%    \end{macrocode}
+% On définit également la commande |\smc@normalsection| pour permettre
+% de restaurer les sections \og normales \fg{} avec la commande
+% |\RestoreSection|.
+%    \begin{macrocode}
+\let\smc@normalsection\section
+\newcommand*\RestoreSection{\let\section\smc@normalsection}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\subsection}
+% La syntaxe est la même que pour |\section|. La composition du titre
+% est bien plus simple. On gardera quand même la possibilité d'avoir
+% un titre sur plusieurs lignes en l'alignant à gauche avec un retrait
+% tenant compte de celui de la lettre
+%    \begin{macrocode}
+\renewcommand{\thesubsection}{\Alph{subsection}}
+\renewcommand\subsection{\@ifstar{\smc@subsec}{\smc@subsec}}
+\newcommand*\smc@subsec[2][]{%
+  \ifx\relax#1\relax
+    \smc@@subsec{#2}{#2}%
+  \else
+    \smc@@subsec{#1}{#2}%
+  \fi
+}
+\newcommand*\smc@@subsec[2]{%
+%    \end{macrocode}
+% On teste si le dernier saut était celui d'une section. Si oui, on
+% garde un espace insécable sinon, on réalise un saut avec une
+% préférence pour la coupure de page.
+%    \begin{macrocode}
+  \ifdim\lastskip=\AfterSectionVSpace
+  \par\nobreak
+  \else
+  \par\goodbreak\addvspace{\BeforeSubsectionVSpace}
+  \fi
+  \refstepcounter{subsection}%
+%    \end{macrocode}
+% Le titre court sera éventuellement utilisé pour une TDM. Ce sera à
+% voir plus tard.
+%    \begin{macrocode}
+  \relax
+%    \end{macrocode}
+% On compose ensuite le numéro et le titre de la section. On commence
+% avec le numéro composé dans une boîte pour en connaître la largeur.
+%    \begin{macrocode}
+  \setbox\smc@boxa=\hbox{%
+    \SubsectionNumFont
+    \textcolor{SubsectionNumColor}{\thesubsection.~}%
+  }%
+%    \end{macrocode}
+% On affiche alors la boîte (sans la détruire et on compose le titre
+% dans une minipage de largeur l'empagement moins la largeur du numéro.
+%    \begin{macrocode}
+  \leavevmode\copy\smc@boxa
+  \begin{minipage}[t]{\dimexpr\linewidth-\wd\smc@boxa}
+    \SubsectionTitleFont
+    \textcolor{SubsectionTitleColor}{#2}%
+  \end{minipage}
+  \par\nobreak\addvspace{\AfterSubsectionVSpace}
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\subsubsection}
+% La classe n'accepte pas les commandes de sectionnement à partir de
+% ce niveau ni la commande |\part|. On redéfinit ces commandes pour
+% qu'elles déclenchent une erreur de compilation.
+%    \begin{macrocode}
+\newcommand*\smc@error@section[1]{%
+  \ClassError{sesamanuel}{La commande \string#1 n'existe pas}{Les seules
+    commandes disponibles sont \string\chapter\space
+    \string\section\space et \string\subsection.}%
+}
+\renewcommand\part{%
+  \@ifstar{\smc@part}{\smc@part}%
+}
+\newcommand\smc@part[2][]{%
+  \smc@error@section{\part}%
+}
+\renewcommand\subsubsection{%
+  \@ifstar{\smc@subsubsection}{\smc@subsubsection}%
+}
+\newcommand\smc@subsubsection[2][]{%
+  \smc@error@section{\subsubsection}%
+}
+\renewcommand\paragraph{%
+  \@ifstar{\smc@paragraph}{\smc@paragraph}%
+}
+\newcommand\smc@paragraph[2][]{%
+  \smc@error@section{\paragraph}%
+}
+\renewcommand\subparagraph{%
+  \@ifstar{\smc@subparagraph}{\smc@subparagraph}%
+}
+\newcommand\smc@subparagraph[2][]{%
+  \smc@error@section{\subparagraph}%
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\DeclareDefLike}
+% Les cadres de type définition vont partager la même façon de se
+% faire composer et la même syntaxe d'appel :
+% \begin{center}
+%   |\begin{def}[sous-titre]|
+% \end{center}
+% où |sous-titre| est un sous-titre optionnel.
+%
+% On les déclare avec la macro |\DeclareDefLike| en donnant dans
+% l'ordre le nom de l'environnement et le mot à afficher comme titre.
+%    \begin{macrocode}
+\newcommand*\DeclareDefLike[2]{%
+  \newenvironment{#1}[1][]{%
+    \par\addvspace{\BeforeDefVSpace}
+%    \end{macrocode}
+% On redéfinit les listes avant de composer quoi que ce soit.
+%    \begin{macrocode}
+    \let\itemize\smc@defitemize
+    \let\enditemize\endsmc@defitemize
+    \let\colitemize\smc@defcolitemize
+    \let\endcolitemize\endsmc@defcolitemize
+    \let\enumerate\smc@defenumerate
+    \let\endenumerate\endsmc@defenumerate
+    \let\colenumerate\smc@defcolenumerate
+    \let\endcolenumerate\endsmc@defcolenumerate
+    \let\partie\smc@nopartie
+    \let\exercice\smc@noexercice
+    \let\endexercice\endsmc@noexercice
+    \let\corrige\smc@nocorrige
+    \let\endcorrige\endsmc@nocorrige
+    \def\smc@currpart{#1}%
+%    \end{macrocode}
+% Le carré est composé avec un retrait de 2|\SquareWidth| pour que son
+% côté droit soit aligné avec celui des sections.
+%    \begin{macrocode}
+    \hspace*{\dimexpr\SquareWidth*2}%
+    \textcolor{DefSquareColor}{\rule{\SquareWidth}{\SquareWidth}}%
+    \space
+%    \end{macrocode}
+% Après le carré, on affiche le titre de l'environnement. Celui qui a
+% été passé en deuxième argument de |\DeclareDefLike|.
+%    \begin{macrocode}
+%    \end{macrocode}
+% S'il y a un argument optionnel, c'est-à-dire un sous-titre, on
+% compoosera un caractère deux points à la suite du titre suivi du
+% sous titre sinon, le titre sans les deux points.
+%    \begin{macrocode}
+    \ifx\relax##1\relax
+      {%
+        \DefTitleFont
+        \textcolor{DefTitleColor}{#2}%
+      }%
+    \else
+      {%
+        \DefTitleFont
+        \textcolor{DefTitleColor}{#2 : }%
+      }%
+      {%
+        \DefSubtitleFont
+        \textcolor{DefSubtitleColor}{##1}%
+      }%
+    \fi
+    \par\nobreak\addvspace{\DefTitleFrameVSep}
+%    \end{macrocode}
+% La ligne de titre est maintenant composée, il reste à composer
+% l'intérieur du cadre. Le texte est sauvegardé dans une minipage dont
+% la largeur tient compte des retraits gauche
+% (3|\SquareWidth|+|\DefFrameHSep|) et droit
+% (|\ExtraMarginRight|+|\DefFrameHSep|). Il y a aussi un
+% |\ignorespaces| pour supprimer l'espace automatique créé après le
+% |\begin{definition}|.
+%    \begin{macrocode}
+    \begin{lrbox}{\smc@boxa}
+      \minipage{\dimexpr\linewidth-\SquareWidth*3-\DefFrameHSep*2-\ExtraMarginRight}
+        \par\vspace{\DefFrameVSep}
+        \ignorespaces
+  }
+%    \end{macrocode}
+% Partie terminale de l'environnement. On commence par placer l'espace
+% vertical adéquat puis on ferme la minipage et la boîte.
+%    \begin{macrocode}
+  {%
+        \par\vspace{\DefFrameVSep}
+      \endminipage
+    \end{lrbox}
+%    \end{macrocode}
+% Le contenu de l'environnement est sauvegardé dans la boîte
+% |\smc@boxa|, il reste à la placer avec les espacements corrects dans
+% le cadre coloré. Pour controler les espaces pour chaque côté du
+% cadre, on annule les espacements globaux avant d'utiliser la
+% commande |\colorbox|.
+%    \begin{macrocode}
+    {%
+      \setlength{\fboxsep}{0pt}%
+      \hspace*{\dimexpr\SquareWidth*3}%
+      \colorbox{DefFrameColor}{%
+        \hspace*{\DefFrameHSep}%
+        \usebox{\smc@boxa}%
+        \hspace*{\DefFrameHSep}%
+      }
+    }%
+    \par
+  }
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{environment}{definition}
+% On se sert maintenant de la macro |\DeclareDefLike| pour déclarer
+% l'environnement de définition.
+%    \begin{macrocode}
+\DeclareDefLike{definition}{\StringDEFINITION}
+%    \end{macrocode}
+% \end{environment}
+% \begin{environment}{propriete}
+% L'environnement |propriete| suit les mêmes règles que |definition|
+%    \begin{macrocode}
+\DeclareDefLike{propriete}{\StringPROPRIETE}
+%    \end{macrocode}
+% \end{environment}
+% \begin{environment}{theoreme}
+% L'environnement |theoreme|.
+%    \begin{macrocode}
+\DeclareDefLike{theoreme}{\StringTHEOREME}
+%    \end{macrocode}
+% \end{environment}
+% \begin{macro}{\DeclareRemLike}
+% La déclaration des environnements de type remarque se fait comme
+% pour les environnements de type définition. C'est le contenu de
+% l'environnement qui n'est pas du tout le même.
+%    \begin{macrocode}
+\newcommand*\DeclareRemLike[2]{%
+%    \end{macrocode}
+% Cela commence dès le début où il n'y a pas de paramètre optionnel,
+% le texte pouvant commencer directement après le titre. En fait, les
+% choses sont beaucoup plus simples : l'environnement fait que
+% l'ensemble du texte traité l'est dans un empagement réduit (y
+% compris le titre). Il s'agit du même empagement que celui des
+% définitions d'où le même calcul de largeur de la minipage et le même
+% retrait initial.
+%    \begin{macrocode}
+  \newenvironment{#1}{%
+    \par\addvspace{\BeforeRemVSpace}
+    \hspace*{\dimexpr\SquareWidth*3+\DefFrameHSep}%
+%    \end{macrocode}
+% On redéfinit aussi les listes avant d'appeler la minipage.
+%    \begin{macrocode}
+    \let\itemize\smc@remitemize
+    \let\enditemize\endsmc@remitemize
+    \let\colitemize\smc@remcolitemize
+    \let\endcolitemize\endsmc@remcolitemize
+    \let\enumerate\smc@remenumerate
+    \let\endenumerate\endsmc@remenumerate
+    \let\colenumerate\smc@remcolenumerate
+    \let\endcolenumerate\endsmc@remcolenumerate
+    \let\partie\smc@nopartie
+    \let\exercice\smc@noexercice
+    \let\endexercice\endsmc@noexercice
+    \let\corrige\smc@nocorrige
+    \let\endcorrige\endsmc@nocorrige
+    \def\smc@currpart{#1}%
+    \minipage{\dimexpr\linewidth-\SquareWidth*3-\DefFrameHSep*2-\ExtraMarginRight}
+      \strut
+      {\RemTitleFont \textcolor{RemTitleColor}{#2 : }}%
+      \ignorespaces
+  }
+%    \end{macrocode}
+% La partie terminale de l'environnement ferme la minipage et passe au
+% paragraphe suivant.
+%    \begin{macrocode}
+  {%
+    \endminipage
+    \par\addvspace{\AfterRemVSpace}
+  }
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{environment}{remarque}
+% On se sert maintenant de la macro |\DeclareRemLike| pour créer les
+% environnements de type remarque.
+%    \begin{macrocode}
+\DeclareRemLike{remarque}{Remarque}
+%    \end{macrocode}
+% \end{environment}
+% \begin{environment}{remarques}
+%    \begin{macrocode}
+\DeclareRemLike{remarques}{Remarques}
+%    \end{macrocode}
+% \end{environment}
+% \begin{environment}{notation}
+%    \begin{macrocode}
+\DeclareRemLike{notation}{Notation}
+%    \end{macrocode}
+% \end{environment}
+% \begin{environment}{notations}
+%    \begin{macrocode}
+\DeclareRemLike{notations}{Notations}
+%    \end{macrocode}
+% \end{environment}
+% \begin{environment}{vocabulaire}
+%    \begin{macrocode}
+\DeclareRemLike{vocabulaire}{Vocabulaire}
+%    \end{macrocode}
+% \end{environment}
+% \begin{macro}{\DeclareProofLike}
+% On a également des environnements de type |preuve| qui seront créés
+% par la macro |\DeclareProofLike|. Le premier argument est le nom de
+% l'environnement et le deuxième et le titre.
+%    \begin{macrocode}
+\newcommand*\DeclareProofLike[2]{%
+  \newenvironment{#1}
+  {%
+%    \end{macrocode}
+% Au début, on place un espacement vertical puis un espacement
+% horizontal; le filet et un autre espacement horizontal.
+%    \begin{macrocode}
+    \par\addvspace{\BeforeProofVSpace}
+    \hspace*{\dimexpr\SquareWidth*3}%
+    {% 
+      \color{ProofRuleColor}%
+      \vrule width \RuleWidth
+    }
+    \hspace*{\dimexpr \SquareWidth-\RuleWidth}%
+%    \end{macrocode}
+% On redéfinit aussi les listes avant d'appeler la minipage.
+%    \begin{macrocode}
+    \let\itemize\smc@proofitemize
+    \let\enditemize\endsmc@proofitemize
+    \let\colitemize\smc@proofcolitemize
+    \let\endcolitemize\endsmc@proofcolitemize
+    \let\enumerate\smc@proofenumerate
+    \let\endenumerate\endsmc@proofenumerate
+    \let\colenumerate\smc@proofcolenumerate
+    \let\endcolenumerate\endsmc@proofcolenumerate
+    \let\partie\smc@nopartie
+    \let\exercice\smc@noexercice
+    \let\endexercice\endsmc@noexercice
+    \let\corrige\smc@nocorrige
+    \let\endcorrige\endsmc@nocorrige
+    \def\smc@currpart{#1}%
+    \minipage{\dimexpr\linewidth-\SquareWidth*4-\ExtraMarginRight}
+%    \end{macrocode}
+% Le titre est placé dans un boîte avec les espacements adéquat afin
+% de pouvoir le placer sur le cartouche adéquat au niveau de la
+% largeur.
+%    \begin{macrocode}
+      \setbox\smc@boxa=\hbox{%
+        \hspace*{\dimexpr\ProofHeightFrame+\ProofLeftSpace}%
+        \ProofTitleFont
+        \textcolor{ProofTitleColor}{#2}%
+        \hspace*{\ProofRightSpace}%
+      }%
+%    \end{macrocode}
+% Maintenant que le titre complet est dans une boîte, on peut
+% construire le cartouche suivi d'une espace.
+%    \begin{macrocode}
+      \begin{pspicture}(0,0)(\wd\smc@boxa,\ProofHeightFrame)
+        \psframe*[linestyle=none,linecolor=ProofBottomFrameColor]
+                 (0,-\ProofDepthFrame)(\wd\smc@boxa,0)
+        \psframe*[linestyle=none,linecolor=ProofTopFrameColor]
+                 (0,0)(\wd\smc@boxa,\ProofHeightFrame)
+        \pspolygon*[linestyle=none,linecolor=ProofTriangleFrameColor]
+                 (0,0)(0,\ProofHeightFrame)(\ProofHeightFrame,\ProofHeightFrame)
+        \rput[Bl](\dimexpr\ProofHeightFrame+\ProofLeftSpace,0){%
+          \ProofTitleFont
+          \textcolor{ProofTitleColor}{#2}%
+        }
+      \end{pspicture}%
+      \hspace{\AfterProofTitleHSpace}%
+      \ignorespaces
+  }
+%    \end{macrocode}
+% La partie terminale de l'environnement ferme la minipage et passe au
+% paragraphe suivant.
+%    \begin{macrocode}
+  {%
+    \endminipage
+    \par\addvspace{\AfterProofVSpace}
+  }
+}
+%    \end{macrocode} 
+% \end{macro}
+% \begin{environment}{preuve}
+% On utilise la macro précédente pour déclarer l'environnement
+% |preuve|.
+%    \begin{macrocode}
+\DeclareProofLike{preuve}{\StringPREUVE}
+%    \end{macrocode}
+% \end{environment}
+% \begin{environment}{exemple}
+% Comme il y a plusieurs environnements de type exemple, on va
+% regrouper dans des macros séparés les parties communes. À savoir les
+% affichages des cartouches.
+%    \begin{macrocode}
+\newcommand*\smc@cartoucheexemple{%
+  \begin{pspicture}(-\ExempleVRuleWidthFrame,0)
+                 (\ExempleWidthFrame,\ExempleHeightFrame)
+    \psframe*[linewidth=0pt,linecolor=ExempleEdgeFrameColor]
+             (-\ExempleVRuleWidthFrame,-\ExempleHRuleWidthFrame)
+             (\ExempleWidthFrame,\ExempleHeightFrame)
+    \psframe*[linewidth=0pt,linecolor=ExempleBkgFrameColor]
+             (0mm,-0mm)(\ExempleWidthFrame,\ExempleHeightFrame)
+    \rput[B](\dimexpr\ExempleWidthFrame/2,0){%
+      \ExempleTitleFont
+      \textcolor{ExempleTitleColor}{\StringExemple}%
+    }
+  \end{pspicture}%
+}
+\newcommand*\smc@cartouchecorrection{%
+  \begin{pspicture}(-\ExempleVRuleWidthFrame,0)
+                   (\ExempleWidthFrame,\ExempleHeightFrame)
+    \psframe*[linewidth=0pt,linecolor=ExempleEdgeFrameColor]
+             (-\ExempleVRuleWidthFrame,-\ExempleHRuleWidthFrame)
+             (\ExempleWidthFrame,\ExempleHeightFrame)
+    \psframe*[linewidth=0pt,linecolor=ExempleBkgFrameColor]
+             (0mm,-0mm)(\ExempleWidthFrame,\ExempleHeightFrame)
+    \rput[B](\dimexpr\ExempleWidthFrame/2,0){%
+      \ExempleTitleFont
+      \textcolor{ExempleTitleColor}{\StringCorrection}%
+    }
+  \end{pspicture}%
+}
+%    \end{macrocode}
+% Le premier environnement de type exemple compose un exemple et sa
+% correction dans deux colonnes. La syntaxe est :
+%
+% |\begin{exemple}[ratio]|\\
+% \quad texte de l'exemple\\
+% |\correction|\\
+% \quad texte de la correction\\
+% |\end{exemple}|
+%
+% où |ratio| est un argument optionnel indiquant la proportion de la
+% largeur disponible réservée au texte d'énoncé (valeur par défaut de
+% 0,4 correspondant au $\frac{2}{5}$ de la place.
+%
+% On commence par placer le bon espacement vertical et à initialiser
+% la macro |\correction| valable pour cet environnement.
+%    \begin{macrocode}
+\newenvironment{exemple}[1][0.4]{%
+  \par\addvspace{\BeforeExempleVSpace}
+  \let\correction\smc@exemplecorrection
+%    \end{macrocode}
+% On redéfinit ensuite la liste à puce.
+%    \begin{macrocode}
+  \let\itemize\smc@exempleitemize
+  \let\enditemize\endsmc@exempleitemize
+  \let\colitemize\smc@exemplecolitemize
+  \let\endcolitemize\endsmc@exemplecolitemize
+  \let\enumerate\smc@exempleenumerate
+  \let\endenumerate\endsmc@exempleenumerate
+  \let\colenumerate\smc@exemplecolenumerate
+  \let\endcolenumerate\endsmc@exemplecolenumerate
+  \let\exercice\smc@noexercice
+  \let\endexercice\endsmc@noexercice
+  \let\corrige\smc@nocorrige
+  \let\endcorrige\endsmc@nocorrige
+  \def\smc@currpart{Exemple}%
+  \let\partie\smc@nopartie
+%    \end{macrocode}
+% Enfin, on mémorise la valeur du ratio.
+%    \begin{macrocode}
+  \def\smc@ratio{#1}%
+%    \end{macrocode}
+% On doit afficher dans l'ordre :
+% \begin{itemize}
+% \item un espace de 3|\SquareWidth| ;
+% \item un filet vertical avec un espace le tout faisant
+% |\SquareWidth| de large ;
+% \item le texte de l'exemple ;
+% \item un espace de |\SquareWidth| ;
+% \item un filet vertical avec un espace le tout faisant
+% |\SquareWidth| de large ;
+% \item le texte de la correction.
+% \end{itemize}
+%    \begin{macrocode}
+  \hspace*{\dimexpr \SquareWidth*3}%
+  \color{ExempleRuleColor}%
+  \vrule width \RuleWidth
+  \hspace*{\dimexpr \SquareWidth-\RuleWidth}%
+%    \end{macrocode}
+% Le texte de l'exemple fait |\smc@ratio| de l'espace a disposition,
+% les $(1-|\smc@ratio|)$ restant étant pour la correction. La largeur
+% à se partager fait |\linewidth|-6|\SquareWidth|. Les deux minipages
+% sont alignées sur le haut.
+%    \begin{macrocode}
+  \minipage[t]{\smc@ratio\dimexpr\linewidth-\SquareWidth*6}
+%    \end{macrocode}
+% Dans la colonne d'exemple, on commence par placer le mot \og exemple
+% \fg{} avec son cadre.
+%    \begin{macrocode}
+    \smc@cartoucheexemple
+    \par
+    \color{Noir}%
+    \ignorespaces
+}
+{%
+  \endminipage
+  \par
+}
+%    \end{macrocode}
+% \end{environment}
+% \begin{environment}{exemple*1}
+% Le deuxième environnement de type exemple permet une composition sur
+% une seule colonne.
+%
+% Le début du code est identique à celui de l'environnement
+% |exemple|. On indiquera les différences. On laisse un argument
+% optionnel mais celui-ci est inutile.
+%    \begin{macrocode}
+\newenvironment{exemple*1}[1][]{%
+  \par\addvspace{\BeforeExempleVSpace}
+%    \end{macrocode}
+% La macro |\correction| appelle une autre macro.
+%    \begin{macrocode}
+  \let\correction\smc@one@exemplecorrection
+  \let\itemize\smc@exempleitemize
+  \let\enditemize\endsmc@exempleitemize
+  \let\colitemize\smc@exemplecolitemize
+  \let\endcolitemize\endsmc@exemplecolitemize
+  \let\enumerate\smc@exempleenumerate
+  \let\endenumerate\endsmc@exempleenumerate
+  \let\colenumerate\smc@exemplecolenumerate
+  \let\endcolenumerate\endsmc@exemplecolenumerate
+  \let\partie\smc@nopartie
+  \let\exercice\smc@noexercice
+  \let\endexercice\endsmc@noexercice
+  \let\corrige\smc@nocorrige
+  \let\endcorrige\endsmc@nocorrige
+  \def\smc@currpart{Exemple}%
+%    \end{macrocode}
+% On ne mémorise pas la valeur de l'argument optionnel puisqu'il n'y a
+% plus de répartition entre deux colonnes.
+%    \begin{macrocode}
+  \hspace*{\dimexpr \SquareWidth*3}%
+  \color{ExempleRuleColor}%
+  \vrule width \RuleWidth
+  \hspace*{\dimexpr \SquareWidth-\RuleWidth}%
+%    \end{macrocode}
+% La composition se fait dans une minipage qui prend l'empagement
+% réduit moins |\SquareWidth*4|.
+%    \begin{macrocode}
+  \minipage[t]{\dimexpr\linewidth-\SquareWidth*4-\ExtraMarginRight}
+    \smc@cartoucheexemple
+%    \end{macrocode}
+% Dans l'exemple sur une colonne, on permet au texte de suivre
+% immédiatement le cartouche.
+%    \begin{macrocode}
+    \space
+    \color{Noir}%
+    \ignorespaces
+}
+{%
+  \strut
+  \endminipage
+  \par
+}
+%    \end{macrocode}
+% \end{environment}
+% Pour que les environnements d'exemples soient complets, il faut
+% également la macro |\correction|. Or, celle-ci sera appelée dans
+% plusieurs environnements, il faut donc en déclarer \og plusieurs
+% \fg{}. On commence avec celle qui est interdite (en-dehors des
+% environnements).
+%    \begin{macrocode}
+\newcommand*\smc@nocorrection{%
+  \ClassError{sesamanuel}{Vous ne pouvez pas utilisez la macro
+    \string\correction\space ici}{Reportez-vous à la documentation
+    pour l'utilisation de la macro \string\correction.}%
+}
+%    \end{macrocode}
+% Vient ensuite la macro pour l'environnement d'exemple sur deux
+% colonnes. Elle reprend le code de l'environnement exemple mais en
+% donnant $(1-|\smc@ratio|)$ de l'espace à la deuxième colonne au lieu
+% de |\smc@ratio| ce qui oblige à un peu plus de travail.
+%    \begin{macrocode}
+\newcommand*\smc@exemplecorrection{%
+  \endminipage
+  \hspace{\SquareWidth}%
+  \color{ExempleRuleColor}%
+  \vrule width \RuleWidth
+  \hspace*{\dimexpr \SquareWidth-\RuleWidth}%
+  \dimen0=\dimexpr\linewidth-\SquareWidth*6
+  \minipage[t]{\dimen0-\smc@ratio\dimen0}%
+    \smc@cartouchecorrection
+    \par
+    \color{Noir}%
+    \ignorespaces
+}
+%    \end{macrocode}
+% On a ensuite la macro pour l'environnement d'exemple sur une seule
+% colonne. Le code est beaucoup plus simple puisqu'il consiste à
+% passer au paragraphe suivant et à afficher le cartouche de
+% correction.
+%    \begin{macrocode}
+\newcommand*\smc@one@exemplecorrection{%
+  \par
+  \smc@cartouchecorrection
+  \space
+}
+%    \end{macrocode}
+% \begin{environment}{methode}
+% Il y a quatre environnements methodes. Le premier compose un seul
+% exercice d'application avec sa correction un peu comme on composait
+% l'exemple avec sa correction sur deux colonnes. Le deuxième compose
+% l'exemple et sa correction sur une seule colonne. Le troisième
+% compose deux exercices et leurs corrections sur deux colonnes. Le
+% troisième compose autant d'exercices et de correction que l'on veut
+% sur une véritable double colonne.
+%
+% Ces quatre environnements partagent la façon d'afficher un grand
+% filet épais à gauche avec le titre \og MÉTHODE \fg{} suivi d'un
+% éventuel sous-titre, ainsi que les cartouches \og Exercice
+% d'application \fg{} et \og Correction \fg{}. On commence par définir
+% tous ces éléments communs.
+%
+% Le premier est le titre. Il permet un paramètre optionnel donnant le
+% sous-titre. Ce titre a besoin d'un compteur. Ce dernier est
+% initialisé à chaque chapitre.
+%    \begin{macrocode}
+\newcounter{methode}[chapter]
+\newcommand*\smc@titremethode[1][]{%
+%    \end{macrocode}
+% On écrit le titre dans le fichier de liste des méthodes
+% correspondant au thème en cours.
+%    \begin{macrocode}
+  \smc@addtolom{#1}%
+%    \end{macrocode}
+% On incrémente ensuite le compteur des méthodes avant de construire
+% le titre proprement dit.
+%    \begin{macrocode}
+  \refstepcounter{methode}%
+  {%
+    \setlength{\fboxsep}{0pt}%
+    \colorbox{MethodeTitleFrameColor}{%
+      \hspace*{\MethodeTitleLeftSpace}%
+      \textcolor{MethodeTitleColor}{%
+        \MethodeTitleFont
+        \vrule width0pt height\ht\strutbox depth 1pt
+        \StringMETHODE\space \themethode
+      }%
+      \hspace*{\MethodeTitleRightSpace}%
+    }%
+  }%
+  \ifx\relax#1\relax
+  \else
+    \hspace{\MethodeSubtitleLeftSpace}%
+    \textcolor{MethodeSubtitleColor}{\MethodeSubtitleFont #1}%
+  \fi
+  \par\vspace{\AfterMethodeTitleVspace}
+}
+%    \end{macrocode}
+% La macro qui suit permet de composer \og Exercice d'application
+% \fg{} dans son cartouche.
+%    \begin{macrocode}
+\newcommand*\smc@cartoucheexapp{%
+  \begin{pspicture}(0,-\ExAppDepthFrame)
+                   (\ExAppWidthFrame,\ExAppHeightFrame)
+    \psframe*[linewidth=0pt,linecolor=ExAppEdgeFrameColor]
+             (0,-\ExAppDepthFrame)
+             (\ExAppWidthFrame,\ExAppHeightFrame)
+    \psframe*[linewidth=0pt,linecolor=ExAppBkgFrameColor]
+             (0mm,-0mm)(\ExAppWidthFrame,\ExAppHeightFrame)
+    \rput[B](\dimexpr\ExAppWidthFrame/2,0){%
+      \ExAppTitleFont
+      \textcolor{ExAppTitleColor}{\StringExApp}%
+    }
+  \end{pspicture}%
+}
+%    \end{macrocode}
+% On a presque la même chose pour le cartouche \og Correction \fg{}.
+%    \begin{macrocode}
+\newcommand*\smc@cartouchecorr{%
+  \begin{pspicture}(0,-\ExAppCorrDepthFrame)
+                   (\ExAppCorrWidthFrame,\ExAppCorrHeightFrame)
+    \psframe*[linewidth=0pt,linecolor=ExAppCorrEdgeFrameColor]
+             (0,-\ExAppCorrDepthFrame)
+             (\ExAppCorrWidthFrame,\ExAppCorrHeightFrame)
+    \psframe*[linewidth=0pt,linecolor=ExAppCorrBkgFrameColor]
+             (0mm,-0mm)(\ExAppCorrWidthFrame,\ExAppCorrHeightFrame)
+    \rput[B](\dimexpr\ExAppCorrWidthFrame/2,0){%
+      \ExAppCorrTitleFont
+      \textcolor{ExAppCorrTitleColor}{\StringCorrection}%
+    }
+  \end{pspicture}%
+}
+%    \end{macrocode}
+% On peut maintenant écrire le code des quatre environnements
+% méthode. L'environnement donnant un seul exemple avec sa correction
+% en vis à vis s'appelle |methode| et sa syntaxe est :\\
+% |\begin{methode}[sous-titre]|\\
+% \quad texte introductif dans le cadre bleu\\
+% |\exercice|\\
+% \quad texte de l'exercice d'application\\
+% |\correction|\\
+% \quad texte de la correction\\
+% |\end{methode}|
+%
+% On commence par placer l'espace avant le bloc et à redéfinir les
+% macros |\exercice| et |\correction| ainsi que la liste à puce.
+%    \begin{macrocode}
+\newenvironment{methode}[1][]{%
+  \par\addvspace{\BeforeMethodeVSpace}
+  \let\itemize\smc@exappitemize
+  \let\enditemize\endsmc@exappitemize
+  \let\colitemize\smc@exappcolitemize
+  \let\endcolitemize\endsmc@exappcolitemize
+  \let\enumerate\smc@exappenumerate
+  \let\endenumerate\endsmc@exappenumerate
+  \let\colenumerate\smc@exappcolenumerate
+  \let\endcolenumerate\endsmc@exappcolenumerate
+  \let\partie\smc@nopartie
+  \let\exercice\smc@exappexercice
+  \let\correction\smc@exappcorrection
+  \let\corrige\smc@nocorrige
+  \let\endcorrige\endsmc@nocorrige
+  \def\smc@currpart{Methode}%
+%    \end{macrocode}
+% On doit afficher dans l'ordre :
+% \begin{itemize}
+% \item un espacement horizontal ;
+% \item le grand filet gauche ;
+% \item un espacement horizontal ;
+% \item une grande minipage qui contiendra tout, à savoir :
+%   \begin{itemize}
+%   \item le titre en le décalant suffisament sur la gauche pour qu'il
+%     écrase le filet gauche,
+%   \item un saut de ligne,
+%   \item un cadre bleu qui touche au filet gauche avec un texte sur
+%   un empagement réduit,
+%   \item une minipage de 1/3 de la place restante hors espacement et
+%     filet, c'est-à-dire empagement - 6|\SquareWidth|-|\RuleWidth|,
+%   \item un espacement horizontal de |\SquareWidth|,
+%   \item un filet vertical de |\RuleWidth| d'épaisseur,
+%   \item un espacement horizontal de |\SquareWidth|,
+%   \item une minipage de 2/3 de la place restante hors espacement et
+%     filet.
+%   \end{itemize}
+% \end{itemize}
+%
+% On commence par l'espace à gauche et le filet gauche principal
+%    \begin{macrocode}
+  \hspace*{\dimexpr\SquareWidth*2}%
+  {%
+    \color{MethodeRuleColor}%
+    \vrule width \SquareWidth
+  }%
+%    \end{macrocode}
+% Ensuite, on place l'espace et la minipage qui contient tout.
+%    \begin{macrocode}
+  \hspace{\SquareWidth}%
+  \minipage{\dimexpr\linewidth-\SquareWidth*4}%
+%    \end{macrocode}
+% Affichage du titre (avec son sous-titre éventuel).
+%    \begin{macrocode}
+    \hspace*{\dimexpr-\SquareWidth*2}%
+    \smc@titremethode[#1]%
+    \par
+%    \end{macrocode}
+% À partir de maintenant, il faut tenir compte du contenu de
+% l'environnement. Le premier contenu est, potentiellement, le texte
+% introductif. Pour tester sa présence ou non, on le place dans une
+% boîte qu'on analysera plus tard.
+%    \begin{macrocode}
+    \begin{lrbox}{\smc@boxa}%
+      \minipage{\dimexpr\linewidth-\SquareWidth*5-\MethodeFrameHSep*2}%
+        \ignorespaces
+}
+%    \end{macrocode}
+% En partie terminale, on a uniquement à fermer la dernière minipage
+% ouverte ainsi que la minipage principale et à passer au paragraphe suivant.
+%    \begin{macrocode}
+{%
+      \endminipage
+    \endminipage
+  \par
+}
+%    \end{macrocode}
+% On définit la macro |\exercice| réelle pour cet environnement. Elle
+% accepte un argument optionnel indiquant la proportion de
+% l'empagement occupé par cette partie.
+%    \begin{macrocode}
+\newcommand*\smc@exappexercice[1][0.4]{%
+    \endminipage
+  \end{lrbox}%
+  \def\smc@ratio{#1}%
+%    \end{macrocode}
+% Il faut détecter si la boîte est vide. Pour cela, on va se fonder
+% sur sa hauteur et sa profondeur. Les valeurs pour un texte
+% totalement vide sont respectivement |2.375pt| et |0pt|. Le
+% test se fera sur une hauteur totale de plus de |2.4pt|.
+%    \begin{macrocode}
+  \ifdim\dimexpr\ht\smc@boxa+\dp\smc@boxa > 2.4pt
+%    \end{macrocode}
+% On est dans le cas où il y a une partie introductive. On  va placer
+% le tout dans un |\colorbox| en ayant pris soin de contrôler
+% totalement les espacements. Les marges gauche et droite de la boîte
+% sont assurés par des |\hspace*|. Les marges haute et basse par une
+% manipulation des dimensions de la boîte
+%    \begin{macrocode}
+    {%
+      \setlength{\fboxsep}{0pt}%
+      \ht\smc@boxa=\dimexpr\ht\smc@boxa+\MethodeFrameTopSep
+      \dp\smc@boxa=\dimexpr\dp\smc@boxa+\MethodeFrameBottomSep
+      \hspace*{-\SquareWidth}%
+      \colorbox{MethodeIntroBkgFrameColor}{%
+        \hspace*{\MethodeFrameHSep}%
+        \usebox{\smc@boxa}%
+        \hspace*{\MethodeFrameHSep}%
+      }%
+      \par\vspace{5mm}
+    }%
+  \fi
+%    \end{macrocode}
+% On ouvre maintenant la minipage pour l'exercice d'application. Avant
+% de regarder son contenu, on place le cartouche. La largeur de la
+% minipage est de 0.4 (par défaut) de la place restante. Comme on est
+% dans une minipage, cela donne
+% |(\linewidth-2*\SquareWidth-\RuleWidth)*\smc@ratio|
+%    \begin{macrocode}
+  \minipage[t]{\smc@ratio\dimexpr\linewidth-\SquareWidth*2-\RuleWidth}%
+  \smc@cartoucheexapp
+  \par
+}
+%    \end{macrocode}
+% On définit la macro |\correction| réelle pour cet
+% environnement. Elle commence à fermer la minipage précédemment
+% ouverte avant de passer à la ligne et d'ouvrir sa propre
+% minipage. Entre les deux minipages, il y a les espacements et le
+% filet.
+%    \begin{macrocode}
+\newcommand*\smc@exappcorrection{%
+  \endminipage
+  \hspace{\SquareWidth}%
+  {%
+    \color{MethodeRuleColor}%
+    \vrule width \RuleWidth
+  }%
+  \hspace{\SquareWidth}%
+%    \end{macrocode}
+% La largeur de la minipage est la même que celle pour l'énoncé de
+% l'exercice sauf que c'est |1-\smc@ratio| au lieu de |\smc@ratio|. Cela
+% oblige à un calcul externe.
+%    \begin{macrocode}
+  \dimen0=\dimexpr\linewidth-\SquareWidth*2-\RuleWidth
+  \minipage[t]{\dimen0-\smc@ratio\dimen0}%
+  \smc@cartouchecorr
+  \par
+}
+%    \end{macrocode}
+% \end{environment}
+% \begin{environment}{methode*1}
+% Le deuxième environnement méthode fonctionne comme le premier mais
+% compose les exercices et les corrections sur une seule colonne. La
+% syntaxe de cet environnement est :\\
+% |\begin{methode*1}[sous-titre]|\\
+% \quad texte introductif dans le cadre bleu\\
+% |\exercice|\\
+% \quad texte de l'exercice d'application\\
+% |\correction|\\
+% \quad texte de la correction\\
+% |\end{methode*1}|\\
+% En sachant qu'en fait, on peut répéter autant de fois que l'on veut
+% les exercices et le corrections.
+%    \begin{macrocode}
+\newenvironment{methode*1}[1][]{%
+  \par\addvspace{\BeforeMethodeVSpace}
+%    \end{macrocode}
+% Seules les deux lignes suivantes diffèrent.
+%    \begin{macrocode}
+  \let\itemize\smc@exappitemize
+  \let\enditemize\endsmc@exappitemize
+  \let\colitemize\smc@exappcolitemize
+  \let\endcolitemize\endsmc@exappcolitemize
+  \let\enumerate\smc@exappenumerate
+  \let\endenumerate\endsmc@exappenumerate
+  \let\colenumerate\smc@exappcolenumerate
+  \let\endcolenumerate\endsmc@exappcolenumerate
+  \let\partie\smc@nopartie
+  \let\exercice\smc@one@exappexercice
+  \let\correction\smc@one@exappcorrection
+  \let\corrige\smc@nocorrige
+  \let\endcorrige\endsmc@nocorrige
+  \def\smc@currpart{Methode}%
+  \hspace*{\dimexpr\SquareWidth*2}%
+  {%
+    \color{MethodeRuleColor}%
+    \vrule width \SquareWidth
+  }%
+  \hspace{\SquareWidth}%
+  \minipage{\dimexpr\linewidth-\SquareWidth*4}%
+  \hspace*{\dimexpr-\SquareWidth*2}%
+  \smc@titremethode[#1]%
+  \par
+  \begin{lrbox}{\smc@boxa}%
+    \minipage{\dimexpr\linewidth-\SquareWidth*5-\MethodeFrameHSep*2}%
+    \ignorespaces
+}
+{%
+  \end{changemargin}
+  \endminipage
+  \par
+}
+%    \end{macrocode}
+% On définit maintenant les macros qui deviendront les macros
+% |\exercice| et |\correction| de l'environnement |methode*1|.
+%
+% On commence par le code de |\exercice|.  Le début du code est
+% similaire à celui de |\smc@exappexercice|, on indiquera uniquement
+% les différences. Cela commence immédiatement avec une absence de
+% paramètre optionnel puisqu'il n'y a qu'une seule colonne. En
+% réalité, on acceptera un argument optionnel sans utilité (cela
+% pourra servir lors de copier-coller).
+%    \begin{macrocode}
+\newcommand*\smc@one@exappexercice[1][]{%
+    \endminipage
+  \end{lrbox}%
+  \ifdim\dimexpr\ht\smc@boxa+\dp\smc@boxa > 2.4pt
+    {%
+      \setlength{\fboxsep}{0pt}%
+      \ht\smc@boxa=\dimexpr\ht\smc@boxa+\MethodeFrameTopSep
+      \dp\smc@boxa=\dimexpr\dp\smc@boxa+\MethodeFrameBottomSep
+      \hspace*{-\SquareWidth}%
+      \colorbox{MethodeIntroBkgFrameColor}{%
+        \hspace*{\MethodeFrameHSep}%
+        \usebox{\smc@boxa}%
+        \hspace*{\MethodeFrameHSep}%
+      }%
+      \par\vspace{5mm}
+    }%
+  \fi
+%    \end{macrocode}
+% On redéfinit la macro |\exercice| pour permettre plusieurs exercices
+% dans le même environnement.
+%    \begin{macrocode}
+  \let\exercice\smc@one@@exappexercice
+%    \end{macrocode}
+% Le code est maintenant beaucoup plus simple : il n'y a pas de début
+% de minipage. On ne fait que composer le cartouche avec son espace
+% après. Cela dit on doit revenir à une composition dans un empagement
+% réduit.
+%    \begin{macrocode}
+  \begin{changemargin}{0mm}{\dimexpr\ExtraMarginRight}%
+  \smc@cartoucheexapp
+  \hspace{\AfterCartoucheHSpace}%
+}
+%    \end{macrocode}
+% Le code pour |\correction| est encore plus simple, il faut juste
+% passer au paragraphe suivant et afficher le cartouche avec son
+% espace après.
+%    \begin{macrocode}
+\newcommand*\smc@one@exappcorrection{%
+  \par\vspace{\AfterExAppMethodeVSpace}
+  \smc@cartouchecorr
+  \hspace{\AfterCartoucheHSpace}%
+}
+%    \end{macrocode}
+% Les autres exercices sont comme |\correction| : très simples !
+%    \begin{macrocode}
+\newcommand\smc@one@@exappexercice[1][]{%
+  \par\vspace{\AfterExAppMethodeVSpace}
+  \smc@cartoucheexapp
+  \hspace{\AfterCartoucheHSpace}%
+}
+%    \end{macrocode}
+% \end{environment}
+% \begin{environment}{methode*2*2}
+% Le troisième environnement méthode fonctionne comme les deux
+% premiers mais compose deux exercices d'application avec leurs
+% corrections sur deux colonnes séparées par un filet aussi large que
+% le filet gauche.
+%
+% La syntaxe de cet environnement est :\\
+% |\begin{methode*2*2}[sous-titre]|\\
+% \quad texte introductif dans le cadre bleu\\
+% |\exercice|\\
+% \quad texte du 1\ier{} exercice d'application\\
+% |\correction|\\
+% \quad texte de la 1\iere{} correction\\
+% |\exercice|\\
+% \quad texte du 2\ieme{} exercice d'application\\
+% |\correction|\\
+% \quad texte de la 2\ieme{} correction\\
+% |\end{methode*2}|
+%
+% Le code est quasiment identique à l'environnement |methode|, seule
+% les assignations des macros |\exercice| et |\correction| sont
+% différentes.
+%    \begin{macrocode}
+\newenvironment{methode*2*2}[1][]{%
+  \par\addvspace{\BeforeMethodeVSpace}
+%    \end{macrocode}
+% Les deux lignes suivantes sont la seule différence (appels de
+% |\smc@@xxx| au lieu de |\smc@xxx|).
+%    \begin{macrocode}
+  \let\itemize\smc@exappitemize
+  \let\enditemize\endsmc@exappitemize
+  \let\colitemize\smc@exappcolitemize
+  \let\endcolitemize\endsmc@exappcolitemize
+  \let\enumerate\smc@exappenumerate
+  \let\endenumerate\endsmc@exappenumerate
+  \let\colenumerate\smc@exappcolenumerate
+  \let\endcolenumerate\endsmc@exappcolenumerate
+  \let\partie\smc@nopartie
+  \let\exercice\smc@@exappexercice
+  \let\correction\smc@@exappcorrection
+  \let\corrige\smc@nocorrige
+  \let\endcorrige\endsmc@nocorrige
+  \def\smc@currpart{Methode}%
+  \hspace*{\dimexpr\SquareWidth*2}%
+  {%
+    \color{MethodeRuleColor}%
+    \vrule width \SquareWidth
+  }%
+  \hspace{\SquareWidth}%
+  \minipage{\dimexpr\linewidth-\SquareWidth*4}%
+  \hspace*{\dimexpr-\SquareWidth*2}%
+  \smc@titremethode[#1]%
+  \par
+  \begin{lrbox}{\smc@boxa}%
+    \minipage{\dimexpr\linewidth-\SquareWidth*5-\MethodeFrameHSep*2}%
+    \ignorespaces
+}
+{%
+  \endminipage
+  \endminipage
+  \par
+}
+%    \end{macrocode}
+% Il faut maintenant indiquer le code des macros qui deviendront les
+% |\exercice| et |\correction| de l'environnement |methode*2*2|.
+%
+% On commence par le code de |\exercice|.  Le code est très similaire
+% à celui de |\smc@exappexercice|, on indiquera uniquement les
+% différences. Cela commence immédiatement avec la valeur par défaut
+% de la proportion de l'empagement pris : ce sera 0.5.
+%    \begin{macrocode}
+\newcommand*\smc@@exappexercice[1][0.5]{%
+    \endminipage
+  \end{lrbox}%
+  \def\smc@ratio{#1}%
+  \ifdim\dimexpr\ht\smc@boxa+\dp\smc@boxa > 2.4pt
+    {%
+      \setlength{\fboxsep}{0pt}%
+      \ht\smc@boxa=\dimexpr\ht\smc@boxa+\MethodeFrameTopSep
+      \dp\smc@boxa=\dimexpr\dp\smc@boxa+\MethodeFrameBottomSep
+      \hspace*{-\SquareWidth}%
+      \colorbox{MethodeIntroBkgFrameColor}{%
+        \hspace*{\MethodeFrameHSep}%
+        \usebox{\smc@boxa}%
+        \hspace*{\MethodeFrameHSep}%
+      }%
+      \par\vspace{5mm}
+    }%
+  \fi
+%    \end{macrocode}
+% La différence la plus importante et que le prochain appel de
+% |\exercice| n'aura pas du tout le même rôle et pour cela, on modifie
+% la signification de cette macro.
+%    \begin{macrocode}
+  \let\exercice\smc@@@exappexercice
+%    \end{macrocode}
+% La largeur de la minipage n'est pas calculée exactement de la même
+% façon et il n'y a pas de saut de paragraphe après le cartouche
+% (seulement un espace).
+%    \begin{macrocode}
+  \minipage[t]{\smc@ratio\dimexpr\linewidth-\SquareWidth*3}%
+  \smc@cartoucheexapp
+  \hspace{\AfterCartoucheHSpace}%
+}
+%    \end{macrocode}
+% La macro de correction est beaucoup plus simple (encore que là
+% aussi, il va falloir en prévoir deux). Elle ne fait que passer à la
+% ligne, afficher le cartouche et l'espace horizontale.
+%    \begin{macrocode}
+\newcommand\smc@@exappcorrection{%
+  \par\vspace{\AfterExAppMethodeVSpace}
+  \smc@cartouchecorr
+  \hspace{\AfterCartoucheHSpace}%
+%    \end{macrocode}
+% En revanche, il faut prévoir que le prochain appel à |\correction|
+% ne sera pas identique. D'où la redéfinition suivante.
+%    \begin{macrocode}
+  \let\correction\smc@@@exappcorrection
+}
+%    \end{macrocode}
+% On arrive maintenant dans l'appel de |\exercice| au moment où on
+% commence la colonne de droite.
+%    \begin{macrocode}
+\newcommand\smc@@@exappexercice{%
+%    \end{macrocode}
+% On commence par fermer la minipage de la colonne de gauche puis à
+% placer l'espacement, le filet large et l'espacement.
+%    \begin{macrocode}
+  \endminipage
+  \hspace{\SquareWidth}%
+  {%
+    \color{MethodeRuleColor}%
+    \vrule width \SquareWidth
+  }%
+  \hspace{\SquareWidth}%
+%    \end{macrocode}
+% On peut alors ouvrir la deuxième minipage (colonne de droite). Il
+% faut calculer sa largeur avec le ratio |1-\smc@ratio|
+%    \begin{macrocode}
+  \dimen0=\dimexpr\linewidth-\SquareWidth*3
+  \minipage[t]{\dimen0-\smc@ratio\dimen0}%
+%    \end{macrocode}
+% On termine comme précédemment en affichant le cartouche et
+% l'espace.
+%    \begin{macrocode}
+  \smc@cartoucheexapp
+  \hspace{\AfterCartoucheHSpace}%
+}
+%    \end{macrocode}
+% Le code de la macro |\correction| de la deuxième colonne est
+% exactement celle de la première mais sans avoir besoin de redéfinir
+% cette macro.
+%    \begin{macrocode}
+\newcommand\smc@@@exappcorrection{%
+  \par\vspace{\AfterExAppMethodeVSpace}
+  \smc@cartouchecorr
+  \hspace{\AfterCartoucheHSpace}%
+}
+%    \end{macrocode}
+% \end{environment}
+% \begin{environment}{methode*2}
+% Le quatrième environnement méthode fonctionne comme les trois
+% premiers au niveau de la syntaxe mais compose les deux colonnes en
+% mode effectivement double colonne. C'est-à-dire que ce n'est pas le
+% début de la correction qui déterminera le début de la colonne de
+% droite.
+%
+% La syntaxe de cet environnement est :\\
+% |\begin{methode*2}[sous-titre]|\\
+% \quad texte introductif dans le cadre bleu\\
+% |\exercice|\\
+% \quad texte du 1\ier{} exercice d'application\\
+% |\correction|\\
+% \quad texte de la 1\iere{} correction\\
+% |\end{methode*2}|
+%
+% Tout le début du code ne change pas (sauf pour la définition de
+% |\exercice|.
+%    \begin{macrocode}
+\newenvironment{methode*2}[1][]{%
+  \par\addvspace{\BeforeMethodeVSpace}
+  \let\itemize\smc@exappitemize
+  \let\enditemize\endsmc@exappitemize
+  \let\colitemize\smc@exappcolitemize
+  \let\endcolitemize\endsmc@exappcolitemize
+  \let\enumerate\smc@exappenumerate
+  \let\endenumerate\endsmc@exappenumerate
+  \let\colenumerate\smc@exappcolenumerate
+  \let\endcolenumerate\endsmc@exappcolenumerate
+  \let\partie\smc@nopartie
+  \let\exercice\smc@@@@exappexercice
+%    \end{macrocode}
+% La définition précédente de |\correction| est celle qui convient ici.
+%    \begin{macrocode}
+  \let\correction\smc@@@exappcorrection
+  \let\corrige\smc@nocorrige
+  \let\endcorrige\endsmc@nocorrige
+  \def\smc@currpart{Methode}%
+  \hspace*{\dimexpr\SquareWidth*2}%
+  {%
+    \color{MethodeRuleColor}%
+    \vrule width \SquareWidth
+  }%
+  \hspace{\SquareWidth}%
+  \minipage{\dimexpr\linewidth-\SquareWidth*4}%
+  \hspace*{\dimexpr-\SquareWidth*2}%
+  \smc@titremethode[#1]%
+  \par
+  \begin{lrbox}{\smc@boxa}%
+    \minipage{\dimexpr\linewidth-\SquareWidth*5-\MethodeFrameHSep*2}%
+    \ignorespaces
+}
+{%
+%    \end{macrocode}
+% En fin d'environnement, on termine la boîte verticale.
+%    \begin{macrocode}
+  \egroup
+%    \end{macrocode}
+% On coupe cette boîte en deux boîtes de hauteur approximativement
+% égale. Et on place ces deux boîtes côte à côte après avoir restauré
+% l'empagement.
+%    \begin{macrocode}
+  \dimen0=\dimexpr (\ht\smc@boxa+\dp\smc@boxa)/2
+  \setbox\smc@boxb = \vsplit\smc@boxa to \dimen0
+%    \end{macrocode}
+% On restaure alors l'empagement et on affiche les deux boîtes côte à
+% côte.
+%    \begin{macrocode}
+  \hsize \smc@hsize
+  \linewidth \smc@linewidth
+  \usebox{\smc@boxb}
+  \hspace{\SquareWidth}%
+  {%
+    \color{MethodeRuleColor}%
+    \vrule width \RuleWidth
+  }%
+  \hspace{\SquareWidth}%
+  \usebox{\smc@boxa}
+  \endminipage
+  \par
+}
+%    \end{macrocode}
+% On définit maintenant le code pour la macro |\exercice| de
+% l'environnement |methode*1|. Le début du code sert à gérer
+% l'éventuel texte préliminaire et ne présente pas de différence avec
+% les codes des autres environnements de méthode.
+%    \begin{macrocode}
+\newcommand*\smc@@@@exappexercice{%
+    \endminipage
+  \end{lrbox}%
+  \ifdim\dimexpr\ht\smc@boxa+\dp\smc@boxa > 2.4pt
+    {%
+      \setlength{\fboxsep}{0pt}%
+      \ht\smc@boxa=\dimexpr\ht\smc@boxa+\MethodeFrameTopSep
+      \dp\smc@boxa=\dimexpr\dp\smc@boxa+\MethodeFrameBottomSep
+      \hspace*{-\SquareWidth}%
+      \colorbox{MethodeIntroBkgFrameColor}{%
+        \hspace*{\MethodeFrameHSep}%
+        \usebox{\smc@boxa}%
+        \hspace*{\MethodeFrameHSep}%
+      }%
+      \par\vspace{5mm}
+    }%
+  \fi
+%    \end{macrocode}
+% En revanche, la suite est nettement différente. Il va falloir
+% remplir une boîte verticale avec le reste du corps de
+% l'environnement (en commençant par le cartouche exercice). Cette
+% boîte verticale se construit avec un |\hsize| et |\linewidth|
+% particuliers. On sauvegarde donc leurs valeurs.
+%    \begin{macrocode}
+  \edef\smc@hsize{\the\hsize}%
+  \edef\smc@linewidth{\the\linewidth}%
+  \hsize = \dimexpr (\linewidth-\SquareWidth*3-\RuleWidth)/2
+  \linewidth = \hsize
+  \setbox\smc@boxa = \vbox\bgroup
+%    \end{macrocode}
+% On commence par placer le cartouche
+%    \begin{macrocode}
+    \smc@cartoucheexapp
+    \hspace{\AfterCartoucheHSpace}%
+}
+%    \end{macrocode}
+% \end{environment}
+% \begin{environment}{commentaire}
+% L'environnement |commentaire| permet d'avoir un texte libre ayant le
+% même empagement que le texte de définition.
+%    \begin{macrocode}
+\newenvironment{commentaire}{%
+  \let\itemize\smc@commentaireitemize
+  \let\enditemize\endsmc@commentaireitemize
+  \let\colitemize\smc@commentairecolitemize
+  \let\endcolitemize\endsmc@commentairecolitemize
+  \let\enumerate\smc@commentaireenumerate
+  \let\endenumerate\endsmc@commentaireenumerate
+  \let\colenumerate\smc@commentairecolenumerate
+  \let\endcolenumerate\endsmc@commentairecolenumerate
+  \let\exercice\smc@noexercice
+  \let\endexercice\endsmc@noexercice
+  \let\corrige\smc@nocorrige
+  \let\endcorrige\endsmc@nocorrige
+  \begin{changemargin}{\dimexpr\SquareWidth*4}
+                      {\dimexpr\ExtraMarginRight+\SquareWidth}
+}
+{\end{changemargin}}
+%    \end{macrocode}
+% \end{environment}
+% \subsection{Exercices de base}
+% \begin{macro}{\exercicesbase}
+% Cette macro introduit la partie \og Exercices de base \fg{} dans un
+% chapitre. Elle autorise l'utilisation des listes et des macros
+% |\exercice| et |\correction| en dehors de tout environnement ainsi
+% que de la macro |\partie|.
+%    \begin{macrocode}
+\newcommand*\exercicesbase{%
+  \clearpage
+  \pagestyle{exercicesbase}
+  \addtocontents{cor}{\protect\smc@corrigeexercicesbase}%
+  \let\itemize\smc@exerciceitemize
+  \let\enditemize\endsmc@exerciceitemize
+  \let\colitemize\smc@exercicecolitemize
+  \let\endcolitemize\endsmc@exercicecolitemize
+  \let\enumerate\smc@exerciceenumerate
+  \let\endenumerate\endsmc@exerciceenumerate
+  \let\colenumerate\smc@exercicecolenumerate
+  \let\endcolenumerate\endsmc@exercicecolenumerate
+  \let\exercice\smc@exobaseexercice
+  \let\endexercice\endsmc@exobaseexercice
+  \let\corrige\smc@exobasecorrige
+  \let\endcorrige\endsmc@exobasecorrige
+  \let\correction\smc@nocorrection
+  \let\partie\smc@exercice@partie
+  \def\smc@currpart{ExoBase}%
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{environment}{colonne*exercice}
+% Il faut un environnement particulier pour composer les exercices sur
+% deux colonnes. Cet environnement sera le même pour les exercices de
+% base et les exercices d'approfondissement.
+%    \begin{macrocode}
+\newenvironment{colonne*exercice}{%
+%    \end{macrocode}
+% Cet environnement ne fait que composer le matériel en double colonne
+% avec un séparation faite d'un filet vertical et de deux espacements
+% horizontaux d'un |\Squarewidth| chacun.
+%    \begin{macrocode}
+  \columnsep \dimexpr \SquareWidth*2
+  \columnseprule \RuleWidth
+  \def\columnseprulecolor{\color{ExerciceColumnRuleColor}}%
+  \begin{multicols}{2}%
+    \ignorespaces
+}
+{\end{multicols}}
+%    \end{macrocode}
+% \end{environment}
+% \begin{macro}{\serie}
+% Cette macro permet de composer un titre pour un groupement
+% d'exercices. L'argument est le titre.
+%    \begin{macrocode}
+\newcommand*\serie[1]{%
+  \par\addvspace{\BeforeExercicesTitleVSpace}
+  \begin{pspicture}(0,-\SquareWidth)
+                   (\linewidth,\dimexpr\SquareWidth*2)
+    \psframe*[linewidth=0pt,linecolor=ExercicesTitleHRuleColor]
+             (0,-\SquareWidth)(\linewidth,0)
+    \psframe*[linewidth=0pt,linecolor=ExercicesTitleVRuleColor]
+             (0,-\SquareWidth)(\SquareWidth,\dimexpr \SquareWidth*2)
+    \psframe*[linewidth=0pt,linecolor=ExercicesTitleSquareColor]
+             (0,-\SquareWidth)(\SquareWidth,0)
+    \rput[Bl](\dimexpr \SquareWidth+\ExercicesTitleHSep,
+              \ExercicesTitleVSep)
+      {\ExercicesTitleFont \textcolor{ExercicesTitleColor}{#1}}
+  \end{pspicture}%
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\exercice}
+% Chaque exercice est indiqué par la macro |\exercice|. Celle-ci admet
+% deux arguments optionnels qui donnent dans l'ordre le titre et un
+% logo pour l'exercice. Pour gérer les endroits où on peut ou non
+% utiliser la macro |\exercice|. On procède en deux temps. On définit
+% une macro |\smc@exercice| et une macro |\smc@noexercice|.
+%
+% La macro |\smc@noexercice| est très simple : elle ne fait que lever
+% une erreur.
+%    \begin{macrocode}
+\newcommand\smc@noexercice{%
+  \ClassError{sesamanuel}{Vous ne pouvez pas utiliser la macro
+    \string\exercice\space ici}{Reportez-vous à la documentation pour
+    l'utilisation de la macro \string\exercice.}
+}
+%    \end{macrocode}
+% Par défaut, ce sont les macros |\smc@noexercice| et
+% |\smc@nocorrection| qui sont actives.
+%    \begin{macrocode}
+\let\exercice\smc@noexercice
+\let\correction\smc@nocorrection
+%    \end{macrocode}
+% On définit maintenant la macro |\smc@exobaseexercice| qui indiquera la
+% façon de composer les exercices dans la partie dédiée aux
+% exercices d'entrainement.
+%
+% Cette macro a deux arguments optionnels. Le premier est le titre, le
+% second est le logo. Elle propose également une version étoilée qui
+% indique que la correction sera affichée dans l'ouvrage.
+%    \begin{macrocode}
+\newif\ifsmc@exercicecorrige
+\newcounter{exercice}[chapter]
+%    \end{macrocode}
+% On regarde s'il y a ou non une étoile. Selon le cas, on met le
+% booléen |\ifsmc@exercicecorrige| à la bonne valeur.
+%    \begin{macrocode}
+\newcommand*\smc@exobaseexercice{%
+  \@ifstar
+    {%
+      \smc@exercicecorrigetrue
+      \smc@@exercice
+    }
+    {%
+      \smc@exercicecorrigefalse
+      \smc@@exercice
+    }
+}
+%    \end{macrocode}
+% On lit ensuite le premier argument optionnel
+%    \begin{macrocode}
+\newcommand*\smc@@exercice[1][]{%
+%    \end{macrocode}
+% On sauvegarde le texte du titre est on appelle la macro auxiliaire
+% pour lire le deuxième argument optionnel.
+%    \begin{macrocode}
+  \def\smc@exercicetitle{#1}%
+  \smc@@@exercice
+}
+\newcommand*\smc@@@exercice[1][]{%
+%    \end{macrocode}
+% On commence par passer au paragraphe suivant et réinitialiser le compteur
+% partie.
+%    \begin{macrocode}
+  \par\addvspace{\BeforeExerciceVSpace}
+  \setcounter{partie}{0}
+%    \end{macrocode}
+% La présence d'un logo va faire qu'on ne composera pas le titre (ou
+% le texte) de la même façon. S'il y a un logo, on utilise la commande
+% |\parpic| pour habiller le logo. Sinon on ne fait rien de spécial.
+%    \begin{macrocode}
+  \@ifnotmtarg{#1}{%
+    \setbox0=\hbox{#1}%
+    \parpic[r]{\makebox[\wd0][l]{{#1}}}
+  }%
+%    \end{macrocode}
+% On compose le numéro de l'exercice. La couleur du cadre dépend du
+% fait que l'exercice est corrigé ou non.
+%    \begin{macrocode}
+  \refstepcounter{exercice}%
+  \begin{pspicture}(0,0)(\ExerciceNumFrameWidth,\ExerciceNumFrameHeight)
+    \ifsmc@exercicecorrige
+      \psframe*[linewidth=0pt, linecolor=ExerciceCorrigeNumFrameColor]
+               (0,-\ExerciceNumFrameDepth)
+               (\ExerciceNumFrameWidth,\ExerciceNumFrameHeight)
+    \else
+      \psframe*[linewidth=0pt, linecolor=ExerciceNumFrameColor]
+               (0,-\ExerciceNumFrameDepth)
+               (\ExerciceNumFrameWidth,\ExerciceNumFrameHeight)
+    \fi
+    \rput[B](\dimexpr\ExerciceNumFrameWidth/2,0){%
+      \textcolor{ExerciceNumColor}{\ExerciceNumFont \theexercice}%
+    }
+  \end{pspicture}%
+%    \end{macrocode}
+% Y a-t-il un titre d'exercice ?
+%    \begin{macrocode}
+  \ifx\smc@exercicetitle\empty
+%    \end{macrocode}
+% S'il n'y a pas de titre, on commence le texte de l'exercice (après
+% un certain espacement horizontal).
+%    \begin{macrocode}
+    \hspace{\ExerciceTextHSep}%
+  \else
+%    \end{macrocode}
+% S'il y a un titre, on le compose et on passe au paragraphe suivant.
+%    \begin{macrocode}
+    \hspace{\ExerciceTextHSep}%
+    \textcolor{ExerciceTitleColor}
+              {\ExerciceTitleFont \smc@exercicetitle}%
+    \par\nobreak
+  \fi
+}
+%    \end{macrocode}
+% En fait, on utilisera plutôt la forme d'environnement pour entrer
+% les exercices. Le code terminal ne fait que placer un |\par| (cela
+% peut être utile pour activer un éventuel |\centering| en fin de
+% code.
+%    \begin{macrocode}
+\def\endsmc@exercice{\par}
+%    \end{macrocode}
+% Pour la forme en environnement, on doit définir l'environnement
+% |exercice*|. Cet environnement fait le travail initial de la macro
+% étoilée et revient immédiatement sur la partie commune.
+%    \begin{macrocode}
+\newenvironment{exercice*}
+{%
+  \smc@exercicecorrigetrue
+  \smc@@exercice
+}
+{\par}
+%    \end{macrocode}
+% On définit l'environnement |smc@exoapprexercice| comme étant un
+% alias de |smc@exobaseexercice|.
+%    \begin{macrocode}
+\let\smc@exoapprexercice\smc@exobaseexercice
+\let\endsmc@exoapprexercice\endsmc@exobaseexercice
+%    \end{macrocode}
+% \end{macro}
+% \begin{environment}{corrige}
+% L'environnement |corrige| va enregistrer la correction d'un exercice
+% dont l'énoncé vient d'être fourni. Le principe général va être de
+% sauvegarder les corrigés dans des fichiers |.tex| séparés.
+%
+% \begin{macro}{\killienc}  
+% Pour utiliser \package{fancyvrb} même en UTF-8, il faut désactiver
+% tous les codes de caractère supérieurs à 127. La commande
+% |\killienc| va automatiquement construire la suite de commande :\\
+% |\catcode<car>=12|\\
+% où |<car>| ira de 128 à 255.
+%    \begin{macrocode}
+\newcommand\killienc{}
+\count@128
+\@whilenum\count@<\@cclvi\do{%
+  \edef\killienc{\killienc\catcode\the\count@=12}%
+  \advance\count@\@ne}
+%    \end{macrocode}
+% \end{macro}
+% La macro |\killienc| étant en place, on peut définir l'environnement
+% |corrige|. En réalité, comme pour plusieurs éléments de la classe,
+% il y aura plusieurs types d'environnement |corrige|, la sélection se
+% faisant au moment des besoins. On commence par définir
+% l'environnement qui indique qu'on n'a pas le droit d'utiliser cet
+% environnement !
+%    \begin{macrocode}
+\newenvironment{smc@nocorrige}
+{%
+  \ClassError{sesamanuel}{Il est interdit d'utiliser corrige ici}
+             {Consultez la documentation pour plus de renseignements.}%  
+}
+{}
+%    \end{macrocode}
+% En réalité, il y a de multiples environnements qui auront pour nom
+% |corrige|. On définit d'abord celui pour l'auto-évaluation.
+%    \begin{macrocode}
+\newenvironment{smc@AEcorrige}
+{%
+%    \end{macrocode}
+% On écrit dans le fichier de correction général l'ordre de chargement
+% du corrigé en cours.
+%    \begin{macrocode}
+  \addtocontents{cor}{%
+    \protect\inputcor{\smc@currpart}{\smc@thema@initcap\thechapter}
+                     {\the\c@AEexo}%
+  }%
+%    \end{macrocode}
+% On utilise ensuite |killienc| pour tuer les caractères actifs.
+%    \begin{macrocode}
+  \killienc
+%    \end{macrocode}
+% Vient ensuite la commande magique du package \package{fancyvrb} pour
+% permettre de créer soi-même des environnements verbatim.
+%    \begin{macrocode}
+  \VerbatimEnvironment
+%    \end{macrocode}
+% Attention, cette ligne doit être la dernière et il ne doit même pas
+% y avoir de saut de ligne avant l'accolade fermante de la partie
+% initiale de l'environnent.
+%    \begin{macrocode}
+  \begin{VerbatimOut}{\PrefixeCorrection corr-\smc@currpart-\smc@thema@initcap\thechapter-\the\c@AEexo}}
+{%
+  \end{VerbatimOut}
+}
+%    \end{macrocode}
+% Le corrigé pour les exercices de base se comporte de la même façon
+% (sauf pour le compteur d'exercice).
+%    \begin{macrocode}
+\newenvironment{smc@exobasecorrige}
+{%
+  \addtocontents{cor}{%
+    \protect\inputcor{\smc@currpart}{\smc@thema@initcap\thechapter}
+                     {\the\c@exercice}%
+  }%
+  \killienc
+  \VerbatimEnvironment
+  \begin{VerbatimOut}{\PrefixeCorrection corr-\smc@currpart-\smc@thema@initcap\thechapter-\the\c@exercice}}
+{%
+  \end{VerbatimOut}
+}
+%    \end{macrocode}
+% Un certain nombre d'environnements de correction se comportent
+% exactement comme le précédent. On les définit en tant qu'alias.
+%    \begin{macrocode}
+\let\smc@exoapprcorrige\smc@exobasecorrige
+\let\endsmc@exoapprcorrige\endsmc@exobasecorrige
+\let\smc@recreationcorrige\smc@exobasecorrige
+\let\endsmc@recreationcorrige\endsmc@exobasecorrige
+\let\smc@QCMcorrige\smc@exobasecorrige
+\let\endsmc@QCMcorrige\endsmc@exobasecorrige
+\let\smc@librecorrige\smc@exobasecorrige
+\let\endsmc@librecorrige\endsmc@exobasecorrige
+%    \end{macrocode}
+% La correction des énigmes ne peut pas se faire strictement de la
+% même façon puisqu'il n'y a pas de numéro d'exercice. C'est le seul
+% point qui diffère.
+%    \begin{macrocode}
+\newenvironment{smc@enigmecorrige}
+{%
+  \addtocontents{cor}{%
+    \protect\inputcor{\smc@currpart}{\smc@thema@initcap\thechapter}{}%
+  }%
+  \killienc
+  \VerbatimEnvironment
+  \begin{VerbatimOut}{\PrefixeCorrection corr-\smc@currpart-\smc@thema@initcap\thechapter}}
+{%
+  \end{VerbatimOut}
+}
+%    \end{macrocode}
+% La correction des TP se fait avec le numéro de TP
+%    \begin{macrocode}
+\newenvironment{smc@TPcorrige}
+{%
+  \addtocontents{cor}{%
+    \protect\inputcor{\smc@currpart}{\smc@thema@initcap\thechapter}
+                     {\the\c@activite}%
+  }%
+  \killienc
+  \VerbatimEnvironment
+  \begin{VerbatimOut}{\PrefixeCorrection corr-\smc@currpart-\smc@thema@initcap\thechapter-\the\c@activite}}
+{%
+  \end{VerbatimOut}
+}
+%    \end{macrocode}
+% \end{environment}
+% \subsection{Exercices d'approfondissement}
+% \begin{macro}{\exercicesappr}
+% Cette macro introduit la partie \og Exercices d'approfondissement
+% \fg{} dans un chapitre. Elle autorise l'utilisation des listes et
+% des macros |\exercice| et |\correction| en dehors de tout
+% environnement.
+%    \begin{macrocode}
+\newcommand*\exercicesappr{%
+  \clearpage
+  \pagestyle{exercicesappr}
+  \addtocontents{cor}{\protect\smc@corrigeexercicesappr}%
+  \let\itemize\smc@exerciceitemize
+  \let\enditemize\endsmc@exerciceitemize
+  \let\colitemize\smc@exercicecolitemize
+  \let\endcolitemize\endsmc@exercicecolitemize
+  \let\enumerate\smc@exerciceenumerate
+  \let\endenumerate\endsmc@exerciceenumerate
+  \let\colenumerate\smc@exercicecolenumerate
+  \let\endcolenumerate\endsmc@exercicecolenumerate
+  \let\exercice\smc@exoapprexercice
+  \let\endexercice\endsmc@exoapprexercice
+  \let\corrige\smc@exoapprcorrige
+  \let\endcorrige\endsmc@exoapprcorrige
+  \let\correction\smc@nocorrection
+  \let\partie\smc@exercice@partie
+  \def\smc@currpart{ExoAppr}%
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\recreation}
+% Cette macro introduit la partie \og Récréation, énigme \fg{} avec
+% son bandeau.
+%    \begin{macrocode}
+\newcommand*\recreation{%
+  \par\addvspace{\BeforeRecreationVSpace}
+  \begin{pspicture}(0,0)(\linewidth,\dimexpr\SquareWidth*3)
+    \psframe*[linewidth=0pt,linecolor=RecreationHeadFrame5Color]
+             (0,0)(\linewidth,\dimexpr\SquareWidth*3)
+    \psset{fillstyle=solid}
+    \smc@antidiagonal(0mm,0mm){RecreationHeadFrame}
+    \rput[Bl](\dimexpr \SquareWidth*4,\SquareWidth){%
+      \textcolor{RecreationHeadFrame0Color}{\RecreationFont \StringRecreation}%
+    }
+    \psset{linewidth=0pt}
+    \smc@putsquare(32,2){J1}
+    \smc@putsquare(33,0){H4}
+    \smc@putsquare(34,1){H2}
+    \smc@putsquare(37,1){F3}
+    \smc@putsquare(39,0){H2}
+    \smc@putsquare(42,2){J2}
+    \smc@putsquare(46,1){H4}
+  \end{pspicture}
+  \par\addvspace{\AfterRecreationVSpace}
+}
+%    \end{macrocode}
+% La macro suivante permet de limiter le code dans la macro
+% précédente. Elle place un carré de la couleur indiquée en troisième
+% argument à la position indiquée en unité |\SquareWidth|
+%    \begin{macrocode}
+\def\smc@putsquare(#1,#2)#3{%
+  \rput(\dimexpr \SquareWidth*#1,\dimexpr \SquareWidth*#2)
+       {\psframe*[linecolor=#3](0,0)(\SquareWidth,\SquareWidth)}
+  \ignorespaces
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\Recreation}
+% Cette macro propose une présentation avec les en-tête de page. Elle
+% va fonctionner comme toutes les autres commandes de parties.
+%    \begin{macrocode}
+\newcommand*\Recreation{%
+  \clearpage
+%    \end{macrocode}
+% On modifie l'en-tête de page.
+%    \begin{macrocode}
+  \pagestyle{recreation}
+%    \end{macrocode}
+% Contrairement aux autres parties, on ne redéfinit pas les listes et
+% les exercices. Il s'agit en fait d'une parti fictive qui va prendre
+% les valeurs de la partie en cours. On ne va même pas redéfinir la
+% macro |\smc@currpart|.
+%    \begin{macrocode}
+}
+%    \end{macrocode}
+% \end{macro}
+% \subsection{Je teste mes connaissances}
+% \begin{macro}{\connaissances}
+% Cette macro introduit la partie \og Je teste mes connaissances \fg{}
+% dans un chapitre. Elle ne se comporte pas comme les autres parties
+% de chapitre. Elle interdit l'utilisation des listes et des macros
+% |\exercice| et |\correction| en dehors des environnements.
+%    \begin{macrocode}
+\newcommand*\connaissances{%
+  \clearpage
+%    \end{macrocode}
+% Les en-têtes et pieds de page sont spéciales (voire définition de
+% |\ps@connaissances| et |\ps@firstconnaissances|).
+%    \begin{macrocode}
+  \pagestyle{connaissances}
+  \thispagestyle{firstconnaissances}
+  \addtocontents{cor}{\protect\smc@corrigeconnaissances}%
+  \let\itemize\smc@noitemize
+  \let\enditemize\endsmc@noitemize
+  \let\colitemize\smc@nocolitemize
+  \let\endcolitemize\endsmc@nocolitemize
+  \let\enumerate\smc@noenumerate
+  \let\endenumerate\endsmc@noenumerate
+  \let\colenumerate\smc@nocolenumerate
+  \let\endcolenumerate\endsmc@nocolenumerate
+%    \end{macrocode}
+% Les exercices ne seront accessibles qu'une fois la macro
+% |\QCMautoevaluation| appelée. Avant cette macro, il faut
+% effectivement que les exercices soient interdits.
+%    \begin{macrocode}
+  \let\exercice\smc@noexercice
+  \let\endexercice\endsmc@noexercice
+  \let\corrige\smc@nocorrige
+  \let\endcorrige\endsmc@nocorrige
+  \let\correction\smc@nocorrection
+  \let\partie\smc@nopartie
+  \def\smc@currpart{Connaissances}%
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{environment}{acquis}
+% L'environnement |acquis| permet de composer la liste des capacités
+% que l'élève doit avoir en fin de chapitre. Il se compose d'une
+% phrase introductive suivi d'un cadre en double colonne où on compose
+% la liste des capacités attendues.
+%    \begin{macrocode}
+\newenvironment{acquis}{%
+  \par
+%    \end{macrocode}
+% On commence par redéfinir les listes à puces. En théorie, cela ne
+% sert à rien mais on va également définir les listes numérotées.
+%    \begin{macrocode}
+  \let\itemize\smc@acquisitemize
+  \let\enditemize\endsmc@acquisitemize
+  \let\colitemize\smc@acquiscolitemize
+  \let\endcolitemize\endsmc@acquiscolitemize
+  \let\enumerate\smc@acquisenumerate
+  \let\endenumerate\endsmc@acquisenumerate
+  \let\colenumerate\smc@acquiscolenumerate
+  \let\endcolenumerate\endsmc@acquiscolenumerate
+  \let\exercice\smc@noexercice
+  \let\endexercice\endsmc@noexercice
+  \let\corrige\smc@nocorrige
+  \let\endcorrige\endsmc@nocorrige
+  \let\correction\smc@nocorrection
+  \let\partie\smc@nopartie
+  \def\smc@currpart{Acquis}%
+%    \end{macrocode}
+% Titre du cadre.
+%    \begin{macrocode}
+  {%
+    \AcquisTitleFont
+    \textcolor{AcquisTitleColor}{\StringAcquisTitle}%
+    \par\vspace{\AcquisTitleVSpace}%
+  }%
+%    \end{macrocode}
+% Cadre lui même. L'environnement \environ{multicols} oblige à ajouter
+% un espace vertical négatif.
+%    \begin{macrocode}
+  \smc@cadre{AcquisBkgColor}
+    \vspace*{-4.5pt}
+    \begin{multicols}{2}
+      \AcquisTextFont
+}
+{%
+    \end{multicols}%
+  \endsmc@cadre
+  \par
+}
+%    \end{macrocode}
+% \end{environment}
+% \begin{macro}{\QCMautoevaluation}
+% Macro d'introduction à la partie des QCM. Cela consiste à afficher
+% le cartouche avec le texte \og QCM d'auto-évaluation \fg{} ainsi
+% qu'un éventuel texte en gras au-dessous (passé en paramètre).
+%    \begin{macrocode}
+\newcommand*\QCMautoevaluation[1]{%
+  \def\smc@currpart{QCM}%
+  \par\addvspace{\BeforeQCMAEVSpace}
+%    \end{macrocode}
+% Le cadre est placé dans une minipage de la bonne largeur. On
+% supprime tous les espacements entre les bords du cadre et on
+% redéfinit |\FrameArc| pour que les arrondis du cadre se définissent
+% avec 10/2 pour épouser les disques.
+%    \begin{macrocode}
+  \begingroup
+    \def\FrameSep{0pt}%
+    \edef\FrameArc{\QCMAETitleHeight}%
+    \minipage[b][\QCMAETitleHeight]{\QCMAETitleWidth}%
+      \begin{smc@cadre}[5,0,5,5]{QCMAEFrameColor}%
+        \minipage[b][\QCMAETitleHeight]{\QCMAETitleWidth}%
+%    \end{macrocode}
+% Il reste un mini débord du cadre qu'on supprime en commençant
+% l'image à |1pt| au lieu de |0| à gauche.
+%    \begin{macrocode}
+          \begin{pspicture}(1pt,0)(\QCMAETitleHeight,\QCMAETitleHeight)
+%    \end{macrocode}
+% Les trois disques concentriques. Le plus grand faisant toute la
+% hauteur, le plus petit deux tiers de la hauteur et celui du milieu à
+% mi-chemin.
+%    \begin{macrocode}
+            \pscircle*[linecolor=QCMAETitleCircle1Color]
+                      (\dimexpr\QCMAETitleHeight/2,
+                       \dimexpr\QCMAETitleHeight/2)
+                      {\dimexpr\QCMAETitleHeight/2}
+            \pscircle*[linecolor=QCMAETitleCircle2Color]
+                      (\dimexpr\QCMAETitleHeight*5/12,
+                       \dimexpr\QCMAETitleHeight*7/12)
+                      {\dimexpr\QCMAETitleHeight*5/12}
+            \pscircle*[linecolor=QCMAETitleCircle3Color]
+                      (\dimexpr\QCMAETitleHeight/3,
+                       \dimexpr\QCMAETitleHeight*2/3)
+                      {\dimexpr\QCMAETitleHeight/3}
+%    \end{macrocode}
+% Le titre.
+%    \begin{macrocode}
+            \rput[Bl](\QCMAETitleLeftSpace,\dimexpr\QCMAETitleHeight/6)
+                    {\textcolor{QCMAETitleColor}{\QCMAETitleFont\StringQCMAE}}
+          \end{pspicture}%
+        \endminipage
+      \end{smc@cadre}
+    \endminipage
+  \endgroup
+%    \end{macrocode}
+% À la suite du cartouche, on place les lignes de référence au manuel
+% numérique.
+%    \begin{macrocode}
+  \hspace*{\stretch{1}}%
+  \begin{minipage}[b]{\QCMAEManuelWidth}
+    \raggedright
+    \QCMAEManuelFont
+    \StringManuel
+    \par\vspace*{\AfterQCMAEManuelVSpace}
+  \end{minipage}%
+%    \end{macrocode}
+% On affiche ensuite le logo.
+%    \begin{macrocode}
+  \hspace{\QCMAEManuelRightSpace}%
+  \raisebox{\AfterQCMAEManuelVSpace}
+           {\psscaleboxto(\AELogoManuelWidth,0){\LogoManuel}}%
+%    \end{macrocode}
+% Il reste à placer un espace vertical, à afficher le texte en
+% argument puis à placer un dernier espace vertical.
+%    \begin{macrocode}
+  \par\nobreak\vspace{\AfterQCMAETitleVSpace}
+  {\QCMAETextAfterTitleFont #1\par\nobreak}
+  \par\nobreak\addvspace{\AfterQCMAETextVSpace}
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{environment}{QCM}
+% L'environnement |QCM| regroupe un éventuel énoncé commun à plusieurs
+% QCM et une série de plusieurs QCM. Le tout va être encadré par un
+% cadre à bord arrondi en haut.
+%    \begin{macrocode}
+\newenvironment{QCM}{%
+  \begin{lrbox}{\smc@boxa}
+    \minipage{\dimexpr\linewidth-\QCMLineWidth*2-\QCMFrameSep*2}
+%    \end{macrocode}
+% On pose les nœuds du haut du cadre dès l'entrée dans la
+% minipage. Pour que ces nœuds soient toujours correctement posés, on
+% commence par faire une petite manœuvre de paragraphe
+%    \begin{macrocode}
+      \par\null
+      \pnode(\dimexpr -\QCMFrameSep-\QCMLineWidth/2,
+             \dimexpr \QCMFrameSep+\QCMLineWidth/2){A}
+      \pnode(\dimexpr \linewidth+\QCMFrameSep+\QCMLineWidth/2,
+             \dimexpr +\QCMFrameSep+\QCMLineWidth/2){B}
+      \par
+}
+{%
+%    \end{macrocode}
+% En fin de minipage, on pose les nœuds du bas du cadre et ceux de
+% milieu de cadre.
+%    \begin{macrocode}
+      \par\vspace{-\baselineskip}
+      \pnode(\dimexpr -\QCMFrameSep-\QCMLineWidth/2,
+             \dimexpr -\QCMFrameSep-\QCMLineWidth/2){C}
+      \pnode(\dimexpr \linewidth+\QCMFrameSep+\QCMLineWidth/2,
+             \dimexpr -\QCMFrameSep-\QCMLineWidth/2){D}
+      \psRelNode(A)(C){0.5}{AC}
+      \psRelNode(B)(D){0.5}{BD}
+    \endminipage
+  \end{lrbox}
+%    \end{macrocode}
+% Le contenu de l'environnement est placé dans la boîte
+% |\smc@boxa|. On place maintenant l'espace vertical qui précède.
+%    \begin{macrocode}
+  \par\addvspace{\BeforeQCMVSpace}
+%    \end{macrocode}
+% On place ensuite la boîte en ayant pris soin de descendre de la
+% distance correspondant à la largeur de ligne plus la séparation
+% d'avec le cadre.
+%    \begin{macrocode}
+  \vspace{\dimexpr\QCMLineWidth+\QCMFrameSep}
+  \hspace*{\dimexpr\QCMLineWidth+\QCMFrameSep}%
+  \copy\smc@boxa
+%    \end{macrocode}
+% On peut alors tracer le cadre.
+%    \begin{macrocode}
+  \psline[linewidth=\QCMLineWidth, linecolor=QCMLineColor](AC)(C)(D)(BD)
+  \psline[linewidth=\QCMLineWidth, linecolor=QCMLineColor,
+          linearc=\QCMLineArc](C)(A)(B)(D)
+%    \end{macrocode}
+% On place alors l'espace vertical de compensation de la largeur de
+% ligne et de l'espace d'avec le cadre l'espace après le groupe de QCM.
+%    \begin{macrocode}
+  \par\vspace{\dimexpr\QCMLineWidth+\QCMFrameSep}
+  \addvspace{\AfterQCMVSpace}
+}
+%    \end{macrocode}
+% \end{environment}
+% \begin{environment}{EnonceCommunQCM}
+% L'environnement |EnonceCommunQCM| permet d'avoir un chapeau pour un
+% groupe de QCM. Il n'y a rien de spécial à ce niveau.
+%    \begin{macrocode}
+\newenvironment{EnonceCommunQCM}{%
+}
+{%
+}
+%    \end{macrocode}
+% \end{environment}
+% \begin{environment}{GroupeQCM}
+% Dans cet environnement, on place l'ensemble des exercices d'un
+% groupe. On va donc définir l'environnement exercice.
+%    \begin{macrocode}
+\newenvironment{GroupeQCM}{%
+  \let\exercice\smc@QCMexercice
+  \let\endexercice\endsmc@QCMexercice
+  \let\corrige\smc@QCMcorrige
+  \let\endcorrige\endsmc@QCMcorrige
+}
+{%
+}
+%    \end{macrocode}
+% \end{environment}
+% \begin{environment}{smc@QCMexercice}
+% Environnement \environ{exercice} pour les QCM. C'est le même code
+% que pour l'environnement \environ{exercice} de l'auto-évaluation.
+%    \begin{macrocode}
+\newenvironment{smc@QCMexercice}{%
+  \par
+  \refstepcounter{exercice}%
+  \psframebox*[linestyle=none, linewidth=0pt,
+               fillcolor=QCMExoNumFrameColor, framesep=\QCMExoFrameTopSep]{%
+    \hbox to\dimexpr\QCMExoFrameWidth-\QCMExoFrameTopSep*2{%
+      \hss
+      \QCMExoNumFont
+      \textcolor{QCMExoNumColor}{\theexercice}%
+      \hss
+    }%
+  }%
+  \hspace{\AfterQCMExoFrameHSpace}%
+  \ignorespaces
+}
+{\par}
+%    \end{macrocode}
+% \end{environment}
+% \begin{environment}{ChoixQCM}
+% L'environnement \environ{ChoixQCM} se comporte exactement comme un
+% \environ{colenumerate} sauf que la façon de composer le numéro n'est
+% pas le même (il n'y a qu'un seul niveau et les numéros sont
+% encerclés et écrits alphabétiquement).
+%
+% Le nombre est composé sous forme d'une lettre encerclée. Le package
+% \package{pifont} offre cette fonctionnalité à partir du code 172
+% (seulement jusqu'à 10). La macro de mise en forme peut être définie
+% en dehors de l'environnement puisqu'elle servira toujours de la même
+% façon.
+%    \begin{macrocode}
+\newcounter{QCM}
+\newcommand*\QCMLabel[1]{%
+  \textcolor{QCMItemNumColor}
+            {%
+              \QCMItemNumFont
+              \pscirclebox[linewidth=0.4pt, framesep=1pt,
+                           linecolor=QCMItemNumColor, boxsep=true]
+                          {\vphantom{dp}\@alph{#1}}
+            }%
+}%
+\newenvironment{ChoixQCM}[1]{%
+  \par\leavevmode
+%    \end{macrocode}
+% Le reste ressemble au code général des \environ{colenumerate}.
+%    \begin{macrocode}
+  \def\smc@nbcolumn{#1}%
+  \smc@nbitem \z@
+  \def\StringColCurrent{ChoixQCM}%
+  \toks@{}%
+  \smc@getbody
+}
+{%
+  \expandafter\smc@splititem\the\toks@\item\@nil\item
+  \smc@nbline \numexpr \smc@nbitem+\smc@nbcolumn-1
+  \divide\smc@nbline \smc@nbcolumn
+  \multido{\n=1+1}{\smc@nbline}{%
+    \multido{\ni=\n+\the\smc@nbline}{\smc@nbcolumn}{%
+      \unless\ifnum\ni>\smc@nbitem
+        \makebox[\QCMLabelWidth]{\QCMLabel{\ni}\hss}%
+        \begin{minipage}[t]{\dimexpr
+            (\linewidth-\ListHSep*(\smc@nbcolumn-1))%
+              /\smc@nbcolumn-\QCMLabelWidth}
+          \strut\@nameuse{smc@item\ni}\strut
+        \end{minipage}%
+        \hspace{\ListHSep}%
+      \fi
+    }%
+%    \end{macrocode}
+% Ici, contrairement aux environnement colenumerate normaux, on laisse
+% un |\\| y compris à la dernière ligne pour avoir un grand espacement
+% vertical après la liste.
+%    \begin{macrocode}
+    \\
+  }%
+}
+%    \end{macrocode}
+% \end{environment}
+% \subsection{Travaux pratiques}
+% \begin{macro}{\TravauxPratiques}
+% Cette macro introduit la partie \og Travaux pratiques \fg{} dans un
+% chapitre. Elle interdit l'utilisation des listes et des macros
+% |\exercice| et |\correction| en dehors des environnements.
+%    \begin{macrocode}
+\newcommand*\TravauxPratiques{%
+  \clearpage
+  \pagestyle{TP}
+  \def\smc@currpart{TP}%
+%    \end{macrocode}
+% Les TP utilisent le compteur |activite| qu'il faut donc
+% réinitialiser.
+%    \begin{macrocode}
+  \setcounter{activite}{0}%
+%    \end{macrocode}
+% Les parties sont composées de façon spéciales dans les TP.
+%    \begin{macrocode}
+  \let\partie\smc@TP@partie
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\DeclareTPLike}
+% Les environnements de TP sont déclarées avec la macro
+% |\DeclareTPLike|. Celle-ci demande quatre arguments :
+% \begin{enumerate}
+% \item le nom de l'environnement ;
+% \item le titre affiché ;
+% \item la couleur de la partie supérieure du cartouche ;
+% \item la couleur de la partie inférieure du cartouche ;
+% \item la couleur du titre et du losange de numéro.
+% \end{enumerate}
+% C'est exactement la syntaxe et le code de |\DeclareActivityLike|.
+%    \begin{macrocode}
+\newcommand*\DeclareTPLike[5]{%
+  \expandafter\newcommand\csname#1\endcsname[1][]{%
+    \def\smc@activite@title{##1}%
+    \csname#1@aux\endcsname
+  }%
+  \expandafter\newcommand\csname#1@aux\endcsname[1][]{%
+    \par
+    \addvspace{\BeforeActiviteVSpace}
+    \refstepcounter{activite}
+    \setbox\smc@boxa=\hbox{%
+      \ActiviteTitleFont
+      #2%
+    }%
+    \begin{pspicture}(0,0)
+      (\dimexpr \ActiviteTitleLeftSpace+\wd\smc@boxa+\ActiviteTitleRightSpace+1.4142\ActiviteTitleTopHeight,\ActiviteTitleTopHeight)
+      \psframe*[linewidth=0, linecolor= #3]
+        (0,0)(\dimexpr\ActiviteTitleLeftSpace+\wd\smc@boxa+\ActiviteTitleRightSpace+0.7071\ActiviteTitleTopHeight,
+              \ActiviteTitleTopHeight)
+      \psframe*[linewidth=0, linecolor= #4]
+        (0,0)(\dimexpr\ActiviteTitleLeftSpace+\wd\smc@boxa+\ActiviteTitleRightSpace+0.7071\ActiviteTitleTopHeight,
+              -\ActiviteTitleBottomHeight)
+      \rput[l](\ActiviteTitleLeftSpace,
+               0.5\dimexpr\ActiviteTitleTopHeight-\ActiviteTitleBottomHeight){%
+        \ActiviteTitleFont
+        \textcolor{#5}{#2}%
+      }
+      \rput
+        (\dimexpr\ActiviteTitleLeftSpace+\wd\smc@boxa+\ActiviteTitleRightSpace,
+         0.5\dimexpr\ActiviteTitleTopHeight-\ActiviteTitleBottomHeight)
+      {%
+        \pspolygon*[linewidth=0, linecolor=#5]
+          (0,0)
+          (0.7071\ActiviteTitleTopHeight,0.7071\ActiviteTitleTopHeight)
+          (1.4142\ActiviteTitleTopHeight,0)
+          (0.7071\ActiviteTitleTopHeight,-0.7071\ActiviteTitleTopHeight)
+        \rput(0.7071\ActiviteTitleTopHeight,0){%
+          \ActiviteNumFont
+          \textcolor{ActiviteNumColor}{\theactivite}%
+        }
+      }
+    \end{pspicture}%
+    \hspace*{\AfterActiviteTitleHSpace}%
+    \@ifmtarg{##1}
+      {\setbox0=\hbox{}}
+      {\setbox0=\hbox{##1\ }}%
+    \minipage[t]{\dimexpr\linewidth-\ActiviteTitleLeftSpace-\wd\smc@boxa-\ActiviteTitleRightSpace-1.4142\ActiviteTitleTopHeight-\AfterActiviteTitleHSpace-\wd0}
+      \ActiviteSubtitleFont
+      \textcolor{ActiviteSubtitleColor}{\smc@activite@title}%
+    \endminipage
+    \@ifnotmtarg{##1}{\hfill##1}%
+    \par\vspace{\AfterActiviteTitleVSpace}
+    \let\itemize\smc@activiteitemize
+    \let\enditemize\endsmc@activiteitemize
+    \let\colitemize\smc@activitecolitemize
+    \let\endcolitemize\endsmc@activitecolitemize
+    \let\enumerate\smc@activiteenumerate
+    \let\endenumerate\endsmc@activiteenumerate
+    \let\colenumerate\smc@activitecolenumerate
+    \let\endcolenumerate\endsmc@activitecolenumerate
+%    \end{macrocode}
+% Voici la seule différénce avec les activités : les parties ne sont
+% pas composées de la même façon.
+%    \begin{macrocode}
+    \let\partie\smc@TP@partie
+    \let\exercice\smc@noexercice
+    \let\endexercice\endsmc@noexercice
+    \let\corrige\smc@nocorrige
+    \let\endcorrige\endsmc@nocorrige
+    \def\smc@currpart{Activite}%
+    \begin{changemargin}{\dimexpr\SquareWidth*4}{\ExtraMarginRight}
+  }%
+  \expandafter\def\csname end#1\endcsname{%
+    \end{changemargin}
+  }%
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{environment}{TP}
+% Les TP suivent très exactement les mêmes règles de composition que
+% les activités. Il suffit de les déclarer de la même façon !
+%    \begin{macrocode}
+\DeclareTPLike{TP}{\StringTP}
+              {TPTopColor}
+              {TPBottomColor}
+              {TPTitleColor}
+%    \end{macrocode}
+% \end{environment}
+% \begin{environment}{enigme}
+% Il s'agit de l'environnement permettant d'indiquer le texte d'une
+% \emph{récréation, énigmes}. L'unique paramètre est le titre de l'énigme.
+%    \begin{macrocode}
+\newenvironment{enigme}[1][]{%
+%    \end{macrocode}
+% Les énigmes peuvent donner lieu à un corrigé, on prévoit une
+% indication dans le fichier de correction
+%    \begin{macrocode}
+  \addtocontents{cor}{\protect\smc@corrigeenigme}%
+%    \end{macrocode}
+% On redéfinit les listes et les parties. Les exercices ne sont pas
+% permis.
+%    \begin{macrocode}
+  \let\itemize\smc@recreationitemize
+  \let\enditemize\endsmc@recreationitemize
+  \let\colitemize\smc@recreationcolitemize
+  \let\endcolitemize\endsmc@recreationcolitemize
+  \let\enumerate\smc@recreationenumerate
+  \let\endenumerate\endsmc@recreationenumerate
+  \let\colenumerate\smc@recreationcolenumerate
+  \let\endcolenumerate\endsmc@recreationcolenumerate
+  \let\exercice\smc@noexercice
+  \let\endexercice\endsmc@noexercice
+  \let\corrige\smc@nocorrige
+  \let\endcorrige\endsmc@nocorrige
+  \let\correction\smc@nocorrection
+  \let\partie\smc@recreation@partie
+  \def\smc@currpart{Enigme}%
+%    \end{macrocode}
+% On affiche alors le titre s'il existe.
+%    \begin{macrocode}
+  \par
+  \@ifmtarg{#1}{}{%
+    {\RecreationTitleFont \textcolor{RecreationTitleColor}{#1}\par}%
+  }
+%    \end{macrocode}
+% Il faut remettre le compteur de partie à zéro.
+%    \begin{macrocode}
+  \setcounter{partie}{0}
+}
+{\par}
+%    \end{macrocode}
+% \end{environment}
+% \subsection{partie}
+% Il s'agit de sous-parties autorisées seulement dans certains
+% environnements. Pour l'instant, seules les activités peuvent
+% utiliser cette commande.
+% \begin{macro}{\partie}
+% On commence par définir la macro qui sera active en dehors des
+% environnements autorisés. Elle ne fait que lever une erreur.
+%    \begin{macrocode}
+\newcommand*\smc@nopartie{%
+  \ClassError{sesamanuel}
+             {La commande \string\partie\space est interdite ici.}
+             {Reportez-vous à la documentation pour
+               l'utilisation de la macro \string\partie.}%
+}
+\let\partie\smc@nopartie
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\smc@activite@partie}
+% La macro |\smc@activite@partie| est le code de la macro |\partie|
+% dans les environnements de type |activite|.
+%    \begin{macrocode}
+\newcommand*\smc@activite@partie[1][]{%
+%    \end{macrocode}
+% Les trois sauvegardes suivantes permettent d'utiliser les
+% présentations des parties dans des références.
+%    \begin{macrocode}
+  \colorlet{smc@curr@partiecolor}{ActivitePartieColor}%
+  \colorlet{smc@curr@partiebkgcolor}{Blanc}%
+  \let\smc@curr@partiefont\ActivitePartieFont
+%    \end{macrocode}
+% On commence ensuite le code réel de la commande |\partie|.
+%    \begin{macrocode}
+  \par\addvspace{\BeforeActivitePartieVSpace}
+  \refstepcounter{partie}%
+  \@ifmtarg{#1}
+    {%
+      \textcolor{ActivitePartieColor}
+                {\ActivitePartieFont \StringPartie{} \thepartie}
+    }
+    {%
+      \textcolor{ActivitePartieColor}
+                {\ActivitePartieFont \StringPartie{} \thepartie{} : #1}
+    }
+  \par\nobreak\addvspace{\AfterActivitePartieVSpace}
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\smc@exercice@partie}
+% La macro |\smc@exercice@partie| est le code de la macro |\partie|
+% dans les exercices.
+%    \begin{macrocode}
+\newcommand*\smc@exercice@partie[1][]{%
+  \colorlet{smc@curr@partiecolor}{ExercicePartieColor}%
+  \colorlet{smc@curr@partiebkgcolor}{Blanc}%
+  \let\smc@curr@partiefont\ExercicePartieFont
+  \par\addvspace{\BeforeExercicePartieVSpace}
+  \refstepcounter{partie}%
+  \@ifmtarg{#1}
+    {%
+      \textcolor{ExercicePartieColor}
+                {\ExercicePartieFont \textsc{\StringPartie} \Alph{partie}}
+    }
+    {%
+      \textcolor{ExercicePartieColor}
+                {\ExercicePartieFont \textsc{\StringPartie} \Alph{partie} : #1}
+    }
+  \par\nobreak\addvspace{\AfterExercicePartieVSpace}
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\smc@TP@partie}
+% La macro |\smc@TP@partie| est le code de la macro |\partie| dans
+% les TP.
+%    \begin{macrocode}
+\newcommand*\smc@TP@partie[1]{%
+  \colorlet{smc@curr@partiecolor}{TPPartieNumColor}%
+  \colorlet{smc@curr@partiebkgcolor}{TPPartieBkgColor}%
+  \let\smc@curr@partiefont\TPPartieFont
+  \par\addvspace{\BeforeTPPartieVSpace}
+  \refstepcounter{partie}%
+  \leavevmode
+  \hbox to\z@{%
+    \hss
+    \psframebox[linestyle=none, linewidth=0pt, fillstyle=solid,
+                fillcolor=TPPartieBkgColor]
+               {\textcolor{TPPartieNumColor}{\TPPartieFont \thepartie}}%
+    \hspace*{\TPPartieHSep}%
+  }%
+  \textcolor{TPPartieColor}{\TPPartieFont #1}
+  \par\nobreak\addvspace{\AfterTPPartieVSpace}
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\smc@recreation@partie}
+% La macro |\smc@recreation@partie| est le code de la macro |\partie| dans
+% la partie Récréation, énigmes.
+%    \begin{macrocode}
+\newcommand*\smc@recreation@partie[1][]{%
+  \colorlet{smc@curr@partiecolor}{RecreationPartieColor}%
+  \colorlet{smc@curr@partiebkgcolor}{Blanc}%
+  \let\smc@curr@partiefont\RecreationPartieFont
+  \par\addvspace{\BeforeRecreationPartieVSpace}
+  \refstepcounter{partie}%
+  \@ifmtarg{#1}
+    {%
+      \textcolor{RecreationPartieColor}
+                {\RecreationPartieFont \StringPartie{} \Alph{partie}}
+    }
+    {%
+      \textcolor{RecreationPartieColor}
+                {\RecreationPartieFont \StringPartie{} \Alph{partie} :}
+      \textcolor{RecreationPartieColor}{\RecreationPartieTitleFont #1}
+    }
+  \par\nobreak\addvspace{\AfterRecreationPartieVSpace}
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\smc@annexe@partie}
+% La macro |\smc@annexe@partie| est le code de la macro |\partie|
+% pour les annexes (en fait pour les exercices des annexes).
+%    \begin{macrocode}
+\newcommand\smc@annexe@partie[1][]{%
+  \colorlet{smc@curr@partiecolor}{AnnexePartieColor}%
+  \colorlet{smc@curr@partiebkgcolor}{Blanc}%
+  \let\smc@curr@partiefont\AnnexePartieFont
+  \par\addvspace{\BeforeAnnexePartieVSpace}
+  \refstepcounter{partie}%
+  \@ifmtarg{#1}
+    {%
+      \textcolor{AnnexePartieColor}
+                {\AnnexePartieFont \textsc{\StringPartie} \Alph{partie}}
+    }
+    {%
+      \textcolor{AnnexePartieColor}
+                {\AnnexePartieFont \textsc{\StringPartie} \Alph{partie} : #1}
+    }
+  \par\nobreak\addvspace{\AfterAnnexePartieVSpace}
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\smc@libre@partie}
+% La macro |\smc@libre@partie| est le code de la macro |\partie|
+% pour les textes libres.
+%    \begin{macrocode}
+\newcommand\smc@libre@partie[1][]{%
+  \colorlet{smc@curr@partiecolor}{LibrePartieColor}%
+  \colorlet{smc@curr@partiebkgcolor}{Blanc}%
+  \let\smc@curr@partiefont\LibrePartieFont
+  \par\addvspace{\BeforeLibrePartieVSpace}
+  \refstepcounter{partie}%
+  \@ifmtarg{#1}
+    {%
+      \textcolor{LibrePartieColor}
+                {\LibrePartieFont \textsc{\StringPartie} \Alph{partie}}
+    }
+    {%
+      \textcolor{LibrePartieColor}
+                {\LibrePartieFont \textsc{\StringPartie} \Alph{partie} : #1}
+    }
+  \par\nobreak\addvspace{\AfterLibrePartieVSpace}
+}
+%    \end{macrocode}
+% \end{macro}
+% \section{Annexes}
+% \subsection{Corrigés}
+% \begin{macro}{\AfficheCorriges}
+% Dans cette partie, on affiche l'ensemble des corrections du
+% livre. Tout se fait avec la seule macro |\AfficheCorriges|. Celle-ci
+% accepte un argument optionnel indiquant le nombre de colonnes sur
+% lesquelles seront composés les corrigés. Pour avoir un maximum de
+% souplesse, la valeur par défaut sera stockée dans la variable
+% publique |\NombreColonnesCorriges|. La classe fixe à 3 cette valeur
+% par défaut. On a également une variable publique
+% |\PrefixeCorrection| dont le but est de préfixer les noms des
+% fichiers de correction (par exemple par un nom de répertoire).
+%    \begin{macrocode}
+\newcommand*\NombreColonnesCorriges{3}
+\newcommand*\PrefixeCorrection{}
+\newcommand*\AfficheCorriges[1][\NombreColonnesCorriges]{%
+%    \end{macrocode}
+% On commence par changer de page et indiquer les styles de page à
+% utiliser pour la suite. On va également poser une étiquette pour
+% permettre le référencement de la page de manière automatique.
+%    \begin{macrocode}
+  \clearpage
+  \label{toutes-solutions}
+  \pagestyle{corrige}
+  \thispagestyle{firstcorrige}
+%    \end{macrocode}
+% On compose le titre de l'annexe.
+%    \begin{macrocode}
+  \rput[Bl](0,9mm){\CorrigeTitleFont \MakeUppercase{\StringCorriges}}
+  \vspace*{-5mm}
+%    \end{macrocode}
+% Enfin, on ouvre l'environnement de colonnage avant d'appeler le
+% fichier externe de correction.
+%    \begin{macrocode}
+  \begingroup
+  \columnsep \dimexpr \SquareWidth*2
+  \columnseprule \CorrigeRuleWidth
+  \def\columnseprulecolor{\color{ExerciceColumnRuleColor}}%
+%    \end{macrocode}
+% Avant d'ouvrir le muticolonnage, on mémorise le nombre de colonnes
+% (cela servira plus tard pour les QCM).
+%    \begin{macrocode}
+  \xdef\smc@NbColonneCorrige{#1}%
+  \ifnum#1>\@ne
+    \begin{multicols}{#1}%
+      \@starttoc{cor}
+    \end{multicols}
+    \vfill~\par
+  \else
+    \@starttoc{cor}
+    \vfill~\par
+  \fi
+  \endgroup
+}
+%    \end{macrocode}
+% \end{macro}
+% Le fichier de correction va comporter un certain nombre de commandes
+% particulières qu'on définit ici.
+% \begin{macro}{\smc@corrigechapter}
+% Affiche les chapitres dans l'annexe des corrigés. Le premier
+% paramètre contient le texte \og Chapitre <type><numéro> \fg où le
+% |<type>| est l'abréviation du type de chapitre (Fonction, Géométrie
+% ou statistique), le deuxième le titre du chapitre, le troisième la
+% couleur de cadre et de titre et le quatrième la couleur du texte
+% dans le cadre.
+%    \begin{macrocode}
+\newcommand*\smc@corrigechapter[4]{%
+%    \end{macrocode}
+% Avant de procéder à la composition du titre de chapitre, on
+% initialise le fait que les environnements |exercice| et |corrige|
+% ainsi que la macro |\correction| seront interdits à l'intérieur d'un
+% corrigé !
+%    \begin{macrocode}
+  \let\exercice\smc@noexercice
+  \let\endexercice\endsmc@noexercice
+  \let\corrige\smc@nocorrige
+  \let\endcorrige\endsmc@nocorrige
+  \let\correction\smc@nocorrection
+%    \end{macrocode}
+% On place le saut vertical avant le titre puis dans l'ordre, le cadre
+% avec le mot Chapitre puis le titre de l'exercice.
+%    \begin{macrocode}
+  \par\addvspace{\BeforeCorrigeChapterVspace}
+  \begin{pspicture}(0,0)(\linewidth,4.5mm)
+    \psframe[linestyle=none, linewidth=0pt,
+             fillstyle=solid, fillcolor=#3]
+            (0,0)(\linewidth,4.5mm)
+    \rput[B](0.5\linewidth,1mm){%
+      \textcolor{#4}{\CorrigeChapterFont #1}%
+    }
+  \end{pspicture}%
+  \\[-1mm]
+  {%
+    \centering
+    \color{#3}
+    \CorrigeChapterFont \smc@nobsbs{#2}
+    \par\nobreak
+  }%
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\smc@corrigeautoeval}
+% Affiche le titre pour les auto-évaluations. En réalité, le titre
+% n'est pas immédiatement affiché. Il est placé dans la macro
+% |\smc@BeforeCorrige| qui comporte un mécanisme
+% d'auto-destruction. Cette macro sera systématiquement appelée par
+% chaque corrigé d'exercice. Ainsi, avant d'afficher le premier
+% exercice, le titre sera composé et ne le sera plus pour les
+% exercices suivant. S'il n'y a aucun corrigé dans la partie, il n'y
+% aura pas de titre affiché du tout.
+%    \begin{macrocode}
+\newcommand\smc@corrigeautoeval{%
+%    \end{macrocode}
+% On commence par indiquer les façon de composer les listes et les
+% parties. On indique également la partie en cours. Pour l'instant, la
+% partie en cours ne sert à rien à ce niveau mais c'est une précaution
+% pour l'avenir.
+%    \begin{macrocode}
+  \let\itemize\smc@corrAEitemize
+  \let\enditemize\endsmc@corrAEitemize
+  \let\colitemize\smc@AEcolitemize
+  \let\endcolitemize\endsmc@AEcolitemize
+  \let\enumerate\smc@corrAEenumerate
+  \let\endenumerate\endsmc@corrAEenumerate
+  \let\colenumerate\smc@AEcolenumerate
+  \let\endcolenumerate\endsmc@AEcolenumerate
+  \let\partie\smc@nopartie
+  \def\smc@currpart{CorrigeAE}%
+%    \end{macrocode}
+% On définit maintenant la macro à double détente. On commence par la
+% première détente : la composition du titre.
+%    \begin{macrocode}
+  \def\smc@BeforeCorrige{%
+    \par\addvspace{\BeforeCorrigePartieTitleVSpace}
+    \textcolor{CorrigeAETitleColor}
+              {\CorrigePartieFont \StringAE}
+    \par\nobreak
+%    \end{macrocode}
+% Vient ensuite la deuxième détente : la redéfinition de la macro par
+% elle-même pour n'être qu'un alias de |\par|
+%    \begin{macrocode}
+    \def\smc@BeforeCorrige{\par}%
+  }%
+%    \end{macrocode}
+% La dernière chose à préciser est la couleur des cadres des numéros
+% d'exercice.
+%    \begin{macrocode}
+  \colorlet{CorrigeNumExerciceFrameBkg}{J1}%
+  \colorlet{CorrigeNumExerciceFrameTxt}{Blanc}%
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\smc@corrigeactivite}
+% C'est la même chose que précédemment pour les corrigés des
+% activités.
+%    \begin{macrocode}
+\newcommand\smc@corrigeactivite{%
+  \let\itemize\smc@noitemize
+  \let\enditemize\endsmc@noitemize
+  \let\colitemize\smc@nocolitemize
+  \let\endcolitemize\endsmc@nocolitemize
+  \let\enumerate\smc@noenumerate
+  \let\endenumerate\endsmc@noenumerate
+  \let\colenumerate\smc@nocolenumerate
+  \let\endcolenumerate\endsmc@nocolenumerate
+  \def\smc@currpart{CorrectionActivite}%
+  \def\smc@BeforeCorrige{%
+    \par\addvspace{\BeforeCorrigePartieTitleVSpace}
+    \textcolor{CorrigeActiviteTitleColor}
+              {\CorrigePartieFont \StringACTIVITE}
+    \par\nobreak
+    \def\smc@BeforeCorrige{\par}%
+  }%
+  \colorlet{CorrigeNumExerciceFrameBkg}{J1}%
+  \colorlet{CorrigeNumExerciceFrameTxt}{Blanc}%
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\smc@corrigeexercicesbase}
+% Idem pour les corrigés de la partie exercices de base.
+%    \begin{macrocode}
+\newcommand\smc@corrigeexercicesbase{%
+  \let\itemize\smc@correxerciceitemize
+  \let\enditemize\endsmc@correxerciceitemize
+  \let\colitemize\smc@exercicecolitemize
+  \let\endcolitemize\endsmc@exercicecolitemize
+  \let\enumerate\smc@correxerciceenumerate
+  \let\endenumerate\endsmc@correxerciceenumerate
+  \let\colenumerate\smc@exercicecolenumerate
+  \let\endcolenumerate\endsmc@exercicecolenumerate
+  \let\partie\smc@exercice@partie
+  \def\smc@currpart{CorrigeExoBase}%
+  \def\smc@BeforeCorrige{%
+    \par\addvspace{\BeforeCorrigePartieTitleVSpace}
+    \textcolor{CorrigeExercicesBaseTitleColor}
+              {\CorrigePartieFont \StringExercicesBase}
+    \par\nobreak
+    \def\smc@BeforeCorrige{\par}%
+  }%
+  \colorlet{CorrigeNumExerciceFrameBkg}{J1}%
+  \colorlet{CorrigeNumExerciceFrameTxt}{Blanc}%
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\smc@corrigeexercicesappr}
+% Idem pour les corrigés de la partie exercices d'approfondissement.
+%    \begin{macrocode}
+\newcommand\smc@corrigeexercicesappr{%
+  \let\itemize\smc@correxerciceitemize
+  \let\enditemize\endsmc@correxerciceitemize
+  \let\colitemize\smc@exercicecolitemize
+  \let\endcolitemize\endsmc@exercicecolitemize
+  \let\enumerate\smc@correxerciceenumerate
+  \let\endenumerate\endsmc@correxerciceenumerate
+  \let\colenumerate\smc@exercicecolenumerate
+  \let\endcolenumerate\endsmc@exercicecolenumerate
+  \let\partie\smc@exercice@partie
+  \def\smc@currpart{CorrigeExoAppr}%
+  \def\smc@BeforeCorrige{%
+    \par\addvspace{\BeforeCorrigePartieTitleVSpace}
+    \textcolor{CorrigeExercicesApprTitleColor}
+              {\CorrigePartieFont \StringExercicesAppr}
+    \par\nobreak
+    \def\smc@BeforeCorrige{\par}%
+  }%
+  \colorlet{CorrigeNumExerciceFrameBkg}{J1}%
+  \colorlet{CorrigeNumExerciceFrameTxt}{Blanc}%
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\smc@corrigeconnaissances}
+% Idem pour les corrigés de la partie Je teste mes connaissances (QCM).
+%    \begin{macrocode}
+\newcommand\smc@corrigeconnaissances{%
+  \let\itemize\smc@noitemize
+  \let\enditemize\endsmc@noitemize
+  \let\colitemize\smc@nocolitemize
+  \let\endcolitemize\endsmc@nocolitemize
+  \let\enumerate\smc@noenumerate
+  \let\endenumerate\endsmc@noenumerate
+  \let\colenumerate\smc@nocolenumerate
+  \let\endcolenumerate\endsmc@nocolenumerate
+  \let\partie\smc@nopartie
+  \def\smc@currpart{CorrigeConnaissances}%
+%    \end{macrocode}
+% La macro effectuée à chaque passage à l'exercice suivant ne comporte
+% pas de saut de paragraphe. En fait, chaque corrigé va être inclu
+% dans une boîte du tiers de l'empagement pour avoir trois corrigés
+% par ligne.
+%    \begin{macrocode}
+  \def\smc@BeforeCorrige{%
+    \par\addvspace{\BeforeCorrigePartieTitleVSpace}
+    \textcolor{CorrigeConnaissancesTitleColor}
+              {\CorrigePartieFont \StringConnaissances}
+    \par\nobreak
+    \def\smc@BeforeCorrige{}%
+  }%
+  \colorlet{CorrigeNumExerciceFrameBkg}{J1}%
+  \colorlet{CorrigeNumExerciceFrameTxt}{Blanc}%
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\smc@corrigeenigme}
+% Idem pour les corrigés des énigmes.
+%    \begin{macrocode}
+\newcommand\smc@corrigeenigme{%
+  \let\itemize\smc@corrrecreationitemize
+  \let\enditemize\endsmc@corrrecreationitemize
+  \let\colitemize\smc@recreationcolitemize
+  \let\endcolitemize\endsmc@recreationcolitemize
+  \let\enumerate\smc@corrrecreationenumerate
+  \let\endenumerate\endsmc@corrrecreationenumerate
+  \let\colenumerate\smc@recreationcolenumerate
+  \let\endcolenumerate\endsmc@recreationcolenumerate
+  \let\partie\smc@recreation@partie
+  \def\smc@currpart{CorrigeEnigme}%
+  \def\smc@BeforeCorrige{%
+    \par\addvspace{\BeforeCorrigePartieTitleVSpace}
+    \textcolor{CorrigeEnigmeTitleColor}
+              {\CorrigePartieFont \StringEnigme}
+    \par\nobreak
+    \def\smc@BeforeCorrige{\par}%
+  }%
+  \colorlet{CorrigeNumExerciceFrameBkg}{J1}%
+  \colorlet{CorrigeNumExerciceFrameTxt}{Blanc}%
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\smc@corrigelibre}
+% Pour les textes libres, les choses sont assez différentes. Le
+% début est identique : on modifie les listes
+%    \begin{macrocode}
+\newcommand\smc@corrigelibre{%
+  \let\itemize\smc@corrlibreitemize
+  \let\enditemize\endsmc@corrlibreitemize
+  \let\colitemize\smc@librecolitemize
+  \let\endcolitemize\endsmc@librecolitemize
+  \let\enumerate\smc@corrlibreenumerate
+  \let\endenumerate\endsmc@corrlibreenumerate
+  \let\colenumerate\smc@librecolenumerate
+  \let\endcolenumerate\endsmc@librecolenumerate
+  \let\partie\smc@exercice@partie
+  \def\smc@currpart{Libre}%
+%    \end{macrocode}
+% En revanche, ensuite, on n'affiche strictement rien
+%    \begin{macrocode}
+  \def\smc@BeforeCorrige{%
+    \par
+  }%
+  \colorlet{CorrigeNumExerciceFrameBkg}{J1}%
+  \colorlet{CorrigeNumExerciceFrameTxt}{Blanc}%
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\inputcor}
+% Macro permettant le chargement d'un fichier de correction indiqué
+% par les trois paramètres :
+% \begin{itemize}
+% \item le type de la partie en cours ;
+% \item le numéro de chapitre ;
+% \item le numéro d'exercice.
+% \end{itemize}
+% Ces trois paramètres vont permettre de reconstituer le nom du
+% fichier à charger.
+%    \begin{macrocode}
+\newcommand*\inputcor[3]{%
+%    \end{macrocode}
+% On commence par composer soit le titre de la partie en cours, soit
+% un saut de paragraphe seul (soit rien pour les QCM).
+%    \begin{macrocode}
+  \smc@BeforeCorrige
+%    \end{macrocode}
+% Si on est dans les corrections de QCM, on doit composer la
+% correction dans des minipages de la moitié de la largeur
+% d'empagement moins la largeur de séparation. et du tiers de la
+% largeur de l'empagement si on est en corrigé sur deux colonnes.
+%    \begin{macrocode}
+  \def\smc@arg{#1}%
+  \ifx\smc@arg\StringQCM
+    \ifnum\smc@NbColonneCorrige=2
+      \edef\smc@LargeurColonneCorrige
+        {\the\dimexpr \linewidth/3-\QCMHSep}%
+    \else
+      \edef\smc@LargeurColonneCorrige
+        {\the\dimexpr \linewidth/2-\QCMHSep}%
+    \fi
+    \minipage[t]{\smc@LargeurColonneCorrige}%
+  \fi
+%    \end{macrocode}
+% On affiche alors le numéro d'exercice dans un cadre.
+%    \begin{macrocode}
+  \@ifmtarg{#3}{}{%
+    \begin{pspicture}(0,0)(5mm,2.5mm)
+      \psframe[linestyle=none, linewidth=0pt,
+               fillstyle=solid, fillcolor=CorrigeNumExerciceFrameBkg]
+              (0,-0.5mm)(5mm,2.5mm)
+      \rput[B](2.5mm,0){%
+        \textcolor{CorrigeNumExerciceFrameTxt}
+                  {\CorrigeNumExerciceFont #3}%
+      }
+    \end{pspicture}
+  }%
+%    \end{macrocode}
+% On charge ensuite la correction de l'exercice. Il faut alors
+% reconstruire le nom du fichier. Le seul point à prendre en compte
+% est que sur un troisième argument vide, on n'a pas de trait d'union
+% entre le numéro de chapitre et le numéro d'exercice. Pour des
+% raisons de mise en page, on compose les réponses dans une minipage
+% de la largeur d'empagement en cours moins la largeur du cadre du
+% numéro d'exercice. Le 6.5mm est le 5mm de la largeur du cadre plus
+% une petite goutière de séparation. On ajoute également
+% systématiquement un |\strut| à la fin de l'inclusion pour que la
+% minipage ne donne pas un interlignage anormal sur la dernière
+% ligne.
+%    \begin{macrocode}
+  \hfill\begin{minipage}[t]{\linewidth-6.5mm}
+    \raggedright
+    \@ifmtarg{#3}
+             {\input{\PrefixeCorrection corr-#1-#2}\strut}
+             {\input{\PrefixeCorrection corr-#1-#2-#3}\strut}%
+  \end{minipage}
+%    \end{macrocode}
+% Si c'est une correction de QCM, on ferme la minipage et on place un
+% espace |\QCMHSep|. Il faut redéfinir |\smc@arg| car il peut être
+% modifié par l'appel des corrigés.
+%    \begin{macrocode}
+  \def\smc@arg{#1}%
+  \ifx\smc@arg\StringQCM
+    \endminipage
+    \hspace{\QCMHSep}%
+  \else
+    \par\vfil
+  \fi
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\Coupe}
+% Macro permettant une coupure de colonne au niveau des solutions.
+%    \begin{macrocode}
+\newcommand\Coupe{%
+  \strut
+  \end{minipage}
+  \par\hfill
+  \begin{minipage}[t]{\linewidth-6.5mm}
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\reponseQCM}
+% Macro pour indiquer une réponse de QCM. Il s'agit uniquement de la
+% ou des réponse(s) placée(s) dans un cercle. En fait, l'argument peut
+% être une suite de lettres. Chacune doit être encerclée. Il faut donc
+% lire l'argument caractère par caractère. On appelle donc la macro
+% auxiliaire |\smc@reponseQCM| en plaçant la balise de fin |\@nil|.
+%    \begin{macrocode}
+\newcommand\reponseQCM[1]{%
+  \smc@reponseQCM#1\@nil
+}
+%    \end{macrocode}
+% |\smc@reponseQCM| ne traite qu'une seule lettre (ASCII).
+%    \begin{macrocode}
+\def\smc@reponseQCM#1{%
+  \def\smc@arg{#1}%
+%    \end{macrocode}
+% Si la balise de fin est rencontrée, on ne fait strictement rien
+%    \begin{macrocode}
+  \ifx\smc@arg\@nnil
+  \else
+%    \end{macrocode}
+% Sinon, on entoure la lettre lue\ldots
+%    \begin{macrocode}
+    \textcolor{CorrigeQCMItemNumColor}
+              {%
+                \CorrigeQCMItemNumFont
+                \pscirclebox[linewidth=0.4pt, framesep=1pt,
+                             linecolor=CorrigeQCMItemNumColor, boxsep=true]
+                            {\vphantom{dp}#1}%
+              }
+%    \end{macrocode}
+% \ldots{} et on procède à un appel récursif.
+%    \begin{macrocode}
+    \expandafter\smc@reponseQCM
+  \fi
+}
+%    \end{macrocode}
+% \end{macro}
+% \subsection{Annexes générales}
+% Initialement la maquette présentait cette annexe pour énoncer des
+% \og propriétés pour démontrer en géométrie \fg{}. On va généraliser
+% un peu cette possibilité en laissant le titre libre, en
+% redéfinissant les commandes de sectionnement et en fournissant un
+% environnement pour les énoncés sur trois colonnes (\emph{a priori}
+% une figure, la propriété et une remarque).
+%
+% Pour garder toute sa généralité à la macro |\annexe|, il faut
+% l'accompagner d'une macro permettant de modifier les couleurs des
+% bandeaux de bord de page et de section. On va commencer par définir
+% cette macro et l'appeler immédiatement avec les couleurs indiquées
+% par défaut dans la maquette.
+% \begin{macro}{\ChangeAnnexe}
+%    \begin{macrocode}
+\newcommand*\ChangeAnnexe[4]{%
+  \colorlet{AnnexeHeadFrameColor}{#1}%
+  \colorlet{AnnexeSectionRuleColor}{#2}%
+  \colorlet{AnnexeItemColor}{#2}%
+  \colorlet{AnnexeExerciceCorrigeNumFrameColor}{#2}%
+  \colorlet{AnnexeExerciceNumFrameColor}{#2}%
+  \colorlet{AnnexeSectionTitleColor}{#3}%
+  \colorlet{AnnexeExerciceTitleColor}{#3}
+  \colorlet{AnnexeExerciceNumColor}{#4}
+}
+%    \end{macrocode}
+% On appelle maintenant cette macro avec les couleurs par défaut de la
+% maquette.
+%    \begin{macrocode}
+\ChangeAnnexe{G3}{A1}{G1}{Blanc}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\annexe}
+% On peut maintenant définir la macro |\annexe|. L'argument est le
+% titre de l'annexe. Avant cela on définit un certain nombre de
+% compteur à initialiser à ce niveau.
+%    \begin{macrocode}
+\newcounter{propriete}
+\newcommand*\annexe[1]{%
+  \let\itemize\smc@annexeitemize
+  \let\enditemize\endsmc@annexeitemize
+  \let\colitemize\smc@annexecolitemize
+  \let\endcolitemize\endsmc@annexecolitemize
+  \let\enumerate\smc@annexeenumerate
+  \let\endenumerate\endsmc@annexeenumerate
+  \let\colenumerate\smc@annexecolenumerate
+  \let\endcolenumerate\endsmc@annexecolenumerate
+  \let\partie\smc@nopartie
+  \let\exercice\smc@annexeexercice
+  \let\endexercice\endsmc@annexeexercice
+  \let\corrige\smc@nocorrige
+  \let\endcorrige\endsmc@nocorrige
+  \let\section\smc@annexesection
+  \def\smc@currpart{Annexe}%
+  \setcounter{propriete}{0}%
+  \setcounter{exercice}{0}%
+%    \end{macrocode}
+% On commence par changer de page et indiquer les styles de page à
+% utiliser pour la suite.
+%    \begin{macrocode}
+  \clearpage
+  \pagestyle{annexe}
+  \thispagestyle{firstannexe}
+%    \end{macrocode}
+% On compose le titre de l'annexe.
+%    \begin{macrocode}
+  \vspace*{\BeforeAnnexeTitleVSpace}
+  {\raggedright \AnnexeTitleFont \MakeUppercase{#1}\par}
+  \addvspace{\AfterAnnexeTitleVSpace}
+%    \end{macrocode}
+% On sauvegarde le titre pour les pieds de page.
+%    \begin{macrocode}
+  \def\smc@TitleAnnexe{#1}%
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\ListeProprietes}
+% On garde quasiment le même code que pour la macro |\propriete|
+% interne au tableau de type |pr| mais on lui donne un argument au
+% lieu du texte \og Propriété \fg avec le numéro.
+%    \begin{macrocode}
+\newcommand*\ListeProprietes[1]{%
+  \psframebox*[fillcolor=TablePropertyTitleBkgColor]{%
+    \ProprieteFont
+    \textcolor{TablePropertyTitleTextColor}
+              {\MakeUppercase{\StringPropriete}~#1}%
+  }%
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{environment}{smc@annexeexercice}
+% Exercice pour la partie annexe. On commence par regarder s'il y a
+% une étoile.
+%    \begin{macrocode}
+\newcommand*\smc@annexeexercice{%
+  \@ifstar
+    {%
+      \smc@exercicecorrigetrue
+      \smc@@annexeexercice
+    }
+    {%
+      \smc@exercicecorrigefalse
+      \smc@@annexeexercice
+    }
+}
+%    \end{macrocode}
+% On lit ensuite le premier argument optionnel.
+%    \begin{macrocode}
+\newcommand*\smc@@annexeexercice[1][]{%
+%    \end{macrocode}
+% On sauvegarde le texte du titre est on appelle la macro auxiliaire
+% pour lire le deuxième argument optionnel.
+%    \begin{macrocode}
+  \def\smc@exercicetitle{#1}%
+  \smc@@@annexeexercice
+}
+\newcommand*\smc@@@annexeexercice[1][]{%
+%    \end{macrocode}
+% On commence par passer au paragraphe suivant et réinitialiser le compteur
+% partie ainsi que la façon de composer les parties.
+%    \begin{macrocode}
+  \par\addvspace{\BeforeExerciceVSpace}
+  \let\partie\smc@annexe@partie
+  \setcounter{partie}{0}
+%    \end{macrocode}
+% La présence d'un logo va faire qu'on ne composera pas le titre (ou
+% le texte) de la même façon. S'il y a un logo, on utilise la commande
+% |\parpic| pour habiller le logo. Sinon on ne fait rien de spécial.
+%    \begin{macrocode}
+  \@ifnotmtarg{#1}{%
+    \setbox0=\hbox{#1}%
+    \parpic[r]{\makebox[\wd0][l]{{#1}}}
+  }%
+%    \end{macrocode}
+% On compose le numéro de l'exercice. La couleur du cadre dépend du
+% fait que l'exercice est corrigé ou non. En fait, pour l'instant, les
+% exercices de la partie annexe ne seront pas corrigés et il n'y aura
+% qu'une seule couleur : celle du liseré. À part les couleurs, on
+% garde les mêmes macros de fonte et de longueurs que pour les
+% exercices des chapitres normaux.
+%    \begin{macrocode}
+  \refstepcounter{exercice}%
+  \begin{pspicture}(0,0)(\ExerciceNumFrameWidth,\ExerciceNumFrameHeight)
+    \ifsmc@exercicecorrige
+      \psframe*[linewidth=0pt,
+                linecolor=AnnexeExerciceCorrigeNumFrameColor]
+               (0,-\ExerciceNumFrameDepth)
+               (\ExerciceNumFrameWidth,\ExerciceNumFrameHeight)
+    \else
+      \psframe*[linewidth=0pt,
+                linecolor=AnnexeExerciceNumFrameColor]
+               (0,-\ExerciceNumFrameDepth)
+               (\ExerciceNumFrameWidth,\ExerciceNumFrameHeight)
+    \fi
+    \rput[B](\dimexpr\ExerciceNumFrameWidth/2,0){%
+      \textcolor{AnnexeExerciceNumColor}{\ExerciceNumFont \theexercice}%
+    }
+  \end{pspicture}%
+%    \end{macrocode}
+% Y a-t-il un titre d'exercice ?
+%    \begin{macrocode}
+  \ifx\smc@exercicetitle\empty
+%    \end{macrocode}
+% S'il n'y a pas de titre, on commence le texte de l'exercice (après
+% un certain espacement horizontal).
+%    \begin{macrocode}
+    \hspace{\ExerciceTextHSep}%
+  \else
+%    \end{macrocode}
+% S'il y a un titre, on le compose et on passe au paragraphe suivant.
+%    \begin{macrocode}
+    \hspace{\ExerciceTextHSep}%
+    \textcolor{AnnexeExerciceTitleColor}
+              {\ExerciceTitleFont \smc@exercicetitle}%
+    \par\nobreak
+  \fi
+}
+%    \end{macrocode}
+% En fait, on utilisera plutôt la forme d'environnement pour entrer
+% les exercices. Le code terminal ne fait que placer un |\par| (cela
+% peut être utile pour activer un éventuel |\centering| en fin de
+% code.
+%    \begin{macrocode}
+\def\endsmc@annexeexercice{\par}
+%    \end{macrocode}
+% \end{environment}
+% \begin{macro}{\smc@annexesection}
+% Les annexes redéfinissent la macro |\section|. Pour cela on la
+% stocke sous la forme de la macro |\smc@annexesection|. Au départ, on
+% la définit comme une macro |\section| habituelle, en particulier, on
+% autorise la forme étoilée (même si pour l'instant elle n'apporte
+% rien de plus que la forme non étoilée).
+%    \begin{macrocode}
+\newcommand*\smc@annexesection{%
+  \@ifstar{\smc@annexesec}{\smc@annexesec}%
+}
+\newcommand*\smc@annexesec[2][]{%
+%    \end{macrocode}
+% On commence par regarder si l'argument optionnel est vide. Si oui,
+% le titre court sera égal au titre long.
+%    \begin{macrocode}
+  \ifx\relax#1\relax
+    \smc@@annexesec{#2}{#2}%
+  \else
+    \smc@@annexesec{#1}{#2}%
+  \fi
+}
+%    \end{macrocode}
+% À ce stade, on a un titre court en premier argument et un titre long
+% en deuxième argument. Le travail effectif peut commencer.
+%    \begin{macrocode}
+\newcommand*\smc@@annexesec[2]{%
+  \par\goodbreak\addvspace{\BeforeAnnexeSectionVSpace}%
+%    \end{macrocode}
+% Le titre court sera éventuellement utilisé pour une TDM. Ce sera à
+% voir plus tard.
+%    \begin{macrocode}
+  \@ifmtarg{#1}{}{}%
+%    \end{macrocode}
+% On compose le carré avec la bonne couleur.
+%    \begin{macrocode}
+  \begin{pspicture}(0,0)(\AnnexeSectionRuleWidth,\AnnexeSectionRuleWidth)
+    \psframe*[linecolor=AnnexeSectionRuleColor]
+             (0,0)(\AnnexeSectionRuleWidth,\AnnexeSectionRuleWidth)
+  \end{pspicture}%
+  \hspace{\AnnexeSectionRuleHSpace}%
+%    \end{macrocode}
+% On place enfin le titre dans une minipage de la bonne largeur.
+%    \begin{macrocode}
+  \begin{minipage}[t]{\dimexpr\linewidth-\AnnexeSectionRuleWidth-\AnnexeSectionRuleHSpace}
+    \AnnexeSectionTitleFont
+    \textcolor{AnnexeSectionTitleColor}{#2}%
+  \end{minipage}
+%    \end{macrocode}
+% On termine en plaçant un espacement vertical donné et une
+% interdiction de coupe. Il n'y a pas besoin de s'occuper du retrait
+% d'alinéa puisqu'il n'y en a pas !
+%    \begin{macrocode}
+  \par\nobreak\addvspace{\AfterAnnexeSectionVSpace}
+}
+%    \end{macrocode}
+% \end{macro}
+% \subsection{Lexique}
+% \begin{macro}{\MotDefinition}
+% La classe propose un système de glossaire. La macro |\MotDefinition|
+% demande un premier argument qui est le mot à placer dans le lexique
+% et un deuxième argument. Si le deuxième argument est vide, le mot à
+% placer dans le lexique est également composé en gras à l'emplacement
+% actuel et le lexique contient une référence à ce mot avec un renvoi
+% à la page en cours. Si le deuxième argument n'est pas vide, la
+% commande ne provoque rien au niveau où elle est émise et le mot sera
+% placé dans le lexique avec une définition correspondant au deuxième
+% argument.
+%
+% Il y aura également un deuxième argument optionnel situé entre les
+% deux arguments obligatoires qui permettra d'indiquer la chaîne de
+% tri pour le lexique.
+%
+% Pour homogénéiser le traitement, on place le tout dans un fichier
+% annexe.
+%    \begin{macrocode}
+\newcommand*\MotDefinition[2][]{%
+  \def\smc@MDlexique{#1}%
+  \def\smc@MDentree{#2}%
+  \smc@MotDefinition
+}
+\newcommand*\smc@MotDefinition[2][]{%
+  \@ifmtarg{#2}{%
+%    \end{macrocode}
+% Si le deuxième argument obligatoire est vide, on compose le premier
+% en gras et on écrit dans le fichier annexe avec la référence à la
+% page en cours.
+%    \begin{macrocode}
+    \textbf{\smc@MDentree}%
+    \ifx\smc@MDlexique\empty
+%    \end{macrocode}
+% Si l'argument optionnel est vide, l'entrée est le mot mis en
+% gras. On ne fait pas de mise en forme directe avec ce type d'entrée
+% puisqu'il peut y avoir plusieurs pages référencées.
+%    \begin{macrocode}
+      \smc@noprotectaddtolexique{#1}{\smc@MDentree}{\thepage}%
+    \else
+%    \end{macrocode}
+% Sinon, l'argument optionnel devient l'entrée du Lexique.
+%    \begin{macrocode}
+      \smc@noprotectaddtolexique{#1}{\smc@MDlexique}{\thepage}%
+    \fi
+  }
+  {%
+%    \end{macrocode}
+% Si le deuxième argument n'est pas vide, on ne compose pas le premier
+% argument et on écrit dans le fichier annexe avec le deuxième
+% argument comme texte explicatif.  
+%    \begin{macrocode}
+    \ifx\smc@MDlexique\empty
+      \smc@addtolexique{#1}{\smc@MDentree}{%
+        \par\nobreak
+        #2%
+        \par\addvspace{\AfterEntreeVSpace}%
+      }%
+    \else
+      \smc@addtolexique{#1}{\smc@MDlexique}{%
+        \par\nobreak
+        #2%
+        \par\addvspace{\AfterEntreeVSpace}%
+      }%
+    \fi
+  }%
+}
+%    \end{macrocode}
+% Pour les entrées d'index, on se sert de la macro |\Lexique| qui
+% permet de faire référence à un autre mot du lexique. Elle ne fait
+% que mettre le mot dans la bonne couleur.
+%    \begin{macrocode}
+\newcommand*\Lexique[1]{%
+  \textcolor{LexiqueEntreeColor}{\LexiqueFont #1}%
+}
+%    \end{macrocode}
+% Il reste à définir la macro d'ajout dans le fichier
+% annexe. L'empilement des |\unexpanded| va permettre d'écrire ce que
+% l'on veut dans le deuxième argument des entrées de lexique. Le
+% premier |\unexpanded| va écrire |\unexpanded{...}| dans le fichier
+% aux et le deuxième permettra l'écriture sans développement dans le
+% fichier lex.
+%    \begin{macrocode}
+\long\def\smc@addtolexique#1#2#3{%
+  \protected@write\@auxout{}
+  {%
+    \string\@writefile{lex}{%
+      \protect\smc@insertlexique[#1]{#2}{\unexpanded{\unexpanded{#3}}}%
+    }%
+  }%
+}
+%    \end{macrocode}
+% On fait une deuxième version non protégée pour pouvoir avoir le
+% numéro de page. Pour gérer les pages multiples, c'est la macro
+% |\smc@preinsertlexique| qui est alors utilisée.
+%    \begin{macrocode}
+\long\def\smc@noprotectaddtolexique#1#2#3{%
+  \protected@write\@auxout{}
+  {%
+    \string\@writefile{lex}{%
+      \protect\smc@preinsertlexique[#1]{#2}{#3}%
+    }%
+  }%
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\smc@addtolom}
+% Macro équivalente pour écrire dans la table des méthodes.
+%    \begin{macrocode}
+\long\def\smc@addtolom#1{%
+  \protected@write\@auxout{}
+  {%
+    \protect\expandafter\global\protect\csname smc@lom\smc@thema@init
+      true\protect\endcsname
+%    \end{macrocode}
+% On doit écrire dans le fichier lom qui dépend du thème général en
+% cours (il y a trois fichiers séparés).
+%    \begin{macrocode}
+    \string\@writefile{lom\smc@thema@init}{%
+      \protect\l@methode{\unexpanded{\unexpanded{#1}}}{\thepage}%
+    }%
+  }%
+}
+%    \end{macrocode}
+% \end{macro}
+% 
+% \begin{macro}{\AfficheLexique}
+% Pour afficher le lexique on utilise la seule macro
+% |\AfficheLexique|. Celle-ci accepte un argument optionnel indiquant
+% le nombre de colonnes sur lesquelles sera composé le lexique. Pour
+% avoir un maximum de souplesse, la valeur par défaut sera stockée
+% dans la variable publique |\NombreColonnesLexique|. La classe fixe à
+% 2 cette valeur par défaut.
+%    \begin{macrocode}
+\newcommand*\NombreColonnesLexique{2}
+\newcommand*\AfficheLexique[1][\NombreColonnesLexique]{%
+%    \end{macrocode}
+% On commence par changer de page et indiquer les styles de page à
+% utiliser pour la suite.
+%    \begin{macrocode}
+  \clearpage
+  \pagestyle{lexique}
+  \thispagestyle{firstlexique}
+%    \end{macrocode}
+% On définit ensuite les éléments permis dans le lexique.
+%    \begin{macrocode}
+  \let\itemize\smc@lexiqueitemize
+  \let\enditemize\endsmc@lexiqueitemize
+  \let\colitemize\smc@lexiquecolitemize
+  \let\endcolitemize\endsmc@lexiquecolitemize
+  \let\enumerate\smc@lexiqueenumerate
+  \let\endenumerate\endsmc@lexiqueenumerate
+  \let\colenumerate\smc@lexiquecolenumerate
+  \let\endcolenumerate\endsmc@lexiquecolenumerate
+  \let\partie\smc@nopartie
+  \let\exercice\smc@noexercice
+  \let\endexercice\endsmc@noexercice
+  \let\corrige\smc@nocorrige
+  \let\endcorrige\endsmc@nocorrige
+  \def\smc@currpart{Lexique}%
+%    \end{macrocode}
+% On compose le titre du lexique.
+%    \begin{macrocode}
+  \rput[Bl](0,9mm){\LexiqueTitleFont \MakeUppercase{\StringLexique}}
+  \vspace*{-5mm}
+%    \end{macrocode}
+% Enfin, on ouvre l'environnement de colonnage avant d'appeler la
+% macro de mise en forme du lexique.
+%    \begin{macrocode}
+  \begingroup
+  \columnsep \dimexpr \SquareWidth*2
+  \columnseprule \LexiqueRuleWidth
+  \def\columnseprulecolor{\color{LexiqueColumnRuleColor}}%
+%    \end{macrocode}
+% On met le compteur d'entrées du lexique à zéro avant de lire le
+% fichier de lexique. La lecture finale se fera avec les macros finales
+% de lecture des entrées. Auparavant, il aura fallu lire le fichier
+% avec les macros de lecture des doublons.
+%    \begin{macrocode}
+  \smc@numlexique \z@
+  \begin{multicols}{#1}%
+%    \end{macrocode}
+% Avant la lecture pour les doublons, on initialise les macros
+% |\smc@insertlexique| et |\smc@preinsertlexique| à leurs valeurs
+% initiales.
+%    \begin{macrocode}
+    \let\smc@insertlexique\smc@insertlexiqueinitial
+    \let\smc@preinsertlexique\smc@preinsertlexiqueinitial
+%    \end{macrocode}
+% La première lecture ne doit pas se faire avec |\@starttoc| puisque
+% cette commande détruit le fichier. En revanche cela demande quelques
+% précautions. D'abord, faire de |@| une lettre ensuite utiliser
+% |\@input| au lieu de |\input| puisque le fichier n'existe pas
+% nécessairement.
+%    \begin{macrocode}
+    \begingroup
+      \makeatletter
+      \@input{\jobname.lex}%
+    \endgroup
+    \let\smc@insertlexique\smc@insertlexiquefinal
+    \let\smc@preinsertlexique\smc@preinsertlexiquefinal
+    \@starttoc{lex}%
+%    \end{macrocode}
+% À ce stade, les entrées ont été mises en forme. Il faut les classer
+% avant de les composer effectivement. Le tri se fera avec
+% l'algorithme de tri fusion en se servant du tableau
+% |\tri<num>|. Comme le tri va porter à la fois sur |\tri<num>| et
+% |\lexique<num>|, il va être plus efficace de construire une liste
+% d'index et de faire le tri sur ces index. Au départ, le tableau
+% d'index est index[1]=1, index[]=2, etc. ce qui fait que le contenu
+% du tableau est son indice.
+%    \begin{macrocode}
+    \multido{\n=1+1}{\smc@numlexique}{%
+      \expandafter\xdef\csname index\n\endcsname{\n}%
+    }%
+%    \end{macrocode}
+% Il faut également faire attention au cas où la liste est vide. Si
+% oui, il ne faut pas lancer le tri fusion (ni affficher).
+%    \begin{macrocode}
+    \ifnum\smc@numlexique>\z@
+      \smc@trifusion{1}{\the\smc@numlexique}%
+%    \end{macrocode}
+% Affichage effectif des entrées. Avant de lancer cet affichage, il
+% faut initialiser la lettre initiale en cours. Les lettres en cours
+% ne peuvent être que des bas de casse non diacritiques on va donc
+% initialiser avec une capitale pour être certain que la première
+% entrée déclenche un changement de lettre.
+%    \begin{macrocode}
+      \def\smc@currentletter{A}%
+      \multido{\n=1+1}{\smc@numlexique}{%
+        \smc@afficheentree{\n}%
+      }%
+    \fi
+  \end{multicols}
+  \endgroup
+}
+%    \end{macrocode}
+% La macro d'affichage des entrées de lexique gère également
+% l'affichage des changement de lettre. L'argument est l'index de
+% l'entrée.
+%    \begin{macrocode}
+\newcommand*\smc@afficheentree[1]{%
+%    \end{macrocode}
+% Le premier travail est de détecter la première lettre de |tri[#1]|
+% et de voir si celle-ci est la première d'une nouvelle série. Cela se
+% fait avec l'appel à la macro |\smc@testfirstletter| en passant la
+% chaîne de tri (en bas de casse) comme argument délimité.
+%    \begin{macrocode}
+  \edef\smc@arg{\csname tri\csname index#1\endcsname\endcsname}%
+  \expandafter\smc@testfirstletter\smc@arg\@nil
+%    \end{macrocode}
+% On affiche ensuite l'entrée proprement dite.
+%    \begin{macrocode}
+  \csname lexique\csname index#1\endcsname\endcsname\endgraf
+}
+%    \end{macrocode}
+% La macro |\smc@testfirstletter| regarde la première lettre de son
+% argument, affiche le bandeau de nouvelle lettre si cette lettre est
+% différente de |\smc@currentletter|.
+%    \begin{macrocode}
+\def\smc@testfirstletter#1#2\@nil{%
+  \def\smc@arg{#1}%
+  \unless\ifx\smc@arg\smc@currentletter
+    \def\smc@currentletter{#1}%
+    \par\addvspace{\BeforeFirstLetterVSpace}
+    \setbox0=\hbox{%
+      \textcolor{FirstLetterTxtColor}{\FirstLetterFont \MakeUppercase{#1}}%
+    }%
+    \begin{pspicture}(0,\dimexpr\ht0+\FirstLetterFrameHSep)
+      \psframe[linewidth=0pt, linestyle=none, fillstyle=solid,
+               fillcolor=FirstLetterBkgColor]
+              (0,\dimexpr\ht0+\FirstLetterFrameHSep)
+              (\linewidth,-\FirstLetterFrameHSep)
+      \rput[B](0.5\linewidth,0){\box0}
+    \end{pspicture}
+    \par\addvspace{\AfterFirstLetterVSpace}
+    \nobreak
+  \fi
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\smc@trifusion}
+% La macro |\smc@trifusion| effectue le tri des entrées
+% |\lexique<num>| en se servant de la table |\tri<num>|. Pour cela,
+% les échanges effectifs se font sur la table d'index
+% |\index<num>|. Cette macro, dans la phase de fusion, va utiliser
+% cinq compteurs.
+%    \begin{macrocode}
+\newcount\smc@firsttable
+\newcount\smc@endfirsttable
+\newcount\smc@secondtable
+\newcount\smc@endsecondtable
+\newcount\smc@writetable
+%    \end{macrocode}
+% Au départ, on passe en paramètre les index extrêmes de la table.
+%    \begin{macrocode}
+\newcommand*\smc@trifusion[2]{%
+  \ifnum#1=#2
+%    \end{macrocode}
+% Si la table à trier ne fait qu'un seul élément, on ne fait rien.
+%    \begin{macrocode}
+  \else
+%    \end{macrocode}
+% Sinon, on trie les deux sous-tables en coupant en deux. Les deux
+% sous-tables ont donc chacune au moins un élément.
+%    \begin{macrocode}
+    \edef\smc@arg{{#1}{\the\numexpr(#1+#2-1)/2}}%
+    \expandafter\smc@trifusion\smc@arg
+    \edef\smc@arg{{\the\numexpr(#1+#2+1)/2}{#2}}%
+    \expandafter\smc@trifusion\smc@arg
+%    \end{macrocode}
+% et on fusionne les deux sous-tables triées qui ont donc toujours au
+% moins un élément chacune.
+%    \begin{macrocode}
+    \smc@fusion{#1}{#2}%
+  \fi
+}
+%    \end{macrocode}
+% Pour le mécanisme de fusion, on fait appel à la macro
+% |\smc@fusion|.
+%    \begin{macrocode}
+\newcommand*\smc@fusion[2]{%
+%    \end{macrocode}
+% On commence par initialiser le pointeur sur le début la première
+% liste, le pointeur sur le début de la seconde liste, les bornes pour
+% la première liste et la seconde liste et le pointeur sur la zone
+% d'écriture
+%    \begin{macrocode}
+  \smc@firsttable=#1
+  \smc@endfirsttable=\numexpr(#1+#2+1)/2
+  \smc@secondtable=\numexpr(#1+#2+1)/2
+  \smc@endsecondtable=\numexpr #2+1
+%    \end{macrocode}
+% L'initialisation de l'index d'écriture se fait avec la valeur
+% antérieure à la valeur de départ car on procède à l'incrémentation
+% avant l'utilisation.
+%    \begin{macrocode}
+  \smc@writetable=\numexpr #1-1
+%    \end{macrocode}
+% On réalise alors l'appel récursif sur la première phase de fusion
+% (où les deux sous-tables n'ont pas encore été épuisées).
+%    \begin{macrocode}
+  \let\smc@next\smc@fusionrec
+  \smc@next
+%    \end{macrocode}
+% La fusion a eu lieu dans un tableau temporaire, il faut la réécrire
+% Appel récursif sur la bonne fonction dans le tableau index.
+%    \begin{macrocode}
+  \multido{\n=#1+1}{\numexpr #2-#1+1}{%
+    \edef\smc@tmp{\csname tmp\n\endcsname}%
+    \expandafter\xdef\csname index\n\endcsname{\smc@tmp}%
+  }
+}
+%    \end{macrocode}
+% La distribution des deux sous-tables dans la table temporaire
+% (triée) se fait avec |\smc@fusionrec|.
+%    \begin{macrocode}
+\newcommand*\smc@fusionrec{%
+%    \end{macrocode}
+% On commence par mettre l'index d'écriture à jour.
+%    \begin{macrocode}
+  \advance\smc@writetable \@ne
+%    \end{macrocode}
+% Ensuite, on compare les chaînes de tri ayant les index indiqués de
+% chaque sous-tableau. À l'appel de cette fonction, aucun des deux
+% sous-tableaux n'a été épuisé.
+%    \begin{macrocode}
+  \ifnum \pdfstrcmp{%
+    \csname tri\csname index\the\smc@firsttable\endcsname\endcsname
+  }{%
+    \csname tri\csname index\the\smc@secondtable\endcsname\endcsname
+  }=-1
+%    \end{macrocode}
+% Si c'est tri[index[first]] qui est inférieur, c'est index[first] qui
+% prend place dans le sous-tableau temporaire.
+%    \begin{macrocode}
+    \edef\smc@tmp{\csname index\the\smc@firsttable\endcsname}%
+    \expandafter\let\csname tmp\the\smc@writetable\endcsname\smc@tmp
+%    \end{macrocode}
+% On incrémente alors le pointeur du premier sous-tableau et on teste
+% si on n'a pas épuisé ce premier sous-tableau.
+%    \begin{macrocode}
+    \advance\smc@firsttable \@ne
+    \ifnum\smc@firsttable=\smc@endfirsttable
+%    \end{macrocode}
+% Si le premier sous-tableau est épuisé, il faut remplir la fin du
+% tableau temporaire avec le second sous-tableau.
+%    \begin{macrocode}
+      \let\smc@next\smc@fusionsecond
+    \fi
+  \else
+%    \end{macrocode}
+% Si c'est tri[index[second]] qui est inférieur, c'est index[second] qui
+% prend place dans le sous-tableau temporaire.
+%    \begin{macrocode}
+    \edef\smc@tmp{\csname index\the\smc@secondtable\endcsname}%
+    \expandafter\let\csname tmp\the\smc@writetable\endcsname\smc@tmp
+%    \end{macrocode}
+% On incrémente alors le pointeur du premier sous-tableau et on teste
+% si on n'a pas épuisé ce premier sous-tableau.
+%    \begin{macrocode}
+    \advance\smc@secondtable \@ne
+    \ifnum\smc@secondtable=\smc@endsecondtable
+%    \end{macrocode}
+% Si le second sous-tableau est épuisé, il faut remplir la fin du
+% tableau temporaire avec le premier sous-tableau.
+%    \begin{macrocode}
+      \let\smc@next\smc@fusionfirst
+    \fi
+  \fi
+%    \end{macrocode}
+% Appel récursif sur la bonne fonction.
+%    \begin{macrocode}
+  \smc@next
+}
+%    \end{macrocode}
+% Il reste à définir les deux macros qui remplissent la fin du tableau
+% temporaire avec le sous-tableau non épuisé.
+%    \begin{macrocode}
+\newcommand*\smc@fusionfirst{%
+%    \end{macrocode}
+% À l'appel, le sous-tableau ne peut pas être vide, on effectue donc
+% la copie d'abord puis les tests de fin de tableau ensuite.
+%    \begin{macrocode}
+  \advance\smc@writetable \@ne
+  \edef\smc@tmp{\csname index\the\smc@firsttable\endcsname}%
+  \expandafter\let\csname tmp\the\smc@writetable\endcsname\smc@tmp
+  \advance\smc@firsttable \@ne
+  \ifnum\smc@firsttable=\smc@endfirsttable
+%    \end{macrocode}
+% Si le premier tableau est épuisé, on a fini la fusion
+%    \begin{macrocode}
+    \let\smc@next\relax
+  \fi
+  \smc@next
+}
+%    \end{macrocode}
+% La macro |\smc@fusionsecond| fonctionne exactement de la même façon.
+%    \begin{macrocode}
+\newcommand*\smc@fusionsecond{%
+  \advance\smc@writetable \@ne
+  \edef\smc@tmp{\csname index\the\smc@secondtable\endcsname}%
+  \expandafter\let\csname tmp\the\smc@writetable\endcsname\smc@tmp
+  \advance\smc@secondtable \@ne
+  \ifnum\smc@secondtable=\smc@endsecondtable
+    \let\smc@next\relax
+  \fi
+  \smc@next
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\smc@insertlexique}
+% Cette macro existe en deux versions à cause du travail sur les
+% doublons au niveau du lexique. La première version est une version
+% fantome qui permet de supprimer les actions de cette macro, la
+% deuxième version est celle qui permet la composition effective de
+% l'entrée dans le lexique.
+%
+% On commence par la version fantome qui ne fait qu'avaler les paramètres.
+%    \begin{macrocode}
+\newcommand\smc@insertlexiqueinitial[3][]{}
+%    \end{macrocode}
+% La deuxième version est celle qui effectue le travail
+% véritable. Elle réalise deux conversions :
+% \begin{itemize}
+% \item elle met en capitale la première lettre du mot (ou de
+%   l'expression) et sauvegarde le résultat dans la macro
+%   |\lexique<num>| ;
+% \item elle construit une chaîne équivalente sans diacritique (repéré
+% avec |IeC|) et sauvegarde le résultat dans la macro |\tri<num>|.
+% \end{itemize}
+%    \begin{macrocode}
+\newcount\smc@numlexique
+\newcommand\smc@insertlexiquefinal[3][]{%
+  \global\advance\smc@numlexique \@ne
+%    \end{macrocode}
+% Appel de la macro auxiliaire pour mettre la première lettre de
+% l'entrée en capitale et régler la mise en forme globale de
+% l'ensemble de l'entrée.
+%    \begin{macrocode}
+  \@ifmtarg{#1}%
+    {\smc@@FirstUppercase#2\@nil#3\@nil}%
+%    \end{macrocode}
+% Si l'argument optionnel de tri n'est pas vide, on ne cherche pas à
+% mettre en forme l'entrée de l'index.
+%    \begin{macrocode}
+    {\expandafter\protected@xdef\csname lexique\the\smc@numlexique\endcsname
+      {%
+        \protect\textcolor{LexiqueEntreeColor}
+          {%
+            \protect\LexiqueEntreeFont #2%
+          }%
+        \unexpanded{#3}%
+      }%
+    }%
+%    \end{macrocode}
+% Appel de la macro auxiliaire pour écrire tout en minuscule sans
+% diacritique.
+%    \begin{macrocode}
+  \@ifmtarg{#1}%
+    {\smc@sansdiacritique{#2}}%
+    {\smc@sansdiacritique{#1}}%
+%    \end{macrocode}
+% La macro précédente renvoie la chaîne sans espace et sans
+% diacritique dans la macro |\smc@tri|. On l'écrit dans
+% |\tri<num>|.
+%    \begin{macrocode}
+  \expandafter\xdef\csname tri\the\smc@numlexique\endcsname{\smc@tri}%
+}
+%    \end{macrocode}
+% La macro |\smc@preinsertlexique| existe également en deux versions
+% pour traiter les doublons. Et c'est effectivement les entrées
+% utilisant cette macro qui nécessitent le traitement particulier.
+%    \begin{macrocode}
+\newcommand\smc@preinsertlexiqueinitial[3][]{%
+%    \end{macrocode}
+% Le repérage des doublons se fera sur le critère de tri. On commence
+% donc par calculer ce dernier
+%    \begin{macrocode}
+  \@ifmtarg{#1}%
+    {\smc@sansdiacritique{#2}}%
+    {\smc@sansdiacritique{#1}}%
+%    \end{macrocode}
+% La chaîne de tri est stockée dans |\smc@tri|. On regarde si la macro
+% |\nb-<tri>| existe.
+%    \begin{macrocode}
+  \ifcsname nb-\smc@tri\endcsname
+%    \end{macrocode}
+% La macro existe, il y a donc des doublons. On met à jour les macros
+% |\nb-<tri>| et |\pages-<tri>| qui contiennent repectivement le
+% nombre de pages et la liste des pages de l'entrée en cours. Il faut
+% également que la page en cours ne soit pas la dernière entrée.
+%
+% On incrémente |\nb-<tri>| et on ajoute la page indiquée à
+% |\pages-<tri>|.
+%    \begin{macrocode}
+    \unless\ifnum\csname lastpage-\smc@tri\endcsname=#3
+      \expandafter\gdef\csname lastpage-\smc@tri\endcsname{#3}%
+      \expandafter\xdef\csname nb-\smc@tri\endcsname{%
+        \the\numexpr\csname nb-\smc@tri\endcsname+1
+      }%
+      \edef\smc@tmp{\csname pages-\smc@tri\endcsname}%
+      \expandafter\xdef\csname pages-\smc@tri\endcsname{\smc@tmp, #3}%
+    \fi
+  \else
+%    \end{macrocode}
+% Si la macro n'existe pas, c'est que c'est la première occurrence de
+% cette entrée. On initialise la page en cours et les deux macros.
+%    \begin{macrocode}
+    \expandafter\gdef\csname lastpage-\smc@tri\endcsname{#3}%
+    \expandafter\gdef\csname nb-\smc@tri\endcsname{1}%
+    \expandafter\gdef\csname pages-\smc@tri\endcsname{#3}%
+  \fi
+}
+%    \end{macrocode}
+% La verion finale permet la composition proprement dite.
+%    \begin{macrocode}
+\newcommand\smc@preinsertlexiquefinal[3][]{%
+%    \end{macrocode}
+% On regarde si l'entrée à déjà été rencontrée. Pour cela, on si la
+% macro |\affiche-<tri>| existe.
+%    \begin{macrocode}
+  \@ifmtarg{#1}%
+    {\smc@sansdiacritique{#2}}%
+    {\smc@sansdiacritique{#1}}%
+  \ifcsname affiche-\smc@tri\endcsname
+  \else
+%    \end{macrocode}
+% Il n'y aura traitement que si cette macro n'existe pas. Dans ce cas,
+% on commence par définir cette macro pour éviter les doublons.
+%    \begin{macrocode}
+    \expandafter\gdef\csname affiche-\smc@tri\endcsname{true}%
+%    \end{macrocode}
+% Le reste du traitement est presque comme celui d'une entrée avec
+% définition. La différence est qu'ici, on affiche une liste de pages
+% au lieu d'une définition et qu'on a besoin pour cela du critère de
+% tri (d'où l'appel initial de |\smc@sansdiacritique|).
+%    \begin{macrocode}
+    \@ifmtarg{#1}%
+      {\smc@sansdiacritique{#2}}%
+      {\smc@sansdiacritique{#1}}%
+    \global\advance\smc@numlexique \@ne
+%    \end{macrocode}
+% On va s'occuper de l'entrée numéro |\smc@numlexique|.
+%    \begin{macrocode}
+    \@ifmtarg{#1}%
+%    \end{macrocode}
+% S'il n'y a pas d'argument optionnel, le traitement se fera avec une
+% macro annexe.
+%    \begin{macrocode}
+      {\smc@@preFirstUppercase#2\@nil#3\@nil}%
+%    \end{macrocode}
+% Sinon, on compose l'entrée comme d'habitude.
+%    \begin{macrocode}
+      {\expandafter\protected@xdef\csname lexique\the\smc@numlexique\endcsname
+        {%
+          \protect\textcolor{LexiqueEntreeColor}{%
+            \protect\LexiqueEntreeFont #2%
+          }%
+%    \end{macrocode}
+% La valeur |4.4em| est en fait $10\times0.44\mathtt{em}$. Elle sert
+% à gérer correctement l'alignement des points de suite en assurant un
+% minimum de 10 points de suite.
+%    \begin{macrocode}
+          \space\hbox to4.4em{\rdotfill}\kern-0.44em\rdotfill
+%    \end{macrocode}
+% Test de pluriel pour le mot \og Page(s) \fg{}.
+%    \begin{macrocode}
+          \ifnum\csname nb-\smc@tri\endcsname>\@ne
+            \protect\emph{ Pages \csname pages-\smc@tri\endcsname}%
+          \else
+            \protect\emph{ Page \csname pages-\smc@tri\endcsname}%
+          \fi
+        }%
+      }%
+%    \end{macrocode}
+% La macro |\smc@tri| est déjà calculée, on peut s'en servir
+% directement.
+%    \begin{macrocode}
+    \expandafter\xdef\csname tri\the\smc@numlexique\endcsname
+      {\smc@tri}%
+  \fi
+}
+%    \end{macrocode}
+% Pour gérer les diacritiques, on a besoin d'un très grand nombre de
+% macros de comparaison. La première détecte le |\IeC| indiquant un
+% caractère hors ASCII. Les autres permettent de distinguer toutes les
+% diacritiques et ligatures utilisées en français (et un peu au-delà).
+%    \begin{macrocode}
+\def\smc@IeC{\IeC}
+\def\smcl@Ag{\`A}
+\def\smcl@Aa{\'A}
+\def\smcl@Ac{\^A}
+\def\smcl@At{\~A}
+\def\smcl@Au{\"A}
+\def\smcl@Ar{\r A}
+\def\smcl@AE{\AE}
+\def\smcl@Cc{\c C}
+\def\smcl@Eg{\`E}
+\def\smcl@Ea{\'E}
+\def\smcl@Ec{\^E}
+\def\smcl@Eu{\"E}
+\def\smcl@Ig{\`I}
+\def\smcl@Ia{\'I}
+\def\smcl@Ic{\^I}
+\def\smcl@Iu{\"I}
+\def\smcl@Nn{\~N}
+\def\smcl@Og{\`O}
+\def\smcl@Oa{\'O}
+\def\smcl@Oc{\^O}
+\def\smcl@Ot{\~O}
+\def\smcl@Ou{\"O}
+\def\smcl@Oo{\O}
+\def\smcl@OE{\OE}
+\def\smcl@Ug{\`U}
+\def\smcl@Ua{\'U}
+\def\smcl@Uc{\^U}
+\def\smcl@Uu{\"U}
+\def\smcl@Yt{\"Y}
+\def\smcl@ss{\ss}
+\def\smcl@ag{\`a}
+\def\smcl@aa{\'a}
+\def\smcl@ac{\^a}
+\def\smcl@at{\~a}
+\def\smcl@au{\"a}
+\def\smcl@ar{\r a}
+\def\smcl@ae{\ae}
+\def\smcl@cc{\c c}
+\def\smcl@eg{\`e}
+\def\smcl@ea{\'e}
+\def\smcl@ec{\^e}
+\def\smcl@eu{\"e}
+\def\smcl@ig{\`i}
+\def\smcl@ia{\'i}
+\def\smcl@ic{\^i}
+\def\smcl@iu{\"i}
+\def\smcl@nn{\~n}
+\def\smcl@og{\`o}
+\def\smcl@oa{\'o}
+\def\smcl@oc{\^o}
+\def\smcl@ot{\~o}
+\def\smcl@ou{\"o}
+\def\smcl@oo{\o}
+\def\smcl@oe{\oe}
+\def\smcl@ug{\`u}
+\def\smcl@ua{\'u}
+\def\smcl@uc{\^u}
+\def\smcl@uu{\"u}
+\def\smcl@yt{\"y}
+%    \end{macrocode}
+% La première macro auxiliaire permet de composer son entrée avec sa
+% première lettre en capitale et toutes les autres en bas de casse. 
+%    \begin{macrocode}
+\long\def\smc@@FirstUppercase#1#2#3\@nil#4\@nil{%
+  \def\smc@arg{#1}%
+  \ifx\smc@arg\smc@IeC
+%    \end{macrocode}
+% Si la première unité lexicale est |\IeC|, c'est qu'il faut prendre
+% les deux première unités lexicales pour la première lettre à mettre
+% en capitale.
+%    \begin{macrocode}
+    \expandafter\protected@xdef\csname lexique\the\smc@numlexique\endcsname
+      {%
+        \protect\textcolor{LexiqueEntreeColor}
+          {%
+            \protect\LexiqueEntreeFont
+            \MakeUppercase{#1#2}%
+            \MakeLowercase{#3}%
+          }%
+        \unexpanded{#4}%
+      }%
+  \else
+%    \end{macrocode}
+% Sinon, on ne met en capitale que la première lettre qui correpond à
+% la première unité lexicale.
+%    \begin{macrocode}
+    \expandafter\protected@xdef\csname lexique\the\smc@numlexique\endcsname
+      {%
+        \protect\textcolor{LexiqueEntreeColor}
+          {%
+            \protect\LexiqueEntreeFont
+            \MakeUppercase{#1}%
+            \MakeLowercase{#2#3}%
+          }%
+        \unexpanded{#4}%
+      }%
+  \fi
+}
+%    \end{macrocode}
+% Il existe une variante à la macro précédente pour les entrées avec
+% liste de pages. Elle est identique sauf en ce qui concerne
+% l'affichage de la liste de page.
+%    \begin{macrocode}
+\long\def\smc@@preFirstUppercase#1#2#3\@nil#4\@nil{%
+  \def\smc@arg{#1}%
+  \ifx\smc@arg\smc@IeC
+    \expandafter\protected@xdef\csname lexique\the\smc@numlexique\endcsname
+      {%
+        \protect\textcolor{LexiqueEntreeColor}
+          {%
+            \protect\LexiqueEntreeFont
+            \MakeUppercase{#1#2}%
+            \MakeLowercase{#3}%
+          }%
+        \space\hbox to4.4em{\rdotfill}\kern-0.44em\rdotfill
+        \ifnum\csname nb-\smc@tri\endcsname>\@ne
+          \protect\emph{ Pages \csname pages-\smc@tri\endcsname}%
+        \else
+          \protect\emph{ Page \csname pages-\smc@tri\endcsname}%
+        \fi
+      }%
+  \else
+    \expandafter\protected@xdef\csname lexique\the\smc@numlexique\endcsname
+      {%
+        \protect\textcolor{LexiqueEntreeColor}
+          {%
+            \protect\LexiqueEntreeFont
+            \MakeUppercase{#1}%
+            \MakeLowercase{#2#3}%
+          }%
+        \space\hbox to4.4em{\rdotfill}\kern-0.44em\rdotfill
+        \ifnum\csname nb-\smc@tri\endcsname>\@ne
+          \protect\emph{ Pages \csname pages-\smc@tri\endcsname}%
+        \else
+          \protect\emph{ Page \csname pages-\smc@tri\endcsname}%
+        \fi
+      }%
+  \fi
+}
+%    \end{macrocode}
+% Deuxième macro auxiliaire pour récrire un mot ou une expression sans
+% diacritiques, ligatures et espace et le tout en minuscule. Cela va
+% servir pour effectuer un tri alphabétique. 
+%    \begin{macrocode}
+\def\smc@sansdiacritique#1{%
+%    \end{macrocode}
+% On commence par vider la macro qui va recevoir le résultat.
+%    \begin{macrocode}
+  \def\smc@tri{}%
+%    \end{macrocode}
+% Pour avoir la forme avec les éventuels |\IeC|, il faut procéder à un
+% développement protégé de l'argument.
+%    \begin{macrocode}
+  \protected@edef\smc@arg{#1}%
+%    \end{macrocode}
+% Ensuite, on initialise et on lance le traitement récurrent.
+%    \begin{macrocode}
+  \let\smc@next\smc@sd
+  \expandafter\smc@next\smc@arg\@nil
+}
+%    \end{macrocode}
+% Macro récursive de remplacement d'une diacritique par la lettre
+% simple correspondante ou de la ligature par les deux lettres la
+% composant. Elle met également tout en minuscule.
+%    \begin{macrocode}
+\def\smc@sd#1{%
+  \def\smc@arg{#1}%
+  \ifx\smc@arg\@nnil
+%    \end{macrocode}
+% Si on a atteint le |\@nil|, on arrête la récurrence.
+%    \begin{macrocode}
+    \let\smc@next\relax
+  \else
+    \ifx\smc@arg\smc@IeC
+%    \end{macrocode}
+% Si on vient de lire un |\IeC|, on a à procéder à un traitement
+% spécial assuré par la macro |\smc@@sd|.
+%    \begin{macrocode}
+      \let\smc@next\smc@@sd
+    \else
+%    \end{macrocode}
+% Sinon, c'est une lettre non diacritique et on la recopie dans la
+% macro de résultat en minuscule.
+%    \begin{macrocode}
+      \def\smc@arg{#1}%
+      \ifnum`#1<`A
+        \edef\smc@tri{\smc@tri#1}%
+      \else\ifnum`#1>`Z
+        \edef\smc@tri{\smc@tri#1}%
+      \else
+        \edef\smc@tri{\smc@tri\smc@bdc{\numexpr`#1-`A}}%
+      \fi\fi
+    \fi
+  \fi
+  \smc@next
+}
+%    \end{macrocode}
+% Macro pour changer les capitales ASCII en bas de casse ASCII
+% correspondant. L'argument est le rang de la capitale (de 0 à 25)
+%    \begin{macrocode}
+\newcommand*\smc@bdc[1]{%
+  \ifcase#1
+    a%
+    \or b%
+    \or c%
+    \or d%
+    \or e%
+    \or f%
+    \or g%
+    \or h%
+    \or i%
+    \or j%
+    \or k%
+    \or l%
+    \or m%
+    \or n%
+    \or o%
+    \or p%
+    \or q%
+    \or r%
+    \or s%
+    \or t%
+    \or u%
+    \or v%
+    \or w%
+    \or x%
+    \or y%
+    \or z%
+    \else ???%
+  \fi
+}
+%    \end{macrocode}
+% Macro pour changer les diacritiques (ou ligatures) en équivalent
+% ASCII (minuscule).
+%    \begin{macrocode}
+\def\smc@@sd#1{%
+  \def\smc@arg{#1}
+  \ifx\smc@arg\smcl@Ag
+    \edef\smc@tri{\smc@tri a}%
+  \else\ifx\smc@arg\smcl@Aa
+    \edef\smc@tri{\smc@tri a}%
+  \else\ifx\smc@arg\smcl@Ac
+    \edef\smc@tri{\smc@tri a}%
+  \else\ifx\smc@arg\smcl@At
+    \edef\smc@tri{\smc@tri a}%
+  \else\ifx\smc@arg\smcl@Au
+    \edef\smc@tri{\smc@tri a}%
+  \else\ifx\smc@arg\smcl@Ar
+    \edef\smc@tri{\smc@tri a}%
+  \else\ifx\smc@arg\smcl@AE
+    \edef\smc@tri{\smc@tri ae}%
+  \else\ifx\smc@arg\smcl@Cc
+    \edef\smc@tri{\smc@tri c}%
+  \else\ifx\smc@arg\smcl@Eg
+    \edef\smc@tri{\smc@tri e}%
+  \else\ifx\smc@arg\smcl@Ea
+    \edef\smc@tri{\smc@tri e}%
+  \else\ifx\smc@arg\smcl@Ec
+    \edef\smc@tri{\smc@tri e}%
+  \else\ifx\smc@arg\smcl@Eu
+    \edef\smc@tri{\smc@tri e}%
+  \else\ifx\smc@arg\smcl@Ig
+    \edef\smc@tri{\smc@tri i}%
+  \else\ifx\smc@arg\smcl@Ia
+    \edef\smc@tri{\smc@tri i}%
+  \else\ifx\smc@arg\smcl@Ic
+    \edef\smc@tri{\smc@tri i}%
+  \else\ifx\smc@arg\smcl@Iu
+    \edef\smc@tri{\smc@tri i}%
+  \else\ifx\smc@arg\smcl@Nn
+    \edef\smc@tri{\smc@tri n}%
+  \else\ifx\smc@arg\smcl@Og
+    \edef\smc@tri{\smc@tri o}%
+  \else\ifx\smc@arg\smcl@Oa
+    \edef\smc@tri{\smc@tri o}%
+  \else\ifx\smc@arg\smcl@Oc
+    \edef\smc@tri{\smc@tri o}%
+  \else\ifx\smc@arg\smcl@Ot
+    \edef\smc@tri{\smc@tri o}%
+  \else\ifx\smc@arg\smcl@Ou
+    \edef\smc@tri{\smc@tri o}%
+  \else\ifx\smc@arg\smcl@Oo
+    \edef\smc@tri{\smc@tri o}%
+  \else\ifx\smc@arg\smcl@OE
+    \edef\smc@tri{\smc@tri oe}%
+  \else\ifx\smc@arg\smcl@Ug
+    \edef\smc@tri{\smc@tri u}%
+  \else\ifx\smc@arg\smcl@Ua
+    \edef\smc@tri{\smc@tri u}%
+  \else\ifx\smc@arg\smcl@Uc
+    \edef\smc@tri{\smc@tri u}%
+  \else\ifx\smc@arg\smcl@Uu
+    \edef\smc@tri{\smc@tri u}%
+  \else\ifx\smc@arg\smcl@Yt
+    \edef\smc@tri{\smc@tri y}%
+  \else\ifx\smc@arg\smcl@ss
+    \edef\smc@tri{\smc@tri s}%
+  \else\ifx\smc@arg\smcl@ag
+    \edef\smc@tri{\smc@tri a}%
+  \else\ifx\smc@arg\smcl@aa
+    \edef\smc@tri{\smc@tri a}%
+  \else\ifx\smc@arg\smcl@ac
+    \edef\smc@tri{\smc@tri a}%
+  \else\ifx\smc@arg\smcl@at
+    \edef\smc@tri{\smc@tri a}%
+  \else\ifx\smc@arg\smcl@au
+    \edef\smc@tri{\smc@tri a}%
+  \else\ifx\smc@arg\smcl@ar
+    \edef\smc@tri{\smc@tri a}%
+  \else\ifx\smc@arg\smcl@ae
+    \edef\smc@tri{\smc@tri ae}%
+  \else\ifx\smc@arg\smcl@cc
+    \edef\smc@tri{\smc@tri c}%
+  \else\ifx\smc@arg\smcl@eg
+    \edef\smc@tri{\smc@tri e}%
+  \else\ifx\smc@arg\smcl@ea
+    \edef\smc@tri{\smc@tri e}%
+  \else\ifx\smc@arg\smcl@ec
+    \edef\smc@tri{\smc@tri e}%
+  \else\ifx\smc@arg\smcl@eu
+    \edef\smc@tri{\smc@tri e}%
+  \else\ifx\smc@arg\smcl@ig
+    \edef\smc@tri{\smc@tri i}%
+  \else\ifx\smc@arg\smcl@ia
+    \edef\smc@tri{\smc@tri i}%
+  \else\ifx\smc@arg\smcl@ic
+    \edef\smc@tri{\smc@tri i}%
+  \else\ifx\smc@arg\smcl@iu
+    \edef\smc@tri{\smc@tri i}%
+  \else\ifx\smc@arg\smcl@nn
+    \edef\smc@tri{\smc@tri n}%
+  \else\ifx\smc@arg\smcl@og
+    \edef\smc@tri{\smc@tri o}%
+  \else\ifx\smc@arg\smcl@oa
+    \edef\smc@tri{\smc@tri o}%
+  \else\ifx\smc@arg\smcl@oc
+    \edef\smc@tri{\smc@tri o}%
+  \else\ifx\smc@arg\smcl@ot
+    \edef\smc@tri{\smc@tri o}%
+  \else\ifx\smc@arg\smcl@ou
+    \edef\smc@tri{\smc@tri o}%
+  \else\ifx\smc@arg\smcl@oo
+    \edef\smc@tri{\smc@tri o}%
+  \else\ifx\smc@arg\smcl@oe
+    \edef\smc@tri{\smc@tri oe}%
+  \else\ifx\smc@arg\smcl@ug
+    \edef\smc@tri{\smc@tri u}%
+  \else\ifx\smc@arg\smcl@ua
+    \edef\smc@tri{\smc@tri u}%
+  \else\ifx\smc@arg\smcl@uc
+    \edef\smc@tri{\smc@tri u}%
+  \else\ifx\smc@arg\smcl@uu
+    \edef\smc@tri{\smc@tri u}%
+  \else\ifx\smc@arg\smcl@yt
+    \edef\smc@tri{\smc@tri y}%
+  \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
+%    \end{macrocode}
+% Les appels récursifs suivants reviennent sur |\smc@sd|.
+%    \begin{macrocode}
+  \let\smc@next\smc@sd
+  \smc@next
+}
+%    \end{macrocode}
+% \end{macro}
+% \subsection{Liste des méthodes}
+% \begin{macro}{\rdotfill}
+% Pour les besoins de |\l@methode| on a besoin de points de suite
+% calés sur la droite et non centré comme ceux proposés par \LaTeX.
+%    \begin{macrocode}
+\newcommand*\rdotfill{%
+  \leavevmode
+  \leaders \hb@xt@ .44em{\hss.}\hfill
+  \kern\z@
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\l@methode}
+% La liste des méthodes emploie un mécanisme similaire à celui de la
+% table des matières. En particulier, la mise en forme des titres des
+% méthodes est assurée par la macro |\l@methode| qui prend deux
+% arguments : le titre et le numéro de page.
+%    \begin{macrocode}
+\newcommand*\l@methode[2]{%
+  \begin{minipage}[b]{\linewidth-1.5cm}
+    \raggedright
+    \ListeMethodeTitleFont
+    \begin{pspicture}(0,0)(\TriangleMethodeSize,\TriangleMethodeSize)
+      \pspolygon*[linecolor=\CorrigeChapterFrameColor]
+                 (0,0)(0,\TriangleMethodeSize)
+                 (\TriangleMethodeSize,\dimexpr\TriangleMethodeSize/2)
+    \end{pspicture}
+    \textcolor{ListeMethodeTitleColor}{#1}%
+    \rdotfill
+  \end{minipage}\kern-0.44em
+  {\ListeMethodePageFont \rdotfill#2\strut}%
+  \par\addvspace{\AfterMethodeVSpace}
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\ListeMethodesThemes}
+% La liste des méthodes se fait normalement dans l'ordre des thèmes
+% suivant :
+% \begin{itemize}
+% \item Statistiques et probabilité ;
+% \item Fonctions ;
+% \item Géométrie.
+% \end{itemize}
+% En réalité, c'est la macro |\ListeMethodesThemes| qui indiquera
+% quels seront les thèmes inclus et dans quel ordre. Pour cela, la
+% macro contiendra la liste des codes minuscules et majuscules de
+% chaque thème séparés par des virgules. Comme il y a possibilité
+% d'avoir des codes sur plusieurs lettres, il est plus sage de
+% spécifier ces lettres entre accolades. La classe donne l'ordre et le
+% contenu par défaut listé ci-dessus.
+% \end{macro}
+%    \begin{macrocode}
+\newcommand\ListeMethodesThemes{{sp}{SP},{f}{F},{g}{G}}
+%    \end{macrocode}
+% \begin{macro}{\AfficheListeMethodes}
+% La classe permet de faire la liste des méthodes. Pour cela, on
+% utilisera la macro |\AfficheListeMethodes|.
+%
+% Celle-ci utilise des cadres d'en-tête basés sur le même modèle que
+% celui des récréations mais avec des couleurs différentes et qui
+% dépendent du thème en cours.
+% \begin{macrocode}
+\newcommand*\smc@bandeaulistemethodes[1]{%
+  \par\addvspace{\BeforeRecreationVSpace}
+  \begin{pspicture}(0,0)(\linewidth,\dimexpr\SquareWidth*3)
+    \psframe*[linewidth=0pt,linecolor=ChapterNumSquare5Color]
+             (0,0)(\linewidth,\dimexpr\SquareWidth*3)
+    \psset{fillstyle=solid}
+    \smc@antidiagonal(0mm,0mm){ChapterNumSquare}
+    \rput[Bl](\dimexpr \SquareWidth*4,\SquareWidth){%
+      \textcolor{ChapterNumSquare0Color}{\RecreationFont #1}%
+    }
+    \psset{linewidth=0pt}
+    \smc@putsquare(32,2){J1}
+    \smc@putsquare(33,0){H4}
+    \smc@putsquare(34,1){H2}
+    \smc@putsquare(37,1){F3}
+    \smc@putsquare(39,0){H2}
+    \smc@putsquare(42,2){J2}
+    \smc@putsquare(46,1){H4}
+  \end{pspicture}
+  \par\nobreak\addvspace{\AfterRecreationVSpace}
+}
+%    \end{macrocode}
+% L'affichage ou non des blocs de liste de méthodes par thème est sous
+% la dépendance des booléens associés.
+%    \begin{macrocode}
+\newif\ifsmc@lomsp
+\newif\ifsmc@lomf
+\newif\ifsmc@lomg
+%    \end{macrocode}
+% On indique le nombre de colonnes de la liste des méthodes soit par
+% l'intermédiaire de la macro |\NombreColonnesListeMethodes|, soit en
+% utilisant l'argument optionnel de |\AfficheListeMethodes|.
+%    \begin{macrocode}
+\newcommand*\NombreColonnesListeMethodes{2}
+\newcommand*\AfficheListeMethodes[1][\NombreColonnesListeMethodes]{%
+%    \end{macrocode}
+% On commence par changer de page et indiquer les styles de page à
+% utiliser pour la suite.
+%    \begin{macrocode}
+  \clearpage
+  \pagestyle{affichemethode}
+  \thispagestyle{firstaffichemethode}
+%    \end{macrocode}
+% On compose le titre de l'annexe.
+%    \begin{macrocode}
+  \rput[Bl](0,9mm){\ListeMethodeChapterFont \MakeUppercase{\StringListeMethode}}
+  \vspace*{-5mm}
+%    \end{macrocode}
+% Enfin, on ouvre l'environnement de colonnage avant d'appeler les
+% trois fichiers qui contiennent les listes des méthodes.
+%    \begin{macrocode}
+  \begingroup
+    \columnsep \dimexpr \SquareWidth*2
+    \columnseprule \ListeMethodeRuleWidth
+    \def\columnseprulecolor{\color{ListeMethodeColumnRuleColor}}%
+%    \end{macrocode}
+% Avant d'afficher la liste des méthodes, il faut tuer la macro
+% |\MethodeRefExercice|
+%    \begin{macrocode}
+    \renewcommand*\MethodeRefExercice{\@ifstar{\@gobble}{\@gobble}}
+%    \end{macrocode}
+% On sauvegarde le nombre de colonnes dans une macro auxiliaire qui
+% servira dans |\smc@AfficheListeMethodesTheme|.
+%    \begin{macrocode}
+    \def\smc@NombreColonnesListeMethodes{#1}%
+%    \end{macrocode}
+% On compose maintenant la liste des méthodes dans l'ordre des thèmes indiqués.
+%    \begin{macrocode}
+    \tracingifs=1
+    \@for\smc@currtheme:=\ListeMethodesThemes\do{%
+      \expandafter\smc@AfficheListeMethodesTheme\smc@currtheme
+    }%
+  \endgroup
+}
+%    \end{macrocode}
+% La macro suivante affiche la liste des méthodes pour le thème donné
+% en arguments (la ou les lettres minuscules puis la ou les lettres
+% capitales).
+%    \begin{macrocode}
+\newcommand\smc@AfficheListeMethodesTheme[2]{%
+%    \end{macrocode}
+% La liste des méthodes pour le thème ne sera affichée que s'il y a au
+% moins une méthode ce qui est indiqué avec le booléen
+% |\ifsmc@lom<theme>|.
+%    \begin{macrocode}
+  \expandafter\ifx\csname ifsmc@lom#1\endcsname\iftrue
+    \csname smc@thema#2Color\endcsname
+    \expandafter\smc@bandeaulistemethodes
+      \expandafter{\csname StringListeMethode#2\endcsname}
+%    \end{macrocode}
+% Malheureusement l'environnement \environ{multicols} n'est pas
+% capable de composer sur une seule colonne. D'où la construction
+% suivante.
+%    \begin{macrocode}
+    \ifnum \smc@NombreColonnesListeMethodes=\@ne
+      \@starttoc{lom#1}
+    \else
+      \begin{multicols}{\smc@NombreColonnesListeMethodes}
+        \@starttoc{lom#1}
+      \end{multicols}
+    \fi
+  \fi
+}
+%    \end{macrocode}
+% \end{macro}
+% \subsection{Texte libre}
+% Afin de permettre à l'utilisateur de se servir de la classe pour
+% composer une ou quelques feuilles sans devoir suivre la structure
+% d'un ouvrage entier, on met à disposition la commande |\libre|. Elle
+% va permettre, par exemple, de prendre le texte source d'un exercice
+% et de pouvoir le composer sans avoir à passer par toute la
+% machinerie d'un ouvrage (thème, en-tête coloré, etc.).
+%
+% L'ensemble du code est pris sur celui de la commande |\annexe| et
+% des ses macros satellites. Quelques éléments sont simplifiés. On
+% commence avec la macro permettant de modifier les couleurs par l'utilisateur
+% \begin{macro}{\ChangeLibre}
+%    \begin{macrocode}
+\newcommand*\ChangeLibre[4]{%
+  \colorlet{LibreHeadFrameColor}{#1}%
+  \colorlet{LibreSectionRuleColor}{#2}%
+  \colorlet{LibreItemColor}{#2}%
+  \colorlet{LibreExerciceCorrigeNumFrameColor}{#2}%
+  \colorlet{LibreExerciceNumFrameColor}{#2}%
+  \colorlet{LibreSectionTitleColor}{#3}%
+  \colorlet{LibreExerciceTitleColor}{#3}
+  \colorlet{LibreExerciceNumColor}{#4}
+}
+%    \end{macrocode}
+% On appelle maintenant cette macro avec les couleurs par défaut.
+%    \begin{macrocode}
+\ChangeLibre{G3}{A1}{G1}{Blanc}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\libre}
+% On peut maintenant définir la macro |\libre|. Avant cela on définit
+% un certain nombre de compteur à initialiser à ce
+% niveau. Contrairement aux annexes générales, il n'y a pas de titre
+% ici donc pas d'argument à cette commande.
+%    \begin{macrocode}
+\newcommand*\libre{%
+  \let\itemize\smc@libreitemize
+  \let\enditemize\endsmc@libreitemize
+  \let\colitemize\smc@librecolitemize
+  \let\endcolitemize\endsmc@librecolitemize
+  \let\enumerate\smc@libreenumerate
+  \let\endenumerate\endsmc@libreenumerate
+  \let\colenumerate\smc@librecolenumerate
+  \let\endcolenumerate\endsmc@librecolenumerate
+  \let\partie\smc@nopartie
+  \let\exercice\smc@libreexercice
+  \let\endexercice\endsmc@libreexercice
+  \let\corrige\smc@librecorrige
+  \let\endcorrige\endsmc@librecorrige
+  \let\section\smc@libresection
+  \def\smc@currpart{Libre}%
+  \setcounter{propriete}{0}%
+  \setcounter{exercice}{0}%
+%    \end{macrocode}
+% Il faut placer une balise quelconque dans le fichier de correction
+% pour qu'il existe.
+%    \begin{macrocode}
+  \addtocontents{cor}{\protect\smc@corrigelibre}%
+%    \end{macrocode}
+% On commence par changer de page et indiquer les styles de page à
+% utiliser pour la suite.
+%    \begin{macrocode}
+  \clearpage
+  \pagestyle{libre}
+  \thispagestyle{firstlibre}
+%    \end{macrocode}
+% La partie libre utilise le pseudo-thème libre.
+%    \begin{macrocode}
+  \themaL
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{environment}{smc@libreexercice}
+% Exercice pour le texte libre. On commence par regarder s'il y a
+% une étoile.
+%    \begin{macrocode}
+\newcommand*\smc@libreexercice{%
+  \@ifstar
+    {%
+      \smc@exercicecorrigetrue
+      \smc@@libreexercice
+    }
+    {%
+      \smc@exercicecorrigefalse
+      \smc@@libreexercice
+    }
+}
+%    \end{macrocode}
+% On lit ensuite le premier argument optionnel.
+%    \begin{macrocode}
+\newcommand*\smc@@libreexercice[1][]{%
+%    \end{macrocode}
+% On sauvegarde le texte du titre est on appelle la macro auxiliaire
+% pour lire le deuxième argument optionnel.
+%    \begin{macrocode}
+  \def\smc@exercicetitle{#1}%
+  \smc@@@libreexercice
+}
+\newcommand*\smc@@@libreexercice[1][]{%
+%    \end{macrocode}
+% On commence par passer au paragraphe suivant et réinitialiser le compteur
+% partie ainsi que la façon de composer les parties.
+%    \begin{macrocode}
+  \par\addvspace{\BeforeExerciceVSpace}
+  \let\partie\smc@exercice@partie
+  \setcounter{partie}{0}
+%    \end{macrocode}
+% La présence d'un logo va faire qu'on ne composera pas le titre (ou
+% le texte) de la même façon. S'il y a un logo, on utilise la commande
+% |\parpic| pour habiller le logo. Sinon on ne fait rien de spécial.
+%    \begin{macrocode}
+  \@ifnotmtarg{#1}{%
+    \setbox0=\hbox{#1}%
+    \parpic[r]{\makebox[\wd0][l]{{#1}}}
+  }%
+%    \end{macrocode}
+% On compose le numéro de l'exercice. La couleur du cadre dépend du
+% fait que l'exercice est corrigé ou non. À part les couleurs, on
+% garde les mêmes macros de fonte et de longueurs que pour les
+% exercices des chapitres normaux.
+%    \begin{macrocode}
+  \refstepcounter{exercice}%
+  \begin{pspicture}(0,0)(\ExerciceNumFrameWidth,\ExerciceNumFrameHeight)
+    \ifsmc@exercicecorrige
+      \psframe*[linewidth=0pt,
+                linecolor=LibreExerciceCorrigeNumFrameColor]
+               (0,-\ExerciceNumFrameDepth)
+               (\ExerciceNumFrameWidth,\ExerciceNumFrameHeight)
+    \else
+      \psframe*[linewidth=0pt,
+                linecolor=LibreExerciceNumFrameColor]
+               (0,-\ExerciceNumFrameDepth)
+               (\ExerciceNumFrameWidth,\ExerciceNumFrameHeight)
+    \fi
+    \rput[B](\dimexpr\ExerciceNumFrameWidth/2,0){%
+      \textcolor{LibreExerciceNumColor}{\ExerciceNumFont \theexercice}%
+    }
+  \end{pspicture}%
+%    \end{macrocode}
+% Y a-t-il un titre d'exercice ?
+%    \begin{macrocode}
+  \ifx\smc@exercicetitle\empty
+%    \end{macrocode}
+% S'il n'y a pas de titre, on commence le texte de l'exercice (après
+% un certain espacement horizontal).
+%    \begin{macrocode}
+    \hspace{\ExerciceTextHSep}%
+  \else
+%    \end{macrocode}
+% S'il y a un titre, on le compose et on passe au paragraphe suivant.
+%    \begin{macrocode}
+    \hspace{\ExerciceTextHSep}%
+    \textcolor{LibreExerciceTitleColor}
+              {\ExerciceTitleFont \smc@exercicetitle}%
+    \par\nobreak
+  \fi
+}
+%    \end{macrocode}
+% En fait, on utilisera plutôt la forme d'environnement pour entrer
+% les exercices. Le code terminal ne fait que placer un |\par| (cela
+% peut être utile pour activer un éventuel |\centering| en fin de
+% code.
+%    \begin{macrocode}
+\def\endsmc@libreexercice{\par}
+%    \end{macrocode}
+% \end{environment}
+% \begin{macro}{\smc@annexesection}
+% Les textes libres redéfinissent la macro |\section|. Pour cela on la
+% stocke sous la forme de la macro |\smc@libresection|. Au départ, on
+% la définit comme une macro |\section| habituelle, en particulier, on
+% autorise la forme étoilée (même si pour l'instant elle n'apporte
+% rien de plus que la forme non étoilée).
+%    \begin{macrocode}
+\newcommand*\smc@libresection{%
+  \@ifstar{\smc@libresec}{\smc@libresec}%
+}
+\newcommand*\smc@libresec[2][]{%
+%    \end{macrocode}
+% On commence par regarder si l'argument optionnel est vide. Si oui,
+% le titre court sera égal au titre long.
+%    \begin{macrocode}
+  \ifx\relax#1\relax
+    \smc@@libresec{#2}{#2}%
+  \else
+    \smc@@libresec{#1}{#2}%
+  \fi
+}
+%    \end{macrocode}
+% À ce stade, on a un titre court en premier argument et un titre long
+% en deuxième argument. Le travail effectif peut commencer.
+%    \begin{macrocode}
+\newcommand*\smc@@libresec[2]{%
+  \par\goodbreak\addvspace{\BeforeLibreSectionVSpace}%
+%    \end{macrocode}
+% Le titre court sera éventuellement utilisé pour une TDM. Ce sera à
+% voir plus tard.
+%    \begin{macrocode}
+  \@ifmtarg{#1}{}{}%
+%    \end{macrocode}
+% On compose le carré avec la bonne couleur.
+%    \begin{macrocode}
+  \begin{pspicture}(0,0)(\LibreSectionRuleWidth,\LibreSectionRuleWidth)
+    \psframe*[linecolor=LibreSectionRuleColor]
+             (0,0)(\LibreSectionRuleWidth,\LibreSectionRuleWidth)
+  \end{pspicture}%
+  \hspace{\LibreSectionRuleHSpace}%
+%    \end{macrocode}
+% On place enfin le titre dans une minipage de la bonne largeur.
+%    \begin{macrocode}
+  \begin{minipage}[t]{\dimexpr\linewidth-\LibreSectionRuleWidth-\LibreSectionRuleHSpace}
+    \LibreSectionTitleFont
+    \textcolor{LibreSectionTitleColor}{#2}%
+  \end{minipage}
+%    \end{macrocode}
+% On termine en plaçant un espacement vertical donné et une
+% interdiction de coupe. Il n'y a pas besoin de s'occuper du retrait
+% d'alinéa puisqu'il n'y en a pas !
+%    \begin{macrocode}
+  \par\nobreak\addvspace{\AfterLibreSectionVSpace}
+}
+%    \end{macrocode}
+% \end{macro}
+% \section{Habillage de texte}
+% On a vraiment besoin de l'extension \package{picins}. Comme elle
+% n'est plus disponible sur \TeX Live ou Mik\TeX{}, on la recopie ici.
+%    \begin{macrocode}
+\newbox\@BILD
+\newbox\@TEXT
+\newdimen\d@breite
+\newdimen\d@hoehe
+\newdimen\d@xoff
+\newdimen\d@yoff
+\newdimen\d@shad
+\newdimen\d@dash
+\newdimen\d@boxl
+\newdimen\d@pichskip
+\newdimen\d@tmp
+\newdimen\d@tmpa
+\newdimen\d@bskip
+\newdimen\hsiz@
+\newdimen\p@getot@l
+\newcount\c@breite
+\newcount\c@hoehe
+\newcount\c@xoff
+\newcount\c@yoff
+\newcount\c@pos
+\newcount\c@shad
+\newcount\c@dash
+\newcount\c@boxl
+\newcount\c@zeilen
+\newcount\@changemode
+\newcount\c@piccaption
+\newcount\c@piccaptionpos
+\newcount\c@picpos
+\newcount\c@whole
+\newcount\c@half
+\newcount\c@tmp
+\newcount\c@tmpa
+\newcount\c@tmpb
+\newcount\c@tmpc
+\newcount\c@tmpd
+\newskip\d@leftskip
+\newif\if@list \@listfalse
+\newif\if@offset
+\c@piccaptionpos=1
+\c@picpos=0
+\d@shad=4pt
+\d@dash=4pt
+\d@boxl=10pt
+\d@pichskip=1em
+\@changemode=0
+\def\@captype{figure}
+\let\old@par=\par
+\def\pichskip#1{\d@pichskip #1\relax}
+\def\shadowthickness#1{\d@shad #1\relax}
+\def\dashlength#1{\d@dash #1\relax}
+\def\boxlength#1{\d@boxl #1\relax}
+\def\picchangemode{\@changemode=1}
+\def\nopicchangemode{\@changemode=0}
+\def\piccaptionoutside{\c@piccaptionpos=1}
+\def\piccaptioninside{\c@piccaptionpos=2}
+\def\piccaptionside{\c@piccaptionpos=3}
+\def\piccaptiontopside{\c@piccaptionpos=4}
+\def\piccaption{\@ifnextchar [{\@piccaption}{\@piccaption[]}}
+\def\@piccaption[#1]#2{\c@piccaption=1\def\sh@rtf@rm{#1}\def\capti@nt@xt{#2}}
+\def\make@piccaption{%
+  \hsiz@\d@breite
+  \ifnum\c@piccaptionpos=2
+    \advance\hsiz@ -2\fboxsep
+  \fi
+  \ifnum\c@piccaptionpos>2
+    \hsiz@\hsize\advance\hsiz@-\d@breite\advance\hsiz@-\d@pichskip
+  \fi
+  \setbox\@TEXT=\vbox{\hsize\hsiz@\caption[\sh@rtf@rm]{\capti@nt@xt}}%
+}
+\def\newcaption{\refstepcounter\@captype\@dblarg{\@newcaption\@captype}}
+\long\def\@newcaption#1[#2]#3{%
+  \old@par
+  \addcontentsline{\csname ext@#1\endcsname }{#1}
+    {\protect\numberline{\csname the#1\endcsname}{\ignorespaces #2}}%
+  \begingroup
+    \@parboxrestore
+    \normalsize
+    \@newmakecaption{\csname fnum@#1\endcsname}{\ignorespaces #3}%
+    \old@par
+  \endgroup
+}
+\long\def\@newmakecaption#1#2{%
+  \vskip 10pt%
+  \setbox\@tempboxa \hbox {#1: #2}%
+  \ifdim \wd\@tempboxa >\hsize%
+    \setbox0=\hbox{#1: }\dimen0=\hsize\advance\dimen0 by-\wd0
+    \setbox1=\vtop{\hsize=\dimen0 #2}
+    \hbox{\box0 \box1}
+    \par
+  \else \hbox to\hsize {\hfil \box \@tempboxa \hfil}
+  \fi
+}
+\def\parpic{%
+  \@ifnextchar ({\iparpic}{\iparpic(0pt,0pt)}
+}
+\def\iparpic(#1,#2){%
+  \@ifnextchar ({\@offsettrue\iiparpic(#1,#2)}%
+                {\@offsetfalse\iiparpic(#1,#2)(0pt,0pt)}
+}
+\def\iiparpic(#1,#2)(#3,#4){%
+  \@ifnextchar [{\iiiparpic(#1,#2)(#3,#4)}{\iiiparpic(#1,#2)(#3,#4)[l]}
+}
+\def\iiiparpic(#1,#2)(#3,#4)[#5]{%
+  \@ifnextchar [{\ivparpic(#1,#2)(#3,#4)[#5]}{\ivparpic(#1,#2)(#3,#4)[#5][]}
+}
+\def\ivparpic(#1,#2)(#3,#4)[#5][#6]#7{%
+ \let\par=\old@par\par%
+ \hangindent0pt\hangafter1%
+ \setbox\@BILD=\hbox{#7}%
+ \d@breite=#1\d@breite=\the\d@breite%
+ \ifdim\d@breite=0pt\d@breite=\wd\@BILD\fi%
+ \c@breite=\d@breite\divide\c@breite by65536%
+ \multiply\c@piccaption\c@piccaptionpos%
+ \d@hoehe=#2\d@hoehe=\the\d@hoehe%
+ \ifdim\d@hoehe=0pt\d@hoehe=\ht\@BILD\advance\d@hoehe by\dp\@BILD\fi%
+ \c@hoehe=\d@hoehe\divide\c@hoehe by65536%
+ \d@xoff=#3\c@xoff=\d@xoff\divide\c@xoff by65536%
+ \d@yoff=\d@hoehe%
+ \advance\d@yoff by-#4\c@yoff=\d@yoff\divide\c@yoff by65536%
+ \c@pos=1\unitlength1pt%
+ \if@offset%
+   \setbox\@BILD=\hbox{%
+     \begin{picture}(\c@breite,\c@hoehe)%
+       \put(0,0){\makebox(\c@breite,\c@hoehe){}}%
+       \put(\c@xoff,\c@yoff){\box\@BILD}%
+     \end{picture}%
+   }%
+ \else%
+   \setbox\@BILD=\hbox{%
+     \begin{picture}(\c@breite,\c@hoehe)%
+       \put(0,0){\makebox(\c@breite,\c@hoehe)[#6]{\box\@BILD}}%
+     \end{picture}%
+   }%
+ \fi%
+ \ifnum\c@piccaption=2%
+   \make@piccaption%
+   \advance\d@hoehe\ht\@TEXT\advance\d@hoehe\dp\@TEXT%
+   \c@hoehe=\d@hoehe\divide\c@hoehe by65536%
+   \setbox\@BILD=\vbox{\box\@BILD\vspace{-5pt}%
+                       \hbox{\hspace{\fboxsep}\box\@TEXT}%
+                       \vspace{4pt}}%
+ \fi%
+ \@tfor\@tempa := #5\do{%
+   \if\@tempa f\setbox\@BILD=\hbox{\Rahmen(\c@breite,\c@hoehe){\box\@BILD}}\fi%
+   \if\@tempa s\setbox\@BILD=\hbox{\Schatten(\c@breite,\c@hoehe){\box\@BILD}}\fi%
+   \if\@tempa o\setbox\@BILD=\hbox{\Oval(\c@breite,\c@hoehe){\box\@BILD}}\fi%
+   \if\@tempa d\setbox\@BILD=\hbox{\Strich(\c@breite,\c@hoehe){\box\@BILD}}\fi%
+   \if\@tempa x\setbox\@BILD=\hbox{\Kasten(\c@breite,\c@hoehe){\box\@BILD}}\fi%
+   \if\@tempa l\c@pos=1\fi%
+   \if\@tempa r\c@pos=2\fi%
+ }%
+ \ifnum\c@piccaption=1%
+   \make@piccaption%
+   \advance\d@hoehe\ht\@TEXT\advance\d@hoehe\dp\@TEXT%
+   \c@hoehe=\d@hoehe\divide\c@hoehe by65536%
+   \setbox\@BILD=\vbox{\box\@BILD\vspace{-5pt}\hbox{\box\@TEXT}\vspace{4pt}}%
+ \fi%
+ \ifodd\count0\c@picpos=0\else\c@picpos=\@changemode\fi%
+ \pagetotal=\the\pagetotal%
+ \d@tmp=\pagegoal\advance\d@tmp by-\pagetotal\advance\d@tmp by-\baselineskip%
+ \ifdim\d@hoehe>\d@tmp%
+   \vskip 0pt plus\d@hoehe\relax\pagebreak[3]\vskip 0pt plus-\d@hoehe\relax%
+   \ifnum\c@picpos=1\c@picpos=0\else\c@picpos=\@changemode\fi%
+ \fi%
+ \ifnum\c@picpos=1\ifnum\c@pos=1\c@pos=2\else\c@pos=1\fi\fi%
+ \ifnum\@listdepth>0
+   \@listtrue\parshape 0%
+   \advance\hsize -\rightmargin%
+   \d@leftskip \leftskip%
+   \leftskip \@totalleftmargin%
+   \if@inlabel\rule{\linewidth}{0pt}\vskip-\baselineskip\relax\fi%
+ \else\@listfalse\medskip%
+ \fi%
+ \if@list\d@tmpa=\linewidth\else\d@tmpa=\hsize\fi%
+ \ifnum\c@piccaption=3%
+   \make@piccaption%
+   \d@tmp\ht\@TEXT\advance\d@tmp\dp\@TEXT%
+   \ifdim\d@hoehe>\d@tmp%
+     \setbox\@TEXT=\vbox to\d@hoehe{\vfill\box\@TEXT\vspace{.2\baselineskip}\vfill}%
+   \else%
+     \setbox\@BILD=\vbox to\d@tmp{\vfill\box\@BILD\vfill}%
+     \d@hoehe\d@tmp%
+   \fi%
+ \fi%
+ \ifnum\c@piccaption=4%
+   \make@piccaption%
+   \d@tmp\ht\@TEXT\advance\d@tmp\dp\@TEXT%
+   \setbox\@TEXT=\vbox to\d@hoehe{\vspace{-10pt}\box\@TEXT\vfil}%
+   \advance\d@hoehe-\d@tmp%
+ \fi%
+ \ifnum\c@pos=1\d@tmpa=0pt%
+   \ifnum\c@piccaption>2%
+      \setbox\@BILD=\hbox{\box\@BILD\hspace{\d@pichskip}\hbox{\box\@TEXT}}%
+   \fi%
+ \else\advance\d@tmpa by-\wd\@BILD\d@breite=-\d@breite%
+   \ifnum\c@piccaption>2%
+      \d@tmpa=0pt%
+      \setbox\@BILD=\hbox{\hbox{\box\@TEXT}\hspace{\d@pichskip}\box\@BILD}%
+   \fi%
+ \fi%
+ \p@getot@l\the\pagetotal%
+ \d@bskip\d@hoehe\advance\d@bskip by\parskip\advance\d@bskip by.3\baselineskip%
+ {\noindent\hspace*{\d@tmpa}\relax%
+  \box\@BILD\nopagebreak\vskip-\d@bskip\relax\nopagebreak}%
+ \d@tmp=-\d@hoehe\divide\d@tmp by\baselineskip%
+ \c@zeilen=\d@tmp\advance\c@zeilen by-1%
+ \ifdim\d@breite<0pt\advance\d@breite by-\d@pichskip%
+ \else\advance\d@breite by\d@pichskip%
+ \fi%
+ \hangindent=\d@breite%
+ \hangafter=\c@zeilen%
+ \let\par=\x@par%
+ \ifnum\c@piccaption=3%
+    \hangindent0pt\hangafter1\let\par=\old@par%
+    \vskip\d@hoehe\vskip.2\baselineskip%
+ \fi%
+ \c@piccaption=0%
+}
+\newdimen\ptoti
+\newdimen\ptotii
+\def\x@par{%
+ \ptoti\pagetotal
+ \old@par
+ \ptotii\pagetotal
+ \ifdim\ptoti=\ptotii
+   \d@tmp\d@hoehe
+ \else
+   \d@tmp\baselineskip
+   \multiply\d@tmp by\prevgraf
+   \advance\d@tmp by\parskip
+   \global\advance\d@hoehe by-\d@tmp\d@tmp=\d@hoehe
+ \fi
+ \ifdim\d@hoehe>0pt
+   \divide\d@tmp by\baselineskip\c@zeilen=-\d@tmp\advance\c@zeilen by-1
+   \c@zeilen=\the\c@zeilen
+ \else\c@zeilen=0
+ \fi
+ \ifnum\c@zeilen<0\hangafter=\c@zeilen\hangindent=\d@breite
+ \else\let\par=\old@par
+   \hangindent 0pt
+   \leftskip \d@leftskip
+   \if@list\parshape \@ne \@totalleftmargin \linewidth
+     \advance\hsize \rightmargin
+   \fi
+ \fi
+}
+\def\picskip#1{%
+ \let\par=\old@par
+ \par
+ \pagetotal\the\pagetotal
+ \c@tmp=#1\relax
+ \ifnum\c@tmp=0
+   \d@tmp\baselineskip\multiply\d@tmp by\prevgraf\advance\d@tmp\parskip
+   \ifdim\p@getot@l<\pagetotal
+     \advance\d@hoehe by-\d@tmp\advance\d@hoehe by1ex
+     \ifdim\d@hoehe>0pt\vspace*{\d@hoehe}\fi
+   \fi
+   \ifdim\p@getot@l=\pagetotal
+     \advance\d@hoehe by-\d@tmp\advance\d@hoehe by1ex
+     \ifdim\d@hoehe>0pt\vspace*{\d@hoehe}\fi
+   \fi
+ \else\hangafter=-\c@tmp\hangindent=\d@breite
+ \fi
+ \leftskip \d@leftskip
+ \if@list\parshape \@ne \@totalleftmargin \linewidth
+   \advance\hsize \rightmargin
+ \fi
+}
+\def\hpic{%
+  \@ifnextchar ({\ihpic}{\ihpic(0pt,0pt)}%)
+}
+\def\ihpic(#1,#2){%
+  \@ifnextchar ({\@offsettrue\iihpic(#1,#2)}%)
+                {\@offsetfalse\iihpic(#1,#2)(0pt,0pt)}%
+}
+\def\iihpic(#1,#2)(#3,#4){%
+  \@ifnextchar [{\iiihpic(#1,#2)(#3,#4)}{\iiihpic(#1,#2)(#3,#4)[l]}%]
+}
+\def\iiihpic(#1,#2)(#3,#4)[#5]{%
+  \@ifnextchar [{\ivhpic(#1,#2)(#3,#4)[#5]}{\ivhpic(#1,#2)(#3,#4)[#5][]}%]
+}
+\def\ivhpic(#1,#2)(#3,#4)[#5][#6]#7{%
+  \setbox\@BILD=\hbox{#7}%
+  \d@breite=#1\d@breite=\the\d@breite%
+  \ifdim\d@breite=0pt\d@breite=\wd\@BILD\fi%
+  \c@breite=\d@breite\divide\c@breite by65536%
+  \d@hoehe=#2\d@hoehe=\the\d@hoehe%
+  \ifdim\d@hoehe=0pt\d@hoehe=\ht\@BILD\advance\d@hoehe by\dp\@BILD\fi%
+  \c@hoehe=\d@hoehe\divide\c@hoehe by65536%
+  \d@xoff=#3\c@xoff=\d@xoff\divide\c@xoff by65536%
+  \d@yoff=\d@hoehe%
+  \advance\d@yoff by-#4\c@yoff=\d@yoff\divide\c@yoff by65536%
+  \c@pos=0\d@tmpa=\parindent\parindent=0pt\unitlength1pt%
+  \if@offset
+    \setbox\@BILD=\hbox{%
+      \begin{picture}(\c@breite,\c@hoehe)%
+        \put(0,0){\makebox(\c@breite,\c@hoehe){}}%
+        \put(\c@xoff,\c@yoff){\box\@BILD}%
+      \end{picture}%
+    }%
+  \else%
+    \setbox\@BILD=\hbox{%
+      \begin{picture}(\c@breite,\c@hoehe)%
+        \put(0,0){\makebox(\c@breite,\c@hoehe)[#6]{\box\@BILD}}%
+      \end{picture}%
+    }%
+  \fi%
+  \@tfor\@tempa := #5\do{%
+    \if\@tempa f\setbox\@BILD=\hbox{\Rahmen(\c@breite,\c@hoehe){\box\@BILD}}\fi%
+    \if\@tempa s\setbox\@BILD=\hbox{\Schatten(\c@breite,\c@hoehe){\box\@BILD}}\fi%
+    \if\@tempa o\setbox\@BILD=\hbox{\Oval(\c@breite,\c@hoehe){\box\@BILD}}\fi%
+    \if\@tempa d\setbox\@BILD=\hbox{\Strich(\c@breite,\c@hoehe){\box\@BILD}}\fi%
+    \if\@tempa x\setbox\@BILD=\hbox{\Kasten(\c@breite,\c@hoehe){\box\@BILD}}\fi%
+    \if\@tempa t\c@pos=1\fi%
+    \if\@tempa b\c@pos=2\fi%
+  }%
+ \ifnum\c@pos=0\parbox{\d@breite}{\makebox[0cm]{}\\\box\@BILD\smallskip}\fi%
+ \ifnum\c@pos=1\parbox[t]{\d@breite}{\makebox[0cm]{}\\\box\@BILD\smallskip}\fi%
+ \ifnum\c@pos=2\parbox[b]{\d@breite}{\makebox[0cm]{}\\\box\@BILD\smallskip}\fi%
+ \parindent=\d@tmpa%
+}
+\def\Rahmen(#1,#2)#3{%
+  \c@whole=\@wholewidth\divide\c@whole by65536%
+  \c@half=\@halfwidth\divide\c@half by65536%
+  \c@tmpa=#1\advance\c@tmpa by\c@whole\advance\c@tmpa by\c@whole%
+  \c@tmpb=#2\advance\c@tmpb by\c@whole\advance\c@tmpb by\c@whole%
+  \begin{picture}(\c@tmpa,\c@tmpb)%
+    \put(\c@whole,\c@half){\framebox(#1,#2){#3}}%
+  \end{picture}%
+  \global\advance\d@breite by2\@wholewidth%
+  \global\advance\d@hoehe by2\@wholewidth%
+}
+\def\Schatten(#1,#2)#3{%
+  \c@whole=\@wholewidth\divide\c@whole by65536%
+  \c@half=\@halfwidth\divide\c@half by65536%
+  \c@shad=\d@shad\divide\c@shad by65536%
+  \c@tmp=\c@whole\advance\c@tmp by\c@whole\c@tmpd=\c@tmp%
+  \advance\c@tmp by\c@shad%
+  \advance\c@tmpd by#1%
+  \advance\c@half by\c@shad%
+  \c@tmpa=#1\advance\c@tmpa by\c@tmp%
+  \c@tmpb=#2\advance\c@tmpb by\c@tmp%
+  \begin{picture}(\c@tmpa,\c@tmpb)%
+    \put(\c@whole,\c@half){\framebox(#1,#2){#3}}%
+    \put(\c@shad,0){\rule{\c@tmpd pt}{\c@shad pt}}%
+    \put(\c@tmpd,0){\rule{\c@shad pt}{#2 pt}}%
+  \end{picture}%
+  \global\advance\d@breite by2\@wholewidth\global\advance\d@breite by\d@shad%
+  \global\advance\d@hoehe by2\@wholewidth\global\advance\d@hoehe by\d@shad%
+}
+\def\Oval(#1,#2)#3{%
+  \@wholewidth=0.4pt%
+  \c@tmpa=\the#1\divide\c@tmpa by2%
+  \c@tmpb=\the#2\divide\c@tmpb by2%
+  \begin{picture}(#1,#2)%
+    \put(\c@tmpa,\c@tmpb){\oval(#1,#2)}%
+    \put(0.4,0.4){#3}%
+  \end{picture}%
+  \global\advance\d@breite by1pt\global\advance\d@hoehe by1pt%
+}
+\def\Strich(#1,#2)#3{%
+  \c@whole=\@wholewidth\divide\c@whole by65536%
+  \c@half=\@halfwidth\divide\c@half by65536%
+  \c@dash=\d@dash\divide\c@dash by65536%
+  \c@tmp=\c@whole\advance\c@tmp by\c@whole%
+  \c@tmpa=#1\advance\c@tmpa by\c@tmp%
+  \c@tmpb=#2\advance\c@tmpb by\c@tmp%
+  \c@tmpc=#1\advance\c@tmpc by\c@whole%
+  \c@tmpd=#2\advance\c@tmpd by\c@whole%
+  \begin{picture}(\c@tmpa,\c@tmpb)%
+    \put(\c@half,\c@half){\dashbox{\c@dash}(\c@tmpc,\c@tmpd){#3}}%
+  \end{picture}%
+  \global\advance\d@breite by2\@wholewidth%
+  \global\advance\d@hoehe by2\@wholewidth%
+}
+\def\Kasten(#1,#2)#3{%
+  \@wholewidth=0.4pt%
+  \c@boxl=\d@boxl\divide\c@boxl by65536\c@boxl=\the\c@boxl%
+  \c@tmpa=#1\advance\c@tmpa by\c@boxl%
+  \c@tmpb=#2\advance\c@tmpb by\c@boxl%
+  \c@tmp=#2%
+  \begin{picture}(\c@tmpa,\c@tmpb)%
+    \put(0,\c@boxl){\framebox(#1,#2){#3}}%
+    \put(\c@boxl,0){\line(-1,1){\c@boxl}}%
+    \put(\c@boxl,0){\line(1,0){#1}\line(-1,1){\c@boxl}}%
+    \put(\c@boxl,0){\put(#1,0){\line(0,1){\c@tmp}%
+         \put(0,\c@tmp){\line(-1,1){\c@boxl}}}}%
+  \end{picture}%
+  \global\advance\d@breite by\d@boxl%
+  \global\advance\d@hoehe by\d@boxl%
+}
+\newbox\env@box%
+\newdimen\d@envdp
+\newcount\c@hsize
+\newcount\c@envdp
+\newdimen\d@envb
+\long\def\frameenv{\@ifnextchar [{\@frameenv}{\@frameenv[\textwidth]}}
+\long\def\@frameenv[#1]{%
+ \hsiz@=\textwidth  \textwidth=#1  \d@envb=#1
+ \advance\textwidth by-2\@wholewidth
+ \advance\textwidth by-2\fboxsep
+ \hsize=\textwidth   \linewidth=\textwidth
+ \setbox\env@box=\vbox\bgroup}%
+\def\endframeenv{%
+ \egroup%
+ \hsize=\hsiz@  \textwidth=\hsiz@  \linewidth=\hsiz@
+ \c@breite=\d@envb   \divide\c@breite by65536
+ \advance\d@envb by-2\@wholewidth
+ \c@hsize=\d@envb  \divide\c@hsize by65536%
+ \d@envdp=\dp\env@box  \advance\d@envdp by\ht\env@box%
+ \advance\d@envdp by2\fboxsep%
+ \d@hoehe=\d@envdp   \advance\d@hoehe by2\@wholewidth
+ \c@hoehe=\d@hoehe   \divide\c@hoehe by65536
+ \c@envdp=\d@envdp   \divide\c@envdp by65536%
+ \c@tmp=\@wholewidth \divide\c@tmp by65536
+ \vskip\@wholewidth%
+ \unitlength 1pt\noindent%
+ \begin{picture}(\c@breite,\c@hoehe)(0,0)
+   \put(\c@tmp,\c@tmp){\framebox(\c@hsize,\c@envdp){\box\env@box}}
+ \end{picture}%
+}
+\long\def\shadowenv{\@ifnextchar [{\@shadowenv}{\@shadowenv[\textwidth]}}
+\long\def\@shadowenv[#1]{%
+ \hsiz@=\textwidth  \textwidth=#1  \d@envb=#1
+ \advance\textwidth by-2\@wholewidth
+ \advance\textwidth by-2\fboxsep
+ \advance\textwidth by-\d@shad%
+ \hsize=\textwidth   \linewidth=\textwidth
+ \setbox\env@box=\vbox\bgroup}%
+\def\endshadowenv{%
+ \egroup
+ \hsize=\hsiz@  \textwidth=\hsiz@  \linewidth=\hsiz@
+ \d@tmpa=\d@envb
+ \c@breite=\d@envb   \divide\c@breite by65536
+ \advance\d@envb by-2\@wholewidth  \advance\d@envb by-\d@shad
+ \c@hsize=\d@envb  \divide\c@hsize by65536%
+ \d@envdp=\dp\env@box  \advance\d@envdp by\ht\env@box%
+ \advance\d@envdp by2\fboxsep%
+ \c@envdp=\d@envdp   \divide\c@envdp by65536%
+ \d@hoehe=\d@envdp
+ \advance\d@hoehe by2\@wholewidth  \advance\d@hoehe by\d@shad
+ \c@hoehe=\d@hoehe    \divide\c@hoehe by65536
+ \c@shad =\d@shad     \divide\c@shad  by65536
+ \c@tmp=\@wholewidth  \divide\c@tmp by65536
+ \advance\d@tmpa by-2\d@shad
+ \c@xoff =\d@tmpa     \divide\c@xoff by65536
+ \advance\c@xoff by\c@shad  \advance\c@xoff by-1
+ \advance\d@envdp by\@wholewidth
+ \vskip\@halfwidth
+ \unitlength 1pt\noindent%
+ \begin{picture}(\c@breite,\c@hoehe)(0,0)
+    \put(\c@tmp,\c@shad){\framebox(\c@hsize,\c@envdp){\box\env@box}}
+    \put(\c@shad,0){\rule{\d@tmpa}{\d@shad}}%
+    \put(\c@xoff,0){\rule{\d@shad}{\d@envdp}}%
+ \end{picture}%
+ \vskip\@halfwidth
+}
+\long\def\dashenv{\@ifnextchar [{\@dashenv}{\@dashenv[\textwidth]}}
+\long\def\@dashenv[#1]{%
+ \hsiz@=\textwidth  \textwidth=#1  \d@envb=#1
+ \advance\textwidth by-2\@wholewidth  \advance\textwidth by-2\fboxsep
+ \hsize=\textwidth   \linewidth=\textwidth
+ \setbox\env@box=\vbox\bgroup}%
+\long\def\enddashenv{%
+ \egroup
+ \hsize=\hsiz@  \textwidth=\hsiz@  \linewidth=\hsiz@
+ \c@breite=\d@envb   \divide\c@breite by65536
+ \advance\d@envb by-\@wholewidth
+ \c@hsize=\d@envb  \divide\c@hsize by65536%
+ \d@envdp=\dp\env@box  \advance\d@envdp by\ht\env@box%
+ \advance\d@envdp by2\fboxsep%
+ \advance\d@envdp by\@wholewidth
+ \d@hoehe=\d@envdp   \advance\d@hoehe by2\@wholewidth
+ \c@hoehe=\d@hoehe   \divide\c@hoehe by65536
+ \c@envdp=\d@envdp   \divide\c@envdp by65536%
+ \c@dash=\d@dash     \divide\c@dash  by65536%
+ \c@whole=\@wholewidth  \divide\c@whole by65536
+ \c@half=\@halfwidth  \divide\c@half by 65536
+ \noindent\unitlength 1pt
+ \begin{picture}(\c@breite,\c@hoehe)(0,0)
+   \put(\c@half,\c@whole){\dashbox{\c@dash}(\c@hsize,\c@envdp){\box\env@box}}
+ \end{picture}%
+}
+\long\def\ovalenv{\@ifnextchar [{\@ovalenv}{\@ovalenv[\textwidth]}}%
+\long\def\@ovalenv[#1]{%
+ \hsiz@=\textwidth  \textwidth=#1  \d@envb=#1
+ \advance\textwidth by-4\fboxsep
+ \hsize=\textwidth   \linewidth=\textwidth
+ \setbox\env@box=\vbox\bgroup}%
+\long\def\endovalenv{%
+ \egroup
+ \hsize=\hsiz@  \textwidth=\hsiz@  \linewidth=\hsiz@
+ \@wholewidth=0.4pt
+ \c@breite=\d@envb   \divide\c@breite by65536
+ \advance\d@envb by-2\@wholewidth
+ \c@hsize=\d@envb  \divide\c@hsize by65536%
+ \d@envdp=\dp\env@box  \advance\d@envdp by\ht\env@box%
+ \advance\d@envdp by4\fboxsep%
+ \c@envdp=\d@envdp   \divide\c@envdp by65536%
+ \d@hoehe=\d@envdp   \advance\d@hoehe by2\@wholewidth
+ \c@hoehe=\d@hoehe   \divide\c@hoehe by65536
+ \c@tmpa=\c@hsize   \divide\c@tmpa by2%
+ \c@tmpb=\c@envdp   \divide\c@tmpb by2%
+ \d@tmpa=2\fboxsep   \advance\d@tmpa by\@wholewidth
+ \c@xoff=\d@tmpa     \divide\c@xoff  by65536%
+ \advance\d@tmpa by\dp\env@box
+ \c@yoff=\d@tmpa     \divide\c@yoff  by65536%
+ \unitlength 1pt\noindent
+ \begin{picture}(\c@breite,\c@hoehe)(0,0)
+   \put(\c@tmpa,\c@tmpb){\oval(\c@hsize,\c@envdp)}
+   \put(\c@xoff,\c@yoff){\box\env@box}%
+ \end{picture}%
+}
+%    \end{macrocode}
+% \section{Overprint}
+%    \begin{macrocode}
+\let\set@op\relax
+\newif\if@op
+\def\overprint{%
+  \@optrue
+  \set@op
+  \ignorespaces
+}
+\def\knockout{%
+  \@opfalse
+  \set@op
+  \ignorespaces
+}
+\def\testname{pdftex.def}
+\ifx \Gin@driver \testname
+  \AtBeginDocument{
+    \immediate\pdfobj{<< /Type /ExtGState /op false /OP false /OPM 0 >>}
+    \edef\op@off{\the\pdflastobj}
+    \immediate\pdfobj{<< /Type /ExtGState /op true /OP true /OPM 1 >>}
+    \edef\op@on{\the\pdflastobj}
+    \immediate\pdfobj{ << %
+      /GSko \op@off\space 0 R %
+      /GSop \op@on\space 0 R >>}
+    \edef\@extgs{\the\pdflastobj}
+    \edef\next{\global\noexpand\pdfpageresources={\the\pdfpageresources
+      \space /ExtGState \@extgs\space 0 R }}
+    \next
+  }
+  \def\set@op{%
+    \if@op
+      \pdfliteral direct {/GSop gs}%
+    \else
+      \pdfliteral direct {/GSko gs}%
+    \fi
+    \aftergroup\reset@op}
+  \def\reset@op{%
+    \if@op
+      \pdfliteral direct {/GSop gs}%
+    \else
+      \pdfliteral direct {/GSko gs}%
+    \fi
+  }
+\fi
+\def\testname{dvips.def}
+\ifx \Gin@driver \testname
+  \def\set@op{%
+    \if@op
+      \special{ps:true setoverprint}%
+    \else
+      \special{ps:false setoverprint}%
+    \fi
+    \aftergroup\reset@op}
+  \def\reset@op{%
+    \if@op
+      \special{ps:true setoverprint}%
+    \else
+      \special{ps:false setoverprint}%
+    \fi
+  }
+\fi
+\@opfalse
+\overprint
+%    \end{macrocode}
+% \iffalse
+%</class>
+%<*package>
+% \fi
+% \section{Package}
+% On crée également un package qui va reprendre les éléments
+% syntaxiques sans la mise en page générale. Cela doit servir à
+% compiler des petits bouts de codes extraits de toute la gangue
+% propre à un manuel complet et de pouvoir utiliser une autre classe,
+% particulièrement \class{beamer}.
+%
+% L'idée générale est de reprendre les commandes et environnements
+% concernant:
+% \begin{itemize}
+% \item les tableaux :
+% \item les algorithmes ;
+% \item les unités ;
+% \item les macros |\TopStrut| et |\BottomStrut| ;
+% \item les listes.
+% \end{itemize}
+% Il n'y a donc rien de très sorcier : c'est essentiellement de la
+% recopie verbatim de certaines sections de la classe
+% \class{sesamanuel}. Il n'y a que les listes qui posent un tout petit
+% problème. On ne commentera donc quaisment pas le code qui suit (les
+% explications (sont données plus haut).
+%
+% On commence par les initialisations habituelles et le chargement
+% d'un certain nombre d'extensions. On garde l'option pour indiquer le
+% codage d'entrée.
+%    \begin{macrocode}
+\def\filedate{2015/03/03}
+\def\fileversion{0.4}
+\NeedsTeXFormat{LaTeX2e}[1995/06/01]
+\ProvidesPackage{sesamanuel}[%
+  \filedate\space v\fileversion\space
+  Package pour Sesamath (SM/JCC/SM)%
+]
+\def\smc@enc@opt#1{\DeclareOption{#1}{\def\smc@encoding{#1}}}
+\smc@enc@opt{ascii}
+\smc@enc@opt{latin1}
+\smc@enc@opt{latin2}
+\smc@enc@opt{latin3}
+\smc@enc@opt{latin4}
+\smc@enc@opt{latin5}
+\smc@enc@opt{latin9}
+\smc@enc@opt{latin10}
+\smc@enc@opt{decmulti}
+\smc@enc@opt{cp850}
+\smc@enc@opt{cp852}
+\smc@enc@opt{cp858}
+\smc@enc@opt{cp437}
+\smc@enc@opt{cp437de}
+\smc@enc@opt{cp865}
+\smc@enc@opt{applemac}
+\smc@enc@opt{macce}
+\smc@enc@opt{next}
+\smc@enc@opt{cp1250}
+\smc@enc@opt{cp1252}
+\smc@enc@opt{cp1257}
+\smc@enc@opt{ansinew}
+\smc@enc@opt{utf8}
+\ExecuteOptions{utf8}
+\ProcessOptions
+\newif\ifxetex
+\begingroup\expandafter\expandafter\expandafter\endgroup
+\expandafter\ifx\csname XeTeXrevision\endcsname\relax
+  \xetexfalse
+\else
+  \xetextrue
+\fi
+\RequirePackage{etex}
+\ifxetex
+  \RequirePackage{fontspec}
+  \RequirePackage{xunicode}
+  \defaultfontfeatures{Ligatures=TeX}
+  \unless\ifx\smc@encoding\smc@string@utfviii
+    \ClassError{sesamanuel}{Vous ne pouvez pas utiliser un codage autre
+      que utf8 avec xelatex}{Changez les codages de tous vos fichiers
+      pour les transformer en utf8.}%
+  \fi
+\else
+  \RequirePackage[T1]{fontenc}
+  \RequirePackage[\smc@encoding]{inputenc}
+\fi
+\RequirePackage[scaled=0.87]{helvet}
+\RequirePackage{mathpazo}
+\renewcommand{\ttdefault}{lmtt}
+\RequirePackage{mathrsfs}
+\RequirePackage{pifont}
+\RequirePackage[official]{eurosym}
+\RequirePackage{ifmtarg}
+\RequirePackage{mathtools}
+\RequirePackage{amssymb}
+\RequirePackage{longtable, tabularx}
+\RequirePackage{multirow}
+%    \end{macrocode}
+% Certaines classes comme beamer peuvent appeler |xcolor| avec
+% d'autres options d'extension. Il faut donc se prémunir d'un clash
+% avec le test suivant.
+%    \begin{macrocode}
+\ifdefined \XC@catcodes
+  \RequirePackage{colortbl}
+\else
+  \RequirePackage[table]{xcolor}
+\fi
+\RequirePackage{multido}
+\RequirePackage{multicol}
+\RequirePackage[french]{babel}
+\RequirePackage[autolanguage]{numprint}
+%    \end{macrocode}
+% On reprend le même nuancier complet que celui de la classe.
+%    \begin{macrocode}
+\definecolor{A1}                {cmyk}{1.00, 0.00, 0.00, 0.50}
+\definecolor{A2}                {cmyk}{0.60, 0.00, 0.00, 0.10}
+\definecolor{A3}                {cmyk}{0.30, 0.00, 0.00, 0.05}
+\definecolor{A4}                {cmyk}{0.10, 0.00, 0.00, 0.00}
+\definecolor{B1}                {cmyk}{0.00, 1.00, 0.60, 0.40}
+\definecolor{B2}                {cmyk}{0.00, 0.85, 0.60, 0.15}
+\definecolor{B3}                {cmyk}{0.00, 0.20, 0.15, 0.05}
+\definecolor{B4}                {cmyk}{0.00, 0.05, 0.05, 0.00}
+\definecolor{C1}                {cmyk}{0.00, 1.00, 0.00, 0.50}
+\definecolor{C2}                {cmyk}{0.00, 0.60, 0.00, 0.20}
+\definecolor{C3}                {cmyk}{0.00, 0.30, 0.00, 0.05}
+\definecolor{C4}                {cmyk}{0.00, 0.10, 0.00, 0.05}
+\definecolor{D1}                {cmyk}{0.00, 0.00, 1.00, 0.50}
+\definecolor{D2}                {cmyk}{0.20, 0.20, 0.80, 0.00}
+\definecolor{D3}                {cmyk}{0.00, 0.00, 0.20, 0.10}
+\definecolor{D4}                {cmyk}{0.00, 0.00, 0.20, 0.05}
+\definecolor{F1}                {cmyk}{0.00, 0.80, 0.50, 0.00}
+\definecolor{F2}                {cmyk}{0.00, 0.40, 0.30, 0.00}
+\definecolor{F3}                {cmyk}{0.00, 0.15, 0.10, 0.00}
+\definecolor{F4}                {cmyk}{0.00, 0.07, 0.05, 0.00}
+\definecolor{G1}                {cmyk}{1.00, 0.00, 0.50, 0.00}
+\definecolor{G2}                {cmyk}{0.50, 0.00, 0.20, 0.00}
+\definecolor{G3}                {cmyk}{0.20, 0.00, 0.10, 0.00}
+\definecolor{G4}                {cmyk}{0.10, 0.00, 0.05, 0.00}
+\definecolor{H1}                {cmyk}{0.40, 0.00, 1.00, 0.10}
+\definecolor{H2}                {cmyk}{0.20, 0.00, 0.50, 0.05}
+\definecolor{H3}                {cmyk}{0.10, 0.00, 0.20, 0.00}
+\definecolor{H4}                {cmyk}{0.07, 0.00, 0.15, 0.00}
+\definecolor{J1}                {cmyk}{0.00, 0.50, 1.00, 0.00}
+\definecolor{J2}                {cmyk}{0.00, 0.20, 0.50, 0.00}
+\definecolor{J3}                {cmyk}{0.00, 0.10, 0.20, 0.00}
+\definecolor{J4}                {cmyk}{0.00, 0.07, 0.15, 0.00}
+\definecolor{FondOuv}           {cmyk}{0.00, 0.05, 0.10, 0.00}
+\definecolor{FondAutoEvaluation}{cmyk}{0.00, 0.03, 0.15, 0.00}
+\definecolor{FondTableaux}      {cmyk}{0.00, 0.00, 0.20, 0.00}
+\definecolor{FondAlgo}          {cmyk}{0.07, 0.00, 0.30, 0.00}
+\definecolor{BleuOuv}           {cmyk}{1.00, 0.00, 0.00, 0.00}
+\definecolor{PartieFonction}    {cmyk}{1.00, 0.00, 0.00, 0.00}
+\definecolor{PartieGeometrie}   {cmyk}{0.80, 0.80, 0.00, 0.00}
+\definecolor{PartieStatistique} {cmyk}{0.60, 0.95, 0.00, 0.20}
+\definecolor{PartieStatistiqueOLD}{cmyk}{0.95, 0.60, 0.20, 0.00}
+\definecolor{PartieStatistique*}{cmyk}{0.30, 1.00, 0.00, 0.00}
+\definecolor{U1}                {cmyk}{0.50, 0.10, 0.00, 0.10}
+\definecolor{U2}                {cmyk}{0.20, 0.15, 0.00, 0.00}
+\definecolor{U3}                {cmyk}{0.50, 0.00, 1.00, 0.00}
+\definecolor{U4}                {cmyk}{0.40, 0.00, 0.00, 0.00}
+\definecolor{Blanc}             {cmyk}{0.00, 0.00, 0.00, 0.00}
+\definecolor{Gris1}             {cmyk}{0.00, 0.00, 0.00, 0.20}
+\definecolor{Gris2}             {cmyk}{0.00, 0.00, 0.00, 0.40}
+\definecolor{Gris3}             {cmyk}{0.00, 0.00, 0.00, 0.50}
+\definecolor{Noir}              {cmyk}{0.00, 0.00, 0.00, 1.00}
+\AtBeginDocument{\def\default@color{cmyk 0 0 0 1}\normalcolor}
+%    \end{macrocode}
+% Code pour tout ce qui concerne les tableaux. On a regroupé ici les
+% macros de couleurs et de longueurs utilisées pour construire les tableaux.
+%    \begin{macrocode}
+\def\BeforeTableVSpace{1.5mm}
+\def\AfterTableVSpace{1.5mm}
+\colorlet{FiletTableauColor}{Gris3}
+\newcommand{\tableau}[1][c]{%
+  \arrayrulecolor{FiletTableauColor}%
+  \renewcommand\tabularxcolumn[1]{>{\centering\arraybackslash}m{##1}}%
+  \ifcsname#1tableau\endcsname
+    \expandafter\let\expandafter\smc@next\csname#1tableau\endcsname
+    \expandafter\let\expandafter\endtableau\csname end#1tableau\endcsname
+  \else
+    \ClassError{sesamanuel}
+              {Le type de tableau #1 n'existe pas}
+              {Les types possibles sont 't', 'c', 'l', 'cl', 'T', 'C',
+                'L', 'CL' et 'pr'.}%
+    \let\smc@next\ctableau
+    \let\endtableau\endctableau
+  \fi
+  \par\addvspace{\BeforeTableVSpace}
+  \smc@next
+}
+\newenvironment{ttableau}[2]
+{\tabularx{#1}{|*{#2}{X|}}}
+{\endtabularx\par\addvspace{\AfterTableVSpace}}
+\newenvironment{Ttableau}[3]
+{\tabularx{#1}{|#3|*{\numexpr#2-1}{X|}}}
+{\endtabularx\par\addvspace{\AfterTableVSpace}}
+\newenvironment{ctableau}[2]
+{%
+  \tabularx{#1}{%
+    |>{\columncolor{FondTableaux}[\dimexpr\tabcolsep-0.5pt]}X|
+    *{\numexpr#2-1}{X|}}%
+}
+{\endtabularx\par\addvspace{\AfterTableVSpace}}
+\newenvironment{Ctableau}[3]
+{%
+  \tabularx{#1}{%
+    |>{\columncolor{FondTableaux}[\dimexpr\tabcolsep-0.5pt]}#3|
+    *{\numexpr#2-1}{X|}}%
+}
+{\endtabularx\par\addvspace{\AfterTableVSpace}}
+\newenvironment{ltableau}[2]
+{%
+  \tabularx{#1}{|*{#2}{X|}}
+  \rowcolor{FondTableaux}
+}
+{\endtabularx\par\addvspace{\AfterTableVSpace}}
+\newenvironment{Ltableau}[3]
+{%
+  \tabularx{#1}{|#3|*{\numexpr#2-1}{X|}}
+  \rowcolor{FondTableaux}
+}
+{\endtabularx\par\addvspace{\AfterTableVSpace}}
+\newenvironment{cltableau}[2]
+{%
+  \tabularx{#1}{%
+    |>{\columncolor{FondTableaux}[\dimexpr\tabcolsep-0.5pt]}X|
+    *{\numexpr#2-1}{X|}}%
+  \rowcolor{FondTableaux}
+}
+{\endtabularx\par\addvspace{\AfterTableVSpace}}
+\newenvironment{CLtableau}[3]
+{%
+  \tabularx{#1}{%
+    |>{\columncolor{FondTableaux}[\dimexpr\tabcolsep-0.5pt]}#3|
+    *{\numexpr#2-1}{X|}}%
+  \rowcolor{FondTableaux}
+}
+{\endtabularx\par\addvspace{\AfterTableVSpace}}
+\let\lctableau\cltableau
+\let\endlctableau\endcltableau
+\let\LCtableau\CLtableau
+\let\endLCtableau\endCLtableau
+\newenvironment{prtableau}[1]
+{%
+  \def\propriete{%
+    \refstepcounter{propriete}%
+    \psframebox*[fillcolor=TablePropertyTitleBkgColor]{%
+      \ProprieteFont
+      \textcolor{TablePropertyTitleTextColor}{ \MakeUppercase{\StringPropriete}}
+      \NumProprieteFont
+      \textcolor{TablePropertyTitleTextColor}{\thepropriete}
+    }
+  }%
+  \longtable{%
+    >{\leavevmode\endgraf\vspace{-0.3\baselineskip}}
+    m{0.24\dimexpr#1-6\tabcolsep}
+    <{\endgraf\vspace{-0.3\baselineskip}}
+    >{%
+      \leavevmode\endgraf\vspace{-0.3\baselineskip}
+      \columncolor{TablePropertyBkgColor}
+    }
+    m{0.46\dimexpr#1-6\tabcolsep}
+    <{\endgraf\vspace{-0.3\baselineskip}}
+    >{%
+      \centering\arraybackslash
+      \leavevmode\endgraf\vspace{-0.3\baselineskip}
+    }
+    m{0.30\dimexpr#1-6\tabcolsep}
+    <{\endgraf\vspace{-0.3\baselineskip}}
+  }%
+}
+{\endlongtable\par\addvspace{\AfterTableVSpace}}
+\newcommand\tabX[1][\ht\@arstrutbox,\dp\@arstrutbox]{%
+  \smc@GetVTabX#1,,\@nil
+  \vrule width0pt height\smc@htTabX depth-\smc@dpTabX
+  \pnode(-\tabcolsep,\smc@htTabX){ul}
+  \pnode(-\tabcolsep,\smc@dpTabX){dl}
+  \hspace*{\stretch{1}}%
+  \pnode(\tabcolsep,\smc@htTabX){ur}
+  \pnode(\tabcolsep,\smc@dpTabX){dr}
+  \psline(ul)(dr)
+  \psline(dl)(ur)
+}
+\def\smc@GetVTabX#1,#2,{%
+  \edef\smc@htTabX{\the\dimexpr#1}%
+  \edef\smc@dpTabX{-\the\dimexpr#2}%
+  \smc@gobblenil
+}
+\def\smc@gobblenil#1\@nil{} 
+%    \end{macrocode}
+% Code pour les algorithmes. Comme pour les tableaux, on a besoin d'un
+% certains nombre de longueurs et de couleurs. On les définit en
+% premier lieu.
+%    \begin{macrocode}
+\definecolor{FondAlgo}          {cmyk}{0.07, 0.00, 0.30, 0.00}
+\colorlet{AlgorithmeRuleColor}{D2}
+\colorlet{AlgorithmeBkgColor}{FondAlgo}
+\colorlet{CouleurAlgoAffiche}{Noir}
+\colorlet{CouleurAlgoDemander}{Noir}
+\colorlet{CouleurAlgoSaisir}{Noir}
+\colorlet{CouleurAlgoStocker}{Noir}
+\colorlet{CouleurAlgoSi}{Noir}
+\colorlet{CouleurAlgoTantque}{Noir}
+\colorlet{CouleurAlgoPour}{Noir}
+\colorlet{CouleurAlgoCalcule}{Noir}
+\colorlet{CouleurAlgoInitialiser}{Noir}
+\colorlet{CouleurAlgoIncrementer}{Noir}
+\colorlet{CouleurAlgoCommentaire}{Noir}
+\colorlet{CouleurAlgoDonnerValeur}{Noir}
+\def\AlgorithmeRuleWidth{1pt}
+\def\AlgorithmeSep{2mm}
+\def\AlgorithmeNumWidth{6mm}
+\def\AlgoIndent{1em}
+\def\BeforeAlgorithmeVSpace{1.5mm}
+\def\AfterAlgorithmeVSpace{1.5mm}
+%    \end{macrocode}
+% On garde les deux façons de composer les algorithmes. L'ancienne
+% façon en premier.
+%    \begin{macrocode}
+\newcounter{smc@line}
+\newenvironment{oldalgorithme}{%
+  \ttfamily
+  \c@smc@line \z@
+  \def\par{%
+    \@@par
+    \afterassignment\smc@displaynum\let\next=%
+  }%
+  \def\smc@displaynum{%
+    \ifx\next\end
+      \expandafter\end
+    \else
+      \global\advance\c@smc@line\@ne%
+      \leavevmode\hb@xt@\AlgorithmeNumWidth{\the\c@smc@line.\hss}%
+      \expandafter\next
+    \fi%
+  }%
+  \shorthandoff{;:!?}%
+  \@vobeyspaces
+  \obeylines
+  \begin{lrbox}{\smc@boxa}%
+  \minipage{\dimexpr\linewidth-\AlgorithmeRuleWidth*2-\AlgorithmeSep*2}%
+}
+{%
+  \endminipage
+  \end{lrbox}%
+  \@@par\addvspace{\BeforeAlgorithmeVSpace}
+  \psframebox[linecolor=AlgorithmeRuleColor,
+              linewidth=\AlgorithmeRuleWidth,
+              fillstyle=solid,
+              fillcolor=AlgorithmeBkgColor,
+              framesep=\AlgorithmeSep,
+              cornersize=absolute,
+              linearc=\AlgorithmeSep]%
+             {\usebox{\smc@boxa}}%
+  \@@par\addvspace{\AfterAlgorithmeVSpace}
+}
+%    \end{macrocode}
+% La nouvelle façon ensuite.
+%    \begin{macrocode}
+\newcount\smc@indent
+\newcommand*\smc@inc@indent{%
+  \advance\smc@indent\@ne
+}
+\newcommand*\smc@dec@indent{%
+  \ifnum\smc@indent>\z@
+    \advance\smc@indent\m@ne
+  \fi
+}
+\newcommand*\smc@write@indent{%
+  \par
+  \refstepcounter{smc@line}%
+  \dimen0 \dimexpr\AlgoIndent*\smc@indent
+  \leavevmode\hb@xt@\AlgorithmeNumWidth{\texttt{\the\c@smc@line.}\hss}%
+  \hspace*{\dimen0}%
+}
+\newcommand*\BlocVariables{%
+  \smc@dec@indent
+  \smc@write@indent
+  \textit{Liste des variables utilis\'ees}%
+  \smc@inc@indent
+}
+\newcommand*\BlocEntrees{%
+  \smc@dec@indent
+  \smc@write@indent
+  \textit{Entr\'ees}%
+  \smc@inc@indent
+}
+\newcommand*\BlocTraitements{%
+  \smc@dec@indent
+  \smc@write@indent
+  \textit{Traitements}
+  \smc@inc@indent
+}
+\newcommand*\BlocAffichage{%
+  \smc@dec@indent
+  \smc@write@indent
+  \textit{Affichage}
+  \smc@inc@indent
+}
+\newcommand\BlocTraitementsEtAffichage{%
+  \smc@dec@indent
+  \smc@write@indent
+  \textit{Traitements et affichage}
+  \smc@inc@indent
+}
+\newcommand*\DeclareVar[3]{%
+  \smc@write@indent
+  \texttt{#1 \string: }%
+  \textit{#2}\hfill
+  \textcolor{CouleurAlgoCommentaire}{#3}%
+}
+\newcommand*\TantQue[2]{%
+  \smc@write@indent
+  \texttt{\textcolor{CouleurAlgoTantque}{\bfseries Tant que} (\texttt{#1})}
+  \texttt{\bfseries faire}
+  \smc@inc@indent
+  #2
+  \smc@dec@indent
+  \smc@write@indent
+  \texttt{\textcolor{CouleurAlgoTantque}{\bfseries Fin Tant que}}%
+}
+\newcommand*\Pour[4]{%
+  \smc@write@indent
+  \texttt{\textcolor{CouleurAlgoPour}{\bfseries Pour}}
+  \texttt{#1}
+  \textcolor{CouleurAlgoPour}{\bfseries variant de}
+  \texttt{#2}
+  \textcolor{CouleurAlgoPour}{\bfseries \`a}
+  \texttt{#3}
+  \texttt{\bfseries faire}
+  \smc@inc@indent
+  #4
+  \smc@dec@indent
+  \smc@write@indent
+  \texttt{\textcolor{CouleurAlgoTantque}{\bfseries Fin Pour}}%
+}
+\newcommand*\PourAvecPas[5]{%
+  \smc@write@indent
+  \texttt{\textcolor{CouleurAlgoPour}{\bfseries Pour}}
+  \texttt{#1}
+  \textcolor{CouleurAlgoPour}{\bfseries variant de}
+  \texttt{#2}
+  \textcolor{CouleurAlgoPour}{\bfseries \`a}
+  \texttt{#3}
+  \textcolor{CouleurAlgoPour}{\bfseries avec un pas de}
+  \texttt{#4}
+  \texttt{faire}
+  \smc@inc@indent
+  #5
+  \smc@dec@indent
+  \smc@write@indent
+  \texttt{\textcolor{CouleurAlgoTantque}{\bfseries Fin Pour}}%
+}
+\newcommand*\SiAlors[2]{%
+  \smc@write@indent
+  \texttt{\textcolor{CouleurAlgoSi}{\bfseries Si}}
+  {#1}
+  \texttt{\textcolor{CouleurAlgoSi}{\bfseries  Alors}}
+  \smc@inc@indent
+  #2
+  \smc@dec@indent
+  \smc@write@indent
+  \texttt{\textcolor{CouleurAlgoSi}{\bfseries Fin Si}}%
+}
+\newcommand*\SiAlorsSinon[3]{%
+  \smc@write@indent
+  \texttt{\textcolor{CouleurAlgoSi}{\bfseries Si}}
+  {#1}
+  \texttt{\textcolor{CouleurAlgoSi}{\bfseries Alors}}
+  \smc@inc@indent
+  #2
+  \smc@dec@indent
+  \smc@write@indent
+  \texttt{\textcolor{CouleurAlgoSi}{\bfseries Sinon}}
+  \smc@inc@indent
+  #3
+  \smc@dec@indent
+  \smc@write@indent
+  \texttt{\textcolor{CouleurAlgoSi}{\bfseries Fin Si}}%
+}
+\newcommand*\AfficherVar[1]{%
+  \smc@write@indent
+  \textcolor{CouleurAlgoAffiche}{Afficher la valeur de}
+  \texttt{#1}%
+}
+\newcommand*\Afficher[1]{%
+  \smc@write@indent
+  \textcolor{CouleurAlgoAffiche}{Afficher}
+  #1%
+}
+\newcommand*\Calculer[1]{%
+  \smc@write@indent
+  \textcolor{CouleurAlgoCalcule}{Calculer}
+  #1%
+}
+\newcommand*\Demander[1]{%
+  \smc@write@indent
+  \textcolor{CouleurAlgoDemander}{Demander}
+  \texttt{#1}%
+}
+\newcommand*\Saisir[1]{%
+  \smc@write@indent
+  \textcolor{CouleurAlgoSaisir}{Saisir}
+  \texttt{#1}%
+}
+\newcommand*\Stocker[1]{%
+  \smc@write@indent
+  \textcolor{CouleurAlgoStocker}{Stocker} la r\'eponse dans
+  \texttt{#1}%
+}
+\newcommand*\DonnerValeur[2]{%
+  \smc@write@indent
+  \textcolor{CouleurAlgoDonnerValeur}{Donner} \`a \texttt{#1}
+  la valeur de \texttt{#2}%
+}
+\newcommand*\TitreAlgo[1]{%
+  \smc@write@indent
+  \textit{Algorithme \string: }#1
+}
+\newcommand*\FinAlgo{%
+  \smc@dec@indent
+  \smc@write@indent
+  \textit{Fin de l'algorithme}%
+}
+\newenvironment{algorithme}{%
+  \c@smc@line\z@
+  \shorthandoff{;:!?}%
+  \begin{lrbox}{\smc@boxa}%
+  \minipage{\dimexpr\linewidth-\AlgorithmeRuleWidth*2-\AlgorithmeSep*2}%
+}
+{%
+  \endminipage
+  \end{lrbox}%
+  \par\addvspace{\BeforeAlgorithmeVSpace}
+  \psframebox[linecolor=AlgorithmeRuleColor,
+              linewidth=\AlgorithmeRuleWidth,
+              fillstyle=solid,
+              fillcolor=AlgorithmeBkgColor,
+              framesep=\AlgorithmeSep,
+              cornersize=absolute,
+              linearc=\AlgorithmeSep]%
+             {\usebox{\smc@boxa}}%
+  \par\addvspace{\AfterAlgorithmeVSpace}
+}
+%    \end{macrocode}
+% Code pour les unités.
+%    \begin{macrocode}
+\let\uori\u
+\let\Uori\U
+\let\U\relax
+\newcommand\U[1]{\ensuremath{#1}}
+\renewcommand\u[1]{\ensuremath{\nombre{#1}}}
+\newcommand\newunit[2]{%
+  \expandafter\newcommand\csname u#1\endcsname[1]{%
+    \@ifmtarg{##1}
+      {\ensuremath{#2}}
+      {\ensuremath{\nombre{##1}\,#2}}%
+  }%
+  \expandafter\newcommand\csname U#1\endcsname[1]{%
+    \@ifmtarg{##1}
+      {\ensuremath{#2}}
+      {\ensuremath{##1\,#2}}%
+  }%
+}
+\newcommand\renewunit[2]{%
+  \expandafter\renewcommand\csname u#1\endcsname[1]{%
+    \@ifmtarg{##1}
+      {\ensuremath{#2}}
+      {\ensuremath{\nombre{##1}\,#2}}%
+  }%
+  \expandafter\renewcommand\csname U#1\endcsname[1]{%
+    \@ifmtarg{##1}
+      {\ensuremath{#2}}
+      {\ensuremath{##1\,#2}}%
+  }%
+}
+\newunit{ym}{\text{ym}}
+\newunit{zm}{\text{zm}}
+\newunit{am}{\text{am}}
+\newunit{fm}{\text{fm}}
+\newunit{pm}{\text{pm}}
+\newunit{nm}{\text{nm}}
+\newunit{micron}{\mu\text{m}}
+\newunit{mm}{\text{mm}}
+\newunit{cm}{\text{cm}}
+\newunit{dm}{\text{dm}}
+\newunit{m}{\text{m}}
+\newunit{dam}{\text{dam}}
+\newunit{hm}{\text{hm}}
+\newunit{km}{\text{km}}
+\newunit{Mm}{\text{Mm}}
+\newunit{Gm}{\text{Gm}}
+\newunit{Tm}{\text{Tm}}
+\newunit{Pm}{\text{Pm}}
+\newunit{Em}{\text{Em}}
+\newunit{Zm}{\text{Zm}}
+\newunit{Ym}{\text{Ym}}
+\newunit{mmq}{\text{mm}^2}
+\newunit{cmq}{\text{cm}^2}
+\newunit{dmq}{\text{dm}^2}
+\newunit{mq}{\text{m}^2}
+\newunit{damq}{\text{dam}^2}
+\newunit{hmq}{\text{hm}^2}
+\newunit{kmq}{\text{km}^2}
+\newunit{ha}{\text{ha}}
+\newunit{mmc}{\text{mm}^3}
+\newunit{cmc}{\text{cm}^3}
+\newunit{dmc}{\text{dm}^3}
+\newunit{mc}{\text{m}^3}
+\newunit{damc}{\text{dam}^3}
+\newunit{hmc}{\text{hm}^3}
+\newunit{kmc}{\text{km}^3}
+\newunit{hl}{\text{hl}}
+\newunit{dal}{\text{dal}}
+\newunit{l}{\text{l}}
+\newunit{dl}{\text{dl}}
+\newunit{cl}{\text{cl}}
+\newunit{ml}{\text{ml}}
+\newunit{hel}{\text{h$\ell$}}
+\newunit{dael}{\text{da$\ell$}}
+\newunit{el}{\text{$\ell$}}
+\newunit{del}{\text{d$\ell$}}
+\newunit{cel}{\text{c$\ell$}}
+\newunit{mel}{\text{m$\ell$}}
+\newunit{s}{\text{s}}
+\newunit{min}{\text{min}}
+\newunit{h}{\text{h}}
+\newunit{ms}{\text{m$\cdot$s}^{-1}}
+\newunit{mh}{\text{m$\cdot$h}^{-1}}
+\newunit{kms}{\text{km$\cdot$s}^{-1}}
+\newunit{kmmin}{\text{km$\cdot$min}^{-1}}
+\newunit{kmh}{\text{km$\cdot$h}^{-1}}
+\newunit{ls}{\text{$\ell\cdot$s}^{-1}}
+\newunit{mg}{\text{mg}}
+\newunit{cg}{\text{cg}}
+\newunit{dg}{\text{dg}}
+\newunit{g}{\text{g}}
+\newunit{dag}{\text{dag}}
+\newunit{hg}{\text{hg}}
+\newunit{kg}{\text{kg}}
+\newunit{T}{\text{T}}
+\newunit{pc}{\%}
+\newunit{deg}{\text{\degre}}
+\newunit{degc}{\text{\degre C}}
+\newunit{euro}{\text{\euro}}
+%    \end{macrocode}
+% Code pour les strut
+%    \begin{macrocode}
+\newcommand*\Strut[1][1]{%
+  \leavevmode
+  \vrule \@height #1\ht\strutbox
+         \@depth #1\dp\strutbox
+         \@width\z@
+}
+\newcommand*\TopStrut[1][1]{%
+  \leavevmode
+  \vrule \@height #1\ht\strutbox
+         \@depth \z@
+         \@width \z@
+}
+\newcommand*\BotStrut[1][1]{%
+  \leavevmode
+  \vrule \@height \z@
+         \@depth #1\dp\strutbox
+         \@width \z@
+}
+%    \end{macrocode}
+% \begin{macro}{\setlist}
+% Code pour les listes. Ici, il faut choisir le type de liste qu'on
+% veut obtenir. Pour cela, on utilise la macro |\setlist| qui va
+% permettre à l'utilisateur de pouvoir choisir lui-même l'aspect des
+% listes.
+%
+% Le principe est de passer en paramètre le code de la partie
+% voulue. On a les possibilités :
+% \begin{itemize}
+% \item prerequis ;
+% \item AE ;
+% \item exapp ;
+% \item def ;
+% \item activite ;
+% \item rem ;
+% \item exemple ;
+% \item proof ;
+% \item exercice ;
+% \item acquis ;
+% \item commentaire ;
+% \item recreation ;
+% \item annexe ;
+% \item lexique ;
+% \item libre.
+% \end{itemize}
+%    \begin{macrocode}
+\newcommand\setlist[1]{%
+  \expandafter\let\expandafter\itemize
+    \csname smc@#1itemize\endcsname
+  \expandafter\let\expandafter\enditemize
+    \csname endsmc@#1itemize\endcsname
+  \expandafter\let\expandafter\colitemize
+    \csname smc@#1colitemize\endcsname
+  \expandafter\let\expandafter\endcolitemize
+    \csname endsmc@#1colitemize\endcsname
+  \expandafter\let\expandafter\enumerate
+    \csname smc@#1enumerate\endcsname
+  \expandafter\let\expandafter\endenumerate
+    \csname endsmc@#1enumerate\endcsname
+  \expandafter\let\expandafter\colenumerate
+    \csname smc@#1colenumerate\endcsname
+  \expandafter\let\expandafter\endcolenumerate
+    \csname endsmc@#1colenumerate\endcsname
+}
+%    \end{macrocode}
+% \end{macro}
+% Auparavant, il faut toutes les couleurs et les longueurs utilisées
+% par les listes.
+%    \begin{macrocode}
+\colorlet{CommentaireItemColor}{Noir}
+\colorlet{PrerequisItemColor}{B2}
+\colorlet{AEItemColor}{B2}
+\colorlet{ActiviteItemColor}{C1}
+\colorlet{DefItemColor}{B2}
+\colorlet{RemItemColor}{H1}
+\colorlet{ExempleItemColor}{J1}
+\colorlet{ExAppItemColor}{A2}
+\colorlet{ProofItemColor}{J2}
+\colorlet{ExerciceItemColor}{G1}
+\colorlet{AcquisItemColor}{F1}
+\colorlet{RecreationItemColor}{U3}
+\colorlet{LexiqueItemColor}{B2}
+\def\ListLabelWidth{4mm}
+\def\EnumerateLabelWidth{5mm}
+%    \end{macrocode}
+% Listes de type itemize et corritemize
+%    \begin{macrocode}
+\newcommand*\DeclareCorrItemize[2]{%
+  \newenvironment{smc@corr#1itemize}{%
+    \def\item{\par#2~}%
+    \ignorespaces
+  }
+  {\par}
+}
+\def\smc@setalllist{%
+  \setlength{\leftmargin}{\ListLabelWidth}%
+  \setlength{\rightmargin}{0mm}%
+  \setlength{\labelwidth}{\ListLabelWidth}%
+  \setlength{\labelsep}{0mm}%
+  \setlength{\itemindent}{0mm}%
+  \setlength{\listparindent}{0mm}%
+  \setlength{\topsep}{0mm}%
+  \setlength{\partopsep}{\baselineskip}%
+  \setlength{\itemsep}{0mm}%
+  \setlength{\parsep}{0mm}%
+  \def\makelabel##1{##1\hss}%
+}
+\let\smc@setallfirstlist\smc@setalllist
+\def\smc@setallbiglist{%
+  \setlength{\leftmargin}{\EnumerateLabelWidth}%
+  \setlength{\rightmargin}{0mm}%
+  \setlength{\labelwidth}{\EnumerateLabelWidth}%
+  \setlength{\labelsep}{0mm}%
+  \setlength{\itemindent}{0mm}%
+  \setlength{\listparindent}{0mm}%
+  \setlength{\topsep}{0mm}%
+  \setlength{\partopsep}{\baselineskip}%
+  \setlength{\itemsep}{0mm}%
+  \setlength{\parsep}{0mm}%
+  \def\makelabel##1{##1\hss}%
+}
+\newenvironment{smc@prerequisitemize}{%
+  \ifnum\@listdepth=\z@
+    \list{\textcolor{PrerequisItemColor}{$\blacktriangleright$}}
+         {\smc@setalllist}%
+  \else
+    \list{\textcolor{PrerequisItemColor}{$\blacktriangleright$}}
+         {\smc@setalllist}%
+  \fi
+}
+{\endlist}
+\DeclareCorrItemize{prerequis}
+                   {\textcolor{PrerequisItemColor}{$\blacktriangleright$}}
+\newenvironment{smc@AEitemize}{%
+  \ifnum\@listdepth=\z@
+    \list{\textcolor{AEItemColor}{$\bullet$}}
+         {\smc@setalllist}%
+  \else
+    \list{\textcolor{AEItemColor}{$\bullet$}}
+         {\smc@setalllist}%
+  \fi
+}
+{\endlist}
+\DeclareCorrItemize{AE}{\textcolor{AEItemColor}{$\bullet$}}
+\newenvironment{smc@exappitemize}{%
+  \ifnum\@listdepth=\z@
+    \list{\textcolor{ExAppItemColor}{$\bullet$}}
+         {\smc@setalllist}%
+  \else
+    \list{\textcolor{ExAppItemColor}{$\bullet$}}
+         {\smc@setalllist}%
+  \fi
+}
+{\endlist}
+\DeclareCorrItemize{exapp}{\textcolor{ExAppItemColor}{$\bullet$}}
+\newenvironment{smc@defitemize}{%
+  \ifnum\@listdepth=\z@
+    \list{%
+      \color{DefItemColor}%
+      \vrule width \ItemRuleWidth
+             height \ItemRuleHeight
+             depth \ItemRuleDepth
+      \relax}
+         {\smc@setalllist}%
+  \else
+    \list{%
+      \color{DefItemColor}%
+      \vrule width \ItemRuleWidth
+             height \ItemRuleHeight
+             depth \ItemRuleDepth
+      \relax}
+         {\smc@setalllist}%
+  \fi
+}
+{\endlist}
+\DeclareCorrItemize{def}{%
+  \textcolor{DefItemColor}{%
+    \vrule width \ItemRuleWidth
+           height \ItemRuleHeight
+           depth \ItemRuleDepth
+  }%
+}
+\newenvironment{smc@activiteitemize}{%
+  \ifnum\@listdepth=\z@
+    \list{\textcolor{ActiviteItemColor}{$\bullet$}}
+         {\smc@setalllist}%
+  \else
+    \list{\textcolor{ActiviteItemColor}{$\bullet$}}
+         {\smc@setalllist}%
+  \fi
+}
+{\endlist}
+\DeclareCorrItemize{activite}{\textcolor{ActiviteItemColor}{$\bullet$}}
+\newenvironment{smc@remitemize}{%
+  \ifnum\@listdepth=\z@
+    \list{%
+      \color{RemItemColor}
+      \vrule width \ItemRuleWidth
+             height \ItemRuleHeight
+             depth \ItemRuleDepth
+             \relax}
+         {\smc@setalllist}%
+  \else
+    \list{%
+      \color{RemItemColor}
+      \vrule width \ItemRuleWidth
+             height \ItemRuleHeight
+             depth \ItemRuleDepth
+             \relax}
+         {\smc@setalllist}%
+  \fi
+}
+{\endlist}
+\DeclareCorrItemize{rem}{%
+  \textcolor{RemItemColor}{%
+    \vrule width \ItemRuleWidth
+           height \ItemRuleHeight
+           depth \ItemRuleDepth
+  }%
+}
+\newenvironment{smc@exempleitemize}{%
+  \ifnum\@listdepth=\z@
+    \list{\textcolor{ExempleItemColor}{$\bullet$}}
+         {\smc@setalllist}%
+  \else
+    \list{\textcolor{ExempleItemColor}{$\bullet$}}
+         {\smc@setalllist}%
+  \fi
+}
+{\endlist}
+\DeclareCorrItemize{exemple}{\textcolor{ExempleItemColor}{$\bullet$}}
+\newenvironment{smc@proofitemize}{%
+  \ifnum\@listdepth=\z@
+    \list{\textcolor{ProofItemColor}{$\bullet$}}
+         {\smc@setalllist}%
+  \else
+    \list{\textcolor{ProofItemColor}{$\bullet$}}
+         {\smc@setalllist}%
+  \fi
+}
+{\endlist}
+\DeclareCorrItemize{proof}{\textcolor{ProofItemColor}{$\bullet$}}
+\newenvironment{smc@exerciceitemize}{%
+  \ifnum\@listdepth=\z@
+    \list{\textcolor{ExerciceItemColor}{$\bullet$}}
+         {\smc@setalllist}%
+  \else
+    \list{\textcolor{ExerciceItemColor}{$\bullet$}}
+         {\smc@setalllist}%
+  \fi
+}
+{\endlist}
+\DeclareCorrItemize{exercice}{\textcolor{ExerciceItemColor}{$\bullet$}}
+\newenvironment{smc@acquisitemize}{%
+  \ifnum\@listdepth=\z@
+    \list{\textcolor{AcquisItemColor}{\footnotesize$\blacktriangleright$}}
+         {\smc@setalllist}%
+  \else
+    \list{\textcolor{AcquisItemColor}{$\bullet$}}
+         {\smc@setalllist}%
+  \fi
+}
+{\endlist}
+\DeclareCorrItemize{acquis}{\textcolor{AcquisItemColor}{$\bullet$}}
+\newenvironment{smc@commentaireitemize}{%
+  \ifnum\@listdepth=\z@
+    \list{\textcolor{CommentaireItemColor}{$\bullet$}}
+         {\smc@setalllist}%
+  \else
+    \list{\textcolor{CommentaireItemColor}{$\bullet$}}
+         {\smc@setalllist}%
+  \fi
+}
+{\endlist}
+\DeclareCorrItemize{commentaire}{\textcolor{CommentaireItemColor}{$\bullet$}}
+\newenvironment{smc@recreationitemize}{%
+  \ifnum\@listdepth=\z@
+    \list{\textcolor{RecreationItemColor}{$\bullet$}}
+         {\smc@setalllist}%
+  \else
+    \list{\textcolor{RecreationItemColor}{$\bullet$}}
+         {\smc@setalllist}%
+  \fi
+}
+{\endlist}
+\DeclareCorrItemize{recreation}{\textcolor{RecreationItemColor}{$\bullet$}}
+\newenvironment{smc@annexeitemize}{%
+  \ifnum\@listdepth=\z@
+    \list{%
+      \color{AnnexeItemColor}
+      \vrule width \ItemRuleWidth
+             height \ItemRuleHeight
+             depth \ItemRuleDepth
+             \relax}
+         {\smc@setalllist}%
+  \else
+    \list{%
+      \color{AnnexeItemColor}
+      \vrule width \ItemRuleWidth
+             height \ItemRuleHeight
+             depth \ItemRuleDepth
+             \relax}
+         {\smc@setalllist}%
+  \fi
+}
+{\endlist}
+\newenvironment{smc@lexiqueitemize}{%
+  \ifnum\@listdepth=\z@
+    \list{\textcolor{LexiqueItemColor}{$\bullet$}}
+         {\smc@setalllist}%
+  \else
+    \list{\textcolor{LexiqueItemColor}{$\bullet$}}
+         {\smc@setalllist}%
+  \fi
+}
+{\endlist}
+\newenvironment{smc@libreitemize}{%
+  \ifnum\@listdepth=\z@
+    \list{%
+      \color{LibreItemColor}
+      \vrule width \ItemRuleWidth
+             height \ItemRuleHeight
+             depth \ItemRuleDepth
+             \relax}
+         {\smc@setalllist}%
+  \else
+    \list{%
+      \color{LibreItemColor}
+      \vrule width \ItemRuleWidth
+             height \ItemRuleHeight
+             depth \ItemRuleDepth
+             \relax}
+         {\smc@setalllist}%
+  \fi
+}
+{\endlist}
+\DeclareCorrItemize{libre}{%
+  \textcolor{LibreItemColor}{%
+    \vrule width \ItemRuleWidth
+           height \ItemRuleHeight
+           depth \ItemRuleDepth
+  }%
+}
+%    \end{macrocode}
+% Listes de type enumerate
+%    \begin{macrocode}
+\newenvironment{bigenumerate}
+  {%
+    \let\smc@setallfirstlist\smc@setallbiglist
+    \begin{enumerate}
+  }
+  {\end{enumerate}}
+\newcommand\DeclareEnumerate[3]{%
+  \newenvironment{smc@#1enumerate}{%
+    \gdef\smc@curr@itemcmd{#2}%
+    \gdef\smc@curr@itemcolor{#3}%(
+    \renewcommand\labelenumi{\textcolor{#3}{#2\theenumi)}}%(
+    \renewcommand\labelenumii{\textcolor{#3}{#2\theenumii)}}%(
+    \renewcommand\labelenumiii{\textcolor{#3}{#2\theenumiii)}}%
+    \advance\@enumdepth \@ne
+    \ifnum\@enumdepth>\thr@@
+      \ClassError{sesamanuel}{Pas plus de 3 niveaux de liste}
+                 {Consultez la documentation pour plus de renseignements.}
+    \else\ifnum\@enumdepth=\@ne
+      \edef\@enumctr{enum\romannumeral\the\@enumdepth}%
+      \expandafter
+      \list
+        \csname label\@enumctr\endcsname
+        {%
+          \usecounter{\@enumctr}%
+          \smc@setallfirstlist
+        }%
+    \else
+      \edef\@enumctr{enum\romannumeral\the\@enumdepth}%
+      \expandafter
+      \list
+        \csname label\@enumctr\endcsname
+        {%
+          \usecounter{\@enumctr}%
+          \smc@setalllist
+        }%
+    \fi\fi
+  }
+  {\endlist}
+  \newenvironment{smc@corr#1enumerate}{%
+    \gdef\smc@curr@itemcmd{#2}%
+    \gdef\smc@curr@itemcolor{#3}%(
+    \setcounter{enumi}{0}%
+    \setcounter{enumii}{0}%
+    \setcounter{enumiii}{0}%
+    \renewcommand\labelenumi{\textcolor{#3}{#2\theenumi)}}%(
+    \renewcommand\labelenumii{\textcolor{#3}{#2\theenumii)}}%(
+    \renewcommand\labelenumiii{\textcolor{#3}{#2\theenumiii)}}%
+    \advance\@enumdepth \@ne
+    \ifnum\@enumdepth>\thr@@
+      \ClassError{sesamanuel}{Pas plus de 3 niveaux de liste}
+                 {Consultez la documentation pour plus de renseignements.}
+    \else
+      \def\smc@enum{%
+        \refstepcounter{enum\romannumeral\@enumdepth}%
+        \csname labelenum\romannumeral\@enumdepth\endcsname~
+      }%
+      \def\item{%
+        \smc@enum
+        \def\item{\par\smc@enum}%
+      }%
+    \fi
+    \ignorespaces
+  }
+  {\par}
+}
+\DeclareEnumerate{prerequis}{}{PrerequisItemColor}
+\DeclareEnumerate{exapp}{\bfseries}{ExAppItemColor}
+\DeclareEnumerate{def}{\bfseries}{DefItemColor}
+\DeclareEnumerate{AE}{\bfseries}{AEItemColor}
+\DeclareEnumerate{activite}{\bfseries}{ActiviteItemColor}
+\DeclareEnumerate{rem}{}{RemItemColor}
+\DeclareEnumerate{exemple}{}{ExempleItemColor}
+\DeclareEnumerate{proof}{}{ProofItemColor}
+\DeclareEnumerate{exercice}{\bfseries}{ExerciceItemColor}
+\DeclareEnumerate{acquis}{\bfseries}{AcquisItemColor}
+\DeclareEnumerate{commentaire}{}{CommentaireItemColor}
+\DeclareEnumerate{recreation}{\bfseries}{RecreationItemColor}
+\DeclareEnumerate{annexe}{}{AnnexeItemColor}
+\DeclareEnumerate{lexique}{}{LexiqueItemColor}
+\DeclareEnumerate{libre}{}{LibreItemColor}
+%    \end{macrocode}
+% Listes de type colitemize. On a besoin d'une longueur, de deux
+% compteurs et de deux chaînes fixes pour les \environ{colitemize} et
+% \environ{colenumerate}
+%    \begin{macrocode}
+\def\ListHSep{2mm}
+\newcount\smc@nbitem
+\newcount\smc@nbline
+\newcommand*\StringColitemize{colitemize}
+\newcommand*\StringColenumerate{colenumerate}
+\newcommand*\DeclareColItemize[3]{%
+  \newenvironment{#1}[1]{%
+    \par
+    \def\smc@nbcolumn{##1}%
+    \smc@nbitem \z@
+    \edef\StringColCurrent{\StringColitemize}%
+    \toks@{}%
+    \smc@getbody
+  }%
+  {%
+    \expandafter\smc@splititem\the\toks@\item\@nil\item
+    \smc@nbline \numexpr \smc@nbitem+\smc@nbcolumn-1
+    \divide\smc@nbline \smc@nbcolumn
+    \multido{\n=1+1}{\smc@nbline}{%
+      \multido{\ni=\n+\the\smc@nbline}{\smc@nbcolumn}{%
+        \unless\ifnum\ni>\smc@nbitem
+          \makebox[\ListLabelWidth]{\textcolor{#2}{#3}\hss}%
+          \begin{minipage}[t]{\dimexpr
+              (\linewidth-\ListHSep*(\smc@nbcolumn-1))%
+                /\smc@nbcolumn-\ListLabelWidth}
+            \strut\@nameuse{smc@item\ni}\strut
+          \end{minipage}%
+          \hspace{\ListHSep}%
+        \fi
+      }%
+      \ifnum\n=\smc@nbline
+        \endgraf
+      \else
+        \\
+      \fi
+    }%
+  }%
+}
+\long\def\smc@getbody#1\end{%
+  \toks@\expandafter{\the\toks@#1}\smc@testend
+}
+\long\def\smc@testend#1{%
+  \def\smc@arg{#1}%
+  \ifx\smc@arg\StringColCurrent
+    \end{#1}%
+  \else
+    \toks@\expandafter{\the\toks@\end{#1}}%
+    \expandafter\smc@getbody
+  \fi
+}
+\long\def\smc@splititem#1\item{%
+  \smc@@splititem
+}
+\long\def\smc@@splititem#1\item{%
+  \def\smc@arg{#1}%
+  \ifx\smc@arg\@nnil
+  \else
+    \advance\smc@nbitem\@ne
+    \@namedef{smc@item\the\smc@nbitem}{#1}%
+    \expandafter\smc@@splititem
+  \fi
+}
+\DeclareColItemize{smc@prerequiscolitemize}
+                  {PrerequisItemColor}{$\blacktriangleright$}
+\DeclareColItemize{smc@AEcolitemize}
+                  {AEItemColor}{$\bullet$}
+\DeclareColItemize{smc@exappcolitemize}
+                  {ExAppItemColor}{$\bullet$}
+\DeclareColItemize{smc@defcolitemize}
+                  {DefItemColor}
+                  {%
+                    \vrule width \ItemRuleWidth
+                           height \ItemRuleHeight
+                           depth \ItemRuleDepth
+                    \relax
+                  }
+\DeclareColItemize{smc@activitecolitemize}
+                  {ActiviteItemColor}{$\bullet$}
+\DeclareColItemize{smc@remcolitemize}
+                  {RemItemColor}
+                  {%
+                    \vrule width \ItemRuleWidth
+                           height \ItemRuleHeight
+                           depth \ItemRuleDepth
+                    \relax
+                  }
+\DeclareColItemize{smc@exemplecolitemize}
+                  {ExempleItemColor}{$\bullet$}
+\DeclareColItemize{smc@proofcolitemize}
+                  {ProofItemColor}{$\bullet$}
+\DeclareColItemize{smc@exercicecolitemize}
+                  {ExerciceItemColor}{$\bullet$}
+\DeclareColItemize{smc@acquiscolitemize}
+                  {AcquisItemColor}{$\bullet$}
+\DeclareColItemize{smc@commentairecolitemize}
+                  {CommentaireItemColor}{$\bullet$}
+\DeclareColItemize{smc@recreationcolitemize}
+                  {RecreationItemColor}{$\bullet$}
+\DeclareColItemize{smc@annexecolitemize}
+                  {AnnexeItemColor}
+                  {%
+                    \vrule width \ItemRuleWidth
+                           height \ItemRuleHeight
+                           depth \ItemRuleDepth
+                    \relax
+                  }
+\DeclareColItemize{smc@lexiquecolitemize}
+                  {LexiqueItemColor}{$\bullet$}
+\DeclareColItemize{smc@librecolitemize}
+                  {LibreItemColor}
+                  {%
+                    \vrule width \ItemRuleWidth
+                           height \ItemRuleHeight
+                           depth \ItemRuleDepth
+                    \relax
+                  }
+%    \end{macrocode}
+% Listes de type colenumerate.
+%    \begin{macrocode}
+\newcommand*\DeclareColEnumerate[3]{%
+  \newenvironment{#1}[1]{%
+    \par\leavevmode
+    \advance\@enumdepth \@ne
+    \ifnum\@enumdepth>\thr@@
+      \ClassError{sesamanuel}{Pas plus de 3 niveaux de liste}
+                 {Consultez la documentation pour plus de renseignements.}
+    \else
+      \ifcase\@enumdepth
+      \or %(
+        \def\@enumlabel{\textcolor{#3}{#2\ni)}}%(
+      \or
+        \def\@enumlabel{\textcolor{#3}{#2{\@alph\ni})}}%(
+      \or
+        \def\@enumlabel{\textcolor{#3}{#2{\@roman\ni)}}}%
+      \fi
+    \fi
+    \def\smc@nbcolumn{##1}%
+    \smc@nbitem \z@
+    \edef\StringColCurrent{\StringColenumerate}%
+    \toks@{}%
+    \smc@getbody
+  }
+  {%
+    \expandafter\smc@splititem\the\toks@\item\@nil\item
+    \smc@nbline \numexpr \smc@nbitem+\smc@nbcolumn-1
+    \divide\smc@nbline \smc@nbcolumn
+    \multido{\n=1+1}{\smc@nbline}{%
+      \multido{\ni=\n+\the\smc@nbline}{\smc@nbcolumn}{%
+        \unless\ifnum\ni>\smc@nbitem
+          \makebox[\ListLabelWidth]{\@enumlabel\hss}%
+          \begin{minipage}[t]{\dimexpr
+              (\linewidth-\ListHSep*(\smc@nbcolumn-1))%
+                /\smc@nbcolumn-\ListLabelWidth}
+            \strut\@nameuse{smc@item\ni}\strut
+          \end{minipage}%
+          \hspace{\ListHSep}%
+        \fi
+      }%
+      \ifnum\n=\smc@nbline
+        \endgraf
+      \else
+        \\
+      \fi
+    }%
+  }%
+}
+\DeclareColEnumerate{smc@prerequiscolenumerate}
+                    {}{PrerequisItemColor}
+\DeclareColEnumerate{smc@exappcolenumerate}
+                    {\bfseries}{ExAppItemColor}
+\DeclareColEnumerate{smc@defcolenumerate}
+                    {\bfseries}{DefItemColor}
+\DeclareColEnumerate{smc@AEcolenumerate}
+                    {\bfseries}{AEItemColor}
+\DeclareColEnumerate{smc@activitecolenumerate}
+                    {}{ActiviteItemColor}
+\DeclareColEnumerate{smc@remcolenumerate}
+                    {}{RemItemColor}
+\DeclareColEnumerate{smc@exemplecolenumerate}
+                    {}{ExempleItemColor}
+\DeclareColEnumerate{smc@proofcolenumerate}
+                    {}{ProofItemColor}
+\DeclareColEnumerate{smc@exercicecolenumerate}
+                    {\bfseries}{ExerciceItemColor}
+\DeclareColEnumerate{smc@acquiscolenumerate}
+                    {\bfseries}{AcquisItemColor}
+\DeclareColEnumerate{smc@commentairecolenumerate}
+                    {\bfseries}{CommentaireItemColor}
+\DeclareColEnumerate{smc@recreationcolenumerate}
+                    {\bfseries}{RecreationItemColor}
+\DeclareColEnumerate{smc@annexecolenumerate}
+                    {\bfseries}{AnnexeItemColor}
+\DeclareColEnumerate{smc@lexiquecolenumerate}
+                    {\bfseries}{RecreationItemColor}
+\DeclareColEnumerate{smc@librecolenumerate}
+                    {\bfseries}{LibreItemColor}
+%    \end{macrocode}
+% \iffalse
+%</package>
+%<*packageTIKZ>
+% \fi
+% \section{Package TIKZ}
+% Cette extension propose un certains nombre d'outils spécifiques (la
+% majorité concernant TikZ d'où son nom) pour composer l'ouvrage de
+% seconde.
+%    \begin{macrocode}
+\def\filedate{2015/03/03}
+\def\fileversion{1.0}
+\NeedsTeXFormat{LaTeX2e}[1995/06/01]
+\ProvidesPackage{sesamanuelTIKZ}[%
+  \filedate\space v\fileversion\space
+  compagnon de Sesamanuel (SM/JCC/SM)%
+]
+%    \end{macrocode}
+% On commence par charger quelques extensions annexes. La première
+% pour les vecteurs, les autres pour TikZ.
+%    \begin{macrocode}
+\RequirePackage{esvect} 
+\RequirePackage{tikz}
+\RequirePackage{tkz-tab}
+\RequirePackage{pgf}
+\usetikzlibrary{arrows}
+\usetikzlibrary{patterns}  
+%    \end{macrocode}
+% \begin{macro}{\chapeaumelon}
+% La macro |\chapeaumelon| est utilisée pour noter les arcs de cercle.
+%    \begin{macrocode}
+\newcommand{\chapeaumelon}[1]{\stackrel{\Large \frown}{#1}}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\Logosesa}
+% La macro |\Logosesa| sert à composer le logo en couleur de Sesamath.
+%    \begin{macrocode}
+\newcommand{\Logosesa}{%
+  \textcolor{orange}{%
+    \boldmath
+    $
+      \overline{\textcolor{gray}{S}}
+      \acute{\textcolor{gray}e}
+      \overline{
+        \textcolor{gray}{sa}
+        \textcolor{black}{math}
+      }
+    $%
+  }%
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\TikZ}
+% La macro |\TikZ| sert à composer le logo officiel de TikZ.
+%    \begin{macrocode}
+\newcommand\TikZ{Ti\textit{k}Z}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\UniteGras}
+% La macro |\UniteGras| met en gras ce qui suit indifféremment en mode
+% mathématique ou texte (à condition que la fonte correspondant grasse
+% existe bien).
+%    \begin{macrocode}
+\newcommand\UniteGras[1]{{\bfseries \boldmath #1}} 
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{couleurs}
+% On définit ici deux couleurs qui ont servi lors de l'impression de
+% l'ouvrage car les couleurs B1 et H1 posaient des problèmes de
+% passage dans la rotative. Ces couleurs peuvent être certainement
+% ignorées par un utilisateur non professionnel de l'imprimerie.
+%    \begin{macrocode}
+\definecolor{B1prime}{cmyk}{0.00, 1.00, 0.00, 0.50}
+\definecolor{H1prime}{cmyk}{0.50, 0.00, 1.00, 0.00}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{macros TikZ}
+% Le reste du code de cette extension sert pour les figures en
+% TikZ. On ne détaillera pas outre mesure ces macros.
+%    \begin{macrocode}
+\definecolor{CyanTikz40}{cmyk}{.4,0,0,0}
+\definecolor{CyanTikz20}{cmyk}{.2,0,0,0}
+\tikzstyle{general}=[line width=0.3mm, >=stealth, x=1cm, y=1cm,
+  line cap=round, line join=round]
+\tikzstyle{quadrillage}=[line width=0.3mm, color=CyanTikz40]
+\tikzstyle{quadrillageNIV2}=[line width=0.3mm, color=CyanTikz20]
+\tikzstyle{quadrillage55}=[line width=0.3mm, color=CyanTikz40,
+  xstep=0.5, ystep=0.5] 
+\tikzstyle{cote}=[line width=0.3mm, <->]
+\tikzstyle{epais}=[line width=0.5mm, line cap=butt]
+\tikzstyle{tres epais}=[line width=0.8mm, line cap=butt]
+\tikzstyle{axe}=[line width=0.3mm, ->, color=Noir, line cap=rect]
+\newcommand{\quadrillageSeyes}[2]{%
+  \draw[line width=0.3mm, color=A1!10, ystep=0.2, xstep=0.8]
+       #1 grid #2;
+  \draw[line width=0.3mm, color=A1!30, xstep=0.8, ystep=0.8]
+       #1 grid #2;
+}
+\newcommand{\axeX}[4][0]{%
+  \draw[axe] (#2,#1)--(#3,#1);
+  \foreach \x in {#4} {%
+    \draw (\x,#1) node {\small $+$};
+    \draw (\x,#1) node[below] {\small $\x$};
+  }%
+}
+\newcommand{\axeY}[4][0]{%
+  \draw[axe] (#1,#2)--(#1,#3);
+  \foreach \y in {#4} {%
+    \draw (#1, \y) node {\small $+$};
+    \draw (#1, \y) node[left] {\small $\y$};
+  }%
+}
+\newcommand{\axeOI}[3][0]{%
+  \draw[axe] (#2,#1)--(#3,#1); 
+  \draw (1,#1) node {\small $+$};
+  \draw (1,#1) node[below] {\small $I$};
+}
+\newcommand{\axeOJ}[3][0]{%
+  \draw[axe] (#1,#2)--(#1,#3);
+  \draw (#1, 1) node {\small $+$};
+  \draw (#1, 1) node[left] {\small $J$};
+}
+\newcommand{\axeXgraduation}[2][0]{%
+  \foreach \x in {#2} {%
+    \draw (\x,#1) node {\small $+$};
+  }%
+}
+\newcommand{\axeYgraduation}[2][0]{%
+  \foreach \y in {#2} {%
+    \draw (#1, \y) node {\small $+$};
+  }%
+}
+\newcommand{\origine}{\draw (0,0) node[below left] {\small $0$};}
+\newcommand{\origineO}{\draw (0,0) node[below left] {$O$};}
+\newcommand{\point}[4]{\draw (#1,#2) node[#4] {$#3$};}
+\newcommand{\pointGraphique}[4]{%
+  \draw (#1,#2) node[#4] {$#3$};
+  \draw (#1,#2) node {$+$};
+}
+\newcommand{\pointFigure}[4]{%
+  \draw (#1,#2) node[#4] {$#3$};
+  \draw (#1,#2) node {$\times$};
+}
+\newcommand{\pointC}[3]{\draw (#1) node[#3] {$#2$};}
+\newcommand{\pointCGraphique}[3]{%
+  \draw (#1) node[#3] {$#2$};
+  \draw (#1) node {$+$};
+}
+\newcommand{\pointCFigure}[3]{%
+  \draw (#1) node[#3] {$#2$};
+  \draw (#1) node {$\times$};
+}
+%    \end{macrocode}
+% \end{macro}
+% \iffalse
+%</packageTIKZ>
+% \fi
+% \setcounter{IndexColumns}{2}\PrintIndex
+% \newpage
+% \PrintChanges
+% \endinput
-- 
cgit v1.2.3

