% \iffalse
%
%% prepamath.dtx
%% Copyright 2009-2025 Prepamath, J.-C. Charpentier.
%%
%<*class>
%% Class `prepamath' to use with LaTeX 2e
%% Copyright (C) 2009-2025 Prepamath, Jean-C\^ome Charpentier.
%</class>
%<*package>
%% Package `rabat' to use with LaTeX 2e
%% Copyright (C) 2015-2016 Prepamath, Jean-C\^ome Charpentier.
%</package>
%<*index>
%% File `prepamath.ist' to use with LaTeX 2e
%% Copyright (C) 2017 Prepamath, Jean-C\^ome Charpentier.
%</index>
%%
%<*driver>
\documentclass{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[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[a4paper, left=2in, right=1in, top=0.75in, bottom=1.5in,
            nohead]{geometry}
\usepackage{makeidx}
\usepackage{array}
\usepackage{amsmath}
\usepackage{xcolor}
\usepackage[french]{babel}
\usepackage{xspace}
\usepackage{hyperref}
\makeindex
\title{Code de la classe \class{prepamath}\\Classe pour les ouvrages Prepamath}
\author{%
  Jean-Côme Charpentier\thanks{\ttfamily jean-come.charpentier@wanadoo.fr}
}
\date{xx xxxxxxx xxxx}

\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{prepamath.dtx}
\PrintChanges
\PrintIndex
\end{document}
%</driver>
% 
% \changes{v1.01}{2009/01/01}{%
%   Correction d'erreurs mineures.
% }
% \changes{v1.02}{2009/02/01}{%
%   \begin{itemize}
%   \item Correction d'erreurs mineures
%   \item Mise en place du mécanisme alternatif de choix des fontes
%   (fontes publiques/fontes commerciales) option realfonts
%   \end{itemize}
% }
% \changes{v1.03}{2009/04/22}{%
%   \begin{itemize}
%   \item Possibilité de compiler plus de 10 chapitres simultanément
%   \item Ajout des commandes LaTeX2.09 |\rm| et compagnie
%   \end{itemize}
% }
% \changes{v1.04}{2009/04/24}{%
%   Mécanismes pour les pages de bac blanc
% }
% \changes{v1.05}{2009/04/25}{%
%   \begin{itemize}
%   \item Possibilité d'utiliser les notes de bas de page
%   \item Fonte à chasse fixe : Latin Modern tt dans tous les cas
%   \end{itemize}
% }
% \changes{v1.06}{2009/04/27}{%
%   \begin{itemize}
%   \item Suppression des codes inutiles
%   \item Corrections sur les valeurs des couleurs
%   \end{itemize}
% }
% \changes{v1.07a}{2009/04/28}{%
%   \begin{itemize}
%   \item Ajout de |\widearc| puisqu'aucune fonte (libre ou
%     commerciale) ne propose cette construction.
%   \item difficulté par défaut de \oldexo à 1 étoile (au
%   lieu de pas de cadre)
%   \end{itemize}
% }
% \changes{v1.07b}{2009/04/29}{%
%   Ajout de commandes |\sectionnn| et compagnie pour avoir la forme
%   non numérotée des titres de section. En principe c'est
%   hors-maquette donc je ne documente pas.
% }
% \changes{v1.07c}{2009/04/29}{%
%   \begin{itemize}
%   \item Gestion de liste avec french
%   \item Compteur choix remis à zéro dans corrqcm
%   \item Modication |\abovedisplayskip| et Cie
%   \item Suppression de quelques |\goodbreak|
%   \item Quelques espaces verticaux revus
%   \item Cadre et numérotation des choix de QCM revus
%   \item |oldexoaddmin| (ajoute automatiquement "min." au temps)
%   \end{itemize}
% }
% \changes{v1.07d}{2009/05/01}{%
%   \begin{itemize}
%   \item Modifications mineures lors de la mise en page finale du
%     livre IL2M
%   \item Ajout de exoaddmin et qcmaddmin pour l'ajout automatique de
%   \og min. \fg{} sur le paramètre de temps
%   \end{itemize}
% }
% \changes{v1.08}{2009/05/03}{%
%   Modification pour pouvoir utiliser l'environnement |exobb| sous la
%   forme |\exobb...\endexobb|
% }
% \changes{v1.09}{2009/05/06}{%
%   \begin{itemize}
%   \item Commande |\Break| appelable autant de fois que voulu dans un
%     environnement.
%   \item Commande |\Break| pour les environnements de type
%   |\WarningLike|
%   \end{itemize}
% }
% \changes{v1.1}{2009/10/28}{%
%   Première version publique de travail.
% }
% \changes{v1.2}{2009/12/08}{%
%   Corrections de bugs et changements ponctuels de la maquette
% }
% \changes{v1.3}{2012/02/27}{%
%   Mise au norme pour pouvoir compiler en UTF-8 (suppression des
%   raccourcis \guillemotleft{} et \guillemotright{} si on n'est pas
%   en codage latin1, latin9 ou ansinew).
% }
% \changes{v1.4}{2012/03/06}{%
%   \begin{itemize}
%   \item Toilettage de la classe.
%   \item Fin du débogage pour pouvoir compiler sous différents
%     codages (UTF-8 et Latin1 testés).
%   \end{itemize}
% }
% \changes{v1.5}{2012/03/07}{%
%   Ajout de la commande |\brevetblanc| (de JB Théou).
% }
% \changes{v1.6}{2012/04/28}{%
%   Compteur partagé pour les types de théorèmes identiques
%   (singulier et pluriel). Pour cela, on ajoute un paramètre au
%   moment de la définition pour indiquer qu'elle sera le compteur
%   utilisé. Cela nécessite donc de vérifier que ce compteur
%   existe ou non avant de le déclarer.
% }
% \changes{v1.6.1}{2012/04/29}{%
%   Bug sur la première page des chapitres spéciaux (bac blanc
%   ou brevet blanc).
% }
% \changes{v1.6.2}{2012/07/17}{%
%   Plus aucun accent dans les messages d'erreur : cela provoque des
%   messages peu compréhensibles dans les rapports de compilation en
%   cas de mélange de codage.
% }
% \changes{v1.7}{2012/11/03}{%
%   Macro unique pour regrouper Bac blanc, Brevet blanc et Devoir de
%   synthèse. Première page avec titre du livre. Gestion des
%   annexes. Chapitres simples.
% }
% \changes{v2.0}{2014/03/29}{%
%   Changements nombreux dans la maquette.
%   - Passage en quadrichromie
%   - environnement algorithme
%   - Écran calculatrice
% }
% \changes{v2.1}{2014/04/26}{%
%   Ajustements multiples avant la version en quadrichromie
%   définitive.
% }
% \changes{v2.11}{2014/05/12}{%
%   Modification des hauteurs d'exposants pour les touches de
%   calculatrice afin d'éviter un débordement vertical.
% }
% \changes{v2.12}{2014/07/11}{%
%   Changement de statut de l'environnement problematique
% }
% \changes{v2.13}{2014/10/22}{%
%   Correction d'un bug dans la référence au nom du lycée dans les
%   solutions des exercices d'introduction.
% }
% \changes{v2.13a}{2014/10/27}{%
%   Ajout d'une précaution de non télescopage de texte sur le nom de
%   l'établissement dans les corrections des exercices
%   d'introduction.
%
%   Correction d'un bug de gestion des (suite) pour les exercices
%   d'introduction.
% }
% \changes{v2.14}{2015/04/09}{%
%   Ajout du code pour l'extension |rabat.sty|.
% }
% \changes{v2.15}{2015/07/16}{%
%   Quelques détails de composition revus.
% }
% \changes{v2.16}{2015/12/04}{%
%   Plus d'ombre pour les cadres des rabats.
% }
% \changes{v2.16a}{2015/12/09}{%
%   Changement de couleur de fond des rabats.
% }
% \changes{v2.17}{2016/02/25}{%
%   Ajout d'un environnement anecdote.
% }
% \changes{v2.17a}{2016/03/11}{%
%   Possibilité d'un sous-titre pour les environnements de type
%   Attention.
% }
% \changes{v2.17b}{2016/04/27}{%
%   Modification de l'espace vertical des colonnes pour les rabats.
% }
% \changes{v2.17c}{2016/05/09}{%
%   Légère modification du comportement de la commande |\choix|.
% }
% \changes{v2.18}{2016/07/04}{%
%   Bug de références dans les annexes lorsque les devoirs spéciaux
%   font partie des annexes. On aligne la présentation des devoirs
%   spéciaux sur celle des autres chapitres en ce qui concerne les
%   en-têtes.
% }
% \changes{v2.18a}{2016/07/13}{%
%   Bug de numérotation des chapitres spéciaux.
% }
% \changes{v2.19}{2017/04/06}{%
%   Ajout d'un mécanisme pour les index et modification de la typo
%   pour les titre d'annexe.
% }
% \changes{v2.2}{2017/04/23}{%
%   Correction de bug sur l'index.
%
%   Thèmes (nouveauté).
% }
% \changes{v2.21}{2017/09/17}{%
%   Modification de présentation mineure des environnements type
%   définition.
% }
% \changes{v2.22}{2019/02/17}{%
%   \begin{itemize}
%   \item Modification de la couleur de fond pour les algorithmes et
%     ajout d'un environnement pour les listings.
%   \item Ajout d'un environnement listing.
%   \item Correction de bug lié à l'incompatibilité entre siunitx et
%   cellspace.
%   \end{itemize}
% }
% \changes{v2.23}{2019/03/30}{%
%   \begin{itemize}
%   \item Possibilité de ne pas mettre de nom de lycée dans les
%     exercices et les corrigés (exercices normaux et exercices-types).
%   \item Modification fonte pour les encadrés d'algorithmiques.
%   \item Modification d'espacements verticaux pour l'encadré listing.
%   \end{itemize}
% }
% \changes{v2.24}{2019/04/26}{%
%   L'imprimeur veut un foliotage remonté de 4mm.
% }
% \changes{v2.25}{2019/05/14}{%
%   \begin{itemize}
%   \item Bug au niveau de l'empagement de l'index.
%   \item Présentation modifiée pour les annexes dans la TdM.
%   \item Chapitre dans des boîtes de 8.5cm de largeur (au lieu de 8cm)
%   \end{itemize}
% }
% \changes{2.26}{2020/03/04}{%
%   \begin{itemize}
%   \item Ajout d'un environnement PlusLoin (avec le logo |\LogoForward|
%     correspondant).
%   \item Modification de la mise en page de |exobb| et |corrigebb|
%     lorsque le deuxième argument est vide.
%   \item Ajout d'un style |numeros| pour les listings afin de numéroter
%     automatiquement les listings.
%   \end{itemize}
% }
% \changes{2.27}{2020/04/28}{%
%   Possibilité d'un code final en fin d'index.
% }
% \change{2.28}{2021/04/20}{%
%   Ajout des liens hypertextes pour les ouvrages à consulter de façon
%   electronique.
%
%   Ajout des liens NathanLive.
% }
% \change{2.28a}{2021/04/25}{%
%   Modification du texte par défaut des objets NathanLive (plus de
%   logo NathanLive en fin de texte).
% }
% \change{2.28b}{2021/05/10}{%
%   Modification du texte par défaut des objets NathanLive : plus de
%   logo du tout. On retrouve le comportement avec logo avec une
%   version étoilée de la commande correspondante
% }
% \change{2.28c}{2025/04/30}{%
% \begin{itemize}
% \item Correction d'un décalage sur les numéros de page réels (dans
%   la zone de crop).
% \item Appel de hyperref avec l'option hypertexnames=false pour
%   résoudre un problème de références.
% \item Ajout de l'option de classe pdg pour obtenir
%   une page de garde avec la page externe pdg.eps (format A4).
% \end{itemize}
% }
% \fi
% \CheckSum{0}
%<*class>
% \section{Code}
% \subsection{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\fileversion{2.28c}
\def\PMversion{2.28c}
\def\filedate{2025/04/30}
\def\PMdate{2025/04/30}
\NeedsTeXFormat{LaTeX2e}[1999/12/01]
\ProvidesClass{prepamath}[%
  \filedate\space v\fileversion\space
  prepamath document class. Jean-Come Charpentier for prepamath%
]
%    \end{macrocode}
% \subsection{Options de classe}
% Pour les options de codage, on se sert d'une macro auxiliaire pour
% se raccourcir le code.
%    \begin{macrocode}
\newcommand*\PM@DeclareEncoding[1]{%
  \DeclareOption{#1}{\def\PM@enc{#1}}%
}
%    \end{macrocode}
% Il n'y aura que les codages les plus fréquemment employés. Si cela
% devait s'avérer insuffisant, on complètera la liste
%    \begin{macrocode}
\PM@DeclareEncoding{ansinew}
\PM@DeclareEncoding{applemac}
\PM@DeclareEncoding{ascii}
\PM@DeclareEncoding{latin1}
\PM@DeclareEncoding{latin9}
\PM@DeclareEncoding{utf8}
%    \end{macrocode}
% Marques d'alignement photographique.
%    \begin{macrocode}
\newif\ifPM@crop
\DeclareOption{crop}{\PM@croptrue}
\DeclareOption{nocrop}{\PM@cropfalse}
%    \end{macrocode}
% Utilisation ou non de PSTricks (nopstricks pour pdflatex)
%    \begin{macrocode}
\newif\ifPM@pstricks \PM@pstrickstrue
\DeclareOption{nopstricks}{\PM@pstricksfalse}
\DeclareOption{pstricks}{\PM@pstrickstrue}
%    \end{macrocode}
% Option pour une sorte de fork sur la classe (tous les bouquins ne
% vont pas utiliser la même classe).
%    \begin{macrocode}
\newif\ifPM@oldexample
\DeclareOption{newexample}{\PM@oldexamplefalse}
\DeclareOption{oldexample}{\PM@oldexampletrue}
%    \end{macrocode}
% La classe peut servir à réaliser des rabats (avec l'extension
% |rabat.sty|). L'option rabat gérera le tout de façon
% automatique. Par défaut, le booléen sera faux donc, en pratique, il
% n'y a pas besoin de spécifier l'option |norabat| dans les options
% par défaut.
%    \begin{macrocode}
\newif\ifPM@rabat
\DeclareOption{rabat}{\PM@rabattrue}
\DeclareOption{norabat}{\PM@rabatfalse}
%    \end{macrocode}
% La version 2.28 permet l'utilisation de liens hypertextes. Cela doit
% être une option de classe pour pouvoir obtenir un pdf devant être
% imprimé ou un pdf destiné à l'écran avec le même code.
%    \begin{macrocode}
\newif\ifPM@hyperref
\DeclareOption{hyperref}{\PM@hyperreftrue}
\DeclareOption{nohyperref}{\PM@hyperreffalse}
%    \end{macrocode}
% La version 2.28c introduit la possibilité d'avoir une page de garde
% habituelle avec le titre de l'ouvrage ou bien une page de garde avec
% une page externe nommée obligatoirement |pdg.eps|.
%    \begin{macrocode}
\newif\ifPM@pdg
\DeclareOption{pdg}{\PM@pdgtrue}
\DeclareOption{nopdg}{\PM@pdgfalse}
%    \end{macrocode}
% \subsection{Gestion des fontes}
% On commence à déclarer les commandes de fontes utilisant les fontes
% par défaut, c'est-à-dire les fontes non commerciales.
%    \begin{macrocode}
\newif\ifPM@realfonts
\def\PM@BookTitleFont{\Huge\sffamily\bfseries\boldmath}
\def\PM@HeadFrontChapterFont{\chaptersize\sffamily\bfseries\boldmath}
\def\PM@HeadFirstChapterFont{\LARGE\sffamily\bfseries\boldmath}
\def\PM@HeadFirstChapterNumberFont{\numchaptersize\sffamily\bfseries\boldmath}
\def\PM@HeadNextChapterFont{\normalsize\sffamily\bfseries\boldmath}
\def\PM@HeadNextChapterNumberFont{\Large\sffamily\bfseries\boldmath}
\def\PM@HeadSpecialChapterFont{\specialchaptersize\sffamily\bfseries\boldmath}
\def\PM@TocPartHeadFont{\sffamily\bfseries\boldmath}
\def\PM@TocPartTitleFont{\sffamily\bfseries\boldmath}
\def\PM@TocChapterFont{\small\sffamily}
\def\PM@TocChapterTitleFont{\sffamily\bfseries\boldmath}
\def\PM@TocChapterNumberFont{\Huge\sffamily\bfseries\boldmath}
\def\PM@FootPageFont{\small\sffamily\bfseries\boldmath}
\def\PM@TocTitleThumbFont{\sffamily}
\def\PM@TocTitleThemaFont{\sffamily}
\def\PM@DisplayThumbFont{\Huge\sffamily\bfseries\boldmath}
\def\PM@DisplaySubThumbFont{\large\sffamily\bfseries\boldmath}
\def\PM@MiniTocFont{\normalsize\sffamily\mdseries}
\def\PM@MiniTocNumberFont{\normalsize\sffamily\bfseries\boldmath}
\def\PM@MiniTocTitleFont{\normalsize\sffamily\bfseries\boldmath}
\def\PM@PartHeadFont{\LARGE\sffamily\bfseries\boldmath}
\def\PM@PartTitleFont{\huge\sffamily\bfseries\boldmath}
\def\PM@ChapterFont{\huge\sffamily\bfseries\boldmath}
\def\PM@SpecialChapterFont{\LARGE\sffamily\bfseries\boldmath}
\def\PM@ThemaFont{\Large\sffamily\bfseries\boldmath}
\def\PM@ThumbFont{\large\sffamily\bfseries\boldmath}
\def\PM@ThumbEvenFont{\large\sffamily\bfseries\boldmath}
\def\PM@FrontSectionFont{\large\sffamily\bfseries\boldmath}
\def\PM@SectionFont{\Large\sffamily\bfseries\boldmath}
\def\PM@SectionNumberFont{\large\sffamily\bfseries\boldmath}
\def\PM@SubSectionFont{\large\sffamily\bfseries\boldmath}
\def\PM@SubSectionNumberFont{\large\sffamily\bfseries\boldmath}
\def\PM@SubSubSectionFont{\large\sffamily\bfseries\boldmath}
\def\PM@SubSubSectionNumberFont{\large\sffamily\bfseries\boldmath}
\def\PM@ParagraphFont{\normalsize\sffamily\bfseries\boldmath}
\def\PM@ParagraphNumberFont{\normalsize\sffamily\bfseries\boldmath}
\def\PM@SubParagraphFont{\small\sffamily}
\def\PM@SubParagraphNumberFont{\small\sffamily}
\def\PM@ItemNumberFont{\sffamily}
\def\PM@TheoremFont{\normalsize\sffamily}
\def\PM@ExampleFont{\normalsize\rmfamily\itshape\bfseries\boldmath}
\def\PM@WarningFont{\normalsize\sffamily\bfseries\boldmath}
\def\PM@WarningStarFont{\normalsize\sffamily\bfseries\boldmath}
\def\PM@CaptionFont{\normalsize\rmfamily}
\def\PM@CaptionTitleFont{\normalsize\rmfamily\itshape}
\def\PM@WhiteCartoucheFont{\footnotesize\sffamily\bfseries\boldmath}
\def\PM@BlackCartoucheFont{\normalsize\sffamily\bfseries\boldmath}
\def\PM@ChoiceFont{\normalsize\sffamily}
\def\PM@QCMFont{\footnotesize\sffamily\bfseries\boldmath}
\def\PM@ExoNumberFont{\normalsize\sffamily\bfseries\boldmath}
\def\PM@ExoTitleFont{\large\sffamily\bfseries\boldmath}
\def\PM@ExoSchoolFont{\small\sffamily}
\def\PM@ExoRefFont{\small\sffamily}
\def\PM@ExoTimeFont{\small\sffamily\itshape\bfseries\boldmath}
\def\PM@ExoCorrEnFont{\small\sffamily\itshape\bfseries\boldmath}
\def\PM@ToucheTxt{\footnotesize\sffamily}
\def\PM@ToucheMath{\footnotesize}
\def\PM@ScreenFont{\sffamily}
\def\PM@AlgoFont{\ttfamily\boldmath}
\def\PM@NLFont{\bfseries\itshape}
%    \end{macrocode}
% La commande |\widearc| n'existe pas avec les fontes utilisées. On la
% simule avec PSTricks.
%    \begin{macrocode}
\newcommand*\widearc{%
  \mathpalette\PM@widearc
}
\newcommand*\PM@widearc[2]{%
  \setbox1=\hbox{$#1#2$}%
  \pnode(0.25ex,\ht1){PM@L}\copy1\pnode(0,\ht1){PM@R}%
  \ncarc[linewidth=0.3pt,arcangle=60]{PM@L}{PM@R}%
}
%    \end{macrocode}
% Déclaration des commandes pour les fontes DIN
%    \begin{macrocode}
\def\PM@D{\fontfamily{FF-DIN}\fontseries{m}\selectfont}
\def\PM@DM{\fontfamily{FF-DIN}\fontseries{sb}\selectfont\boldmath}
\def\PM@DB{\fontfamily{FF-DIN}\fontseries{eb}\selectfont\boldmath}
\def\PM@DC{\fontfamily{FF-DIN-cond}\fontseries{m}\selectfont}
\def\PM@DCM{\fontfamily{FF-DIN-cond}\fontseries{sb}\selectfont\boldmath}
\def\PM@DCB{\fontfamily{FF-DIN-cond}\fontseries{eb}\selectfont\boldmath}
%    \endB{macrocode}
% Déclaration des commandes pour les fontes Block
%    \begin{macrocode}
\def\PM@BC{\fontfamily{pb6}\fontseries{mc}\selectfont\boldmath}
\def\PM@B{\fontfamily{pb6}\selectfont\boldmath}
%    \end{macrocode}
% Déclaration des commandes pour les fontes Block heavy
%    \begin{macrocode}
\def\PM@BH{\fontfamily{pb6}\fontseries{eb}\selectfont\boldmath}
%    \end{macrocode}
% Déclaration des commandes pour les fontes Helvetica-Rounded
%    \begin{macrocode}
\def\PM@H{\fontfamily{phr}\selectfont}
\def\PM@HC{\fontfamily{phrc}\selectfont}
%    \end{macrocode}
% Déclaration des commandes pour les fontes Deja VU
%    \begin{macrocode}
\def\PM@DejaVu{\fontfamily{DejaVuSans-TLF}\fontseries{m}\selectfont}
\def\PM@DejaVuB{\fontfamily{DejaVuSans-TLF}\fontseries{b}\selectfont\boldmath}
%    \end{macrocode}
% Avec l'option |realfonts| on utilise les fontes commerciales.
%    \begin{macrocode}
\DeclareOption{realfonts}{%
  \PM@realfontstrue
  \def\PM@BookTitleFont{\PM@DCB\fontsize{30}{36}\selectfont}
  \def\PM@HeadFrontChapterFont{\PM@DCB\fontsize{20}{24}\selectfont}
  \def\PM@HeadFirstChapterFont{\PM@DCB\fontsize{20}{24}\selectfont}
  \def\PM@HeadFirstChapterNumberFont{\PM@B\fontsize{65}{65}\selectfont}
  \def\PM@HeadNextChapterFont{\PM@BC\fontsize{14}{18}\selectfont}
  \def\PM@TocPartHeadFont{\PM@DCM\fontsize{11}{13}\selectfont}
  \def\PM@TocPartTitleFont{\PM@DCM\fontsize{14}{18}\selectfont}
  \def\PM@TocChapterFont{\PM@DCM\fontsize{10}{12}\selectfont}
  \def\PM@TocChapterTitleFont{\PM@DCM\fontsize{14}{18}\selectfont}
  \def\PM@TocChapterNumberFont{\PM@B\fontsize{28}{33}\selectfont}
  \def\PM@FootPageFont{\PM@DCB\fontsize{9}{11}\selectfont}
  \def\PM@TocTitleThumbFont{\PM@DCM\fontsize{11}{13}\selectfont}
  \def\PM@TocTitleThemaFont{\PM@DCM\fontsize{11}{13}\selectfont}
  \def\PM@DisplayThumbFont{\PM@DCM\fontsize{25}{30}\selectfont}
  \def\PM@DisplaySubThumbFont{\PM@DCM\fontsize{14}{18}\selectfont}
  \def\PM@MiniTocFont{\PM@DCM\fontsize{11}{13}\selectfont}
  \def\PM@MiniTocNumberFont{\PM@DCB\fontsize{11}{13}\selectfont}
  \def\PM@MiniTocTitleFont{\PM@DCB\fontsize{11}{13}\selectfont}
  \def\PM@PartHeadFont{\PM@DCB\fontsize{19}{23}\selectfont}
  \def\PM@PartTitleFont{\PM@DCB\fontsize{28}{33}\selectfont}
  \def\PM@ChapterFont{\PM@DCB\fontsize{28}{33}\selectfont}
  \def\PM@SpecialChapterFont{\PM@DCB\fontsize{25}{30}\selectfont}
  \def\PM@ThemaFont{\PM@DCM\fontsize{18}{22}\selectfont}
  \def\PM@ThumbFont{\PM@DCB\fontsize{14}{18}\selectfont}
  \def\PM@ThumbEvenFont{\PM@BC\fontsize{16}{19}\selectfont}
  \def\PM@FrontSectionFont{\PM@DCM\fontsize{14}{18}\selectfont}
  \def\PM@SectionFont{\PM@DCB\fontsize{18}{22}\selectfont}
  \def\PM@SectionNumberFont{\PM@BH\fontsize{12}{14}\selectfont}
  \def\PM@SubSectionFont{\PM@DCB\fontsize{14}{18}\selectfont}
  \def\PM@SubSectionNumberFont{\PM@BH\fontsize{9}{11}\selectfont}
  \def\PM@SubSubSectionFont{\PM@DCB\fontsize{12}{14}\selectfont}
  \def\PM@SubSubSectionNumberFont{\PM@B\fontsize{10}{12}\selectfont}
  \def\PM@ParagraphFont{\PM@DCM\fontsize{12}{14}\selectfont}
  \def\PM@ParagraphNumberFont{\PM@B\fontsize{10}{12}\selectfont}
  \def\PM@SubParagraphFont{\PM@DC\fontsize{12}{14}\selectfont}
  \def\PM@SubParagraphNumberFont{\PM@B\fontsize{9}{11}\selectfont}
  \def\PM@ItemNumberFont{\PM@B\fontsize{8}{9.5}\selectfont}
  \def\PM@TheoremFont{\PM@DCM\fontsize{12}{14}\selectfont}
  \def\PM@ExampleFont{\rmfamily\itshape\fontsize{10}{12}\selectfont}
  \def\PM@WarningFont{\PM@DCB\fontsize{10}{12}\selectfont}
  \def\PM@WarningStarFont{\PM@B\fontsize{10}{12}\selectfont}
  \def\PM@CaptionFont{\rmfamily\fontsize{10}{12}\selectfont}
  \def\PM@CaptionTitleFont{\rmfamily\itshape\fontsize{10}{12}\selectfont}
  \def\PM@WhiteCartoucheFont{\PM@DCB\fontsize{9}{11}\selectfont}
  \def\PM@BlackCartoucheFont{\PM@DCB\fontsize{11}{13}\selectfont}
  \def\PM@ChoiceFont{\PM@DCB\fontsize{10}{12}\selectfont}
  \def\PM@QCMFont{\PM@BH\fontsize{9}{11}\selectfont}
  \def\PM@ExoNumberFont{\PM@BH\fontsize{11}{13}\selectfont}
  \def\PM@ExoTitleFont{\PM@DCB\fontsize{14}{18}\selectfont}
  \def\PM@ExoSubTitleFont{\PM@DCB\fontsize{9}{11}\selectfont}
  \def\PM@ExoSchoolFont{\PM@DCB\fontsize{10}{12}\selectfont}
  \def\PM@ExoRefFont{\PM@DC\fontsize{8.5}{10}\selectfont}
  \def\PM@ExoTimeFont{\PM@DCB\fontsize{9}{11}\selectfont}
  \def\PM@ExoCorrEnFont{\PM@DCB\fontsize{8}{9.5}\selectfont}
  \def\PM@ToucheTxt{\PM@DejaVuB\fontsize{6.5}{8}\selectfont}
  \def\PM@ToucheMath{\footnotesize\boldmath}
  \def\PM@ScreenFont{\PM@H\fontsize{9}{11}\selectfont}
  \def\PM@AlgoFont{\ttfamily\boldmath}
  \def\PM@NLFont{\bfseries\itshape}
}
%    \end{macrocode}
% par défaut on suppose que les sources sont en UTF-8
%    \begin{macrocode}
\def\PM@enc{utf8}
\ProcessOptions
%    \end{macrocode}
% \subsection{Extensions essentielles}
% Appel de l'extension \package{cellspace} tôt (avant certaines autres
% extensions du type \package{tabularx}
%    \begin{macrocode}
\RequirePackage[column=Z]{cellspace}
\setlength{\cellspacetoplimit}{3pt}
\setlength{\cellspacebottomlimit}{3pt}
%    \end{macrocode}
% correction du bug lié à xcolor
%    \begin{macrocode}
\renewcommand*{\@endpbox}{%
  \unless \ifcellspace@
    \@finalstrut \@arstrutbox
  \fi
  \par
  \global \cellspace@lastdp = \prevdepth
%    \end{macrocode}
% C'est là ! Juste le |\expandafter| à ajouter
%    \begin{macrocode}
  \expandafter
  \color@endgroup
  \expandafter
  \egroup
  \ifcellspace@
    \global \cellspace@firstht = \ht\@tempboxa
    \setbox \@tempboxa = \vbox {%
      \setlength{\@tempdima}{\ht\@arstrutbox - \cellspace@firstht}%
      \ifthenelse{\lengthtest{\@tempdima<\cellspacetoplimit}}{%
        \setlength{\@tempdima}{\cellspace@firstht + \cellspacetoplimit}%
      }{%
        \setlength{\@tempdima}{\ht\@arstrutbox}%
      }%
      \hbox{\vrule height \@tempdima width 0pt depth 0pt }%
      \nointerlineskip
      \vskip-\cellspace@firstht
      \unvbox \@tempboxa
      \setlength{\@tempdima}{\dp\@arstrutbox - \cellspace@lastdp}%
      \ifthenelse{\lengthtest{\@tempdima<\cellspacebottomlimit}}{%
        \setlength{\@tempdima}{\cellspace@lastdp + \cellspacebottomlimit}%
      }{%
        \setlength{\@tempdima}{\dp\@arstrutbox}%
      }%
      \vskip-\cellspace@lastdp
      \nointerlineskip
      \hbox{\vrule height 0pt depth \@tempdima width 0pt }%
    }%
  \fi
  \unvbox \@tempboxa
  \egroup
  \hfil
}
\RequirePackage{calc}
%    \end{macrocode}
% Gestion de la couleur. Les travaux d'impression demandent du CMYK.
%    \begin{macrocode}
\RequirePackage[cmyk,table]{xcolor}
%    \end{macrocode}
% Tout ce qui est graphique se fait avec \package{pstricks}
%    \begin{macrocode}
\RequirePackage{pst-all}
\SpecialCoor
%    \end{macrocode}
% Méthode pour mettre en veilleuse toutes les commandes PSTricks
%    \begin{macrocode}
\ifPM@pstricks\else
  \PSTricksOff
  \def\c@lor@to@ps#1{}
  \def\@@{}
\fi
\RequirePackage{multicol}
%    \end{macrocode}
% Si on fait un rabat, les dimensions de la feuille ne sont pas du
% tout celle d'un ouvrage et il n'y aura pas de gestion des
% en-têtes. Cela dit, pour ne pas avoir à tester tout le code
% dépendant de |fancyhdr|, on le charge même s'il n'est pas utile pour
% les rabats (il faut spécifier qu'on est en recto-verso avant
% d'appeler |fancyhdr|).
%    \begin{macrocode}
\@twosidetrue
\RequirePackage[nocheck]{fancyhdr}
\ifPM@rabat
  \newcommand*\PM@pagewidth{650mm}
  \newcommand*\PM@pageheight{260mm}
  \RequirePackage[paperwidth=650mm, paperheight=260mm,
                  noheadfoot]{geometry}
\else
%    \end{macrocode}
% Si on ne fait pas un rabat c'est qu'on compose un ouvrage.
%    \begin{macrocode}
  \RequirePackage[paperwidth=160mm, paperheight=240mm,
                  headheight=12pt]{geometry}
\fi
%    \end{macrocode}
% la mise en page effective (hors dimension du papier) sera réglée
% plus tard dans la classe.
%    \begin{macrocode}
\RequirePackage[T1]{fontenc}
\RequirePackage[\PM@enc]{inputenc}
\ifPM@realfonts
  \RequirePackage[mtbold]{mathtime}
%    \end{macrocode}
% C'était Courier par défaut (beuark).
%    \begin{macrocode}
  \renewcommand*\ttdefault{lmtt}
\else
%    \end{macrocode}
% Times + times mathématiques
%    \begin{macrocode}
  \RequirePackage{mathptmx}
%    \end{macrocode}
% Helvetica
%    \begin{macrocode}
  \RequirePackage{helvet}
%    \end{macrocode}
% Latin Modern tt
%    \begin{macrocode}
  \renewcommand*\ttdefault{lmtt}
%    \end{macrocode}
% |\jmath| n'existe pas sous mathptmx.
%    \begin{macrocode}
  \def\jmath{j}                  
\fi
%    \end{macrocode}
% Le symbole euro est appelé avec le mécanisme proposé dans le package
% europs mais en ne gardant que le symbole de l'euro officiel (pas
% d'euro avec empattement, à chasse fixe, gras, italique, etc.)
%    \begin{macrocode}
\newcommand*\euro{{\usefont{U}{zpeus}{m}{n} E}\xspace}
\RequirePackage{textcomp}
%    \end{macrocode}
% Pour la famille de substitution, lmr est meilleur que le défaut qui
% est cmr.
%    \begin{macrocode}
\renewcommand*\textcompsubstdefault{lmr}
%    \end{macrocode}
% Chargement d'extensions d'utilité générale. 
%    \begin{macrocode}
\RequirePackage{amsmath}
\RequirePackage{amssymb}
\RequirePackage{array}
\RequirePackage{tabularx}
\RequirePackage{ccaption}
\RequirePackage{graphicx}
%    \end{macrocode}
% L'extension listingsutf8 définit les dimensions
% \cmd{abovecaptionskip} et \cmd{belowcaptionskip} alors que la classe
% s'en sert. Il faut supprimer ces fonctionnalités.
%    \begin{macrocode}
\RequirePackage{listingsutf8}
\let\abovecaptionskip\relax
\let\belowcaptionskip\relax
%    \end{macrocode}
% On définit un certain nombre de fonctionnnalités par défaut de
% l'extension \package{listingsutf8}
%    \begin{macrocode}
\lstset{inputencoding=utf8,
  showstringspaces=false,
  basicstyle=\ttfamily,
  keywordstyle=\color{DO},
  language=python,
  columns=flexible,
  keepspaces=true,
  aboveskip=0pt,
  belowskip=0pt,
  literate=
    {à}{{\`a}}{1}%
    {â}{{\^a}}{1}%%%
    {ä}{{\"a}}{1}%%%
    {À}{{\`A}}{1}%
    {Â}{{\^A}}{1}%
    {Ä}{{\"A}}{1}%
    {ç}{{\c{c}}}{1}%
    {Ç}{{\c{C}}}{1}%
    {é}{{\'e}}{1}%
    {è}{{\`e}}{1}%
    {ê}{{\^e}}{1}%
    {ë}{{\"e}}{1}%
    {É}{{\'E}}{1}%
    {È}{{\`E}}{1}%
    {Ê}{{\^E}}{1}%
    {Ë}{{\"E}}{1}%
    {î}{{\^i}}{1}%
    {ï}{{\"i}}{1}%
    {Î}{{\^I}}{1}%
    {Ï}{{\"I}}{1}%
    {ô}{{\^o}}{1}%
    {ö}{{\"o}}{1}%
    {Ô}{{\^O}}{1}%
    {Ö}{{\"O}}{1}%
    {œ}{{\oe}}{1}%
    {Œ}{{\OE}}{1}%
    {ù}{{\`u}}{1}%
    {û}{{\^u}}{1}%
    {ü}{{\"u}}{1}%
    {Ù}{{\`U}}{1}%
    {Û}{{\^U}}{1}%
    {Ü}{{\"U}}{1}%
    {ÿ}{{\"y}}{1}%
    {Ÿ}{{\"Y}}{1}%
  ,
  breaklines=true
}
%    \end{macrocode}
% Les listings pourront être numérotés avec le style |numeros| (ajout
% de la version 2.26).
%    \begin{macrocode}
\lstdefinestyle{numeros}{numbers=left, numberstyle=\ttfamily,
  numbersep=10pt, xleftmargin=5mm}
%    \end{macrocode}
% L'extension \package{fancyvrb} sera utilisée pour la gestion des
% corrigés.
%    \begin{macrocode}
\RequirePackage{fancyvrb}
%    \end{macrocode}
% Il faut définir |\@makefntext| avant d'exécuter \file{frenchb.ldf}.
%    \begin{macrocode}
\newcommand\@makefntext[1]{%
  \parindent 1em
  \noindent
  \hb@xt@1.8em{\hss\@makefnmark}#1%
}
%    \end{macrocode}
% Je suppose qu'il n'y a que du français dans les ouvrages
% Prépamath. Sinon, il faudra prévoir une option de classe pour gérer
% les différentes langues.
%    \begin{macrocode}
\RequirePackage[french]{babel}
%    \end{macrocode}
% Avec la nouvelle version de \package{french}, |\nombre| est géré
% par \package{numprint}.
%    \begin{macrocode}
\RequirePackage[autolanguage]{numprint}
%    \end{macrocode}
% Modification des listes de \package{french}.
%    \begin{macrocode}
\def\itemizeFB{%
    \ifnum \@itemdepth >\thr@@\@toodeep\else
      \advance\@itemdepth\@ne
      \edef\@itemitem{labelitem\romannumeral\the\@itemdepth}%
      \expandafter
      \listORI
      \csname\@itemitem\endcsname
      {\settowidth{\labelwidth}{\csname\@itemitem\endcsname}%
       \setlength{\leftmargin}{\labelwidth}%
       \addtolength{\leftmargin}{\labelsep}%
       \ifnum\@listdepth=0
         \setlength{\itemindent}{\parindent}%
       \else
         \addtolength{\leftmargin}{\parindent}%
       \fi
       \setlength{\itemsep}{4\p@ \@plus2\p@ \@minus\p@}%
       \setlength{\parsep}{\z@}%
       \setlength{\topsep}{4\p@ \@plus2\p@ \@minus\p@}%
       \setlength{\partopsep}{\z@}%
       \@tempdima=\parskip
       \addtolength{\topsep}{-\@tempdima}%
       \addtolength{\partopsep}{\@tempdima}}%
    \fi}
\RequirePackage{xspace}
% \subsection{Tailles de fontes et longueurs relatives}
% Taille pour un corps optique de 10 points comme fonte de base.  Les
% 10 tailles standard sont définies
%    \begin{macrocode}
\renewcommand\normalsize{%
   \@setfontsize\normalsize{10}{12}%
   \abovedisplayskip 4\p@ \@plus2\p@ \@minus1\p@
   \abovedisplayshortskip \z@ \@plus3\p@
   \belowdisplayshortskip 3\p@ \@plus3\p@
   \belowdisplayskip \abovedisplayskip
   \let\@listi\@listI}
\normalsize
\newcommand\small{%
   \@setfontsize\small{9}{11}%
   \abovedisplayskip 3\p@ \@plus3\p@ \@minus1\p@
   \abovedisplayshortskip \z@ \@plus2\p@
   \belowdisplayshortskip 2\p@ \@plus2\p@ \@minus1\p@
   \def\@listi{\leftmargin\leftmargini
               \topsep 4\p@ \@plus2\p@ \@minus2\p@
               \parsep 2\p@ \@plus\p@ \@minus\p@
               \itemsep \parsep}%
   \belowdisplayskip \abovedisplayskip
}
\newcommand\footnotesize{%
   \@setfontsize\footnotesize{8}{9.5}%
   \abovedisplayskip 2\p@ \@plus2\p@ \@minus0.5\p@
   \abovedisplayshortskip \z@ \@plus\p@
   \belowdisplayshortskip 1.5\p@ \@plus\p@ \@minus0.5\p@
   \def\@listi{\leftmargin\leftmargini
               \topsep 3\p@ \@plus\p@ \@minus\p@
               \parsep 2\p@ \@plus\p@ \@minus\p@
               \itemsep \parsep}%
   \belowdisplayskip \abovedisplayskip
}
\newcommand\scriptsize{\@setfontsize\scriptsize{7}{8}}
\newcommand\tiny{\@setfontsize\tiny{5}{6}}
\newcommand\large{\@setfontsize\large{12}{14}}
\newcommand\Large{\@setfontsize\Large{14}{18}}
\newcommand\LARGE{\@setfontsize\LARGE{18}{22}}
\newcommand\huge{\@setfontsize\huge{19}{24}}
\newcommand\Huge{\@setfontsize\Huge{25}{30}}
%    \end{macrocode}
% Adaptation des listes à la classe
%    \begin{macrocode}
\def\@listi{\leftmargin\leftmargini
            \parsep 4\p@ \@plus2\p@ \@minus\p@
            \topsep 8\p@ \@plus2\p@ \@minus4\p@
            \itemsep4\p@ \@plus2\p@ \@minus\p@}
\let\@listI\@listi
\renewcommand\FrenchLabelItem{%
  \pscircle*[linecolor=PM@item@color](0,0.75ex){0.5mm}
  \hspace*{1.5mm}%
}
\renewcommand\theenumi{\colorbox{\PM@thumb@dcolor}{\@arabic\c@enumi}}
\renewcommand\theenumii{(\@alph\c@enumii)}
\renewcommand\theenumiii{\@roman\c@enumiii}
\renewcommand\theenumiv{\@Alph\c@enumiv}
\renewcommand\theenumi{\@arabic\c@enumi}
\renewcommand\theenumii{\@alph\c@enumii}
\renewcommand\theenumiii{\@roman\c@enumiii}
\renewcommand\theenumiv{\@Alph\c@enumiv}
\newcommand\labelenumi{\theenumi}
\newcommand\labelenumii{\theenumii}
\newcommand\labelenumiii{\theenumiii}
\newcommand\labelenumiv{\theenumiv}
\renewcommand\p@enumii{\theenumi.}
\renewcommand\p@enumiii{\theenumi.\theenumii}
\renewcommand\p@enumiv{\p@enumiii.\theenumiii}
\def\enumerate{%
  \ifnum \@enumdepth >\thr@@\@toodeep\else
    \advance\@enumdepth\@ne
    \edef\@enumctr{enum\romannumeral\the\@enumdepth}%
    \expandafter\list
    \csname label\@enumctr\endcsname
    {%
      \usecounter\@enumctr
      \ifnum\@enumdepth>1
        \def\makelabel##1{{\bfseries\boldmath(##1)}\hss}%
      \else
        \def\makelabel##1{%
          \psframebox[linestyle=none, fillstyle=solid,
          fillcolor=\PM@thumb@dcolor]{\textcolor{white}{\PM@ItemNumberFont
              ##1}}%
          \hss
        }%
      \fi
      \setlength{\itemindent}{0pt}%
      \setlength{\labelwidth}{18pt}%
      \setlength{\labelsep}{2pt}%
      \setlength{\leftmargin}{20pt}%
    }%
  \fi
}
\let\endenumerate\endlist
\let\questions\enumerate
\let\endquestions\endenumerate
\setlength{\labelsep}{.5em}
\setlength{\labelwidth}{\leftmargini}
\addtolength{\labelwidth}{-\labelsep}
\newenvironment{description}
  {\list{}
        {%
          \labelwidth\z@
          \itemindent-\leftmargin
          \let\makelabel\descriptionlabel
        }%
  }
  {\endlist}
\newcommand*\descriptionlabel[1]{%
  \hspace\labelsep
  \normalfont\bfseries\boldmath #1%
}
%    \end{macrocode}
% L'appel à microtype ne peut se faire que lorsque les tailles
% standard ont été définies.
%
% Attention, certaines versions de miktex n'aime pas microtype sous
% une compilation LaTeX (donc pas pdfLaTeX). Si cette bêtise existe
% encore, il faudra prévoir une adaptation.
%    \begin{macrocode}
\RequirePackage{microtype}
%    \end{macrocode}
% On charge (éventuellement) le package \package{hyperref} en toute
% fin.
%
% Pour la couleur du soulignement, on a besoin de définir
% immédiatement la couleur utilisée
%    \begin{macrocode}
\ifPM@hyperref
  \definecolor{DR}{cmyk}{0.00,0.88,0.77,0.00}
  \RequirePackage{hyperref}
  \hypersetup{%
    hypertexnames=false,
    breaklinks=true,
    colorlinks=false,
    pdfborderstyle={/S/U/W 1},
    linkbordercolor=DR,
    citebordercolor=DR,
    filebordercolor=DR,
    urlbordercolor=DR
  }
%    \end{macrocode}
% Comme la compilation se fait \emph{via} dvips, il y a des problèmes
% de coupures de liens. Les coupures automatiques sont réglées par le
% package \package{url}.
%    \begin{macrocode}
  \RequirePackage{breakurl}
%    \end{macrocode}
% Les titres dans la TDM, s'ils doivent être des liens hypertextes,
% doivent être découpés en lignes elon la présence de la balise
% |\tdmnl|.
% 
% La macro |\PM@hyperlinktdm| a les mêmes argument que |\hyperlink|,
% c'est-à-dire avec la syntaxe :\\
% |\PM@hyperlinktdm{étiquette}{texte}|
%    \begin{macrocode}
  \newcommand\PM@hyperlinktdm[2]{%
    \def\PM@label{#1}%
    \PM@@hyperlinktdm#2\tdmnl\@nil\tdmnl
  }
  \long\def\PM@@hyperlinktdm#1\tdmnl{%
    \def\PM@arg{#1}%
    \ifx\PM@arg\@nnil
    \else
      \hyperlink{\PM@label}{#1}%
      \expandafter\PM@@nexthyperlinktdm
    \fi
  }
  \long\def\PM@@nexthyperlinktdm#1\tdmnl{%
    \def\PM@arg{#1}%
    \ifx\PM@arg\@nnil
    \else
      \newline
      \hyperlink{\PM@label}{#1}%
      \expandafter\PM@@nexthyperlinktdm
    \fi
  }
%    \end{macrocode}
% Lorsqu'on charge hyperref, afin d'avoir des liens hypertextes qui
% englobe le numéro de page, il faut un mécanisme d'extraction du
% numéro de page à partir d'une étiquette hypertexte. C'est la
% commande |\PM@pageref| qui se charge du travail. Elle stocke la page
% de l'étiquette passée en premier paramètre dans la macro passée en
% deuxième paramètre.
%    \begin{macrocode}
  \newcommand\PM@pageref[2]{%
    \edef\PM@@pageref{\csname r@#1\endcsname}%
    \expandafter\PM@@@pageref\PM@@pageref#2%
  }
  \newcommand\PM@@@pageref[6]{%
    \xdef#6{#2}%
  }
%    \end{macrocode}
% On doit avoir un mécanisme d'ancre spécial pour les éléments
% non numérotés
%    \begin{macrocode}
  \newcounter{anchor}
  \newcommand\PM@anchor{%
    \refstepcounter{anchor}
    \hypertarget{anchor\theanchor}{}%
  }
%    \end{macrocode}
% La classe se charge elle même de l'écriture des bookmarks. Elle va
% reprendre les mécanismes internes de hyperref et, pour cela, a bsoin
% d'un compteur de bookmarks;
%    \begin{macrocode}
  \newcounter{PM@outnumber}
\else
%    \end{macrocode}
% Si on ne charge pas hyperref, il faut quand même définir la commande
% |\url|.
%    \begin{macrocode}
  \usepackage{url}
%    \end{macrocode}
% Il faut également définir la commande |\PM@pagref| car l'extraction
% du numéro de page à partir d'un label ne va pas se faire de la même
% façon.
%    \begin{macrocode}
  \newcommand\PM@pageref[2]{%
    \edef\PM@@pageref{\csname r@#1\endcsname}%
    \expandafter\PM@@@pageref\PM@@pageref#2%
  }
  \newcommand\PM@@@pageref[3]{%
    \xdef#3{#2}%
  }
\fi
%    \end{macrocode}
% Que ce soit avec ou sans liens, la balise |\tdmnl| ne doit pas
% entraîner de saut de ligne en dehors d'une TDM (ou miniTDM).
%    \begin{macrocode}
\DeclareRobustCommand\tdmnl{\xspace}
%    \end{macrocode}
% On définit ensuite les tailles spéciales
%    \begin{macrocode}
\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@}
\setlength{\lineskip}{1\p@}
\setlength{\normallineskip}{1\p@}
%    \end{macrocode}
% et les tailles d'éléments particulier de la classe
%    \begin{macrocode}
\newcommand\chaptersize{\@setfontsize\chaptersize{18}{22}}
\newcommand\bigchaptersize{\@setfontsize\bigchaptersize{19}{24}}
\newcommand\numchaptersize{\@setfontsize\numchaptersize{60}{60}}
%    \end{macrocode}
% \subsection{Couleurs utilisées}
% La nouvelle maquette en couleur fonctionne avec un nombre limité de
% couleurs de base. On commence par définir toutes ces couleurs. La
% première lettre de la couleur indique son intensité (Dark, Medium,
% Light) et la deuxième sa teinte (Red, Blue, Yellow, Orange,
% Green). Chaque teinte est déclinée en trois intensités.
%    \begin{macrocode}
\definecolor{DR}{cmyk}{0.00,0.88,0.77,0.00}
\definecolor{MR}{cmyk}{0.00,0.26,0.23,0.00}
\definecolor{LR}{cmyk}{0.00,0.13,0.12,0.00}
\definecolor{DB}{cmyk}{0.85,0.00,0.17,0.00}
\definecolor{MB}{cmyk}{0.26,0.00,0.05,0.00}
\definecolor{LB}{cmyk}{0.13,0.00,0.03,0.00}
\definecolor{DY}{cmyk}{0.00,0.10,1.00,0.00}
\definecolor{MY}{cmyk}{0.00,0.05,0.45,0.00}
\definecolor{LY}{cmyk}{0.00,0.02,0.15,0.00}
\definecolor{DO}{cmyk}{0.00,0.75,1.00,0.00}
\definecolor{MO}{cmyk}{0.00,0.22,0.30,0.00}
\definecolor{LO}{cmyk}{0.00,0.08,0.10,0.00}
\definecolor{DG}{cmyk}{0.76,0.00,1.00,0.00}
\definecolor{MG}{cmyk}{0.23,0.00,0.30,0.00}
\definecolor{LG}{cmyk}{0.06,0.00,0.08,0.00}
%    \end{macrocode}
% On définit également quelques gris.
%    \begin{macrocode}
\definecolor{DGray}{cmyk}{0.00,0.00,0.00,0.90}
\definecolor{MGray}{cmyk}{0.00,0.00,0.00,0.60}
\definecolor{LGray}{cmyk}{0.00,0.00,0.00,0.30}
%    \end{macrocode}
% La version 2.16a introduit une nouvelle couleur pour le fond des
% rabats. On ne la rend accessible que si on demande à faire des rabats.
%    \begin{macrocode}
\ifPM@rabat
  \definecolor{PM@rabatbkg@color}{cmyk}{0.00,0.08,0.25,0.00}
\fi
%    \end{macrocode}
% Presque toutes les autres couleurs vont être définies en fonction
% des couleurs de base (sauf les dégradés et quelques anciennes
% couleurs inchangées). Les couleurs données dans le nuancier sont
% sensiblement éloignées de la définition CYMK fournie.
%    \begin{macrocode}
\colorlet{PM@headnomain@color}{DR}
\colorlet{PM@sectionnomain@color}{DR}
\colorlet{PM@item@color}{DR}
\colorlet{PM@parttoc@color}{DB}
\colorlet{PM@parthead@color}{MGray}
\colorlet{PM@parttitle@color}{DR}
\colorlet{PM@chaptertoc@color}{DR}
\colorlet{PM@theorem@color}{DR}
\def\PM@thematoc@color{DR}
\colorlet{PM@arrayrule@color}{black}
\colorlet{PM@touche@color}{black}
%    \end{macrocode}
% Les cadres Warning-like sont maintenant rouges.
%    \begin{macrocode}
\colorlet{PM@warning@color}{DR}
%    \end{macrocode}
% Quelques couleurs de l'anciennes maquette restent d'actualité : on
% garde leurs noms et leurs définitions.
%    \begin{macrocode}
\definecolor{PM@blueitem@color}{cmyk}   {1.00,0.00,0.00,0.00}
\definecolor{PM@head@color}{cmyk}       {1.00,0.00,0.00,0.30}
\definecolor{PM@section@color}{cmyk}    {1.00,0.00,0.00,0.00}
\definecolor{PM@thumbtext@color}{cmyk}  {0.00,0.00,0.00,0.40}
\definecolor{PM@example@color}{cmyk}    {0.00,0.00,0.00,1.00}
\definecolor{PM@grayitem@color}{cmyk}   {0.00,0.00,0.00,0.60}
%    \end{macrocode}
% Couleurs pour les éléments en dégradé (cadres ombrés). Lorsqu'on
% compose les rabats, il ne doit plus y avoir d'ombre.
%    \begin{macrocode}
\ifPM@rabat
  \definecolorseries{PM@ombre@color}{cmyk}{step}
                    [cmyk]{0.00,0.00,0.00,0.00}{0.00,0.00,0.00,0.00}
\else
  \definecolorseries{PM@ombre@color}{cmyk}{step}
                    [cmyk]{0.00,0.00,0.00,0.35}{0.00,0.00,0.00,0.97}
\fi
%    \end{macrocode}
% Cadre de la calculatrice. Les couleurs extrêmes correspondent à DG
% et LG. On ne peut pas le définir avec step : cela donne n'importe
% quoi, on les définit une par une.
%    \begin{macrocode}
\colorlet{PM@screenframe@color1}{DG!100!LG}
\colorlet{PM@screenframe@color2}{DG!90!LG}
\colorlet{PM@screenframe@color3}{DG!80!LG}
\colorlet{PM@screenframe@color4}{DG!70!LG}
\colorlet{PM@screenframe@color5}{DG!60!LG}
\colorlet{PM@screenframe@color6}{DG!50!LG}
\colorlet{PM@screenframe@color7}{DG!40!LG}
\colorlet{PM@screenframe@color8}{DG!30!LG}
\colorlet{PM@screenframe@color9}{DG!20!LG}
\colorlet{PM@screenframe@color10}{DG!10!LG}
\colorlet{PM@screenbkg@color}{LG}
%    \end{macrocode}
% Couleur par défaut pour les titres de tableaux (jaune pâle)
%    \begin{macrocode}
\colorlet{TabularColor}{LY}
%    \end{macrocode}
% \subsection{Éléments de mise en page}
% On commence par les marges. Celles-ci ne seront pas du tous les
% mêmes si on fait un rabat ou un ouvrage classique.
%    \begin{macrocode}
\ifPM@rabat
  \geometry{%
    left=0mm, right=0mm,
    top= 0mm, bottom=0mm,
    marginparsep=0mm, marginparwidth=0mm,
    hoffset=0mm, voffset=0mm
  }
\else
  \geometry{%
    left=23mm, right=23mm,
    top= 30mm, bottom=20mm,
    marginparsep=0mm, marginparwidth=0mm,
    hoffset=2.5cm, voffset=1.85cm
  }
\fi
%    \end{macrocode}
% Pour l'instant, la maquette ne précise rien sur la façon dont serait
% composées les pages de type backmatter, ni même si ce type de page
% va pouvoir exister. En premier jet, elles se comporteront comme les
% frontmatter sauf que la pagination continuera.
%    \begin{macrocode}
\newif\ifmainmatter
\newif\iffrontmatter
\newif\ifbackmatter
\newif\ifPM@intro
%    \end{macrocode}
% Booléen pour chapitre bac ou brevet blanc.
%    \begin{macrocode}
\newif\ifPM@special
%    \end{macrocode}
% Booléen pour savoir si un |\Break| est utilisé ou non (pour les
% références).
%    \begin{macrocode}
\newif\ifPM@break
\newcount\PM@shiftpage
\newcount\PM@nbappendix
\newcommand*\thepage{}
\newcommand*\frontmatter{%
  \clearpage
  \renewcommand*\thepage{\@roman\c@page}%
  \global\PM@shiftpage \c@page
  \global\advance\PM@shiftpage \m@ne
  \global\advance\PM@shiftpage \m@ne
  \frontmattertrue
  \mainmatterfalse
  \backmatterfalse
}
\newcommand*\mainmatter{%
  \cleardoublepage
  \renewcommand*\thepage{\@arabic\c@page}%
  \global\PM@shiftpage \c@page
  \global\advance\PM@shiftpage \m@ne
  \global\c@page \@ne
  \frontmatterfalse
  \mainmattertrue
  \backmatterfalse
}
\newcommand*\backmatter{%
%    \end{macrocode}
% pas de reprise de pagination
%    \begin{macrocode}
  \frontmatterfalse
  \mainmatterfalse
  \backmattertrue
}
\newcommand\PM@chapapp{Chapitre}
\newcommand\PM@shortchapapp{Chap}
\newcommand\PM@planchapapp{du chapitre}
\newif\ifappendix
\appendixfalse
\newcommand\appendix{%
  \clearpage
  \appendixtrue
  \setcounter{chapter}{0}%
  \renewcommand\thechapter{\Alph{chapter}}%
  \renewcommand\PM@chapapp{Annexe}%
  \renewcommand\PM@shortchapapp{Annexe}
  \renewcommand\PM@planchapapp{de l'annexe}%
%    \end{macrocode}
% En annexe, les chapitres \og normaux \fg ont la partie cours en
% rouge mais le reste garde les couleurs habituelles.
%    \begin{macrocode}
  \setthumb{R/Cours,O/Interros,G/Corrig\'es*}
}
%    \end{macrocode}
% \subsubsection{Table des matières}
% La macro |\tableofcontents| appelle |\chapter| au lieu de
% |\chapter*|. Il n'y a pas non plus à gérer le double-colonnage.
% Il faut enfin traiter le cas particulier de la macro |\tdmnl|.
%    \begin{macrocode}
\newcommand*\tableofcontents{%
  \chapter{Table des\\mati\`eres}
  \begingroup
    \ifPM@hyperref
      \hypersetup{%
        linkbordercolor=white,
        citebordercolor=white,
        filebordercolor=white,
        urlbordercolor=white
      }%
    \fi
    \let\tdmnl\newline
    \@starttoc{toc}
  \endgroup
  \clearpage
}
%    \end{macrocode}
% La commande |\chaptertocintro| permet de mettre en forme les
% chapitres du type |\chapintro|. Comme pour cette dernière macro, la
% classe va garder le code même s'il n'est pas certain qu'il serve
% encore.
%    \begin{macrocode}
\newcommand*\chaptertocintro[3]{%
  \par\addvspace{\bigskipamount}
  \setbox1=\hbox{\textcolor{PM@section@color}{%
%    \end{macrocode}
% Numéro.
%    \begin{macrocode}
      \PM@TocChapterNumberFont #1
    }%
  }%
    \setbox2=\hbox{\textcolor{PM@section@color}{%
        \PM@TocChapterFont Introduction\
      }%
    }%
    \@tempdima=\ht1
    \advance\@tempdima -\ht2
    \rput(0,0.1){\box2\raisebox{-\@tempdima}{\box1}}
%    \end{macrocode}
% La valeur |10mm| est suffisante pour un alignement avec un chapitre
% à deux chiffres.
%    \begin{macrocode}
  \hspace*{10mm}%
  \begin{minipage}[t]{\linewidth-32mm}%
%    \end{macrocode}
% Titre.
%    \begin{macrocode}
  \textcolor{PM@section@color}{\PM@TocChapterTitleFont #2}%
  \hfill
  \hbox to0pt{\hspace*{10.5mm}%
%    \end{macrocode}
% Page.
%    \begin{macrocode}
    \llap{\textcolor{PM@section@color}{\PM@TocChapterTitleFont #3}}%
    \hss
  }%
  \end{minipage}
  \par
}
%    \end{macrocode}
% Commandes pour composer une partie dans la TdM. La première commande
% permet d'écrire un nombre en lettres.
%    \begin{macrocode}
\newcommand\PM@Letter[1]{%
  \ifcase#1
  \or Premi\`ere%
  \or Deuxi\`eme%
  \or Troisi\`eme%
  \or Quatri\`eme%
  \or Cinqui\`eme
  \or Sixi\`eme%
  \or Septi\`eme%
  \or Huiti\`eme
  \or Neuvi\`eme%
  \or Dixi\`eme%
  \or Onzi\`eme
  \or Douzi\`eme%
  \or Treizi\`eme
  \or Quatorzi\`eme%
  \or Quinzi\`eme%
  \or Seizi\`eme%
  \or Dix-septi\`eme%
  \or Dix-huiti\`eme%
  \or Dix-neuvi\`eme%
  \or Vingti\`eme%
  \else
    \ClassError{Prepamath}{Il y a trop de parties dans l'ouvrage}
    {La classe Prepamath ne permet que 20 parties.}
  \fi
}%
%    \end{macrocode}
% Vient ensuite la commande pour composer les parties dans la Table
% des matières.
%    \begin{macrocode}
\newcommand*\parttoc[3]{%
  \par\addvspace{\bigskipamount}
  \hspace*{10mm}%
  \begin{minipage}[t]{\linewidth-20mm}%
    \ifPM@hyperref
      \textcolor{PM@parttoc@color}
                {\PM@TocPartHeadFont
                  \hyperlink{part#1}{\PM@Letter{#1} partie}}
      \par
      \textcolor{PM@parttoc@color}
                {\PM@TocPartTitleFont
                  \hyperlink{part#1}{\MakeUppercase{#2}}}
    \else
%    \end{macrocode}
% Composition du numéro de partie (en toutes lettres).
%    \begin{macrocode}
      \textcolor{PM@parttoc@color}
                {\PM@TocPartHeadFont
                  \PM@Letter{#1} partie}
      \par
%    \end{macrocode}
% Titre (au-dessous).
%    \begin{macrocode}
      \textcolor{PM@parttoc@color}
                {\PM@TocPartTitleFont
                  \MakeUppercase{#2}}
    \fi
  \end{minipage}%
%    \end{macrocode}
% La table des matières ne montre pas de numéro de pages pour les
% parties. Au cas où les choses changeraient, la commande |\parttoc| a
% quand même un troisième argument pour le numéro de page.
%    \begin{macrocode}
  \par
}
%    \end{macrocode}
% Commande pour composer une annexe dans la TdM.
%    \begin{macrocode}
\newcommand*\appendixtoc[3]{%
  \ifnum#1=1
    \par\addvspace{\bigskipamount}
    \rput[B](0,0){%
      \ifnum\PM@nbappendix=1
        \textcolor{PM@chaptertoc@color}{%
          \PM@TocChapterTitleFont Annexe
        }%
      \else
        \textcolor{PM@chaptertoc@color}{%
          \PM@TocChapterTitleFont Annexes
        }%
      \fi
    }%
  \else
  \fi
%    \end{macrocode}
% La valeur |10mm| est suffisante pour un alignement avec un chapitre
% à deux chiffres.
%    \begin{macrocode}
  \hspace*{10mm}%
%    \end{macrocode}
% Titre.
%    \begin{macrocode}
  \ifPM@hyperref
    {%
      \PM@TocChapterTitleFont
      \hyperlink{appendix#1}{\textcolor{PM@chaptertoc@color}{#2}}%
    }%
  \else
    {%
      \PM@TocChapterTitleFont \textcolor{PM@chaptertoc@color}{#2}%
    }%
  \fi
  \hfill
%    \end{macrocode}
% Page.
%    \begin{macrocode}
  {%
    \PM@TocChapterTitleFont
    \textcolor{PM@chaptertoc@color}{#3}%
  }%
  \par\vspace{-2pt}
}
%    \end{macrocode}
% Commande pour composer un chapitre dans la TdM.
%    \begin{macrocode}
\newcommand*\chaptertoc[3]{%
  \par\addvspace{\bigskipamount}
  \setbox1=\hbox{\textcolor{PM@chaptertoc@color}{%
%    \end{macrocode}
% Numéro.
%    \begin{macrocode}
      \PM@TocChapterNumberFont #1
    }%
  }%
  \ifx\relax#1\relax\else
    \setbox2=\hbox{\textcolor{PM@chaptertoc@color}{%
        \PM@TocChapterFont \PM@shortchapapp\
      }%
    }%
    \@tempdima=\ht1
    \advance\@tempdima -\ht2
    \rput(0,0){\box2\raisebox{-\@tempdima}{\box1}}
  \fi
%    \end{macrocode}
% La valeur |10mm| est suffisante pour un alignement avec un chapitre
% à deux chiffres.
%    \begin{macrocode}
  \hspace*{10mm}%
  \begin{minipage}[t]{\linewidth-20mm}%
%    \end{macrocode}
% Titre.
%    \begin{macrocode}
    \ifPM@hyperref
      \textcolor{PM@chaptertoc@color}{\PM@TocChapterTitleFont
        \PM@hyperlinktdm{chapter#1}{#2}}%
    \else
      \textcolor{PM@chaptertoc@color}{\PM@TocChapterTitleFont #2}%
    \fi
    \hfill
    \hbox to0pt{\hspace*{10.5mm}%
%    \end{macrocode}
% Page.
%    \begin{macrocode}
      \ifPM@hyperref
        \llap{\textcolor{PM@chaptertoc@color}{\PM@TocChapterTitleFont
%            \hyperlink{page.#3}{#3}}%
            \hyperlink{chapter#1}{#3}}%
        }%
      \else
        \llap{\textcolor{PM@chaptertoc@color}{\PM@TocChapterTitleFont #3}}%
      \fi
      \hss
    }%
  \end{minipage}
  \par
}
%    \end{macrocode}
% Commandes pour composer un onglet dans la TdM.
%    \begin{macrocode}
\newcommand\PM@tocbulletcolor[1]{%
  \textcolor{#1}{$\bullet$}%
  \hspace{1.5mm}%
}
\newcommand*\thumbtoc[3]{%
  \hspace*{10mm}%
%    \end{macrocode}
% Titre.
%    \begin{macrocode}
  \ifPM@hyperref
    {\PM@TocTitleThumbFont \hyperlink{#1}{\PM@tocbulletcolor#2}}%    
  \else
    {\PM@TocTitleThumbFont \PM@tocbulletcolor#2}%
  \fi
  \hfill
%    \end{macrocode}
% Page.
%    \begin{macrocode}
  \ifPM@hyperref
    {\PM@TocTitleThumbFont \hyperlink{#1}{#3}}%
  \else
    {\PM@TocTitleThumbFont #3}%
  \fi
  \par\vspace{-2pt}
}
%    \end{macrocode}
% Commande qui sert à aligner dans la table des matières.
%    \begin{macrocode}
\newcommand\PM@tocemptycolor[1]{%
  \textcolor{#1}{\hphantom{$\bullet$}}%
  \hspace{1.5mm}%
}
%    \end{macrocode}
% Commande pour composer un thème dans la TdM.
%    \begin{macrocode}
\newcommand*\thematoc[3]{%
  \hspace*{10mm}%
%    \end{macrocode}
% Titre et page.
%    \begin{macrocode}
  \ifPM@hyperref
    \hyperlink{#1}{\PM@thematoc@format#2\@nil}
  \else
    {\PM@thematoc@format#2\@nil}%
  \fi
  \par\vspace{4pt}
}
\def\PM@thematoc@format#1#2\@nil{%
  \textcolor{#1}{\PM@TocTitleThemaFont(#2\unskip)}%
}
%    \end{macrocode}
% Commande pour composer une section dans une miniTdM de chapitre
%    \begin{macrocode}
\newcommand*\sectionminitoc[3]{%
  \ifPM@hyperref
    \PM@MiniTocFont
    \PM@hyperlinktdm{#1}{%
      {\PM@MiniTocNumberFont #2. }%
      #3%
    }%
    \let \reserved@e \relax
    \let \reserved@f \relax
    \@newline[1mm]%
  \else
    \let\tdml\newline
    \PM@MiniTocNumberFont #2.
    \PM@MiniTocFont #3%
    \let \reserved@e \relax
    \let \reserved@f \relax
    \@newline[1mm]%
  \fi
}
%    \end{macrocode}
% \subsubsection{Commandes de sectionnement}
% Passage en page impaire suivante ou page paire suivante
%    \begin{macrocode}
\renewcommand*\cleardoublepage{%
  \clearpage
  \ifodd\c@page\else
    \thispagestyle{empty}%
    \hbox{}\newpage
  \fi
}
\newcommand*\clearevendoublepage{%
  \clearpage
  \ifodd\c@page
    \thispagestyle{empty}%
    \hbox{}\newpage
  \fi
}
%    \end{macrocode}
% Pour les chapitres on aura la même commande pour les parties
% front/main/backmatter.
%
% Les chapitres de la partie mainmatter sont découpés en différents
% onglets. La classe propose un découpage par défaut
% (Cours-Interros-Corrigé) mais ce défaut peut être modifié de façon
% globale avec la commande |\setthumb| où les onglets sont une liste à
% virgule des différents items). De même, chaque onglet aura une
% couleur associée (R, B, Y, V ou G) qui permettra de composer
% différents éléments. Cette couleur sera spécifiée avec la syntaxe
% :\\
% |couleur/titre-onglet|\\
% où |couleur| sera une des 5 lettres possibles. 
%    \begin{macrocode}
\newcommand*\setthumb[1]{%
  \def\PM@thumbdefault{#1}%
}
%    \end{macrocode}
% Onglets par défaut des chapitres (corrigés sur fond de couleur).
%    \begin{macrocode}
\setthumb{B/Cours,O/Interros,G/Corrig\'es*}
%    \end{macrocode}
% Même chose pour le chapitre Bac Blanc
% Avec la version actuelle de la maquette ces onglets ne sont jamais
% affichés mais je garde quand même la notion d'onglet et toutes les
% commandes qui vont avec (en particulier la commande |\onglet| ou
% |\thumb| pour passer de la partie \og Sujet \fg{} à la partie \og
% Corrigé \fg).
%    \begin{macrocode}
\newcommand*\setspecialthumb[1]{%
  \def\PM@specialthumbdefault{#1}%
}
\setspecialthumb{O/Sujet,G/Corrig\'e*}
\newcount\PM@thumbmax
\newcount\PM@thumbcurr
\newcommand*\PM@getthumb{%
  \PM@thumbmax \z@
  \PM@@getthumb
}
\def\PM@@getthumb#1,{%
  \ifnot@nil{#1}{%
    \advance\PM@thumbmax \@ne
    \PM@@@getthumb#1*\nil
  }%
}
\def\PM@@@getthumb#1/#2*#3\nil{%
  \@namedef{PM@thumbcolor\the\PM@thumbmax}{#1}%
  \@namedef{PM@thumb\the\PM@thumbmax}{#2}%
  \ifx\relax#3\relax
    \@namedef{PM@@thumb\the\PM@thumbmax}{o}%
  \else
    \@namedef{PM@@thumb\the\PM@thumbmax}{*}%
  \fi
  \PM@@getthumb
}
%    \end{macrocode}
% Numérotation les titres
%    \begin{macrocode}
\newcounter{part}
\renewcommand*\thepart{\@arabic\c@part}
\newcounter{chapter}
\renewcommand*\thechapter{\@arabic\c@chapter}
\newcounter{section}[chapter]
\renewcommand*\thesection{\@arabic\c@section}
\newcounter{subsection}[section]
\renewcommand*\thesubsection{\thesection.\@arabic\c@subsection}
\newcounter{subsubsection}[subsection]
\renewcommand*\thesubsubsection{\thesubsection.\@arabic\c@subsubsection}
\newcounter{paragraph}[subsubsection]
\renewcommand*\theparagraph{\thesubsubsection.\@arabic\c@paragraph}
\newcounter{subparagraph}[paragraph]
\renewcommand*\thesubparagraph{\theparagraph.\@arabic\c@subparagraph}
%    \end{macrocode}
% Espacements avant et après les titres
%    \begin{macrocode}
\newlength{\PM@SkipAboveThema}
\setlength{\PM@SkipAboveThema}{0mm plus1\p@}
\newlength{\PM@SkipBelowThema}
\setlength{\PM@SkipBelowThema}{-2mm plus1\p@}
\newlength{\PM@SkipAboveSection}
\setlength{\PM@SkipAboveSection}{8mm plus1\p@}
\newlength{\PM@SkipBelowSection}
\setlength{\PM@SkipBelowSection}{2mm plus1\p@}
\newlength{\PM@SkipAboveSubSection}
\setlength{\PM@SkipAboveSubSection}{4mm plus1\p@}
\newlength{\PM@SkipBelowSubSection}
\setlength{\PM@SkipBelowSubSection}{2mm plus1\p@}
\newlength{\PM@SkipAboveSubSubSection}
\setlength{\PM@SkipAboveSubSubSection}{3mm plus1\p@}
\newlength{\PM@SkipBelowSubSubSection}
\setlength{\PM@SkipBelowSubSubSection}{2mm plus1\p@}
\newlength{\PM@SkipAboveParagraph}
\setlength{\PM@SkipAboveParagraph}{2mm plus1\p@}
\newlength{\PM@SkipBelowParagraph}
\setlength{\PM@SkipBelowParagraph}{1mm plus1\p@}
\newlength{\PM@SkipAboveSubParagraph}
\setlength{\PM@SkipAboveSubParagraph}{2mm plus1\p@}
\newlength{\PM@SkipBelowSubParagraph}
\setlength{\PM@SkipBelowSubParagraph}{1mm plus1\p@}
%    \end{macrocode}
% Titre de la partie en cours.
%    \begin{macrocode}
\newcommand*\PM@part{}
%    \end{macrocode}
% La command |\part| propose un paramètre optionnel. Pour l'instant,
% celui-ci ne sert à rien mais on va quand même prévoir cette syntaxe
% pour l'avenir.
%    \begin{macrocode}
\newcommand*\part[2][]{%
%    \end{macrocode}
% Normalement, les parties ne sont autorisées que dans la partie
% mainmatter.
%    \begin{macrocode}
  \ifmainmatter
    \cleardoublepage
    \renewcommand*\PM@part{#2}%
    \pagestyle{partmain}%
    \thispagestyle{firstpartmain}%
    \refstepcounter{part}%
    \ifPM@hyperref
%    \end{macrocode}
% Pour les appels de la TDM
%    \begin{macrocode}
      \hypertarget{part\thepart}{}%
%    \end{macrocode}
% Pour les bookmarks
%    \begin{macrocode}
      \hypertarget{part.\thepart}{}%
      \stepcounter{PM@outnumber}%
      \begingroup
        \let\\\space
        \pdfstringdef{\PM@titleresult}{#2}%
        \protected@write\@outlinefile{}{%
          \protect\BOOKMARK[0][-]{part.\thepart}
                           {\PM@titleresult}%
                           {}%
          \@percentchar\space\thePM@outnumber
        }%
      \endgroup
    \fi
%    \end{macrocode}
% Écriture du titre de partie dans la TdM. On modifie la définition
% de |\\| pour en faire une espace.
%    \begin{macrocode}
    \begingroup
      \let\\\space
      \addtocontents{toc}{%
        \protect\parttoc{\the\c@part}
        {#2}
        {\the\c@page}%
      }%
    \endgroup
%    \end{macrocode}
% Écriture du titre de partie (avec son numéro en lettre).
%    \begin{macrocode}
    \vspace*{5mm}
    \textcolor{PM@parthead@color}{\PM@PartHeadFont\PM@Letter{\c@part} partie}
    \par\vspace{5mm}
    {%
      \PM@PartTitleFont
      \textcolor{PM@parttitle@color}{\MakeUppercase{#2}}
      \par
    }%
    \cleardoublepage
  \else
    \ClassError{Prepamath}{Les parties ne peuvent se trouver que dans
      la partie mainmatter}{}
  \fi
}
%    \end{macrocode}
% Titre du chapitre en cours
%    \begin{macrocode}
\gdef\PM@chapter{}
%    \end{macrocode}
% Minitoc par chapitre (gestion des fichiers .toc<n>)
%    \begin{macrocode}
\newwrite\tf@chaptertoc
\def\@startchaptertoc#1{%
  \begingroup
    \makeatletter
    \immediate\closeout \tf@chaptertoc
    \let\tdmnl\newline
    \@input{\jobname.toc#1}%
    \immediate\openout \tf@chaptertoc \jobname.toc#1\relax
    \@nobreakfalse
  \endgroup
}
%    \end{macrocode}
% Composition du chapitre (titre et minitoc).
% \begin{itemize}
% \item |#1| liste des onglets ;
% \item |#2| titre de chapitre
% \end{itemize}
%    \begin{macrocode}
\newcommand*\chapter[2][\PM@thumbdefault]{%
  \global\PM@specialfalse
  \ifmainmatter
    \cleardoublepage
    \global\PM@introfalse
    \gdef\PM@chapter{#2}%
    \pagestyle{chaptermain}%
    \thispagestyle{firstchaptermain}%
    \refstepcounter{chapter}%
    \ifPM@hyperref
      \ifappendix
%    \end{macrocode}
% Pour les appels à la TDM
%    \begin{macrocode}
        \hypertarget{appendix\thechapter}{}%
%    \end{macrocode}
% Pour les bookmarks. Dans les annexes, il n'y a pas de parties
%    \begin{macrocode}
        \hypertarget{appendix.\thechapter}{}%
        \stepcounter{PM@outnumber}%
        \begingroup
          \let\\\space
          \pdfstringdef{\PM@titleresult}{#2}%
          \protected@write\@outlinefile{}{%
            \protect\BOOKMARK[1][-]{appendix.\thechapter}%
                             {\PM@titleresult}%
                             {}%
            \@percentchar\space\thePM@outnumber
          }%
        \endgroup
      \else
%    \end{macrocode}
% Pour les appels à la TDM
%    \begin{macrocode}
        \hypertarget{chapter\thechapter}{}%
%    \end{macrocode}
% Pour les bookmarks. On est ici obligé de vérifier l'existence d'une
% partie englobante.
%    \begin{macrocode}
        \stepcounter{PM@outnumber}%
        \ifnum\c@part = 0
          \hypertarget{chapter.\thechapter}{}%
          \begingroup
            \let\\\space
            \pdfstringdef{\PM@titleresult}{#2}%
            \protected@write\@outlinefile{}{%
              \protect\BOOKMARK[1][-]{chapter.\thechapter}%
                               {\PM@titleresult}%
                               {}%
              \@percentchar\space\thePM@outnumber
            }%
          \endgroup
        \else
          \hypertarget{chapter.\the\c@part.\thechapter}{}%
          \begingroup
            \let\\\space
            \pdfstringdef{\PM@titleresult}{#2}%
            \protected@write\@outlinefile{}{%
              \protect\BOOKMARK[1][-]{chapter.\the\c@part.\thechapter}%
                               {\PM@titleresult}%
                               {part.\the\c@part}%
              \@percentchar\space\thePM@outnumber
            }%
          \endgroup
        \fi
      \fi
      \PM@anchor
    \fi
%    \end{macrocode}
% On initialise le compteur d'onglet ainsi que les couleurs qui vont
% avec.
%    \begin{macrocode}
    \PM@thumbcurr \@ne
    \expandafter\PM@getthumb#1,\@nil,%
    \edef\PM@tmp{\csname PM@thumbcolor\the\PM@thumbcurr\endcsname}%
    \edef\PM@thumb@dcolor{D\PM@tmp}%
    \edef\PM@thumb@mcolor{M\PM@tmp}%
    \edef\PM@thumb@lcolor{L\PM@tmp}%
%    \end{macrocode}
% Le nom de la structure actuelle est le nom de l'onglet en
% cours. C'est utile pour les listes d'objets NathanLive.
%    \begin{macrocode}
    \protected@edef\PM@CurrStruct{\csname PM@thumb\the\PM@thumbcurr\endcsname}%
    \protected@edef\PM@CurrStruct{\PM@CurrStruct}%
    \PM@SetWarningLike
%    \end{macrocode}
% On place un éventuel bookmark pour l'onglet. Il faut alors
% distinguer si on est dans les annexes et, sinon, s'il y a des
% parties ou non.
%    \begin{macrocode}
    \ifPM@hyperref
      \ifappendix
        \hypertarget{thumb.\thechapter.\the\PM@thumbcurr}{}%
        \begingroup
          \let\\\space
          \pdfstringdef{\PM@titleresult}{\csname PM@thumb\the\PM@thumbcurr\endcsname}%
          \protected@write\@outlinefile{}{%
            \protect\BOOKMARK[2][-]{thumb.\thechapter.\the\PM@thumbcurr}%
                             {\PM@titleresult}%
                             {appendix.\thechapter}%
            \@percentchar\space\thePM@outnumber
          }%
        \endgroup
      \else
        \ifnum\thepart = 0
          \hypertarget{thumb.\thechapter.\the\PM@thumbcurr}{}%
          \begingroup
            \let\\\space
            \pdfstringdef{\PM@titleresult}{\csname PM@thumb\the\PM@thumbcurr\endcsname}%
            \protected@write\@outlinefile{}{%
              \protect\BOOKMARK[2][-]{thumb.\thechapter.\the\PM@thumbcurr}%
                               {\PM@titleresult}%
                               {chapter.\thechapter}%
              \@percentchar\space\thePM@outnumber
            }%
          \endgroup
        \else
          \hypertarget{thumb.\thepart.\thechapter.\the\PM@thumbcurr}{}%
          \begingroup
            \let\\\space
            \pdfstringdef{\PM@titleresult}{\csname PM@thumb\the\PM@thumbcurr\endcsname}%
            \protected@write\@outlinefile{}{%
              \protect\BOOKMARK[2][-]{thumb.\thepart.\thechapter.\the\PM@thumbcurr}%
                               {\PM@titleresult}%
                               {chapter.\thepart.\thechapter}%
              \@percentchar\space\thePM@outnumber
            }%
          \endgroup
        \fi
      \fi
    \fi
%    \end{macrocode}
% Écriture du titre du chapitre dans la TdM. On modifie la définition
% de |\\| pour en faire une espace. La façon de présenter les
% chapitres dans la TdM dépend également du fait d'être dans un
% chapitre ou une annexe.
%    \begin{macrocode}
    \begingroup
      \let\\\space
      \ifappendix
        \write\@auxout{\global\advance\PM@nbappendix 1}%
        \addtocontents{toc}{%
          \protect\appendixtoc{\the\c@chapter}
                              {#2}
                              {\the\c@page}%
        }
      \else
        \addtocontents{toc}{%
          \protect\chaptertoc{\the\c@chapter}
                             {#2}
                             {\the\c@page}%
        }
      \fi
    \endgroup
%    \end{macrocode}
% Composition du titre du chapitre. On commence par placer le titre
% dans une boîte afin de connaître sa hauteur.
%    \begin{macrocode}
    \savebox{\PM@box}{%
      \PM@ChapterFont
      \parbox[b]{8.5cm}{\raggedright #2}%
    }%
%    \end{macrocode}
% On place alors un rectangle coloré à gauche du titre.
%    \begin{macrocode}
    \psframe[linewidth=0.5pt, linecolor=\PM@thumb@dcolor,
      fillstyle=solid, fillcolor=\PM@thumb@dcolor]
      (0,0)(4.5mm,\ht\PM@box)%
%    \end{macrocode}
% Le rectangle précédent avait, pour \TeX{}, une largeur nulle, on corrige.
%    \begin{macrocode}
    \kern4.5mm
%    \end{macrocode}
% Filet vertical sur toute la hauteur du titre du chapitre et de la
% mini TdM.
%    \begin{macrocode}
    {{\color{\PM@thumb@dcolor}\vrule width1pt}}
%    \end{macrocode}
% Après cela, on laisse une marge de 2\,mm et on compose
% successivement le titre, le cartouche \og Plan du chapitre \fg{} et
% la mini TdM, tout cela dans une colonne de 9\,cm.
%    \begin{macrocode}
    \kern2mm
    \minipage[t]{9cm}%
      \usebox{\PM@box}\par\vspace{4mm}
      \psframebox[cornersize=absolute, linearc=1mm,
          linestyle=none, fillstyle=solid,
          fillcolor=\PM@thumb@dcolor]
        {%
          \PM@MiniTocTitleFont
%    \end{macrocode}
% Le texte du cartouche dépendra du fait d'être en chapitre ou en annexe.
%    \begin{macrocode}
          \textcolor{white}{Plan \PM@planchapapp}%
        }\par\vspace{3mm}
      \@startchaptertoc{\thechapter}%
      \vspace*{-12pt}
    \endminipage
    \par\addvspace{\bigskipamount}
  \else
%    \end{macrocode}
% Si on n'est pas en mainmatter, les choses sont beaucoup plus simple
% : il n'y a pas de mini-TdM et le titre du chapitre est géré par
% l'en-tête.
%    \begin{macrocode}
    \clearpage
%    \end{macrocode}
% En revanche, il faut quand même un mécanisme de |\PM@CurrStruct| où
% le numéro de chapitre va être mis à zéro. Pour faire la
% disctinction, on va mettre |\PM@CurrStruct| à vide.
%    \begin{macrocode}
    \gdef\PM@CurrStruct{}%
    \global\PM@introfalse
    \gdef\PM@chapter{#2}%
    \pagestyle{chapternomain}%
    \thispagestyle{firstchapternomain}%
    \vspace*{1cm}
  \fi
  \@ifnextchar\thema{\PM@ThemaAfterChaptertrue}{\PM@chaptertocthumb}%
}
%    \end{macrocode}
% L'introduction de la commande |\thema| dans la version 2.2 demande à
% la commande |\chapter| de savoir si une telle commande la suit
% immédiatement puisqu'alors l'écriture du premier onglet dans la TdM
% sera mal placé (on veut le thème avant le premier onglet.
%
% Le principe est donc de retarder l'écriture de cet onglet dans la
% TdM et d'examiner d'abord ce qui suit immédiatement. Si c'est
% |\thema|, ce sera à cette macro de se charger d'écrire la TdM dans
% le bon ordre sinon |\chapter| écrit elle-même l'onglet dans la TdM.
%
% Pour indiquer à la commande |\thema| qui suit de se charger de
% l'écriture de l'onglet dans la TdM, on se sert du booléen
% |\ifPM@ThemaAfterChapter|.
%    \begin{macrocode}
\newif\ifPM@ThemaAfterChapter
\newcommand\PM@chaptertocthumb{%
  \begingroup
    \let\\\space
    \ifmainmatter
      \ifPM@hyperref
        \addtocontents{toc}{%
          \protect\thumbtoc
          {anchor\theanchor}
          {%
            {\PM@thumb@dcolor}\csname PM@thumb1\endcsname
          }
          {\the\c@page}%
        }%
      \else
        \addtocontents{toc}{%
          \protect\thumbtoc
          {}
          {%
            {\PM@thumb@dcolor}\csname PM@thumb1\endcsname
          }
          {\the\c@page}%
        }%
      \fi
    \fi
  \endgroup
}
%    \end{macrocode}
% La commande |\chapintro| réalise presque la même chose que
% |\chapter|. Pour l'instant, elle reste dans les versions 2.0 et
% supérieure de la classe en attendant de savoir si elle est vraiment
% nécessaire.
%    \begin{macrocode}
\newcommand*\chapintro[2][\PM@thumbdefault]{%
  \ifmainmatter
    \cleardoublepage
    \global\PM@introtrue
    \gdef\PM@chapter{#2}%
    \pagestyle{introchapter}%
    \thispagestyle{firstintrochapter}%
    \PM@thumbcurr \@ne
    \expandafter\PM@getthumb#1,\@nil,%
    \edef\PM@tmp{\csname PM@thumbcolor\the\PM@thumbcurr\endcsname}%
    \edef\PM@thumb@dcolor{D\PM@tmp}%
    \edef\PM@thumb@mcolor{M\PM@tmp}%
    \edef\PM@thumb@lcolor{L\PM@tmp}%
    \protected@edef\PM@CurrStruct{\csname PM@thumb\the\PM@thumbcurr\endcsname}%
    \protected@edef\PM@CurrStruct{\PM@CurrStruct}%
    \PM@SetWarningLike
    \begingroup
      \let\\\space
      \addtocontents{toc}{%
        \protect\chaptertocintro{}
                               {#2}
                               {\the\c@page}%
      }
    \endgroup
    \savebox{\PM@box}{%
      \PM@ChapterFont
      \parbox[b]{8.5cm}{\raggedright #2}%
    }%
    \psframe[linewidth=0.5pt, linecolor=\PM@thumb@dcolor,
      fillstyle=solid, fillcolor=\PM@thumb@dcolor]
      (0,0)(4.5mm,\ht\PM@box)%
    \kern4.5mm
    {{\color{\PM@thumb@dcolor}\vrule width1pt}}
    \kern2mm
    \minipage[t]{9cm}%
      \usebox{\PM@box}\par\vspace{4mm}
      \psframebox[cornersize=absolute, linearc=1mm,
          linestyle=none, fillstyle=solid,
          fillcolor=\PM@thumb@dcolor]
        {%
          \PM@MiniTocTitleFont
          \textcolor{white}{Plan \PM@planchapapp}%
        }\par\vspace{3mm}
      \@startchaptertoc{\thechapter}%
      \vspace*{-12pt}
    \endminipage
    \par\addvspace{\bigskipamount}
  \else
    \par
  \fi
  \@ifnextchar\thema{\PM@ThemaAfterChaptertrue}{\PM@chaptertocthumb}%
}
%    \end{macrocode}
% |\simplechapter| fonctionne comme chapter mais il n'y a plus de
% gestion des onglets et il n'y a pas de mini table des matières. La
% maquette n'est pas très clair sur la couleur à utiliser. On prendra
% le rouge par défaut et on garde un argument optionnel pour la
% modifier.
%    \begin{macrocode}
\newcommand*\simplechapter[2][R]{%
  \global\PM@specialfalse
%    \end{macrocode}
% On initialise quand même la gestion des onglets même s'il n'y en a
% pas.
%    \begin{macrocode}
  \global\PM@thumbcurr\@ne 
  \edef\PM@thumb@dcolor{D#1}%
  \edef\PM@thumb@mcolor{M#1}%
  \edef\PM@thumb@lcolor{L#1}%
%    \end{macrocode}
% Le nom de la structure actuelle est le nom de l'onglet en
% cours. C'est utile pour les listes d'objets NathanLive.
%    \begin{macrocode}
  \protected@edef\PM@CurrStruct{\csname PM@thumb\the\PM@thumbcurr\endcsname}%
  \protected@edef\PM@CurrStruct{\PM@CurrStruct}%
  \ifmainmatter
    \cleardoublepage
    \global\PM@introfalse
    \gdef\PM@chapter{#2}%
    \pagestyle{simplechaptermain}%
    \thispagestyle{firstsimplechaptermain}%
    \refstepcounter{chapter}%
    \ifPM@hyperref
      \ifappendix
%    \end{macrocode}
% Pour les appels à la TDM
%    \begin{macrocode}
        \hypertarget{appendix\thechapter}{}%
%    \end{macrocode}
% Pour les bookmarks. Dans les annexes, il n'y a pas de parties
%    \begin{macrocode}
        \hypertarget{appendix.\thechapter}{}%
        \stepcounter{PM@outnumber}%
        \begingroup
          \let\\\space
          \pdfstringdef{\PM@titleresult}{#2}%
          \protected@write\@outlinefile{}{%
            \protect\BOOKMARK[1][-]{appendix.\thechapter}%
                             {\PM@titleresult}%
                             {}%
            \@percentchar\space\thePM@outnumber
          }%
        \endgroup
      \else
%    \end{macrocode}
% Pour les appels à la TDM
%    \begin{macrocode}
        \hypertarget{chapter\thechapter}{}%
%    \end{macrocode}
% Pour les bookmarks. On est ici obligé de vérifier l'existence d'une
% partie englobante.
%    \begin{macrocode}
        \stepcounter{PM@outnumber}%
        \ifnum\c@part = 0
          \hypertarget{chapter.\thechapter}{}%
          \begingroup
            \let\\\space
            \pdfstringdef{\PM@titleresult}{#2}%
            \protected@write\@outlinefile{}{%
              \protect\BOOKMARK[1][-]{chapter.\thechapter}%
                               {\PM@titleresult}%
                               {}%
              \@percentchar\space\thePM@outnumber
            }%
          \endgroup
        \else
          \hypertarget{chapter.\the\c@part.\thechapter}{}%
          \begingroup
            \let\\\space
            \pdfstringdef{\PM@titleresult}{#2}%
            \protected@write\@outlinefile{}{%
              \protect\BOOKMARK[1][-]{chapter.\the\c@part.\thechapter}%
                               {\PM@titleresult}%
                               {part.\the\c@part}%
              \@percentchar\space\thePM@outnumber
            }%
          \endgroup
        \fi
      \fi
      \PM@anchor
    \fi
    \PM@SetWarningLike
    \begingroup
      \let\\\space
      \ifappendix
        \write\@auxout{\global\advance\PM@nbappendix 1}%
        \addtocontents{toc}{%
          \protect\appendixtoc{\the\c@chapter}
                              {#2}
                              {\the\c@page}%
        }
      \else
        \addtocontents{toc}{%
          \protect\chaptertoc{\the\c@chapter}
                             {#2}
                             {\the\c@page}%
        }
      \fi
    \endgroup
    \savebox{\PM@box}{%
      \PM@ChapterFont
      \parbox[b]{8.5cm}{\raggedright #2}%
    }%
    \psframe[linewidth=0.5pt, linecolor=\PM@thumb@dcolor,
      fillstyle=solid, fillcolor=\PM@thumb@dcolor]
      (0,0)(4.55mm,\ht\PM@box)%
    \kern6.5mm
    \usebox{\PM@box}
    \par\addvspace{1cm}
  \else
    \clearpage
    \global\PM@introfalse
    \gdef\PM@chapter{#2}%
    \pagestyle{simplechapternomain}%
    \thispagestyle{firstsimplechapternomain}%
    \vspace*{1cm}
  \fi
}
%    \end{macrocode}
% |\devoirsynthese| regroupe en une seule commande les anciennes
% macros |\brevetblanc| et |\bacblanc|. Elle permet aussi de réaliser
% des devoirs de synthèse.
%    \begin{macrocode}
\newcommand*\devoirsynthese[3][\PM@specialthumbdefault]{%
%    \end{macrocode}
% \begin{itemize}
% \item |#1| liste d'onglets ;
% \item |#2| type de chapitre spécial (Brevet blanc, Bac blanc ou
%   autre)
% \item |#3| titre de chapitre (facultatif)
% \end{itemize}
%    \begin{macrocode}
  \ifmainmatter
    \cleardoublepage
    \gdef\PM@chapter{#3}%
    \ifx\PM@chapter\empty
      \gdef\PM@chapter{#2}%
    \fi
%    \end{macrocode}
% Booléen pour l'affichage des onglets
%    \begin{macrocode}
    \global\PM@specialtrue
    \pagestyle{specialchapter}%
%    \end{macrocode}
% Ajout d'une macro générale pour les en-têtes
%    \begin{macrocode}
    \gdef\PM@SpecialTitle{#2}%
    \thispagestyle{firstspecialchapter}%
    \refstepcounter{chapter}%
    \ifPM@hyperref
      \ifappendix
%    \end{macrocode}
% Pour les appels à la TDM
%    \begin{macrocode}
        \hypertarget{appendix\thechapter}{}%
%    \end{macrocode}
% Pour les appels à la TDM
%    \begin{macrocode}
        \hypertarget{chapter\thechapter}{}%
%    \end{macrocode}
% Pour les bookmarks. Dans les annexes, il n'y a pas de parties
%    \begin{macrocode}
        \hypertarget{appendix.\thechapter}{}%
        \stepcounter{PM@outnumber}%
        \begingroup
          \let\\\space
          \pdfstringdef{\PM@titleresult}{#2}%
          \protected@write\@outlinefile{}{%
            \protect\BOOKMARK[1][-]{appendix.\thechapter}%
                             {\PM@titleresult}%
                             {}%
            \@percentchar\space\thePM@outnumber
          }%
        \endgroup
      \else
%    \end{macrocode}
% Pour les bookmarks. On est ici obligé de vérifier l'existence d'une
% partie englobante.
%    \begin{macrocode}
        \stepcounter{PM@outnumber}%
        \ifnum\c@part = 0
          \hypertarget{chapter.\thechapter}{}%
          \begingroup
            \let\\\space
            \pdfstringdef{\PM@titleresult}{#2}%
            \protected@write\@outlinefile{}{%
              \protect\BOOKMARK[1][-]{chapter.\thechapter}%
                               {\PM@titleresult}%
                               {}%
              \@percentchar\space\thePM@outnumber
            }%
          \endgroup
        \else
          \hypertarget{chapter.\the\c@part.\thechapter}{}%
          \begingroup
            \let\\\space
            \pdfstringdef{\PM@titleresult}{#2}%
            \protected@write\@outlinefile{}{%
              \protect\BOOKMARK[1][-]{chapter.\the\c@part.\thechapter}%
                               {\PM@titleresult}%
                               {part.\the\c@part}%
              \@percentchar\space\thePM@outnumber
            }%
          \endgroup
        \fi
      \fi
      \PM@anchor
    \fi
    \PM@thumbcurr \@ne
    \expandafter\PM@getthumb#1,\@nil,%
    \edef\PM@tmp{\csname PM@thumbcolor\the\PM@thumbcurr\endcsname}%
    \edef\PM@thumb@dcolor{D\PM@tmp}%
    \edef\PM@thumb@mcolor{M\PM@tmp}%
    \edef\PM@thumb@lcolor{L\PM@tmp}%
%    \end{macrocode}
% Le nom de la structure actuelle est le nom de l'onglet en
% cours. C'est utile pour les listes d'objets NathanLive.
%    \begin{macrocode}
    \protected@edef\PM@CurrStruct{\csname PM@thumb\the\PM@thumbcurr\endcsname}%
    \protected@edef\PM@CurrStruct{\PM@CurrStruct}%
%    \end{macrocode}
% On place un éventuel bookmark pour l'onglet. Il faut alors
% distinguer si on est dans les annexes et, sinon, s'il y a des
% parties ou non.
%    \begin{macrocode}
    \ifPM@hyperref
      \ifappendix
        \hypertarget{thumb.\thechapter.\the\PM@thumbcurr}{}%
        \begingroup
          \let\\\space
          \pdfstringdef{\PM@titleresult}{\csname PM@thumb\the\PM@thumbcurr\endcsname}%
          \protected@write\@outlinefile{}{%
            \protect\BOOKMARK[2][-]{thumb.\thechapter.\the\PM@thumbcurr}%
                             {\PM@titleresult}%
                             {appendix.\thechapter}%
            \@percentchar\space\thePM@outnumber
          }%
        \endgroup
      \else
        \ifnum\thepart = 0
          \hypertarget{thumb.\thechapter.\the\PM@thumbcurr}{}%
          \begingroup
            \let\\\space
            \pdfstringdef{\PM@titleresult}{\csname PM@thumb\the\PM@thumbcurr\endcsname}%
            \protected@write\@outlinefile{}{%
              \protect\BOOKMARK[2][-]{thumb.\thechapter.\the\PM@thumbcurr}%
                               {\PM@titleresult}%
                               {chapter.\thechapter}%
              \@percentchar\space\thePM@outnumber
            }%
          \endgroup
        \else
          \hypertarget{thumb.\thepart.\thechapter.\the\PM@thumbcurr}{}%
          \begingroup
            \let\\\space
            \pdfstringdef{\PM@titleresult}{\csname PM@thumb\the\PM@thumbcurr\endcsname}%
            \protected@write\@outlinefile{}{%
              \protect\BOOKMARK[2][-]{thumb.\thepart.\thechapter.\the\PM@thumbcurr}%
                               {\PM@titleresult}%
                               {chapter.\thepart.\thechapter}%
              \@percentchar\space\thePM@outnumber
            }%
          \endgroup
        \fi
      \fi
    \fi
    \begingroup
      \let\\\space
      \ifappendix
        \write\@auxout{\global\advance\PM@nbappendix 1}%
        \addtocontents{toc}{%
          \protect\appendixtoc{\the\c@chapter}
                             {#2}
                             {\the\c@page}%
        }
      \else
        \addtocontents{toc}{%
          \protect\chaptertoc{\the\c@chapter}
                             {#2}
                             {\the\c@page}%
        }
      \fi
    \endgroup
%    \end{macrocode}
% Titre du chapitre dans une boîte pour mesurer sa hauteur.
%    \begin{macrocode}
    \savebox{\PM@box}{%
      \PM@SpecialChapterFont
      \parbox[b]{8.5cm}{\raggedright #3}%
    }%
    \par\vspace{10mm}
    \ifdim\ht\PM@box=\z@
      \kern6.9mm~
    \else
      \psframe[linewidth=0.5pt, linecolor=\PM@thumb@dcolor,
        fillstyle=solid, fillcolor=\PM@thumb@dcolor]
        (0,0)(4.5mm,\ht\PM@box)%
      \kern6.5mm
      \minipage[t]{9cm}%
        \usebox{\PM@box}\par\vspace{4mm}
      \endminipage
    \fi
    \PM@SetWarningLike
    \par\addvspace{48pt}
  \else
    \ClassError{prepamath}{La commande \string\devoirsynthese doit être
      appelee dans la partie \string\mainmatter}{Vous avez oublie de
      specifier \string\mainmatter ou la commande \string\devoirsynthese
      suit un \string\frontmatter ou un \string\backmatter ce qui est
      interdit.}%
  \fi
  \@ifnextchar\thema{\PM@ThemaAfterChaptertrue}{\PM@chaptertocthumb}%
}
%    \end{macrocode}
% Les onglets (n'existe que dans les chapitres et annexes de la partie
% mainmatter).
%    \begin{macrocode}
\newcommand*\thumb{%
  \ifmainmatter
    \clearpage
    \advance\PM@thumbcurr \@ne
    \ifnum\PM@thumbcurr > \PM@thumbmax
      \ClassError{prepamath}{Il n'y a que \the\PM@thumbmax\space onglets
        dans le chapitre courant}{La commande \string\thumb est appelee
        trop de fois dans ce chapitre.}%
    \else
%    \end{macrocode}
% On fixe les couleurs pour l'onglet en cours. \emph{A priori} on n'a
% besoin que de la couleur foncée et de la couleur claire mais on va
% aussi définir la couleur moyenne.
%    \begin{macrocode}
      \edef\PM@tmp{\csname PM@thumbcolor\the\PM@thumbcurr\endcsname}%
      \edef\PM@thumb@dcolor{D\PM@tmp}%
      \edef\PM@thumb@mcolor{M\PM@tmp}%
      \edef\PM@thumb@lcolor{L\PM@tmp}%
%    \end{macrocode}
% Le nom de la structure actuelle est le nom de l'onglet en
% cours. C'est utile pour les listes d'objets NathanLive.
%    \begin{macrocode}
      \protected@edef\PM@CurrStruct{\csname PM@thumb\the\PM@thumbcurr\endcsname}%
      \protected@edef\PM@CurrStruct{\PM@CurrStruct}%
      \PM@SetWarningLike
%    \end{macrocode}
% En cas de liens hypertextes, on pose une ancre et un lien pour les
% bookmarks.
%    \begin{macrocode}
      \ifPM@hyperref
        \PM@anchor
%    \end{macrocode}
% Pour les appels à la TDM
%    \begin{macrocode}
        \hypertarget{thumb.\the\c@part.}{}%
%    \end{macrocode}
% Pour les bookmarks. Dans les annexes, il n'y a pas de parties
%    \begin{macrocode}
        \stepcounter{PM@outnumber}%
        \ifappendix
          \hypertarget{thumb.\thechapter.\the\PM@thumbcurr}{}%
          \begingroup
            \let\\\space
            \pdfstringdef{\PM@titleresult}{\csname PM@thumb\the\PM@thumbcurr\endcsname}%
            \protected@write\@outlinefile{}{%
              \protect\BOOKMARK[2][-]{thumb.\thechapter.\the\PM@thumbcurr}%
                               {\PM@titleresult}%
                               {appendix.\thechapter}%
              \@percentchar\space\thePM@outnumber
            }%
          \endgroup
        \else
          \ifnum\thepart = 0
            \hypertarget{thumb.\thechapter.\the\PM@thumbcurr}{}%
            \begingroup
              \let\\\space
              \pdfstringdef{\PM@titleresult}{\csname PM@thumb\the\PM@thumbcurr\endcsname}%
              \protected@write\@outlinefile{}{%
                \protect\BOOKMARK[2][-]{thumb.\thechapter.\the\PM@thumbcurr}%
                                 {\PM@titleresult}%
                                 {chapter.\thechapter}%
                \@percentchar\space\thePM@outnumber
              }%
            \endgroup
          \else
            \hypertarget{thumb.\thepart.\thechapter.\the\PM@thumbcurr}{}%
            \begingroup
              \let\\\space
              \pdfstringdef{\PM@titleresult}{\csname PM@thumb\the\PM@thumbcurr\endcsname}%
              \protected@write\@outlinefile{}{%
                \protect\BOOKMARK[2][-]{thumb.\thepart.\thechapter.\the\PM@thumbcurr}%
                                 {\PM@titleresult}%
                                 {chapter.\thepart.\thechapter}%
                \@percentchar\space\thePM@outnumber
              }%
            \endgroup
          \fi
        \fi
      \fi
      \begingroup
      \let\\\space
      \ifPM@special
%    \end{macrocode}
% Onglet dans la TDM pour le bac blanc. Il n'y a pas de différence
% pour l'instant mais on ne sait jamais.
%    \begin{macrocode}
        \ifPM@hyperref
          \addtocontents{toc}{%
            \protect\thumbtoc
            {anchor\theanchor}
            {%
              {\PM@thumb@dcolor}%
              \csname PM@thumb\the\PM@thumbcurr\endcsname
            }
            {\the\c@page}%
          }%
        \else
          \addtocontents{toc}{%
            \protect\thumbtoc
            {}
            {%
              {\PM@thumb@dcolor}%
              \csname PM@thumb\the\PM@thumbcurr\endcsname
            }
            {\the\c@page}%
          }%
        \fi
      \else
%    \end{macrocode}
% Onglet dans la TDM pour les autres chapitres.
%    \begin{macrocode}
        \ifPM@hyperref
          \addtocontents{toc}{%
            \protect\thumbtoc
            {anchor\theanchor}
            {%
              {\PM@thumb@dcolor}%
              \csname PM@thumb\the\PM@thumbcurr\endcsname
            }
            {\the\c@page}%
          }%
        \else
          \addtocontents{toc}{%
            \protect\thumbtoc
            {}
            {%
              {\PM@thumb@dcolor}%
              \csname PM@thumb\the\PM@thumbcurr\endcsname
            }
            {\the\c@page}%
          }%
        \fi
      \fi
      \endgroup
    \fi
  \else
    \ClassWarning{prepamath}{La commande \string\thumb\space n'a
      aucune action en dehors de la partie mainmatter.}
  \fi
}
%    \end{macrocode}
% Affichage d'un onglet dans le corps de texte. Normalement ce n'est
% plus jamais exécuté mais on garde quand même la macro au cas où.
%    \begin{macrocode}
\newcommand*\PM@displaythumb{%
  \textcolor{PM@section@color}
            {\PM@DisplayThumbFont\csname PM@thumb\the\PM@thumbcurr\endcsname}
  \par\vspace{\medskipamount}
}
%    \end{macrocode}
% Uniquement pour le bac blanc \emph{a priori} (et même uniquement
% pour le sujet du bac blanc sans doute)
%    \begin{macrocode}
\newcommand*\subthumb[1]{%
  \par
  \textcolor{PM@section@color}
            {\PM@DisplaySubThumbFont #1}
  \par\vspace{\medskipamount}  
}
%    \end{macrocode}
% À partir de la version 2.2, il est possible d'avoir des thèmes.
%    \begin{macrocode}
\newcommand*\thema[1]{%
  \PM@ManyThema#1,\@nil
  \par\addvspace{\PM@SkipAboveThema}\goodbreak
  \ifPM@hyperref
    \PM@anchor
  \fi
  {\PM@ThemaFont \PM@ThemaTitle #1}%
%    \end{macrocode}
% Si la commande |\thema| suit immédiatement la commande |\chapter|,
% c'est à elle de s'occuper de l'écriture de l'onglet dans la TdM
% (après l'écriture du thème dans la TdM).
%    \begin{macrocode}
  \begingroup
    \let\\\space
    \ifPM@hyperref
      \addtocontents{toc}{%
        \protect\thematoc
          {anchor\theanchor}
          {{\PM@thematoc@color}#1}%
          {\the\c@page}%
      }%
    \else
      \addtocontents{toc}{%
        \protect\thematoc
          {}
          {{\PM@thematoc@color}#1}%
          {\the\c@page}%
      }%
    \fi
  \endgroup
  \ifPM@ThemaAfterChapter
    \begingroup
      \let\\\space
      \ifmainmatter
        \ifPM@hyperref
          \addtocontents{toc}{%
            \protect\thumbtoc
            {anchor\theanchor}
            {%
              {\PM@thumb@dcolor}\csname PM@thumb1\endcsname
            }{\the\c@page}%
          }%
        \else
          \addtocontents{toc}{%
            \protect\thumbtoc
            {}
            {%
              {\PM@thumb@dcolor}\csname PM@thumb1\endcsname
            }{\the\c@page}%
          }%
        \fi
      \fi
    \endgroup
  \fi
  \PM@ThemaAfterChapterfalse
  \par\nobreak\addvspace{\PM@SkipBelowThema}
}
\def\PM@ManyThema#1,#2\@nil{%
  \ifx\relax#2\relax
    \def\PM@ThemaTitle{Th\`eme : }%
  \else
    \def\PM@ThemaTitle{Th\`emes : }%
  \fi
}
%    \end{macrocode}
% |\section| (même commande pour les parties front/main/backmatter)
%    \begin{macrocode}
\newlength{\PM@NumberSectionWidth}
\setlength{\PM@NumberSectionWidth}{5mm}
\newcommand*\PM@StrutSection{%
  \vrule width\z@ height 9\p@ depth\z@\relax
}
\newcommand*\section[1]{%
  \par\addvspace{\PM@SkipAboveSection}\goodbreak
  \ifmainmatter
    \refstepcounter{section}%
    \label{section\thechapter.\thesection}{}%
    \ifPM@hyperref
%    \end{macrocode}
% Pour les appels à la TDM
%    \begin{macrocode}
      \hypertarget{section\thechapter.\thesection}{}%
%    \end{macrocode}
% Pour les bookmarks.
%
% On est ici obligé de vérifier si on est dans des annexes et, si oui,
% s'il y a une partie englobante.
%    \begin{macrocode}
      \stepcounter{PM@outnumber}%
      \ifappendix
        \hypertarget{section.\thechapter.\the\PM@thumbcurr.\thesection}{}%
        \begingroup
          \let\\\space
          \pdfstringdef{\PM@titleresult}{#1}%
          \protected@write\@outlinefile{}{%
            \protect\BOOKMARK[3][-]{section.\thechapter.\the\PM@thumbcurr.\thesection}%
                             {\PM@titleresult}%
                             {thumb.\thechapter.\the\PM@thumbcurr}%
            \@percentchar\space\thePM@outnumber
          }%
        \endgroup
      \else
        \ifnum\c@part = 0
          \hypertarget{section.\thechapter.\the\PM@thumbcurr.\thesection}{}%
          \begingroup
            \let\\\space
            \pdfstringdef{\PM@titleresult}{#1}%
            \protected@write\@outlinefile{}{%
              \protect\BOOKMARK[3][-]{section.\thechapter.\the\PM@thumbcurr.\thesection}%
                               {\PM@titleresult}%
                               {thumb.\thechapter.\the\PM@thumbcurr}%
              \@percentchar\space\thePM@outnumber
            }%
          \endgroup
        \else
          \hypertarget{section.\thepart.\thechapter.\the\PM@thumbcurr.\thesection}{}%
          \begingroup
            \let\\\space
            \pdfstringdef{\PM@titleresult}{#1}%
            \protected@write\@outlinefile{}{%
              \protect\BOOKMARK[3][-]{section.\thepart.\thechapter.\the\PM@thumbcurr.\thesection}%
                               {\PM@titleresult}%
                               {thumb.\thepart.\thechapter.\the\PM@thumbcurr}%
              \@percentchar\space\thePM@outnumber
            }%
          \endgroup
        \fi
      \fi
    \fi
    \begin{lrbox}{\PM@box}%
      \psframebox[cornersize=absolute,
        linearc=1mm, linestyle=none,
        fillstyle=solid, framesep=2pt,
        fillcolor=\PM@thumb@dcolor]{%
          \hbox to \PM@NumberSectionWidth{%
            \hss
            \PM@StrutSection
            \PM@SectionNumberFont
            \textcolor{white}{\thesection}%
            \hss
          }%
        }%
        \hspace*{0.5em}%
    \end{lrbox}%
    \hangindent=\wd\PM@box
    \raisebox{1.5\p@}{\usebox{\PM@box}}%
    {\PM@SectionFont#1}%
    \protected@write\tf@chaptertoc
      {\let\label\@gobble \let\index\@gobble \let\glossary\@gobble\let\\\space}%
      {%
        \protect\sectionminitoc
          {section\thechapter.\thesection}%
          {\thesection}%
          {#1}%
      }%
  \else
    {\textcolor{PM@sectionnomain@color}{%
        \PM@FrontSectionFont #1}%
    }%
  \fi
  \par\nobreak\addvspace{\PM@SkipBelowSection}
}
%    \end{macrocode}
% |\subsection| et compagnie
%    \begin{macrocode}
\newcommand*\subsection[1]{%
  \ifmainmatter
    \par\addvspace{\PM@SkipAboveSubSection}\goodbreak
    \refstepcounter{subsection}
    \ifPM@hyperref
      \hypertarget{subsection\thechapter.\thesubsection}{}%
    \fi
    \begin{lrbox}{\PM@box}%
       \psframebox[cornersize=absolute,
        linearc=1mm, linestyle=none, framesep=2pt,
        fillstyle=solid, fillcolor=\PM@thumb@dcolor]{%
          \hbox to\PM@NumberSectionWidth{\hss
            \PM@StrutSection
            \PM@SubSectionNumberFont
            \textcolor{white}{\thesubsection}%
            \hss
          }%
        }%
      \hspace*{0.3em}%
    \end{lrbox}%
    \hangindent \wd\PM@box
    \raisebox{1.5\p@}{\usebox{\PM@box}}%
    {\PM@SubSectionFont\textcolor{\PM@thumb@dcolor}{#1}}%
    \par\nobreak\addvspace{\PM@SkipBelowSubSection}
  \else
    \ClassError{prepamath}{la commande \string\subsection\space
      n'est permise que dans la partie mainmatter}{}%
  \fi
}
\newcommand*\subsubsection[1]{%
  \ifmainmatter
    \par\addvspace{\PM@SkipAboveSubSubSection}\goodbreak
    \refstepcounter{subsubsection}
    \ifPM@hyperref
      \hypertarget{subsubsection\thechapter.\thesubsubsection}{}%
    \fi
    \begin{lrbox}{\PM@box}%
      \PM@SubSubSectionNumberFont
      \textcolor{\PM@thumb@dcolor}{\thesubsubsection~-~}%
    \end{lrbox}%
    \hangindent \wd\PM@box
    \usebox{\PM@box}%
    {\PM@SubSubSectionFont\textcolor{\PM@thumb@dcolor}{#1}}
    \par\nobreak\addvspace{\PM@SkipBelowSubSubSection}
  \else
    \ClassError{prepamath}{la commande \string\subsubsection\space
      n'est permise que dans la partie mainmatter}{}%
  \fi
}
\newcommand*\paragraph[1]{%
  \ifmainmatter
    \par\addvspace{\PM@SkipAboveParagraph}\goodbreak
    \refstepcounter{paragraph}
    \ifPM@hyperref
      \hypertarget{paragraph\thechapter.\theparagraph}{}%
    \fi
    \begin{lrbox}{\PM@box}%
      \PM@ParagraphNumberFont
      \textcolor{\PM@thumb@dcolor}{\theparagraph~-~}%
    \end{lrbox}%
    \hangindent \wd\PM@box
    \usebox{\PM@box}%
    {\PM@ParagraphFont\textcolor{\PM@thumb@dcolor}{#1}}
    \par\nobreak\addvspace{\PM@SkipBelowParagraph}
  \else
    \ClassError{prepamath}{La commande \string\paragraph\space
      n'est permise que dans la partie mainmatter}{}%
  \fi
}
\newcommand*\subparagraph[1]{%
  \ifmainmatter
    \refstepcounter{subparagraph}
    \ifPM@hyperref
      \hypertarget{subparagraph\thechapter.\thesubsparagraph}{}%
    \fi
    \par\addvspace{\PM@SkipAboveSubParagraph}\goodbreak
    \begin{lrbox}{\PM@box}%
      \PM@SubParagraphNumberFont
      \textcolor{\PM@thumb@dcolor}{\thesubparagraph~-~}%
    \end{lrbox}%
    \hangindent \wd\PM@box
    \usebox{\PM@box}%
    {\PM@SubParagraphFont\textcolor{\PM@thumb@dcolor}{#1}}
    \par\nobreak\addvspace{\PM@SkipBelowSubParagraph}
  \else
    \ClassError{prepamath}{la commande \string\subparagraph\space
      n'est permise que dans la partie mainmatter}{}%
  \fi
}
%    \end{macrocode}
% Commandes de sectionnement non numérotée. Je suppose qu'il n'y a pas
% d'entrée dans la TdM.
%    \begin{macrocode}
\newcommand*\sectionnn[1]{%
  \par\addvspace{\PM@SkipAboveSection}%
  \ifmainmatter
    {\PM@SectionFont#1}%
  \else
    {\textcolor{PM@section@color}{%
        \PM@FrontSectionFont #1}%
    }%
  \fi
  \par\nobreak\addvspace{\PM@SkipBelowSection}%
}
\newcommand*\subsectionnn[1]{%
  \ifmainmatter
    \par\addvspace{\PM@SkipAboveSubSection}
    {\PM@SubSectionFont #1}%
    \par\nobreak\addvspace{\PM@SkipBelowSubSection}
  \else
    \ClassError{prepamath}{la commande \string\subsectionnn\space
      n'est permise que dans la partie mainmatter}{}%
  \fi
}
\newcommand*\subsubsectionnn[1]{%
  \ifmainmatter
    \par\addvspace{\PM@SkipAboveSubSubSection}
    {\PM@SubSubSectionFont #1}%
    \par\nobreak\addvspace{\PM@SkipBelowSubSubSection}
  \else
    \ClassError{prepamath}{la commande \string\subsubsectionnn\space
      n'est permise que dans la partie mainmatter}{}%
  \fi
}
\newcommand*\paragraphnn[1]{%
  \ifmainmatter
    \par\addvspace{\PM@SkipAboveParagraph}
    {\PM@ParagraphFont #1}%
    \par\nobreak\addvspace{\PM@SkipBelowParagraph}
  \else
    \ClassError{prepamath}{La commande \string\paragraphnn\space
      n'est permise que dans la partie mainmatter}{}%
  \fi
}
\newcommand*\subparagraphnn[1]{%
  \ifmainmatter
    \par\addvspace{\PM@SkipAboveSubParagraph}
    {\PM@SubParagraphFont #1}%
    \par\nobreak\addvspace{\PM@SkipBelowSubParagraph}
  \else
    \ClassError{prepamath}{la commande \string\subparagraphnn\space
      n'est permise que dans la partie mainmatter}{}%
  \fi
}
%    \end{macrocode}
% \subsubsection{Index}
% On commence par émuler l'extension |makeidx| en créant les
% commandes |\printindex|, |\see| et apparentées. On ne donne que la
% version française des commandes.
%    \begin{macrocode}
\newcommand*\see[2]{\emph{\seename} #1}
\providecommand*\seealso[2]{\emph{\alsoname} #1}
%    \end{macrocode}
% Depuis la version 2.28, il y a la possibilité de compiler avec des
% liens hypertextes. Si on revient à une compilation sans liens
% hypertextes, le fichier |ind| va contenir des commandes |\hyperpage|
% qui vont causer des erreurs de compilation avec comme seule
% possibilité de supprimer le fichier |ind|. On va créer une telle
% commande pour éviter ces erreurs.
%    \begin{macrocode}
\newcommand\printindex{%
  \ifcsname hyperpage\endcsname
  \else
    \def\hyperpage##1{##1}%
  \fi
  \@input@{\jobname.ind}
}
\providecommand\seename{voir}
\providecommand*\alsoname{voir \'egalement}
%    \end{macrocode}
% La version 0.27 introduit la possibilité d'avoir un code après
% l'index. Par défaut, ce code est vide.
%    \begin{macrocode}
\newcommand\postindex{}
%    \end{macrocode}
% Il faut maintenant définir l'environnement |theindex| et les
% commandes d'index effectives.
%    \begin{macrocode}
\newenvironment{theindex}
{%
  \ifappendix
  \else
  \appendix
  \fi
  \let\item\@idxitem
%    \end{macrocode}
% Changement de mise en page (on élargit l'empagement de 1cm à gauche
% et à droite). Il faut redéfinir les commandes de placement des
% repères photographiques.
%    \begin{macrocode}
  \newgeometry{%
    twoside=false,
    left=13mm, right=13mm,
    top= 30mm, bottom=20mm,
    marginparsep=0mm, marginparwidth=0mm,
    hoffset=2.5cm, voffset=1.85cm
  }
  \renewcommand*\PM@shiftoddpage{%
    \setlength{\@tempdima}{-13mm}%
    \setlength{\@tempdimb}{1in+\topmargin+\headheight+\headsep-4.5pt}%
  }
  \renewcommand*\PM@shiftevenpage{%
    \setlength{\@tempdima}{-13mm}%
    \setlength{\@tempdimb}{1in+\topmargin+\headheight+\headsep-4.5pt}%
  }
  \simplechapter{Index}
  \setlength{\columnsep}{18pt}%
  \begin{multicols}{2}
}
{%
  \end{multicols}
  \postindex
  \restoregeometry
}
\newcommand\@idxitem{\par\hangindent 40\p@}
\newcommand\subitem{\@idxitem \hspace*{20\p@}}
\newcommand\subsubitem{\@idxitem \hspace*{30\p@}}
\newcommand\indexspace{}
\newcommand\pfill{%
  \unskip~\dotfill\penalty500
  \strut\nobreak
  \dotfil~\ignorespaces\raggedleft
}
\newcommand\efill{\hfill\nopagebreak}
\newcommand*\dotfil{%
  \leaders\hbox to.6em{\hss .\hss}\hfil
}
\newif\ifscan@allowed
%    \end{macrocode}
% Il faut enfin activer la production d'index avec l'appel de la
% commande |\makeindex|.
%    \begin{macrocode}
\makeindex
%    \end{macrocode}
% \subsection{En-têtes et pieds de page}
% lignes des alignements photographique (option crop)
%    \begin{macrocode}
\newcommand\PM@singleline{%
  \psline(0.2,0)(1.2,0)
  \psline(1,0.2)(1,-0.2)
  \pscircle(1,0){0.2}
}
\newcommand\PM@realpage{%
  \count@ \c@page
  \advance\count@ \PM@shiftpage
  \the\count@
}
\newcommand\PM@crop[2]{%
  \if#1l%
    \if#2t%
%    \end{macrocode}
% lt = left - top
%    \begin{macrocode}
      \rput{180}(\@tempdima,\@tempdimb){%
        \PM@singleline
      }%
      \rput{90}(\@tempdima,\@tempdimb){%
        \PM@singleline
      }%
%    \end{macrocode}
% On place également les indications générales (titre général, date,
% chapitre, folio, page pdf).
%    \begin{macrocode}
      \normalfont \normalcolor
      \rput(0.5\linewidth,\@tempdimb){%
        \rput(0,1.1){\small\PM@title
          \quad---\quad v. \PM@version}
        \rput(0,0.7){\small \PM@date
          \quad---\quad
%    \end{macrocode}
% L'indication de chapitre ne se fera que dans la partie mainmatter,
% lorsque le numéro de chapitre est non nul et s'il ne s'agit pas d'un
% chapitre spécial.
%
% Depuis la version 2.18, les chapitres spéciaux sont numérotés donc
% il n'y a plus de différence de traitement ici. On garde la structure if\ldots
%    \begin{macrocode}
          \ifmainmatter
            \ifnum\c@chapter>\z@
              \ifPM@special
                \PM@chapapp\space\thechapter\space
              \else
                \PM@chapapp\space\thechapter\space
              \fi
            \fi
          \fi
          page \the\c@page
          \quad---\quad \#\PM@realpage}
      }
    \else
%    \end{macrocode}
% lb = left - bottom
%    \begin{macrocode}
      \rput{180}(\@tempdima,\@tempdimb){%
        \PM@singleline
      }%
      \rput{270}(\@tempdima,\@tempdimb){%
        \PM@singleline
      }%
    \fi
  \else
    \if#2t%
%    \end{macrocode}
% rt = right - top
%    \begin{macrocode}
      \rput{0}(\@tempdima,\@tempdimb){%
        \PM@singleline
      }%
      \rput{90}(\@tempdima,\@tempdimb){%
        \PM@singleline
      }%
    \else
%    \end{macrocode}
% rb = right - bottom
%    \begin{macrocode}
      \rput{0}(\@tempdima,\@tempdimb){%
        \PM@singleline
      }%
      \rput{270}(\@tempdima,\@tempdimb){%
        \PM@singleline
      }%
    \fi
  \fi
}
\newcommand*\PM@testcrop{%
  \ifPM@crop
    \begin{pspicture}(0,0)
      \psset{linewidth=0.2pt}
      \PM@crop lt%
      \addtolength{\@tempdima}{\paperwidth}\PM@crop rt%
      \addtolength{\@tempdimb}{-\paperheight}\PM@crop rb%
      \addtolength{\@tempdima}{-\paperwidth}\PM@crop lb%
    \end{pspicture}%
  \fi
}
%    \end{macrocode}
% Calcul des décalages de longueurs pour être au coin supérieur gauche
% de la page physique. Pour l'instant, les décalages sont les mêmes
% pour les pages paires et impaires (mêmes marges extérieures et
% intérieures).
%    \begin{macrocode}
\newcommand*\PM@shiftoddpage{%
    \setlength{\@tempdima}{-23mm}%
    \setlength{\@tempdimb}{1in+\topmargin+\headheight+\headsep-4.5pt}%
}
\newcommand*\PM@shiftevenpage{%
    \setlength{\@tempdima}{-23mm}%
    \setlength{\@tempdimb}{1in+\topmargin+\headheight+\headsep-4.5pt}%
}
%    \end{macrocode}
% Filets d'en-tête et de pied de page (jamais de filets)
%    \begin{macrocode}
\renewcommand{\headrulewidth}{0pt}
\renewcommand{\footrulewidth}{0pt}
%    \end{macrocode}
% Page vide (vide sauf éventuellement les traits d'alignement
% photographique). Pour les rabats, le vide est vraiment vide !
%    \begin{macrocode}
\ifPM@rabat
  \fancypagestyle{empty}{\fancyhf{}}
\else
  \fancypagestyle{empty}{%
    \fancyhf{}%
    \fancyhead[LO]{%
      \PM@shiftoddpage
      \PM@testcrop
    }%
    \fancyhead[LE]{%
      \PM@shiftevenpage
      \PM@testcrop
    }%
  }
\fi
%    \end{macrocode}
% Première page d'une partie mainmatter. En fait c'est comme le style
% empty.
%    \begin{macrocode}
\fancypagestyle{firstpartmain}{%
  \fancyhf{}%
  \fancyhead[LO]{%
    \PM@shiftoddpage
    \PM@testcrop
  }%
  \fancyhead[LE]{%
    \PM@shiftevenpage
    \PM@testcrop
  }%
}
%    \end{macrocode}
% Pages suivante d'une partie mainmatter. Normalement, il ne peut y
% avoir qu'une seule page (vide) après un titre de partie. On garde
% encore un style équivalent à empty.
%    \begin{macrocode}
\fancypagestyle{partmain}{%
  \fancyhf{}%
  \fancyhead[LO]{%
    \PM@shiftoddpage
    \PM@testcrop
  }%
  \fancyhead[LE]{%
    \PM@shiftevenpage
    \PM@testcrop
  }%
}
%    \end{macrocode}
% Première page d'un chapitre frontmatter et backmatter
%    \begin{macrocode}
\fancypagestyle{firstchapternomain}{%
  \fancyhf{}%
%    \end{macrocode}
% Pages impaires.
%    \begin{macrocode}
  \fancyhead[LO]{%
    \PM@shiftoddpage
    \PM@testcrop
    \rput(\@tempdima,\@tempdimb){%
      \rput(\paperwidth,0){%
%    \end{macrocode}
% La nouvelle classe ne fait plus de dégradé à cet endroit.
%    \begin{macrocode}
        \pspolygon[linestyle=none, fillstyle=solid,
          fillcolor=PM@headnomain@color, linearc=5mm]
            (-60mm,5mm)(5mm,5mm)
            (5mm,-30mm)(-61mm,-25mm)
        \rput(-33mm,-15mm){%
          \color{white}%
          \parbox{42mm}{%
            \raggedleft
            \PM@HeadFrontChapterFont \PM@chapter
          }%
        }%
      }%
    }%
  }%
%    \end{macrocode}
% Pages paires
%    \begin{macrocode}
  \fancyhead[LE]{%
    \PM@shiftevenpage
    \PM@testcrop
    \rput(\@tempdima,\@tempdimb){%
%    \end{macrocode}
% La nouvelle classe ne fait plus de dégradé à cet endroit.
%    \begin{macrocode}
      \pspolygon[linestyle=none, fillstyle=solid,
        fillcolor=PM@headnomain@color, linearc=5mm]
        (-0.035\paperwidth,5mm)(60mm,5mm)
        (61mm,-25mm)(-0.035\paperwidth,-30mm)
      \rput(33mm,-15mm){%
        \color{white}%
        \PM@HeadFrontChapterFont
        \parbox{42mm}{\hspace*{0pt}\PM@chapter}%
      }%
    }%
  }%
}
%    \end{macrocode}
% Page suivante d'un chapitre frontmatter ou backmatter
%    \begin{macrocode}
\fancypagestyle{chapternomain}{%
  \fancyhf{}%
  \fancyhead[LO]{%
    \PM@shiftoddpage
    \PM@testcrop
    \rput(\@tempdima,\@tempdimb){%
    }
  }%
  \fancyhead[LE]{%
    \PM@shiftevenpage
    \PM@testcrop
    \rput(\@tempdima,\@tempdimb){%
    }%
  }%
}
%    \end{macrocode}
% Première page d'un chapitre mainmatter
%    \begin{macrocode}
\fancypagestyle{firstchaptermain}{%
  \fancyhf{}%
%    \end{macrocode}
% pages impaires (normalement uniquement)
%    \begin{macrocode}
  \fancyhead[LO]{%
    \PM@shiftoddpage
    \PM@testcrop
    \rput(\@tempdima,\@tempdimb){%
      \rput(\paperwidth,0){%
%    \end{macrocode}
% La nouvelle classe ne fait plus de dégradé à cet endroit.
%    \begin{macrocode}
        \pspolygon[linestyle=none, fillstyle=solid,
          fillcolor=\PM@thumb@dcolor, linearc=5mm]
            (-38mm,5mm)(5mm,5mm)
            (5mm,-40mm)(-40mm,-35mm)
        \rput(-20mm,-17mm){%
          \color{white}%
          \parbox{42mm}{%
            \centering
            \ifPM@special
%    \end{macrocode}
% Affichage dépendant du fait que ce soit un chapitre spécial. Depuis
% la version 2.18, il n'y a plus de différence à ce niveau. Je garde
% l'ancien code en ligne commentée.
%    \begin{macrocode}
%%%              \PM@HeadFrontChapterFont \PM@SpecialTitle
	      \ifPM@intro
		\PM@HeadFrontChapterFont Introduction
	      \else
                \PM@HeadFirstChapterFont \PM@chapapp
                \ifappendix
                  \ifnum\PM@nbappendix>1
                    \ \PM@HeadFirstChapterFont \thechapter
%    \end{macrocode}
% Depuis la version 2.25 on affiche le numéro de page pour les pages
% d'annexe
%    \begin{macrocode}
                    \rput(0mm,-\paperheight){%
                      \psframe[linestyle=none, fillstyle=solid,
                      fillcolor=\PM@thumb@dcolor,framearc=0.2]
                      (13.5mm,25.5mm)(-2.5mm,31.5mm)
                      \rput(0mm,28.5mm){%
                        \PM@FootPageFont
                        \textcolor{white}{\the\c@page}}%
                    }%
                  \fi
                \else
                  \\[-6pt]%
                  \PM@HeadFirstChapterNumberFont \thechapter
                \fi
	      \fi
            \else
	      \ifPM@intro
		\PM@HeadFrontChapterFont Introduction
	      \else
                \PM@HeadFirstChapterFont \PM@chapapp
                \ifappendix
                  \ifnum\PM@nbappendix>1
                    \ \PM@HeadFirstChapterFont \thechapter
                    \rput(0mm,-\paperheight){%
                      \psframe[linestyle=none, fillstyle=solid,
                      fillcolor=\PM@thumb@dcolor,framearc=0.2]
                      (13.5mm,25.5mm)(-2.5mm,31.5mm)
                      \rput(0mm,28.5mm){%
                        \PM@FootPageFont
                        \textcolor{white}{\the\c@page}}%
                    }%
                  \fi
                \else
                  \\[-6pt]%
                  \PM@HeadFirstChapterNumberFont \thechapter
                \fi
	      \fi
            \fi
          }%
        }%
      }%
    }%
  }%
%    \end{macrocode}
% Pages paires (normalement jamais).
%    \begin{macrocode}
  \fancyhead[LE]{%
    \PM@shiftevenpage
    \PM@testcrop
    \rput(\@tempdima,\@tempdimb){%
    }%
  }%
}
%    \end{macrocode}
% Page suivante d'un chapitre mainmatter
%    \begin{macrocode}
\fancypagestyle{chaptermain}{%
  \fancyhf{}%
%    \end{macrocode}
% pages impaires (en-tête, page, onglets)
%    \begin{macrocode}
  \fancyhead[LO]{%
    \PM@shiftevenpage
    \PM@testcrop
    \rput(\@tempdima,\@tempdimb){%
      \expandafter\if\csname PM@@thumb\the\PM@thumbcurr\endcsname*\relax
%    \end{macrocode}
% Dernière nouvelle : les pages sous fond coloré gardent les en-têtes
% des autres type de page d'où les lignes commentées et le test qui ne
% sert visiblement à rien. Je garde quand même ce test au cas où !
%    \begin{macrocode}
       \psframe[linestyle=none, fillstyle=solid,
          fillcolor=\PM@thumb@lcolor]
          (-0.035\paperwidth,5mm)(1.035\paperwidth,-1.025\paperheight)
%    \end{macrocode}
% Même code que dans la partie |\else| (cf. commentaire ci-dessus)
%    \begin{macrocode}
        \def\PM@fillcolor{\PM@thumb@dcolor}%
        \def\PM@textcolor{white}%
        \def\PM@linestyle{none}%
        \def\PM@linecolor{white}%
      \else
        \def\PM@fillcolor{\PM@thumb@dcolor}%
        \def\PM@textcolor{white}%
        \def\PM@linestyle{none}%
        \def\PM@linecolor{white}%
      \fi
%    \end{macrocode}
% Dans les versions de la classe antérieures à la 2.0, il n'y avait
% pas de bandeau en haut de page pour le premier onglet. Ce n'est
% maintenant plus le cas. Le test était |\ifnum\PM@thumbcurr>1| et
% maintenant on fait le test inutile |\ifnum\PM@thumbcurr>0|
%    \begin{macrocode}
      \ifnum\PM@thumbcurr>0
        \pspolygon[linestyle=\PM@linestyle, linecolor=\PM@linecolor,
          fillstyle=solid, fillcolor=\PM@fillcolor]
            (-0.035\paperwidth,5mm)
            (1.035\paperwidth,5mm)
            (1.035\paperwidth,-11mm)
            (-0.035\paperwidth,-11mm)
        \rput[Br](148mm,-7mm){%
          \PM@HeadNextChapterFont
          \ifappendix
            \textcolor{\PM@textcolor}{\MakeUppercase{\PM@shortchapapp}}
            \ifnum\PM@nbappendix>1
              \textcolor{\PM@textcolor}{\thechapter{}}
            \fi
            \textcolor{\PM@textcolor}{:}
            {\let\\\space
              \textcolor{\PM@textcolor}{\MakeUppercase{\PM@chapter}}%
            }
          \else
            \ifPM@special
%    \end{macrocode}
% Depuis la version 2.18, il n'y a plus de différence de traitement
% entre chapitres et chapitres spéciaux au niveau de l'en-tête. Je
% garde la structure if et je commente l'ancienne ligne de code.
%    \begin{macrocode}
%%%              \textcolor{\PM@textcolor}{\PM@chapter}%
              {\let\\\space
                \textcolor{\PM@textcolor}{\MakeUppercase{\PM@chapter}\ \
                  \pscircle*[linecolor=\PM@linecolor](0,0.5ex){2pt}\ \
                  \MakeUppercase{\PM@shortchapapp}. \thechapter
                }%
              }%
            \else
  	      \ifPM@intro
                {\let\\\space
	           \textcolor{\PM@textcolor}{\MakeUppercase{\PM@chapter}}%
                }%
	      \else
                {\let\\\space
                  \textcolor{\PM@textcolor}{\MakeUppercase{\PM@chapter}\ \
                    \pscircle*[linecolor=\PM@linecolor](0,0.5ex){2pt}\ \
                    \MakeUppercase{\PM@shortchapapp}. \thechapter
                  }%
                }%
              \fi
	    \fi
          \fi
        }
      \else
        \ifPM@special
          \pspolygon[linestyle=\PM@linestyle, linecolor=\PM@linecolor,
            fillstyle=solid, fillcolor=\PM@fillcolor]
              (-0.035\paperwidth,5mm)
              (1.035\paperwidth,5mm)
              (1.035\paperwidth,-11mm)
              (-0.035\paperwidth,-11mm)
          \rput[Br](148mm,-7mm){%
            \PM@HeadNextChapterFont
            \textcolor{\PM@textcolor}{\PM@chapter}%
          }
        \else
          \ifPM@intro
            \rput[Br](148mm,-7mm){%
              \PM@HeadNextChapterFont
              \ifappendix
                \textcolor{\PM@textcolor}{\MakeUppercase{\PM@shortchapapp}}
                \ifnum\PM@nbappendix>1
                  \textcolor{\PM@textcolor}{\thechapter}
                \fi
                \textcolor{\PM@textcolor}{:}
                {\let\\\space
                  \textcolor{\PM@textcolor}{\MakeUppercase{\PM@chapter}}%
                }%
              \else
                {\let\\\space
                  \textcolor{PM@head@color}{\MakeUppercase{\PM@chapter}}%
                }%
              \fi
            }
          \else
            \rput[Br](148mm,-7mm){%
              \PM@HeadNextChapterFont
              \ifappendix
                \textcolor{\PM@textcolor}{\MakeUppercase{\PM@shortchapapp}}
                \ifnum\PM@nbappendix>1
                  \textcolor{\PM@textcolor}{\thechapter}
                \fi
                \textcolor{\PM@textcolor}{:}
                {\let\\\space
                  \textcolor{\PM@textcolor}{\MakeUppercase{\PM@chapter}}%
                }%
              \else
                {%
                  \let\\\space
                  \textcolor{PM@head@color}{\MakeUppercase{\PM@chapter}\ \
                    \pscircle*[linecolor=PM@head@color](0,0.5ex){2pt}\ \
                    \MakeUppercase{\PM@shortchapapp}. \thechapter
                  }%
                }%
              \fi
            }
          \fi
        \fi
      \fi
%    \end{macrocode}
% Coin inférieur droit.
%    \begin{macrocode}
      \rput(\paperwidth,-\paperheight){%
        \psframe[linestyle=none, fillstyle=solid,
          fillcolor=\PM@thumb@dcolor, framearc=0.2]
            (-11mm, 6mm)(5mm,12mm)
        \rput(-8.5mm,9mm){%
          \PM@FootPageFont
          \textcolor{white}{\the\c@page}}%
      }%
%    \end{macrocode}
% Plus d'onglet pour la partie bac blanc.
%    \begin{macrocode}
      \ifPM@special\else
        \count@=\PM@thumbmax
%    \end{macrocode}
% |\@tempcnta| est l'onglet suivant (pour tester si l'onglet suivant
% est en couleur ou non => influe sur l'ombre)
%    \begin{macrocode}
        \@tempcnta=\count@
        \advance\@tempcnta \@ne
        \loop
          \ifnum\count@=\PM@thumbcurr
            \def\PM@fillcolor{\PM@thumb@dcolor}%
            \def\PM@textcolor{white}%
            \def\PM@linestyle{none}%
          \else
            \def\PM@fillcolor{white}%
            \def\PM@textcolor{PM@thumbtext@color}%
            \def\PM@linestyle{solid}%
          \fi
          \dimen0=-3.6cm
          \multiply\dimen0 \count@
          \advance\dimen0 -4cm
          \rput(\paperwidth,\dimen0){%
%    \end{macrocode}
% Ombre de l'onglet
%    \begin{macrocode}
            \resetcolorseries[10]{PM@ombre@color}
            \multido{\dx=0pt+0.25\pslinewidth,\dy=0pt+0.075\pslinewidth}{10}{%
%    \end{macrocode}
% Ombre à gauche si l'onglet précède l'onglet coloré (en fait en haut
% à gauche pour faire croire qu'il n'y en a que à gauche !)
%    \begin{macrocode}
              \ifnum\@tempcnta=\PM@thumbcurr
                \rput(-\dx,\dy){%
                  \pspolygon[linearc=0.35, linestyle=solid,
                             linecolor=PM@ombre@color!!+, fillstyle=none]
                    (-1,0.4)(0.5,0)(0.5,4.3)(-1,4.7)
                }
%    \end{macrocode}
% Sinon l'ombre est en bas à gauche.
%    \begin{macrocode}
              \else
                \rput(-\dx,-\dx){%
                  \pspolygon[linearc=0.35, linestyle=solid,
                             linecolor=PM@ombre@color!!+, fillstyle=none]
                    (-1,0.4)(0.5,0)(0.5,4.3)(-1,4.7)
                }
              \fi
            }
%    \end{macrocode}
% Onglet
%    \begin{macrocode}
            \pspolygon[linearc=0.35, linestyle=\PM@linestyle,
            linecolor=\PM@textcolor, fillstyle=solid,
            fillcolor=\PM@fillcolor]
              (-1,0.4)(0.5,0)(0.5,4.3)(-1,4.7)
            \rput{90}(-0.6,2.0){\textcolor{\PM@textcolor}{%
              \PM@ThumbFont
              \MakeUppercase{\@nameuse{PM@thumb\the\count@}}}}%
          }%
          \advance\count@ \m@ne
          \advance\@tempcnta \m@ne
        \ifnum\count@>\z@
        \repeat
      \fi
    }%
  }%
%    \end{macrocode}
% Pages paires (en-tête, page)
%    \begin{macrocode}
  \fancyhead[LE]{%
    \PM@shiftoddpage
    \PM@testcrop
    \rput(\@tempdima,\@tempdimb){%
      \expandafter\if\csname PM@@thumb\the\PM@thumbcurr\endcsname*\relax
%    \end{macrocode}
% Dernière nouvelle : les pages sous fond coloré garde les en-têtes des
% autres type de page donc les lignes commentées et le test qui ne
% sert visiblement à rien. Je garde quand même ce test au cas où !
%    \begin{macrocode}
        \psframe[linestyle=none, fillstyle=solid,
          fillcolor=\PM@thumb@lcolor]
          (-0.035\paperwidth,5mm)(1.035\paperwidth,-1.025\paperheight)
%    \end{macrocode}
% Même code que dans la partie |\else| (cf. commentaire ci-dessus)
%    \begin{macrocode}
        \def\PM@fillcolor{\PM@thumb@dcolor}%
        \def\PM@textcolor{white}%
        \def\PM@linestyle{none}%
        \def\PM@linecolor{white}%
      \else
        \def\PM@fillcolor{\PM@thumb@dcolor}%
        \def\PM@textcolor{white}%
        \def\PM@linestyle{none}%
        \def\PM@linecolor{white}%
      \fi
%    \end{macrocode}
% Test inutile (voir commentaire sur la partie page impaire).
%    \begin{macrocode}
      \ifnum\PM@thumbcurr>0
        \ifPM@special
%    \end{macrocode}
% Plus d'affichage de l'onglet sur page paire pour le bac
% blanc. À la place, on a juste la prolongation de la barre
% bleue foncée en haut de page sur fond bleu clair.
%    \begin{macrocode}
          \pspolygon[linestyle=\PM@linestyle, fillstyle=solid,
            fillcolor=\PM@fillcolor, linecolor= \PM@linecolor]
              (-0.035\paperwidth,5mm)
              (1.035\paperwidth,5mm)
              (1.035\paperwidth,-11mm)
              (-0.035\paperwidth,-11mm)
%    \end{macrocode}
% Hop retour à la même présentation que pour les autres chapitres (je
% garde le test et le code qui ne sert à rien au cas où)
%    \begin{macrocode}
          \pspolygon[linestyle=\PM@linestyle, fillstyle=solid,
            fillcolor=\PM@fillcolor, linecolor= \PM@linecolor,
            linearc=5mm]
              (-0.035\paperwidth,5mm)
              (1.035\paperwidth,5mm)
              (1.035\paperwidth,-11mm)
              (14mm,-11mm)
              (14mm,-39mm)
              (-0.035\paperwidth,-42.42mm)
          \rput[B]{90}(10mm,-25mm){%
            \PM@ThumbEvenFont
              \textcolor{\PM@textcolor}{%
              \MakeUppercase{\@nameuse{PM@thumb\the\PM@thumbcurr}}%
            }%
          }%
        \else
          \pspolygon[linestyle=\PM@linestyle, fillstyle=solid,
            fillcolor=\PM@fillcolor, linecolor= \PM@linecolor,
            linearc=5mm]
              (-0.035\paperwidth,5mm)
              (1.035\paperwidth,5mm)
              (1.035\paperwidth,-11mm)
              (14mm,-11mm)
              (14mm,-39mm)
              (-0.035\paperwidth,-42.42mm)
          \rput[B]{90}(10mm,-25mm){%
            \PM@ThumbEvenFont
              \textcolor{\PM@textcolor}{%
              \MakeUppercase{\@nameuse{PM@thumb\the\PM@thumbcurr}}%
            }%
          }%
        \fi
      \else
        \ifPM@special
%    \end{macrocode}
% Sur le bac blanc page paire du sujet, on reprend la
% présentation des pages d'énoncés des chapitres normaux
%    \begin{macrocode}
          \def\PM@fillcolor{PM@head@color}%
          \def\PM@textcolor{white}%
          \def\PM@linestyle{none}%
          \def\PM@linecolor{white}%
          \pspolygon[linestyle=\PM@linestyle, fillstyle=solid,
            fillcolor=\PM@fillcolor, linecolor= \PM@linecolor,
            linearc=5mm]
              (-0.035\paperwidth,5mm)
              (1.035\paperwidth,5mm)
              (1.035\paperwidth,-11mm)
              (14mm,-11mm)
              (14mm,-39mm)
              (-0.035\paperwidth,-42.42mm)
          \rput[B]{90}(10mm,-25mm){%
            \PM@ThumbEvenFont
              \textcolor{\PM@textcolor}{%
              \MakeUppercase{\@nameuse{PM@thumb\the\PM@thumbcurr}}%
            }%
          }%
        \fi
      \fi
%    \end{macrocode}
% coin inférieur gauche
%    \begin{macrocode}
      \rput(0mm,-\paperheight){%
        \psframe[linestyle=none, fillstyle=solid,
          fillcolor=\PM@thumb@dcolor,framearc=0.2]
            (11mm,6mm)(-5mm,12mm)
        \rput(8.5mm,9mm){%
          \PM@FootPageFont
          \textcolor{white}{\the\c@page}}%
      }%
    }%
  }%
}
%    \end{macrocode}
% Style pour les chapitres simples
%
% Première page d'un chapitre simple frontmatter et backmatter
%    \begin{macrocode}
\fancypagestyle{firstsimplechapternomain}{%
  \fancyhf{}%
%    \end{macrocode}
% Pages impaires
%    \begin{macrocode}
  \fancyhead[LO]{%
    \PM@shiftoddpage
    \PM@testcrop
    \rput(\@tempdima,\@tempdimb){%
      \rput(\paperwidth,0){%
%    \end{macrocode}
% La nouvelle classe ne fait plus de dégradé à cet endroit.
%    \begin{macrocode}
        \pspolygon[linestyle=none, fillstyle=solid,
          fillcolor=\PM@thumb@dcolor, linearc=5mm]
            (-60mm,5mm)(5mm,5mm)
            (5mm,-30mm)(-61mm,-25mm)
        \rput(-33mm,-15mm){%
          \color{white}%
          \parbox{42mm}{%
            \raggedleft
            \PM@HeadFrontChapterFont \PM@chapter
          }%
        }%
      }%
      \ifappendix
        \rput(0mm,-\paperheight){%
          \psframe[linestyle=none, fillstyle=solid,
          fillcolor=\PM@thumb@dcolor,framearc=0.2]
          (13.5mm,25.5mm)(-2.5mm,31.5mm)
          \rput(0mm,28.5mm){%
            \PM@FootPageFont
            \textcolor{white}{\the\c@page}}%
        }%
      \fi
    }%
  }%
%    \end{macrocode}
% Pages paires
%    \begin{macrocode}
  \fancyhead[LE]{%
    \PM@shiftevenpage
    \PM@testcrop
    \rput(\@tempdima,\@tempdimb){%
%    \end{macrocode}
% La nouvelle classe ne fait plus de dégradé à cet endroit.
%    \begin{macrocode}
      \pspolygon[linestyle=none, fillstyle=solid,
        fillcolor=\PM@thumb@dcolor, linearc=5mm]
        (-0.035\paperwidth,5mm)(60mm,5mm)
        (61mm,-25mm)(-0.035\paperwidth,-30mm)
      \rput(33mm,-15mm){%
        \color{white}%
        \PM@HeadFrontChapterFont
        \parbox{42mm}{\hspace*{0pt}\PM@chapter}%
      }%
    }%
  }%
}
%    \end{macrocode}
% Page suivante d'un chapitre simple frontmatter ou backmatter
%    \begin{macrocode}
\fancypagestyle{simplechapternomain}{%
  \fancyhf{}%
  \fancyhead[LO]{%
    \PM@shiftoddpage
    \PM@testcrop
    \rput(\@tempdima,\@tempdimb){%
    }
  }%
  \fancyhead[LE]{%
    \PM@shiftevenpage
    \PM@testcrop
    \rput(\@tempdima,\@tempdimb){%
    }%
  }%
}
%    \end{macrocode}
% Première page d'un chapitre simple mainmatter
%    \begin{macrocode}
\fancypagestyle{firstsimplechaptermain}{%
  \fancyhf{}%
%    \end{macrocode}
% pages impaires (normalement uniquement)
%    \begin{macrocode}
  \fancyhead[LO]{%
    \PM@shiftoddpage
    \PM@testcrop
    \rput(\@tempdima,\@tempdimb){%
      \rput(\paperwidth,0){%
%    \end{macrocode}
% La nouvelle classe ne fait plus de dégradé à cet endroit.
%    \begin{macrocode}
        \pspolygon[linestyle=none, fillstyle=solid,
          fillcolor=\PM@thumb@dcolor, linearc=5mm]
            (-38mm,5mm)(5mm,5mm)
            (5mm,-40mm)(-40mm,-35mm)
        \rput(-20mm,-17mm){%
          \color{white}%
          \parbox{42mm}{%
            \centering
            \ifPM@special
%    \end{macrocode}
% Affichage dépendant du fait que ce soit un chapitre spécial
%    \begin{macrocode}
              \PM@HeadFrontChapterFont \PM@SpecialTitle
            \else
	      \ifPM@intro
		\PM@HeadFrontChapterFont Introduction
	      \else
                \PM@HeadFirstChapterFont \PM@chapapp
                \ifappendix
                  \ifnum\PM@nbappendix>1
                    \ \PM@HeadFirstChapterFont \thechapter
                  \fi
                  \rput(0mm,-\paperheight){%
                    \psframe[linestyle=none, fillstyle=solid,
                    fillcolor=\PM@thumb@dcolor,framearc=0.2]
                    (13.5mm,25.5mm)(-2.5mm,31.5mm)
                    \rput(0mm,28.5mm){%
                      \PM@FootPageFont
                      \textcolor{white}{\the\c@page}}%
                  }%
                \else
                  \\[-6pt]
                  \PM@HeadFirstChapterNumberFont \thechapter
                \fi
	      \fi
            \fi
          }%
        }%
      }%
    }%
  }%
%    \end{macrocode}
% pages paires (normalement jamais)
%    \begin{macrocode}
  \fancyhead[LE]{%
    \PM@shiftevenpage
    \PM@testcrop
    \rput(\@tempdima,\@tempdimb){%
    }%
  }%
}
%    \end{macrocode}
% Page suivante d'un chapitre mainmatter
%    \begin{macrocode}
\fancypagestyle{simplechaptermain}{%
  \fancyhf{}%
%    \end{macrocode}
% pages impaires (en-tête, page, onglets)
%    \begin{macrocode}
  \fancyhead[LO]{%
    \PM@shiftevenpage
    \PM@testcrop
    \rput(\@tempdima,\@tempdimb){%
      \def\PM@fillcolor{\PM@thumb@dcolor}%
      \def\PM@textcolor{white}%
      \def\PM@linestyle{none}%
      \def\PM@linecolor{white}%
%    \end{macrocode}
% À partir de la version 2.2, il n'y a plus d'en-tête du tout pour les
% chapitres simples (à part la première page).
%    \begin{macrocode}
      \iffalse
      \ifPM@special
        \pspolygon[linestyle=\PM@linestyle, linecolor=\PM@linecolor,
          fillstyle=solid, fillcolor=\PM@fillcolor]
            (-0.035\paperwidth,5mm)
            (1.035\paperwidth,5mm)
            (1.035\paperwidth,-11mm)
            (-0.035\paperwidth,-11mm)
        \rput[Br](148mm,-7mm){%
          \PM@HeadNextChapterFont
          \textcolor{\PM@textcolor}{\PM@chapter}%
        }
      \else
	\ifPM@intro
	  \rput[Br](148mm,-7mm){%
            \PM@HeadNextChapterFont
            {\let\\\space
              \textcolor{PM@head@color}{\MakeUppercase{\PM@chapter}}%
            }%
          }
	\else
          \rput[Br](148mm,-7mm){%
            \PM@HeadNextChapterFont
            \ifappendix
              \textcolor{\PM@textcolor}{\MakeUppercase{\PM@shortchapapp}}
                \ifnum\PM@nbappendix>1
                  \textcolor{\PM@textcolor}{\thechapter}
                \fi
                \textcolor{\PM@textcolor}{:}
              {\let\\\space
                \textcolor{PM@head@color}{\MakeUppercase{\PM@chapter}}%
              }%
            \else
              {\let\\\space
                \textcolor{PM@head@color}{\MakeUppercase{\PM@chapter}\ \
                  \pscircle*[linecolor=PM@head@color](0,0.5ex){2pt}\ \
                  \MakeUppercase{\PM@shortchapapp}. \thechapter
                }%
              }%
            \fi
          }
	\fi
      \fi
      \fi
%    \end{macrocode}
% Coin inférieur droit
%    \begin{macrocode}
      \ifodd\c@page
        \rput(\paperwidth,-\paperheight){%
          \psframe[linestyle=none, fillstyle=solid,
            fillcolor=\PM@thumb@dcolor,framearc=0.2]
              (-11mm, 6mm)(5mm,12mm)
          \rput(-8.5mm,9mm){%
            \PM@FootPageFont
            \textcolor{white}{\the\c@page}}%
        }%
      \else
        \rput(0mm,-\paperheight){%
          \psframe[linestyle=none, fillstyle=solid,
            fillcolor=\PM@thumb@dcolor,framearc=0.2]
              (11mm,6mm)(-5mm,12mm)
          \rput(8.5mm,9mm){%
            \PM@FootPageFont
            \textcolor{white}{\the\c@page}}%
        }%
      \fi
    }%
  }%
%    \end{macrocode}
% pages paires (en-tête, page)
%    \begin{macrocode}
  \fancyhead[LE]{%
    \PM@shiftoddpage
    \PM@testcrop
    \rput(\@tempdima,\@tempdimb){%
      \def\PM@fillcolor{\PM@thumb@dcolor}%
      \def\PM@textcolor{white}%
      \def\PM@linestyle{none}%
      \def\PM@linecolor{white}%
      \rput(0mm,-\paperheight){%
        \psframe[linestyle=none, fillstyle=solid,
          fillcolor=\PM@thumb@dcolor,framearc=0.2]
            (11mm,6mm)(-5mm,12mm)
        \rput(8.5mm,9mm){%
          \PM@FootPageFont
          \textcolor{white}{\the\c@page}}%
      }%
    }%
  }%
}
%    \end{macrocode}
% Les styles de pages pour le bac blanc et le brevet blanc sont
% exactement ceux des chapitres \og normaux \fg{}.
%    \begin{macrocode}
\let\ps@firstspecialchapter\ps@firstchaptermain
\let\ps@specialchapter\ps@chaptermain
\let\ps@firstintrochapter\ps@firstchaptermain
\let\ps@introchapter\ps@chaptermain
%    \end{macrocode}
% Style en début de document (empty)
%    \begin{macrocode}
\pagestyle{empty}
%    \end{macrocode}
% \subsection{Mises en forme particulières}
% \subsubsection{Réglages des paragraphes}
% pas de retrait d'alinéa, saut inter-paragraphe à 1mm.
%    \begin{macrocode}
\parindent=0\p@
\parskip=1mm plus1\p@
%    \end{macrocode}
% On a automatiquement une page de titre qui comporte le titre de
% l'ouvrage. Si on compose un rabat, il n'y aura pas de page de titre.
%
% La version 2.28c introduit la possibilité de composer la page de
% garde avec un fichier externe |pdg.eps| si l'option |pdg| a été
% activée.
%    \begin{macrocode}
\AtBeginDocument{%
  \flushbottom
  \ifPM@rabat
  \else
  \ifPM@pdg
    \rput[tl](-3.32cm,4.35cm){\includegraphics{pdg}}
  \else
    \vspace*{\stretch{1}}
    {\centering\PM@BookTitleFont \PM@title\par}
    \vspace*{\stretch{1}}
    \thispagestyle{empty}
  \fi\fi
}
%    \end{macrocode}
% \subsubsection{Légende (tableau et figure)}
% En réalité, il n'y a pas de flottants et on redéfinit les
% environnements \environ{figure} et \environ{table}
%    \begin{macrocode}
\newenvironment{figure}{\par\minipage{\linewidth}}
                       {\endminipage\par}
\newenvironment{table}{\par\minipage{\linewidth}}
                      {\endminipage\par}
\newfixedcaption{\figcaption}{figure}
\newfixedcaption{\tabcaption}{table}
\arrayrulecolor{PM@arrayrule@color}
\arrayrulewidth=0.7\p@
\arraycolsep=5\p@
\tabcolsep=6\p@
\newcounter{figure}[chapter]
\renewcommand*\thefigure{\thechapter.\the\c@figure}
\newcounter{table}[chapter]
\renewcommand*\thetable{\thechapter.\the\c@table}
\newlength{\abovecaptionskip}
\newlength{\belowcaptionskip}
\setlength{\abovecaptionskip}{10\p@ plus1\p@}
\setlength{\belowcaptionskip}{0\p@ plus1\p@}
\newcommand*\ext@table{lot}
\newcommand*\ext@figure{lof}
\captionnamefont{\PM@CaptionFont}
\captiontitlefont{\PM@CaptionTitleFont}
\captiondelim{\@nameuse{\@captype name} \@nameuse{the\@captype} -- }
\addto\captionsfrench{%
  \def\figurename{Figure}%
  \def\tablename{Tableau}%
}
%    \end{macrocode}
% Pour les tableaux, on prévoit quelques commandes permettant de
% facilter la vie du metteur en page pour composer les lignes ou
% colonnes de titre. Ces éléments sont normalement en jaune pâle mais
% on prévoit une macro |TabularColor| qui définit la couleur de titre
%  comme étant le jaune pâle.
%
% On commence par la commande permettant de composer les lignes.
%    \begin{macrocode}
\newcommand*\tabulartitle{\rowcolor{TabularColor}}
%    \end{macrocode}
% Pour les colonnes, on utilise des nouveaux descripteurs de
% colonnes. Ici, on ne peut pas utiliser l'argument optionnel. Il
% faudra avoir recours à la couleur |TabularColor|.
%    \begin{macrocode}
\newcolumntype{L}{>{\columncolor{TabularColor}}l}
\newcolumntype{R}{>{\columncolor{TabularColor}}r}
\newcolumntype{C}{>{\columncolor{TabularColor}}c}
\newcolumntype{P}[1]{>{\columncolor{TabularColor}}p{#1}}
\newcolumntype{M}[1]{>{\columncolor{TabularColor}}m{#1}}
\newcolumntype{B}[1]{>{\columncolor{TabularColor}}b{#1}}
\newcolumntype{x}{>{\columncolor{TabularColor}}X}
%    \end{macrocode}
% Pour les algorithmes, on compose dans d'un cadre colorés où les
% espaces et sauts de lignes sont respectées.
%    \begin{macrocode}
\newbox{\PM@algobox}
\newenvironment{algorithme}[1]{%
  \parskip 1mm plus\z@
  \gdef\PM@titre{#1}%
%    \end{macrocode}
% On commence par redéfinir, la commande |\Break| dont le rôle
% consiste à terminer l'environnement en cours et à en recommencer un
% autre sur une nouvelle page.
%    \begin{macrocode}
  \def\Break{%
%    \end{macrocode}
% La nouvelle version (version 2.22) prévoit un cartouche si
% l'argument de titre est non vide.
%
% On prévoit un petit espace vertical supplémentaire pour pouvoir
% placer le cartouche de continuation sans télescopage avec un
% éventuel texte juste au-dessus. Dans un premier temps, on ne fait
% que poser le nœud qui indique l'emplacement du cartouche.
%    \begin{macrocode}
        \PM@BeforeBreak{lrbox}%
        \pnode(\dimexpr\linewidth-3mm,-0.9\baselineskip){PM@NodeCorr}%
      \endminipage
    \end{lrbox}%
    \setlength{\PM@vertical@shift}{-0.5\dp\PM@algobox+0.5\ht\PM@algobox}%
    \resetcolorseries[10]{PM@ombre@color}%
    \multido{\dx=0pt+0.25\pslinewidth}{10}{%
%    \end{macrocode}
% |6pt| plus un petit rab pour les épaisseurs de lignes.
%    \begin{macrocode}
      \rput(7pt,-0.4pt){%
        \rput(0.5\wd\PM@algobox,\PM@vertical@shift){%
          \rput(\dx,-\dx){%
            \psframebox[fillstyle=none,
                        linestyle=solid, framesep=6pt,
                        linecolor=PM@ombre@color!!+]
            {\phantom{\usebox{\PM@algobox}}}%
          }
        }
      }
    }%
    \psframebox[linestyle=none, fillstyle=solid,
                fillcolor=LO,framesep=6pt]{%
      \usebox{\PM@algobox}%
    }%
%    \end{macrocode}
% Une fois que le cadre est entièrement dessiné, on place le
% cartouche de continuation.
%    \begin{macrocode}
    \rput[br](PM@NodeCorr){%
      \psframebox[linecolor=DO,linewidth=1.5\fboxrule,
        fillstyle=solid, cornersize=absolute, linearc=1.5mm,
        fillcolor=white]{\textbf{\ldots}}%
    }
%    \end{macrocode}
% On peut maintenant passer à la page suivante et recommencer le code
% de départ de l'environnement (voir explications ci-dessous).
%    \begin{macrocode}
    \clearpage
    \ifx\relax#1\relax
    \else
      \psframebox[linestyle=none, linewidth=0pt,
                  fillstyle=solid, fillcolor=DO]{%
        \color{white}%
        \LogoComputer{4mm}{white}{DO}\space
        {\PM@WarningStarFont \rule{0pt}{9pt}\PM@titre}%
      }
      \kern-3pt
      \pspolygon[linestyle=none, linewidth=0pt,
                 fillstyle=solid, fillcolor=DO]
      (0,-0.13)(0.57,-0.13)(0,0.44)
      \par\nobreak\vspace{-4.6pt}
    \fi
    \begin{lrbox}{\PM@algobox}
      \minipage{\dimexpr\linewidth-\fboxsep*2-\fboxrule*2}
        \parskip 0pt plus0pt
        \PM@AlgoFont
        \fontdimen2\the\font=0.5em
        \hyphenchar\font\m@ne
        \frenchspacing
        \catcode`\:=12
        \catcode`\;=12
        \catcode`\?=12
        \catcode`\!=12
        \@vobeyspaces
        \obeylines
  }%
%    \end{macrocode}
% Les macros |\Break| et |\BreakWithoutItem| sont strictement identiques
%    \begin{macrocode}
  \let\BreakWithoutItem\Break
%    \end{macrocode}
% On commence l'écriture dans une boîte avec la largeur d'empagement
% moins les marges.
%
% Dans cet environnement, le saut de ligne est équivalent à |\par|. On
% supprime donc totalement le saut inter-paragraphe ainsi que son
% élasticité.
%    \begin{macrocode}
  \setlength{\fboxsep}{6pt}%
  \par\nobreak\addvspace{\PM@SkipAboveWarning}
  \ifx\relax#1\relax
  \else
    \psframebox[linestyle=none, linewidth=0pt,
                fillstyle=solid, fillcolor=DO]{%
      \color{white}%
      \LogoComputer{4mm}{white}{DO}\space
      {\PM@WarningStarFont \rule{0pt}{9pt}\PM@titre}%
    }
    \xdef\PM@titre{\PM@titre\space \PM@smashlp suite\PM@smashrp}%
    \kern-3pt
    \pspolygon[linestyle=none, linewidth=0pt,
               fillstyle=solid, fillcolor=DO]
    (0,-0.13)(0.57,-0.13)(0,0.44)
    \par\nobreak\vspace{-4.6pt}
  \fi
  \begin{lrbox}{\PM@algobox}
    \minipage{\dimexpr\linewidth-\fboxsep*2-\fboxrule*2-0.8pt}
      \parskip 0pt plus0pt
      \PM@AlgoFont
%    \end{macrocode}
% La fonte utilisée a une espace intermot beaucoup trop petite, on
% l'augmente pour qu'elle ait la largeur moyenne d'une lettre.
%    \begin{macrocode}
      \fontdimen2\the\font=0.5em
%    \end{macrocode}
% Toutes les commandes qui suivent servent à avoir un comportement
% verbatim au niveau des espaces et des sauts de lignes ainsi que pour
% la gestion des ligatures et des ponctuations hautes (sans espace).
%    \begin{macrocode}
      \hyphenchar\font\m@ne
      \frenchspacing
      \catcode`\:=12
      \catcode`\;=12
      \catcode`\?=12
      \catcode`\!=12
      \@vobeyspaces
      \obeylines
}
{%
    \endminipage
  \end{lrbox}%
  \par
  \setlength{\PM@vertical@shift}{-0.5\dp\PM@algobox+0.5\ht\PM@algobox}%
  \resetcolorseries[10]{PM@ombre@color}%
  \multido{\dx=0pt+0.25\pslinewidth}{10}{%
%    \end{macrocode}
% |6pt| plus un petit rab pour les épaisseurs de lignes.
%    \begin{macrocode}
    \rput(7pt,-0.4pt){%
      \rput(0.5\wd\PM@algobox,\PM@vertical@shift){%
        \rput(\dx,-\dx){%
          \psframebox[fillstyle=none,
                      linestyle=solid, framesep=6pt,
                      linecolor=PM@ombre@color!!+]
          {\phantom{\usebox{\PM@algobox}}}%
        }
      }
    }
  }%
  \psframebox[linestyle=none, fillstyle=solid,
              fillcolor=LO,framesep=6pt]{%
    \usebox{\PM@algobox}%
  }%
  \par
}
%    \end{macrocode}
% On a également un environnement pour les listings. Celui-ci s'appuie
% sur l'extension \package{listingsutf8}. Pour l'instant comme son
% principe est de placer un |\lstinputlisting| dans un bloc, il n'y a
% pas besoin de |\Break|. On verra plus tard si on prévoit un
% mécanisme pour cela.
%
% Le fichier sera pris par défaut dans le répertoire spécifié dans la
% macro |\DirListing|.
%
% Les arguments sont dans l'ordre :
% \begin{itemize}
% \item les options transmis à la commande |\lstinputlisting| ;
% \item le titre placé dans le cartouche ;
% \item le nom du fichier externe.
% \end{itemize}
%    \begin{macrocode}
\newcommand\DirListing{}
\newenvironment{listing}[3][]{%
  \parskip 1mm plus\z@
  \gdef\PM@titre{#1}%
%    \end{macrocode}
% On commence l'écriture dans une boîte avec la largeur d'empagement
% moins les marges.
%    \begin{macrocode}
  \setlength{\fboxsep}{6pt}%
  \par\nobreak\addvspace{\PM@SkipAboveWarning}
  \ifx\relax#2\relax
  \else
    \psframebox[linestyle=none, linewidth=0pt,
                fillstyle=solid, fillcolor=DO]{%
      \color{white}%
      \LogoComputer{4mm}{white}{DO}\space
      \PM@WarningStarFont \rule{0pt}{9pt}#2%
    }
    \kern-3pt
    \pspolygon[linestyle=none, linewidth=0pt,
               fillstyle=solid, fillcolor=DO]
    (0,-0.13)(0.57,-0.13)(0,0.44)
    \par\nobreak\vspace{-4.6pt}
  \fi
  \begin{lrbox}{\PM@algobox}
    \minipage{\dimexpr\linewidth-\fboxsep*2-\fboxrule*2-0.8pt}
      \parskip 0pt plus0pt
      \PM@AlgoFont
%    \end{macrocode}
% La fonte utilisée a une espace intermot beaucoup trop petite, on
% l'augmente pour qu'elle ait la largeur moyenne d'une lettre.
%    \begin{macrocode}
      \fontdimen2\the\font=0.5em
%    \end{macrocode}
% Comme la commande |\lstinputlisting| est placée en fin
% d'environnement et qu'elle se sert des arguments |#1| (options) et
% |#3| (nom de fichier), il faut les sauvegarder ici.
%    \begin{macrocode}
      \def\PM@Option@Listing{[#1]}%
      \def\PM@File@Listing{\DirListing #3}%
}
{%
%    \end{macrocode}
% La commande d'insertion du code est placée en fin de travail. Cela
% permet de placer un éventuel texte explicatif avant le code
% proprement dit.
%    \begin{macrocode}
      \expandafter\lstinputlisting\PM@Option@Listing{\PM@File@Listing}%
    \endminipage
  \end{lrbox}%
  \par
  \setlength{\PM@vertical@shift}{-0.5\dp\PM@algobox+0.5\ht\PM@algobox}%
  \resetcolorseries[10]{PM@ombre@color}%
  \multido{\dx=0pt+0.25\pslinewidth}{10}{%
%    \end{macrocode}
% |6pt| plus un petit rab pour les épaisseurs de lignes.
%    \begin{macrocode}
    \rput(7pt,-0.4pt){%
      \rput(0.5\wd\PM@algobox,\PM@vertical@shift){%
        \rput(\dx,-\dx){%
          \psframebox[fillstyle=none,
                      linestyle=solid, framesep=6pt,
                      linecolor=PM@ombre@color!!+]
          {\phantom{\usebox{\PM@algobox}}}%
        }
      }
    }
  }%
  \psframebox[linestyle=none, fillstyle=solid,
              fillcolor=LO,framesep=6pt]{%
    \usebox{\PM@algobox}%
  }%
  \par
}
%    \end{macrocode}
% \subsubsection{Définition, lemme, théorème et compagnie}
% Ce sont les environnements qui présentent un numéro et un filet
%    \begin{macrocode}
\newlength{\PM@SkipAboveWarning}
\setlength{\PM@SkipAboveWarning}{2mm plus1\p@}
\newlength{\PM@SkipBelowWarning}
\setlength{\PM@SkipBelowWarning}{2mm plus1\p@}
\newlength{\PM@SkipAboveTheorem}
\setlength{\PM@SkipAboveTheorem}{4mm plus1\p@}
\newlength{\PM@SkipBelowTheorem}
\setlength{\PM@SkipBelowTheorem}{2mm plus1\p@}
\newcommand\BreakWithoutItem{%
  \Break
  \let\makelabelori\makelabel
  \def\makelabel##1{\addtocounter{enum\romannumeral\the\@enumdepth}{-1}}%
  \item
  \let\makelabel\makelabelori
}
\newcommand*\DefineTheoremLike[3][]{%
%    \end{macrocode}
% \begin{itemize}
% \item |#1| (optionnel) compteur utilisé
% \item |#2| nom de l'environnement
% \item |#3| titre
% \end{itemize}
% Définition différente du compteur selon la présence ou non du
% paramètre optionnel
%    \begin{macrocode}
  \ifx\relax#1\relax
    \unless\ifcsname the#2\endcsname
      \newcounter{#2}[chapter]
    \fi
    \@DefineTheoremLike{#2}{#3}{#2}%
  \else
    \unless\ifcsname the#1\endcsname
      \newcounter{#1}[chapter]
    \fi
    \@DefineTheoremLike{#2}{#3}{#1}%
  \fi
}
\newcommand\@DefineTheoremLike[3]{%
%    \end{macrocode}
% Uniquement sur la numérotation des paramètres
% \begin{itemize}
% \item |#1| nom d'environnement
% \item |#2| titre
% \item |#3| compteur
% \end{itemize}
%    \begin{macrocode}
  \newenvironment{#1}[1][]
    {%
      \parskip 1mm plus\z@
      \PM@breakfalse
      \def\Break{%
        \global\PM@breaktrue
%    \end{macrocode}
% Fin de coupure
%    \begin{macrocode}
        \PM@BeforeBreak{lrbox}%
%    \end{macrocode}
% Noeud pour cartouche "suite"
%    \begin{macrocode}
        \par\nobreak
        \pnode(\dimexpr\linewidth-3mm,-0.9\baselineskip){PM@NodeCorr}
        \endminipage
        \end{lrbox}%
        \hspace*{3mm}\usebox{\PM@box}\\
        \dimen0=\dp\PM@box
        \advance\dimen0 \ht\PM@box
        \ifPM@break
          \advance\dimen0 3.5pt
        \else
          \advance\dimen0 8.5pt
        \fi
        \rput(A){%
          \psline[linewidth=0.4pt, linecolor=PM@theorem@color]
                 (0.5\pslinewidth,-\dimen0)(0.5\pslinewidth,0pt)
        }%
        \endminipage
%    \end{macrocode}
% Début page suivante. Il n'y a pas de reprise de titre (commentaires
% ci-dessous).
%    \begin{macrocode}
        \clearpage
        \pnode(0,10pt){A}
        \minipage[t]{\linewidth}%
        \begin{lrbox}{\PM@box}%
          \minipage[t]{\linewidth-3mm}%
          \PM@AfterBreak
      }%
      \par\addvspace{\PM@SkipAboveTheorem}
      \refstepcounter{#3}%
      \ifx\relax##1\relax
        \savebox{\PM@box}{%
          \textcolor{PM@theorem@color}{\PM@TheoremFont #2 \arabic{#3}}%
        }%
      \else
        \savebox{\PM@box}{%
          \textcolor{PM@theorem@color}{\PM@TheoremFont #2 \arabic{#3}
            : ##1}%
        }%
      \fi
      \minipage[t]{\linewidth}%
      \usebox{\PM@box}\\
      \pnode(0,8.5pt){A}
      \psline[linewidth=0.4pt, linecolor=PM@theorem@color]
             (0,8.5pt)(\wd\PM@box,8.5pt)
      \begin{lrbox}{\PM@box}%
        \minipage[t]{\linewidth-3mm}%
        \vspace{-3pt}%
    }
    {%
        \endminipage
      \end{lrbox}%
      \hspace*{3mm}\usebox{\PM@box}\\
      \dimen0=\dp\PM@box
      \advance\dimen0 \ht\PM@box
      \ifPM@break
        \advance\dimen0 3.5pt
      \else
        \advance\dimen0 8.5pt
      \fi
      \rput(A){%
        \psline[linewidth=0.4pt, linecolor=PM@theorem@color]
               (0.5\pslinewidth,-\dimen0)(0.5\pslinewidth,0pt)
      }%
      \endminipage
      \par\addvspace{\PM@SkipBelowTheorem}
    }%
}
%    \end{macrocode}
% On définit les différents Theorem-like.
%    \begin{macrocode}
\DefineTheoremLike{coro}{Corollaire}
%    \end{macrocode}
% Ajout du paramètre optionnel indiquant le compteur utilisé.
%    \begin{macrocode}
\DefineTheoremLike[coro]{coros}{Corollaires}
\DefineTheoremLike{defin}{D\'efinition}
\DefineTheoremLike[defin]{defins}{D\'efinitions}
\DefineTheoremLike{prop}{Propri\'et\'e}
\DefineTheoremLike[prop]{props}{Propri\'et\'es}
\DefineTheoremLike{thm}{Th\'eor\`eme}
\DefineTheoremLike[thm]{thms}{Th\'eor\`emes}
%    \end{macrocode}
% \subsubsection{Remarque, exemple et compagnie}
% Il y a juste un titre en noir.
%    \begin{macrocode}
\newcommand*\DefineExampleLikeWithPar[2]{%
%    \end{macrocode}
% \begin{itemize}
% \item |#1| nom de l'environnement
% \item |#2| titre
% \end{itemize}
%    \begin{macrocode}
  \newenvironment{#1}[1][]
    {%
      \parskip 1mm plus\z@
      \gdef\PM@suite{}%
      \def\Break{%
%    \end{macrocode}
% Fin de la coupure
%    \begin{macrocode}
        \PM@BeforeBreak{lrbox}%
%    \end{macrocode}
% Noeud pour cartouche "suite"
%    \begin{macrocode}
        \par\nobreak
        \pnode(\dimexpr\linewidth-3mm,-0.9\baselineskip){PM@NodeCorr}
        \endminipage
        \end{lrbox}%
        \usebox{\PM@box}
%    \end{macrocode}
% Début de la page suivante. On ne met un \og (suite) \fg{} potentiel
% que s'il n'y a pas déjà une parenthèse.
%    \begin{macrocode}
        \clearpage
        \ifx\relax##1\relax
          \textcolor{PM@example@color}{\PM@ExampleFont #2\PM@suite}
        \else
          \textcolor{PM@example@color}{\PM@ExampleFont #2 (##1)}
        \fi
        \par\nobreak\addvspace{\smallskipamount}
        \gdef\PM@suite{ \PM@smashlp suite\PM@smashrp}%
        \begin{lrbox}{\PM@box}%
          \minipage{\linewidth}%
          \PM@AfterBreak
      }%
      \par\addvspace{\PM@SkipAboveTheorem}
      \ifx\relax##1\relax
        \textcolor{PM@example@color}{\PM@ExampleFont #2\PM@suite}
      \else
        \textcolor{PM@example@color}{\PM@ExampleFont #2 (##1)}
      \fi
      \par\nobreak\addvspace{\smallskipamount}
      \begin{lrbox}{\PM@box}%
        \minipage{\linewidth}%
    }
    {%
        \endminipage%
      \end{lrbox}%
      \usebox{\PM@box}
      \par\addvspace{\PM@SkipBelowTheorem}
    }%
}
%    \end{macrocode}
% À plusieurs endroits, on va avoir besoin de parenthèses qui ne
% dépassent pas les capitales en hauteurs.
%    \begin{macrocode}
\newbox\PM@smashlpbox
\setbox\PM@smashlpbox=\hbox{\PM@BlackCartoucheFont (}%)
\ht\PM@smashlpbox \z@
\dp\PM@smashlpbox \z@
\newcommand*\PM@smashlp{%
  \copy\PM@smashlpbox
}
\newbox\PM@smashrpbox %(
\setbox\PM@smashrpbox=\hbox{\PM@BlackCartoucheFont )}
\ht\PM@smashrpbox \z@
\dp\PM@smashrpbox \z@
\newcommand*\PM@smashrp{%
  \copy\PM@smashrpbox
}
\ifPM@oldexample
%    \end{macrocode}
% Il y a eu des changements pendant l'élaboration d'un document d'où
% deux versions de la classe
%    \begin{macrocode}
\newcommand*\DefineExampleLike[2]{%
%    \end{macrocode}
% \begin{itemize}
% \item |#1| nom de l'environnement
% \item |#2| titre
% \end{itemize}
%    \begin{macrocode}
  \newenvironment{#1}[1][]
    {%
      \parskip 1mm plus\z@
      \gdef\PM@suite{}%
      \def\Break{%
%    \end{macrocode}
% Fin de la coupure.
%    \begin{macrocode}
        \PM@BeforeBreak{lrbox}%
%    \end{macrocode}
% Noeud pour cartouche "suite"
%    \begin{macrocode}
        \par\nobreak
        \pnode(\dimexpr\linewidth-3mm,-0.9\baselineskip){PM@NodeCorr}
        \endminipage
        \end{lrbox}%
        \usebox{\PM@box}
%    \end{macrocode}
% Début de la page suivante.
%    \begin{macrocode}
        \clearpage
        \ifx\relax##1\relax
          \setbox1=\hbox{%
            \textcolor{PM@example@color}{\PM@ExampleFont #2\PM@suite}~:~
          }%
        \else
          \setbox1=\hbox{%
            \textcolor{PM@example@color}{\PM@ExampleFont #2 (##1)}~:~
          }%
        \fi
        \gdef\PM@suite{ \PM@smashlp suite\PM@smashrp}%
        \begin{lrbox}{\PM@box}%
          \minipage[t]{\linewidth-\wd1}%
          \PM@AfterBreak
      }%
      \par\addvspace{\PM@SkipAboveTheorem}
      \ifx\relax##1\relax
        \setbox1=\hbox{%
          \textcolor{PM@example@color}{\PM@ExampleFont #2\PM@suite}~:~
        }%
      \else
        \setbox1=\hbox{%
          \textcolor{PM@example@color}{\PM@ExampleFont #2 (##1)}~:~
        }%
      \fi
      \leavevmode\copy1
      \begin{lrbox}{\PM@box}%
        \minipage[t]{\linewidth-\wd1}%
    }
    {%
        \endminipage%
      \end{lrbox}%
      \usebox{\PM@box}
      \par\addvspace{\PM@SkipBelowTheorem}
    }%
}
\else
%    \end{macrocode}
% Dans la nouvelle mouture, il n'y a plus d'enfoncement de la
% première ligne par rapport au reste du texte.
%    \begin{macrocode}
\newcommand*\DefineExampleLike[2]{%
%    \end{macrocode}
% \begin{itemize}
% \item |#1| nom de l'environnement
% \item |#2| titre
% \end{itemize}
%    \begin{macrocode}
  \newenvironment{#1}[1][]
    {%
      \parskip 1mm plus\z@
      \gdef\PM@suite{}%
      \def\Break{%
%    \end{macrocode}
% Fin de la coupure.
%    \begin{macrocode}
        \PM@BeforeBreak{lrbox}%
%    \end{macrocode}
% Noeud pour cartouche "suite"
%    \begin{macrocode}
        \par\nobreak
        \pnode(\dimexpr\linewidth-3mm,-0.9\baselineskip){PM@NodeCorr}
        \endminipage
        \end{lrbox}%
        \usebox{\PM@box}
%    \end{macrocode}
% Début de la page suivante.
%    \begin{macrocode}
        \clearpage
        \begin{lrbox}{\PM@box}%
          \minipage[t]{\linewidth}%
          \ifx\relax##1\relax
            \setbox1=\hbox{%
              \textcolor{PM@example@color}{\PM@ExampleFont #2\PM@suite}~:~
            }%
          \else
            \setbox1=\hbox{%
              \textcolor{PM@example@color}{\PM@ExampleFont #2 (##1)}~:~
            }%
          \fi
          \PM@AfterBreak
        \gdef\PM@suite{ \PM@smashlp suite\PM@smashrp}%
      }%
      \par\addvspace{\PM@SkipAboveTheorem}
      \ifx\relax##1\relax
        \setbox1=\hbox{%
          \textcolor{PM@example@color}{\PM@ExampleFont #2\PM@suite}~:~
        }%
      \else
        \setbox1=\hbox{%
          \textcolor{PM@example@color}{\PM@ExampleFont #2 (##1)}~:~
        }%
      \fi
      \begin{lrbox}{\PM@box}%
        \minipage[t]{\linewidth}%
        \leavevmode\copy1
    }
    {%
        \endminipage%
      \end{lrbox}%
      \usebox{\PM@box}
      \par\addvspace{\PM@SkipBelowTheorem}
    }%
}
\fi
%    \end{macrocode}
% On définit maintenant les différents Example-like.
%    \begin{macrocode}
\DefineExampleLike{Remarque}{Remarque}
\DefineExampleLikeWithPar{Remarques}{Remarques}
\DefineExampleLike{Exemple}{Exemple}
\DefineExampleLikeWithPar{Exemples}{Exemples}
%    \end{macrocode}
% \subsubsection{Indications avec logos}
% Les logos de la version 2.0 ont été revus et les couleurs sont plus
% variées.
% 
% Les logos sont tous définis dans un carré de 1 unité de côté. Ils
% demandent tous trois paramètres :
% \begin{itemize}
% \item la taille réelle ;
% \item la couleur de fond ;
% \item la couleur d'avant plan.
% \end{itemize}
% On commence avec le logo attention
%    \begin{macrocode}
\newcommand\LogoExclamation[3]{%
  \begingroup
  \psset{unit=#1}
%    \end{macrocode}
% La boîte englobante triche pour ammener le symbole sur la ligne
% d'écriture. On triche également sur la hauteur pour éviter les
% débordements en cas d'encadrement.
%    \begin{macrocode}
  \begin{pspicture}(0,0.1)(1,0.1)
    \psset{linestyle=none, linewidth=0pt,
           fillstyle=solid, fillcolor=#2}
    \pspolygon[cornersize=absolute, linearc=0.05](0,0)(1,0)(0.5,0.866)
    \rput(0.5,0.333){\psscaleboxto(0,0.5){\textcolor{#3}{\PM@H\string!}}}
  \end{pspicture}%
  \endgroup
}
\newcommand\LogoQuestion[3]{%
  \begingroup
  \psset{unit=#1}
%    \end{macrocode}
% La boîte englobante triche pour ammener le symbole sur la ligne
% d'écriture et pour éviter les problèmes de débordement en hauteur
% dans les encadrés. Tout les logos dans des cercles auront le même
% décalage par soucis d'homogénéité.
%    \begin{macrocode}
  \begin{pspicture}(0,0.15)(1,0.15)
    \psset{linestyle=none, linewidth=0pt,
           fillstyle=solid, fillcolor=#2}
    \pscircle(0.5,0.5){0.5}
    \rput(0.5,0.5){\psscaleboxto(0,0.75){\textcolor{#3}{\PM@H\string?}}}
  \end{pspicture}%
  \endgroup
}
\newcommand\LogoRightArrow[3]{%
  \begingroup
  \psset{unit=#1}
  \begin{pspicture}(0,0.15)(1,0.15)
    \psset{linestyle=none, linewidth=0pt,
           fillstyle=solid, fillcolor=#2}
    \pscircle(0.5,0.5){0.5}
    \psset{linestyle=solid, linecolor=#3, linewidth=0.15,
           arrows=cc-cc, fillstyle=none}
    \psline(0.15,0.5)(0.85,0.5)
    \psline(0.55,0.7)(0.8,0.5)(0.55,0.3)    
  \end{pspicture}%
  \endgroup
}
\newcommand\LogoBulb[3]{%
  \begingroup
  \psset{unit=#1}
  \begin{pspicture}(0,0.15)(1,0.15)
    \psset{linestyle=none, linewidth=0pt,
           fillstyle=solid, fillcolor=#2}
    \pscircle(0.5,0.5){0.5}
    \psset{linestyle=solid, linewidth=0.1, linecolor=#3, arrows=cc-cc}
    \rput(0.5,0.5){
      \psline(0.2;000)(0.35;000)
      \psline(0.2;045)(0.35;045)
      \psline(0.2;090)(0.35;090)
      \psline(0.2;135)(0.35;135)
      \psline(0.2;180)(0.35;180)
    }
    \psset{linestyle=none, linewidth=0pt, arrows=-,
           fillstyle=solid, fillcolor=#3}
    \pscustom{%
      \psarc(0.5,0.5){0.15}{0}{180}
      \pscurve(0.35,0.5)(0.36,0.45)(0.39,0.4)(0.4,0.35)
      \psarc(0.5,0.35){0.1}{180}{360}
      \pscurve(0.6,0.35)(0.61,0.4)(0.64,0.45)(0.65,0.5)
    }
    \psccurve(0.5,0.27)(0.4,0.25)(0.4,0.22)(0.45,0.17)
             (0.5,0.15)(0.55,0.17)(0.6,0.22)(0.6,0.25)
  \end{pspicture}
  \endgroup
}
%    \end{macrocode}
% Pour la pendule, on fait en sorte de mettre la ligne de base un peu
% au-dessus du trait vertical du bas.
%    \begin{macrocode}
\newcommand\LogoSemiClock[3]{%
  \begingroup
  \psset{unit=#1}
  \begin{pspicture}(0,0.3)(1,0.3)
    \psset{linestyle=none, linewidth=0pt,
           fillstyle=solid, fillcolor=#2}
    \pscircle(0.5,0.5){0.5}
    \psset{linestyle=solid, linecolor=#3, linewidth=0.05,
           arrows=cc-, fillstyle=none}
    \begin{psclip}{\pscircle[linestyle=none,linewidth=0pt](0.5,0.5){0.5}}
      \rput(0.5,0.5){%
        \psline(0.3;90)(0.5;90)
        \psline(0.4;120)(0.5;120)
        \psline(0.4;150)(0.5;150)
        \psline(0.3;180)(0.5;180)
        \psline(0.4;210)(0.5;210)
        \psline(0.4;240)(0.5;240)
        \psline(0.3;270)(0.5;270)
       }
    \end{psclip}
  \end{pspicture}%
  \endgroup
}
%    \end{macrocode}
% La version 2.17 ajoute le logo anecdote. Le bas du logo est aligné
% avec la ligne de base.
%    \begin{macrocode}
\newcommand\LogoAnecdote[3]{%
  \begingroup
  \psset{unit=#1}
  \begin{pspicture}(0,0.1)(1,0.1)
    \psset{linestyle=none, linewidth=0pt,
           fillstyle=solid, fillcolor=#2}
    \psellipse(.5,.5)(.4,.28)
    \pscustom{%
      \psline(.6,.5)(.8,.1)
      \pscurve(.8,.1)(.75,.1)(.65,.15)(.55,.25)(.35,.5)
    }
    \psset{fillcolor=#3}
    \pscircle(.32,.5){.06}
    \pscircle(.5,.5){.06}
    \pscircle(.68,.5){.06}
  \end{pspicture}%
  \endgroup
}
%    \end{macrocode}
% La version 2.22 ajoute le logo pour les algorithmes et les
% listings. Le bas de l'écran est aligné avec la ligne de base.
%
% Comme il y a eu deux demandes pour ce logo, je laisse l'ancienne
% version sous le nom (non divulgué) |\LogoComputerOld|.
%    \begin{macrocode}
\newcommand\LogoComputerOld[3]{%
  \begingroup
  \psset{unit=#1}
  \begin{pspicture}(0,0.26)(1.35,0.26)
    \psframe[linestyle=none, linewidth=0pt,
             fillstyle=solid, fillcolor=#3](0,0.26)(1.35,0.26)
    \pspolygon[linewidth=0.08, linecolor=#2,
               cornersize=absolute, linearc=0.05]
    (0,0.2)(1.35,0.2)(1.35,1)(0,1)
    \pspolygon[linewidth=0pt, linestyle=none,
               fillstyle=solid, fillcolor=#2]
    (0.405,0)(0.945,0)(0.825,0.12)(0.525,0.12)
    \rput(0.675,0.6){\psscaleboxto(0,0.35){\textcolor{#2}{\PM@H 01011}}}
  \end{pspicture}%
  \endgroup
}
\newcommand\LogoComputer[3]{%
  \begingroup
  \psset{unit=#1}
  \begin{pspicture}(0,0.26)(1.2,0.26)
    \psframe[linestyle=none, linewidth=0pt,
             fillstyle=solid, fillcolor=#3](0,0.26)(1.2,0.26)
    \pspolygon[linewidth=0.08, linecolor=#2,
               cornersize=absolute, linearc=0.05]
    (0,0.2)(1.2,0.2)(1.2,1)(0,1)
    \pspolygon[linewidth=0pt, linestyle=none,
               fillstyle=solid, fillcolor=#2]
    (0.33,0)(0.87,0)(0.75,0.12)(0.45,0.12)
  \end{pspicture}%
  \endgroup
}
%    \end{macrocode}
% La version 2.26 ajoute le logo pour l'environnement pluloin :
% |\LogoForward|.
%    \begin{macrocode}
\newcommand\LogoForward[3]{%
  \begingroup
  \psset{unit=#1}
  \begin{pspicture}(0,0.15)(1,0.15)
    \psset{linestyle=none, linewidth=0pt,
           fillstyle=solid, fillcolor=#2}
    \pscircle(0.5,0.5){0.5}
    \psset{linestyle=none, fillstyle=solid, fillcolor=#3}
    \def\R{0.22}% Rayon triangles
    \rput(0.28,0.5){\pspolygon(\R;0)(\R;120)(\R;240)}
    \rput(0.67,0.5){\pspolygon(\R;0)(\R;120)(\R;240)}
  \end{pspicture}%
  \endgroup
}
%    \end{macrocode}
% \subsubsection{Environnement de type attention}
% Ils sont interdits en dehors des zones colorées. On garde les noms
% de macro avec Blue même si en fait il va s'agir de rouge !
%    \begin{macrocode}
\newcommand*\PM@WarningLikeBlueBKGList{}
\newlength{\PM@vertical@shift}
%    \end{macrocode}
% On va en fait définir une macro commune puisque qu'à partir de la
% version 2.0, le fait d'afficher sur fond coloré ou non n'affecte que
% la couleur de fond du cadre.
%    \begin{macrocode}
\newcommand\PM@WarningLikeCommon[4]{%
%    \end{macrocode}
% \begin{itemize}
% \item |#1| Nom de l'environnement.
% \item |#2| Commande du logo
% \item |#3| Titre
% \item |#4| Couleur de fond
% \end{itemize}
%    \begin{macrocode}
  \newenvironment{#1}[1][]
    {%
%    \end{macrocode}
% Dans tout l'environnement, à cause des positionnements des
% cartouches, il faut supprimer l'élasticité de l'espace entre les
% paragraphes.
%    \begin{macrocode}
      \parskip 1mm plus\z@
      \gdef\PM@suite{}%
%    \end{macrocode}
% Définition de la commande |\Break| pour cet environnement.
%    \begin{macrocode}
      \def\Break{%
%    \end{macrocode}
% Fin de la coupure.
%    \begin{macrocode}
        \PM@BeforeBreak{lrbox}%
        \par\nobreak
        \pnode(\dimexpr\linewidth-3mm,-0.9\baselineskip){PM@NodeCorr}
        \endminipage
        \end{lrbox}%
        \setlength{\PM@vertical@shift}{-0.5\dp\PM@box+0.5\ht\PM@box}%
        \resetcolorseries[10]{PM@ombre@color}%
        \multido{\dx=0pt+0.25\pslinewidth}{10}{%
%    \end{macrocode}
% |6pt| plus un petit rab pour les épaisseurs de lignes.
%    \begin{macrocode}
          \rput(7pt,-0.4pt){%
            \rput(0.5\wd\PM@box,\PM@vertical@shift){%
              \rput(\dx,-\dx){%
                \psframebox[fillstyle=none,
                            linestyle=solid, framesep=6pt,
                            linecolor=PM@ombre@color!!+]
                  {\phantom{\usebox{\PM@box}}}%
              }
            }
          }
        }%
        \psframebox[linestyle=none, fillstyle=solid,
                    fillcolor=#4,framesep=6pt]{%
            \usebox{\PM@box}%
        }%
%    \end{macrocode}
% Affichage cartouche "..."
%    \begin{macrocode}
        \rput[br](PM@NodeCorr){%
          \psframebox[linecolor=\PM@thumb@dcolor,
            fillstyle=solid, cornersize=absolute, linearc=1.5mm,
            fillcolor=white]{\textbf{\ldots}}
        }
%    \end{macrocode}
% Début de la page suivante.
%    \begin{macrocode}
        \clearpage
        \psframebox[linestyle=none, fillstyle=solid,
                    fillcolor=PM@warning@color]{%
          \color{white}%
          #2\space
          \ifx\relax##1\relax
            {\PM@WarningStarFont \rule{0pt}{9pt}#3\PM@suite}%
          \else
            {\PM@WarningStarFont \rule{0pt}{9pt}#3\PM@suite}%
          \fi
        }
        \gdef\PM@suite{ \PM@smashlp suite\PM@smashrp}%
        \kern-3pt
        \pspolygon[linestyle=none, linewidth=0pt,
          fillstyle=solid, fillcolor=PM@warning@color]
        (0,-0.13)(0.57,-0.13)(0,0.44)
        \par\nobreak\vspace{-4.6pt}
        \begin{lrbox}{\PM@box}%
          \minipage[b]{\linewidth-13.6pt}%
          \PM@AfterBreak
%    \end{macrocode}
% Fin de la commande |\Break|.
%    \begin{macrocode}
      }%
      \par\nobreak\addvspace{\PM@SkipAboveWarning}
      \psframebox[linestyle=none, fillstyle=solid,
                 fillcolor=PM@warning@color]{%
      \color{white}%
      #2\space
      \ifx\relax##1\relax
%    \end{macrocode}
% La version 2.17a permet un sous-titre dans les environnements de
% type Attention.
%    \begin{macrocode}
        {\PM@WarningStarFont \rule{0pt}{9pt}#3\PM@suite}%
      \else
        {\PM@WarningStarFont \rule{0pt}{9pt}#3 : ##1\PM@suite}%
      \fi
    }
    \kern-3pt
    \pspolygon[linestyle=none, linewidth=0pt,
      fillstyle=solid, fillcolor=PM@warning@color]
    (0,-0.13)(0.57,-0.13)(0,0.44)
    \par\nobreak\vspace{-4.6pt}
    \begin{lrbox}{\PM@box}%
      \minipage[b]{\linewidth-13.6pt}%
  }
  {%
      \endminipage
    \end{lrbox}%
    \setlength{\PM@vertical@shift}{-0.5\dp\PM@box+0.5\ht\PM@box}%
    \resetcolorseries[10]{PM@ombre@color}%
    \multido{\dx=0pt+0.25\pslinewidth}{10}{%
%    \end{macrocode}
% |6pt| plus un petit rab pour les épaisseurs de lignes.
%    \begin{macrocode}
      \rput(7pt,-0.4pt){%
        \rput(0.5\wd\PM@box,\PM@vertical@shift){%
          \rput(\dx,-\dx){%
            \psframebox[fillstyle=none,
                        linestyle=solid, framesep=6pt,
                        linecolor=PM@ombre@color!!+]
              {\phantom{\usebox{\PM@box}}}%
          }
        }
      }
    }%
    \psframebox[linestyle=none, fillstyle=solid,
                fillcolor=#4,framesep=6pt]{%
        \usebox{\PM@box}%
    }%
    \par\addvspace{\PM@SkipBelowWarning}
  }%
}
%    \end{macrocode}
% Macro pour les cadres ne pouvant être affiché que sur fond coloré.
%    \begin{macrocode}
\newcommand*\DefineWarningLikeBlueBKG[4]{%
%    \end{macrocode}
% \begin{itemize}
% \item |#1| Nom de l'environnement
% \item |#2| commande du logo
% \item |#3| Titre
% \item |#4| couleur de fond
% \end{itemize}
% Environnement sur fond clair (erreur de compilation)
%    \begin{macrocode}
  \newenvironment{#1@ns}[1][]
    {%
      \ClassError{prepamath}{L'environnement #1 ne peut exister que
        dans les pages sur fond en couleur}{L'environnement #1 est
        interdit dans les pages sur fond blanc. Contactez une personne
        responsable en cas de discussion.}%
    }
    {%
      \aftergroup\ignorespaces
    }
%    \end{macrocode}
% Environnement sur fond coloré.
%    \begin{macrocode}
  \PM@WarningLikeCommon{#1@s}{#2}{#3}{#4}%
%    \end{macrocode}
% Ajout à la liste des environnements
%    \begin{macrocode}
  \xdef\PM@WarningLikeBlueBKGList{\PM@WarningLikeBlueBKGList#1,}%
}
%    \end{macrocode}
% Environnement de type attention interdit en dehors des zones
% blanches.
%    \begin{macrocode}
\newcommand*\PM@WarningLikeWhiteBKGList{}
\newcommand*\DefineWarningLikeWhiteBKG[3]{%
%    \end{macrocode}
% \begin{itemize}
% \item |#1| nom de l'environnement
% \item |#2| commande du logo
% \item |#3| Titre
% \end{itemize}
%    \begin{macrocode}
  \PM@WarningLikeCommon{#1@ns}{#2}{#3}{LR}%
%    \end{macrocode}
% Environnement sur fond coloré (erreur de compilation).
%    \begin{macrocode}
  \newenvironment{#1@s}[1][]
    {%
      \ClassError{prepamath}{L'environnement #1 ne peut exister que
        dans les pages sur fond blanc}{L'environnement #1 est
        interdit dans les pages sur fond bleu. Contactez une personne
        responsable en cas de discussion.}%
    }
    {%
      \aftergroup\ignorespaces
    }
%    \end{macrocode}
% Ajout à la liste des environnements.
%    \begin{macrocode}
  \xdef\PM@WarningLikeWhiteBKGList{\PM@WarningLikeWhiteBKGList#1,}%
}
%    \end{macrocode}
% Environnement de type attention permis partout.
%    \begin{macrocode}
\newcommand*\PM@WarningLikeEveryWhereList{}
\newcommand*\DefineWarningLikeEveryWhere[4]{%
%    \end{macrocode}
% \begin{itemize}
% \item |#1| Nom de l'environnement
% \item |#2| Commande du logo
% \item |#3| Titre
% \item |#4| Couleur de fond sur page avec fond coloré.
% \end{itemize}
%    \begin{macrocode}
  \PM@WarningLikeCommon{#1@ns}{#2}{#3}{LR}%
%    \end{macrocode}
% Environnement sur fond coloré
%    \begin{macrocode}
  \PM@WarningLikeCommon{#1@s}{#2}{#3}{#4}%
%    \end{macrocode}
% Ajout à la liste des environnements.
%    \begin{macrocode}
  \xdef\PM@WarningLikeEveryWhereList{\PM@WarningLikeEveryWhereList#1,}%
}
%    \end{macrocode}
% Met les listes des |WarningLikeBlueBKG|, |WarningLikeWhiteBKG| et
% des |WarningLikeEveryWhere| à jour (|<nom>@s| ou |<nom>@ns| selon le
% cas).
%    \begin{macrocode}
\newcommand*\PM@SetWarningLike{%
  \expandafter\if\csname PM@@thumb\the\PM@thumbcurr\endcsname*\relax
    \def\PM@suffix{@s}%
  \else
    \def\PM@suffix{@ns}%
  \fi
  \expandafter\PM@SWL\PM@WarningLikeWhiteBKGList\@nil,
  \expandafter\PM@SWL\PM@WarningLikeBlueBKGList\@nil,
  \expandafter\PM@SWL\PM@WarningLikeEveryWhereList\@nil,
}
\def\PM@SWL#1,{%
  \def\PM@arg{#1}%
  \ifx\PM@arg\@nnil
  \else
    \expandafter\let\expandafter\PM@tmp\csname#1\PM@suffix\endcsname
    \expandafter\let\csname#1\endcsname\PM@tmp
    \expandafter\let\expandafter\PM@tmp\csname end#1\PM@suffix\endcsname
    \expandafter\let\csname end#1\endcsname\PM@tmp
    \expandafter\PM@SWL
  \fi
}
%    \end{macrocode}
% Idem à ci-dessus mais \og à la main \fg{} au lieu de tester le type
% d'onglet ceci afin de pouvoir avoir le comportement des onglets
% étoilés à l'intérieur de certaines structures (exercice type
% |PM@warning@color| et sa correction) et de revenir à l'état
% habituel.
%    \begin{macrocode}
\newcommand*\PM@SetWarningLikeStar{%
  \edef\PM@save@suffix{\PM@suffix}%
  \def\PM@suffix{@s}%
  \expandafter\PM@SWL\PM@WarningLikeBlueBKGList\@nil,
  \expandafter\PM@SWL\PM@WarningLikeWhiteBKGList\@nil,
  \expandafter\PM@SWL\PM@WarningLikeEveryWhereList\@nil,
}
\newcommand*\PM@RestoreWarningLike{%
  \edef\PM@suffix{\PM@save@suffix}%
  \expandafter\PM@SWL\PM@WarningLikeWhiteBKGList\@nil,
  \expandafter\PM@SWL\PM@WarningLikeBlueBKGList\@nil,
  \expandafter\PM@SWL\PM@WarningLikeEveryWhereList\@nil,
}
%    \end{macrocode}
% Les commandes de déclaration étant faites, on peut maintenant les
% utiliser pour les environnements particuliers.
%
% À Retenir ne pouvait apparaître que sur les pages en fond blanc.
%    \begin{macrocode}
%%%\DefineWarningLikeWhiteBKG{aretenir}{\LogoRightArrow{4mm}{white}{DR}}
%%%                          {\`A RETENIR}
%    \end{macrocode}
% problématique ne pouvait apparaître que sur les pages colorées et a
% un fond blanc.
%    \begin{macrocode}
%%%\DefineWarningLikeBlueBKG{methode}{\LogoBulb{4mm}{white}{DR}}{M\'ETHODE}{white}
%%%\DefineWarningLikeBlueBKG{problematique}{\LogoQuestion{4mm}{white}{DR}}
%%%                         {PROBL\'EMATIQUE}{white}
%    \end{macrocode}
% problematique, attention et aretenir peuvent apparaître partout et
% ont toujours un fond rose.
%    \begin{macrocode}
\DefineWarningLikeEveryWhere{problematique}{\LogoQuestion{4mm}{white}{DR}}
                            {PROBL\'EMATIQUE}{LR}
\DefineWarningLikeEveryWhere{attention}{\LogoExclamation{4mm}{white}{DR}}
                            {ATTENTION}{LR}
\DefineWarningLikeEveryWhere{aretenir}{\LogoRightArrow{4mm}{white}{DR}}
                            {\`A RETENIR}{LR}
%    \end{macrocode}
% La version 2.17 ajoute un environnement anecdote.
%    \begin{macrocode}
\DefineWarningLikeEveryWhere{anecdote}{\LogoAnecdote{4mm}{white}{DR}}
                            {ANECDOTE}{LR}
%    \end{macrocode}
% La version 2.26 ajoute un environnement plusloin.
%    \begin{macrocode}
\DefineWarningLikeEveryWhere{plusloin}{\LogoForward{4mm}{white}{DR}}
                            {POUR ALLER PLUS LOIN}{LR}
%    \end{macrocode}
% methode peut apparaître partout et on a un fond blanc.
%    \begin{macrocode}
\DefineWarningLikeEveryWhere{methode}{\LogoBulb{4mm}{white}{DR}}
                            {M\'ETHODE}{white}
%    \end{macrocode}
% \subsubsection{Autres mises en page}
% Commande |\visavis| pour composer en simili double colonne avec la
% syntaxe :
% \begin{verbatim}
% \visavis[rapport G/D][alignement vertical]
%         {matériel gauche}{matériel droit}
% \end{verbatim}
%    \begin{macrocode}
\newlength{\gouttiere}\setlength{\gouttiere}{1cm}
\newlength{\PM@VaVLeft}
\newlength{\PM@VaVRight}
\newcommand*\visavis[1][0.5]{%
  \setlength{\PM@VaVLeft}{(\linewidth-\gouttiere)*\real{#1}}%
  \setlength{\PM@VaVRight}{\linewidth-\PM@VaVLeft-\gouttiere}%
  \PM@VaV
}
\newcommand\PM@VaV[3][c]{%
  \par\addvspace{\medskipamount}
  \begin{minipage}[#1]{\PM@VaVLeft}%
    #2
  \end{minipage}\hfill
  \begin{minipage}[#1]{\PM@VaVRight}%
    #3
  \end{minipage}%
  \par\addvspace{\medskipamount}
}
\newlength{\PM@SkipAboveExo}
\setlength{\PM@SkipAboveExo}{8mm}
\newlength{\PM@SkipBelowExo}
\setlength{\PM@SkipBelowExo}{4mm}
%    \end{macrocode}
% Décalage gauche du texte des exos (et corrections)
%    \begin{macrocode}
\newenvironment{PM@leftnarrow}
{%
  \nobreak\list{}{%
    \setlength{\topsep}{0pt}%
    \setlength{\leftmargin}{18pt}%
    \setlength{\rightmargin}{0pt}%
    \setlength{\listparindent}{\parindent}%
    \setlength{\itemindent}{\parindent}%
    \setlength{\parsep}{\parskip}%
%    \end{macrocode}
% Hack crado à revoir
%    \begin{macrocode}
    \renewcommand*\makelabel[1]{\kern-10pt\hss}%
  }%
  \item\relax\ignorespaces
}
{\endlist}
%    \end{macrocode}
% \subsubsection{Outils pour la commande \cmd{\Break}}
% Pas de |\Break| n'importe où !
%    \begin{macrocode}
\def\PM@Break{%
  \ClassError{prepamath}{La commande \string\Break\space ne peut
    pas apparaitre ici}
  {La commande \string\Break\space n'est valide que dans les environnements
    exointro, solintro, les blocs de type 'attention', 'theoreme' et
    'aretenir' et l'environnement algorithme.}%
}
\let\Break\PM@Break
%    \end{macrocode}
% Le principe est que |\Break| appelle d'abord |\PM@BeforeBreak| en
% passant l'environnement de stop en paramètre (normalement lrbox mais
% je préfère être prudent). Ensuite, la commande fait ce qu'elle veut
% puis appelle |\PM@AfterBreak| en dernier lieu.
%    \begin{macrocode}
\def\PM@string@enumerate{enumerate}
\def\PM@string@questions{questions}
\def\PM@ResumeCounter{%
  \csname c@\@enumctr\endcsname=\the\csname  c@\@enumctr\endcsname}
\def\PM@noitem{\let\@noitemerr\relax}
\def\PM@BeforeBreak#1{%
%    \end{macrocode}
% |#1| Environnement qui stope l'arrêt des environnements
%    \begin{macrocode}
  \gdef\PM@stop{#1}%
%    \end{macrocode}
% |\PM@AfterBreak| contiendra le code pour réouvrir les
% environnements.
%    \begin{macrocode}
  \gdef\PM@AfterBreak{}%
%    \end{macrocode}
% Appel de la procédure récursive.
%    \begin{macrocode}
  \PM@BeforeBreak@
}
\def\PM@BeforeBreak@{%
  \ifx\@currenvir\PM@stop
%    \end{macrocode}
% Si l'environnement courant est le stop, on arrête les appels
% récursifs.
%    \begin{macrocode}
    \let\next\relax
  \else
%    \end{macrocode}
% Sinon, si c'est |enumerate| ou |questions|, on hacke pour reprendre
% la numérotation (|\PM@ResumeCounter|).
%    \begin{macrocode}
    \ifx\@currenvir\PM@string@enumerate
      \let\PM@AfterEnv\PM@ResumeCounter
    \else\ifx\@currenvir\PM@string@questions
      \let\PM@AfterEnv\PM@ResumeCounter
    \else
%    \end{macrocode}
% Si ce n'est ni |enumerate|, ni |questions|, pas de hack de reprise de
% numérotation.
%    \begin{macrocode}
      \def\PM@AfterEnv{}%
    \fi\fi
%    \end{macrocode}
% On empile le |\begin{environnement}| en cours avec un |\PM@noitem|
% pour pouvoir commencer les environnements de liste avec autre chose
% que |\item|.
%    \begin{macrocode}
    \protected@xdef\PM@AfterBreak{%
      \protect\begin{\@currenvir}%
      \protect\PM@noitem
      \PM@AfterEnv
      \PM@AfterBreak
    }%
%    \end{macrocode}
% On ferme l'environnement courant avant de faire l'appel récursif.
%    \begin{macrocode}
    \def\next{%
      \expandafter\end\expandafter{\@currenvir}%
      \PM@BeforeBreak@
    }%
  \fi
  \next
}
%    \end{macrocode}
% \subsubsection{Exercice type (intro et cours)}
%    \begin{macrocode}
\newcounter{exointro}[chapter]
\newsavebox{\PM@box}
\newenvironment{exointro}[1]
  {%
%    \end{macrocode}
% Dans l'exercice type, on est sur fond coloré, il faut adapter les
% environnements de type Warning pour qu'il ne soient plus eux-mêmes
% sur fond coloré.
%    \begin{macrocode}
    \parskip 1mm plus\z@
    \PM@SetWarningLikeStar
    \par\addvspace{\PM@SkipAboveExo}
    \refstepcounter{exointro}%
%    \end{macrocode}
% L'étiquette suivante sert à que le corrigé fasse référence à la
% page de l'exercice type (et éventuellement à son numéro). Depuis la
% version 2.0 de la classe, il n'y a plus de référence entre exercices
% et corrigés mais on garde quand même le mécanisme à cause du nom de
% lycée qui reste affiché dans le corrigé.
%
% On a bien fait de garder le mécanisme puisqu'il réapparait à la
% version 2.15.
%    \begin{macrocode}
    \label{exointro\thechapter-\the\c@exointro}%
%    \end{macrocode}
% On indique la structure courante pour la liste des objets NathanLive.
%    \begin{macrocode}
    \count@=0\csname nbexointro\thechapter\endcsname\relax
    \ifnum\count@<2
      \edef\PM@CurrStruct{Exercice type}%
    \else
      \edef\PM@CurrStruct{Exercice type \the\c@exointro}%
    \fi
%    \end{macrocode}
% Affichage avec ou sans lien selon l'option de classe |hyperref|. On
% pose une ancre à cet endroit
%    \begin{macrocode}
    \ifPM@hyperref
      \hypertarget{exointro\thechapter-\the\c@exointro}{}%
    \fi
    \write\@mainaux{%
      \string\expandafter
      \string\gdef
      \string\csname\space
        nbexointro\thechapter
      \string\endcsname{\the\c@exointro}%
    }%
%    \end{macrocode}
% La gestion de l'indication (suite) se fait \emph{via} une macro
% dédiée. Celle-ci doit être différentes des autres blocs sécables car
% les exercices d'introduction peuvent contenir ces blocs.
%    \begin{macrocode}
    \gdef\PM@suiteIntro{}%
%    \end{macrocode}
% À partir de la version 2.0, on reprend le nom du lycée dans la
% correction. Il faut donc sauvegarder ce nom. La sauvegarde peut se
% faire sans référence au numéro d'exercice puisque les solutions
% suivent toujours les exercices.
%    \begin{macrocode}
    \gdef\PM@lycee{#1}%
    \pnode(0.75mm,14.4pt){PM@NodeET}%
    \pnode(115mm,14.4pt){PM@NodeLy}%
%    \end{macrocode}
% Commande break
%    \begin{macrocode}
    \def\Break{%
%    \end{macrocode}
% Sauvegarde des environnements.
%    \begin{macrocode}
      \PM@BeforeBreak{lrbox}%
%    \end{macrocode}
% Effectue (presque) le |\end{exointro}|
% Noeud pour cartouche "suite"
%    \begin{macrocode}
      \par\nobreak
      \pnode(\dimexpr\linewidth-3mm,-0.9\baselineskip){PM@NodeCorr}
%    \end{macrocode}
% fermeture boîte
%    \begin{macrocode}
      \endminipage
      \end{lrbox}%
%    \end{macrocode}
% Boîte sur fond coloré (avec ombre)
%    \begin{macrocode}
      \resetcolorseries[10]{PM@ombre@color}
      \multido{\dx=0pt+0.25\pslinewidth}{10}{%
%    \end{macrocode}
% |9pt| plus un petit rab pour les épaisseurs de lignes. Par rapport
% aux versions antérieures à la 2.0, on supprime l'arrondi :
% \begin{verbatim}
% cornersize=absolute, linearc=5mm/1.5mm, 
% \end{verbatim}
% dans les arguments des |\psframebox|
%    \begin{macrocode}
        \rput(10pt,0pt){%
          \rput(0.5\wd\PM@box,-0.5\dp\PM@box){%
            \rput(\dx,-\dx){%
              \psframebox[fillstyle=none,
              linestyle=solid, framesep=9pt, linecolor=PM@ombre@color!!+]
              {\phantom{\usebox{\PM@box}}}%
            }
          }
        }
      }
      \psframebox[fillstyle=solid,
        fillcolor=\PM@thumb@lcolor, linestyle=none, framesep=9pt]
        {\usebox{\PM@box}}%
%    \end{macrocode}
% Affichage cartouche "..."
%    \begin{macrocode}
      \rput[Br](PM@NodeCorr){%
        \psframebox[linecolor=\PM@thumb@dcolor,
          fillstyle=solid, cornersize=absolute, linearc=1.5mm,
          fillcolor=white]{\textbf{\ldots}}}%
      \rput(-0.5pt,\dimexpr-\dp\PM@box-9.5pt){%
        \pspolygon[linestyle=none, linewidth=0pt,
                   fillstyle=solid, fillcolor=LGray]
          (-9pt,0)(-9pt,9pt)(0,9pt)
        \resetcolorseries[10]{PM@ombre@color}%
        \multido{\dx=0.25pt+0.25\pslinewidth,
                 \dy=-0.25pt+-0.25\pslinewidth}{10}{%
          \psline[linestyle=solid, linecolor=PM@ombre@color!!+]
            (-8.75pt,\dy)(\dx,8.75pt)
        }%
        \pspolygon[linestyle=none, linewidth=0pt,
                   fillstyle=solid, fillcolor=white]
          (-8.6pt,-2.5pt)(2.5pt,8.6pt)(2.5pt,-2.5pt)
      }
%    \end{macrocode}
% Affichage cartouche \og Exercice type (suite) \fg{} ou \og
% Exercice type <num> (suite) \fg{}.
%    \begin{macrocode}
      \count@=0\csname nbexointro\thechapter\endcsname\relax
      \ifnum\count@<2
        \def\PM@tmp{}%
      \else
        \def\PM@tmp{\space\the\c@exointro}%
      \fi
%    \end{macrocode}
% Sauvegarde du test pour les mesures de largeur qui vont suivre
% (version 2.13a).
%    \begin{macrocode}
      \setbox2=\hbox{%
        \PM@BlackCartoucheFont
        Exercice type\PM@tmp\PM@suiteIntro
      }%
      \rput[Bl](PM@NodeET){%
        \psframebox[linestyle=none, linewidth=0pt,
          fillstyle=solid, fillcolor=\PM@thumb@dcolor]
        {%
          \textcolor{white}{%
            \PM@BlackCartoucheFont
            Exercice type\PM@tmp\PM@suiteIntro
          }%
        }%
        \kern-0.1pt
        \pspolygon[linestyle=none, linewidth=0pt,
          fillstyle=solid, fillcolor=\PM@thumb@dcolor]
        (0,-0.17)(0.55,-0.17)(0,0.39)
      }%
      \gdef\PM@suiteIntro{ \PM@smashlp suite\PM@smashrp}%
%    \end{macrocode}
% Affichage de l'établissement. Cet affichage ne se fait que s'il n'y
% a pas de télescopage avec le texte \og Exercice type (suite) \fg{}
% (version 2.13a). On garde une sécurité de 30pt.
%    \begin{macrocode}
      \setbox1=\hbox{\PM@WhiteCartoucheFont \PM@lycee}%
      \ifdim\wd1<\dimexpr\linewidth-\wd2-30pt
        \rput[Br](PM@NodeLy){%
          \PM@WhiteCartoucheFont
          \psline[linewidth=1.3ex,linecolor=DY](0,0.65ex)(\wd1,0.65ex)
          \PM@lycee
        }
      \fi
%    \end{macrocode}
% Saut de page et répétition du |\begin{exointro}|.
%    \begin{macrocode}
      \clearpage
      \pnode(0.75mm,14.4pt){PM@NodeET}%
      \pnode(115mm,14.4pt){PM@NodeLy}%
      \begin{lrbox}{\PM@box}%
        \minipage[t]{0pt+\linewidth-6\psframesep-2\pslinewidth}%
        \vspace*{0\medskipamount}%
%    \end{macrocode}
% Rebalance tous les environnements interrompus.
%    \begin{macrocode}
        \PM@AfterBreak
    }%
%    \end{macrocode}
% Code exécuté avant un |\Break| éventuel.
%    \begin{macrocode}
    \begin{lrbox}{\PM@box}%
      \minipage[t]{0pt+\linewidth-6\psframesep-2\pslinewidth}%
      \vspace*{0\medskipamount}%
  }%
  {%
%    \end{macrocode}
% Noeud pour cartouche \og suite \fg{}.
%    \begin{macrocode}
      \par\nobreak
      \pnode(\dimexpr\linewidth-3mm,-0.9\baselineskip){PM@NodeCorr}
%    \end{macrocode}
% Fermeture de la boîte.
%    \begin{macrocode}
    \endminipage
    \end{lrbox}%
%    \end{macrocode}
% Boîte sur fond coloré (avec ombre)
%    \begin{macrocode}
    \resetcolorseries[10]{PM@ombre@color}
    \multido{\dx=0pt+0.25\pslinewidth}{10}{%
      \rput(10pt,0pt){%
        \rput(0.5\wd\PM@box,-0.5\dp\PM@box){%
          \rput(\dx,-\dx){%
            \psframebox[fillstyle=none,
            linestyle=solid, framesep=9pt, linecolor=PM@ombre@color!!+]
            {\phantom{\usebox{\PM@box}}}%
          }
        }
      }
    }
    \psframebox[fillstyle=solid,
      fillcolor=\PM@thumb@lcolor, linestyle=none, framesep=9pt]
      {\usebox{\PM@box}}%
    \rput(-0.5pt,\dimexpr-\dp\PM@box-9.5pt){%
      \pspolygon[linestyle=none, linewidth=0pt,
                 fillstyle=solid, fillcolor=LGray]
        (-9pt,0)(-9pt,9pt)(0,9pt)
      \resetcolorseries[10]{PM@ombre@color}%
      \multido{\dx=0.25pt+0.25\pslinewidth,
               \dy=-0.25pt+-0.25\pslinewidth}{10}{%
        \psline[linestyle=solid, linecolor=PM@ombre@color!!+]
          (-8.75pt,\dy)(\dx,8.75pt)
      }%
      \pspolygon[linestyle=none, linewidth=0pt,
                 fillstyle=solid, fillcolor=white]
        (-8.6pt,-2.5pt)(2.5pt,8.6pt)(2.5pt,-2.5pt)
    }
%    \end{macrocode}
% Affichage cartouche \og Exercice type \fg{} ou \og Exercice type
% <num> \fg{}.
%    \begin{macrocode}
    \count@=0\csname nbexointro\thechapter\endcsname\relax
    \ifnum\count@<2
      \def\PM@tmp{}%
    \else
      \def\PM@tmp{\space\the\c@exointro}%
    \fi
    \setbox2=\hbox{%
      \PM@BlackCartoucheFont
      Exercice type\PM@tmp\PM@suiteIntro
    }%
    \rput[Bl](PM@NodeET){%
      \psframebox[linestyle=none, linewidth=0pt,
        fillstyle=solid, fillcolor=\PM@thumb@dcolor]
      {%
        \textcolor{white}{%
          \PM@BlackCartoucheFont
          Exercice type\PM@tmp\PM@suiteIntro
        }%
      }%
      \kern-0.1pt
      \pspolygon[linestyle=none, linewidth=0pt,
        fillstyle=solid, fillcolor=\PM@thumb@dcolor]
      (0,-0.17)(0.55,-0.17)(0,0.39)
    }%
%    \end{macrocode}
% Affichage cartouche \og Lycée \fg{}.
%    \begin{macrocode}
    \setbox1=\hbox{\PM@WhiteCartoucheFont \PM@lycee}%
    \ifdim\wd1<\dimexpr\linewidth-\wd2-30pt
      \rput[Br](PM@NodeLy){%
        \PM@WhiteCartoucheFont
        \psline[linewidth=1.3ex,linecolor=DY](0,0.65ex)(\wd1,0.65ex)
        \PM@lycee
      }
    \fi
%    \end{macrocode}
% Affichage cartouche référence à la correction
%    \begin{macrocode}
      \rput[Br](PM@NodeCorr){%
        \psframebox[linecolor=\PM@thumb@dcolor,
          fillstyle=solid, cornersize=absolute, linearc=1.5mm,
          fillcolor=white]{%
            \PM@WhiteCartoucheFont
            \ifPM@hyperref
              \hyperlink{corrintro\thechapter-\the\c@exointro}
                        {Voir corrig\'e page~%
                          \pageref*{corrintro\thechapter-\the\c@exointro}}%
            \else
              Voir corrig\'e page~%
              \pageref{corrintro\thechapter-\the\c@exointro}%
            \fi
          }%
        }%
%    \end{macrocode}
% Restauration de |WarningLike|
%    \begin{macrocode}
    \PM@RestoreWarningLike
%    \end{macrocode}
% Ajout d'un petit espace vertical après les énoncés |exointro|
%    \begin{macrocode}
    \par\nobreak\vspace{\medskipamount}
  }
%    \end{macrocode}
% \subsubsection{Solution exercice(s) type}
%    \begin{macrocode}
\newcounter{corrintro}[chapter]
\newenvironment{solintro}
  {%
    \parskip 1mm plus\z@
    \PM@SetWarningLikeStar
    \PM@breakfalse
    \par\addvspace{\PM@SkipAboveExo}
    \pnode(0.75mm,14.4pt){PM@NodeET}%
    \pnode(115mm,14.4pt){PM@NodeLy}%
    \gdef\PM@suiteIntro{}%
    \def\Break{%
%    \end{macrocode}
% Sauvegarde des environnements.
%    \begin{macrocode}
      \PM@BeforeBreak{lrbox}%
%    \end{macrocode}
% Effectue (presque) le |\end{solintro}|
% Noeud pour cartouche "suite"
%    \begin{macrocode}
      \par\nobreak
      \pnode(\dimexpr\linewidth-3mm,-0.9\baselineskip){PM@NodeCorr}
%    \end{macrocode}
% fermeture boîte
%    \begin{macrocode}
      \endminipage
      \end{lrbox}%
%    \end{macrocode}
% cadre avec ombre \ldots
%    \begin{macrocode}
      \resetcolorseries[10]{PM@ombre@color}
      \multido{\dx=0pt+0.25\pslinewidth}{10}{%
%    \end{macrocode}
% |9pt| plus un petit rab pour les épaisseurs de lignes.
%    \begin{macrocode}
        \rput(10pt,0pt){%
          \rput(0.5\wd\PM@box,-0.5\dp\PM@box){%
            \rput(\dx,-\dx){%
              \psframebox[fillstyle=none,
              linestyle=solid, framesep=9pt, linecolor=PM@ombre@color!!+]
              {\phantom{\usebox{\PM@box}}}%
            }
          }
        }
      }
%    \end{macrocode}
% \ldots{} de la solution sur fond coloré
%    \begin{macrocode}
      \psframebox[fillstyle=solid,
        fillcolor=\PM@thumb@lcolor, linestyle=none, framesep=9pt]
        {\usebox{\PM@box}}%
%    \end{macrocode}
% Affichage cartouche "..."
%    \begin{macrocode}
      \rput[Br](PM@NodeCorr){%
        \psframebox[linecolor=\PM@thumb@dcolor,
          fillstyle=solid, cornersize=absolute, linearc=1.5mm,
          fillcolor=white]{\textbf{\ldots}}}%
      \rput(-0.5pt,\dimexpr-\dp\PM@box-9.5pt){%
        \pspolygon[linestyle=none, linewidth=0pt,
                   fillstyle=solid, fillcolor=LGray]
          (-9pt,0)(-9pt,9pt)(0,9pt)
        \resetcolorseries[10]{PM@ombre@color}%
        \multido{\dx=0.25pt+0.25\pslinewidth,
                 \dy=-0.25pt+-0.25\pslinewidth}{10}{%
          \psline[linestyle=solid, linecolor=PM@ombre@color!!+]
            (-8.75pt,\dy)(\dx,8.75pt)
        }%
        \pspolygon[linestyle=none, linewidth=0pt,
                   fillstyle=solid, fillcolor=white]
          (-8.6pt,-2.5pt)(2.5pt,8.6pt)(2.5pt,-2.5pt)
      }
%    \end{macrocode}
% Affichage cartouche \og Solution exercice type \fg{} \og ... \fg{}
% ou \og Solution exercice type <num> \fg{}.
%    \begin{macrocode}
      \count@=0\csname nbexointro\thechapter\endcsname\relax
      \ifPM@break\else
        \refstepcounter{corrintro}%
        \label{corrintro\thechapter-\the\c@corrintro}%
        \ifPM@hyperref
          \hypertarget{corrintro\thechapter-\the\c@corrintro}{}%
        \fi
        \PM@breaktrue
      \fi
      \ifnum\count@<2
        \def\PM@tmp{}%
        \else
        \def\PM@tmp{\space\the\c@corrintro}%
      \fi
      \setbox2=\hbox{%
        \PM@BlackCartoucheFont
        Solution de l'exercice type\PM@tmp
      }%
      \rput[Bl](PM@NodeET){%
        \psframebox[linestyle=none, linewidth=0pt,
        fillstyle=solid, fillcolor=\PM@thumb@dcolor]
        {%
          \textcolor{white}{%
            \PM@BlackCartoucheFont 
            \LogoRightArrow{4mm}{white}{\PM@thumb@dcolor}
            Solution de l'exercice type\PM@tmp
          }%
        }%
        \kern-0.1pt
        \pspolygon[linestyle=none, linewidth=0pt,
          fillstyle=solid, fillcolor=\PM@thumb@dcolor]
        (0,-0.17)(0.55,-0.17)(0,0.385)
      }%
      \gdef\PM@suiteIntro{ \PM@smashlp suite\PM@smashrp}%
%    \end{macrocode}
% Affichage de l'établissement.
%    \begin{macrocode}
      \setbox1=\hbox{\PM@WhiteCartoucheFont \PM@lycee}%
      \ifdim\wd1<\dimexpr\linewidth-\wd2-30pt
        \rput[Br](PM@NodeLy){%
          \PM@WhiteCartoucheFont
          \psline[linewidth=1.3ex,linecolor=DY](0,0.65ex)(\wd1,0.65ex)
          \PM@lycee%
        }
      \fi
%    \end{macrocode}
% Saut de page et répétition du |\begin{solintro}|.
%    \begin{macrocode}
      \clearpage
      \pnode(0.75mm,14.4pt){PM@NodeET}%
      \pnode(115mm,14.4pt){PM@NodeLy}%
      \begin{lrbox}{\PM@box}%
        \minipage[t]{0pt+\linewidth-6\psframesep-2\pslinewidth}%
        \vspace*{0\medskipamount}%
%    \end{macrocode}
% Rebalance tous les environnements interrompus.
%    \begin{macrocode}
        \PM@AfterBreak
    }%
%    \end{macrocode}
% Code exécuté avant un |\Break| éventuel.
%    \begin{macrocode}
    \begin{lrbox}{\PM@box}%
      \minipage[t]{0pt+\linewidth-6\psframesep-2\pslinewidth}%
        \vspace*{0\medskipamount}%
  }%
  {%
%    \end{macrocode}
% Noeud pour cartouche \og suite \fg{}.
%    \begin{macrocode}
      \par\nobreak
      \pnode(\dimexpr\linewidth-3mm,-0.9\baselineskip){PM@NodeCorr}
%    \end{macrocode}
% Fermeture de la boîte.
%    \begin{macrocode}
      \endminipage
    \end{lrbox}%
%    \end{macrocode}
% Cadre avec ombre \ldots
%    \begin{macrocode}
    \resetcolorseries[10]{PM@ombre@color}
    \multido{\dx=0pt+0.25\pslinewidth}{10}{%
%    \end{macrocode}
% |9pt| plus un petit rab pour les épaisseurs de lignes.
%    \begin{macrocode}
      \rput(10pt,0pt){%
        \rput(0.5\wd\PM@box,-0.5\dp\PM@box){%
          \rput(\dx,-\dx){%
            \psframebox[fillstyle=none,
            linestyle=solid, framesep=9pt, linecolor=PM@ombre@color!!+]
            {\phantom{\usebox{\PM@box}}}%
          }
        }
      }
    }
%    \end{macrocode}
% \ldots{} de la solution sur fond coloré.
%    \begin{macrocode}
    \psframebox[fillstyle=solid,
      fillcolor=\PM@thumb@lcolor, linestyle=none, framesep=9pt]
      {\usebox{\PM@box}}%
    \rput(-0.5pt,\dimexpr-\dp\PM@box-9.5pt){%
      \pspolygon[linestyle=none, linewidth=0pt,
                 fillstyle=solid, fillcolor=LGray]
        (-9pt,0)(-9pt,9pt)(0,9pt)
      \resetcolorseries[10]{PM@ombre@color}%
      \multido{\dx=0.25pt+0.25\pslinewidth,
               \dy=-0.25pt+-0.25\pslinewidth}{10}{%
        \psline[linestyle=solid, linecolor=PM@ombre@color!!+]
          (-8.75pt,\dy)(\dx,8.75pt)
      }%
      \pspolygon[linestyle=none, linewidth=0pt,
                 fillstyle=solid, fillcolor=white]
        (-8.6pt,-2.5pt)(2.5pt,8.6pt)(2.5pt,-2.5pt)
    }
%    \end{macrocode}
% Affichage cartouche \og Solution exercice type \fg{} \og ... \fg{}
% ou \og Solution exercice type <num> \fg{}.
%    \begin{macrocode}
    \count@=0\csname nbexointro\thechapter\endcsname\relax
    \ifPM@break\else
      \refstepcounter{corrintro}%
      \label{corrintro\thechapter-\the\c@corrintro}%
      \ifPM@hyperref
        \hypertarget{corrintro\thechapter-\the\c@corrintro}{}%
      \fi
    \fi
    \ifnum\count@<2
      \def\PM@tmp{}%
      \else
      \def\PM@tmp{\space\the\c@corrintro}%
    \fi
    \setbox2=\hbox{%
      \PM@BlackCartoucheFont
      Solution de l'exercice type\PM@tmp\PM@suiteIntro
    }%
    \rput[Bl](PM@NodeET){%
      \psframebox[linestyle=none, linewidth=0pt,
      fillstyle=solid, fillcolor=\PM@thumb@dcolor]
      {%
        \textcolor{white}{%
          \PM@BlackCartoucheFont
          \LogoRightArrow{4mm}{white}{\PM@thumb@dcolor}
          Solution de l'exercice type\PM@tmp\PM@suiteIntro
        }%
      }%
      \kern-0.1pt
      \pspolygon[linestyle=none, linewidth=0pt,
        fillstyle=solid, fillcolor=\PM@thumb@dcolor]
      (0,-0.17)(0.55,-0.17)(0,0.385)
    }%
%    \end{macrocode}
% Affichage de l'établissement.
%    \begin{macrocode}
    \setbox1=\hbox{\PM@WhiteCartoucheFont \PM@lycee}%
    \ifdim\wd1<\dimexpr\linewidth-\wd2-30pt
      \rput[Br](PM@NodeLy){%
        \PM@WhiteCartoucheFont
        \psline[linewidth=1.3ex,linecolor=DY](0,0.65ex)(\wd1,0.65ex)
        \PM@lycee
      }
    \fi
%    \end{macrocode}
% Affichage cartouche référence à l'énoncé
%    \begin{macrocode}
    \count@=0\csname nbexointro\the\c@chapter\endcsname\relax
    \ifnum\count@<2
      \def\PM@tmp{}%
      \else
      \def\PM@tmp{\space\the\c@corrintro}%
    \fi
    \rput[Br](PM@NodeCorr){%
      \psframebox[linecolor=\PM@thumb@dcolor,
        fillstyle=solid, cornersize=absolute, linearc=1.5mm,
        fillcolor=white]
      {\PM@WhiteCartoucheFont
        \ifPM@hyperref
          \hyperlink{exointro\thechapter-\the\c@corrintro}%
                    {Voir \'enonc\'e page~%
                      \pageref*{exointro\thechapter-\the\c@corrintro}}%
        \else
          Voir \'enonc\'e page~%
          \pageref{exointro\thechapter-\the\c@corrintro}%
        \fi
      }
    }
    \PM@RestoreWarningLike
  }
%    \end{macrocode}
% \subsubsection{QCM (partie énoncé)}
%    \begin{macrocode}
\newcounter{exo}[chapter]
\newcounter{correxo}[chapter]
\newcounter{choix}[exo]
\@addtoreset{choix}{correxo}
\renewcommand\thechoix{\alph{choix}}
%    \end{macrocode}
% On distingue l'appel de |\choix| avec ou sans paramètre optionnel.
%    \begin{macrocode}
\newcommand*\choix{%
  \@ifnextchar[{\@choix}{\@@choix}%]
}
\def\@choix[#1]{%
  {%
    \setlength{\fboxsep}{1pt}%
    \setlength{\fboxrule}{0pt}%
    \framebox{%
      \setlength{\fboxsep}{0pt}%
      \setlength{\fboxrule}{0.4pt}%
      \framebox{%
        \vrule width0pt height7pt depth2pt
%    \end{macrocode}
% Dans la version avec paramètre optionnel, on utilise la valeur
% indiquée et il n'y a pas d'espace insécable finale.
%    \begin{macrocode}
        {\PM@ChoiceFont \hbox to 9pt{\hss#1\hss}}%
      }%
    }%
  }%
}
\def\@@choix{%
%    \end{macrocode}
% Dans la version sans paramètre, la valeur est celle du compteur
% |choix| qu'on incrémente au préalable.
%    \begin{macrocode}
  \stepcounter{choix}%
  {%
    \setlength{\fboxsep}{1pt}%
    \setlength{\fboxrule}{0pt}%
    \framebox{%
      \setlength{\fboxsep}{0pt}%
      \setlength{\fboxrule}{0.4pt}%
      \framebox{%
        \vrule width0pt height7pt depth2pt
%    \end{macrocode}
% On affiche le compteur |choix| (en lettre par défaut) et il y a une
% espace insécable terminale.
%    \begin{macrocode}
        {\PM@ChoiceFont \hbox to 9pt{\hss\thechoix\hss}}%
      }%
    }%
  }~%
}

\newcommand*\resetchoix{\setcounter{choix}{0}}
\newcommand*\PM@type{}
\newcommand*\PM@type@vf{V/F}
\newcommand*\PM@type@qcm{QCM}
\newcommand*\PM@type@exo{exo}
\newcommand*\PM@label{exo}
\newcommand*\PM@ref{corr}
\newcommand*\PM@corr@enonce{Corrig\'e}
\newenvironment{qcm}[2]
  {\begin{qcmvf}{#1}{#2}{QCM}}
  {\end{qcmvf}}
\newenvironment{vf}[2]
  {\begin{qcmvf}{#1}{#2}{V/F}}
  {\end{qcmvf}}
\newenvironment{qcmvf}[3]
  {%
%    \end{macrocode}
% \begin{itemize}
% \item |#1| Titre
% \item |#2| Temps
% \item |#3| QCM ou V/F
% \end{itemize}
%    \begin{macrocode}
    \par\addvspace{\PM@SkipAboveExo}
    \refstepcounter{exo}%
%    \end{macrocode}
% Structure courante pour les listes d'objets NathanLive.
%    \begin{macrocode}
    \protected@edef\PM@CurrStruct{#3 \the\c@exo}%
    \label{\PM@label\thechapter-\the\c@exo}%
    \ifPM@hyperref
      \hypertarget{\PM@label\thechapter-\the\c@exo}{}%
    \fi
    \gdef\PM@type{#3}%
    \ifx\relax#1\relax
      \ClassError{prepamath}{Il faut donner un titre au #3}{Le
        premier argument de l'environnement qcm ne doit pas etre
        vide.}%
    \fi
    \gdef\PM@qcmvf@title{#1}%
    \ifx\relax#2\relax
      \ClassError{prepamath}{Il faut donner un temps au #3}{Le
        second argument de l'environnement qcm ne doit pas etre
        vide.}%
    \fi
    \gdef\PM@qcm@time{#2}%
%    \end{macrocode}
% Affichage du numéro d'exercice.
%    \begin{macrocode}
    \psframe*[linecolor=\PM@thumb@dcolor](0pt,0pt)(18pt,20pt)
    \rput[B](9pt,5pt){\PM@ExoNumberFont
                     \textcolor{white}{\theexo}}
%    \end{macrocode}
% À partir de la version 2.0, le type V/F ou QCM est écrit après le
% numéro. Il n'y a pas d'alignement sur la ligne de base pour cet
% élément.
%    \begin{macrocode}
    \psframe*[linecolor=DY](18pt,0pt)(46pt,20pt)
    \rput(32pt,9pt){\PM@QCMFont \textcolor{\PM@thumb@dcolor}{#3}}
%    \end{macrocode}
% Titre de l'exercice
%    \begin{macrocode}
    \rput[Bl](50pt,5pt){\PM@ExoTitleFont
                      \textcolor{\PM@thumb@dcolor}{#1}}
%    \end{macrocode}
% Ligne horizontale de l'exercice.
%    \begin{macrocode}
    \psline[linecolor=\PM@thumb@dcolor,linewidth=0.4pt]
           (18pt,0.5\pslinewidth)(\linewidth,0.5\pslinewidth)
    \rput(\linewidth,0){%
%    \end{macrocode}
% Référence à la page de correction entre deux traits verticaux.
%    \begin{macrocode}
      \psline[linecolor=\PM@thumb@dcolor,linewidth=0.4pt](0,0)(0,18pt)
      \psline[linecolor=\PM@thumb@dcolor,linewidth=0.4pt](-40pt,0)(-40pt,18pt)
      \rput[B](-20pt,12pt){%
        \LogoRightArrow{3mm}{DR}{white}
        \PM@ExoCorrEnFont
        \ifPM@hyperref
          \hyperlink{\PM@ref\thechapter-\the\c@exo}%
                    {\PM@corr@enonce}%
        \else
        \PM@corr@enonce
        \fi
      }
      \rput[B](-20pt,3pt){%
        \PM@ExoRefFont
        \ifPM@hyperref
          \hyperlink{\PM@ref\thechapter-\the\c@exo}
                    {p.~\pageref*{\PM@ref\thechapter-\the\c@exo}}%
        \else
          p.~\pageref{\PM@ref\thechapter-\the\c@exo}%
        \fi
      }
%    \end{macrocode}
% S'il y a un temps et s'il est strictement positif, on l'affiche.
%    \begin{macrocode}
      \ifx\relax#2\relax
      \else
        \ifnum #2 > 0
          \rput[Bl](-70pt,2.5mm){%
            \LogoSemiClock{6mm}{\PM@thumb@lcolor}{\PM@thumb@dcolor}%
            \kern-3.67mm
            \PM@ExoTimeFont #2 min
          }
        \fi
      \fi
    }%
    \par\nobreak
    \PM@leftnarrow\ignorespaces
  }
  {%
    \endPM@leftnarrow
    \par\goodbreak\addvspace{\PM@SkipBelowExo}
  }
%    \end{macrocode}
% QCM avec \og min \fg{} non automatique
%    \begin{macrocode}
\newenvironment{qcmaddmin}[2]
  {\qcm{#1}{#2}}
  {\endqcm}
%    \end{macrocode}
% \subsubsection{Exercices (partie énoncé)}
%    \begin{macrocode}
\newenvironment{exo}[4]
  {%
%    \end{macrocode}
% \begin{itemize}
% \item |#1| Titre
% \item |#2| Lycée ou collège
% \item |#3| Difficulté
% \item |#4| Temps
% \end{itemize}
%    \begin{macrocode}
    \par\addvspace{\PM@SkipAboveExo}
    \refstepcounter{exo}%
    \label{\PM@label\thechapter-\the\c@exo}%
%    \end{macrocode}
% Structure courante pour les listes d'objets NathanLive.
%    \begin{macrocode}
    \edef\PM@CurrStruct{Exercice \the\c@exo}%
    \ifPM@hyperref
      \hypertarget{\PM@label\thechapter-\the\c@exo}{}%
    \fi
    \gdef\PM@type{exo}%
    \ifx\relax#1\relax
      \ClassError{prepamath}{Il faut donner un titre aux exercice}{Le
        premier argument de l'environnement exo ne doit pas être
        vide.}%
    \fi
    \gdef\PM@exo@title{#1}%
    \ifx\relax#2\relax
      \ClassError{prepamath}{Il faut donner un etablissement aux exercices}{Le
        second argument de l'environnement exo ne doit pas être
        vide.}%
    \fi
    \gdef\PM@exo@lycee{#2}%
    \ifx\relax#3\relax
      \ClassError{prepamath}{Il faut donner une difficulte aux exercices}{Le
        troisieme argument de l'environnement exo ne doit pas etre
        vide.}%
    \else\ifnum#3=0
      \ClassError{prepamath}{La difficulte des exercices doit etre
        strictement positive}{La difficulte est comprise entre 1 et 3.}%
    \fi\fi
    \gdef\PM@exo@diff{#3}%
    \ifx\relax#4\relax
      \ClassError{prepamath}{Il faut donner un temps aux exercices}{Le
        quatrieme argument de l'environnement exo ne doit pas etre
        vide.}%
    \fi
    \gdef\PM@exo@time{#4}%
%    \end{macrocode}
% Numéro d'exercice.
%    \begin{macrocode}
    \psframe*[linecolor=\PM@thumb@dcolor](0pt,0)(18pt,20pt)
    \rput[B](9pt,5pt){\PM@ExoNumberFont
                     \textcolor{white}{\theexo}}
%    \end{macrocode}
% Titre de l'exercice.
%    \begin{macrocode}
    \rput[Bl](25pt,5pt){\PM@ExoTitleFont
                      \textcolor{\PM@thumb@dcolor}{#1}}
%    \end{macrocode}
% Ligne horizontale de l'exercice.
%    \begin{macrocode}
    \psline[linecolor=\PM@thumb@dcolor,linewidth=0.4pt]
           (18pt,0.5\pslinewidth)(\linewidth,0.5\pslinewidth)
%    \end{macrocode}
% Nom de l'établissement.
%    \begin{macrocode}
    \setbox1=\hbox{\PM@ExoSchoolFont #2}%
    \rput[l](25pt,-7.5pt){%
      \PM@ExoSchoolFont
      \psline[linewidth=1.3ex,linecolor=DY](0,0.65ex)(\wd1,0.65ex)
      #2%
    }
    \rput(\linewidth,0){%
%    \end{macrocode}
% Référence à la page de correction entre deux traits verticaux.
%    \begin{macrocode}
      \psline[linecolor=\PM@thumb@dcolor,linewidth=0.4pt](0,0)(0,18pt)
      \psline[linecolor=\PM@thumb@dcolor,linewidth=0.4pt](-40pt,0)(-40pt,18pt)
      \rput[B](-20pt,12pt){%
        \LogoRightArrow{3mm}{DR}{white}
        \PM@ExoCorrEnFont
        \ifPM@hyperref
          \hyperlink{\PM@ref\thechapter-\the\c@exo}%
                    {\PM@corr@enonce}%
        \else
          \PM@corr@enonce
        \fi
      }
      \rput[B](-20pt,3pt){%
        \PM@ExoRefFont
        \ifPM@hyperref
          \hyperlink{\PM@ref\thechapter-\the\c@exo}
                    {p.~\pageref*{\PM@ref\thechapter-\the\c@exo}}%
        \else
          p.~\pageref{\PM@ref\thechapter-\the\c@exo}%
        \fi
      }
%    \end{macrocode}
% S'il y a un temps et s'il est strictement positif, on l'affiche.
%    \begin{macrocode}
      \ifx\relax#4\relax
      \else
        \ifnum #4 > 0
          \rput[Bl](-70pt,2.5mm){%
            \LogoSemiClock{6mm}{\PM@thumb@lcolor}{\PM@thumb@dcolor}%
            \kern-3.67mm
            \PM@ExoTimeFont #4 min
          }
        \fi
      \fi
%    \end{macrocode}
% Cadre coloré pour les étoiles de difficultés
%    \begin{macrocode}
      \ifnum#3>-1
        \psframe*[linecolor=\PM@thumb@lcolor, linewidth=0pt]
                 (-80pt,3pt)(-113pt,15pt)
      \fi
      \ifnum#3>0
        \rput(-106.5pt,9pt){\textcolor{\PM@thumb@dcolor}{\LARGE$\star$}}
      \fi
      \ifnum#3>1
        \rput(-96.5pt,9pt){\textcolor{\PM@thumb@dcolor}{\LARGE$\star$}}
      \fi
      \ifnum#3>2
        \rput(-86.5pt,9pt){\textcolor{\PM@thumb@dcolor}{\LARGE$\star$}}
      \fi
    }%
%    \end{macrocode}
% La version 2.23 traite différemment le nom de lycée |\null|.
%    \begin{macrocode}
    \ifx\null#2
      \par\nobreak\kern-6pt
    \else
      \par\nobreak\kern6pt
    \fi
    \PM@leftnarrow
  }
  {%
    \endPM@leftnarrow
    \par\goodbreak\addvspace{\PM@SkipBelowExo}
  }
\newenvironment{exointroalgo}[1]
  {%
%    \end{macrocode}
% \begin{itemize}
% \item |#1| Titre
% \item |#2| Lycée
% \item |#3| Difficulté
% \item |#4| Temps
% \end{itemize}
%    \begin{macrocode}
    \par\addvspace{\PM@SkipAboveExo}
    \refstepcounter{exo}%
%    \end{macrocode}
% Structure courante pour les listes d'objets NathanLive.
%    \begin{macrocode}
    \edef\PM@CurrStruct{Exercice \the\c@exo}%
    \label{\PM@label\thechapter-\the\c@exo}%
    \ifPM@hyperref
      \hypertarget{\PM@label\thechapter-\the\c@exo}{}%
    \fi
    \gdef\PM@type{exo}%
    \gdef\PM@exo@lycee{}
    \ifx\relax#1\relax
      \ClassError{prepamath}{Il faut donner un titre aux exercice}{Le
        premier argument de l'environnement exo ne doit pas etre
        vide.}%
    \fi
    \gdef\PM@exo@title{#1}%
    \psframe*[linecolor=PM@grayitem@color](0pt,0)(18pt,20pt)
    \rput[B](9pt,5pt){\PM@ExoNumberFont
                     \textcolor{white}{\theexo}}
    \rput[Bl](25pt,5pt){\PM@ExoTitleFont
                      \textcolor{PM@blueitem@color}{#1}}
    \psline[linecolor=black,linewidth=0.4pt]
           (18pt,0.5\pslinewidth)(\linewidth,0.5\pslinewidth)
    \psline[linecolor=black,linewidth=0.4pt]
           (17.8pt,0)(17.8pt,-15pt)
    \rput(\linewidth,0){%
      \psline[linecolor=black,linewidth=0.4pt](0,0)(0,18pt)
      \psline[linecolor=black,linewidth=0.4pt](-36pt,0)(-36pt,18pt)
      \rput[B](-18pt,12pt){%
        \PM@ExoCorrEnFont
        \ifPM@hyperref
          \hyperlink{\PM@ref\thechapter-\the\c@exo}%
                    {\PM@corr@enonce}%
        \else
          \PM@corr@enonce
        \fi
      }
      \rput[B](-18pt,3pt){\PM@ExoRefFont
        \ifPM@hyperref
          \hyperlink{\PM@ref\thechapter-\the\c@exo}%
                    {p.~\pageref*{\PM@ref\thechapter-\the\c@exo}}%
        \else
          p.~\pageref{\PM@ref\thechapter-\the\c@exo}%
        \fi
      }  
    }
    \par\nobreak\kern6pt
    \PM@leftnarrow
  }
  {%
    \endPM@leftnarrow
    \par\goodbreak\addvspace{\PM@SkipBelowExo}
  }
%    \end{macrocode}
% exo avec \og min. \fg{} non automatique
%    \begin{macrocode}
\newenvironment{exoaddmin}[4]
  {\exo{#1}{#2}{#3}{#4}}
  {\endexo}
%    \end{macrocode}
% En UTF-8, il faut désactiver les caractères au-delà du code 127 lors
% de l'écriture dans un fichier externe. Ce code servira dans les
% environnements Verbatim d'écriture des solutions ci-dessous.
%    \begin{macrocode}
\newcommand\killienc{}
\count@128
\@whilenum\count@<\@cclvi\do{%
  \edef\killienc{\killienc\catcode\the\count@=12}%
  \advance\count@\@ne}
%    \end{macrocode}
% Exercices bac blanc
%    \begin{macrocode}
\newsavebox{\PM@BoxSubTitle}
\newenvironment{exobb}[4]
  {%
%    \end{macrocode}
% \begin{itemize}
% \item |#1| Titre
% \item |#2| Sous-titre
% \item |#3| Difficulté
% \item |#4| Temps
% \end{itemize}
%    \begin{macrocode}
    \par\addvspace{\PM@SkipAboveExo}
    \refstepcounter{exo}%
    \label{\PM@label\thechapter-\the\c@exo}%
%    \end{macrocode}
% Structure courante pour les listes d'objets NathanLive.
%    \begin{macrocode}
    \edef\PM@CurrStruct{Exercice \the\c@exo}%
    \ifPM@hyperref
      \hypertarget{\PM@label\thechapter-\the\c@exo}{}%
    \fi
    \gdef\PM@exo@title{#1}%
    \gdef\PM@exo@subtitle{#2}%
    \gdef\PM@exo@point{#3}%
    \gdef\PM@exo@time{#4}%
    \psframe*[linecolor=\PM@thumb@dcolor](0pt,0)(18pt,20pt)
    \rput[B](9pt,5pt){\PM@ExoNumberFont
                     \textcolor{white}{\theexo}}
    \rput[Bl](25pt,5pt){%
      \PM@ExoTitleFont
      \textcolor{\PM@thumb@dcolor}{#1}%
    }
    \rput[l](25pt,-7.5pt){\PM@ExoSchoolFont #2}
    \psline[linecolor=\PM@thumb@dcolor,linewidth=0.4pt]
           (18pt,0.5\pslinewidth)(\linewidth,0.5\pslinewidth)
%    \end{macrocode}
% La ligne de sous titre n'est présente que si la largeur du sous
% titre est non nulle (ajout version 2.26). Il faut regarder la
% largeur car la macro est appelée par |\corrigebb| qui envoie une
% macro comme paramètre.
%    \begin{macrocode}
    \setbox\PM@BoxSubTitle=\hbox{#2}%
    \ifdim\wd\PM@BoxSubTitle=0pt
    \else
      \psline[linecolor=\PM@thumb@dcolor,linewidth=0.4pt]
             (17.8pt,0)(17.8pt,-15pt)
    \fi
    \rput(\linewidth,0){%
      \psline[linecolor=\PM@thumb@dcolor,linewidth=0.4pt](0,0)(0,18pt)
      \psline[linecolor=\PM@thumb@dcolor,linewidth=0.4pt](-40pt,0)(-40pt,18pt)
      \rput[B](-20pt,12pt){%
        \LogoRightArrow{3mm}{DR}{white}
        \PM@ExoCorrEnFont
        \ifPM@hyperref
          \hyperlink{\PM@ref\thechapter-\the\c@exo}
                    {\PM@corr@enonce}%
        \else
          \PM@corr@enonce
        \fi
      }
      \rput[B](-18pt,3pt){\PM@ExoRefFont
        \ifPM@hyperref
          \hyperlink{\PM@ref\thechapter-\the\c@exo}
                    {p.~\pageref*{\PM@ref\thechapter-\the\c@exo}}%
        \else
          p.~\pageref{\PM@ref\thechapter-\the\c@exo}%
        \fi
      }
%    \end{macrocode}
% Cadre coloré pour les étoiles de difficultés.
%    \begin{macrocode}
      \ifnum#3>-1
        \psframe*[linecolor=\PM@thumb@lcolor, linewidth=0pt]
                 (-80pt,3pt)(-113pt,15pt)
      \fi
      \ifnum#3>0
        \rput(-106.5pt,9pt){\textcolor{\PM@thumb@dcolor}{\LARGE$\star$}}
      \fi
      \ifnum#3>1
        \rput(-96.5pt,9pt){\textcolor{\PM@thumb@dcolor}{\LARGE$\star$}}
      \fi
      \ifnum#3>2
        \rput(-86.5pt,9pt){\textcolor{\PM@thumb@dcolor}{\LARGE$\star$}}
      \fi
%    \end{macrocode}
% S'il y a un temps et s'il est strictement positif, on l'affiche.
%    \begin{macrocode}
      \ifx\relax#4\relax
      \else
        \ifnum #4 > 0
          \rput[Bl](-70pt,2.5mm){%
            \LogoSemiClock{6mm}{\PM@thumb@lcolor}{\PM@thumb@dcolor}%
            \kern-3.67mm
            \PM@ExoTimeFont #4 min
          }
        \fi
      \fi
    }%
    \par\nobreak
    \ifdim\wd\PM@BoxSubTitle=0pt
      \kern-6pt
    \else
      \kern6pt
    \fi
    \begingroup
    \PM@leftnarrow\ignorespaces
  }
  {%
    \endPM@leftnarrow
    \endgroup
    \par\addvspace{\PM@SkipBelowExo}
  }
%    \end{macrocode}
% \subsubsection{Corrections}
% Corrections des QCM et exercices des chapitres normaux.
%    \begin{macrocode}
\newenvironment{corrige}
  {%
    \ifx\PM@type\PM@type@exo
%    \end{macrocode}
% Structure courante pour les listes d'objets NathanLive.
%    \begin{macrocode}
      \edef\PM@CurrStruct{Exercice \the\c@exo}%
      \expandafter\protected@xdef
        \csname PM@head\thechapter-\the\c@exo\endcsname{%
%    \end{macrocode}
% Les derniers |-1| pour le temps et la difficulté (pas d'affichage).
%    \begin{macrocode}
        {E}{\PM@exo@title}{\PM@exo@lycee}{-1}{-1}%
      }%
    \else\ifx\PM@type\PM@type@qcm
%    \end{macrocode}
% Structure courante pour les listes d'objets NathanLive.
%    \begin{macrocode}
      \edef\PM@CurrStruct{QCM \the\c@exo}%
      \expandafter\protected@xdef
        \csname PM@head\thechapter-\the\c@exo\endcsname{%
        {Q}{\PM@qcmvf@title}{-1}{-1}{-1}%
      }%
    \else\ifx\PM@type\PM@type@vf
%    \end{macrocode}
% Structure courante pour les listes d'objets NathanLive.
%    \begin{macrocode}
      \edef\PM@CurrStruct{V/F \the\c@exo}%
      \expandafter\protected@xdef
        \csname PM@head\thechapter-\the\c@exo\endcsname{%
        {V}{\PM@qcmvf@title}{-1}{-1}{-1}%
      }%
    \else
      \ClassError{prepamath}{Erreur de type d'exo}{Plaignez-vous
        aupres de l'auteur de la classe.}%
    \fi\fi\fi
    \killienc
    \VerbatimEnvironment
    \begin{VerbatimOut}{corr\thechapter-\the\c@exo}}
  {%
    \end{VerbatimOut}
  }
\newcommand\AfficheCorrige{%
  \renewcommand*\PM@label{corr}%
  \renewcommand*\PM@ref{exo}%
  \renewcommand*\PM@corr@enonce{\'Enonc\'e}%
  \edef\exomax{\the\c@exo}%
  \global\c@exo=\z@
  \multido{\nexo=1+1}{\exomax}{%
    \expandafter\PM@get@param\csname PM@head\thechapter-\nexo\endcsname
    \ifx\PM@type\PM@type@exo
    \begin{exo}{\PM@title}{\PM@lycee}{\PM@diff}{\PM@time}
      \input{corr\thechapter-\nexo}%
    \end{exo}
    \else\ifx\PM@type\PM@type@qcm
    \begin{qcm}{\PM@title}{\PM@time}
      \input{corr\thechapter-\nexo}%
    \end{qcm}
    \else
    \begin{vf}{\PM@title}{\PM@time}
      \input{corr\thechapter-\nexo}%
    \end{vf}
    \fi\fi
  }%
  \renewcommand*\PM@label{exo}%
  \renewcommand*\PM@ref{corr}%
  \renewcommand*\PM@corr@enonce{Corrig\'e}%
}
\newcommand*\PM@get@param[1]{%
  \expandafter\PM@get@@param#1%
}
\newcommand*\PM@get@@param[5]{%
  \if#1E%
    \def\PM@type{exo}%
    \def\PM@title{#2}%
    \def\PM@lycee{#3}%
    \def\PM@diff{#4}%
    \def\PM@time{#5}%
  \else\if#1Q%
    \def\PM@type{QCM}%
    \def\PM@title{#2}%
    \def\PM@time{#3}%
  \else\if#1V%
    \def\PM@type{V/F}%
    \def\PM@title{#2}%
    \def\PM@time{#3}%
  \else
    \ClassError{prepamath}{Erreur de type d'exo}{Plaignez-vous
      aupres de l'auteur de la classe.}%
  \fi\fi\fi
}
%    \end{macrocode}
% Corrections des exercices du bac blanc
%    \begin{macrocode}
\newenvironment{corrigebb}
  {%
    \expandafter\protected@xdef
    \csname PM@headbb-\the\c@exo\endcsname{%
%    \end{macrocode}
% Les derniers |-1| pour le barême et le temps (pas d'affichage).
%    \begin{macrocode}
      {\PM@exo@title}{\PM@exo@subtitle}{-1}{-1}%
    }%
    \killienc
    \VerbatimEnvironment
    \begin{VerbatimOut}{corrbb-\the\c@exo}}
  {%
    \end{VerbatimOut}
  }
\newcommand\AfficheCorrigeBB{%
  \renewcommand*\PM@label{corr}%
  \renewcommand*\PM@ref{exo}%
  \renewcommand*\PM@corr@enonce{\'Enonc\'e}%
  \edef\exomax{\the\c@exo}%
  \global\c@exo=\z@
  \multido{\nexo=1+1}{\exomax}{%
    \expandafter\PM@get@parambb\csname PM@headbb-\nexo\endcsname
    \begin{exobb}{\PM@title}{\PM@subtitle}{\PM@point}{\PM@time}
      \input{corrbb-\nexo}%
    \end{exobb}
  }%
  \renewcommand*\PM@label{exo}%
  \renewcommand*\PM@ref{corr}%
  \renewcommand*\PM@corr@enonce{Corrig\'e}%
}
\newcommand*\PM@get@parambb[1]{%
  \expandafter\PM@get@@parambb#1%
}
\newcommand*\PM@get@@parambb[4]{%
  \def\PM@title{#1}%
  \def\PM@subtitle{#2}%
  \def\PM@point{#3}%  
  \def\PM@time{#4}%  
}
%    \end{macrocode}
% \subsubsection{Commandes NathanLive}
% La version 2.28 de la classe a introduit des commandes pour gérer
% les renvois sur des médias électroniques de Nathan.
%
% On trouve d'abord le sigle général d'un renvoi sur Internet avec le
% sigle NathanLive.
%
% Pour l'instant, tous les pictogrammes partagent la même largeur. On
% la place dans un registre de longueur à part. Il y aura également un
% décalage vers le bas (une profondeur).
%    \begin{macrocode}
\newlength{\PictoWidth}
\setlength{\PictoWidth}{5mm }
\newlength{\PictoDepth}
\setlength{\PictoDepth}{1mm }
\newlength{\PictoHeight}
\newsavebox{\PictoBox}
%    \end{macrocode}
% On va avoir besoin de la hauteur des pictogramme pour réserver la
% place verticale nécessaire lorsqu'on ne les affiche pas. Pour cela,
% on va construire une boîte contenant ce picto et faire des calculs
% de longueur dessus. Il faudra retarder ce calcul car le répertoire
% de recherche des images est typiquement indiqué au niveau du
% préambule.
%    \begin{macrocode}
\AtBeginDocument{%
  \setbox0=\hbox{\includegraphics[width=\PictoWidth]{PictoVideo}}%
  \setlength{\PictoHeight}{\dimexpr\ht0-\PictoDepth}%
}
%    \end{macrocode}
% Tous ces pictogrammes nécessitent un petit travail de boîte pour
% leur donner une profondeur de 1mm. On va créer une macro de
% déclaration pour gérer cela de façon automatique.
%
% Lorsqu'on emploie le pictogramme NathanLive directement dans le
% texte, il faut prévoir un argument optionnel pour indiquer une
% entrée dans la liste des objets NathanLive.
%    \begin{macrocode}
\newcommand*\DeclarePicto[1]{%
  \expandafter\newcommand\csname Picto#1\endcsname[1][]{%
    \raisebox{-\PictoDepth}{%
      \includegraphics[width=\PictoWidth]{Picto#1}%
    }%
    \def\PM@arg{##1}%
    \ifx\PM@arg\empty
    \else
      \refstepcounter{Counter##1}%
      \label{NL-##1\csname theCounter##1\endcsname}%
    \fi
  }%
}
%    \end{macrocode}
% Les quatre pictogrammes des quatre catégories
% actuelles de liens Nathan sont définis \emph{via} la commande
% |\DeclareNL|. Il n'y a donc pas à redéclarer ces quatre
% commandes. Seule le picto NathanLive lui-même n'existe pas encore.
%    \begin{macrocode}
\DeclarePicto{NathanLive}
%    \end{macrocode}
% La commande suivante va avoir vbesoin d'une gestion des commandes
% étoilées. On met en place ce mécanisme général ici.
%    \begin{macrocode}
\newif\if@star
\def\@star@or@not#1{%
  \@ifstar{\@startrue#1}
  {\@starfalse#1}%
}
%    \end{macrocode}
% Toutes les macros de gestion de ces éléments particuliers obéissent
% au même comportement de base, on va donc définir une commande de
% déclaration globale.
%
% Le premier argument est le nom de la catégorie (première lettre
% capitale).
%
% Le second argument est le texte qui sera composé par défaut si on ne
% précise pas l'argument optionnel.
%
% Le troisième argument est le mot qui suit \og Liste des \fg{} dans
% la commande |\ListOfXxx|.
%    \begin{macrocode}
\newcommand*\DeclareNL[3]{%
%    \end{macrocode}
% On créer la commande de pictogramme
%    \begin{macrocode}
  \DeclarePicto{#1}%
%    \end{macrocode}
% On place le texte par défaut dans la macro correspondante
%    \begin{macrocode}
  \@namedef{NathanLive#1TextDefault}{#2}%
%    \end{macrocode}
% La macro générale a besoin d'un compteur propre. On le déclare ici.
%    \begin{macrocode}
  \newcounter{Counter#1}
%    \end{macrocode}
% On peut alors définir la macro d'appel : elle commence par s'ccuper
% de la gestion e la présence d'une étoile ou non.
%    \begin{macrocode}
  \expandafter
  \newcommand\csname NathanLive#1\endcsname{%
    \@star@or@not{\csname @NathanLive#1\endcsname}%
  }
%    \end{macrocode}
% On définit ensuite la macro principale de placement du pictogramme
% Le premier argument (optionnel) est le texte à écrire dans le
% document.
%
% Le deuxième argument (obligatoire) est le texte pour la liste de
% cette catégorie (ListOfXxx)
%
% Le troisième argument (obligatoire mais pouvant être vide) est l'URL
% pour un lien éventuel.
%    \begin{macrocode}
  \expandafter
  \newcommand\csname @NathanLive#1\endcsname[3]
             [\csname NathanLive#1TextDefault\endcsname]{%
%    \end{macrocode}
% On commence un nouveau paragraphe et on place une étiquette qui
% servira pour la liste des xxx.
%    \begin{macrocode}
    \par\nobreak
    \refstepcounter{Counter#1}
    \label{NL-#1\csname theCounter#1\endcsname}
%    \end{macrocode}
% On place ensuite le texte dans le document principal, éventuelleent
% sous forme d'un appel à une URL en cas de composition avec l'option
% |hyperref|.
%    \begin{macrocode}
    \ifPM@hyperref
      \ifx\relax##3\relax
        \if@star
          \csname Picto#1\endcsname~%
        \else
          \leavevmode
          \vrule width0pt height\PictoHeight depth \PictoDepth
          \relax
        \fi
        {\PM@NLFont ##1}%
      \else
        \if@star
          \href{##3}{%
            \csname Picto#1\endcsname~{\PM@NLFont ##1}%
          }%
        \else
          \href{##3}{%
            \leavevmode
            \vrule width0pt height\PictoHeight depth \PictoDepth
            {\PM@NLFont ##1}%
          }%
        \fi
      \fi
    \else
      \if@star
        \csname Picto#1\endcsname~
      \else
        \leavevmode
        \vrule width0pt height\PictoHeight depth \PictoDepth
        \relax
      \fi
      {\PM@NLFont ##1}%
    \fi
%    \end{macrocode}
% Enfin, on place une entrée dans la liste des xxx.
%    \begin{macrocode}
    \addtocontents{#1}{%
      \protect\NLList{Chapitre \thechapter}%
                     {\PM@CurrStruct}%
                     {##2}%
                     {NL-#1\csname theCounter#1\endcsname}%
    }%
    \Par
  }
%    \end{macrocode}*
% Il reste maintenant à définir la macro composant la liste des objets
% de la catégorie.
%    \begin{macrocode}
  \expandafter\newcommand\csname ListOf#1\endcsname[1]{%
    \simplechapter{Liste des #3}
    \par\vspace{\baselineskip}
    {\bfseries \NLList{}{}{}{}}
    \par\vspace{2\baselineskip}
    \begingroup
      \ifPM@hyperref
        \hypersetup{%
          linkbordercolor=white,
          citebordercolor=white,
          filebordercolor=white,
          urlbordercolor=white
        }%
      \fi
      \@starttoc{#1}
      \par\vspace{\stretch{1}}
      \begin{center}
        ##1
      \end{center}
    \endgroup
  }
}
%    \end{macrocode}
% La mise en page des listes utilisent la macro générique |\NLList|
%    \begin{macrocode}
\newcommand*\NLList[4]{%
  \def\PM@arg{#1}%
  \ifx\PM@arg\empty
    \begin{minipage}[t]{2cm}
      \textcolor{DR}{Chapitre}%
    \end{minipage}%
    \begin{minipage}[t]{\linewidth-4cm}
      \textbf{Titre}
    \end{minipage}%
    \begin{minipage}[t]{2cm}
      \centering
      \textbf{Page}
    \end{minipage}
  \else
%    \end{macrocode}
% On est dans une vraie référence. Il faut tester si le deuxième
% argument est vide ce qui signifie une utilisation dans
% l'avant-propos.
%    \begin{macrocode}
    \def\PM@arg{#2}%
    \ifx\PM@arg\empty
      \ifPM@hyperref
        \hyperref[#4]{%
          \begin{minipage}[t]{2cm}
            \textcolor{DR}{Avant-propos}%
          \end{minipage}%
          \begin{minipage}[t]{\linewidth-4cm}
            \raggedright
            #3~\dotfill
            \rlap{\hbox to2cm{%
                \hss
                \bfseries
                \PM@pageref{#4}{\PM@scratch}\PM@scratch
                \hss
              }%
            }%
          \end{minipage}%
        }
      \else
        \begin{minipage}[t]{2cm}
          \textcolor{DR}{Avant-propos}%
        \end{minipage}%
        \begin{minipage}[t]{\linewidth-4cm}
          \raggedright
          #3~\dotfill
          \rlap{\hbox to2cm{%
              \hss
              \bfseries
              \pageref{#4}%
              \hss
            }%
          }%
        \end{minipage}%
      \fi
    \else
      \ifPM@hyperref
        \hyperref[#4]{%
          \begin{minipage}[t]{2cm}
            \textcolor{DR}{#1}%
          \end{minipage}%
          \begin{minipage}[t]{\linewidth-4cm}
            \raggedright
            \textbf{#2 : }#3~\dotfill
            \rlap{\hbox to2cm{%
                \hss
                \bfseries
                \PM@pageref{#4}{\PM@scratch}\PM@scratch
                \hss
              }%
            }%
          \end{minipage}%
        }
      \else
        \begin{minipage}[t]{2cm}
          \textcolor{DR}{#1}%
        \end{minipage}%
        \begin{minipage}[t]{\linewidth-4cm}
          \raggedright
          \textbf{#2 : }#3~\dotfill
          \rlap{\hbox to2cm{%
              \hss
              \bfseries
              \pageref{#4}%
              \hss
            }%
          }%
        \end{minipage}%
      \fi
    \fi
    \par\medskip
  \fi
}
%    \end{macrocode}
% Une fois que la macro de déclaration a été définie, on peut
% l'utiliser pour définir les quatre catégories.
%    \begin{macrocode}
\DeclareNL{Audio}{Retrouvez le son dont il est question dans cet
  exercice}{extraits sonores}
\DeclareNL{Prog}{Retrouvez ce programme en ligne}{programmes}
\DeclareNL{Video}{Retrouvez le corrig\'e de cet exercice en vid\'eo}{vid\'eos}
\DeclareNL{Web}{Retrouvez le site web}{adresses web}
%    \end{macrocode}
% Il existe également une commande hors-maquette qui permet d'avoir la
% liste de tous les pages où figure un renvoi Nathan Live.
%    \begin{macrocode}
\newcommand*\printNL{%
  \clearpage
  \begin{center}
    \large\textbf{Liste des pages o\`u figure un renvoi Nathan Live}
  \end{center}
  \par
  \ifnum\theCounterVideo>\z@
    \sectionnn{Liste des vid\'eos}
    \begin{multicols}{3}
      \multido{\i=1+1}{\theCounterVideo}{%
        Page \pageref{NL-Video\i}\endgraf
      }
    \end{multicols}
  \fi
  \ifnum\theCounterProg>\z@
    \sectionnn{Liste des programmes}
    \begin{multicols}{3}
      \multido{\i=1+1}{\theCounterProg}{%
        Page \pageref{NL-Prog\i}\endgraf
      }
    \end{multicols}
  \fi
  \ifnum\theCounterAudio>\z@
    \sectionnn{Liste des fichiers audio}
    \begin{multicols}{3}
      \multido{\i=1+1}{\theCounterAudio}{%
        Page \pageref{NL-Audio\i}\endgraf
      }
    \end{multicols}
  \fi
  \ifnum\theCounterWeb>\z@
    \sectionnn{Liste des renvois Web}
    \begin{multicols}{3}
      \multido{\i=1+1}{\theCounterWeb}{%
        Page \pageref{NL-Web\i}\endgraf
      }
    \end{multicols}
  \fi
}
%    \end{macrocode}
% On a la même commande mais pour un export de ces données sous forme
% d'un fichier externe. L'argument optionnel indique le nom du fichier
%    \begin{macrocode}
\newwrite\PM@fileNL
\newcommand*\exportNL[1][\jobname.nl]{%
  \immediate\openout\PM@fileNL=#1
  \ifnum\theCounterVideo>\z@
    \immediate\write\PM@fileNL{----------------}%
    \immediate\write\PM@fileNL{liste des videos}%
    \immediate\write\PM@fileNL{----------------}%
    \begin{multicols}{3}
      \multido{\i=1+1}{\theCounterVideo}{%
        \PM@pageref{NL-Video\i}{\pageNL}
        \immediate\write\PM@fileNL{Page \pageNL}%
      }
    \end{multicols}
  \fi
  \ifnum\theCounterProg>\z@
    \immediate\write\PM@fileNL{--------------------}%
    \immediate\write\PM@fileNL{liste des programmes}%
    \immediate\write\PM@fileNL{--------------------}%
    \begin{multicols}{3}
      \multido{\i=1+1}{\theCounterProg}{%
        \PM@pageref{NL-Prog\i}{\pageNL}
        \immediate\write\PM@fileNL{Page \pageNL}%
      }
    \end{multicols}
  \fi
  \ifnum\theCounterAudio>\z@
    \immediate\write\PM@fileNL{---------------------}%
    \immediate\write\PM@fileNL{liste des pages audio}%
    \immediate\write\PM@fileNL{---------------------}%
    \begin{multicols}{3}
      \multido{\i=1+1}{\theCounterAudio}{%
        \PM@pageref{NL-Audio\i}{\pageNL}
        \immediate\write\PM@fileNL{Page \pageNL}%
      }
    \end{multicols}
  \fi
  \ifnum\theCounterWeb>\z@
    \immediate\write\PM@fileNL{-------------------}%
    \immediate\write\PM@fileNL{liste des sites web}%
    \immediate\write\PM@fileNL{-------------------}%
    \begin{multicols}{3}
      \multido{\i=1+1}{\theCounterWeb}{%
        \PM@pageref{NL-Web\i}{\pageNL}
        \immediate\write\PM@fileNL{Page \pageNL}%
      }
    \end{multicols}
  \fi
  \immediate\closeout\PM@fileNL
}
%    \end{macrocode}
% \subsection{Renseignements sur le livre}
%    \begin{macrocode}
\renewcommand*\title[1]{%
  \renewcommand*\PM@title{#1}
  \let\title\relax
}
\renewcommand*\author[1]{%
  \renewcommand*\PM@author{#1}
  \let\author\relax
}
\renewcommand*\date[1]{%
  \renewcommand*\PM@date{#1}
  \let\date\relax
}
\newcommand*\version[1]{%
  \renewcommand*\PM@version{#1}
  \let\version\relax
}
\newcommand*\ISBN[1]{%
  \renewcommand*\PM@isbn{#1}
  \let\ISBN\relax
}
\newcommand*\PM@ERROR{ERROR}
\newcommand*\PM@title{ERROR}
\newcommand*\PM@author{ERROR}
\newcommand*\PM@date{\today}
\newcommand*\PM@version{1.0}
\newcommand*\PM@isbn{X-XXXX-XXXX-X}
\AtBeginDocument{%
  \ifx\PM@title\PM@ERROR
    \ClassError{Prepamath}{Donnez un titre avec \string\title}{}%
  \fi
  \ifx\PM@author\PM@ERROR
    \ClassError{Prepamath}{Donner un nom d'auteur avec \string\author}{}%
  \fi
}
%    \end{macrocode}
% \subsection{Abréviations scientifiques}
%    \begin{macrocode}
\newcommand*{\nep}{\mathrm{e}}
\newcommand*{\im}{\mathrm{i}}
\DeclareMathOperator{\ch}{ch}
\DeclareMathOperator{\sh}{sh}
\let\Re\undefined\DeclareMathOperator{\Re}{Re}
\let\Im\undefined\DeclareMathOperator{\Im}{Im}
\DeclareMathOperator{\Arg}{Arg}
\newcommand*{\dd}{\hspace{0.15em}\mathrm{d}}
\DeclareMathOperator{\card}{card}
\DeclareMathOperator{\PGCD}{pgcd}
\DeclareMathOperator{\PPCM}{ppcm}
\DeclareMathOperator{\esp}{E}
\DeclareMathOperator{\var}{V}
\DeclareMathOperator{\ent}{E}
\newcommand*{\N}{\ensuremath{\mathbb{N}}}
\newcommand*{\Z}{\ensuremath{\mathbb{Z}}}
\newcommand*{\Q}{\ensuremath{\mathbb{Q}}}
\newcommand*{\R}{\ensuremath{\mathbb{R}}}
\newcommand*{\C}{\ensuremath{\mathbb{C}}}
\newcommand*{\Moy}[1]{\overline{#1}}
\newcommand*{\gvec}{\overrightarrow}
\renewcommand*{\theequation}{\arabic{equation}}
%    \end{macrocode}
% \subsection{Touches de calculatrices}
%    \begin{macrocode}
\newcommand*\ministrut{\vrule width0pt height6pt depth1pt\relax}
%    \end{macrocode}
% Les touches de calculatrices de la nouvelles maquettes sont beaucoup
% plus simples (plus de dégradé en particulier) depuis la version 2.0.
%    \begin{macrocode}
\newcommand*\T[1]{%
  \setbox1=\hbox{{\PM@ToucheTxt\textcolor{PM@touche@color}{#1}}}%
  \PM@Tcommon
}
\newcommand*\Tm[1]{%
  \setbox1=\hbox{{\PM@ToucheMath$\color{PM@touche@color}{\mathsf{#1}}$}}%
  \PM@Tcommon
}
%    \end{macrocode}
% La macro commune construit la touche de calculatrice. Son contenu
% est dans la boîte 0.
%    \begin{macrocode}
\newcommand\PM@Tcommon{%
%    \end{macrocode}
% On adapte la largeur de la touche à son contenu. Pour l'instant, on
% a une largeur minimale qui correspond à 3 caractères.
%    \begin{macrocode}
  \ifdim\wd1<6.5mm
    \def\PM@width@calc{7mm}%
  \else
    \edef\PM@width@calc{\the\dimexpr\wd1+1mm}%
  \fi
  \begin{pspicture}(0mm,0mm)(\dimexpr\PM@width@calc+0.25mm,2.5mm)
    \psset{linewidth=0pt,linestyle=none, fillstyle=solid, framearc=0.3}
    \psframe[fillcolor=DB](0mm,-1mm)(\dimexpr\PM@width@calc+0.5mm,2.5mm)
    \psframe[fillcolor=MB](0mm,-0.5mm)(\PM@width@calc,2.5mm)
    \rput[B](\dimexpr\PM@width@calc/2,0){\box1}
  \end{pspicture}%
  \xspace
}
%    \end{macrocode}
% On peut maintenant définir toute une série de touches.
%    \begin{macrocode}
\newcommand*\Tpourcent{\T{\%}\xspace}
%    \end{macrocode}
% Pour les puissances, il faut tricher sur la hauteur de l'exposant
% pour éviter un débordement vertical.
%    \begin{macrocode}
\newcommand*\Tcarre{\Tm{x\raisebox{0.5ex}{\PM@ToucheMath$\scriptstyle\color{PM@touche@color}{\mathsf{2}}$}}\xspace}
\newcommand*\Tcube{\Tm{x\raisebox{0.5ex}{\PM@ToucheMath$\scriptstyle\color{PM@touche@color}{\mathsf{3}}$}}\xspace}
\newcommand*\Tpuissance{\Tm{x\raisebox{0.5ex}{\PM@ToucheMath$\scriptstyle\color{PM@touche@color}{\mathsf{n}}$}}\xspace}
\newcommand*\Tcalc{\T{CALC}\xspace}
\newcommand*\Tlog{\T{log}\xspace}
\newcommand*\Tln{\T{ln}\xspace}
\newcommand*\Tneg{\Tm{({-})}\xspace}
\newcommand*\Tsin{\T{SIN}\xspace}
\newcommand*\Tcos{\T{COS}\xspace}
\newcommand*\Ttan{\T{TAN}\xspace}
\newcommand*\Tasin{\T{ASIN}\xspace}
\newcommand*\Tacos{\T{ACOS}\xspace}
\newcommand*\Tatan{\T{ATAN}\xspace}
%    \end{macrocode}
% Pour les puissances, il faut tricher sur la hauteur de l'exposant
% pour éviter un débordement vertical.
%    \begin{macrocode}
\newcommand*\TAsin{\Tm{\mathsf{SIN\raisebox{0.5ex}{\PM@ToucheMath$\scriptstyle\color{PM@touche@color}{\mathsf{-1}}$}}}\xspace}
\newcommand*\TAcos{\Tm{\mathsf{COS\raisebox{0.5ex}{\PM@ToucheMath$\scriptstyle\color{PM@touche@color}{\mathsf{-1}}$}}}\xspace}
\newcommand*\TAtan{\Tm{\mathsf{TAN\raisebox{0.5ex}{\PM@ToucheMath$\scriptstyle\color{PM@touche@color}{\mathsf{-1}}$}}}\xspace}
\newcommand*\Trcl{\T{RCL}\xspace}
\newcommand*\Tmem{\T{MEM}\xspace}
\newcommand*\Tdel{\T{DEL}\xspace}
\newcommand*\Tac{\T{AC}\xspace}
\newcommand*\Tseconde{\T{SECONDE}\xspace}
\newcommand*\Tshift{\T{SHIFT}\xspace}
\newcommand*\Tmul{\Tm{\times}\xspace}
\newcommand*\Tdiv{\Tm{\div}\xspace}
\newcommand*\Tplus{\Tm{+}\xspace}
\newcommand*\Tmoins{\Tm{-}\xspace}
\newcommand*\Tegal{\Tm{=}\xspace}
\newcommand*\Texe{\T{EXE}\xspace}
\newcommand*\Tenter{\T{ENTER}\xspace}
\newcommand*\Tans{\T{ANS}\xspace}
%    \end{macrocode}
% Les lettres
%    \begin{macrocode}
\newcommand*\TTA{\T{A}\xspace}
\newcommand*\TTB{\T{B}\xspace}
\newcommand*\TTC{\T{C}\xspace}
\newcommand*\TTD{\T{D}\xspace}
\newcommand*\TTE{\T{E}\xspace}
\newcommand*\TTF{\T{F}\xspace}
\newcommand*\TTG{\T{G}\xspace}
\newcommand*\TTH{\T{H}\xspace}
\newcommand*\TTI{\T{I}\xspace}
\newcommand*\TTJ{\T{J}\xspace}
\newcommand*\TTK{\T{K}\xspace}
\newcommand*\TTL{\T{L}\xspace}
\newcommand*\TTM{\T{M}\xspace}
\newcommand*\TTN{\T{N}\xspace}
\newcommand*\TTO{\T{O}\xspace}
\newcommand*\TTP{\T{P}\xspace}
\newcommand*\TTQ{\T{Q}\xspace}
\newcommand*\TTR{\T{R}\xspace}
\newcommand*\TTS{\T{S}\xspace}
\newcommand*\TTT{\T{T}\xspace}
\newcommand*\TTU{\T{U}\xspace}
\newcommand*\TTV{\T{V}\xspace}
\newcommand*\TTW{\T{W}\xspace}
\newcommand*\TTX{\T{X}\xspace}
\newcommand*\TTY{\T{Y}\xspace}
\newcommand*\TTZ{\T{Z}\xspace}
%    \end{macrocode}
% La classe, à partir de la version 2.0 fournit également un écran de
% calculatrice. Sa taille par défaut est fixée de telle sorte que
% l'écran  puisse afficher 3 lignes d'au moins 16 caractères. Cette
% taille par défaut est définie par la macro |\TailleEcran| et
% peut-être également modifiée par l'argument optionnel de
% l'environnement \environ{Ecran}.
%    \begin{macrocode}
\newcommand\TailleEcran{16x3}
%    \end{macrocode}
% Ces dimensions sont des multiples de dimensions fixes. Elles sont
% en fait calculées par rapport à la taille des chiffres.
%    \begin{macrocode}
\setbox1=\hbox{\PM@ScreenFont 0}%
\newlength{\PM@widthscreen@unit}
\setlength{\PM@widthscreen@unit}{\wd1}
\newlength{\PM@heightscreen@unit}
\setlength{\PM@heightscreen@unit}{\ht1}
%    \end{macrocode}
% On aura également besoin de la profondeur normale.
%    \begin{macrocode}
\setbox2=\hbox{\PM@ScreenFont \strut}%
\newlength{\PM@depthscreen}
\setlength{\PM@depthscreen}{\dp2}
\newenvironment{Ecran}[1][\TailleEcran]{%
%    \end{macrocode}
% On commence par analyser le premier argument pour déterminer la
% taille de l'écran. La façon d'appeler l'argument permet un argument
% ne comportant que la largeur.
%    \begin{macrocode}
  \expandafter\PM@parse@screen#1x\@nil
%    \end{macrocode}
% Une fois que les dimensions sont connues, on compose la minipage à la
% bonne dimension.
%    \begin{macrocode}
  \begin{lrbox}{\PM@box}%
    \minipage[t][\dimexpr\PM@heightscreen@unit*\PM@ht@screen+\PM@depthscreen]
                {\dimexpr\PM@widthscreen@unit*\PM@wd@screen}%
%    \end{macrocode}
% Avant de composer le texte, on redéfinit la commande |\\| et toutes
% les commandes de touches de calculatrice.
%    \begin{macrocode}
      \def\\{\par\leavevmode}%
      \catcode`\^=13
      \def\T##1{##1}%
      \def\TT##1{##1}%
      \def\Tpourcent{\%\xspace}%
      \def\Tcarre{\up{2}\xspace}%
      \def\Tcube{\up{3}\xspace}%
      \def\Tpuissance##1{\up{##1}\xspace}%
      \def\Tcalc{CALC\xspace}%
      \def\Tlog{log(\xspace}%
      \def\Tln{ln(\xspace}%
      \def\Tneg{-\xspace}%
      \def\Tsin{SIN(\xspace}%)
      \def\Tcos{COS(\xspace}%)
      \def\Ttan{TAN(\xspace}%)
      \def\Tasin{ASIN(\xspace}%)
      \def\Tacos{ACOS(\xspace}%)
      \def\Tatan{ATAN(\xspace}%)
      \def\TAsin{SIN\up{-1}(\xspace}%)
      \def\TAcos{COS\up{-1}(\xspace}%)
      \def\TAtan{TAN\up{-1}(\xspace}%)
      \def\Trcl{RCL\xspace}%
      \def\Tmem{MEM\xspace}%
      \def\Tdel{DEL\xspace}%
      \def\Tac{AC\xspace}%
      \def\Tseconde{SECONDE\xspace}%
      \def\Tshift{SHIFT\xspace}%
      \def\Tmul{{\boldmath$\times$}\xspace}%
      \def\Tdiv{/\xspace}%
      \def\Tplus{+\xspace}%
      \def\Tmoins{-\xspace}%
      \def\Tegal{=\xspace}%
      \def\Texe{EXE\xspace}%
      \def\Tenter{ENTER\xspace}%
      \def\Tans{ANS\xspace}%
%    \end{macrocode}
% Il reste juste à spécifier la fonte utilisée pour l'écran de
% calculatrice.
%    \begin{macrocode}
      \PM@ScreenFont
  }
{%
%    \end{macrocode}
% En fin d'environnement, on ferme la minipage et la boîte dans
% lesquelles est stocké tout le matériel.
%    \begin{macrocode}
    \endminipage
  \end{lrbox}%
%    \end{macrocode}
% Le principe est d'afficher le contenu de la boîte sur un fond coloré
% avec une bordure en dégradé. On introduit ici les marges entre le
% contenu de l'écran et ses bords. Pour cela, on place la boîte dans
% une |fbox| sans filet.
%    \begin{macrocode}
  \setbox\PM@box=\hbox{%
    \fboxrule=0mm
    \fbox{\usebox{\PM@box}}%
  }%
%    \end{macrocode}
% L'écran fait les dimensions de la boîte plus |2.5\pslinewidth| de
% marge sur les quatre côtés.
%    \begin{macrocode}
  \begin{pspicture}(-2.5\pslinewidth,\dimexpr-\dp\PM@box-2.5\pslinewidth)
                   (\dimexpr\wd\PM@box+2.5\pslinewidth,
                    \dimexpr\ht\PM@box+2.5\pslinewidth)
%    \end{macrocode}
% Fond.
%    \begin{macrocode}
    \psframe*[linecolor=PM@screenbkg@color](0,-\dp\PM@box)(\wd\PM@box,\ht\PM@box)
%    \end{macrocode}
% Bord en dégradé.
%    \begin{macrocode}
    \multido{\dx=0pt+-0.25\pslinewidth,
             \dxx=\wd\PM@box+0.25\pslinewidth,
             \dy=\ht\PM@box+0.25\pslinewidth,
             \dyy=-\dp\PM@box+-0.25\pslinewidth,
             \ic=10+-1
           }{10}{%
             \psframe[linecolor=PM@screenframe@color\ic,
                       cornersize=absolute, linearc=1mm]
                      (\dx,\dy)(\dxx,\dyy)
    }
%    \end{macrocode}
% Contenu.
%    \begin{macrocode}
    \rput[Bl](0,0){\usebox{\PM@box}}
  \end{pspicture}%
}
%    \end{macrocode}
% Analyse de la taille de l'écran.
%    \begin{macrocode}
\def\PM@parse@screen#1x#2\@nil{%
%    \end{macrocode}
% Dans tous les cas |#1| correspond à la largeur.
%    \begin{macrocode}
  \def\PM@wd@screen{#1}%
  \ifx\relax#2\relax
%    \end{macrocode}
% S'il n'y a pas de deuxième argument c'est que la hauteur n'a pas été
% spécifiée. On la fixe à 1.
%    \begin{macrocode}
    \def\PM@ht@screen{1}%
  \else
%    \end{macrocode}
% S'il y a un deuxième argument, c'est la hauteur terminée par un \og
% \texttt{x} \fg{} qu'il faut éliminer.
%    \begin{macrocode}
    \PM@@parse@screen#2%
  \fi
}
%    \end{macrocode}
%    \begin{macrocode}
\def\PM@@parse@screen#1x{%
  \def\PM@ht@screen{#1}%
}
%    \end{macrocode}
% On a besoin de définir le caractère |^| actif pour l'écran de
% calculatrice.
%    \begin{macrocode}
\begingroup
  \catcode`\^=13
  \gdef^#1{\up{#1}}
\endgroup
%    \end{macrocode}
% \subsection{Ancienne classe}
% Abréviations typographiques
%    \begin{macrocode}
\newcommand\Par{\par\vspace{5pt plus 2pt minus 2pt}\par}
\newcommand\dvline{\vline\,\vline}
\newcommand\morestretch[1][1.2]{\renewcommand{\arraystretch}{#1}}
%    \end{macrocode}
% Autres abréviations.
%    \begin{macrocode}
\let\ds\displaystyle
\newcommand*\dlim{\ds\lim}
\DeclareOldFontCommand{\rm}{\normalfont\rmfamily}{\mathrm}
\DeclareOldFontCommand{\sf}{\normalfont\sffamily}{\mathsf}
\DeclareOldFontCommand{\tt}{\normalfont\ttfamily}{\mathtt}
\DeclareOldFontCommand{\bf}{\normalfont\bfseries}{\mathbf}
\DeclareOldFontCommand{\it}{\normalfont\itshape}{\mathit}
\DeclareOldFontCommand{\sl}{\normalfont\slshape}{\@nomath\sl}
\DeclareOldFontCommand{\sc}{\normalfont\scshape}{\@nomath\sc}
\let\cal\mathcal
\let\onglet\thumb
\let\subonglet\subthumb
%    \end{macrocode}
% \iffalse
%</class>
%<*package>
% \fi
% \subsection{Extension pour les rabats}
% L'extension pour les rabats est dépendante de la classe en ce sens
% qu'on ne va pas réécrire tout le code permettant d'utiliser les
% constructions définies par la classe.
%
% La seule précaution à prendre et sur l'utilisation de l'extension
% |geometry| puisque le format de papier est totalement différent.
%    \begin{macrocode}
\def\fileversion{1.21}
\def\PMversion{1.21}
\def\filedate{2016/04/27}
\def\PMdate{2016/04/27}
\NeedsTeXFormat{LaTeX2e}[1999/12/01]
\ProvidesPackage{rabat}[%
  \filedate\space v\fileversion\space
  rabat package. Jean-Côme Charpentier for prepamath%
]
%    \end{macrocode}
% Lorsqu'on produit un rabat, il n'y aura aucune en-tête ni pied de
% page.
%    \begin{macrocode}
\pagestyle{empty}
%    \end{macrocode}
% Les rabats sont organisés en quatre colonnes. On indique ici toutes
% les largeurs nécessaires à la gestion de ces colonnes. On commence
% par les position des repères photographiques.
%    \begin{macrocode}
\@namedef{PM@cropx1}{1cm}
\@namedef{PM@cropx2}{14.5cm}
\@namedef{PM@cropx3}{15.5cm}
\@namedef{PM@cropx4}{31.5cm}
\@namedef{PM@cropx5}{33.5cm}
\@namedef{PM@cropx6}{49.5cm}
\@namedef{PM@cropx7}{50.5cm}
\@namedef{PM@cropx8}{64cm}
\@namedef{PM@cropy1}{1cm}
\@namedef{PM@cropy2}{25cm}
%    \end{macrocode}
% On passe ensuite aux position et largeur des quatre colonnes
% consécutives (2e page).
%    \begin{macrocode}
\@namedef{PM@col2xl}{1.8cm}
\@namedef{PM@col2w}{12.2cm}
\@namedef{PM@col3xl}{16cm}
\@namedef{PM@col3w}{14cm}
\@namedef{PM@col4xl}{35cm}
\@namedef{PM@col4w}{14cm}
\@namedef{PM@col5xl}{51cm}
\@namedef{PM@col5w}{12.2cm}
%    \end{macrocode}
% Les colonnes 0 et 1 sont identiques aux colonnes 2 et 5. Pour
% automatiser les calculs, on définit au préalable la macro
% |\@nameedef| qui fonctionne comme |\@namedef| mais avec un |\edef| à
% la place du |\def|.
%    \begin{macrocode}
\def\@nameedef#1{\expandafter\edef\csname #1\endcsname}
\@nameedef{PM@col0xl}{\@nameuse{PM@col2xl}}
\@nameedef{PM@col0w}{\@nameuse{PM@col2w}}
\@nameedef{PM@col1xl}{\@nameuse{PM@col5xl}}
\@nameedef{PM@col1w}{\@nameuse{PM@col5w}}
%    \end{macrocode}
% À partir de ces données, on récupère les abscisses droites de toutes
% les colonnes.
%    \begin{macrocode}
\@nameedef{PM@col0xr}{\the\numexpr\@nameuse{PM@col0xl}+\@nameuse{PM@col0w}}
\@nameedef{PM@col1xr}{\the\numexpr\@nameuse{PM@col1xl}+\@nameuse{PM@col1w}}
\@nameedef{PM@col2xr}{\the\numexpr\@nameuse{PM@col2xl}+\@nameuse{PM@col2w}}
\@nameedef{PM@col3xr}{\the\numexpr\@nameuse{PM@col3xl}+\@nameuse{PM@col3w}}
\@nameedef{PM@col4xr}{\the\numexpr\@nameuse{PM@col4xl}+\@nameuse{PM@col4w}}
\@nameedef{PM@col5xr}{\the\numexpr\@nameuse{PM@col5xl}+\@nameuse{PM@col5w}}
%    \end{macrocode}
% Le fond de page est jaune pâle |LY| par défaut. Depuis la version
% 2.16a de la classe la couleur par défaut est redéfinie en
% |PM@rabatbkg@color|. Pour que l'utilisateur puisse le modifier, on
% utilise une couleur publique pour le déclarer.
%    \begin{macrocode}
\colorlet{ColorBack}{PM@rabatbkg@color}
%    \end{macrocode}
% Lorsqu'on commence à écrire dans une colonne, on le fait à une
% distance fixe du bord haut (s'il n'y a pas de rotation) ou des bords
% gauche ou droite (s'il y a rotation). Cette distance doit pouvoir
% être modifiable facilement par l'utilisateur. Elle est donc gérée
% par une longueur publique. Cette distance est calculée à partir des
% repères photographiques de chaque colonne.
%    \begin{macrocode}
\newlength{\OffsetColonne}
\setlength{\OffsetColonne}{0.5cm}
%    \end{macrocode}
% Tous le travail est sous la dépendance de l'environnement
% |colonne|. Pour savoir dans quelle colonne on se trouve, on utilise
% un compteur. Il y aura un autre compteur pour la colonne finale et
% un booléen pour gérer les erreurs.
%    \begin{macrocode}
\newcount\curcolonne
\newcount\lastcolonne
\newif\ifPM@error
%    \end{macrocode}
% L'environnement |colonne| accepte un argument optionnel indiquant le
% nombre de colonnes à fusionner. Par défaut, |colonne| s'étend sur une
% seule colonne du rabat.
%    \begin{macrocode}
\newenvironment{colonne}[1][1]{%
%    \end{macrocode}
% La première étape consiste à analyser l'argument optionnel. Si la
% colonne courante est 0 ou 1, la colonne finale de fusion ne
% peut dépasser 1 et si la colonne courante est entre 2 et 5, la colonne
% finale ne peut dépasser 5.
%    \begin{macrocode}
  \ifnum\curcolonne<2
    \lastcolonne=\numexpr\curcolonne+#1-1\relax
    \ifnum\lastcolonne>1
      \PackageError{rabat}
                   {On compose la colonne \the\numexpr\curcolonne+1.\MessageBreak
                   Il n'est pas possible de fusionner #1 colonnes}%
    \fi
  \else
    \lastcolonne=\numexpr\curcolonne+#1-1\relax
    \ifnum\lastcolonne>5
      \PackageError{rabat}
                   {On compose la colonne \the\numexpr\curcolonne+1.\MessageBreak
                   Il n'est pas possible de fusionner #1 colonnes}%
    \fi
  \fi
%    \end{macrocode}
% On commence par regarder si on se trouve en colonne 0 ou 2. Dans ces
% deux cas, on compose le fond de page et les repères photographiques
% (si l'option crop est active). Dans ces deux cas, il y a un saut
% de page en plus et on pose alors tous les nœuds d'accroche possible
% des minipages qui composeront les colonnes, c'est-à-dire les coins
% supérieurs gauche.
%    \begin{macrocode}
  \ifnum\curcolonne=0
    \newpage
    \rput(0,\topskip){%
      \psframe[linestyle=none, fillstyle=solid, fillcolor=ColorBack]
              (\@nameuse{PM@cropx1},-\@nameuse{PM@cropy1})(
              \@nameuse{PM@cropx3},-\@nameuse{PM@cropy2})
      \psframe[linestyle=none, fillstyle=solid, fillcolor=ColorBack]
              (\@nameuse{PM@cropx6},-\@nameuse{PM@cropy1})
              (\@nameuse{PM@cropx8},-\@nameuse{PM@cropy2})
      \PM@R@crop
      \pnode(\@nameuse{PM@col0xl},-\dimexpr\@nameuse{PM@cropy1}+\OffsetColonne)
            {PM@Col0}
      \pnode(\@nameuse{PM@col1xl},-\dimexpr\@nameuse{PM@cropy1}+\OffsetColonne)
            {PM@Col1}
    }
  \else\ifnum\curcolonne=2
    \newpage
    \rput(0,\topskip){%
      \psframe[linestyle=none, fillstyle=solid, fillcolor=ColorBack]
              (\@nameuse{PM@cropx1},-\@nameuse{PM@cropy1})
              (\@nameuse{PM@cropx8},-\@nameuse{PM@cropy2})
      \PM@R@crop
      \pnode(\@nameuse{PM@col2xl},-\dimexpr\@nameuse{PM@cropy1}+\OffsetColonne)
            {PM@Col2}
      \pnode(\@nameuse{PM@col3xl},-\dimexpr\@nameuse{PM@cropy1}+\OffsetColonne)
            {PM@Col3}
      \pnode(\@nameuse{PM@col4xl},-\dimexpr\@nameuse{PM@cropy1}+\OffsetColonne)
            {PM@Col4}
      \pnode(\@nameuse{PM@col5xl},-\dimexpr\@nameuse{PM@cropy1}+\OffsetColonne)
            {PM@Col5}
    }
  \fi\fi
%    \end{macrocode}
% À ce niveau, les nœuds de la page en cours ont été posés et les
% fusions de colonnes analysées. On commence à emmagasiner le matériel
% dans une minipage de largeur correspondant à la ou les colonnes
% utilisées. On calcule la largeur de la minipage comme étant le |xr|
% de la dernière colonne moins le |xl| de la première colonne. D'autre
% part, la minipage s'aligne en haut, sa hauteur par défaut et la
% distance entre les deux repères photographiques |y1| et |y2|
% auxquelles on enlève deux fois la distance |\OffsetColonne|.
%    \begin{macrocode}
  \begin{lrbox}{\PM@box}
    \minipage[t][\dimexpr\@nameuse{PM@cropy2}%
                        -\@nameuse{PM@cropy2}%
                        -2\OffsetColonne%
                ][s]{\dimexpr\@nameuse{PM@col\the\lastcolonne xr}%
                            -\@nameuse{PM@col\the\curcolonne xl}%
                    }
}
{%
%    \end{macrocode}
% En fin d'environnement |colonne|, on commence par terminer la
% minipage et la boîte |\PMbox|
%    \begin{macrocode}
     \endminipage
   \end{lrbox}
%    \end{macrocode}
% On peut maintenant afficher la minipage au bon endroit, c'est-à-dire
% à l'ancre liée à sa colonne courante.
%    \begin{macrocode}
  \edef\node{PM@Col\the\curcolonne}
  \rput[tl](\node){\usebox{\PM@box}}
%    \end{macrocode}
% En fin de travail sur la ou les colonnes, la colonne courante et la
% dernière plus un.
%    \begin{macrocode}
  \global\curcolonne=\numexpr\lastcolonne+1
}
%    \end{macrocode}
% Macro pour poser les repères photographiques sur les rabats. On ne
% fait rien si la classe a demandé la suppression de ces repères.
%    \begin{macrocode}
\newcommand*\PM@R@crop{%
  \ifPM@crop
    \begingroup
      \psset{linecolor=black, linewidth=0.4pt}
%    \end{macrocode}
% Lignes pleines horizontales (à 1mm des coupures)
%    \begin{macrocode}
      \psline(1mm,-\@nameuse{PM@cropy1})
             (\dimexpr\@nameuse{PM@cropx1}-1mm,-\@nameuse{PM@cropy1})
      \psline(\dimexpr\@nameuse{PM@cropx8}+1mm,-\@nameuse{PM@cropy1})
             (\dimexpr\PM@pagewidth-1mm,-\@nameuse{PM@cropy1})
      \psline(1mm,-\@nameuse{PM@cropy2})
             (\dimexpr\@nameuse{PM@cropx1}-1mm,-\@nameuse{PM@cropy2})
      \psline(\dimexpr\@nameuse{PM@cropx8}+1mm,-\@nameuse{PM@cropy2})
             (\dimexpr\PM@pagewidth-1mm,-\@nameuse{PM@cropy2})
%    \end{macrocode}
% Lignes pleines verticales.
%    \begin{macrocode}
      \psline(\@nameuse{PM@cropx1},-1mm)
             (\@nameuse{PM@cropx1},-\dimexpr\@nameuse{PM@cropy1}-1mm)
      \psline(\@nameuse{PM@cropx1},-\dimexpr\PM@pageheight-1mm)
             (\@nameuse{PM@cropx1},-\dimexpr\@nameuse{PM@cropy2}+1mm)
      \psline(\@nameuse{PM@cropx8},-1mm)
             (\@nameuse{PM@cropx8},-\dimexpr\@nameuse{PM@cropy1}-1mm)
      \psline(\@nameuse{PM@cropx8},-\dimexpr\PM@pageheight-1mm)
             (\@nameuse{PM@cropx8},-\dimexpr\@nameuse{PM@cropy2}+1mm)
      \psset{linestyle=dotted}
%    \end{macrocode}
% Lignes pointillées (verticales) du bas.
%    \begin{macrocode}
      \psline(\@nameuse{PM@cropx2},-1mm)
             (\@nameuse{PM@cropx2},-\dimexpr\@nameuse{PM@cropy1}-1mm)
      \psline(\@nameuse{PM@cropx3},-1mm)
             (\@nameuse{PM@cropx3},-\dimexpr\@nameuse{PM@cropy1}-1mm)
      \psline(\@nameuse{PM@cropx4},-1mm)
             (\@nameuse{PM@cropx4},-\dimexpr\@nameuse{PM@cropy1}-1mm)
      \psline(\@nameuse{PM@cropx5},-1mm)
             (\@nameuse{PM@cropx5},-\dimexpr\@nameuse{PM@cropy1}-1mm)
      \psline(\@nameuse{PM@cropx6},-1mm)
             (\@nameuse{PM@cropx6},-\dimexpr\@nameuse{PM@cropy1}-1mm)
      \psline(\@nameuse{PM@cropx7},-1mm)
             (\@nameuse{PM@cropx7},-\dimexpr\@nameuse{PM@cropy1}-1mm)
%    \end{macrocode}
% Lignes pointillées du haut.
%    \begin{macrocode}
      \psline(\@nameuse{PM@cropx2},-\dimexpr\PM@pageheight-1mm)
             (\@nameuse{PM@cropx2},-\dimexpr\@nameuse{PM@cropy2}+1mm)
      \psline(\@nameuse{PM@cropx3},-\dimexpr\PM@pageheight-1mm)
             (\@nameuse{PM@cropx3},-\dimexpr\@nameuse{PM@cropy2}+1mm)
      \psline(\@nameuse{PM@cropx4},-\dimexpr\PM@pageheight-1mm)
             (\@nameuse{PM@cropx4},-\dimexpr\@nameuse{PM@cropy2}+1mm)
      \psline(\@nameuse{PM@cropx5},-\dimexpr\PM@pageheight-1mm)
             (\@nameuse{PM@cropx5},-\dimexpr\@nameuse{PM@cropy2}+1mm)
      \psline(\@nameuse{PM@cropx6},-\dimexpr\PM@pageheight-1mm)
             (\@nameuse{PM@cropx6},-\dimexpr\@nameuse{PM@cropy2}+1mm)
      \psline(\@nameuse{PM@cropx7},-\dimexpr\PM@pageheight-1mm)
             (\@nameuse{PM@cropx7},-\dimexpr\@nameuse{PM@cropy2}+1mm)
    \endgroup
  \fi
}
%    \end{macrocode}
% On définit maintenant l'environnement |cadre| qui reprend les
% fonctionnalités des environnement |WarningLike| en plus simple
% puisqu'il ne peut pas y avoir de coupure. Il faut utiliser une autre
% boîte que |\PM@box| puisque celle-ci est utilisée à un niveau
% supérieur. Les cadres sont bleu, on la définit avec
% |PM@Cadre@color|. On définit enfin les fontes utilisées (selon
% l'option realfonts utilisée ou non).
%    \begin{macrocode}
\newbox\PM@cadrebox
\colorlet{PM@cadre@color}{DB}
\ifPM@realfonts
  \def\PM@CadreFont{\normalsize\rmfamily}
  \def\PM@TitreCadreFont{\PM@DCB\fontsize{14}{17}\selectfont}
  \def\PM@PointFont{\PM@DM\fontsize{10}{12}\selectfont}
\else
  \def\PM@CadreFont{\normalsize\rmfamily}
  \def\PM@TitreCadreFont{\sffamily\bfseries\boldmath\fontsize{14}{17}\selectfont}
  \def\PM@PointFont{\sffamily\bfseries\boldmath\fontsize{10}{12}\selectfont}
\fi
\newenvironment{cadre}[1]{%
%    \end{macrocode}
% Dans tout l'environnement, à cause des positionnements des
% cartouches, il faut supprimer l'élasticité de l'espace entre les
% paragraphes.
%    \begin{macrocode}
  \parskip 1mm plus\z@
  \par
  \psframebox[linestyle=none, fillstyle=solid,
             fillcolor=PM@cadre@color]{%
  \color{white}%
  \PM@TitreCadreFont \strut \hspace*{2mm}#1%
  }
  \kern-3pt
  \pspolygon[linestyle=none, linewidth=0pt,
    fillstyle=solid, fillcolor=PM@cadre@color]
  (0,-0.30)(0.835,-0.30)(0,0.535)
  \par\nobreak\vspace{-4.6pt}
  \begin{lrbox}{\PM@cadrebox}%
    \minipage[b]{\linewidth-13.6pt}%
      \PM@CadreFont
      \strut
      \ignorespaces
}
{%
      \strut
    \endminipage
  \end{lrbox}%
  \setlength{\PM@vertical@shift}{-0.5\dp\PM@cadrebox+0.5\ht\PM@cadrebox}%
  \resetcolorseries[10]{PM@ombre@color}%
  \multido{\dx=0pt+0.25\pslinewidth}{10}{%
%    \end{macrocode}
% |6pt| plus un petit rab pour les épaisseurs de lignes.
%    \begin{macrocode}
    \rput(7pt,-0.4pt){%
      \rput(0.5\wd\PM@cadrebox,\PM@vertical@shift){%
        \rput(\dx,-\dx){%
          \psframebox[fillstyle=none,
                      linestyle=solid, framesep=6pt,
                      linecolor=PM@ombre@color!!+]
            {\phantom{\usebox{\PM@cadrebox}}}%
        }
      }
    }
  }%
  \psframebox[linestyle=none, fillstyle=solid,
              fillcolor=white,framesep=6pt]{%
      \usebox{\PM@cadrebox}%
  }%
  \par
}%
%    \end{macrocode}
% Les cadres utilisent souvent des points oranges pour organiser la
% fiche. On définit une telle commande. Cette commande peut être
% influencée par un |\novspace| placée juste avant.
%    \begin{macrocode}
\newif\ifPM@novspace
\newcommand*\novspace{\global\PM@novspacetrue}
\newcommand*\point[1]{%
  \ifPM@novspace
  \else
    \par\addvspace{18pt}
  \fi
  \global\PM@novspacefalse
  \textcolor{DO}{\PM@PointFont $\bullet$~~#1}
  \par\addvspace{12pt}
}
%    \end{macrocode}
% 
% \iffalse
%</package>
%<*index>
% \fi
% \subsection{Fichier de style pour les index}
% Le fichier de style pour les index (fichier |.ist|) reprend toutes
% les caractéristiques du fichier standard |gind.ist| mais supprime
% l'écriture des sous-titres de changement de lettres  en donnant la
% valeur 0 aux paramètres |lethead_flag| et |headings_flag|.
%    \begin{macrocode}
actual '@'
quote '"'
level '!'
preamble  "\n \\begin{theindex}\n"
postamble "\n\n \\end{theindex}\n"
item_x1   "\\efill \n \\subitem "
item_x2   "\\efill \n \\subsubitem "
delim_0   "\\pfill "
delim_1   "\\pfill "
delim_2   "\\pfill "
lethead_prefix   "{\\bfseries\\hfil "
lethead_suffix   "\\hfil}\\nopagebreak\n"
lethead_flag     0
heading_prefix   "{\\bfseries\\hfil "
heading_suffix   "\\hfil}\\nopagebreak\n"
headings_flag    0
%    \end{macrocode}
% \iffalse
%</index>
% \fi
% \setcounter{IndexColumns}{2}\PrintIndex
% \newpage
% \PrintChanges
\endinput
