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