From e0c6872cf40896c7be36b11dcc744620f10adf1d Mon Sep 17 00:00:00 2001 From: Norbert Preining Date: Mon, 2 Sep 2019 13:46:59 +0900 Subject: Initial commit --- macros/latex/contrib/sesamanuel/sesamanuel.dtx | 11949 +++++++++++++++++++++++ 1 file changed, 11949 insertions(+) create mode 100644 macros/latex/contrib/sesamanuel/sesamanuel.dtx (limited to 'macros/latex/contrib/sesamanuel/sesamanuel.dtx') diff --git a/macros/latex/contrib/sesamanuel/sesamanuel.dtx b/macros/latex/contrib/sesamanuel/sesamanuel.dtx new file mode 100644 index 0000000000..57ae5c4ba9 --- /dev/null +++ b/macros/latex/contrib/sesamanuel/sesamanuel.dtx @@ -0,0 +1,11949 @@ +% \iffalse +% +%% sesamanuel.dtx +%% Copyright 2014-2015 Sesamath, J.-C. Charpentier, S. Mengin +% +%% Class `sesamanuel' to use with LaTeX 2e +%% Copyright (C) 2014-2015 Sesamath, Jean-C\^ome Charpentier, S\'ebastien +%% Mengin. +% \fi +% +%% \CharacterTable +%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z +%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z +%% Digits \0\1\2\3\4\5\6\7\8\9 +%% Exclamation \! Double quote \" Hash (number) \# +%% Dollar \$ Percent \% Ampersand \& +%% Acute accent \' Left paren \( Right paren \) +%% Asterisk \* Plus \+ Comma \, +%% Minus \- Point \. Solidus \/ +%% Colon \: Semicolon \; Less than \< +%% Equals \= Greater than \> Question mark \? +%% Commercial at \@ Left bracket \[ Backslash \\ +%% Right bracket \] Circumflex \^ Underscore \_ +%% Grave accent \` Left brace \{ Vertical bar \| +%% Right brace \} Tilde \~} +%% +% \iffalse +%<*driver> +\documentclass[a4paper]{ltxdoc} +\IndexPrologue{% + \newpage + \section*{Index}% + Les num\'eros soulign\'es indiquent le num\'ero de ligne de la + d\'efinition de l'entr\'ee. Les num\'eros en roman indiquent les + num\'eros de ligne o\`u l'entr\'ee est utilis\'ee. +} +\makeatletter +\renewenvironment{theglossary}{% + \glossary@prologue + \GlossaryParms \let\item\@idxitem \ignorespaces}% + {} +\makeatother +\GlossaryPrologue{% + \newpage + \section*{{Historique des changements}} + \markboth{{Historique des changements}}{{Historique des changements}}% +} +\DisableCrossrefs +%\EnableCrossrefs +%\CodelineIndex +\RecordChanges +%\OnlyDescription +\usepackage{fontspec} +\usepackage{xunicode} +\usepackage{xltxtra} +\usepackage[a4paper,left=2in]{geometry} +\usepackage{makeidx} +\usepackage{array} +\let\iint\relax +\let\iiint\relax +\let\iiiint\relax +\let\idotsint\relax +\usepackage{amsmath} +\usepackage{xcolor} +\usepackage[french]{babel} +\usepackage{xspace} +\usepackage{hyperref} +\makeindex +\title{Code de la classe \class{sesamanuel}\\Classe pour les cahiers Sésamath} +\author{% + Jean-Côme Charpentier\thanks{\ttfamily jean-come.charpentier@wanadoo.fr} + \and Sébastien Mengin\thanks{\ttfamily sebastien-mengin@edilibre.net} +} +\newcommand*\pgm[1]{\texttt{#1}} +\newcommand*\file[1]{\texttt{#1}} +\newcommand*\package[1]{\texttt{#1}} +\newcommand*\class[1]{\texttt{#1}} +\newcommand*\option[1]{\texttt{#1}} +\newcommand*\key[1]{\texttt{#1}} +\newcommand*\environ[1]{\texttt{#1}} + +\begin{document} +\maketitle +\newpage +\tableofcontents +\newpage +\DocInput{sesamanuel.dtx} +\PrintChanges +\PrintIndex +\end{document} +% +% \fi +% +% \changes{v0.1}{2013/07/16}{% +% Classe \class{sesacah} commencée. +% } +% \changes{v0.2}{2014/03/05}{% +% Classe \class{sesacah} utilisée en production. +% } +% \changes{v0.3}{2014/08/26}{% +% Quelques aménagements de la classe après écriture de la +% documentation.\endgraf +% Package \package{sesacah} pour une utilisation indépendante. +% } +% \changes{v0.4}{2014/10/31}{% +% Écriture de la partie libre. +% } +% \changes{v0.5}{2014/12/20}{% +% Changement de nom sesacah en sesamanuel. +% } +% \changes{v0.6}{2015/03/03}{% +% Mise en cohérence avec les sources du site Sesamath.\endgraf +% Package \package{sesamanuelTIKZ} ajouté au dtx. +% } +% \CheckSum{0} +% \iffalse +%<*class> +% \fi +% \section{Partie introductive} +% La partie introductive de la classe n'a rien de particulier, on +% retrouve la définition de version et de date de la classe ainsi que +% les commandes \LaTeX{} pour communiquer ces informations à +% l'utilisateur. +% \begin{macrocode} +\def\filedate{2015/03/03} +\let\smcfiledate\filedate +\def\fileversion{0.6} +\let\smcfileversion\fileversion +\NeedsTeXFormat{LaTeX2e}[1995/06/01] +\ProvidesClass{sesamanuel}[% + \filedate\space v\fileversion\space + Classe pour les cahiers Sesamath (SM/JCC/SM)% +] +% \end{macrocode} +% Dans cette partie introductive, on charge également la classe +% \class{book}. Pour l'instant, il n'y a besoin d'aucune option +% particulière, les options par défaut sont tout à fait suffisantes. +% \begin{macrocode} +\LoadClass{book} +% \end{macrocode} +% \section{Options de classe} +% La classe gère le codage d'entrée en option. On retrouve tous les +% codages possibles. En principe, la classe est sensée fonctionner +% avec \XeTeX{} et alors uniquement un codage d'entrée UTF-8 mais on +% permettra un fonctionnement sous \LaTeX{} et donc avec les codages +% permis par \package{inputenc}. Comme il y a beaucoup de déclarations +% différentes, on utilise une macro générale de déclaration d'option : +% \begin{macrocode} +\def\smc@enc@opt#1{\DeclareOption{#1}{\def\smc@encoding{#1}}} +\smc@enc@opt{ascii} +\smc@enc@opt{latin1} +\smc@enc@opt{latin2} +\smc@enc@opt{latin3} +\smc@enc@opt{latin4} +\smc@enc@opt{latin5} +\smc@enc@opt{latin9} +\smc@enc@opt{latin10} +\smc@enc@opt{decmulti} +\smc@enc@opt{cp850} +\smc@enc@opt{cp852} +\smc@enc@opt{cp858} +\smc@enc@opt{cp437} +\smc@enc@opt{cp437de} +\smc@enc@opt{cp865} +\smc@enc@opt{applemac} +\smc@enc@opt{macce} +\smc@enc@opt{next} +\smc@enc@opt{cp1250} +\smc@enc@opt{cp1252} +\smc@enc@opt{cp1257} +\smc@enc@opt{ansinew} +\smc@enc@opt{utf8} +% \end{macrocode} +% On a également une option pour obtenir ou non les repères +% photographique (et les débordements de pleine page). On donne sa +% valeur par défaut qui est vraie. +% \begin{macrocode} +\newif\ifsmc@crop +\smc@croptrue +\DeclareOption{crop}{\smc@croptrue} +\DeclareOption{nocrop}{\smc@cropfalse} +% \end{macrocode} +% Une dernière option permet de supprimer les numéros de page mais +% uniquement pour un texte libre. +% \begin{macrocode} +\newif\ifsmc@page +\smc@pagetrue +\DeclareOption{page}{\smc@pagetrue} +\DeclareOption{nopage}{\smc@pagefalse} +% \end{macrocode} +% Les options par défaut sont l'utilisation de UTF-8 et de repère +% photgraphique et de la numérotation des pages en partie libre. On +% aura également besoin d'une macro contenant la chaîne \og utf8 \fg{}. +% \begin{macrocode} +\newcommand*\smc@string@utfviii{utf8} +\ExecuteOptions{utf8} +\ProcessOptions +% \end{macrocode} +% \section{Chargement des extensions} +% On chargera le minimum d'extensions dans la classe afin de limiter +% les problèmes de compatibilités avec les différentes distributions +% \TeX{} (distributions et versions de ces distributions). On aurait +% pu choisir de charger les extensions \package{ifpdf}, +% \package{ifluatex} et \package{ifxetex} pour tester le mode de +% compilation et agir en conséquence mais on n'a pas besoin de ce luxe +% : comme on est en tout début de classe, on peut utiliser des +% méthodes légèrement moins solides que celles fournies dans ces +% extensions mais très largement suffisantes ici. +% +% On doit tester dans l'ordre : +% \begin{enumerate} +% \item si on compile avec PDF\LaTeX{} ou lua\LaTeX{} ce qui +% doit donner une erreur de compilation immédiate avec un message +% d'erreur explicite ; +% \item si on compile avec \LaTeX{} ou avec \XeLaTeX{} ce qui donnera +% un chargement d'extensions différentes et, plus tard, une gestion +% des fontes différentes. +% \end{enumerate} +% Le code suivant est une recopie du code de \package{ifxetex} de Will +% Robertson. +% \begin{macrocode} +\newif\ifxetex +\begingroup\expandafter\expandafter\expandafter\endgroup +\expandafter\ifx\csname XeTeXrevision\endcsname\relax + \xetexfalse +\else + \xetextrue +\fi +% \end{macrocode} +% Le code suivant est très largement suffisant pour détecter en tout +% début de classe si on utilise PDF\LaTeX{} en mode PDF, PDF\LaTeX{} +% en mode dvi, \XeLaTeX{} ou enfin lua\LaTeX{}. +% \begin{macrocode} +\newif\ifpdftex +\newif\ifpdfdvi +\newif\ifluatex +\ifx\luatexversion\undefined + \luatexfalse + \ifx\pdfoutput\undefined + \pdftexfalse + \pdfdvifalse + \else + \pdftextrue + \ifnum\pdfoutput=\z@ + \pdfdvitrue + \else + \pdfdvifalse + \fi + \fi +\else + \luatextrue +\fi +% \end{macrocode} +% On teste d'abord les modes qui conduisent à une erreur de +% compilation. +% \begin{macrocode} +\ifpdftex + \unless\ifpdfdvi + \ClassError{sesamanuel}{Vous ne pouvez pas compiler en mode pdflatex} + {Compilez en mode latex.}% + \fi +\fi +\ifluatex + \ClassError{sesamanuel}{Vous ne pouvez pas compiler en mode lualatex} + {Compilez en mode latex.}% +\fi +% \end{macrocode} +% On commence le chargement des extensions par celles qui dépendent du +% mode de compilation. Au préalable, on charge le package +% \package{etex} pour ne pas embêter ceux qui vont utiliser TikZ. +% \begin{macrocode} +\RequirePackage{etex} +\ifxetex + \RequirePackage{fontspec} + \RequirePackage{xunicode} + \defaultfontfeatures{Ligatures=TeX} +% \end{macrocode} +% Si l'auteur a précisé un codage autre que utf8 dans les options de +% classe, on va émettre un message d'erreur. +% \begin{macrocode} + \unless\ifx\smc@encoding\smc@string@utfviii + \ClassError{sesamanuel}{Vous ne pouvez pas utiliser un codage autre + que utf8 avec xelatex}{Changez les codages de tous vos fichiers + pour les transformer en utf8.}% + \fi +% \end{macrocode} +% Si on n'est pas en mode \XeLaTeX{}, on considèrera qu'on est en mode +% \LaTeX{}. Si ce n'est pas vrai, il y aura déjà eu un message +% d'erreur auparavant. On déclare également des fontes annexes. +% \begin{macrocode} +\else + \RequirePackage[T1]{fontenc} + \RequirePackage[\smc@encoding]{inputenc} +\fi +% \end{macrocode} +% On charge les fontes courantes. Le réglage de la fonte Helvetica +% fait que l'œil est le même que pour Palatino. +% \begin{macrocode} +\RequirePackage[scaled=0.87]{helvet} +\RequirePackage{mathpazo} +\renewcommand{\ttdefault}{lmtt} +% \end{macrocode} +% Puis quelques autres à usage plus ponctuel. +% \begin{macrocode} +\RequirePackage{mathrsfs} +\RequirePackage{pifont} +\RequirePackage[official]{eurosym} +% \end{macrocode} +% Il est difficle de trouver une fonte directement installée dans les +% distributions \TeX{} qui se rapproche du Comic Sans proposé par la +% maquette. Un premier essai a été Comforta mais il semble que cette +% fonte n'existait pas sur les versions un peu ancienne des +% distributions \TeX{} (par exemple \TeX Live 2009). On fait un autre +% essai avec la famille llcmss (\package{lxfonts}). +% \begin{macrocode} +%%%\newcommand*\scriptfamily{\fontfamily{fco}\selectfont} +\newcommand*\scriptfamily{\fontfamily{llcmss}\selectfont} +% \end{macrocode} +% Tout ce qui est empagement est paramétré au maximum. |\smc@bleed| +% indique le débordement des éléments en pleine page. +% \begin{macrocode} +\newcommand*\smc@paperheight{27cm} +\newcommand*\smc@paperwidth{19.5cm} +\newcommand*\smc@marginleft{1.33cm} +\newcommand*\smc@marginright{1.33cm} +% \end{macrocode} +% Il y a une dimension en plus qui ne sera pas gérée par geometry : le +% surplus de marge droite pour certains éléments de l'ouvrage. +% \begin{macrocode} +\newcommand*\ExtraMarginRight{1.8cm} +\newcommand*\smc@margintop{2.5cm} +\newcommand*\smc@headheight{14.4pt} +\newcommand*\smc@headsep{1.4cm} +\newcommand*\smc@marginbottom{2cm} +\newcommand*\smc@footskip{1.2cm} +% \end{macrocode} +% Les éléments suivants dépendent de la demande ou non de repères +% photographiques. On traite d'abord le cas où il y a une telle demande. +% \begin{macrocode} +\ifsmc@crop + \newcommand*\smc@bleed{5mm} +% \end{macrocode} +% On peut alors appeler l'extension geometry ainsi que crop. Avant +% d'appeler geometry, on sauvegarde les éléments de mise en page dans +% des macros privées. Tous les calculs de distances se feront avec des +% macros (jamais de longueurs directes). +% \begin{macrocode} + \RequirePackage[driver=none, + paperheight=\smc@paperheight, + paperwidth=\smc@paperwidth, + top=\smc@margintop, + headheight=\smc@headheight, + headsep=\smc@headsep, + bottom=\smc@marginbottom, + footskip=\smc@footskip, + left=\smc@marginleft, + right=\smc@marginright, + nomarginpar]{geometry} + \RequirePackage[cam,a4,center]{crop} +% \end{macrocode} +% Si on ne demande pas de repère photographique, l'extension +% \package{crop} est inutile et les débordements de pleine page sont +% supprimés. L'appel de \package{geometry} se fait exactement de la +% même façon qu'avec l'option crop mais on garde quand même un double +% code au cas où l'appel ne serait plus le même plus tard. +% \begin{macrocode} +\else + \newcommand*\smc@bleed{0mm} + \RequirePackage[driver=none, + paperheight=\smc@paperheight, + paperwidth=\smc@paperwidth, + top=\smc@margintop, + headheight=\smc@headheight, + headsep=\smc@headsep, + bottom=\smc@marginbottom, + footskip=\smc@footskip, + left=\smc@marginleft, + right=\smc@marginright, + nomarginpar]{geometry} + \RequirePackage[off,a4,center]{crop} +\fi +% \end{macrocode} +% On continue avec d'autres extensions utiles +% \begin{macrocode} +\RequirePackage{ifmtarg} +\RequirePackage{mathtools} +\RequirePackage{amssymb} +\RequirePackage{longtable, tabularx} +\RequirePackage{multirow} +\RequirePackage[table]{xcolor} +\RequirePackage{pst-all, pstricks-add} +\RequirePackage{fancyhdr} +\RequirePackage{fancyvrb} +\RequirePackage{multicol} +\RequirePackage[french]{babel} +\RequirePackage[autolanguage]{numprint} +% \end{macrocode} +% On crée quelques registres de brouillon +% \begin{macrocode} +\newbox\smc@boxa +\newbox\smc@boxb +\newdimen\smc@dima +\newdimen\smc@dimb +% \end{macrocode} +% \section{Mise en page générale} +% Suppression des retraits d'alinéa. +% \begin{macrocode} +\setlength{\parindent}{0pt} +% \end{macrocode} +% \begin{macro}{\cleardoubleoddpage} +% Macro permettant de commencer sur une page impaire en remplissant si +% besoin une page vide (pas totalement vide). +% \begin{macrocode} +\newcommand*\cleardoubleoddpage{% + \clearpage + \pagestyle{empty} + \cleardoublepage +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\cleardoubleevenpage} +% Macro permettant de commencer sur une page paire en remplissant si +% besoin une page vide (pas totalement vide). Cette macro a besoin de +% la commande intermédiaire |\clearevendoublepage| construite sur le +% modèle de |\cleardoublepage| de \LaTeX. Il semble que la maquette +% n'utilise plus l'ouverture en page paire mais on laisse quand même +% les macros au cas où. +% \begin{macrocode} +\newcommand*\clearevendoublepage{% + \clearpage + \ifodd\c@page + \hbox{}\newpage + \fi +} +\newcommand*\cleardoubleevenpage{% + \clearpage + \pagestyle{empty} + \clearevendoublepage +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\normalsize} +% La classe définit un interlignage bien plus important que +% d'habitude. Il faut donc redéfinir les commandes standards de taille +% de caractère pour respecter cette marche typographique tout au long +% du document. La demande est d'avoir un interlignage de 14 points au +% lieu du 12 points habituel. On mettra plutôt 14.4 points pour garder +% la progression géométrique habituelle. On ne touche pas au ressorts +% verticaux pour les formules hors-texte. +% \begin{macrocode} +\renewcommand\normalsize{% + \@setfontsize\normalsize{9.5}\@xivpt + \abovedisplayskip 10\p@ \@plus2\p@ \@minus5\p@ + \abovedisplayshortskip \z@ \@plus3\p@ + \belowdisplayshortskip 6\p@ \@plus3\p@ \@minus3\p@ + \belowdisplayskip \abovedisplayskip + \let\@listi\@listI} +\normalsize +% \end{macrocode} +% Les autres commandes suivent le même procédé. On augmente +% l'interlignage de un cran dans la progression géométrique. +% \begin{macrocode} +\renewcommand\small{% + \@setfontsize\small{8.5}{12}% + \abovedisplayskip 8.5\p@ \@plus3\p@ \@minus4\p@ + \abovedisplayshortskip \z@ \@plus2\p@ + \belowdisplayshortskip 4\p@ \@plus2\p@ \@minus2\p@ + \belowdisplayskip \abovedisplayskip +} +\renewcommand\footnotesize{% + \@setfontsize\footnotesize{7.5}{11}% + \abovedisplayskip 6\p@ \@plus2\p@ \@minus4\p@ + \abovedisplayshortskip \z@ \@plus\p@ + \belowdisplayshortskip 3\p@ \@plus\p@ \@minus2\p@ + \belowdisplayskip \abovedisplayskip +} +\renewcommand\scriptsize{\@setfontsize\scriptsize{6.5}{9.5}} +\renewcommand\tiny{\@setfontsize\tiny\@vpt\@viipt} +\renewcommand\large{\@setfontsize\large\@xiipt\@xviipt} +\renewcommand\Large{\@setfontsize\Large\@xivpt{22}} +\renewcommand\LARGE{\@setfontsize\LARGE\@xviipt{25}} +\renewcommand\huge{\@setfontsize\huge\@xxpt{30}} +\renewcommand\Huge{\@setfontsize\Huge\@xxvpt{36}} +\setlength\smallskipamount{3\p@ \@plus 1\p@ \@minus 1\p@} +\setlength\medskipamount{6\p@ \@plus 2\p@ \@minus 2\p@} +\setlength\bigskipamount{12\p@ \@plus 4\p@ \@minus 4\p@} +% \end{macrocode} +% \end{macro} +% \begin{environment}{itemize} +% En fait, il n'y a pas un environnement |itemize| mais tout un tas +% qui seront mis en place en fonction du contexte. On commence par +% l'environnement qui indique qu'on a pas le droit d'utiliser cet +% environnement ! On inhibe |\item| pour ne pas multipler les messages +% d'erreur. +% \begin{macrocode} +\newenvironment{smc@noitemize}{% + \ClassError{sesamanuel}{Il est interdit d'utiliser itemize ici} + {Consultez la documentation pour plus de renseignements.}% + \let\item\relax +}{} +% \end{macrocode} +% Par défaut, c'est l'environnement interdit qui est actif. +% \begin{macrocode} +\let\itemize\smc@noitemize +\let\enditemize\endsmc@noitemize +% \end{macrocode} +% \begin{macro}{\DeclareCorrItemize} +% On crée un spécificateur d'environnement itemize pour les +% corrigés. Il ne s'agit pas de liste au sens \LaTeX ien du terme : il +% n'y a pas de passage à la ligne avant le premier item, il n'y a pas +% de retrait. +% +% Le premier argument est le nom de base (il sera précédé de smc@corr +% et terminé par itemize), le +% deuxième argument est le type de puce +% \begin{macrocode} +\newcommand*\DeclareCorrItemize[2]{% + \newenvironment{smc@corr#1itemize}{% + \def\item{\par#2~}% + \ignorespaces + } + {\par} +} +% \end{macrocode} +% \end{macro} +% Les espacements sont les mêmes pour toutes les listes sauf les +% enumerate. +% \emph{normales}. +% \begin{macrocode} +\def\smc@setalllist{% + \setlength{\leftmargin}{\ListLabelWidth}% + \setlength{\rightmargin}{0mm}% + \setlength{\labelwidth}{\ListLabelWidth}% + \setlength{\labelsep}{0mm}% + \setlength{\itemindent}{0mm}% + \setlength{\listparindent}{0mm}% + \setlength{\topsep}{0mm}% + \setlength{\partopsep}{\baselineskip}% + \setlength{\itemsep}{0mm}% + \setlength{\parsep}{0mm}% + \def\makelabel##1{##1\hss}% +} +% \end{macrocode} +% Pour les enumerate de premier niveau, on peut avoir une largeur plus +% importante d'étiquette afin de pouvoir composer des numéros sur deux +% chiffres sans télescopage. Ce niveau utilise |\smc@setallfirstlist| +% qui est par défaut égal à la macro précédente. +% \begin{macrocode} +\let\smc@setallfirstlist\smc@setalllist +% \end{macrocode} +% Pour les list enumerate de premier niveau, on pourra utiliser une +% place plus importante pour le numéro afin de permettre une +% numérotation sur deux chiffres. C'est l'environnement |bigenumerate| +% qui utilisera cette possibilité. +% \begin{macrocode} +\def\smc@setallbiglist{% + \setlength{\leftmargin}{\EnumerateLabelWidth}% + \setlength{\rightmargin}{0mm}% + \setlength{\labelwidth}{\EnumerateLabelWidth}% + \setlength{\labelsep}{0mm}% + \setlength{\itemindent}{0mm}% + \setlength{\listparindent}{0mm}% + \setlength{\topsep}{0mm}% + \setlength{\partopsep}{\baselineskip}% + \setlength{\itemsep}{0mm}% + \setlength{\parsep}{0mm}% + \def\makelabel##1{##1\hss}% +} +% \end{macrocode} +% Vient ensuite l'environnement de liste à puce dans les prérequis. On +% donnera systématiquement la variante \og corr \fg de l'environnement +% même si celle-ci ne sert à rien pour l'instant : c'est une réserve +% pour l'avenir. +% +% On teste la profondeur des itemize pour pouvoir définir une puce +% différente en fonction du niveau. +% \begin{macrocode} +\newenvironment{smc@prerequisitemize}{% + \ifnum\@listdepth=\z@ + \list{\textcolor{PrerequisItemColor}{$\blacktriangleright$}} + {\smc@setalllist}% + \else + \list{\textcolor{PrerequisItemColor}{$\blacktriangleright$}} + {\smc@setalllist}% + \fi +} +{\endlist} +\DeclareCorrItemize{prerequis} + {\textcolor{PrerequisItemColor}{$\blacktriangleright$}} +% \end{macrocode} +% Puis l'environnement de liste à puce dans l'auto-évaluation. +% \begin{macrocode} +\newenvironment{smc@AEitemize}{% + \ifnum\@listdepth=\z@ + \list{\textcolor{AEItemColor}{$\bullet$}} + {\smc@setalllist}% + \else + \list{\textcolor{AEItemColor}{$\bullet$}} + {\smc@setalllist}% + \fi +} +{\endlist} +\DeclareCorrItemize{AE}{\textcolor{AEItemColor}{$\bullet$}} +% \end{macrocode} +% Puis l'environnement de liste à puce dans les méthodes. +% \begin{macrocode} +\newenvironment{smc@exappitemize}{% + \ifnum\@listdepth=\z@ + \list{\textcolor{ExAppItemColor}{$\bullet$}} + {\smc@setalllist}% + \else + \list{\textcolor{ExAppItemColor}{$\bullet$}} + {\smc@setalllist}% + \fi +} +{\endlist} +\DeclareCorrItemize{exapp}{\textcolor{ExAppItemColor}{$\bullet$}} +% \end{macrocode} +% Puis l'environnement de liste à puce dans les environnement de type +% définition. +% \begin{macrocode} +\newenvironment{smc@defitemize}{% + \ifnum\@listdepth=\z@ + \list{% + \color{DefItemColor}% + \vrule width \ItemRuleWidth + height \ItemRuleHeight + depth \ItemRuleDepth + \relax} + {\smc@setalllist}% + \else + \list{% + \color{DefItemColor}% + \vrule width \ItemRuleWidth + height \ItemRuleHeight + depth \ItemRuleDepth + \relax} + {\smc@setalllist}% + \fi +} +{\endlist} +\DeclareCorrItemize{def}{% + \textcolor{DefItemColor}{% + \vrule width \ItemRuleWidth + height \ItemRuleHeight + depth \ItemRuleDepth + }% +} +% \end{macrocode} +% Puis l'environnement de liste à puce dans les activités. +% \begin{macrocode} +\newenvironment{smc@activiteitemize}{% + \ifnum\@listdepth=\z@ + \list{\textcolor{ActiviteItemColor}{$\bullet$}} + {\smc@setalllist}% + \else + \list{\textcolor{ActiviteItemColor}{$\bullet$}} + {\smc@setalllist}% + \fi +} +{\endlist} +\DeclareCorrItemize{activite}{\textcolor{ActiviteItemColor}{$\bullet$}} +% \end{macrocode} +% Puis l'environnement de liste à puce dans les remarques. +% \begin{macrocode} +\newenvironment{smc@remitemize}{% + \ifnum\@listdepth=\z@ + \list{% + \color{RemItemColor} + \vrule width \ItemRuleWidth + height \ItemRuleHeight + depth \ItemRuleDepth + \relax} + {\smc@setalllist}% + \else + \list{% + \color{RemItemColor} + \vrule width \ItemRuleWidth + height \ItemRuleHeight + depth \ItemRuleDepth + \relax} + {\smc@setalllist}% + \fi +} +{\endlist} +\DeclareCorrItemize{rem}{% + \textcolor{RemItemColor}{% + \vrule width \ItemRuleWidth + height \ItemRuleHeight + depth \ItemRuleDepth + }% +} +% \end{macrocode} +% Puis l'environnement de liste à puce dans les exemples. +% \begin{macrocode} +\newenvironment{smc@exempleitemize}{% + \ifnum\@listdepth=\z@ + \list{\textcolor{ExempleItemColor}{$\bullet$}} + {\smc@setalllist}% + \else + \list{\textcolor{ExempleItemColor}{$\bullet$}} + {\smc@setalllist}% + \fi +} +{\endlist} +\DeclareCorrItemize{exemple}{\textcolor{ExempleItemColor}{$\bullet$}} +% \end{macrocode} +% Puis l'environnement de liste à puce dans les preuves. +% \begin{macrocode} +\newenvironment{smc@proofitemize}{% + \ifnum\@listdepth=\z@ + \list{\textcolor{ProofItemColor}{$\bullet$}} + {\smc@setalllist}% + \else + \list{\textcolor{ProofItemColor}{$\bullet$}} + {\smc@setalllist}% + \fi +} +{\endlist} +\DeclareCorrItemize{proof}{\textcolor{ProofItemColor}{$\bullet$}} +% \end{macrocode} +% Puis l'environnement de liste à puce dans les parties Exercices de +% base et Exercices d'approfondissement. +% \begin{macrocode} +\newenvironment{smc@exerciceitemize}{% + \ifnum\@listdepth=\z@ + \list{\textcolor{ExerciceItemColor}{$\bullet$}} + {\smc@setalllist}% + \else + \list{\textcolor{ExerciceItemColor}{$\bullet$}} + {\smc@setalllist}% + \fi +} +{\endlist} +\DeclareCorrItemize{exercice}{\textcolor{ExerciceItemColor}{$\bullet$}} +% \end{macrocode} +% Puis l'environnement de liste à puce pour les acquis. +% \begin{macrocode} +\newenvironment{smc@acquisitemize}{% + \ifnum\@listdepth=\z@ + \list{\textcolor{AcquisItemColor}{\footnotesize$\blacktriangleright$}} + {\smc@setalllist}% + \else + \list{\textcolor{AcquisItemColor}{$\bullet$}} + {\smc@setalllist}% + \fi +} +{\endlist} +\DeclareCorrItemize{acquis}{\textcolor{AcquisItemColor}{$\bullet$}} +% \end{macrocode} +% Puis l'environnement de liste à puce pour les commentaires. Dans cet +% espace, on prend la forme la plus simple. +% \begin{macrocode} +\newenvironment{smc@commentaireitemize}{% + \ifnum\@listdepth=\z@ + \list{\textcolor{CommentaireItemColor}{$\bullet$}} + {\smc@setalllist}% + \else + \list{\textcolor{CommentaireItemColor}{$\bullet$}} + {\smc@setalllist}% + \fi +} +{\endlist} +\DeclareCorrItemize{commentaire}{\textcolor{CommentaireItemColor}{$\bullet$}} +% \end{macrocode} +% Puis l'environnement de liste à puce pour les récréations, énigmes. +% \begin{macrocode} +\newenvironment{smc@recreationitemize}{% + \ifnum\@listdepth=\z@ + \list{\textcolor{RecreationItemColor}{$\bullet$}} + {\smc@setalllist}% + \else + \list{\textcolor{RecreationItemColor}{$\bullet$}} + {\smc@setalllist}% + \fi +} +{\endlist} +\DeclareCorrItemize{recreation}{\textcolor{RecreationItemColor}{$\bullet$}} +% \end{macrocode} +% Puis l'environnement de liste à puce dans les annexes. +% \begin{macrocode} +\newenvironment{smc@annexeitemize}{% + \ifnum\@listdepth=\z@ + \list{% + \color{AnnexeItemColor} + \vrule width \ItemRuleWidth + height \ItemRuleHeight + depth \ItemRuleDepth + \relax} + {\smc@setalllist}% + \else + \list{% + \color{AnnexeItemColor} + \vrule width \ItemRuleWidth + height \ItemRuleHeight + depth \ItemRuleDepth + \relax} + {\smc@setalllist}% + \fi +} +{\endlist} +% \end{macrocode} +% Liste pour le lexique +% \begin{macrocode} +\newenvironment{smc@lexiqueitemize}{% + \ifnum\@listdepth=\z@ + \list{\textcolor{LexiqueItemColor}{$\bullet$}} + {\smc@setalllist}% + \else + \list{\textcolor{LexiqueItemColor}{$\bullet$}} + {\smc@setalllist}% + \fi +} +{\endlist} +% \end{macrocode} +% Puis l'environnement de liste à puce dans le texte libre. +% \begin{macrocode} +\newenvironment{smc@libreitemize}{% + \ifnum\@listdepth=\z@ + \list{% + \color{LibreItemColor} + \vrule width \ItemRuleWidth + height \ItemRuleHeight + depth \ItemRuleDepth + \relax} + {\smc@setalllist}% + \else + \list{% + \color{LibreItemColor} + \vrule width \ItemRuleWidth + height \ItemRuleHeight + depth \ItemRuleDepth + \relax} + {\smc@setalllist}% + \fi +} +{\endlist} +\DeclareCorrItemize{libre}{\textcolor{LibreItemColor}{$\bullet$}} +% \end{macrocode} +% \end{environment} +% \begin{environment}{enumerate} +% Tout ce qu'on a fait avec |itemize| se reporte de façon similaire +% avec |enumerate| (sauf la largeur de l'étiquette). On ne modifiera +% pas l'environnement |description| \emph{a priori}. +% +% On commence par déclarer l'interdiction d'utiliser |enumerate|. +% \begin{macrocode} +\newenvironment{smc@noenumerate}{% + \ClassError{sesamanuel}{Il est interdit d'utiliser enumerate ici} + {Consultez la documentation pour plus de renseignements.}% + \let\item\relax +}{} +% \end{macrocode} +% Par défaut ce sont les environnements interdits qui sont activés. +% \begin{macrocode} +\let\enumerate\smc@noenumerate +\let\endenumerate\endsmc@noenumerate +% \end{macrocode} +% On définit maintenant l'environnement |bigenumerate| qui ne fait +% qu'appeler |enumerate| en ayant modifié au préalable la largeur des +% étiquettes pour la liste de premier niveau. +% \begin{macrocode} +\newenvironment{bigenumerate} + {% + \let\smc@setallfirstlist\smc@setallbiglist + \begin{enumerate} + } + {\end{enumerate}} +% \end{macrocode} +% Les différentes environnements enumerate ne diffèrent que par la +% couleur des numéros et le gras. On les déclarera grâce à la commande +% générique |\DeclareEnumerate|. Sa syntaxe est : \\ +% |\DeclareEnumerate{nom\_environnement}{commande}{couleur}|\\ +% +% La première définition globale permet d'afficher correctement la +% couleur des références des item. +% \begin{macrocode} +\newcommand\DeclareEnumerate[3]{% + \newenvironment{smc@#1enumerate}{% + \gdef\smc@curr@itemcmd{#2}% + \gdef\smc@curr@itemcolor{#3}%( + \renewcommand\labelenumi{\textcolor{#3}{#2\theenumi)}}%( + \renewcommand\labelenumii{\textcolor{#3}{#2\theenumii)}}%( + \renewcommand\labelenumiii{\textcolor{#3}{#2\theenumiii)}}% + \advance\@enumdepth \@ne + \ifnum\@enumdepth>\thr@@ +% \end{macrocode} +% Si on a plus de trois niveau d'imbrication de enumerate, c'est une +% erreur. +% \begin{macrocode} + \ClassError{sesamanuel}{Pas plus de 3 niveaux de liste} + {Consultez la documentation pour plus de renseignements.} + \else\ifnum\@enumdepth=\@ne +% \end{macrocode} +% Si on est au premier niveau, on peut utiliser une largeur de label +% plus importante pour permettre une numérotation à deux +% chiffres. +% \begin{macrocode} + \edef\@enumctr{enum\romannumeral\the\@enumdepth}% + \expandafter + \list + \csname label\@enumctr\endcsname + {% + \usecounter{\@enumctr}% + \smc@setallfirstlist + }% + \else +% \end{macrocode} +% Sinon, on garde la largeur habituelle. +% \begin{macrocode} + \edef\@enumctr{enum\romannumeral\the\@enumdepth}% + \expandafter + \list + \csname label\@enumctr\endcsname + {% + \usecounter{\@enumctr}% + \smc@setalllist + }% + \fi\fi + } + {\endlist} +% \end{macrocode} +% On définit du même coup les environnements |smc@correnumerate| +% qui se comporte très différemment des listes enumerate classiques. +% \begin{macrocode} + \newenvironment{smc@corr#1enumerate}{% + \gdef\smc@curr@itemcmd{#2}% + \gdef\smc@curr@itemcolor{#3}%( +% \end{macrocode} +% On remet tous les compteurs à zéros (même si un seul sera utilisé). +% \begin{macrocode} + \setcounter{enumi}{0}% + \setcounter{enumii}{0}% + \setcounter{enumiii}{0}% + \renewcommand\labelenumi{\textcolor{#3}{#2\theenumi)}}%( + \renewcommand\labelenumii{\textcolor{#3}{#2\theenumii)}}%( + \renewcommand\labelenumiii{\textcolor{#3}{#2\theenumiii)}}% + \advance\@enumdepth \@ne + \ifnum\@enumdepth>\thr@@ + \ClassError{sesamanuel}{Pas plus de 3 niveaux de liste} + {Consultez la documentation pour plus de renseignements.} + \else +% \end{macrocode} +% On commence par crée une macro annexe qui affiche le numéro. +% \begin{macrocode} + \def\smc@enum{% + \refstepcounter{enum\romannumeral\@enumdepth}% + \csname labelenum\romannumeral\@enumdepth\endcsname~ + }% +% \end{macrocode} +% Ici, on ne redéfinit que la commande |\item|. +% \begin{macrocode} + \def\item{% +% \end{macrocode} +% Au premier appel, on ne fait qu'afficher le numéro d'item. +% \begin{macrocode} + \smc@enum +% \end{macrocode} +% Aux appels suivants, on commencera par passer au paragraphe +% suivant. Pour cela la macro |\item| se redéfinit elle-même. +% \begin{macrocode} + \def\item{\par\smc@enum}% + }% + \fi + \ignorespaces + } + {\par} +} +% \end{macrocode} +% |enumerate| dans les prérequis. +% \begin{macrocode} +\DeclareEnumerate{prerequis}{}{PrerequisItemColor} +% \end{macrocode} +% |enumerate| dans les méthodes. +% \begin{macrocode} +\DeclareEnumerate{exapp}{\bfseries}{ExAppItemColor} +% \end{macrocode} +% |enumerate| dans les environnements de type définition. +% \begin{macrocode} +\DeclareEnumerate{def}{\bfseries}{DefItemColor} +% \end{macrocode} +% |enumerate| dans l'auto-évaluation. +% \begin{macrocode} +\DeclareEnumerate{AE}{\bfseries}{AEItemColor} +% \end{macrocode} +% |enumerate| dans les activités. +% \begin{macrocode} +\DeclareEnumerate{activite}{\bfseries}{ActiviteItemColor} +% \end{macrocode} +% |enumerate| dans les remarques. +% \begin{macrocode} +\DeclareEnumerate{rem}{}{RemItemColor} +% \end{macrocode} +% |enumerate| dans les exemples. +% \begin{macrocode} +\DeclareEnumerate{exemple}{}{ExempleItemColor} +% \end{macrocode} +% |enumerate| dans les preuves. +% \begin{macrocode} +\DeclareEnumerate{proof}{}{ProofItemColor} +% \end{macrocode} +% |enumerate| dans les parties Exercices de base et Exercices +% d'approfondissement. +% \begin{macrocode} +\DeclareEnumerate{exercice}{\bfseries}{ExerciceItemColor} +% \end{macrocode} +% |enumerate| dans le cadre |acquis|. +% \begin{macrocode} +\DeclareEnumerate{acquis}{\bfseries}{AcquisItemColor} +% \end{macrocode} +% |enumerate| dans les commentaires. +% \begin{macrocode} +\DeclareEnumerate{commentaire}{}{CommentaireItemColor} +% \end{macrocode} +% |enumerate| dans les récréation, énigmes. +% \begin{macrocode} +\DeclareEnumerate{recreation}{\bfseries}{RecreationItemColor} +% \end{macrocode} +% |enumerate| dans les annexes. +% \begin{macrocode} +\DeclareEnumerate{annexe}{}{AnnexeItemColor} +% \end{macrocode} +% |enumerate| dans le lexique. +% \begin{macrocode} +\DeclareEnumerate{lexique}{}{LexiqueItemColor} +% \end{macrocode} +% |enumerate| dans le texte libre. +% \begin{macrocode} +\DeclareEnumerate{libre}{}{LibreItemColor} +% \end{macrocode} +% \end{environment} +% \begin{environment}{colitemize} +% En plus des environnements de liste classiques, on a deux autres +% types de liste où on précise le nombre de colonnes sur lesquelles +% sont composées chaque item. En revanche, on garde la même syntaxe +% que les environnements standards, à savoir :\\ +% |\begin{colitemize}{}|\\ +% |\item ...|\\ +% |\item ...|\\ +% |\item ...|\\ +% |\end{colitemize}| +% +% On commence en indiquant l'interdiction d'utiliser ce type +% d'environnement. +% \begin{macrocode} +\newenvironment{smc@nocolitemize}{% + \ClassError{sesamanuel}{Il est interdit d'utiliser colitemize ici} + {Consultez la documentation pour plus de renseignements.}% + \let\item\relax +}{} +% \end{macrocode} +% Les autres environnements seront déclarés de façon générique en +% indiquant uniquement la couleur des étiquettes et leur code. +% \begin{macrocode} +\newcount\smc@nbitem +\newcount\smc@nbline +\newcommand*\DeclareColItemize[3]{% +% \end{macrocode} +% Tous les environnements |colitemize| doivent spécifier le nombre de +% colonnes en premier argument. +% \begin{macrocode} + \newenvironment{#1}[1]{% + \par +% \end{macrocode} +% On doit sauvegarder le nombre de colonnes car cette information ne +% servira que dans la partie terminale de l'environnement. +% \begin{macrocode} + \def\smc@nbcolumn{##1}% +% \end{macrocode} +% On initialise le nombre d'items +% \begin{macrocode} + \smc@nbitem \z@ +% \end{macrocode} +% Chaîne pour le test de fin d'environnement. +% \begin{macrocode} + \edef\StringColCurrent{\StringColitemize}% +% \end{macrocode} +% et on lance la macro qui va lire la totalité du contenu de +% l'environnement et la stoker dans le registre de lexèmes +% |\toks@| en ayant vidé ce registre au préalable. +% \begin{macrocode} + \toks@{}% + \smc@getbody + }% + {% +% \end{macrocode} +% En partie terminale de l'environnement, on relance la lecture du +% corps de l'environnement par la macro |\smc@splititem| qui +% sauvegarde chaque item dans une macro |\smc@item|. Pour +% permettre la détection facile de la fin, on ajoute un +% |\item\@nil\item| à la fin du corps. +% \begin{macrocode} + \expandafter\smc@splititem\the\toks@\item\@nil\item +% \end{macrocode} +% En sortie de la macro précédente, le nombre d'items est sauvegardé +% dans le registre |\smc@nbitem|. On calcule le nombre de lignes que +% cela va nécessiter avec la formule :\\ +% $\hbox{nb\_lignes}=\dfrac{\hbox{nb\_items}+\hbox{nb\_colonnes}-1} +% {\hbox{nb\_colonnes}}$\\ +% \begin{macrocode} + \smc@nbline \numexpr \smc@nbitem+\smc@nbcolumn-1 + \divide\smc@nbline \smc@nbcolumn +% \end{macrocode} +% On rentre dans la double boucle d'affichage. La boucle externe gère +% les lignes. +% \begin{macrocode} + \multido{\n=1+1}{\smc@nbline}{% +% \end{macrocode} +% La boucle interne va afficher tous les items de la ligne en +% cours. Comme les items sont organisés en colonnes, on va afficher +% les items ayant comme numéro le numéro de ligne pour l'item le plus +% à gauche et en ajoutant le nombre de lignes à ce numéro à chaque +% fois qu'on passe au numéro suivant. +% +% Par exemple, si on compose 10 items sur 3 colonnes, les calculs +% suivants indiquent qu'il y aura 4 lignes. Les numéros d'items de la +% première lignes seront donc 1 puis $1+4=5$ puis $5+4=9$. La deuxième +% ligne accueillera les numéros d'items 2 puis $2+4=6$ puis +% $6+4=10$. La troisième ligne accueillera les numéros d'items 3 puis +% $3+4=7$ et comme le numéro $7+4=11$ n'existe pas, la dernière +% colonne de la troisième ligne sera vide. Ce sera la même chose pour +% la quatrième ligne. +% \begin{macrocode} + \multido{\ni=\n+\the\smc@nbline}{\smc@nbcolumn}{% +% \end{macrocode} +% On n'affiche l'item que si le numéro existe. +% \begin{macrocode} + \unless\ifnum\ni>\smc@nbitem +% \end{macrocode} +% La puce est composée dans une boîte de largeur fixée en se servant +% des paramètres transmis à la macro |\DeclareColItemize|. +% \begin{macrocode} + \makebox[\ListLabelWidth]{\textcolor{#2}{#3}\hss}% +% \end{macrocode} +% Le corps de l'item est alors composé dans une minipage alignée en +% haut et de largeur tel qu'elle permet d'avoir le nombre de colonnes +% et le nombre d'espaces intercolonnes nécessaires. +% \begin{macrocode} + \begin{minipage}[t]{\dimexpr + (\linewidth-\ListHSep*(\smc@nbcolumn-1))% + /\smc@nbcolumn-\ListLabelWidth} +% \end{macrocode} +% Le contenu lui même est précédé et suivi d'un |\strut| pour assurer +% un bon interlignage. +% \begin{macrocode} + \strut\@nameuse{smc@item\ni}\strut + \end{minipage}% +% \end{macrocode} +% À la fin de la minipage, on place l'espace intercolonne. +% \begin{macrocode} + \hspace{\ListHSep}% + \fi + }% +% \end{macrocode} +% À la fin de chaque ligne, on insère un saut de ligne. Pour ne pas +% avoir de saut trop important, la dernière ligne utilisera +% |\endgraf|. +% \begin{macrocode} + \ifnum\n=\smc@nbline + \endgraf + \else + \\ + \fi + }% + }% +} +% \end{macrocode} +% La macro |\smc@getbody| permet de récupérer l'intégralité du corps +% d'un environnement dans le registre de lexèmes |\toks@|. Cette macro +% est une version simple de ce type de lecture qui ne permet pas +% l'emboîtement d'environnements. +% +% Le principe est de tout lire jusqu'au premier |\end|, de le +% sauvegarder et de tester le |\end| en mettant un |\smc@testend| dans +% le flot de lecture. +% \begin{macrocode} +\long\def\smc@getbody#1\end{% + \toks@\expandafter{\the\toks@#1}\smc@testend +} +% \end{macrocode} +% La macro |\smc@testend| permet de savoir si on est effectivement à +% la fin de l'environnement de départ et de réagir en conséquence. +% \begin{macrocode} +\long\def\smc@testend#1{% +% \end{macrocode} +% On sauvegarde ce qui suit le |\end| pour regarder si c'est égal à la +% chaîne correspondant à l'environnement de départ. +% \begin{macrocode} + \def\smc@arg{#1}% + \ifx\smc@arg\StringColCurrent +% \end{macrocode} +% Si c'est le cas, il suffit de remettre le tout dans le flot de +% lecture courant. +% \begin{macrocode} + \end{#1}% + \else +% \end{macrocode} +% Si ce n'est pas le cas, le |\end{environnement}| doit être mis de +% côté dans la suite du registre de lecture du corps d'environnement +% et il faut reprendre la lecture en faisant un appel récursif à +% |\smc@getbody|. +% \begin{macrocode} + \toks@\expandafter{\the\toks@\end{#1}}% + \expandafter\smc@getbody + \fi +} +% \end{macrocode} +% La macro |\smc@splititem| permet de répartir le contenu de chaque +% item dans des macros ayant un nom comportant un numéro. En +% l'occurrence |\smc@item|. +% \begin{macrocode} +\long\def\smc@splititem#1\item{% +% \end{macrocode} +% En réalité, le premier appel ne sert qu'à passer la première balise +% |\item| qui n'est normalement précédée d'aucun texte. On passe +% directement à la macro de lecture effective. +% \begin{macrocode} + \smc@@splititem +} +% \end{macrocode} +% La macro |\smc@@splititem| est la macro de lecture recursive qui +% permet de mémoriser les contenus de tous les items. +% \begin{macrocode} +\long\def\smc@@splititem#1\item{% +% \end{macrocode} +% On place le contenu dans une macro pour tester si c'est égal à +% |\@nil|. +% \begin{macrocode} + \def\smc@arg{#1}% + \ifx\smc@arg\@nnil +% \end{macrocode} +% Si le |\@nil| a été lu, il n'y a plus rien à faire. +% \begin{macrocode} + \else +% \end{macrocode} +% Sinon on incrémente le compteur d'items, on sauvegarde le contenu de +% l'item et on fait un appel récursif sur le prochain item. +% \begin{macrocode} + \advance\smc@nbitem\@ne + \@namedef{smc@item\the\smc@nbitem}{#1}% + \expandafter\smc@@splititem + \fi +} +% \end{macrocode} +% On peut maintenant déclarer les environnements colitemize des +% différentes parties. On commence par les listes dans les prérequis. +% \begin{macrocode} +\DeclareColItemize{smc@prerequiscolitemize} + {PrerequisItemColor}{$\blacktriangleright$} +% \end{macrocode} +% Ensuite le colitemize pour l'auto-évaluation. +% \begin{macrocode} +\DeclareColItemize{smc@AEcolitemize} + {AEItemColor}{$\bullet$} +% \end{macrocode} +% Ensuite le colitemize pour les méthodes. +% \begin{macrocode} +\DeclareColItemize{smc@exappcolitemize} + {ExAppItemColor}{$\bullet$} +% \end{macrocode} +% Ensuite le colitemize pour les environnements de type définition. +% \begin{macrocode} +\DeclareColItemize{smc@defcolitemize} + {DefItemColor} + {% + \vrule width \ItemRuleWidth + height \ItemRuleHeight + depth \ItemRuleDepth + \relax + } +% \end{macrocode} +% Ensuite le colitemize pour les activités. +% \begin{macrocode} +\DeclareColItemize{smc@activitecolitemize} + {ActiviteItemColor}{$\bullet$} +% \end{macrocode} +% Ensuite le colitemize pour les remarques. +% \begin{macrocode} +\DeclareColItemize{smc@remcolitemize} + {RemItemColor} + {% + \vrule width \ItemRuleWidth + height \ItemRuleHeight + depth \ItemRuleDepth + \relax + } +% \end{macrocode} +% Ensuite le colitemize pour les exemples. +% \begin{macrocode} +\DeclareColItemize{smc@exemplecolitemize} + {ExempleItemColor}{$\bullet$} +% \end{macrocode} +% Ensuite le colitemize pour les preuves. +% \begin{macrocode} +\DeclareColItemize{smc@proofcolitemize} + {ProofItemColor}{$\bullet$} +% \end{macrocode} +% Ensuite le colitemize pour les parties Exercices de base et +% Exercices d'approfondissement. +% \begin{macrocode} +\DeclareColItemize{smc@exercicecolitemize} + {ExerciceItemColor}{$\bullet$} +% \end{macrocode} +% Ensuite le colitemize pour les acquis +% \begin{macrocode} +\DeclareColItemize{smc@acquiscolitemize} + {AcquisItemColor}{$\bullet$} +% \end{macrocode} +% Ensuite le colitemize pour les commentaires. +% \begin{macrocode} +\DeclareColItemize{smc@commentairecolitemize} + {CommentaireItemColor}{$\bullet$} +% \end{macrocode} +% Ensuite le colitemize pour les récréation, énigmes. +% \begin{macrocode} +\DeclareColItemize{smc@recreationcolitemize} + {RecreationItemColor}{$\bullet$} +% \end{macrocode} +% Ensuite le colitemize pour les annexes. +% \begin{macrocode} +\DeclareColItemize{smc@annexecolitemize} + {AnnexeItemColor} + {% + \vrule width \ItemRuleWidth + height \ItemRuleHeight + depth \ItemRuleDepth + \relax + } +% \end{macrocode} +% Ensuite le colitemize pour le lexique. +% \begin{macrocode} +\DeclareColItemize{smc@lexiquecolitemize} + {LexiqueItemColor}{$\bullet$} +% \end{macrocode} +% Ensuite le colitemize pour le texte libre. +% \begin{macrocode} +\DeclareColItemize{smc@librecolitemize} + {LibreItemColor} + {% + \vrule width \ItemRuleWidth + height \ItemRuleHeight + depth \ItemRuleDepth + \relax + } +% \end{macrocode} +% \end{environment} +% \begin{environment}{colenumerate} +% Les environnements |colenumerate| permettent les listes numérotées +% sur plusieurs colonnes. Le code va être similaire à celui de +% |colitemize|. Pour la déclaration, il y aura besoin du nom de +% l'environnement d'une commande de fonte éventuelle et de la +% couleur. +% \begin{macrocode} +\newcommand*\DeclareColEnumerate[3]{% +% \end{macrocode} +% Tous les environnements |colenumerate| doivent spécifier le nombre de +% colonnes en premier argument. +% \begin{macrocode} + \newenvironment{#1}[1]{% + \par\leavevmode +% \end{macrocode} +% On commence par initialiser le comportement global de la liste en +% fonction de sa profondeur. Le compteur est indépendant des autres +% listes. Il s'agira de |\ni| qui sera en fait la variable de boucle +% interne des |\multido|. +% \begin{macrocode} + \advance\@enumdepth \@ne + \ifnum\@enumdepth>\thr@@ + \ClassError{sesamanuel}{Pas plus de 3 niveaux de liste} + {Consultez la documentation pour plus de renseignements.} + \else +% \end{macrocode} +% On définit la forme du compteur qui sera utilisé pour la +% liste. Cette forme dépend des paramètres transmis ainsi que de la +% profondeur de la liste. +% \begin{macrocode} + \ifcase\@enumdepth + \or %( + \def\@enumlabel{\textcolor{#3}{#2\ni)}}%( + \or + \def\@enumlabel{\textcolor{#3}{#2{\@alph\ni})}}%( + \or + \def\@enumlabel{\textcolor{#3}{#2{\@roman\ni)}}}% + \fi + \fi +% \end{macrocode} +% La suite est maintenant assez proche de ce qui se passait pour la +% macro |\DeclareColItemize|. +% \begin{macrocode} + \def\smc@nbcolumn{##1}% + \smc@nbitem \z@ +% \end{macrocode} +% Le test de fin se fait avec la chaîne \og colenumerate \fg{}. +% \begin{macrocode} + \edef\StringColCurrent{\StringColenumerate}% + \toks@{}% + \smc@getbody + } + {% + \expandafter\smc@splititem\the\toks@\item\@nil\item + \smc@nbline \numexpr \smc@nbitem+\smc@nbcolumn-1 + \divide\smc@nbline \smc@nbcolumn + \multido{\n=1+1}{\smc@nbline}{% + \multido{\ni=\n+\the\smc@nbline}{\smc@nbcolumn}{% + \unless\ifnum\ni>\smc@nbitem +% \end{macrocode} +% À ce niveau, le code diffère de ce qui se passait pour +% |\DeclareColItemize| puisque l'étiquette consiste en un nombre +% défini précédemment dans la macro |@enumlabel|. +% \begin{macrocode} + \makebox[\ListLabelWidth]{\@enumlabel\hss}% + \begin{minipage}[t]{\dimexpr + (\linewidth-\ListHSep*(\smc@nbcolumn-1))% + /\smc@nbcolumn-\ListLabelWidth} + \strut\@nameuse{smc@item\ni}\strut + \end{minipage}% + \hspace{\ListHSep}% + \fi + }% + \ifnum\n=\smc@nbline + \endgraf + \else + \\ + \fi + }% + }% +} +% \end{macrocode} +% On peut maintenant déclarer les environnements colenumerate des +% différentes parties. On commence par les listes dans les prérequis. +% \begin{macrocode} +\DeclareColEnumerate{smc@prerequiscolenumerate} + {}{PrerequisItemColor} +% \end{macrocode} +% |colenumerate| dans les méthodes. +% \begin{macrocode} +\DeclareColEnumerate{smc@exappcolenumerate} + {\bfseries}{ExAppItemColor} +% \end{macrocode} +% |colenumerate| dans les environnements de type définition. +% \begin{macrocode} +\DeclareColEnumerate{smc@defcolenumerate} + {\bfseries}{DefItemColor} +% \end{macrocode} +% |colenumerate| dans l'auto-évaluation. +% \begin{macrocode} +\DeclareColEnumerate{smc@AEcolenumerate} + {\bfseries}{AEItemColor} +% \end{macrocode} +% |colenumerate| dans les activités. +% \begin{macrocode} +\DeclareColEnumerate{smc@activitecolenumerate} + {}{ActiviteItemColor} +% \end{macrocode} +% |colenumerate| dans les remarques. +% \begin{macrocode} +\DeclareColEnumerate{smc@remcolenumerate} + {}{RemItemColor} +% \end{macrocode} +% |colenumerate| dans les exemples. +% \begin{macrocode} +\DeclareColEnumerate{smc@exemplecolenumerate} + {}{ExempleItemColor} +% \end{macrocode} +% |colenumerate| dans les preuves. +% \begin{macrocode} +\DeclareColEnumerate{smc@proofcolenumerate} + {}{ProofItemColor} +% \end{macrocode} +% |colenumerate| dans les parties Exercices de base et Exercices +% d'approfondissement. +% \begin{macrocode} +\DeclareColEnumerate{smc@exercicecolenumerate} + {\bfseries}{ExerciceItemColor} +% \end{macrocode} +% |colenumerate| dans la partie acquis. +% \begin{macrocode} +\DeclareColEnumerate{smc@acquiscolenumerate} + {\bfseries}{AcquisItemColor} +% \end{macrocode} +% |colenumerate| dans les commentaires. +% \begin{macrocode} +\DeclareColEnumerate{smc@commentairecolenumerate} + {\bfseries}{CommentaireItemColor} +% \end{macrocode} +% |colenumerate| dans les récréation, énigmes. +% \begin{macrocode} +\DeclareColEnumerate{smc@recreationcolenumerate} + {\bfseries}{RecreationItemColor} +% \end{macrocode} +% |colenumerate| dans les annexes. +% \begin{macrocode} +\DeclareColEnumerate{smc@annexecolenumerate} + {\bfseries}{AnnexeItemColor} +% \end{macrocode} +% |colenumerate| dans le lexique. +% \begin{macrocode} +\DeclareColEnumerate{smc@lexiquecolenumerate} + {\bfseries}{RecreationItemColor} +% \end{macrocode} +% |colenumerate| dans le texte libre. +% \begin{macrocode} +\DeclareColEnumerate{smc@librecolenumerate} + {\bfseries}{LibreItemColor} +% \end{macrocode} +% \end{environment} +% \begin{environment}{changemargin} +% Environnement général de changement de marge. +% \begin{macrocode} +\newenvironment{changemargin}[2]{% + \begin{list}{}{% + \setlength{\topsep}{0pt}% + \setlength{\leftmargin}{0pt}% + \setlength{\rightmargin}{0pt}% + \setlength{\listparindent}{0pt}% + \setlength{\itemindent}{0pt}% + \setlength{\parsep}{\parskip}% + \addtolength{\leftmargin}{#1}% + \addtolength{\rightmargin}{#2}% + }% + \item\relax +} +{\strut \end{list}} +% \end{macrocode} +% \end{environment} +% \section{Cadres et mises en page ponctuelles} +% \begin{environment}{cadre} +% Cadre avec un coin inférieur gauche biseauté. On a deux arguments +% optionnels pour indiquer les couleurs de cadre et de fond. Pour +% cette raison, il faudra définir l'environnement sous forme de +% macro. +% \begin{macrocode} +\newcommand*{\cadre}[1][]{% +% \end{macrocode} +% Le premier paramètre optionnel indique la couleur de ligne. Si il +% est vide, c'est la couleur par défaut qui est utilisée. +% \begin{macrocode} + \ifx\relax#1\relax + \colorlet{CurrCadreLineColor}{CadreLineColor}% + \else +% \end{macrocode} +% Sinon, c'est que la couleur de ligne est explicitement indiquée. +% \begin{macrocode} + \colorlet{CurrCadreLineColor}{#1}% + \fi +% \end{macrocode} +% On appelle alors la macro auxiliaire permettant de lire le +% deuxième argument optionnel et de commencer le travail véritable. +% \begin{macrocode} + \@cadre +} +\newcommand\@cadre[1][]{% +% \end{macrocode} +% On refait le travail précédent pour la couleur de fond. +% \begin{macrocode} + \ifx\relax#1\relax + \colorlet{CurrCadreBkgColor}{CadreBkgColor}% + \else + \colorlet{CurrCadreBkgColor}{#1}% + \fi +% \end{macrocode} +% On va stocker le corps de l'environnement dans une boîte contenant +% une minipage de l'empagement moins deux fois |\CadreSep| moins deux +% fois |\CadreLineWidth|. +% \begin{macrocode} + \def\smc@cadre@color{#1}% + \begin{lrbox}{\smc@boxa}% + \minipage{\dimexpr \linewidth-\CadreSep*2-\CadreLineWidth*2}% +} +% \end{macrocode} +% Partie terminale de l'environnement +% \begin{macrocode} +\def\endcadre +{% + \endminipage + \end{lrbox}% +% \end{macrocode} +% La boîte est construite, il reste à construire le cadre biseauté à +% la bonne taille et à placer la boîte dans le cadre. +% \begin{macrocode} + \par\addvspace{\BeforeCadreVSpace} +% \end{macrocode} +% On peut maintenant construire le cadre +% \begin{macrocode} + \begin{pspicture}(0,\dimexpr\ht\smc@boxa+\CadreSep+\CadreLineWidth) + (\linewidth,-\dimexpr\dp\smc@boxa+\CadreSep+\CadreLineWidth) +% \end{macrocode} +% Pose des nœuds utiles. Tout est calculé automatiquement à partir des +% deux coins opposés. +% \begin{macrocode} + \pnode(0,\dimexpr\ht\smc@boxa+\CadreSep+\CadreLineWidth){A} + \pnode(\linewidth,-\dimexpr\dp\smc@boxa+\CadreSep+\CadreLineWidth){C} + \pnode(A|C){B} + \pnode(C|A){D} + \pnode([nodesep=-\SquareWidth]C){C1} + \pnode([offset=\SquareWidth]C){C2} +% \end{macrocode} +% Affichage du cadre. +% \begin{macrocode} + \pspolygon[linecolor=CurrCadreLineColor, + linewidth=\CadreLineWidth, fillstyle=solid, + fillcolor=CurrCadreBkgColor] + (A)(B)(C1)(C2)(D) +% \end{macrocode} +% Affichage du contenu. +% \begin{macrocode} + \rput[Bl](\dimexpr\CadreSep+\CadreLineWidth,0) + {\usebox{\smc@boxa}} + \end{pspicture} + \par\addvspace{\AfterCadreVSpace} +} +% \end{macrocode} +% \end{environment} +% \begin{environment}{smc@cadre} +% Environnement général de construction d'un cadre avec fond coloré, +% bord éventuel et coins arrondis à la demande. Pour cela, +% l'environnement demande un argument optionnel, un +% argument obligatoire et un troisième argument optionnel. Ils +% indiquent, dans l'ordre : +% \begin{itemize} +% \item les coins devant être arrondis (en partant du coin inférieur +% gauche et en tournant dans le sens inverse des aiguilles d'une +% montre avec une suite de valeurs entières séparées par des virgules +% qui donnent un multiple de dixième de la valeur |\FrameArc| donc 0 +% indique un coin carré et 10 un coint arrondi avec ce rayon) ; +% \item la couleur de fond ; +% \item la couleur de bordure. +% \end{itemize} +% S'il n'y a pas de couleur de bordure, il n'y a pas de bordure du +% tout. Le cadre utilise les longueurs |\FrameSep| indiquant la +% distance entre le texte et les bords du cadre, |\FrameLineWidth| +% indiquant l'épaisseur du bord éventuel, |\FrameArc| indiquant le +% rayon de l'arc. +% +% En raison de l'examen de paramètres dans un ordre non conventionnel +% (pour \LaTeX{}), on définit l'environnement |smc@cadre| comme étant +% le couple |\smc@cadre| |\endsmc@cadre|. La valeur par défaut du +% premier argument optionnel est |0,0,0,0| ce qui donne quatre coins +% carrés. +% \begin{macrocode} +\newcommand*\smc@cadre[2][0,0,0,0]{% +% \end{macrocode} +% Il faut sauvegarder les arguments car on ne s'en servira que dans la +% partie terminale de l'environnement, en l'occurrence dans la macro +% |\endcadre|. +% \begin{macrocode} + \def\smc@framecorner{#1}% + \def\smc@framebkgcolor{#2}% + \smc@@cadre +} +% \end{macrocode} +% La macro auxiliaire a une valeur par défaut vide pour le second +% paramètre optionnel de l'environnement, c'est-à-dire qu'il n'y aura +% pas de bord. +% \begin{macrocode} +\newcommand*\smc@@cadre[1][]{% +% \end{macrocode} +% On sauvegarde également l'argument optionnel pour la même raison que +% ci-dessus. +% \begin{macrocode} + \def\smc@framelinecolor{#1}% +% \end{macrocode} +% Le contenu de l'environnement sera composé dans une minipage de +% largeur égale à l'empagement moins deux fois l'espace |\FrameSep| +% et, si besoin, deux fois l'épaisseur |\FrameLineWidth|. On calcule +% également le décalage horizontal de la boîte dans le cadre final. +% \begin{macrocode} + \ifx\smc@framelinecolor\empty + \edef\smc@framehoffset{\the\dimexpr\FrameSep*2}% + \edef\smc@framewidth + {\the\dimexpr\linewidth-\smc@framehoffset}% + \else + \edef\smc@framehoffset{\the\dimexpr\FrameSep*2+\FrameLineWidth*2}% + \edef\smc@framewidth + {\the\dimexpr\linewidth-\smc@framehoffset}% + \fi +% \end{macrocode} +% Le code initiale se termine en mettant en boîte l'ensemble du corps +% de l'environnement pour l'afficher ensuite avec son cadre +% coloré. +% \begin{macrocode} + \setbox0=\hbox\bgroup + \minipage{\smc@framewidth}% + \ignorespaces +} +% \end{macrocode} +% La macro |\endsmc@cadre| correspond au code terminal de +% l'environnement. C'est elle qui fera tout le travail de composition +% après avoir refermé la minipage et sa boîte englobante. +% \begin{macrocode} +\def\endsmc@cadre{% + \endminipage + \egroup +% \end{macrocode} +% Le principe va être d'afficher d'abord le cadre et de placer le +% texte au dessus. Comme les coins peuvent être ou non arrondis +% individuellement, on va utiliser |\pscustom| pour construire le +% pourtour. Le cadre à une largeur égal à |\linewidth| est une hauteur +% égale à celle du texte plus deux fois |\FrameSep| et, éventuellement +% plus deux fois |\FrameLineWidth|. On commence donc par calculer la +% profondeur et la hauteur du cadre et on initialise les paramètres +% PSTsicks pour le tracé du cadre. Pour faciliter le code ultérieur, +% s'il n'y a pas de bord, on force la longueur |\FrameLineWith| à être +% nulle. +% \begin{macrocode} + \ifx\smc@framelinecolor\empty + \edef\smc@ymin{\the\dimexpr-\dp0-\FrameSep}% + \edef\smc@ymax{\the\dimexpr\ht0+\FrameSep}% + \psset{linewidth=0pt, linestyle=none, + fillstyle=solid, fillcolor=\smc@framebkgcolor} + \else + \edef\smc@ymin{\the\dimexpr -\dp0-\FrameSep-\FrameLineWidth}% + \edef\smc@ymax{\the\dimexpr\ht0+\FrameSep+\FrameLineWidth}% + \psset{linewidth=\FrameLineWidth, linecolor=\smc@framelinecolor, + fillstyle=solid, fillcolor=\smc@framebkgcolor} + \def\FrameLineWidth{0pt}% + \fi +% \end{macrocode} +% Avant de commencer le cadre proprement dit, il faut analyser la +% chaîne d'indication des arrondis de coin. On va en fait mémoriser +% les quatre nombres dans les quatre macros |\smc@corner@dl|, +% |\smc@corner@dr|, |\smc@corner@ur| et |\smc@corner@ul|, dans l'ordre +% où les valeurs sont lues. +% \begin{macrocode} + \smc@parse@corner{\smc@framecorner}% +% \end{macrocode} +% Tout est en place pour procéder à la composition proprement dite +% \begin{macrocode} + \begin{pspicture}(0,\smc@ymin)(\linewidth,\smc@ymax) +% \end{macrocode} +% Il n'y a pas besoin de spécifier les paramètres au niveau de la +% commande |\pscustom| puisque ceux-ci ont été déclarés auparavant. +% \begin{macrocode} + \pscustom{% +% \end{macrocode} +% Arc du coin inférieur gauche et ligne du coin inférieur gauche au +% coin inférieur droit. +% \begin{macrocode} + \psarc(\dimexpr \FrameArc/10*\smc@corner@dl, + \dimexpr \smc@ymin+\FrameArc/10*\smc@corner@dl) + {\dimexpr \FrameArc/10*\smc@corner@dl}{180}{270} + \psline(\dimexpr \FrameArc/10*\smc@corner@dl, + \smc@ymin) + (\dimexpr \linewidth-\FrameArc/10*\smc@corner@dr, + \smc@ymin) +% \end{macrocode} +% Arc du coin inférieur droit et ligne du coin inférieur droit au coin +% supérieur droit. +% \begin{macrocode} + \psarc(\dimexpr \linewidth-\FrameArc/10*\smc@corner@dr, + \dimexpr \smc@ymin+\FrameArc/10*\smc@corner@dr) + {\dimexpr \FrameArc/10*\smc@corner@dr}{270}{360} + \psline(\linewidth, + \dimexpr \smc@ymin+\FrameArc/10*\smc@corner@dr) + (\linewidth, + \dimexpr \smc@ymax-\FrameArc/10*\smc@corner@ur) +% \end{macrocode} +% Arc du coin supérieur droit et ligne du coin supérieur droit au +% coin supérieur gauche. +% \begin{macrocode} + \psarc(\dimexpr \linewidth-\FrameArc/10*\smc@corner@ur, + \dimexpr \smc@ymax-\FrameArc/10*\smc@corner@ur) + {\dimexpr \FrameArc/10*\smc@corner@ur}{0}{90} + \psline(\dimexpr \linewidth-\FrameArc/10*\smc@corner@ur, + \smc@ymax) + (\dimexpr \FrameArc/10*\smc@corner@ul, + \smc@ymax) +% \end{macrocode} +% Arc du coin supérieur gauche et ligne du coin supérieur gauche au +% coin inférieur gauche. +% \begin{macrocode} + \psarc(\dimexpr \FrameArc/10*\smc@corner@ul, + \dimexpr \smc@ymax-\FrameArc/10*\smc@corner@ul) + {\dimexpr \FrameArc/10*\smc@corner@dr}{90}{180} + \psline(0, + \dimexpr \smc@ymax-\FrameArc/10*\smc@corner@ul) + (0, + \dimexpr \smc@ymin+\FrameArc/10*\smc@corner@dl) + } +% \end{macrocode} +% Le cadre est terminé, il reste à placer le contenu de +% l'environnement. +% \begin{macrocode} + \rput[Bl](\dimexpr \FrameSep+\FrameLineWidth,0){\box0} + \end{pspicture}% +} +% \end{macrocode} +% On définit maintenant la commande qui analyse les valeurs des coins +% (afin de déterminer l'arrondi). +% \begin{macrocode} +\newcommand*\smc@parse@corner[1]{% +% \end{macrocode} +% On acceptera qu'il y ait moins de quatre argument et qu'un argument +% vide équivaut à zéro. Pour cela, on ajoute quatre valeurs vides à +% la suite de l'argument transmis. +% \begin{macrocode} + \expandafter\smc@@parse@corner#1,,,,\@nil +} +\def\smc@@parse@corner#1,#2,#3,#4,#5\@nil{% +% \end{macrocode} +% L'ordre des arguments est toujours inférieur-gauche, +% inférieur-droite, supérieur-droit, supérieur-gauche. +% \begin{macrocode} + \def\smc@corner@dl{#1}% + \ifx\smc@corner@dl\empty + \def\smc@corner@dl{0}% + \fi + \def\smc@corner@dr{#2}% + \ifx\smc@corner@dr\empty + \def\smc@corner@dr{0}% + \fi + \def\smc@corner@ur{#3}% + \ifx\smc@corner@ur\empty + \def\smc@corner@ur{0}% + \fi + \def\smc@corner@ul{#4}% + \ifx\smc@corner@ul\empty + \def\smc@corner@ul{0}% + \fi +% \end{macrocode} +% Le cinquième argument sert à faire le ménage au niveau des virgules +% inutilisées. +% \begin{macrocode} +} +% \end{macrocode} +% \end{environment} +% \begin{environment}{tableau} +% Rien n'empèche d'utiliser les environnements de tableau de \LaTeX{} +% mais l'environnement |tableau| permet d'automatiser la +% présentation. En particulier, les cellules colorés seront toujours +% de la même couleur, les filets utiliseront un gris particulier et +% les colonnes de type X sont verticalement centrées. +% +% Le principe va être d'avoir un paramètre optionnel +% indiquant le type du tableau et un ou plusieurs paramètres +% obligatoires en fonction du type de tableau choisi. On aura : +% \begin{itemize} +% \item |t| Toutes les colonnes de même largeur, argument 1 $\to$ +% largeur, argument 2 $\to$ nombre de colonnes. +% \item |c| Toutes les colonnes de même largeur, colonne de gauche en +% jaune, argument 1 $\to$ largeur, argument 2 $\to$ nombre de +% colonnes (c'est le type par défaut). +% \item |l| Toutes les colonnes de même largeur, ligne du haut en +% jaune, argument 1 $\to$ largeur, argument 2 $\to$ nombre de +% colonnes. +% \item |cl| Toutes les colonnes de même largeur, ligne du haut et +% colonne de gauche en jaune, argument 1 $\to$ largeur, argument 2 +% $\to$ nombre de colonnes. +% \item |lc| synonyme de |cl|. +% \item |T|, |C| |L|, |CL| |LC| comme précédemment sauf que la +% première colonne aura un motif libre qu'il faudra renseigner avec le +% dernier argument. +% \item |pr| Le tableau prendra la largeur d'empagement, il aura trois +% colonnes avec une colonne centrale environ deux fois plus large que +% les colonnes externes et colorée. La troisième colonne sera centrée. +% \end{itemize} +% +% En revanche, la syntaxe des tableaux sera celle habituelle à +% l'intérieur de l'environnement (utilisation des |&| et des commandes +% |\\|, |\hline|, |\cline|, |\multicolumn|, etc. La classe charge les +% extensions suivantes pour gérer tous ces cas : +% \begin{itemize} +% \item tabularx ; +% \item multirow ; +% \item xcolor avec la l'option table. +% \end{itemize} +% |\tableau| est bien un environnement mais on va le déclarer en tant +% que commande car son code final dépend de l'option choisie et c'est +% donc plus simple de le coder de cette façon. +% \begin{macrocode} +\newcommand{\tableau}[1][c]{% +% \end{macrocode} +% Quel que soit le type de tableau, on indique la couleur des filets +% et les colonnes X sont centrées verticalement et horizontalement. +% \begin{macrocode} + \arrayrulecolor{FiletTableauColor}% + \renewcommand\tabularxcolumn[1]{>{\centering\arraybackslash}m{##1}}% +% \end{macrocode} +% On construit maintenant le code initial et final en fonction de +% l'argument optionnel. Pour cela, on teste si la macro +% |\tableau| existe. Si oui, c'est elle qui sera utilisée, +% sinon, on émet un message d'erreur et on utilise le type c à la place. +% \begin{macrocode} + \ifcsname#1tableau\endcsname + \expandafter\let\expandafter\smc@next\csname#1tableau\endcsname + \expandafter\let\expandafter\endtableau\csname end#1tableau\endcsname + \else + \ClassError{sesamanuel} + {Le type de tableau #1 n'existe pas} + {Les types possibles sont 't', 'c', 'l', 'cl', 'T', 'C', + 'L', 'CL' et 'pr'.}% + \let\smc@next\ctableau + \let\endtableau\endctableau + \fi +% \end{macrocode} +% Il ne reste plus qu'à lancer l'environnement précédemment assigné +% avec un espacement vertical précédent. +% \begin{macrocode} + \par\addvspace{\BeforeTableVSpace} + \smc@next +} +% \end{macrocode} +% On définit maintenant les véritables environnements de travail. +% +% L'environnement |ttableau| demande comme arguments la largeur du +% tableau et le nombre de colonnes. +% \begin{macrocode} +\newenvironment{ttableau}[2] +{\tabularx{#1}{|*{#2}{X|}}} +{\endtabularx\par\addvspace{\AfterTableVSpace}} +% \end{macrocode} +% L'environnement |Ttableau| demande comme arguments la largeur du +% tableau, le nombre de colonnes et le motif de la première colonne. +% \begin{macrocode} +\newenvironment{Ttableau}[3] +{\tabularx{#1}{|#3|*{\numexpr#2-1}{X|}}} +{\endtabularx\par\addvspace{\AfterTableVSpace}} +% \end{macrocode} +% L'environnement |ctableau| demande comme arguments la largeur du +% tableau et le nombre de colonnes. Pour la colonne en couleur, on +% utilise le premier argument optionnel de |\columncolor| pour +% permettre un affichage complet du filet gauche. +% \begin{macrocode} +\newenvironment{ctableau}[2] +{% + \tabularx{#1}{% + |>{\columncolor{FondTableaux}[\dimexpr\tabcolsep-0.5pt]}X| + *{\numexpr#2-1}{X|}}% +} +{\endtabularx\par\addvspace{\AfterTableVSpace}} +% \end{macrocode} +% L'environnement |Ctableau| demande comme arguments la largeur du +% tableau, le nombre de colonnes et le motif de la première colonne. +% \begin{macrocode} +\newenvironment{Ctableau}[3] +{% + \tabularx{#1}{% + |>{\columncolor{FondTableaux}[\dimexpr\tabcolsep-0.5pt]}#3| + *{\numexpr#2-1}{X|}}% +} +{\endtabularx\par\addvspace{\AfterTableVSpace}} +% \end{macrocode} +% L'environnement |ltableau| demande comme arguments la largeur du +% tableau et le nombres de colonnes. +% \begin{macrocode} +\newenvironment{ltableau}[2] +{% + \tabularx{#1}{|*{#2}{X|}} + \rowcolor{FondTableaux} +} +{\endtabularx\par\addvspace{\AfterTableVSpace}} +% \end{macrocode} +% L'environnement |Ltableau| demande comme arguments la largeur du +% tableau, le nombres de colonnes et le motif de la première colonne. +% \begin{macrocode} +\newenvironment{Ltableau}[3] +{% + \tabularx{#1}{|#3|*{\numexpr#2-1}{X|}} + \rowcolor{FondTableaux} +} +{\endtabularx\par\addvspace{\AfterTableVSpace}} +% \end{macrocode} +% L'environnement |cltableau| demande comme arguments la largeur du +% tableau et le nombre de colonnes. Pour la colonne en couleur, on +% utilise le premier argument optionnel de |\columncolor| pour +% permettre un affichage complet du filet gauche. +% \begin{macrocode} +\newenvironment{cltableau}[2] +{% + \tabularx{#1}{% + |>{\columncolor{FondTableaux}[\dimexpr\tabcolsep-0.5pt]}X| + *{\numexpr#2-1}{X|}}% + \rowcolor{FondTableaux} +} +{\endtabularx\par\addvspace{\AfterTableVSpace}} +% \end{macrocode} +% L'environnement |CLtableau| demande comme arguments la largeur du +% tableau, le nombre de colonnes et le motif de la première colonne. +% \begin{macrocode} +\newenvironment{CLtableau}[3] +{% + \tabularx{#1}{% + |>{\columncolor{FondTableaux}[\dimexpr\tabcolsep-0.5pt]}#3| + *{\numexpr#2-1}{X|}}% + \rowcolor{FondTableaux} +} +{\endtabularx\par\addvspace{\AfterTableVSpace}} +% \end{macrocode} +% Les environnements |lctableau| et |LCtableau| ne sont que des alias +% de |cltableau| et |CLtableau|. +% \begin{macrocode} +\let\lctableau\cltableau +\let\endlctableau\endcltableau +\let\LCtableau\CLtableau +\let\endLCtableau\endCLtableau +% \end{macrocode} +% Le type |pr| permet de construire le tableau des propriétés dans la +% partie annexe. il ne demande que la largeur de tableau en +% paramètre. Il utilise la couleur |TablePropertyBkgColor| pour le +% fond de la deuxième colonne et les couleurs +% |TablePropertyTitleBkgColor| et |TablePropertyTitleTextColor| pour +% les couleurs de fond et de texte du titre \og propriété \fg{}. +% \begin{macrocode} +\newenvironment{prtableau}[1] +{% +% \end{macrocode} +% On redéfinit la macro |\propriete| à l'intérieur de l'environnement +% \begin{macrocode} + \def\propriete{% + \refstepcounter{propriete}% + \psframebox*[fillcolor=TablePropertyTitleBkgColor]{% + \ProprieteFont + \textcolor{TablePropertyTitleTextColor}{ \MakeUppercase{\StringPropriete}} + \NumProprieteFont + \textcolor{TablePropertyTitleTextColor}{\thepropriete} + } + }% +% \end{macrocode} +% On peut ensuite composer le tableau proprement dit. +% \begin{macrocode} + \longtable{% +% \end{macrocode} +% Après discussions et retouches diverses, on va partager partager +% |#1| avec les facteurs 0.24/0.46/0.30. Il faut également prévoir les +% 6 |\tabcolsep|. +% \begin{macrocode} + >{\leavevmode\endgraf\vspace{-0.3\baselineskip}} + m{0.24\dimexpr#1-6\tabcolsep} + <{\endgraf\vspace{-0.3\baselineskip}} + >{% + \leavevmode\endgraf\vspace{-0.3\baselineskip} + \columncolor{TablePropertyBkgColor} + } + m{0.46\dimexpr#1-6\tabcolsep} + <{\endgraf\vspace{-0.3\baselineskip}} + >{% + \centering\arraybackslash + \leavevmode\endgraf\vspace{-0.3\baselineskip} + } + m{0.30\dimexpr#1-6\tabcolsep} + <{\endgraf\vspace{-0.3\baselineskip}} + }% +} +{\endlongtable\par\addvspace{\AfterTableVSpace}} +% \end{macrocode} +% \end{environment} +% \begin{macro}{\tabX} +% La macro |\tabX| permet d'obtenir des cases avec une croix à +% l'intérieur qui joint les coins opposés. Cette macro admet un +% argument optionnel indiquant la hauteur et la profondeur de la +% cellule (par défaut hauteur et profondeur d'une ligne normale de +% tableau). +% \begin{macrocode} +\newcommand\tabX[1][\ht\@arstrutbox,\dp\@arstrutbox]{% +% \end{macrocode} +% On commence par analyser l'argument optionnel pour placer les deux +% valeurs séparées par une virgule dans les deux macros |\smc@htTabX| +% et |\smc@dpTabX|. +% \begin{macrocode} + \smc@GetVTabX#1,,\@nil +% \end{macrocode} +% On place un strut de la hauteur et profondeur indiquée pour forcer +% effectivement la ligne a avoir ces dimensions verticales. +% \begin{macrocode} + \vrule width0pt height\smc@htTabX depth-\smc@dpTabX +% \end{macrocode} +% On pose d'abord les nœuds gauches (supérieur puis inférieur). +% \begin{macrocode} + \pnode(-\tabcolsep,\smc@htTabX){ul} + \pnode(-\tabcolsep,\smc@dpTabX){dl} +% \end{macrocode} +% On réalise un saut avec un ressort infini pour se placer sur la +% droite de la cellule afin de placer les nœuds droits (supérieur et +% inférieur). +% \begin{macrocode} + \hspace*{\stretch{1}}% + \pnode(\tabcolsep,\smc@htTabX){ur} + \pnode(\tabcolsep,\smc@dpTabX){dr} +% \end{macrocode} +% Il ne reste plus qu'à tracer la croix. +% \begin{macrocode} + \psline(ul)(dr) + \psline(dl)(ur) +} +% \end{macrocode} +% Macro de sauvegarde d'une liste de deuc valeurs séparées par une +% virgule en deux macros |\smc@htTabX| et |\smc@dpTabX|. +% \begin{macrocode} +\def\smc@GetVTabX#1,#2,{% + \edef\smc@htTabX{\the\dimexpr#1}% + \edef\smc@dpTabX{-\the\dimexpr#2}% + \smc@gobblenil +} +\def\smc@gobblenil#1\@nil{} +% \end{macrocode} +% \end{macro} +% \begin{environment}{debordedroite} +% L'environnement |debordedroite| ajoute une marge de +% |\ExtraMarginRight| à droite. +% \begin{macrocode} +\newenvironment{debordedroite}{% + \changemargin{0mm}{-\ExtraMarginRight}% +} +{\par\endchangemargin} +% \end{macrocode} +% \end{environment} +% \begin{macro}{\habillage} +% Cette macro permet d'habiller une image par le texte. Sa syntaxe est +% la suivante :\\ +% |\habillage{
}|\\ +% \begin{macrocode} +\newcommand*\habillage[1]{% +% \end{macrocode} +% Le principe va être de placer la figure en la faisant déborder dans +% la marge droite. Si la figure fait moins de |\ExtraMarginRight| +% de large, elle n'ira pas jusqu'à la fin de cette marge +% supplémentaire sinon, elle est placée pour aller jusqu'à cette marge +% et le texte est composée sur une largeur adéquate de façon +% automatique par la macro |\parpic|. +% +% Pour cela, on va tricher sur la largeur de la figure. Elle sera de +% |-\ExtraMarginRight| si cette quantité est positive ou bien +% nulle sinon. En réalité, il y a un petit bug à ce niveau (de parpic +% je pense) et il ne faut pas que la largeur soit totalement nulle, +% d'où la valeur un peu étrange de |0.1pt|. Pour faire tous ces +% calculs, il faut au préalable mettre le matériel en boîte. +% \begin{macrocode} + \setbox\smc@boxb=\hbox{#1}% + \smc@dimb = \dimexpr\wd\smc@boxb-\ExtraMarginRight\relax + \ifdim \smc@dimb<\z@ + \smc@dimb = 0.1pt + \fi +% \end{macrocode} +% On peut maintenant appeler la macro |\parpic|. +% \begin{macrocode} + \parpic[r]{\makebox[\smc@dimb][l]{{#1}}} +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\u} +% La classe permet de gérer les unités de façon simple avec des macros +% de type |\uxx| où |xx| indique l'unité choisie. Le nombre est mis en +% forme selon les standards français. +% +% Au départ, on sauvegarde la valeur de la macro |\u| dans |\uori|. Il +% s'agit de la macro d'accent rond inverse. On déclare alors les deux +% macros qui ne demandent aucune unité. +% \begin{macrocode} +\let\uori\u +% \end{macrocode} +% Le |\U| est parfois défini. On le tue. +% \begin{macrocode} +\let\Uori\U +\let\U\relax +\newcommand\U[1]{\ensuremath{#1}} +\renewcommand\u[1]{\ensuremath{\nombre{#1}}} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\newunit} +% Macro générale de création de macros d'unité. Cette macro demande +% deux paramètres : le nom de la macro et l'unité à afficher (en mode +% texte). +% \begin{macrocode} +\newcommand\newunit[2]{% +% \end{macrocode} +% On commence avec la macro où le nombre est écrit avec la macro +% |\nombre|. Le nom de cette macro est |\u| où || est le +% premier argument de |\newunit|. +% \begin{macrocode} + \expandafter\newcommand\csname u#1\endcsname[1]{% +% \end{macrocode} +% Si le nombre passé est totalement vide, on n'affiche que l'unité. +% \begin{macrocode} + \@ifmtarg{##1} + {\ensuremath{#2}} + {\ensuremath{\nombre{##1}\,#2}}% + }% +% \end{macrocode} +% On fait exactement la même chose avec la macro |\U|. La +% diiférence est que le nombre est composé directement en mode +% mathématique (sans la macro |\nombre|). Cela permet de passer des +% expressions mathématiques. +% \begin{macrocode} + \expandafter\newcommand\csname U#1\endcsname[1]{% + \@ifmtarg{##1} + {\ensuremath{#2}} + {\ensuremath{##1\,#2}}% + }% +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\renewunit} +% La macro |\renewunit| permet à l'utilisateur de redéfinir des unités +% existantes. C'est exactement le même code que ci-dessus mais avec un +% |\renewcommand| à la place des |\newcommand|. +% \begin{macrocode} +\newcommand\renewunit[2]{% + \expandafter\renewcommand\csname u#1\endcsname[1]{% + \@ifmtarg{##1} + {\ensuremath{#2}} + {\ensuremath{\nombre{##1}\,#2}}% + }% + \expandafter\renewcommand\csname U#1\endcsname[1]{% + \@ifmtarg{##1} + {\ensuremath{#2}} + {\ensuremath{##1\,#2}}% + }% +} +% \end{macrocode} +% \end{macro} +% On utilise la macro |\newunit| pour créer des macros d'unités +% de longueur. +% \begin{macrocode} +\newunit{ym}{\text{ym}} +\newunit{zm}{\text{zm}} +\newunit{am}{\text{am}} +\newunit{fm}{\text{fm}} +\newunit{pm}{\text{pm}} +\newunit{nm}{\text{nm}} +\newunit{micron}{\mu\text{m}} +\newunit{mm}{\text{mm}} +\newunit{cm}{\text{cm}} +\newunit{dm}{\text{dm}} +\newunit{m}{\text{m}} +\newunit{dam}{\text{dam}} +\newunit{hm}{\text{hm}} +\newunit{km}{\text{km}} +\newunit{Mm}{\text{Mm}} +\newunit{Gm}{\text{Gm}} +\newunit{Tm}{\text{Tm}} +\newunit{Pm}{\text{Pm}} +\newunit{Em}{\text{Em}} +\newunit{Zm}{\text{Zm}} +\newunit{Ym}{\text{Ym}} +% \end{macrocode} +% Unités de surface. +% \begin{macrocode} +\newunit{mmq}{\text{mm}^2} +\newunit{cmq}{\text{cm}^2} +\newunit{dmq}{\text{dm}^2} +\newunit{mq}{\text{m}^2} +\newunit{damq}{\text{dam}^2} +\newunit{hmq}{\text{hm}^2} +\newunit{kmq}{\text{km}^2} +\newunit{ha}{\text{ha}} +% \end{macrocode} +% Unités de volume. +% \begin{macrocode} +\newunit{mmc}{\text{mm}^3} +\newunit{cmc}{\text{cm}^3} +\newunit{dmc}{\text{dm}^3} +\newunit{mc}{\text{m}^3} +\newunit{damc}{\text{dam}^3} +\newunit{hmc}{\text{hm}^3} +\newunit{kmc}{\text{km}^3} +% \end{macrocode} +% Unités de volume en litre. +% \begin{macrocode} +\newunit{hl}{\text{hl}} +\newunit{dal}{\text{dal}} +\newunit{l}{\text{l}} +\newunit{dl}{\text{dl}} +\newunit{cl}{\text{cl}} +\newunit{ml}{\text{ml}} +% \end{macrocode} +% Unité de volume en litre (avec un joli \og l \fg{}) +% \begin{macrocode} +\newunit{hel}{\text{h$\ell$}} +\newunit{dael}{\text{da$\ell$}} +\newunit{el}{\text{$\ell$}} +\newunit{del}{\text{d$\ell$}} +\newunit{cel}{\text{c$\ell$}} +\newunit{mel}{\text{m$\ell$}} +% \end{macrocode} +% Unité de temps +% \begin{macrocode} +\newunit{s}{\text{s}} +\newunit{min}{\text{min}} +\newunit{h}{\text{h}} +\newunit{ms}{\text{m$\cdot$s}^{-1}} +\newunit{mh}{\text{m$\cdot$h}^{-1}} +\newunit{kms}{\text{km$\cdot$s}^{-1}} +\newunit{kmmin}{\text{km$\cdot$min}^{-1}} +\newunit{kmh}{\text{km$\cdot$h}^{-1}} +% \end{macrocode} +% Unité de débit +% \begin{macrocode} +\newunit{ls}{\text{$\ell\cdot$s}^{-1}} +% \end{macrocode} +% Unités de masses +% \begin{macrocode} +\newunit{mg}{\text{mg}} +\newunit{cg}{\text{cg}} +\newunit{dg}{\text{dg}} +\newunit{g}{\text{g}} +\newunit{dag}{\text{dag}} +\newunit{hg}{\text{hg}} +\newunit{kg}{\text{kg}} +\newunit{T}{\text{T}} +% \end{macrocode} +% Autres unité +% \begin{macrocode} +\newunit{pc}{\%} +\newunit{deg}{\text{\degre}} +\newunit{degc}{\text{\degre C}} +\newunit{euro}{\text{\euro}} +% \end{macrocode} +% \begin{macro}{\algo} +% Quelques cartouches de signalitique sont proposés. On commence avec +% celle indiquant une activité ou un exercice traitant +% d'algorithmique. +% \begin{macrocode} +\newcommand*\algo{% + \psframebox[framesep=1pt,linewidth=\LogoLineWidth, + linecolor=AlgoLineColor, fillstyle=solid, + fillcolor=AlgoBkgColor, framearc=0.6]{% + \AlgoFont + \textcolor{AlgoTextColor}{\StringALGO}% + } +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\tice} +% Le deuxième logo est celui dédié au TICE. Il se construit +% exactement comme le logo Algo. Seul le texte (bien sûr) et les +% couleurs changent. +% \begin{macrocode} +\newcommand*\tice{% + \psframebox[framesep=1pt,linewidth=\LogoLineWidth, + linecolor=TiceLineColor, fillstyle=solid, + fillcolor=TiceBkgColor, framearc=0.6]{% + \TiceFont + \textcolor{TiceTextColor}{\StringTICE}% + } +} +% \end{macrocode} +% \end{macro} +% \begin{environment}{oldalgorithme} +% Dans une première version, l'environnement algorithme consistait +% uniquement à afficher le contenu dans un cadre arrondi avec fond +% coloré en respectant les saut de ligne et les espaces et avec une +% numérotation des lignes. +% +% En fait, dans la deuxième version, toute la structure des +% algorithmes est décrite en terme de macro. Tout l'arsenal de +% traitement verbatim devient donc totalement inutile. On conserve +% quand même l'ancien environnement sous le nom |oldalgorithme|. +% +% Le compteur |smc@line| va servir à numéroter les lignes. +% \begin{macrocode} +\newcounter{smc@line} +\newenvironment{oldalgorithme}{% +% \end{macrocode} +% Les algorithmes sont affichés avec la fonte à chasse fixe. On remet +% ensuite le compteur de ligne à zéro. +% \begin{macrocode} + \ttfamily + \c@smc@line \z@ +% \end{macrocode} +% Avant de rendre la fin de ligne active (et équivalente à |\par|) +% avec la commande |\obeylines|, on redéfinit |\par|. Celle-ci doit +% non seulement passer au paragraphe suivant mais aussi afficher le +% numéro de ligne. On ne peut pas le faire de façion systématique +% sinon, la ligne |\end{oldalgorithme}| provoquerait une ligne vide +% numérotée dans le résultat. Pour cela, on regarde ce qui suit le +% saut de ligne. +% \begin{macrocode} + \def\par{% + \@@par + \afterassignment\smc@displaynum\let\next=% + }% +% \end{macrocode} +% Si ce qui suit le saut de ligne est |\end|, on réinjecte le |\end| +% sans rien faire. +% \begin{macrocode} + \def\smc@displaynum{% + \ifx\next\end + \expandafter\end + \else +% \end{macrocode} +% Sinon, on incrémente le compteur de ligne est on l'affiche dans sa +% boîte. +% \begin{macrocode} + \global\advance\c@smc@line\@ne% + \leavevmode\hb@xt@\AlgorithmeNumWidth{\the\c@smc@line.\hss}% +% \end{macrocode} +% L'unité lexicale lue doit être réinjectée après le numéro de ligne +% et en faisant attention à terminer le développement de |\fi| au +% préalable au cas où l'unité sera une macro à paramètre (par +% exemple). +% \begin{macrocode} + \expandafter\next + \fi% + }% +% \end{macrocode} +% Les ponctuations doubles ne doivent pas gérer seules les +% espacements. +% \begin{macrocode} + \shorthandoff{;:!?}% +% \end{macrocode} +% Tout est prêt pour activer les espaces (avec la commandes +% \LaTeX{} |\@vobeyspaces| qui permet de garder les espaces de début +% de ligne) et les sauts de ligne. +% \begin{macrocode} + \@vobeyspaces + \obeylines +% \end{macrocode} +% Le reste de l'environnement consiste à placer le corps de +% l'environnement dans une boîte dont la largeur doit prévoir les +% marges et les filets. +% \begin{macrocode} + \begin{lrbox}{\smc@boxa}% + \minipage{\dimexpr\linewidth-\AlgorithmeRuleWidth*2-\AlgorithmeSep*2}% +} +{% +% \end{macrocode} +% En fin d'environnement, on ferme la minipage et la boîte. +% \begin{macrocode} + \endminipage + \end{lrbox}% +% \end{macrocode} +% On passe au paragraphe suivant (avec la primitive |\@@par|). +% \begin{macrocode} + \@@par\addvspace{\BeforeAlgorithmeVSpace} +% \end{macrocode} +% On peut alors afficher le cadre et son contenu ! +% \begin{macrocode} + \psframebox[linecolor=AlgorithmeRuleColor, + linewidth=\AlgorithmeRuleWidth, + fillstyle=solid, + fillcolor=AlgorithmeBkgColor, + framesep=\AlgorithmeSep, + cornersize=absolute, + linearc=\AlgorithmeSep]% + {\usebox{\smc@boxa}}% + \@@par\addvspace{\AfterAlgorithmeVSpace} +} +% \end{macrocode} +% \end{environment} +% \begin{environment}{algorithme} +% Le nouvel environnement |algorithme| dispose d'une batterie de +% macros permettant de spécifier le code. +% +% Chaque commande commence une nouvelle ligne et place l'espace de +% retrait constamment tenu à jour dans le compteur |\smc@indent|. Pour +% gérer ce retrait de la façon la plus lisible possible, deux macros +% sont définies pour l'augmenter et le diminuer. +% \begin{macrocode} +\newcount\smc@indent +\newcommand*\smc@inc@indent{% + \advance\smc@indent\@ne +} +\newcommand*\smc@dec@indent{% + \ifnum\smc@indent>\z@ + \advance\smc@indent\m@ne + \fi +} +\newcommand*\smc@write@indent{% + \par + \refstepcounter{smc@line}% + \dimen0 \dimexpr\AlgoIndent*\smc@indent + \leavevmode\hb@xt@\AlgorithmeNumWidth{\texttt{\the\c@smc@line.}\hss}% + \hspace*{\dimen0}% +} +\newcommand*\BlocVariables{% + \smc@dec@indent + \smc@write@indent + \textit{Liste des variables utilis\'ees}% + \smc@inc@indent +} +\newcommand*\BlocEntrees{% + \smc@dec@indent + \smc@write@indent + \textit{Entr\'ees}% + \smc@inc@indent +} +\newcommand*\BlocTraitements{% + \smc@dec@indent + \smc@write@indent + \textit{Traitements} + \smc@inc@indent +} +\newcommand*\BlocAffichage{% + \smc@dec@indent + \smc@write@indent + \textit{Affichage} + \smc@inc@indent +} +\newcommand\BlocTraitementsEtAffichage{% + \smc@dec@indent + \smc@write@indent + \textit{Traitements et affichage} + \smc@inc@indent +} +\newcommand*\DeclareVar[3]{% + \smc@write@indent + \texttt{#1 \string: }% + \textit{#2}\hfill + \textcolor{CouleurAlgoCommentaire}{#3}% +} +\newcommand*\TantQue[2]{% + \smc@write@indent + \texttt{\textcolor{CouleurAlgoTantque}{\bfseries Tant que} (\texttt{#1})} + \texttt{\bfseries faire} + \smc@inc@indent + #2 + \smc@dec@indent + \smc@write@indent + \texttt{\textcolor{CouleurAlgoTantque}{\bfseries Fin Tant que}}% +} +\newcommand*\Pour[4]{% + \smc@write@indent + \texttt{\textcolor{CouleurAlgoPour}{\bfseries Pour}} + \texttt{#1} + \textcolor{CouleurAlgoPour}{\bfseries variant de} + \texttt{#2} + \textcolor{CouleurAlgoPour}{\bfseries \`a} + \texttt{#3} + \texttt{\bfseries faire} + \smc@inc@indent + #4 + \smc@dec@indent + \smc@write@indent + \texttt{\textcolor{CouleurAlgoTantque}{\bfseries Fin Pour}}% +} +\newcommand*\PourAvecPas[5]{% + \smc@write@indent + \texttt{\textcolor{CouleurAlgoPour}{\bfseries Pour}} + \texttt{#1} + \textcolor{CouleurAlgoPour}{\bfseries variant de} + \texttt{#2} + \textcolor{CouleurAlgoPour}{\bfseries \`a} + \texttt{#3} + \textcolor{CouleurAlgoPour}{\bfseries avec un pas de} + \texttt{#4} + \texttt{faire} + \smc@inc@indent + #5 + \smc@dec@indent + \smc@write@indent + \texttt{\textcolor{CouleurAlgoTantque}{\bfseries Fin Pour}}% +} +\newcommand*\SiAlors[2]{% + \smc@write@indent + \texttt{\textcolor{CouleurAlgoSi}{\bfseries Si}} + {#1} + \texttt{\textcolor{CouleurAlgoSi}{\bfseries Alors}} + \smc@inc@indent + #2 + \smc@dec@indent + \smc@write@indent + \texttt{\textcolor{CouleurAlgoSi}{\bfseries Fin Si}}% +} +\newcommand*\SiAlorsSinon[3]{% + \smc@write@indent + \texttt{\textcolor{CouleurAlgoSi}{\bfseries Si}} + {#1} + \texttt{\textcolor{CouleurAlgoSi}{\bfseries Alors}} + \smc@inc@indent + #2 + \smc@dec@indent + \smc@write@indent + \texttt{\textcolor{CouleurAlgoSi}{\bfseries Sinon}} + \smc@inc@indent + #3 + \smc@dec@indent + \smc@write@indent + \texttt{\textcolor{CouleurAlgoSi}{\bfseries Fin Si}}% +} +\newcommand*\AfficherVar[1]{% + \smc@write@indent + \textcolor{CouleurAlgoAffiche}{Afficher la valeur de} + \texttt{#1}% +} +\newcommand*\Afficher[1]{% + \smc@write@indent + \textcolor{CouleurAlgoAffiche}{Afficher} + #1% +} +\newcommand*\Calculer[1]{% + \smc@write@indent + \textcolor{CouleurAlgoCalcule}{Calculer} + #1% +} +\newcommand*\Demander[1]{% + \smc@write@indent + \textcolor{CouleurAlgoDemander}{Demander} + \texttt{#1}% +} +\newcommand*\Saisir[1]{% + \smc@write@indent + \textcolor{CouleurAlgoSaisir}{Saisir} + \texttt{#1}% +} +\newcommand*\Stocker[1]{% + \smc@write@indent + \textcolor{CouleurAlgoStocker}{Stocker} la r\'eponse dans + \texttt{#1}% +} +\newcommand*\DonnerValeur[2]{% + \smc@write@indent + \textcolor{CouleurAlgoDonnerValeur}{Donner} \`a \texttt{#1} + la valeur de \texttt{#2}% +} +\newcommand*\TitreAlgo[1]{% + \smc@write@indent + \textit{Algorithme \string: }#1 +} +\newcommand*\FinAlgo{% + \smc@dec@indent + \smc@write@indent + \textit{Fin de l'algorithme}% +} +% \end{macrocode} +% L'environnement proprement dit ne fait pas grand chose : il place +% son contenu dans une minipage de la bonne largeur et compose alors +% ce contenu dans un cadre à fond coloré (et arrondi). +% \begin{macrocode} +\newenvironment{algorithme}{% +% \end{macrocode} +% On commence par initialiser le compteur de ligne et on inhibe les +% ponctuations doubles actices. +% \begin{macrocode} + \c@smc@line\z@ + \shorthandoff{;:!?}% +% \end{macrocode} +% On mémorise alors le contenu dans une boîte contenant la minipage à +% la bonne largeur. +% \begin{macrocode} + \begin{lrbox}{\smc@boxa}% + \minipage{\dimexpr\linewidth-\AlgorithmeRuleWidth*2-\AlgorithmeSep*2}% +} +{% +% \end{macrocode} +% En fin d'environnement, on ferme la minipage et la boîte. +% \begin{macrocode} + \endminipage + \end{lrbox}% +% \end{macrocode} +% On passe au paragraphe suivant. +% \begin{macrocode} + \par\addvspace{\BeforeAlgorithmeVSpace} +% \end{macrocode} +% On peut alors afficher le cadre et son contenu ! +% \begin{macrocode} + \psframebox[linecolor=AlgorithmeRuleColor, + linewidth=\AlgorithmeRuleWidth, + fillstyle=solid, + fillcolor=AlgorithmeBkgColor, + framesep=\AlgorithmeSep, + cornersize=absolute, + linearc=\AlgorithmeSep]% + {\usebox{\smc@boxa}}% + \par\addvspace{\AfterAlgorithmeVSpace} +} +% \end{macrocode} +% \end{environment} +% \begin{macro}{\Strut} +% Pour pouvoir régler finement et individuellement l'interlignage, on +% va définir une macro |\Strut| qui sera comme |\strut| mais avec un +% paramètre optionnel indiquant un facteur +% d'agrandissement-réduction. Par défaut, le facteur vaut 1 et la +% macro se comportera comme le |\strut| de \LaTeX{}. +% \begin{macrocode} +\newcommand*\Strut[1][1]{% + \leavevmode + \vrule \@height #1\ht\strutbox + \@depth #1\dp\strutbox + \@width\z@ +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\TopStrut} +% La commande |\TopStrut| se comporte comme |\Strut| mais elle ne +% concerne que la hauteur. +% \begin{macrocode} +\newcommand*\TopStrut[1][1]{% + \leavevmode + \vrule \@height #1\ht\strutbox + \@depth \z@ + \@width \z@ +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\BotStrut} +% La commande |\BotStrut| se comporte comme |\Strut| mais elle ne +% concerne que la profondeur. +% \begin{macrocode} +\newcommand*\BotStrut[1][1]{% + \leavevmode + \vrule \@height \z@ + \@depth #1\dp\strutbox + \@width \z@ +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\RefExercice} +% Fait référence à un exercice en plaçant le numéro dans un cadre. Les +% couleurs sont les mêmes que pour les numéros d'exercice réels. +% \begin{macrocode} +\newcommand*\RefExercice{% +% \end{macrocode} +% La couleur du cadre va dépendre du fait que l'exercice ait ou non une +% correction. On se sert d'une version étoilée de cette macro pour +% gérer cela. +% \begin{macrocode} + \@ifstar{\smc@sRefExercice}{\smc@nsRefExercice}% +} +\newcommand*\smc@sRefExercice[1]{% + \psframebox*[linewidth=0pt, fillcolor=ExerciceCorrigeNumFrameColor, + framesep=2pt]{\textcolor{ExerciceNumColor}{\bfseries \ref{#1}}}% +} +\newcommand*\smc@nsRefExercice[1]{% + \psframebox*[linewidth=0pt, fillcolor=ExerciceNumFrameColor, framesep=2pt] + {\textcolor{ExerciceNumColor}{\bfseries \ref{#1}}}% +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\MethodeRefExercice} +% Cette macro permet d'indiquer une référence à un exercice dans le +% titre d'une méthode. Comme pour la macro précédente, il faut étoiler +% la macro pour faire réference à un exercice corrigé. +% \begin{macrocode} +\newcommand*\MethodeRefExercice{% + \@ifstar{\smc@sMethodeRefExercice}{\smc@nsMethodeRefExercice}% +} +\newcommand\smc@sMethodeRefExercice[1]{% +% \end{macrocode} +% Tout est composé en taille normale et couleur normale. On passe donc +% dans un groupe. +% \begin{macrocode} + \begingroup + \normalcolor + \normalfont + \MethodeRefExerciceFont +% \end{macrocode} +% On trouve d'abord un espace |\quad| puis un triangle de la même +% couleur que le cadre du numéro. +% \begin{macrocode} + \hfill + \begin{pspicture}(0,0)(0.8em,1.2ex) + \pspolygon*[linewidth=0pt, linecolor=MethodeTitleFrameColor] + (0,0)(0,1.2ex)(0.8em,0.6ex) + \end{pspicture}~% +% \end{macrocode} +% On compose alors le texte Ex. p. +% \begin{macrocode} + Ex.~\RefExercice*{#1}~p.~\pageref{#1}% + \endgroup +} +% \end{macrocode} +% La version non étoilée fait exactement la même chose à part la +% couleur du cadre donc l'appel à |\RefExercice| sans étoile. +% \begin{macrocode} +\newcommand\smc@nsMethodeRefExercice[1]{% + \begingroup + \normalcolor + \normalfont + \MethodeRefExerciceFont + \hfill + \begin{pspicture}(0,0)(0.8em,1.2ex) + \pspolygon*[linewidth=0pt, linecolor=MethodeTitleFrameColor] + (0,0)(0,1.2ex)(0.8em,0.6ex) + \end{pspicture}~% + Ex.~\RefExercice{#1}~p.~\pageref{#1}% + \endgroup +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\RefMethode} +% Façon de faire référence à une méthode. Le numéro est composé avec +% la couleur normalement utilisée pour les cadres de méthodes. +% \begin{macrocode} +\newcommand*\RefMethode[1]{% + \textcolor{MethodeTitleFrameColor}{\bfseries \ref{#1}}% +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\ExerciceRefMethode} +% Façon de faire référence à une méthode dans le titre d'un exercice. +% \begin{macrocode} +\newcommand*\ExerciceRefMethode[1]{% + \begingroup + \quad + \begin{pspicture}(0,0)(0.8em,1.2ex) + \pspolygon*[linewidth=0pt, linecolor=MethodeTitleFrameColor] + (0,0)(0,1.2ex)(0.8em,0.6ex) + \end{pspicture}~% + \psframebox*[fillcolor=ExerciceRefMethodeColor] + {% + \textcolor{Blanc}{% + {% + \ExerciceRefMethodeFont + \StringMETHODE~\ref{#1}% + }% + }% + }% + \textcolor{Noir}{% + {% + \normalfont + \ExercicePageRefMethodeFont + ~p.~\pageref{#1}% + }% + }% + \endgroup +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\RefItem} +% Façon de faire référence à un numéro de liste. +% \begin{macrocode} +\newcommand*\RefItem[1]{% + \textcolor{\smc@curr@itemcolor}{\smc@curr@itemcmd\ref{#1}}% +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\RefQCM} +% Façon de faire référence à un exercice de QCM. On reprend en fait un +% code similaire à celui permettant de composer le numéro des +% exercices de type QCM mais avec une autre taille de caractères. +% \begin{macrocode} +\newcommand*\RefQCM[1]{% + \begingroup + \fboxsep \QCMRefHSep + \colorbox{QCMFrameColor}{\textcolor{QCMTextFrameColor}{\ref{#1}}}% + \endgroup +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\RefPartie} +% Façon de faire référence à un numéro de partie. +% \begin{macrocode} +\newcommand*\RefPartie[1]{% + \psframebox*[fillcolor=smc@curr@partiebkgcolor] + {\textcolor{smc@curr@partiecolor}{\smc@curr@partiefont \ref{#1}}}% +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{sudoku} +% La classe prévoit la possibilité de construire des grilles de sudoku +% de façon agréable pour l'utilisateur. La syntaxe est la suivante : +% \begin{verbatim} +% \sudoku[taille]{% +% ......... +% .*.*.*.*. +% 3..1..2.. +% etc. +% } +% \end{verbatim} +% où \key{taille} indique la taille des cases de la grille (5mm par +% défaut) et où l'argument de |\sudoku| indique soit une case vide +% blanche (.) soit une case vide colorée (*) soit un caractère devant +% figurer dans la case (avec des accolades en cas de caractère +% complexe). +% +% En fait, la largeur par défaut est sous le contrôle de la macro +% |\SudokuWidth|. +% \begin{macrocode} +\newcommand*\SudokuWidth{5mm} +\newcommand\sudoku[2][\SudokuWidth]{% + \begingroup +% \end{macrocode} +% Avant même de faire le |\begin{pspicture}|, on fixe l'unité qui sera +% la largeur des cases de la grille. C'est pour cela que tout se +% déroule à l'intérieur d'un groupe. +% \begin{macrocode} + \psset{unit=#1, dimen=middle, linewidth=0.3pt, linecolor=FiletTableauColor} +% \end{macrocode} +% L'environnement \environ{pspicture} prévoit 10 cases au lieu de 9 +% pour pouvoir placer les légendes des lignes et colonnes. +% \begin{macrocode} + \begin{pspicture}(0,0)(10,10) +% \end{macrocode} +% Légende des lignes et colonnes. |96+\n| affiche a\ldots j et |74-\n| +% affiche J\ldots A. +% \begin{macrocode} + \multido{\n=1+1}{9}{% + \rput[B](\n.5,9.25){\symbol{\numexpr 96+\n}} + \rput[B](0.5,\dimexpr\n\psyunit-0.75\psyunit){\symbol{\numexpr 74-\n}} + } +% \end{macrocode} +% Avant de lire l'argument de la macro, c'est-à-dire le contenu des +% cases, on initialise les compteurs de ligne et de colonne. On va +% lire les lignes de haut en bas donc de 8 à 0 du point de vue de +% \environ{pspicture}. +% \begin{macrocode} + \def\x{1}\def\y{8}% +% \end{macrocode} +% La macro de lecture de l'argument (et de l'affichage du contenu des +% cases) est une macro récursive. On initialise la macro |\smc@next| +% avec le nom de cette macro pour préparer les appels récursifs. +% \begin{macrocode} + \let\smc@next\smc@parsesudoku +% \end{macrocode} +% Appel de la macro récursive de lecture. Pour gérer tous les cas +% (plus de 81 indications, moins de 81 indications) on dispose d'une +% double balise de limitation d'argument. +% \begin{macrocode} + \smc@next#2\@nil\@@nil +% \end{macrocode} +% Une fois que les cases sont remplies, on affiche les traits gras des +% triples cases à l'intérieur de la grille générale de sudoku. Pour +% que les jonctions des coins soient propres, on doit faire déborder +% certaines lignes de la moitié de l'épaisseur des lignes. +% \begin{macrocode} + \psset{linewidth=1.2pt} + \multido{\n=0+3,\nn=1+3}{4}{% + \psline(1,\n)(10,\n) + \psline(\nn,-0.5\pslinewidth)(\nn,\dimexpr 9\psyunit+0.5\pslinewidth) + } + \end{pspicture}% + \endgroup +} +% \end{macrocode} +% La macro qui suit est celle qui va lire l'argument de |\sudoku| de +% façon récursive et remplir la case correspondante selon le caractère +% rencontré. +% \begin{macrocode} +\def\smc@parsesudoku#1{% +% \end{macrocode} +% On place le caractère (ou le groupe) lu dans une macro pour tester +% s'il s'agit de la balise |\@nil|. +% \begin{macrocode} + \def\smc@arg{#1}% + \ifx\smc@arg\@nnil +% \end{macrocode} +% Si la balise est atteinte, on passe au traitement final. +% \begin{macrocode} + \let\smc@next\smc@endsudoku + \else +% \end{macrocode} +% Sinon, on place le résultat en |(\x,\y)|. +% \begin{macrocode} + \rput(\x,\y){% + \if#1.% +% \end{macrocode} +% Le point donne une case vide à fond blanc. +% \begin{macrocode} + \psframe(0,0)(1,1) + \else\if#1*% +% \end{macrocode} +% L'étoile donne une case vide à fond coloré. +% \begin{macrocode} + \psframe[fillstyle=solid, fillcolor=FondSudokuColor](0,0)(1,1) + \else +% \end{macrocode} +% Tout autre contenu affiche le contenu centré dans la case. +% \begin{macrocode} + \psframe(0,0)(1,1) + \rput[B](0.5,0.3\psyunit){#1} + \fi\fi + } + \fi +% \end{macrocode} +% On passe à la case suivante. +% \begin{macrocode} + \edef\x{\the\numexpr\x+1}% + \ifnum\x=10 +% \end{macrocode} +% Si la rangée est pleine, on revient au début de la rangée suivante. +% \begin{macrocode} + \def\x{1}% + \edef\y{\the\numexpr\y-1}% + \ifnum\y=-1 +% \end{macrocode} +% Si toutes les rangées ont été traitées, on termine le traitement. +% \begin{macrocode} + \let\smc@next\smc@endsudoku + \fi + \fi + \smc@next +} +% \end{macrocode} +% En fin de lecture récursive, il faut se débarasser des balises de +% délimitation de l'argument. La double balise permet de gérer tous +% les cas (plus de 81 indications, exactement 81 indications, moins de +% 81 indications). +% \begin{macrocode} +\def\smc@endsudoku#1\@@nil{% +% \end{macrocode} +% On regarde s'il y a eu moins de 81 indications. Et si oui, on lance +% la macro récursive de remplissage. +% \begin{macrocode} + \ifnum\y>-1 + \let\smc@next\smc@@endsudoku + \smc@next + \fi +} +% \end{macrocode} +% La dernière macro va s'appeler récursivement pour remplir la fin de +% la grille avec des cases vides. +% \begin{macrocode} +\def\smc@@endsudoku{% + \rput(\x,\y){\psframe(0,0)(1,1)} + \edef\x{\the\numexpr\x+1}% + \ifnum\x=10 +% \end{macrocode} +% Si la rangée est pleine, on revient au début de la rangée suivante. +% \begin{macrocode} + \def\x{1}% + \edef\y{\the\numexpr\y-1}% + \ifnum\y=-1 +% \end{macrocode} +% Si toutes les rangées ont été traitées, on termine le traitement. +% \begin{macrocode} + \let\smc@next\relax + \fi + \fi + \smc@next +} +% \end{macrocode} +% \end{macro} +% \section{En-têtes et pieds de page} +% \begin{macro}{\smc@nobsbs} +% Il est parfois nécessaire que la séquence de contrôle |\\| perde son +% rôle de saut de ligne pour prendre celui d'une espace. On prendra +% garde au fait que cette séquence de contrôle, qu'elle soit ou non +% suivie d'un espace soit équivalente à une seule espace. +% \begin{macrocode} +\newcommand\smc@nobsbs[1]{% + \begingroup + \def\\{\space\ignorespaces}% + \protected@edef\smc@tmp{#1}% + \smc@tmp + \endgroup +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\smc@headeven} +% On gère ici toutes les en-têtes et pieds de page. On commence par +% définir une macro qui servira systématiquement pour les +% en-têtes. Ceux-ci sont constitués d'un cadre avec un titre et un +% dégradé de carrés dans un coin. Il suffit de donner le nom de base +% des couleurs qui seront utilisées (les noms seront construits selon +% le procédé \texttt{Color} où \texttt{} est un nombre +% entre 1 et 5 donnant les cinq couleurs différentes pour +% l'en-tête et un numéro 0 pour la couleur du texte du titre. il +% faudra également passer, en second argument, le titre. +% +% Les en-têtes de page paire et impaire ne sont pas construite de la +% même façon. On commence par celles des pages paires. +% \begin{macrocode} +\newcommand*\smc@headeven[2]{% +% \end{macrocode} +% Sur les pages paires, le cadre est sur la gauche de l'en-tête en +% pleine page : il faudra faire déborder à gauche (et en haut). +% \begin{macrocode} + \begin{pspicture}(0,0)(\HeadFrameWidth,0) + \psset{linewidth=0pt, linestyle=none, fillstyle=solid} + \psframe[fillcolor=#15Color] + (\dimexpr -\smc@marginleft-\smc@bleed,-\HeadFrameDepth) + (\HeadFrameWidth,\dimexpr \HeadFrameHeight+\smc@bleed) + \smc@diagonal(\HeadFrameWidth-\SquareWidth*3,-\HeadFrameDepth){#1} +% \end{macrocode} +% Pour le titre, il faut d'abord vérifier qu'il loge dans la largeur à +% disposition et, sinon, réaliser une contraction horizontale avant de +% l'afficher. Pour cela on utilise la macro |\psscaleboxto| qui a +% besoin de connaître les nouvelles hauteur totale et largeur. La +% hauteur totale doit rester la même d'où le calcul +% |\ht0+\dp0|. D'autre part, la commande PSTricks |\psscaleboxto| ne +% semble pas fonctionner correctement ici. Enfin, pour que la commande +% |\resizebox| de l'extension \package{graphicx} fonctionne comme il +% faut, il faut que les commandes de changement de fontes soient +% extérieures à l'argument terminal de |\resizebox|. +% \begin{macrocode} + \setbox0=\hbox{\textcolor{#10Color}{\HeadTitleFont #2}}% + \ifdim\wd0>\HeadTitleMaxWidth + \rput[Bl](0,0){% + {% + \HeadTitleFont\color{#10Color}% + \resizebox{\HeadTitleMaxWidth}{\dimexpr\ht0+\dp0}{#2}% + }% + } + \else + \rput[Bl](0,0){\unhbox0} + \fi + \end{pspicture} +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\smc@headodd} +% La différence avec les en-têtes de pages paires est que le cadre est +% à droite (donc déborde à droite et en haut) et que le texte est +% cadré à droite. +% \begin{macrocode} +\newcommand\smc@headodd[2]{% + \begin{pspicture}(0,0)(\HeadFrameWidth,0) + \psset{linewidth=0pt, linestyle=none, fillstyle=solid} + \psframe[fillcolor=#15Color] + (0,-\HeadFrameDepth) + (\dimexpr \HeadFrameWidth+\smc@marginright+\smc@bleed, + \dimexpr \HeadFrameHeight+\smc@bleed) + \smc@antidiagonal(0pt,-\HeadFrameDepth){#1} + \setbox0=\hbox{\textcolor{#10Color}{\HeadTitleFont #2}}% + \ifdim\wd0>\HeadTitleMaxWidth + \rput[Br](\HeadFrameWidth,0){% + {% + \HeadTitleFont\color{#10Color}% + \resizebox{\HeadTitleMaxWidth}{\dimexpr\ht0+\dp0}{#2}% + }% + } + \else + \rput[Br](\HeadFrameWidth,0){\unhbox0} + \fi + \end{pspicture} +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\smc@roundheadeven} +% Certaines en-têtes ont un aspect arrondi. Il faudra des macros +% dédiées pour les gérer. Voici celle pour les pages paires. Par +% rapport à la macro précédente, il y a un argument de couleur +% supplémentaire pour pouvoir faire l'arrondi du cadre avec la couleur +% du fond. +% \begin{macrocode} +\newcommand*\smc@roundheadeven[3]{% + \begin{pspicture}(0,0)(\RoundHeadFrameWidth,0) + \psset{linewidth=0pt, linestyle=none, fillstyle=solid} + \psframe[fillcolor=#15Color] + (\dimexpr -\smc@marginleft-\smc@bleed,-\HeadFrameDepth) + (\RoundHeadFrameWidth,\dimexpr \HeadFrameHeight+\smc@bleed) +% \end{macrocode} +% En fait, l'arrondi sera fait par les disques. Ici, on se contente +% d'effacer un carré correspondant à un quart de disque +% \begin{macrocode} + \psframe[fillcolor=#2] + (\dimexpr \RoundHeadFrameWidth-\SquareWidth/2, + -\HeadFrameDepth) + (\RoundHeadFrameWidth, + \dimexpr -\HeadFrameDepth+\SquareWidth/2) + \smc@rounddiagonal(\RoundHeadFrameWidth-\SquareWidth*3,-\HeadFrameDepth){#1} + \setbox0=\hbox{\textcolor{#10Color}{\HeadTitleFont #3}}% + \ifdim\wd0>\RoundHeadTitleMaxWidth + \rput[Bl](0,0){% + {% + \HeadTitleFont\color{#10Color}% + \resizebox{\RoundHeadTitleMaxWidth}{\dimexpr\ht0+\dp0}{#3}% + }% + } + \else + \rput[Bl](0,0){\unhbox0} + \fi + \end{pspicture} +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\smc@roundheadodd} +% Même chose que ci-dessus mais pour les pages impaires. +% \begin{macrocode} +\newcommand\smc@roundheadodd[3]{% + \begin{pspicture}(0,0)(\RoundHeadFrameWidth,0) + \psset{linewidth=0pt, linestyle=none, fillstyle=solid} + \psframe[fillcolor=#15Color] + (0,-\HeadFrameDepth) + (\dimexpr \RoundHeadFrameWidth+\smc@marginright+\smc@bleed, + \dimexpr \HeadFrameHeight+\smc@bleed) + \psframe[fillcolor=#2] + (0, -\HeadFrameDepth) + (\dimexpr \SquareWidth/2, \dimexpr -\HeadFrameDepth+\SquareWidth/2) + \smc@roundantidiagonal(0pt,-\HeadFrameDepth){#1} + \setbox0=\hbox{\textcolor{#10Color}{\HeadTitleFont #3}}% + \ifdim\wd0>\RoundHeadTitleMaxWidth + \rput[Br](\RoundHeadFrameWidth,0){% + {% + \HeadTitleFont\color{#10Color}% + \resizebox{\RoundHeadTitleMaxWidth}{\dimexpr\ht0+\dp0}{#3}% + }% + } + \else + \rput[Br](\RoundHeadFrameWidth,0){\unhbox0} + \fi + \end{pspicture}% +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\smc@footpage} +% Le pied de page est toujours constitué du numéro de page avec un +% rectangle coloré au-dessous en pleine page. Comme il n'y a pas +% nécessairement de titre accolé, on commence par définir cette partie +% commune. Ici, il n'y a besoin que de la couleur de fond. +% \begin{macrocode} +\newcommand*\smc@footpage[1]{% + \begin{pspicture}(0,0)(\FootFrameWidth,0) + \psset{linewidth=0pt, linestyle=none, fillstyle=solid} + \rput[B](.25,0){\FootPageFont \thepage} + \psframe[fillcolor=#1](0,-\FootFrameSep) + (\FootFrameWidth, \dimexpr \smc@footskip+\FootFrameSep + -\smc@marginbottom-\smc@bleed) + \end{pspicture}% +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\smc@foottitleeven} +% Les pieds de page de pages paires comportent généralement +% l'abréviation du thème courant en capitale suivie du numéro de +% chapitre et du titre de chapitre. Il faut tuer la macro |\\| pour ne +% pas avoir de saut de ligne dans le pied de page. +% \begin{macrocode} +\newcommand*\smc@foottitleeven{% + {% + \space + {% + \color{FootTitleHeadColor}% + \FootTitleHeadFont \@chapapp\space + \MakeUppercase{\smc@thema@init}\thechapter. + }\space + {% + \FootTitleChapterFont \smc@nobsbs{\smc@chaptertitle}% + }% + }% +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\smc@foottitleodd} +% Les pieds de pages impaires sont généralement comme les pieds de +% pages paires mais cadrés à droite. Il faut quitter le mode vertical +% au début sinon on a un décalage vertical parasite. +% \begin{macrocode} +\newcommand*\smc@foottitleodd{% + {% + \leavevmode + {% + \color{FootTitleHeadColor}% + \FootTitleHeadFont \@chapapp\space + \MakeUppercase{\smc@thema@init}\thechapter. + }\space + {% + \FootTitleChapterFont \smc@nobsbs{\smc@chaptertitle}% + }% + }% + \space +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\smc@bkgeven} +% Les pages en fond colorés sont gérés directement par la classe et au +% niveau des en-têtes. Cela permet de pouvoir avoir la main sur le +% débordement de pleine page. Il faut distinguer les fonds de page +% paire et de page impaire si les marges droite et gauche sont +% différentes (ce n'est pas le cas ici mais autant prévoir). +% +% Il faut que ce soit le premier élément affiché dans une en-tête et +% pour cela, il ne modifiera pas l'emplacement en cours du curseur. Il +% faudra également l'afficher en tant qu'en-tête gauche de la page. +% \begin{macrocode} +\newcommand*\smc@bkgeven[1]{% + \begin{pspicture}(0,0)(0,0) + \psset{linewidth=0pt, linestyle=none, fillstyle=solid} + \psframe[fillcolor=#1] + (\dimexpr -\smc@marginleft-\smc@bleed, + \dimexpr \smc@margintop-\smc@headsep+\smc@bleed) + (\dimexpr \linewidth+\smc@marginright+\smc@bleed, + \dimexpr -\smc@headsep-\textheight-\smc@marginbottom-\smc@bleed) + \end{pspicture}% +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\smc@bkgodd} +% La seule chose qui change par rapport à la macro précédente est +% l'inversion de la droite et de la gauche pour les marges. +% \begin{macrocode} +\newcommand*\smc@bkgodd[1]{% + \begin{pspicture}(0,0)(0,0) + \psset{linewidth=0pt, linestyle=none, fillstyle=solid} + \psframe[fillcolor=#1] + (\dimexpr -\smc@marginright-\smc@bleed, + \dimexpr \smc@margintop-\smc@headsep+\smc@bleed) + (\dimexpr \linewidth+\smc@marginleft+\smc@bleed, + \dimexpr -\smc@headsep-\textheight-\smc@marginbottom-\smc@bleed) + \end{pspicture}% +} +% \end{macrocode} +% \end{macro} +% Pour tous les styles, il n'y aura jamais de filets sur les en-têtes +% et les pieds de page. On les supprime donc de façon globale. +% \begin{macrocode} +\renewcommand{\headrulewidth}{0pt} +\renewcommand{\footrulewidth}{0pt} +% \end{macrocode} +% \begin{macro}{\ps@firstchapter} +% Le style de première page de chapitre est très simple : rien pour +% l'en-tête et numéro de page pour le pied de page. Bien qu'une +% première page de chapitre ne puisse se situer sur une page paire, on +% définit quand même ce style pour les deux parités. +% \begin{macrocode} +\fancypagestyle{firstchapter}{% + \fancyhf{} + \fancyhead[LE]{} + \fancyhead[RO]{} + \fancyfoot[LE]{\smc@footpage{FirstChapterFootColor}} + \fancyfoot[RO]{\smc@footpage{FirstChapterFootColor}} +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\ps@activites} +% Le style des pages d'activités d'approche suit le cadre général. +% \begin{macrocode} +\fancypagestyle{activites}{% + \fancyhf{} + \fancyhead[LE]{\smc@headeven{ActiviteHeadFrame}{\StringActivitesApproche}} + \fancyhead[RO]{\smc@headodd{ActiviteHeadFrame}{\StringActivitesApproche}} + \fancyfoot[LE]{\smc@footpage{ActiviteFootColor}\smc@foottitleeven} + \fancyfoot[RO]{\smc@foottitleodd\smc@footpage{ActiviteFootColor}} +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\ps@cours} +% Le style des pages de Cours et Méthodes suit le cadre général. +% \begin{macrocode} +\fancypagestyle{cours}{% + \fancyhf{} + \fancyhead[LE]{\smc@headeven{CoursHeadFrame}{\StringCoursMethodes}} + \fancyhead[RO]{\smc@headodd{CoursHeadFrame}{\StringCoursMethodes}} + \fancyfoot[LE]{\smc@footpage{CoursFootColor}\smc@foottitleeven} + \fancyfoot[RO]{\smc@foottitleodd\smc@footpage{CoursFootColor}} +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\ps@exercicesbase} +% Le style des pages de Exercices de base suit le cadre général. +% \begin{macrocode} +\fancypagestyle{exercicesbase}{% + \fancyhf{} + \fancyhead[LE]{\smc@headeven{ExoBaseHeadFrame}{\StringExercicesBase}} + \fancyhead[RO]{\smc@headodd{ExoBaseHeadFrame}{\StringExercicesBase}} + \fancyfoot[LE]{\smc@footpage{ExoBaseFootColor}\smc@foottitleeven} + \fancyfoot[RO]{\smc@foottitleodd\smc@footpage{ExoBaseFootColor}} +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\ps@exercicesappr} +% Le style des pages de Exercices de base suit le cadre général. +% \begin{macrocode} +\fancypagestyle{exercicesappr}{% + \fancyhf{} + \fancyhead[LE]{\smc@headeven{ExoApprHeadFrame}{\StringExercicesAppr}} + \fancyhead[RO]{\smc@headodd{ExoApprHeadFrame}{\StringExercicesAppr}} + \fancyfoot[LE]{\smc@footpage{ExoApprFootColor}\smc@foottitleeven} + \fancyfoot[RO]{\smc@foottitleodd\smc@footpage{ExoApprFootColor}} +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\ps@connaissances} +% Le style des pages de Je teste mes connaissances ne suit pas le +% cadre général. Le fond de page en couleur sera géré par les +% en-têtes. En fait, pour des raisons d'économie d'impression pour les +% collègues, on ne fait plus de fond de page en couleur. +% \begin{macrocode} +\fancypagestyle{connaissances}{% + \fancyhf{} + \fancyfoot[LE]{\smc@footpage{ConnFootColor}\smc@foottitleeven} + \fancyfoot[RO]{\smc@foottitleodd\smc@footpage{ConnFootColor}} +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\ps@firstconnaissances} +% Le style de la première page de Je teste mes connaissances ne suit +% pas le cadre général. L'en-tête est avec un cadre a coin arrondi et +% des disques au lieu des carrés. +% \begin{macrocode} +\fancypagestyle{firstconnaissances}{% + \fancyhf{} + \fancyhead[LE]{% + \smc@roundheadeven{ConnHeadFrame}{Blanc} + {\StringTestConnaissances}% + } + \fancyhead[RO]{% + \smc@roundheadodd{ConnHeadFrame}{Blanc} + {\StringTestConnaissances}% + } + \fancyfoot[LE]{\smc@footpage{ConnFootColor}\smc@foottitleeven} + \fancyfoot[RO]{\smc@foottitleodd\smc@footpage{ConnFootColor}} +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\ps@TP} +% Le style des pages des travaux pratiques suit le cadre général. +% \begin{macrocode} +\fancypagestyle{TP}{% + \fancyhf{} + \fancyhead[LE]{\smc@headeven{TPHeadFrame}{\StringTravauxPratiques}} + \fancyhead[RO]{\smc@headodd{TPHeadFrame}{\StringTravauxPratiques}} + \fancyfoot[LE]{\smc@footpage{TPFootColor}\smc@foottitleeven} + \fancyfoot[RO]{\smc@foottitleodd\smc@footpage{TPFootColor}} +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{ps@recreation} +% Le style des pages récréation suit le cadre général. +% \begin{macrocode} +\fancypagestyle{recreation}{% + \fancyhf{} + \fancyhead[LE]{\smc@headeven{RecreationHeadFrame}{\StringRecreation}} + \fancyhead[RO]{\smc@headodd{RecreationHeadFrame}{\StringRecreation}} + \fancyfoot[LE]{\smc@footpage{RecreationFootColor}\smc@foottitleeven} + \fancyfoot[RO]{\smc@foottitleodd\smc@footpage{RecreationFootColor}} +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\smc@firstheadevenannexe} +% Les annexes partagent toutes le même type d'en-tête qui est en fait +% des rectangles dans les marges. On définit ici la forme générale de +% ces en-têtes. D'abord pour la première page si elle est +% paire. L'argument est la couleur utilisée. +% \begin{macrocode} +\newcommand*\smc@firstheadevenannexe[1]{% + \begin{pspicture}(0,0)(0,0) + \rput(-\smc@marginleft, \dimexpr \smc@margintop-\smc@headsep){% + \pspolygon[linestyle=none, linewidth=0pt, + fillstyle=solid, fillcolor=#1] + (-\smc@bleed, \smc@bleed) + (-\smc@bleed, \dimexpr -\smc@paperheight-\smc@bleed) + (\CorrigeHeadFrameWidth, \dimexpr -\smc@paperheight-\smc@bleed) + (\CorrigeHeadFrameWidth, -\CorrigeHeadFrameWidth) + (\dimexpr \CorrigeHeadFrameWidth*2, -\CorrigeHeadFrameWidth) + (\dimexpr \CorrigeHeadFrameWidth*2, \smc@bleed) + } + \end{pspicture}% +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\smc@firstheadoddannexe} +% Même chose que ci-dessus pour les premières pages impaires. +% \begin{macrocode} +\newcommand*\smc@firstheadoddannexe[1]{% + \begin{pspicture}(0,0)(0,0) + \rput(\smc@marginright,\dimexpr \smc@margintop-\smc@headsep){% + \pspolygon[linestyle=none, linewidth=0pt, fillstyle=solid, fillcolor=#1] + (\smc@bleed, \smc@bleed) + (\smc@bleed, \dimexpr -\smc@paperheight-\smc@bleed) + (-\CorrigeHeadFrameWidth, \dimexpr -\smc@paperheight-\smc@bleed) + (-\CorrigeHeadFrameWidth, -\CorrigeHeadFrameWidth) + (\dimexpr -\CorrigeHeadFrameWidth*2, -\CorrigeHeadFrameWidth) + (\dimexpr -\CorrigeHeadFrameWidth*2, \smc@bleed) + } + \end{pspicture}% +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\smc@headevenannexe} +% Rectangle pour les pages paires des annexes. +% \begin{macrocode} +\newcommand*\smc@headevenannexe[1]{% + \begin{pspicture}(0,0)(0,0) + \rput(-\smc@marginleft, \dimexpr \smc@margintop-\smc@headsep){% + \pspolygon[linestyle=none, linewidth=0pt, fillstyle=solid, fillcolor=#1] + (-\smc@bleed, \smc@bleed) + (-\smc@bleed, \dimexpr -\smc@paperheight-\smc@bleed) + (\CorrigeHeadFrameWidth, \dimexpr -\smc@paperheight-\smc@bleed) + (\CorrigeHeadFrameWidth, \smc@bleed) + } + \end{pspicture}% +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\smc@headoddannexe} +% Rectangle pour les pages paires des annexes. +% \begin{macrocode} +\newcommand*\smc@headoddannexe[1]{% + \begin{pspicture}(0,0)(0,0) + \rput(\smc@marginright,\dimexpr \smc@margintop-\smc@headsep){% + \pspolygon[linestyle=none, linewidth=0pt, + fillstyle=solid, fillcolor=#1] + (\smc@bleed,\smc@bleed) + (\smc@bleed, \dimexpr -\smc@paperheight-\smc@bleed) + (-\CorrigeHeadFrameWidth, + \dimexpr -\smc@paperheight-\smc@bleed) + (-\CorrigeHeadFrameWidth, \smc@bleed) + } + \end{pspicture}% +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\ps@firstcorrige} +% Le style pour les pages de corrigé n'a rien à voir avec les autres +% styles. L'en-tête n'est constituée que d'une sorte de rectangle dans +% la marge et le pied de page est beaucoup plus minimal celui des +% autres styles. +% \begin{macrocode} +\fancypagestyle{firstcorrige}{% + \fancyhf{} + \fancyhead[LE]{% + \smc@firstheadevenannexe{CorrigeHeadFrameColor}% + } + \fancyhead[RO]{% + \smc@firstheadoddannexe{CorrigeHeadFrameColor}% + } + \fancyfoot[LE]{% + {\FootAnnexePageFont \thepage} + {\FootAnnexeTxtFont \MakeUppercase{\StringCorriges}}% + } + \fancyfoot[RO]{% + {\FootAnnexeTxtFont \MakeUppercase{\StringCorriges}} + {\FootAnnexePageFont \thepage}% + } +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\ps@corrige} +% Les pages suivantes des corrigés se font de la même façon sauf que +% le rectangle de la marge n'a pas d'angle de retour en haut +% \begin{macrocode} +\fancypagestyle{corrige}{% + \fancyhf{} + \fancyhead[LE]{% + \smc@headevenannexe{CorrigeHeadFrameColor}% + } + \fancyhead[RO]{% + \smc@headoddannexe{CorrigeHeadFrameColor} + } + \fancyfoot[LE]{% + {\FootAnnexePageFont \thepage} + {\FootAnnexeTxtFont \MakeUppercase{\StringCorriges}}% + } + \fancyfoot[RO]{% + {\FootAnnexeTxtFont \MakeUppercase{\StringCorriges}} + {\FootAnnexePageFont \thepage}% + } +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\ps@firstannexe} +% Style des premières pages des annexes +% \begin{macrocode} +\fancypagestyle{firstannexe}{% + \fancyhf{} + \fancyhead[LE]{% + \smc@firstheadevenannexe{AnnexeHeadFrameColor}% + } + \fancyhead[RO]{% + \smc@firstheadoddannexe{AnnexeHeadFrameColor}% + } + \fancyfoot[LE]{% + {\FootAnnexePageFont \thepage} + {\FootAnnexeTxtFont \MakeUppercase{\smc@TitleAnnexe}}% + } + \fancyfoot[RO]{% + {\FootAnnexeTxtFont \MakeUppercase{\smc@TitleAnnexe}} + {\FootAnnexePageFont \thepage}% + } +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\ps@annexe} +% Style des pages suivantes des annexes +% \begin{macrocode} +\fancypagestyle{annexe}{% + \fancyhf{} + \fancyhead[LE]{% + \smc@headevenannexe{AnnexeHeadFrameColor}% + } + \fancyhead[RO]{% + \smc@headoddannexe{AnnexeHeadFrameColor} + } + \fancyfoot[LE]{% + {\FootAnnexePageFont \thepage} + {\FootAnnexeTxtFont \MakeUppercase{\smc@TitleAnnexe}}% + } + \fancyfoot[RO]{% + {\FootAnnexeTxtFont \MakeUppercase{\smc@TitleAnnexe}} + {\FootAnnexePageFont \thepage}% + } +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\ps@firstlexique} +% Style des premières pages du lexique +% \begin{macrocode} +\fancypagestyle{firstlexique}{% + \fancyhf{} + \fancyhead[LE]{% + \smc@firstheadevenannexe{LexiqueHeadFrameColor}% + } + \fancyhead[RO]{% + \smc@firstheadoddannexe{LexiqueHeadFrameColor}% + } + \fancyfoot[LE]{% + {\FootAnnexePageFont \thepage} + {\FootAnnexeTxtFont \MakeUppercase{\StringLexique}}% + } + \fancyfoot[RO]{% + {\FootAnnexeTxtFont \MakeUppercase{\StringLexique}} + {\FootAnnexePageFont \thepage}% + } +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\ps@lexique} +% Style des pages suivantes du lexique +% \begin{macrocode} +\fancypagestyle{lexique}{% + \fancyhf{} + \fancyhead[LE]{% + \smc@headevenannexe{LexiqueHeadFrameColor}% + } + \fancyhead[RO]{% + \smc@headoddannexe{LexiqueHeadFrameColor} + } + \fancyfoot[LE]{% + {\FootAnnexePageFont \thepage} + {\FootAnnexeTxtFont \MakeUppercase{\StringLexique}}% + } + \fancyfoot[RO]{% + {\FootAnnexeTxtFont \MakeUppercase{\StringLexique}} + {\FootAnnexePageFont \thepage}% + } +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{ps@firstaffichemethode} +% Style des premières pages de la liste des méthodes. +% \begin{macrocode} +\fancypagestyle{firstaffichemethode}{% + \fancyhf{} + \fancyhead[LE]{% + \smc@firstheadevenannexe{ListeMethodeHeadFrameColor}% + } + \fancyhead[RO]{% + \smc@firstheadoddannexe{ListeMethodeHeadFrameColor}% + } + \fancyfoot[LE]{% + {\FootAnnexePageFont \thepage} + {\FootAnnexeTxtFont \MakeUppercase{\StringListeMethode}}% + } + \fancyfoot[RO]{% + {\FootAnnexeTxtFont \MakeUppercase{\StringListeMethode}} + {\FootAnnexePageFont \thepage}% + } +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\ps@affichemethode} +% Style des pages suivantes de la liste des méthodes +% \begin{macrocode} +\fancypagestyle{affichemethode}{% + \fancyhf{} + \fancyhead[LE]{% + \smc@headevenannexe{ListeMethodeHeadFrameColor}% + } + \fancyhead[RO]{% + \smc@headoddannexe{ListeMethodeHeadFrameColor} + } + \fancyfoot[LE]{% + {\FootAnnexePageFont \thepage} + {\FootAnnexeTxtFont \MakeUppercase{\StringListeMethode}}% + } + \fancyfoot[RO]{% + {\FootAnnexeTxtFont \MakeUppercase{\StringListeMethode}} + {\FootAnnexePageFont \thepage}% + } +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\ps@firstlibre} +% Style des premières pages des textes libres. +% \begin{macrocode} +\fancypagestyle{firstlibre}{% + \fancyhf{} + \fancyfoot[LE]{% + {\ifsmc@page\FootLibrePageFont \thepage\fi} + } + \fancyfoot[RO]{% + {\ifsmc@page\FootLibrePageFont \thepage\fi}% + } +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\ps@libre} +% Style des pages suivantes des textes libres. +% \begin{macrocode} +\fancypagestyle{libre}{% + \fancyhf{} + \fancyfoot[LE]{% + {\ifsmc@page\FootLibrePageFont \thepage\fi} + } + \fancyfoot[RO]{% + {\ifsmc@page\FootLibrePageFont \thepage\fi}% + } +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\ps@empty} +% Le style pour les pages vides n'est en fait pas totalement vide : il +% reste le pied de page en cours. On détruit donc uniquement +% l'en-tête. +% \begin{macrocode} +\fancypagestyle{empty}{% + \fancyhead{} +} +% \end{macrocode} +% \end{macro} +% \section{Couleurs} +% Couleurs utilisées tout au long du document. On prend la +% nomenclature du fichier tiré de la maquette Indesign (légèrement +% révisée pour éviter les redondances). +% \begin{macrocode} +\definecolor{A1} {cmyk}{1.00, 0.00, 0.00, 0.50} +\definecolor{A2} {cmyk}{0.60, 0.00, 0.00, 0.10} +\definecolor{A3} {cmyk}{0.30, 0.00, 0.00, 0.05} +\definecolor{A4} {cmyk}{0.10, 0.00, 0.00, 0.00} +\definecolor{B1} {cmyk}{0.00, 1.00, 0.60, 0.40} +\definecolor{B2} {cmyk}{0.00, 0.85, 0.60, 0.15} +\definecolor{B3} {cmyk}{0.00, 0.20, 0.15, 0.05} +\definecolor{B4} {cmyk}{0.00, 0.05, 0.05, 0.00} +\definecolor{C1} {cmyk}{0.00, 1.00, 0.00, 0.50} +\definecolor{C2} {cmyk}{0.00, 0.60, 0.00, 0.20} +\definecolor{C3} {cmyk}{0.00, 0.30, 0.00, 0.05} +\definecolor{C4} {cmyk}{0.00, 0.10, 0.00, 0.05} +\definecolor{D1} {cmyk}{0.00, 0.00, 1.00, 0.50} +\definecolor{D2} {cmyk}{0.20, 0.20, 0.80, 0.00} +\definecolor{D3} {cmyk}{0.00, 0.00, 0.20, 0.10} +\definecolor{D4} {cmyk}{0.00, 0.00, 0.20, 0.05} +\definecolor{F1} {cmyk}{0.00, 0.80, 0.50, 0.00} +\definecolor{F2} {cmyk}{0.00, 0.40, 0.30, 0.00} +\definecolor{F3} {cmyk}{0.00, 0.15, 0.10, 0.00} +\definecolor{F4} {cmyk}{0.00, 0.07, 0.05, 0.00} +\definecolor{G1} {cmyk}{1.00, 0.00, 0.50, 0.00} +\definecolor{G2} {cmyk}{0.50, 0.00, 0.20, 0.00} +\definecolor{G3} {cmyk}{0.20, 0.00, 0.10, 0.00} +\definecolor{G4} {cmyk}{0.10, 0.00, 0.05, 0.00} +\definecolor{H1} {cmyk}{0.40, 0.00, 1.00, 0.10} +\definecolor{H2} {cmyk}{0.20, 0.00, 0.50, 0.05} +\definecolor{H3} {cmyk}{0.10, 0.00, 0.20, 0.00} +\definecolor{H4} {cmyk}{0.07, 0.00, 0.15, 0.00} +\definecolor{J1} {cmyk}{0.00, 0.50, 1.00, 0.00} +\definecolor{J2} {cmyk}{0.00, 0.20, 0.50, 0.00} +\definecolor{J3} {cmyk}{0.00, 0.10, 0.20, 0.00} +\definecolor{J4} {cmyk}{0.00, 0.07, 0.15, 0.00} +\definecolor{FondOuv} {cmyk}{0.00, 0.05, 0.10, 0.00} +\definecolor{FondAutoEvaluation}{cmyk}{0.00, 0.03, 0.15, 0.00} +\definecolor{FondTableaux} {cmyk}{0.00, 0.00, 0.20, 0.00} +\definecolor{FondAlgo} {cmyk}{0.07, 0.00, 0.30, 0.00} +\definecolor{BleuOuv} {cmyk}{1.00, 0.00, 0.00, 0.00} +\definecolor{PartieFonction} {cmyk}{1.00, 0.00, 0.00, 0.00} +\definecolor{PartieGeometrie} {cmyk}{0.80, 0.80, 0.00, 0.00} +% \end{macrocode} +% Les couleurs du bandeau de la partie statistique ont souvent bougé. +% \begin{macrocode} +\definecolor{PartieStatistique} {cmyk}{0.60, 0.95, 0.00, 0.20} +\definecolor{PartieStatistiqueOLD}{cmyk}{0.95, 0.60, 0.20, 0.00} +\definecolor{PartieStatistique*}{cmyk}{0.30, 1.00, 0.00, 0.00} +% \end{macrocode} +% Couleurs qui se sont ajoutées après la première version de la +% maquette qui était accompagnée du nuancier. +% \begin{macrocode} +\definecolor{U1} {cmyk}{0.50, 0.10, 0.00, 0.10} +\definecolor{U2} {cmyk}{0.20, 0.15, 0.00, 0.00} +\definecolor{U3} {cmyk}{0.50, 0.00, 1.00, 0.00} +\definecolor{U4} {cmyk}{0.40, 0.00, 0.00, 0.00} +% \end{macrocode} +% On ajoute le noir, le blanc et quelques gris. +% \begin{macrocode} +\definecolor{Blanc} {cmyk}{0.00, 0.00, 0.00, 0.00} +\definecolor{Gris1} {cmyk}{0.00, 0.00, 0.00, 0.20} +\definecolor{Gris2} {cmyk}{0.00, 0.00, 0.00, 0.40} +\definecolor{Gris3} {cmyk}{0.00, 0.00, 0.00, 0.50} +\definecolor{Noir} {cmyk}{0.00, 0.00, 0.00, 1.00} +% \end{macrocode} +% Les couleurs effectives sont définies en termes des couleurs de +% bases ci-dessous. On commence avec les éléments partagés dans tout +% le document. En particulier, la première définition concerne la +% couleur par défaut qui doit être un noir définie en CMYK pour que +% overprint fonctionne correctement +% \begin{macrocode} +\AtBeginDocument{\def\default@color{cmyk 0 0 0 1}\normalcolor} +\colorlet{AlgoLineColor}{F3} +\colorlet{AlgoBkgColor}{F1} +\colorlet{AlgoTextColor}{Blanc} +\colorlet{TiceLineColor}{A3} +\colorlet{TiceBkgColor}{A1} +\colorlet{TiceTextColor}{Blanc} +\colorlet{CadreLineColor}{D3} +\colorlet{CadreBkgColor}{Blanc} +\colorlet{AlgorithmeRuleColor}{D2} +\colorlet{AlgorithmeBkgColor}{FondAlgo} +\colorlet{CouleurAlgoAffiche}{Noir} +\colorlet{CouleurAlgoDemander}{Noir} +\colorlet{CouleurAlgoSaisir}{Noir} +\colorlet{CouleurAlgoStocker}{Noir} +\colorlet{CouleurAlgoSi}{Noir} +\colorlet{CouleurAlgoTantque}{Noir} +\colorlet{CouleurAlgoPour}{Noir} +\colorlet{CouleurAlgoCalcule}{Noir} +\colorlet{CouleurAlgoInitialiser}{Noir} +\colorlet{CouleurAlgoIncrementer}{Noir} +\colorlet{CouleurAlgoCommentaire}{Noir} +\colorlet{CouleurAlgoDonnerValeur}{Noir} +\colorlet{CommentaireItemColor}{Noir} +\colorlet{FiletTableauColor}{Gris3} +\colorlet{FondSudokuColor}{FondTableaux} +% \end{macrocode} +% Couleurs de la première page. +% +% Les couleurs pour les rectangles de pieds de pied de page sont +% calculées à partir de la couleur du bandeau d'en-tête : on divise +% toutes les composantes par deux. +% \begin{macrocode} +\definecolor{FootFonctionColor}{cmyk}{0.50, 0.00, 0.00, 0.00} +\definecolor{FootGeometrieColor}{cmyk}{0.40, 0.40, 0.00, 0.00} +\definecolor{FootStatistiqueColor}{cmyk}{0.30, 0.48, 0.00, 0.10} +\definecolor{FootStatistiqueOLDColor}{cmyk}{0.48, 0.30, 0.10, 0.00} +\definecolor{FootStatistique*Color}{cmyk}{0.20, 0.00, 0.00, 0.00} +\colorlet{ChapterBottomFrameColor}{J4} +\colorlet{ThemaTopFrameColor}{J1} +\colorlet{ThemaBottomFrameColor}{J2} +\colorlet{ThemaTitleColor}{Blanc} +\colorlet{ChapterNumBkgColor}{H2} +\colorlet{ChapterNumSquare0Color}{Blanc} +\colorlet{ChapterNumSquare1Color}{H1} +\colorlet{ChapterNumSquare2Color}{H2} +\colorlet{ChapterNumSquare3Color}{H4} +\colorlet{ChapterTitleColor}{B1} +\colorlet{ChapAppColor}{Blanc} +\colorlet{ChapterNumColor}{Blanc} +\colorlet{PrerequisTitleColor}{B2} +\colorlet{PrerequisBkgColor}{A4} +\colorlet{PrerequisItemColor}{B2} +\colorlet{AEItemColor}{B2} +\colorlet{AETitleFrame0Color}{Blanc} +\colorlet{AETitleFrame1Color}{B2} +\colorlet{AETitleFrame2Color}{B3} +\colorlet{AETitleFrame3Color}{A4} +\colorlet{AETitleFrame4Color}{A3} +\colorlet{AETitleFrame5Color}{A2} +\colorlet{AETitleColor}{Blanc} +\colorlet{AEExoNumColor}{Blanc} +\colorlet{AEExoNumFrameColor}{J1} +\colorlet{AEFrameColor}{FondAutoEvaluation} +\colorlet{AECartoucheCorrBkgColor}{J2} +\colorlet{AECartoucheCorrArrowColor}{G2} +\colorlet{AECartoucheCorrVCPColor}{B2} +% \end{macrocode} +% Couleurs pour la partie \og Activités d'approche \fg{} ainsi que la +% couleur du numéro de chapitre dans les pieds de page. +% \begin{macrocode} +\colorlet{ActiviteHeadFrame0Color}{Blanc} +\colorlet{ActiviteHeadFrame1Color}{C1} +\colorlet{ActiviteHeadFrame2Color}{C2} +\colorlet{ActiviteHeadFrame3Color}{C3} +\colorlet{ActiviteHeadFrame4Color}{D3} +\colorlet{ActiviteHeadFrame5Color}{G1} +\definecolor{ActiviteFootColor}{cmyk}{0.50, 0.00, 0.25, 0.00} +\colorlet{FootChapterNumColor}{U1} +\colorlet{ActiviteSubtitleColor}{H1} +\colorlet{ActiviteNumColor}{Blanc} +\colorlet{ActiviteDebatTopColor}{G4} +\colorlet{ActiviteDebatBottomColor}{D4} +\colorlet{ActiviteActiviteTopColor}{D3} +\colorlet{ActiviteActiviteBottomColor}{G2} +\colorlet{ActiviteTitleColor}{C1} +\colorlet{ActiviteItemColor}{C1} +\colorlet{ActivitePartieColor}{A2} +% \end{macrocode} +% Couleurs pour la partie \og Cours - Méthodes \fg{}. +% \begin{macrocode} +\colorlet{CoursHeadFrame0Color}{Blanc} +\colorlet{CoursHeadFrame1Color}{J1} +\colorlet{CoursHeadFrame2Color}{J2} +\colorlet{CoursHeadFrame3Color}{J4} +\colorlet{CoursHeadFrame4Color}{A3} +\colorlet{CoursHeadFrame5Color}{A2} +\definecolor{CoursFootColor}{cmyk}{0.15, 0.00, 0.00, 0.03} +\colorlet{SectionFrame1Color}{J4} +\colorlet{SectionFrame2Color}{J2} +\colorlet{SectionFrame3Color}{J1} +\colorlet{SectionNumColor}{A1} +\colorlet{SectionTitleColor}{A1} +\colorlet{SubsectionNumColor}{B2} +\colorlet{SubsectionTitleColor}{J1} +\colorlet{DefSquareColor}{B2} +\colorlet{DefTitleColor}{A1} +\colorlet{DefSubtitleColor}{B2} +\colorlet{DefItemColor}{B2} +\colorlet{DefFrameColor}{J3} +\colorlet{RemTitleColor}{H1} +\colorlet{RemItemColor}{H1} +\colorlet{ExempleRuleColor}{J1} +\colorlet{ExempleEdgeFrameColor}{J2} +\colorlet{ExempleBkgFrameColor}{F4} +\colorlet{ExempleTitleColor}{A1} +\colorlet{ExempleItemColor}{J1} +\colorlet{MethodeTitleFrameColor}{A2} +\colorlet{MethodeTitleColor}{Blanc} +\colorlet{MethodeSubtitleColor}{B2} +\colorlet{MethodeIntroBkgFrameColor}{A4} +\colorlet{ExAppEdgeFrameColor}{A2} +\colorlet{ExAppBkgFrameColor}{H1} +\colorlet{ExAppTitleColor}{Blanc} +\colorlet{ExAppCorrEdgeFrameColor}{H1} +\colorlet{ExAppCorrBkgFrameColor}{A2} +\colorlet{ExAppCorrTitleColor}{Blanc} +\colorlet{ExAppItemColor}{A2} +\colorlet{MethodeRuleColor}{A3} +\colorlet{ProofRuleColor}{B1} +\colorlet{ProofTitleColor}{A1} +\colorlet{ProofTopFrameColor}{B4} +\colorlet{ProofBottomFrameColor}{B3} +\colorlet{ProofTriangleFrameColor}{B1} +\colorlet{ProofItemColor}{J2} +% \end{macrocode} +% Couleurs pour la partie \og Exercices de base \fg{}. +% \begin{macrocode} +\colorlet{ExoBaseHeadFrame0Color}{Blanc} +\colorlet{ExoBaseHeadFrame1Color}{G1} +\colorlet{ExoBaseHeadFrame2Color}{G2} +\colorlet{ExoBaseHeadFrame3Color}{G4} +\colorlet{ExoBaseHeadFrame4Color}{J2} +\colorlet{ExoBaseHeadFrame5Color}{J1} +\definecolor{ExoBaseFootColor}{cmyk}{0.00, 0.25, 0.50, 0.00} +\colorlet{ExerciceColumnRuleColor}{J1} +\colorlet{ExercicesTitleColor}{C1} +\colorlet{ExercicesTitleVRuleColor}{G2} +\colorlet{ExercicesTitleSquareColor}{J1} +\colorlet{ExercicesTitleHRuleColor}{C3} +\colorlet{ExerciceNumColor}{Blanc} +\colorlet{ExerciceTitleColor}{F1} +\colorlet{ExerciceNumFrameColor}{G1} +\colorlet{ExerciceCorrigeNumFrameColor}{J1} +\colorlet{ExerciceItemColor}{G1} +\colorlet{ExercicePartieColor}{J1} +\colorlet{ExerciceRefMethodeColor}{A2} +% \end{macrocode} +% Couleurs pour la partie \og Exercices d'approfondissement \fg{}. +% \begin{macrocode} +\colorlet{ExoApprHeadFrame0Color}{Blanc} +\colorlet{ExoApprHeadFrame1Color}{G1} +\colorlet{ExoApprHeadFrame2Color}{G2} +\colorlet{ExoApprHeadFrame3Color}{G4} +\colorlet{ExoApprHeadFrame4Color}{J2} +\colorlet{ExoApprHeadFrame5Color}{J1} +\definecolor{ExoApprFootColor}{cmyk}{0.00, 0.25, 0.50, 0.00} +% \end{macrocode} +% Couleurs pour la partie \og Je teste mes connaissances \fg{}. +% \begin{macrocode} +\colorlet{ConnHeadFrame0Color}{Blanc} +\colorlet{ConnHeadFrame1Color}{A2} +\colorlet{ConnHeadFrame2Color}{A3} +\colorlet{ConnHeadFrame3Color}{J2} +\colorlet{ConnHeadFrame4Color}{J1} +\colorlet{ConnHeadFrame5Color}{F1} +\colorlet{ConnFootColor}{F2} +\colorlet{AcquisTitleColor}{G1} +\colorlet{AcquisBkgColor}{A4} +\colorlet{AcquisItemColor}{F1} +\colorlet{QCMAEFrameColor}{G1} +\colorlet{QCMAETitleCircle1Color}{J1} +\colorlet{QCMAETitleCircle2Color}{J2} +\colorlet{QCMAETitleCircle3Color}{F1} +\colorlet{QCMAETitleColor}{Blanc} +\colorlet{QCMItemNumColor}{G1} +\colorlet{QCMFrameColor}{J1} +\colorlet{QCMTextFrameColor}{Blanc} +\colorlet{QCMExoNumColor}{Blanc} +\colorlet{QCMExoNumFrameColor}{J1} +\colorlet{QCMLineColor}{A4} +% \end{macrocode} +% Couleurs pour la partie \og Travaux pratiques \fg{} et pour la +% partie Récréation, énigmes. +% \begin{macrocode} +\colorlet{TPHeadFrame0Color}{Blanc} +\colorlet{TPHeadFrame1Color}{H1} +\colorlet{TPHeadFrame2Color}{H2} +\colorlet{TPHeadFrame3Color}{H3} +\colorlet{TPHeadFrame4Color}{C3} +\colorlet{TPHeadFrame5Color}{C2} +\definecolor{TPFootColor}{cmyk}{0.00, 0.30, 0.00, 0.10} +\colorlet{TPTopColor}{J3} +\colorlet{TPBottomColor}{C3} +\colorlet{TPTitleColor}{H1} +\colorlet{TPPartieColor}{J1} +\colorlet{TPPartieBkgColor}{C2} +\colorlet{TPPartieNumColor}{Blanc} +\colorlet{RecreationHeadFrame0Color}{Blanc} +\colorlet{RecreationHeadFrame1Color}{J1} +\colorlet{RecreationHeadFrame2Color}{J2} +\colorlet{RecreationHeadFrame3Color}{H4} +\colorlet{RecreationHeadFrame4Color}{H2} +\colorlet{RecreationHeadFrame5Color}{H1} +\definecolor{RecreationFootColor}{cmyk}{0.20, 0.00, 0.50, 0.05} +\colorlet{RecreationTitleColor}{H1} +\colorlet{RecreationItemColor}{U3} +\colorlet{RecreationPartieColor}{J1} +% \end{macrocode} +% Couleurs pour la partie \og corrigés \fg (partie annexe). +% \begin{macrocode} +\colorlet{CorrigeHeadFrameColor}{J2} +\colorlet{CorrigeColumnRuleColor}{J1} +\colorlet{CorrigeAETitleColor}{F1} +\colorlet{CorrigeExercicesBaseTitleColor}{C2} +\colorlet{CorrigeExercicesApprTitleColor}{C2} +\colorlet{CorrigeConnaissancesTitleColor}{G1} +\colorlet{CorrigeQCMItemNumColor}{G1} +% \end{macrocode} +% Couleurs pour la liste des méthodes +% \begin{macrocode} +\colorlet{ListeMethodeHeadFrameColor}{G3} +\colorlet{ListeMethodeColumnRuleColor}{A1} +\colorlet{ListeMethodeTitleColor}{B2} +% \end{macrocode} +% Couleurs pour les annexes générales +% \begin{macrocode} +\colorlet{TablePropertyBkgColor}{J4} +\colorlet{TablePropertyTitleBkgColor}{PartieStatistique} +\colorlet{TablePropertyTitleTextColor}{Blanc} +\colorlet{AnnexePartieColor}{A1} +% \end{macrocode} +% Couleurs pour le lexique +% \begin{macrocode} +\colorlet{LexiqueHeadFrameColor}{F2} +\colorlet{LexiqueColumnRuleColor}{B2} +\colorlet{FirstLetterTxtColor}{B1} +\colorlet{FirstLetterBkgColor}{J3} +\colorlet{LexiqueEntreeColor}{B2} +\colorlet{LexiqueItemColor}{B2} +% \end{macrocode} +% Couleurs pour le texte libre. +% \begin{macrocode} +\colorlet{LibrePartieColor}{A1} +% \end{macrocode} +% \section{Fontes} +% Fontes utilisées tout au long du document. La macro |\selectfont| à +% la suite de |\fontsize| n'est obligatoire que dans la mesure où il +% n'y a pas d'autres commandes \LaTeX{} de modification de fonte. On +% commence avec les fontes partagées pour tout le document. +% \begin{macrocode} +\newcommand*\AlgoFont{\fontsize{9.5}{9.5}\sffamily\bfseries} +\newcommand*\TiceFont{\fontsize{9.5}{9.5}\sffamily\bfseries} +% \end{macrocode} +% Fontes de la page de titre. +% \begin{macrocode} +\newcommand*\ThemaTitleFont{\fontsize{20}{24}\sffamily} +\newcommand*\ChapterTitleFont{\fontsize{40}{40}\sffamily\bfseries} +\newcommand*\ChapAppFont{\fontsize{15}{18}\sffamily} +\newcommand*\ChapterNumFont{\fontsize{88}{106}\sffamily} +\newcommand*\PrerequisTitleFont{\fontsize{14.4}{17.28}\sffamily\bfseries} +\newcommand*\PrerequisTextFont{\fontsize{9.5}{14.4}\sffamily} +\newcommand*\AETitleFont{\fontsize{15}{18}\sffamily\bfseries} +\newcommand*\AEExoNumFont{\fontsize{9.5}{14.4}\sffamily\bfseries} +\newcommand*\AECartoucheCorrArrowFont{\fontsize{12}{14.4}} +\newcommand*\AECartoucheCorrVCPFont{\fontsize{9.5}{14.4}\sffamily} +\newcommand*\AEManuelFont{\fontsize{9.5}{10.5}\sffamily} +\newcommand*\LogoManuelFont{\fontsize{9.5}{10.5}\sffamily\bfseries} +\newcommand*\LogoURLManuelFont{\fontsize{9.5}{10.5}\sffamily\bfseries} +% \end{macrocode} +% Fontes pour les en-têtes et pied de page. +% \begin{macrocode} +\newcommand*\HeadTitleFont{\fontsize{24}{28.8}\sffamily\bfseries} +\newcommand*\RoundHeadTitleFont{\fontsize{24}{28.8}\sffamily\bfseries\itshape} +\newcommand*\FootChapterNumFont{\fontsize{12}{14.4}\sffamily\bfseries} +\newcommand*\FootTitleHeadFont{\fontsize{9.5}{12}\sffamily\bfseries} +\newcommand*\FootTitleChapterFont{\fontsize{9.5}{12}\sffamily} +\newcommand*\FootPageFont{\fontsize{9.5}{12}\sffamily\bfseries} +% \end{macrocode} +% Fontes pour la partie Activités d'approche +% \begin{macrocode} +\newcommand*\ActiviteTitleFont{\fontsize{15}{18}\sffamily\bfseries} +\newcommand*\ActiviteNumFont{\fontsize{15}{18}\sffamily\bfseries} +\newcommand*\ActiviteSubtitleFont{\fontsize{15}{18}\sffamily\bfseries} +\newcommand*\ActivitePartieFont{\fontsize{12}{14.4}\sffamily\bfseries} +% \end{macrocode} +% Fontes pour la partie Cours - Méthodes. +% \begin{macrocode} +\newcommand*\SectionNumFont{\fontsize{21}{25}\sffamily\bfseries} +\newcommand*\SectionTitleFont{\fontsize{17.28}{21}\sffamily\bfseries} +\newcommand*\SubsectionNumFont{\fontsize{17.28}{21}\sffamily\bfseries} +\newcommand*\SubsectionTitleFont{\fontsize{14.4}{17.28}\sffamily\bfseries} +\newcommand*\DefTitleFont{\fontsize{12}{14.4}\sffamily} +\newcommand*\DefSubtitleFont{\fontsize{12}{14.4}\sffamily\bfseries} +\newcommand*\RemTitleFont{\fontsize{9.5}{14.4}\scshape\bfseries} +\newcommand*\ExempleTitleFont{\fontsize{9.5}{14.4}\sffamily} +\newcommand*\MethodeTitleFont{\fontsize{12}{14.4}\sffamily\bfseries} +\newcommand*\MethodeSubtitleFont{\fontsize{12}{14.4}\sffamily\bfseries} +\newcommand*\MethodeRefExerciceFont{\fontsize{9.5}{14.4}\sffamily} +\newcommand*\ExAppTitleFont{\normalsize\sffamily} +\newcommand*\ExAppCorrTitleFont{\normalsize\sffamily} +\newcommand*\ProofTitleFont{\fontsize{9.5}{14.4}\sffamily} +% \end{macrocode} +% Fontes pour les parties Exercices de base et Exercices +% d'approfondissement. +% \begin{macrocode} +\newcommand*\ExercicesTitleFont{\fontsize{14.4}{17.28}\sffamily\bfseries} +\newcommand*\ExerciceNumFont{\fontsize{10.5}{14.4}\sffamily\bfseries} +\newcommand*\ExerciceTitleFont{\fontsize{10.5}{14.4}\sffamily\bfseries} +\newcommand*\ExercicePartieFont{\fontsize{10.5}{14.4}\bfseries} +\newcommand*\ExerciceRefMethodeFont{\fontsize{9.5}{14.4}\sffamily\bfseries} +\newcommand*\ExercicePageRefMethodeFont{\fontsize{9.5}{14.4}\sffamily} +% \end{macrocode} +% Fontes pour la partie Je teste mes connaissances. +% \begin{macrocode} +\newcommand*\AcquisTitleFont{\fontsize{17.28}{17.28}\sffamily\bfseries} +\newcommand*\AcquisTextFont{\fontsize{9.5}{14.4}\sffamily} +\newcommand*\QCMAETitleFont{\fontsize{20}{20}\sffamily\bfseries} +\newcommand*\QCMAEManuelFont{\fontsize{9.5}{10.5}\sffamily} +\newcommand*\QCMAETextAfterTitleFont{\bfseries} +\newcommand*\QCMExoNumFont{\fontsize{9.5}{14.4}\sffamily\bfseries} +\newcommand*\QCMItemNumFont{\fontsize{9.5}{14.4}\sffamily\bfseries} +% \end{macrocode} +% Fontes pour la partie TP. +% \begin{macrocode} +\newcommand*\TPPartieFont{\fontsize{12}{14.4}\sffamily\bfseries} +\newcommand*\RecreationFont{\fontsize{20}{20}\scriptfamily\bfseries} +\newcommand*\RecreationTitleFont{\fontsize{12}{14.4}\sffamily\bfseries} +\newcommand*\RecreationPartieFont{\fontsize{10}{14.4}\scshape\bfseries} +\newcommand*\RecreationPartieTitleFont{\fontsize{10}{14.4}\bfseries} +% \end{macrocode} +% Fontes pour la liste des méthodes. +% \begin{macrocode} +\newcommand*\ListeMethodeChapterFont{\fontsize{40}{40}\sffamily} +\newcommand*\ListeMethodeTitleFont{\fontsize{12}{14.4}\sffamily\bfseries} +\newcommand*\ListeMethodePageFont{\fontsize{12}{14.4}\sffamily\bfseries} +% \end{macrocode} +% Fontes pour la partie Corrigés (annexe). +% \begin{macrocode} +\newcommand*\CorrigeTitleFont{\fontsize{40}{40}\sffamily} +\newcommand*\CorrigeChapterFont{\fontsize{12}{14.4}\sffamily\bfseries} +\newcommand*\CorrigePartieFont{\fontsize{11}{14.4}\sffamily\bfseries} +\newcommand*\CorrigeNumExerciceFont{\fontsize{9.5}{14.4}\sffamily\bfseries} +\newcommand*\CorrigeQCMItemNumFont{\fontsize{9.5}{14.4}\sffamily} +% \end{macrocode} +% Fontes pour les annexes générales. +% \begin{macrocode} +\newcommand*\FootAnnexeTxtFont{\fontsize{11}{14.4}\sffamily} +\newcommand*\FootAnnexePageFont{\fontsize{11}{14.4}\sffamily\bfseries} +\newcommand*\AnnexeTitleFont{\fontsize{35}{35}\sffamily} +\newcommand*\AnnexeSectionTitleFont{\fontsize{14.4}{14.4}\sffamily\bfseries} +\newcommand*\ProprieteFont{\fontsize{10}{14.4}\sffamily} +\newcommand*\NumProprieteFont{\fontsize{10}{14.4}\sffamily\bfseries} +\newcommand*\AnnexePartieFont{\fontsize{10.5}{14.4}\bfseries} +% \end{macrocode} +% Fontes pour le lexique. +% \begin{macrocode} +\newcommand*\LexiqueTitleFont{\fontsize{50}{50}\sffamily} +\newcommand*\FirstLetterFont{\fontsize{16}{16}\sffamily\bfseries} +\newcommand*\LexiqueEntreeFont{\fontsize{12}{14.4}\sffamily\bfseries} +\newcommand*\LexiqueFont{\sffamily\upshape\bfseries} +% \end{macrocode} +% Fontes pour le texte libre. +% \begin{macrocode} +\newcommand*\FootLibrePageFont{\fontsize{11}{14.4}\sffamily\bfseries} +\newcommand*\LibreSectionTitleFont{\fontsize{14.4}{14.4}\sffamily\bfseries} +\newcommand*\LibrePartieFont{\fontsize{10.5}{14.4}\bfseries} +% \end{macrocode} +% \section{Longueurs} +% Longueurs utilisées tout au long du document. Il n'est pas +% nécessaire que ce soit des registres de dimensions. On commence avec +% les longueurs utilisées pour l'ensemble du document. +% +% Longueurs pour les en-têtes et pieds de page de tout le document. +% \begin{macrocode} +\def\SquareWidth{3mm} +\def\ItemRuleWidth{1.5mm} +\def\ItemRuleHeight{1.5mm} +\def\ItemRuleDepth{0mm} +\def\ListLabelWidth{4mm} +\def\EnumerateLabelWidth{5mm} +\def\ListHSep{2mm} +\def\AlgorithmeRuleWidth{1pt} +\def\AlgorithmeSep{2mm} +\def\AlgorithmeNumWidth{6mm} +\def\HeadFrameWidth{11cm} +\def\RoundHeadFrameWidth{12.8cm} +\def\HeadTitleSep{1cm} +\edef\HeadTitleMaxWidth + {\the\dimexpr \HeadFrameWidth-\SquareWidth*3-\HeadTitleSep} +\edef\RoundHeadTitleMaxWidth + {\the\dimexpr \RoundHeadFrameWidth-\SquareWidth*3-\HeadTitleSep} +\edef\HeadFrameHeight{\the\dimexpr \smc@margintop-\smc@headsep} +\def\HeadFrameDepth{3mm} +\def\FootFrameWidth{6mm} +\def\FootFrameSep{1mm} +\def\AlgoIndent{1em} +% \end{macrocode} +% Longueurs pour les différents cadres. +% \begin{macrocode} +\def\CadreSep{2mm} +\def\CadreLineWidth{0.5mm} +\def\FrameSep{3mm} +\def\FrameLineWidth{1pt} +\edef\FrameArc{\the\dimexpr \SquareWidth/2} +\def\RuleWidth{1pt} +\def\BeforeCadreVSpace{1.5mm} +\def\AfterCadreVSpace{1.5mm} +\def\BeforeTableVSpace{1.5mm} +\def\AfterTableVSpace{1.5mm} +\def\HabillageGap{2mm} +\def\LogoLineWidth{1pt} +\def\BeforeAlgorithmeVSpace{1.5mm} +\def\AfterAlgorithmeVSpace{1.5mm} +% \end{macrocode} +% Viennent ensuite les longueurs spécifiques à chaque partie du +% document. +% +% Longueurs pour la page de titre. +% \begin{macrocode} +\edef\ChapterTopFrameHeight{\the\dimexpr 2.1cm+\smc@bleed} +\def\ChapterBottomFrameHeight{6cm} +\edef\ChapterTotalFrameHeight{% + \the\dimexpr\ChapterTopFrameHeight+\ChapterBottomFrameHeight} +\def\ChapterBottomPicture{5.5cm} +\def\ChapterNumLeftFrame{13.4cm} +% \end{macrocode} +% Les longueurs basées sur |\linewidth| ne peuvent être calculées +% qu'au moment du |\begin{document}|. +% \begin{macrocode} +\AtBeginDocument{% + \edef\ChapterTitleThemaWidth{% + \the\dimexpr\linewidth-\ChapterNumLeftFrame-6mm + }% +} +\def\ChapterNumBase{3.6cm} +\def\ChapterNumBottomFrame{2.1cm} +\edef\ChapterNumTopFrame{\the\dimexpr 8.1cm+\smc@bleed} +\def\ChapterTitleBase{2.1cm} +\def\ChapterTitleSep{1cm} +\def\ThemaBottomFrame{5.7cm} +\def\ThemaTopFrame{6.6cm} +\def\PrerequisTitleVSpace{1mm} +\def\AETitleWidth{8cm} +\edef\AETitleHeight{\the\dimexpr \SquareWidth*3} +\def\AEFrameVSep{4mm} +\edef\AEFrameHSep{\SquareWidth} +\edef\AEFrameRuleWidth{\the\dimexpr\SquareWidth/2} +\edef\AEExoFrameWidth{\the\dimexpr \SquareWidth*2} +\def\AEExoFrameTopSep{1mm} +\def\AfterAEExoFrameHSpace{2mm} +\def\AECartoucheCorrSep{4mm} +\def\AECartoucheCorrHeight{6mm} +\def\AECartoucheCorrWidth{50mm} +\def\AEManuelWidth{55mm} +\def\AEManuelRightSpace{1mm} +\def\AELogoManuelWidth{9mm} +\def\AfterAEManuelVSpace{3mm} +% \end{macrocode} +% Longueurs pour la partie Activités d'approche. +% \begin{macrocode} +\def\BeforeActiviteVSpace{5mm} +% \end{macrocode} +% Pour la longueur suivante, comme on fait beaucoup de calcul où +% interviennent une multiplication par $\sqrt{2}$ ou par +% $\frac{\sqrt{2}}{2}$, on va en faire un registre de longueur au lieu +% d'une macro. +% \begin{macrocode} +\newdimen\ActiviteTitleTopHeight +\ActiviteTitleTopHeight 6mm +\def\ActiviteTitleBottomHeight{1.5mm} +\def\ActiviteTitleLeftSpace{2mm} +\def\ActiviteTitleRightSpace{1mm} +\def\AfterActiviteTitleHSpace{2mm} +\def\AfterActiviteTitleVSpace{3mm} +\def\BeforeActivitePartieVSpace{1.5mm} +\def\AfterActivitePartieVSpace{1mm} +% \end{macrocode} +% Longueurs pour la partie Cours - Méthodes. +% \begin{macrocode} +\def\BeforeSectionVSpace{10mm} +\def\AfterSectionVSpace{2mm} +\def\SectionNumTitleHSpace{3mm} +\def\SectionCorrectionChassePoint{-0.25pt} +\def\BeforeSubsectionVSpace{4mm} +\def\AfterSubsectionVSpace{1mm} +\def\BeforeDefVSpace{3mm} +\def\AfterDefVSpace{1.5mm} +\def\DefFrameHSep{3mm} +\def\DefFrameVSep{1mm} +\def\DefTitleFrameVSep{1mm} +\def\BeforeRemVSpace{3mm} +\def\AfterRemVSpace{1.5mm} +\def\BeforeExempleVSpace{4mm} +\def\ExempleVRuleWidthFrame{1.25mm} +\def\ExempleHRuleWidthFrame{0.75mm} +\def\ExempleWidthFrame{15mm} +\def\ExempleHeightFrame{3mm} +\def\BeforeMethodeVSpace{3mm} +\edef\MethodeTitleLeftSpace{\SquareWidth} +\edef\MethodeTitleRightSpace{\SquareWidth} +\def\MethodeSubtitleLeftSpace{2mm} +\def\AfterMethodeTitleVspace{1.5mm} +\def\MethodeFrameHSep{3mm} +\def\MethodeFrameTopSep{2mm} +\def\MethodeFrameBottomSep{1mm} +\def\ExAppWidthFrame{30mm} +\def\ExAppHeightFrame{3mm} +\def\ExAppDepthFrame{0.75mm} +\def\ExAppCorrWidthFrame{15mm} +\def\ExAppCorrHeightFrame{3mm} +\def\ExAppCorrDepthFrame{0.75mm} +\def\AfterCartoucheHSpace{1.5mm} +\def\AfterExAppMethodeVSpace{3mm} +\def\BeforeProofVSpace{3mm} +\def\AfterProofVSpace{1.5mm} +\def\ProofHeightFrame{3mm} +\def\ProofDepthFrame{0.75mm} +\def\ProofLeftSpace{1mm} +\def\ProofRightSpace{1.5mm} +\def\AfterProofTitleHSpace{1.5mm} +% \end{macrocode} +% Longueurs pour les parties Exercices de base et Exercices +% d'approfondissement. +% \begin{macrocode} +\def\BeforeExercicesTitleVSpace{3mm} +\def\AfterExercicesTitleVSpace{1.5mm} +\def\ExercicesTitleHSep{3mm} +\def\ExercicesTitleVSep{2mm} +\def\BeforeExerciceVSpace{1.5mm} +\def\ExerciceNumFrameWidth{6mm} +\def\ExerciceNumFrameHeight{3.25mm} +\def\ExerciceNumFrameDepth{0.75mm} +\def\ExerciceTextHSep{2mm} +\def\BeforeExercicePartieVSpace{1.5mm} +\def\AfterExercicePartieVSpace{1mm} +% \end{macrocode} +% Longueurs pour la partie Je teste mes connaissances. +% \begin{macrocode} +\def\AcquisTitleVSpace{1mm} +\def\BeforeQCMAEVSpace{6mm plus2mm minus2mm} +\def\QCMAETitleHeight{9mm} +\def\QCMAETitleWidth{110mm} +\def\QCMAETitleLeftSpace{17mm} +\def\QCMAEManuelWidth{40mm} +\def\QCMAEManuelRightSpace{1mm} +\def\QCMAELogoManuelWidth{9mm} +\def\AfterQCMAEManuelVSpace{0mm} +\def\AfterQCMAETitleVSpace{5mm plus2mm minus1mm} +\def\AfterQCMAETextVSpace{3mm plus1mm minus1mm} +\def\QCMRefHSep{1pt} +\edef\QCMExoFrameWidth{\the\dimexpr \SquareWidth*2} +\def\QCMExoFrameTopSep{1mm} +\def\AfterQCMExoFrameHSpace{2mm} +\def\QCMLabelWidth{6mm} +\def\BeforeQCMVSpace{2mm plus1mm minus1mm} +\def\AfterQCMVSpace{0mm plus1mm} +\def\QCMLineWidth{2mm} +\def\QCMFrameSep{1mm} +\edef\QCMLineArc{\SquareWidth} +% \end{macrocode} +% Longueurs pour la partie TP +% \begin{macrocode} +\def\BeforeTPPartieVSpace{3mm plus1mm minus1mm} +\def\AfterTPPartieVSpace{0mm plus1mm} +\def\TPPartieHSep{2mm} +\def\BeforeRecreationVSpace{6mm} +\def\AfterRecreationVSpace{3mm} +\def\BeforeRecreationPartieVSpace{1.5mm minus 1mm} +\def\AfterRecreationPartieVSpace{1mm minus 0.5mm} +% \end{macrocode} +% Longueurs pour la liste des méthodes. +% \begin{macrocode} +\def\ListeMethodeRuleWidth{0.2pt} +\def\AfterMethodeVSpace{3pt} +\def\TriangleMethodeSize{1ex} +% \end{macrocode} +% Longueurs pour la partie corrigés (annexe). +% \begin{macrocode} +\def\CorrigeRuleWidth{0.2pt} +\def\CorrigeHeadFrameWidth{9mm} +\def\CorrigeChapterFrameHeight{5mm} +\def\BeforeCorrigePartieTitleVSpace{1mm minus 0.5mm} +\def\BeforeCorrigeChapterVspace{3mm plus1mm minus1mm} +\def\QCMHSep{1mm} +% \end{macrocode} +% Longueurs pour les annexes générales. +% \begin{macrocode} +\def\BeforeAnnexeTitleVSpace{-20mm} +\def\AfterAnnexeTitleVSpace{0mm plus0.5mm} +\edef\AnnexeSectionRuleWidth{\SquareWidth} +\def\AnnexeSectionRuleHSpace{1mm} +\def\BeforeAnnexeSectionVSpace{5mm} +\def\AfterAnnexeSectionVSpace{2mm} +\def\BeforeAnnexePartieVSpace{1.5mm} +\def\AfterAnnexePartieVSpace{1mm} +% \end{macrocode} +% Longueurs pour le lexique. +% \begin{macrocode} +\def\LexiqueRuleWidth{0.2pt} +\def\AfterFirstLetterVSpace{2mm} +\def\BeforeFirstLetterVSpace{2mm} +\def\FirstLetterFrameHSep{1mm} +\def\AfterEntreeVSpace{5mm} +% \end{macrocode} +% Longueurs pour les textes libres. +% \begin{macrocode} +\edef\LibreSectionRuleWidth{\SquareWidth} +\def\LibreSectionRuleHSpace{1mm} +\def\BeforeLibreSectionVSpace{5mm} +\def\AfterLibreSectionVSpace{2mm} +\def\BeforeLibrePartieVSpace{1.5mm} +\def\AfterLibrePartieVSpace{1mm} +% \end{macrocode} +% \section{Textes fixes} +% La classe propose un certain nombre de textes fixes qui vont être +% définis ici. Les macros sont rendus publiques pour pouvoir les +% modifier facilement si besoin. +% +% Attention, en cas d'utilisation de codage autre que UTF-8 ainsi que +% pour éviter des erreurs lors de développement précoce de macros, +% toutes les diacritiques seront codées \og à la \TeX{} \fg{}. +% \begin{macrocode} +\newcommand*\StringColitemize{colitemize} +\newcommand*\StringColenumerate{colenumerate} +\newcommand*\StringPrerequis{Connaissances du coll\`ege + n\'ecessaires \`a ce chapitre} +\newcommand*\StringActivitesApproche{Activit\'es d'approche} +\newcommand*\StringCoursMethodes{Cours~-~M\'ethodes} +\newcommand*\StringExercicesBase{S'entra\^iner} +\newcommand*\StringExercicesAppr{Approfondir} +\newcommand*\StringTestConnaissances{Je teste mes connaissances} +\newcommand*\StringConnaissances{Auto-\'evaluation QCM} +\newcommand*\StringTravauxPratiques{Travaux pratiques} +\newcommand*\StringAE{Auto-\'evaluation} +\newcommand*\StringVoirCorriges{Voir solutions p.} +\newcommand*\StringManuel{Des ressources num\'eriques pour pr\'eparer + le chapitre sur + \textcolor{U4}{\LogoURLManuelFont manuel.sesamath.net}} +\newcommand*\StringALGO{ALGO} +\newcommand*\StringTICE{INFO} +\newcommand*\StringRecreation{R\'ecr\'eation, \'enigmes} +\newcommand*\StringAcquisTitle{\`A la fin de ce chapitre, je dois + \^etre capable de\,:} +\newcommand*\StringQCMAE{QCM d'auto-\'evaluation} +% \end{macrocode} +% La chaîne |\StringQCM| ne doit pas être modifiée. +% \begin{macrocode} +\newcommand*\StringQCM{QCM} +\newcommand*\StringChapitre{Chapitre} +\newcommand*\StringEnigme{\'Enigme} +\newcommand*\StringPropriete{Propri\'et\'e} +\newcommand*\StringPROPRIETE{PROPRI\'ET\'E} +\newcommand*\StringDEFINITION{D\'EFINITION} +\newcommand*\StringTHEOREME{TH\'EOR\`EME} +\newcommand*\StringLexique{Lexique} +% \end{macrocode} +% Le logo utilisé pour indiquer que le manuel se trouve sur internet +% n'est pas à proprement parler une chaîne de caractères mais on va +% tout de même le définir ici. En revanche, il faut tous les +% renseignements inclus dans la macro. +% \begin{macrocode} +\newcommand*\LogoManuel{\textcolor{U4}{\LogoManuelFont @}} +\newcommand\StringDEBAT{D\'EBAT} +\newcommand\StringACTIVITE{ACTIVIT\'E} +\newcommand\StringTP{TP} +\newcommand*\StringExemple{Exemple} +\newcommand*\StringCorrection{Correction} +\newcommand*\StringMETHODE{M\'ETHODE} +\newcommand*\StringPREUVE{PREUVE} +\newcommand*\StringMethode{M\'ethode} +\newcommand*\StringExApp{Exercice d'application} +\newcommand*\StringPartie{Partie} +\newcommand*\StringListeMethode{Liste des m\'ethodes} +\newcommand*\StringCorriges{Solutions} +\newcommand*\StringListeMethodeF{Fonctions} +\newcommand*\StringListeMethodeG{G\'eom\'etrie} +\newcommand*\StringListeMethodeSP{Stat. et probabilit\'es} +% \end{macrocode} +% \section{Éléments graphiques particuliers} +% \begin{macro}{\smc@diagonal} +% Plusieurs éléments graphiques utilisent des carrés disposés en +% diagonale avec des couleurs dégradées, cette commande permet de +% construire l'ensemble de ces carrés de façon automatique. Le +% principe est que les coordonnées indiquent le coin inférieur gauche +% du carré inférieur gauche et que le second paramètre indique le nom +% de base \texttt{} pour retrouver les couleurs. Les noms des +% couleurs sont construits selon le principe \texttt{Color} +% où \texttt{} est un nombre de 1 à 5. Il aurait été plus simple de +% le faire avec un |\rput| mais bizarrement \XeLaTeX{} semble ne pas +% bien gérer la situation (il y a un petit décalage que je ne +% m'explique pas : très peu vers le haut et un peu plus vers la +% gauche). +% \begin{macrocode} +\def\smc@diagonal(#1,#2)#3{% + \psframe[linewidth=0pt, linestyle=none, fillcolor=#33Color] + (\dimexpr #1, \dimexpr #2) + (\dimexpr #1+\SquareWidth, \dimexpr #2+\SquareWidth) + \psframe[linewidth=0pt, linestyle=none, fillcolor=#32Color] + (\dimexpr #1+\SquareWidth, \dimexpr #2) + (\dimexpr #1+\SquareWidth*2, \dimexpr #2+\SquareWidth) + \psframe[linewidth=0pt, linestyle=none, fillcolor=#31Color] + (\dimexpr #1+\SquareWidth*2, \dimexpr #2) + (\dimexpr #1+\SquareWidth*3, \dimexpr #2+\SquareWidth) + \psframe[linewidth=0pt, linestyle=none, fillcolor=#34Color] + (\dimexpr #1, \dimexpr #2+\SquareWidth) + (\dimexpr #1+\SquareWidth, \dimexpr #2+\SquareWidth*2) + \psframe[linewidth=0pt, linestyle=none, fillcolor=#33Color] + (\dimexpr #1+\SquareWidth, \dimexpr #2+\SquareWidth) + (\dimexpr #1+\SquareWidth*2, \dimexpr #2+\SquareWidth*2) + \psframe[linewidth=0pt, linestyle=none, fillcolor=#32Color] + (\dimexpr #1+\SquareWidth*2, \dimexpr #2+\SquareWidth) + (\dimexpr #1+\SquareWidth*3, \dimexpr #2+\SquareWidth*2) + \psframe[linewidth=0pt, linestyle=none, fillcolor=#35Color] + (\dimexpr #1, \dimexpr #2+\SquareWidth*2) + (\dimexpr #1+\SquareWidth, \dimexpr #2+\SquareWidth*3) + \psframe[linewidth=0pt, linestyle=none, fillcolor=#34Color] + (\dimexpr #1+\SquareWidth, \dimexpr #2+\SquareWidth*2) + (\dimexpr #1+\SquareWidth*2, \dimexpr #2+\SquareWidth*3) + \psframe[linewidth=0pt, linestyle=none, fillcolor=#33Color] + (\dimexpr #1+\SquareWidth*2, \dimexpr #2+\SquareWidth*2) + (\dimexpr #1+\SquareWidth*3, \dimexpr #2+\SquareWidth*3) + \ignorespaces +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\smc@antidiagonal} +% C'est exactement la même chose que la macro précédente mais +% l'orientation se fait selon la diagonale non principale. +% \begin{macrocode} +\def\smc@antidiagonal(#1,#2)#3{% + \psframe[linewidth=0pt, linestyle=none, fillcolor=#31Color] + (\dimexpr #1, \dimexpr #2) + (\dimexpr #1+\SquareWidth, \dimexpr #2+\SquareWidth) + \psframe[linewidth=0pt, linestyle=none, fillcolor=#32Color] + (\dimexpr #1+\SquareWidth, \dimexpr #2) + (\dimexpr #1+\SquareWidth*2, \dimexpr #2+\SquareWidth) + \psframe[linewidth=0pt, linestyle=none, fillcolor=#33Color] + (\dimexpr #1+\SquareWidth*2, \dimexpr #2) + (\dimexpr #1+\SquareWidth*3, \dimexpr #2+\SquareWidth) + \psframe[linewidth=0pt, linestyle=none, fillcolor=#32Color] + (\dimexpr #1, \dimexpr #2+\SquareWidth) + (\dimexpr #1+\SquareWidth, \dimexpr #2+\SquareWidth*2) + \psframe[linewidth=0pt, linestyle=none, fillcolor=#33Color] + (\dimexpr #1+\SquareWidth, \dimexpr #2+\SquareWidth) + (\dimexpr #1+\SquareWidth*2, \dimexpr #2+\SquareWidth*2) + \psframe[linewidth=0pt, linestyle=none, fillcolor=#34Color] + (\dimexpr #1+\SquareWidth*2, \dimexpr #2+\SquareWidth) + (\dimexpr #1+\SquareWidth*3, \dimexpr #2+\SquareWidth*2) + \psframe[linewidth=0pt, linestyle=none, fillcolor=#33Color] + (\dimexpr #1, \dimexpr #2+\SquareWidth*2) + (\dimexpr #1+\SquareWidth, \dimexpr #2+\SquareWidth*3) + \psframe[linewidth=0pt, linestyle=none, fillcolor=#34Color] + (\dimexpr #1+\SquareWidth, \dimexpr #2+\SquareWidth*2) + (\dimexpr #1+\SquareWidth*2, \dimexpr #2+\SquareWidth*3) + \psframe[linewidth=0pt, linestyle=none, fillcolor=#35Color] + (\dimexpr #1+\SquareWidth*2, \dimexpr #2+\SquareWidth*2) + (\dimexpr #1+\SquareWidth*3, \dimexpr #2+\SquareWidth*3) + \ignorespaces +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\smc@rounddiagonal} +% Même chose que les carrés en diagonal mais avec des disques en diagonal +% \begin{macrocode} +\def\smc@rounddiagonal(#1,#2)#3{% + \pscircle*[linecolor=#33Color] + (\dimexpr #1+\SquareWidth/2, + \dimexpr #2+\SquareWidth/2) + {\dimexpr \SquareWidth/2} + \pscircle*[linecolor=#32Color] + (\dimexpr #1+\SquareWidth/2+\SquareWidth, + \dimexpr #2+\SquareWidth/2) + {\dimexpr \SquareWidth/2} + \pscircle*[linecolor=#31Color] + (\dimexpr #1+\SquareWidth/2+\SquareWidth*2, + \dimexpr #2+\SquareWidth/2) + {\dimexpr \SquareWidth/2} + \pscircle*[linecolor=#34Color] + (\dimexpr #1+\SquareWidth/2, + \dimexpr #2+\SquareWidth/2+\SquareWidth) + {\dimexpr \SquareWidth/2} + \pscircle*[linecolor=#33Color] + (\dimexpr #1+\SquareWidth/2+\SquareWidth, + \dimexpr #2+\SquareWidth/2+\SquareWidth) + {\dimexpr \SquareWidth/2} + \pscircle*[linecolor=#32Color] + (\dimexpr #1+\SquareWidth/2+\SquareWidth*2, + \dimexpr #2+\SquareWidth/2+\SquareWidth) + {\dimexpr \SquareWidth/2} + \pscircle*[linecolor=#35Color] + (\dimexpr #1+\SquareWidth/2, + \dimexpr #2+\SquareWidth/2+\SquareWidth*2) + {\dimexpr \SquareWidth/2} + \pscircle*[linecolor=#34Color] + (\dimexpr #1+\SquareWidth/2+\SquareWidth, + \dimexpr #2+\SquareWidth/2+\SquareWidth*2) + {\dimexpr \SquareWidth/2} + \pscircle*[linecolor=#33Color] + (\dimexpr #1+\SquareWidth/2+\SquareWidth*2, + \dimexpr #2+\SquareWidth/2+\SquareWidth*2) + {\dimexpr \SquareWidth/2} + \ignorespaces +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\smc@roundantidiagonal} +% C'est exactement la même chose que la macro précédente mais +% l'orientation se fait selon la diagonale non principale. +% \begin{macrocode} +\def\smc@roundantidiagonal(#1,#2)#3{% + \pscircle*[linecolor=#31Color] + (\dimexpr #1+\SquareWidth/2, + \dimexpr #2+\SquareWidth/2) + {\dimexpr \SquareWidth/2} + \pscircle*[linecolor=#32Color] + (\dimexpr #1+\SquareWidth/2+\SquareWidth, + \dimexpr #2+\SquareWidth/2) + {\dimexpr \SquareWidth/2} + \pscircle*[linecolor=#33Color] + (\dimexpr #1+\SquareWidth/2+\SquareWidth*2, + \dimexpr #2+\SquareWidth/2) + {\dimexpr \SquareWidth/2} + \pscircle*[linecolor=#32Color] + (\dimexpr #1+\SquareWidth/2, + \dimexpr #2+\SquareWidth/2+\SquareWidth) + {\dimexpr \SquareWidth/2} + \pscircle*[linecolor=#33Color] + (\dimexpr #1+\SquareWidth/2+\SquareWidth, + \dimexpr #2+\SquareWidth/2+\SquareWidth) + {\dimexpr \SquareWidth/2} + \pscircle*[linecolor=#34Color] + (\dimexpr #1+\SquareWidth/2+\SquareWidth*2, + \dimexpr #2+\SquareWidth/2+\SquareWidth) + {\dimexpr \SquareWidth/2} + \pscircle*[linecolor=#33Color] + (\dimexpr #1+\SquareWidth/2, + \dimexpr #2+\SquareWidth/2+\SquareWidth*2) + {\dimexpr \SquareWidth/2} + \pscircle*[linecolor=#34Color] + (\dimexpr #1+\SquareWidth/2+\SquareWidth, + \dimexpr #2+\SquareWidth/2+\SquareWidth*2) + {\dimexpr \SquareWidth/2} + \pscircle*[linecolor=#35Color] + (\dimexpr #1+\SquareWidth/2+\SquareWidth*2, + \dimexpr #2+\SquareWidth/2+\SquareWidth*2) + {\dimexpr \SquareWidth/2} + \ignorespaces +} +% \end{macrocode} +% \end{macro} +% \section{Commandes de sectionnement} +% \subsection{Thème} +% \begin{macro}{\thema} +% Les macros |\thema| permet de spécifier le thème en cours. Pour +% l'instant, la classe n'en prévoit que quatre : +% \begin{itemize} +% \item fonction ; +% \item géométrie ; +% \item statistiques probabilité ; +% \item libre (pour les pages sans thème) +% \end{itemize} +% La macro mémorise le titre du thème, son abréviation et un certain +% nombre de couleurs spécifiques. +% \begin{macrocode} +\newcommand*\themaF{% + \cleardoubleoddpage + \def\smc@thema{fonctions}% + \def\smc@themacap{FONCTIONS}% + \def\smc@thema@init{f}% + \def\smc@thema@initcap{F}% + \smc@themaFColor +% \end{macrocode} +% À chaque début de thème, on remet le compteur de chapitre à zéro. +% \begin{macrocode} + \setcounter{chapter}{0}% +} +% \end{macrocode} +% Pour les couleurs, comme on en a besoin à plusieurs endroits, on les +% définis séparément. +% \begin{macrocode} +\newcommand*\smc@themaFColor{% + \def\CorrigeChapterFrameColor{PartieFonction}% + \def\CorrigeChapterTextColor{Blanc}% + \colorlet{ChapterNumFrameColor}{PartieFonction}% + \colorlet{FootTitleHeadColor}{PartieFonction}% + \colorlet{ChapterTopFrameColor}{A3}% + \colorlet{ChapterNumSquare4Color}{A3}% + \colorlet{ChapterNumSquare5Color}{PartieFonction}% + \colorlet{FirstChapterFootColor}{FootFonctionColor}% +} +% \end{macrocode} +% Même chose pour la partie Géométrie +% \begin{macrocode} +\newcommand*\themaG{% + \cleardoubleoddpage + \def\smc@thema{g\'eom\'etrie}% + \def\smc@themacap{G\'EOM\'ETRIE}% + \def\smc@thema@init{g}% + \def\smc@thema@initcap{G}% + \smc@themaGColor + \setcounter{chapter}{0}% +} +\newcommand*\smc@themaGColor{% + \def\CorrigeChapterFrameColor{PartieGeometrie}% + \def\CorrigeChapterTextColor{Blanc}% + \colorlet{ChapterNumFrameColor}{PartieGeometrie}% + \colorlet{FootTitleHeadColor}{PartieGeometrie}% + \colorlet{ChapterTopFrameColor}{G3}% + \colorlet{ChapterNumSquare4Color}{G3}% + \colorlet{ChapterNumSquare5Color}{PartieGeometrie}% + \colorlet{FirstChapterFootColor}{FootGeometrieColor}% +} +% \end{macrocode} +% Même chose pour la partie Statistiques et probabilités. +% \begin{macrocode} +\newcommand*\themaS{% + \cleardoubleoddpage + \def\smc@thema{statistiques\\probabilit\'es}% + \def\smc@themacap{STATISTIQUES\\PROBABILIT\'ES}% + \def\smc@thema@init{sp}% + \def\smc@thema@initcap{SP}% + \smc@themaSColor + \setcounter{chapter}{0}% +} +\newcommand*\smc@themaSColor{% + \def\CorrigeChapterFrameColor{PartieStatistique}% + \def\CorrigeChapterTextColor{Blanc}% + \colorlet{ChapterNumFrameColor}{PartieStatistique}% + \colorlet{FootTitleHeadColor}{PartieStatistique}% + \colorlet{ChapterTopFrameColor}{U2}% + \colorlet{ChapterNumSquare4Color}{U2}% + \colorlet{ChapterNumSquare5Color}{PartieStatistique}% + \colorlet{FirstChapterFootColor}{FootStatistiqueColor}% +} +% \end{macrocode} +% Même chose pour la partie libre. Il n'y a pas de saut de page pour +% ce thème. +% \begin{macrocode} +\newcommand*\themaL{% + \def\smc@thema{}% + \def\smc@themacap{}% + \def\smc@thema@init{l}% + \def\smc@thema@initcap{L}% + \smc@themaLColor + \setcounter{chapter}{0}% +} +\newcommand*\smc@themaLColor{% + \def\CorrigeChapterFrameColor{Blanc}% + \def\CorrigeChapterTextColor{Blanc}% + \colorlet{ChapterNumFrameColor}{Blanc}% + \colorlet{FootTitleHeadColor}{Blanc}% + \colorlet{ChapterTopFrameColor}{Blanc}% + \colorlet{ChapterNumSquare4Color}{Blanc}% + \colorlet{ChapterNumSquare5Color}{Blanc}% + \colorlet{FirstChapterFootColor}{Blanc}% +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\NewThema} +% La classe va proposer également la commande |\NewThema| pour pouvoir +% définir d'autres thèmes que les quatre initiaux de la maquette. Cette +% commande demande 7 arguments qui sont (dans l'ordre) : +% \begin{itemize} +% \item la lettre ou les lettres après |\thema| (normalement en +% capitale) ; +% \item la lettre ou les lettres correspondantes en minuscule ; +% \item le titre du thème en minuscule ; +% \item le titre du thème avec initiale en capitale ; +% \item le titre du thème entèrement en capitale ; +% \item la couleur du cadre pour le rectangle vertical de chapitre ; +% \item la couleur de l'avant-dernier carré en bas à gauche du +% rectangle vertical de chapitre. +% \end{itemize} +% \begin{macrocode} +\newcommand*\NewThema[7]{% +% \end{macrocode} +% Il est interdit de redéfinir un thème +% \begin{macrocode} + \ifcsname thema#1\endcsname + \ClassError{sesamanuel} + {le theme \string\thema#1 existe deja} + {Vous ne pouvez pas creer un theme deja existant.}% + \else +% \end{macrocode} +% Déclaration du booléen pour la présence de méthodes dans ce thème. +% \begin{macrocode} + \protected@write\@auxout{} + {% + \protect\expandafter + \protect\newif \protect\csname ifsmc@lom#2\protect\endcsname + }% + \expandafter \newif \csname ifsmc@lom#2\endcsname +% \end{macrocode} +% Déclaration des couleurs pour la liste des méthodes. +% \begin{macrocode} + \@namedef{smc@thema#1Color}{% + \def\CorrigeChapterFrameColor{#6}% + \def\CorrigeChapterTextColor{Blanc}% + \colorlet{ChapterNumFrameColor}{#6}% + \colorlet{FootTitleHeadColor}{#6}% + \colorlet{ChapterTopFrameColor}{#7}% + \colorlet{ChapterNumSquare4Color}{#7}% + \colorlet{ChapterNumSquare5Color}{#6}% + \colorlet{FirstChapterFootColor}{#7}% + }% +% \end{macrocode} +% Définition du thème proprement dit avec sa commande d'appel. +% \begin{macrocode} + \expandafter\def\csname thema#1\endcsname{% + \cleardoubleoddpage + \def\smc@thema{#3}% + \edef\smc@themacap{#5}% + \def\smc@thema@init{#2}% + \def\smc@thema@initcap{#1}% + \def\CorrigeChapterFrameColor{#6}% + \expandafter\def\csname StringListeMethode#1\endcsname{#4}% + \def\CorrigeChapterTextColor{Blanc}% + \colorlet{ChapterNumFrameColor}{#6}% + \colorlet{FootTitleHeadColor}{#6}% + \colorlet{ChapterTopFrameColor}{#7}% + \colorlet{ChapterNumSquare4Color}{#7}% + \colorlet{ChapterNumSquare5Color}{#6}% + \colorlet{FirstChapterFootColor}{#7}% + }% + \fi +} +% \end{macrocode} +% \end{macro} +% \subsection{Composants d'un chapitre} +% \begin{macro}{\smc@fixwidth} +% On va avoir besoin d'une macro composant son contenu dans une +% largeur déterminée et qui accepte les coupures de lignes avec +% |\\|. Le premier argument est la largeur imposée, la seconde est le +% texte. +% \begin{macrocode} +\newcommand\smc@fixwidth[2]{% + \smc@dima=0pt + \expandafter\smc@@width#2\\\@nil\\% + \setbox0=\hbox{% + \minipage[b]{\smc@dima} + #2% + \endminipage + }% + \smc@dima=\dimexpr\ht0+\dp0\relax + \psscaleboxto(#1,\the\smc@dima){% + \unhbox0 + }% + \ignorespaces +} +\def\smc@@width#1\\{% + \def\smc@arg{#1}% + \unless\ifx\smc@arg\@nnil + \setbox0=\hbox{#1}% + \ifdim\wd0>\smc@dima + \smc@dima=\wd0\relax + \fi + \expandafter\smc@@width + \fi +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\smc@fixwidthcenter} +% Même chose que précédemment mais le contenu est centré. +% \begin{macrocode} +\newcommand\smc@fixwidthcenter[2]{% + \smc@dima=0pt + \expandafter\smc@@width#2\\\@nil\\% + \setbox0=\hbox{% + \minipage[b]{\smc@dima} + \centering + #2% + \endminipage + }% + \smc@dima=\dimexpr\ht0+\dp0\relax + \psscaleboxto(#1,\the\smc@dima){% + \unhbox0 + }% + \ignorespaces +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\@makechapterhead} +% La commande de chapitre est à reprendre entièrement en ce qui +% concerne la mise en page. On gardera tout le mécanisme de la +% commande |\chapter| même si tout ne servira pas vraiment et c'est la +% commande |\@makechapterhead| qui va être redéfinie. +% \begin{macrocode} +\renewcommand*\@makechapterhead[1]{% +% \end{macrocode} +% Avant de commencer, on mémorise le titre dans une variable qui +% servira dans les pieds de page. On écrit également le titre du +% chapitre dans le fichier de correction. +% \begin{macrocode} + \def\smc@chaptertitle{#1}% + \addtocontents{cor}{% + \protect\smc@corrigechapter{% + \StringChapitre{} + \smc@thema@initcap\the\c@chapter} + {\smc@chaptertitle}% + {\CorrigeChapterFrameColor}% + {\CorrigeChapterTextColor}% + }% + \begin{pspicture}(0,0)(\linewidth,\ChapterBottomPicture) + \psset{linewidth=0pt,linestyle=none,fillstyle=solid} +% \end{macrocode} +% Cadre haut. +% \begin{macrocode} + \psframe[fillcolor=ChapterTopFrameColor] + (\dimexpr-\smc@bleed-\smc@marginleft,\ChapterBottomFrameHeight) + (\dimexpr\linewidth+\smc@marginright+\smc@bleed, + \ChapterTotalFrameHeight) +% \end{macrocode} +% Cadre bas. +% \begin{macrocode} + \psframe[fillcolor=ChapterBottomFrameColor] + (\dimexpr-\smc@bleed-\smc@marginleft,0) + (\dimexpr\linewidth+\smc@marginright+\smc@bleed, + \ChapterBottomFrameHeight) +% \end{macrocode} +% Cadre vert de fond du numéro de chapitre. +% \begin{macrocode} + \psframe[fillcolor=ChapterNumBkgColor] + (\ChapterNumLeftFrame,0) + (\linewidth,\ChapterTotalFrameHeight) +% \end{macrocode} +% Cadre de fond du numéro de chapitre. +% \begin{macrocode} + \psframe[fillcolor=ChapterNumFrameColor] + (\ChapterNumLeftFrame,\ChapterNumBottomFrame) + (\linewidth,\ChapterNumTopFrame) +% \end{macrocode} +% Carrés dégradés. +% \begin{macrocode} + \smc@antidiagonal(\ChapterNumLeftFrame,\ChapterNumBottomFrame) + {ChapterNumSquare} +% \end{macrocode} +% thème et numéro de chapitre. +% \begin{macrocode} + \rput[B](\dimexpr \linewidth/2+\ChapterNumLeftFrame/2, + \ChapterBottomFrameHeight) + {\textcolor{ThemaTitleColor} + {% + \ChapAppFont + \smc@fixwidthcenter{\ChapterTitleThemaWidth} + {\smc@themacap}% + }% + } + \rput[B](\dimexpr \linewidth/2+\ChapterNumLeftFrame/2, + \ChapterNumBase) + {\textcolor{ChapterNumColor} + {\ChapterNumFont \thechapter}} +% \end{macrocode} +% Titre du chapitre. +% \begin{macrocode} + \rput[Bl](0,\ChapterTitleBase){% + \begin{minipage}[b]{\dimexpr\ChapterNumLeftFrame-\ChapterTitleSep} + \ChapterTitleFont \color{ChapterTitleColor}#1% + \end{minipage} + } + \end{pspicture} +% \end{macrocode} +% Le style de page est défini dans la macro |\chapter| comme étant le +% style \texttt{plain}. On aurait pu redéfinir |\chapter| pour +% modifier ce point mais autant ne pas surcharger la classe et +% redéfinir le style de page en fin de macro d'affichage. +% \begin{macrocode} + \thispagestyle{firstchapter} +} +% \end{macrocode} +% \end{macro} +% \begin{environment}{prerecquis} +% Cet environnement liste les connaissances antérieures nécessaires au +% chapitre en cours. +% +% Pour un livre de seconde, ce sera les \og Connaissances du collège +% nécessaires à ce chapitre \fg{} mais ce titre étant susceptible de +% varier, on le passe en paramètre à l'environnement. Pour faciliter +% la vie de l'utilisateur, on le fournit sous forme d'un argument +% optionnel, la valeur par défaut étant contenu dans la macro +% |\StringPrerequis|. Pour commencer, cette macro est +% initialisée avec le titre pour les secondes mais on pourra prévoir +% un mécanisme plus général où il suffira d'indiquer le niveau du +% livre en début de compilation. +% +% L'environnement |prerequis| compose son contenu en sans empattement, +% dans un cadre bleu en deux colonnes. +% \begin{macrocode} +\newenvironment{prerequis}[1][\StringPrerequis] +{% +% \end{macrocode} +% Si la première page de chapitre doit être calibrée pour faire +% effectivement une seule page, alors, pour l'instant, je place un +% ressort vertical infini entre chaque élément de la page. +% \begin{macrocode} + \par\vspace*{\stretch{1}} +% \end{macrocode} +% Redéfinition locale des listes et autres. +% \begin{macrocode} + \let\itemize\smc@prerequisitemize + \let\enditemize\endsmc@prerequisitemize + \let\colitemize\smc@prerequiscolitemize + \let\endcolitemize\endsmc@prerequiscolitemize + \let\enumerate\smc@prerequisenumerate + \let\endenumerate\endsmc@prerequisenumerate + \let\colenumerate\smc@prerequiscolenumerate + \let\endcolenumerate\endsmc@prerequiscolenumerate + \let\partie\smc@nopartie + \let\exercice\smc@noexercice + \let\endexercice\endsmc@noexercice + \let\corrige\smc@nocorrige + \let\endcorrige\endsmc@nocorrige + \def\smc@currpart{Prerequis}% +% \end{macrocode} +% Titre du prérequis. +% \begin{macrocode} + {% + \PrerequisTitleFont + \textcolor{PrerequisTitleColor}{#1}% + \par\vspace{\PrerequisTitleVSpace}% + }% +% \end{macrocode} +% Avant d'appeler l'environnement de cadre, on explicite l'espace vide +% entre le bord du cadre et le texte. +% \begin{macrocode} + \edef\FrameSep{\SquareWidth}% + \smc@cadre{PrerequisBkgColor} +% \end{macrocode} +% L'environnement \environ{multicols} ajoute un espace vertical +% au-dessus. Ce n'est pas lié à la longueur |\multicolsep| qui n'a +% visiblement pas d'action à l'intérieur d'un environnement +% \environ{minipage}. Pour équilibrer la présentation il faut placer +% un saut négatif ad hoc. +% \begin{macrocode} + \vspace*{-4.5pt} + \begin{multicols}{2} + \PrerequisTextFont +} +{% + \end{multicols}% + \endsmc@cadre + \par +} +% \end{macrocode} +% \end{environment} +% \begin{environment}{autoeval} +% L'environnement \environ{autoeval} gère la partie \og +% Auto-évaluation \fg{} de la première page de chapitre. Celle-ci se +% compose d'un cartouche avec le titre (immuable ?) \og +% Auto-évaluation \fg{} puis d'un cadre avec l'énoncé des exercices +% comprenant (en bas à droite ?) un cartouche indiquant la page de +% correction. +% +% L'environnement \environ{autoeval} ne demande aucun paramètre. +% \begin{macrocode} +\newenvironment{autoeval} +{% +% \end{macrocode} +% On commence par placer une balise dans le fichier de correction +% \begin{macrocode} + \addtocontents{cor}{\protect\smc@corrigeautoeval}% +% \end{macrocode} +% Comme pour l'environnement précédent, on équilibre les blancs +% verticaux de la page. +% \begin{macrocode} + \par\vspace{\stretch{1}} +% \end{macrocode} +% Le cartouche de titre peut être affiché avant de connaître le +% contenu de l'environnement. On le fait donc dans la partie +% initiale. Pour obtenir une hauteur de exactement 3 diamètres de +% disque et une largeur de |\AETitleWidth|, on va tricher en demandant +% une séparation nulle avec le texte et une construction de texte +% ayant exactement les dimensions voulues. On va également tricher sur +% la largeur d'empagement puisque l'environnement |cadre| est +% normalement prévu pour des cadres occupant tout cet empagement. +% \begin{macrocode} + \begingroup + \linewidth=\AETitleWidth + \def\FrameSep{0pt}% + \edef\FrameArc{\the\dimexpr \SquareWidth/2}% + \def\FrameLineWidth{0pt}% + \begin{smc@cadre}[0,0,10,10]{AETitleFrame1Color}% + \minipage[b][\AETitleHeight]{\AETitleWidth}% + \begin{pspicture}(0,0)(\dimexpr\SquareWidth*3,\dimexpr\SquareWidth*2) + \smc@rounddiagonal(0mm,0mm){AETitleFrame}% + \end{pspicture}% + \hspace*{\stretch{1}}% + \AETitleFont + \raisebox{\dimexpr\SquareWidth*3/4}{\textcolor{AETitleColor}{\StringAE}}% + \hspace*{\stretch{1}}% + \endminipage + \end{smc@cadre} + \endgroup +% \end{macrocode} +% On affiche ensuite le texte de référence au site manuel.sesamath.net +% \begin{macrocode} + \hspace*{\stretch{1}}% + \begin{minipage}[b]{\AEManuelWidth} + \raggedright + \AEManuelFont + \StringManuel + \par\vspace*{\AfterAEManuelVSpace} + \end{minipage}% +% \end{macrocode} +% On affiche enfin le logo. +% \begin{macrocode} + \hspace{\AEManuelRightSpace}% + \raisebox{\AfterAEManuelVSpace} + {\psscaleboxto(\AELogoManuelWidth,0){\LogoManuel}}% + \\[-1pt] +% \end{macrocode} +% On redéfinit les listes et la macro d'exercice. +% \begin{macrocode} + \let\itemize\smc@AEitemize + \let\enditemize\endsmc@AEitemize + \let\colitemize\smc@AEcolitemize + \let\endcolitemize\endsmc@AEcolitemize + \let\enumerate\smc@AEenumerate + \let\endenumerate\endsmc@AEenumerate + \let\colenumerate\smc@AEcolenumerate + \let\endcolenumerate\endsmc@AEcolenumerate + \let\partie\smc@nopartie + \let\exercice\smc@AEexercice + \let\endexercice\endsmc@AEexercice + \let\corrige\smc@AEcorrige + \let\endcorrige\endsmc@AEcorrige + \def\smc@currpart{AE}% +% \end{macrocode} +% On peut alors mémoriser l'intérieur de l'environnement. On utilise +% une minipage de la largeur d'empagement moins |\AEFrameHSep*2| +% \begin{macrocode} + \begin{lrbox}{\smc@boxa} + \minipage[b]{\dimexpr\linewidth-\AEFrameHSep*2}% + \ignorespaces +} +{% +% \end{macrocode} +% En fin d'environnement, on ferme la minipage et la lrbox. Avant +% cela, on ajoute un espace vertical pour placer le cartouche de la +% correction. +% \begin{macrocode} + \par + \vspace*{\dimexpr\AECartoucheCorrSep+\AECartoucheCorrHeight-\SquareWidth} + \hspace*{\stretch{1}}% + \endminipage + \end{lrbox}% +% \end{macrocode} +% On va alors afficher la boîte dans un cadre. +% \begin{macrocode} + \psframebox[framesep=\the\dimexpr\AEFrameHSep-\AEFrameRuleWidth, + linewidth=\AEFrameRuleWidth, linecolor=AEFrameColor]{\box\smc@boxa}% +% \end{macrocode} +% Le point de référence est alors positionné sur le coin inférieur +% droit du cadre. On va placer le cartouche en revenant en arrière. On +% va également tricher sur la hauteur pour que le cartouche se place à +% l'intérieur du cadre. +% \begin{macrocode} + \hspace*{-\AECartoucheCorrWidth}% + \raisebox{-\SquareWidth}{% + \begin{pspicture}(0,0)(\AECartoucheCorrWidth,0) + \psframe*[linecolor=AECartoucheCorrBkgColor, + cornersize=absolute, linearc=\dimexpr\SquareWidth/2] + (0,0)(\AECartoucheCorrWidth,\AECartoucheCorrHeight) + \psframe*[linecolor=AECartoucheCorrBkgColor] + (0,0)(\AECartoucheCorrWidth,3mm) + \psframe*[linecolor=AECartoucheCorrBkgColor] + (3mm,0)(\AECartoucheCorrWidth,\AECartoucheCorrHeight) + \rput(\dimexpr\AECartoucheCorrWidth/2,\dimexpr\AECartoucheCorrHeight/2) + {% +% \end{macrocode} +% Affichage du texte du cartouche de correction. +% \begin{macrocode} + \AECartoucheCorrArrowFont + \textcolor{AECartoucheCorrArrowColor} + {\ding{228}\ding{228}\ding{228}} + \AECartoucheCorrVCPFont + \textcolor{AECartoucheCorrVCPColor} + {\StringVoirCorriges\space\pageref{toutes-solutions}}% + }% + \end{pspicture}% + }% +} +% \end{macrocode} +% On définit maintenant l'environnement exercice pour +% l'auto-évaluation. +% \begin{macrocode} +\newcounter{AEexo}[chapter] +\newenvironment{smc@AEexercice}{% + \par + \refstepcounter{AEexo}% +% \end{macrocode} +% On place un cadre avec le numéro d'exercice dedans. Et c'est tout ! +% \begin{macrocode} + \psframebox*[linestyle=none, linewidth=0pt, + fillcolor=AEExoNumFrameColor, framesep=\AEExoFrameTopSep]{% + \hbox to\dimexpr\AEExoFrameWidth-\AEExoFrameTopSep*2{% + \hss + \AEExoNumFont + \textcolor{AEExoNumColor}{\theAEexo}% + \hss + }% + }% + \hspace{\AfterAEExoFrameHSpace}% + \ignorespaces +} +% \end{macrocode} +% Pour l'instant, il n'y a rien à faire de spécial pour le code +% final. Uniquement un saut de paragraphe. +% \begin{macrocode} +{\par} +% \end{macrocode} +% \end{environment} +% \subsection{Activités} +% \begin{macro}{\activites} +% Cette macro introduit la partie \og Activités d'approche \fg{} dans +% un chapitre. Elle interdit l'utilisation des listes et des macros +% |\exercice|, |\correction| et |\partie| en dehors des environnements. +% \begin{macrocode} +\newcommand*\activites{% + \clearpage + \pagestyle{activites} + \addtocontents{cor}{\protect\smc@corrigeactivite}% + \let\itemize\smc@noitemize + \let\enditemize\endsmc@noitemize + \let\colitemize\smc@nocolitemize + \let\endcolitemize\endsmc@nocolitemize + \let\enumerate\smc@noenumerate + \let\endenumerate\endsmc@noenumerate + \let\colenumerate\smc@nocolenumerate + \let\endcolenumerate\endsmc@nocolenumerate + \let\exercice\smc@noexercice + \let\correction\smc@nocorrection + \let\partie\smc@activite@partie + \let\exercice\smc@noexercice + \let\endexercice\endsmc@noexercice + \let\corrige\smc@activitecorrige + \let\endcorrige\endsmc@activitecorrige + \def\smc@currpart{Activite}% +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\DeclareActivityLike} +% Les environnements d'activités d'approche propose au moins deux +% types d'activités qui partagent le même aspect général. On les +% déclare avec la macro |\DeclareActivityLike|. Celle-ci demande +% quatre arguments : +% \begin{enumerate} +% \item le nom de l'environnement ; +% \item le titre affiché ; +% \item la couleur de la partie supérieure du cartouche ; +% \item la couleur de la partie inférieure du cartouche ; +% \item la couleur du titre et du losange de numéro. +% \end{enumerate} +% \begin{macrocode} +\newcounter{activite}[chapter] +\newcounter{partie}[activite] +\newcommand*\DeclareActivityLike[5]{% +% \end{macrocode} +% Les environnements ont un argument optionnel pour le titre et un +% deuxième pour le logo. On est donc obligé de les définir avec des +% macros au lieu d'environnements. +% \begin{macrocode} + \expandafter\newcommand\csname#1\endcsname[1][]{% +% \end{macrocode} +% On sauvegarde le titre et on appelle la macro auxiliaire pour le +% deuxième paramètre optionnel. +% \begin{macrocode} + \def\smc@activite@title{##1}% + \csname#1@aux\endcsname + }% + \expandafter\newcommand\csname#1@aux\endcsname[1][]{% +% \end{macrocode} +% L'environnement commence par placer un espacement vertical avant de +% composer son titre et son sous-titre. +% \begin{macrocode} + \par + \addvspace{\BeforeActiviteVSpace} + \refstepcounter{activite} +% \end{macrocode} +% On commence avec le titre. Pour pouvoir le composer correctement, il +% va d'abord falloir le mettre dans une boîte. +% \begin{macrocode} + \setbox\smc@boxa=\hbox{% + \ActiviteTitleFont + #2% + }% +% \end{macrocode} +% On peut maintenant composer réellement le titre en tenant commpte de +% la longueur |\wd\smc@boxa|. On réalise le cartouche en faisant +% croire que la frontière entre le cadre du bas et celui du haut est +% la ligne de base. Le calcul de la largeur compte également la +% diagonale d'un carré de côté |\ActiviteTitleTopHeight|, c'est-à-dire +% cette longueur multipliée par $\sqrt{2}\approx1.4142$. +% \begin{macrocode} + \begin{pspicture}(0,0) + (\dimexpr \ActiviteTitleLeftSpace+\wd\smc@boxa+\ActiviteTitleRightSpace+1.4142\ActiviteTitleTopHeight,\ActiviteTitleTopHeight) +% \end{macrocode} +% On commence par afficher les deux parties du fond. La largeur est ce +% qui a été calculé pour l'image complète sauf qu'on ne prend qu'une +% demi-diagonale au lieu d'une diagonale entière. +% \begin{macrocode} + \psframe*[linewidth=0, linecolor= #3] + (0,0)(\dimexpr\ActiviteTitleLeftSpace+\wd\smc@boxa+\ActiviteTitleRightSpace+0.7071\ActiviteTitleTopHeight, + \ActiviteTitleTopHeight) +% \end{macrocode} +% Même chose pour la partie du bas en sachant qu'elle déborde de la +% boîte englobante. +% \begin{macrocode} + \psframe*[linewidth=0, linecolor= #4] + (0,0)(\dimexpr\ActiviteTitleLeftSpace+\wd\smc@boxa+\ActiviteTitleRightSpace+0.7071\ActiviteTitleTopHeight, + -\ActiviteTitleBottomHeight) +% \end{macrocode} +% On peut maintenant placer le titre. +% \begin{macrocode} + \rput[l](\ActiviteTitleLeftSpace, + 0.5\dimexpr\ActiviteTitleTopHeight-\ActiviteTitleBottomHeight){% + \ActiviteTitleFont + \textcolor{#5}{#2}% + } +% \end{macrocode} +% Il reste à placer la carré avec le numéro d'activité. Le carré est +% placé verticalement au centre du cartouche. On place également le +% numéro de l'activité. +% \begin{macrocode} + \rput + (\dimexpr\ActiviteTitleLeftSpace+\wd\smc@boxa+\ActiviteTitleRightSpace, + 0.5\dimexpr\ActiviteTitleTopHeight-\ActiviteTitleBottomHeight) + {% + \pspolygon*[linewidth=0, linecolor=#5] + (0,0) + (0.7071\ActiviteTitleTopHeight,0.7071\ActiviteTitleTopHeight) + (1.4142\ActiviteTitleTopHeight,0) + (0.7071\ActiviteTitleTopHeight,-0.7071\ActiviteTitleTopHeight) + \rput(0.7071\ActiviteTitleTopHeight,0){% + \ActiviteNumFont + \textcolor{ActiviteNumColor}{\theactivite}% + } + } + \end{pspicture}% +% \end{macrocode} +% Le cartouche est totalement réalisé. On va maintenant afficher le +% sous-titre. Ce n'est pas la peine de tester si il est vide : on ne +% modifie rien s'il y a ou non un sous titre. +% \begin{macrocode} + \hspace*{\AfterActiviteTitleHSpace}% +% \end{macrocode} +% Pour permettre un titre sur plusieurs lignes, on place le sous-titre +% dans une minipage dont la largeur doit être égale au reste de +% l'empagement qui existe à ce moment précis, c'est-à-dire la largeur +% du cartouche plus l'espace qu'on vient de placer auquel il faut +% soustraire l'espace du à un éventuel logo. C'est pour cela qu'on +% commence par tester la présence d'un tel élément. +% \begin{macrocode} + \@ifmtarg{##1} + {\setbox0=\hbox{}} + {\setbox0=\hbox{##1\ }}% + \minipage[t]{\dimexpr\linewidth-\ActiviteTitleLeftSpace-\wd\smc@boxa-\ActiviteTitleRightSpace-1.4142\ActiviteTitleTopHeight-\AfterActiviteTitleHSpace-\wd0} + \ActiviteSubtitleFont + \textcolor{ActiviteSubtitleColor}{\smc@activite@title}% + \endminipage + \@ifnotmtarg{##1}{\hfill##1}% + \par\vspace{\AfterActiviteTitleVSpace} +% \end{macrocode} +% On règle les listes pour les activités. +% \begin{macrocode} + \let\itemize\smc@activiteitemize + \let\enditemize\endsmc@activiteitemize + \let\colitemize\smc@activitecolitemize + \let\endcolitemize\endsmc@activitecolitemize + \let\enumerate\smc@activiteenumerate + \let\endenumerate\endsmc@activiteenumerate + \let\colenumerate\smc@activitecolenumerate + \let\endcolenumerate\endsmc@activitecolenumerate + \let\partie\smc@activite@partie + \let\exercice\smc@noexercice + \let\endexercice\endsmc@noexercice + \let\corrige\smc@nocorrige + \let\endcorrige\endsmc@nocorrige + \def\smc@currpart{Activite}% +% \end{macrocode} +% On peut maintenant composer le contenu de l'environnement. Celui-ci +% sera placé dans un empagement réduit. +% \begin{macrocode} + \begin{changemargin}{\dimexpr\SquareWidth*4}{\ExtraMarginRight} + }% +% \end{macrocode} +% Le code terminal est défini par la macro |\end|. +% Attention, comme le nom commence par |\end|, on ne peut pas utiliser +% |\newcommand|. +% \begin{macrocode} + \expandafter\def\csname end#1\endcsname{% + \end{changemargin} + }% +} +% \end{macrocode} +% \end{macro} +% \begin{environment}{debat} +% On va maintenant utiliser la macro |\DeclareActivityLike| pour créer +% l'environnement |debat|. Il y a juste à préciser le nom de +% l'environnement, le titre, la couleur du haut du cartouche et la +% couleur du bas du cartouche. +% \begin{macrocode} +\DeclareActivityLike{debat}{\StringDEBAT} + {ActiviteDebatTopColor} + {ActiviteDebatBottomColor} + {ActiviteTitleColor} +% \end{macrocode} +% \end{environment} +% \begin{environment}{activite} +% On procède de la même façon pour l'environnement |activite|. +% \begin{macrocode} +\DeclareActivityLike{activite}{\StringACTIVITE} + {ActiviteActiviteTopColor} + {ActiviteActiviteBottomColor} + {ActiviteTitleColor} +% \end{macrocode} +% \end{environment} +% \subsection{Cours} +% \begin{macro}{\cours} +% Cette macro introduit la partie \og Cours - Méthodes \fg{} dans un +% chapitre. Elle interdit l'utilisation des listes et des macros +% |\exercice|, |\correction| et |\partie| en dehors des environnements. +% \begin{macrocode} +\newcommand*\cours{% + \clearpage + \pagestyle{cours} + \let\itemize\smc@noitemize + \let\enditemize\endsmc@noitemize + \let\colitemize\smc@nocolitemize + \let\endcolitemize\endsmc@nocolitemize + \let\enumerate\smc@noenumerate + \let\endenumerate\endsmc@noenumerate + \let\colenumerate\smc@nocolenumerate + \let\endcolenumerate\endsmc@nocolenumerate + \let\exercice\smc@noexercice + \let\endexercice\endsmc@noexercice + \let\corrige\smc@nocorrige + \let\endcorrige\endsmc@nocorrige + \let\correction\smc@nocorrection + \let\partie\smc@nopartie + \def\smc@currpart{Cours}% +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\section} +% Les macros de sectionnement vont garder leur nom habituel. On +% gardera également la syntaxe avec l'argument optionnel et l'étoile +% mais cette dernière ne servira strictement à rien ! Le numéro de +% section ne fait pas référence au numéro de chapitre. +% \begin{macrocode} +\renewcommand\thesection{\arabic{section}} +\renewcommand*\section{\@ifstar{\smc@sec}{\smc@sec}} +\newcommand*\smc@sec[2][]{% +% \end{macrocode} +% On commence par regarder si l'argument optionnel est vide. Si oui, +% le titre court sera égal au titre long. +% \begin{macrocode} + \ifx\relax#1\relax + \smc@@sec{#2}{#2}% + \else + \smc@@sec{#1}{#2}% + \fi +} +% \end{macrocode} +% À ce stade, on a un titre court en premier argument et un titre long +% en deuxième argument. Le travail effectif peut commencer. +% \begin{macrocode} +\newcommand*\smc@@sec[2]{% + \par\goodbreak\addvspace{\BeforeSectionVSpace}% + \refstepcounter{section}% +% \end{macrocode} +% Le titre court sera éventuellement utilisé pour une TDM. Ce sera à +% voir plus tard. +% \begin{macrocode} + \relax +% \end{macrocode} +% On compose ensuite le numéro et le titre de la section. On commence +% avec le numéro composé dans un environnement |pspicture| avec un +% décalage vers la bas pour aligner les lignes de base du numéro avec +% celui de la première ligne du titre. +% +% L'ensemble du titre est placé dans une boîte pour pouvoir régler sa +% hauteur ultérieurement : la boîte crée est trop haute sur la ligne +% de base. +% \begin{macrocode} + \setbox\smc@boxa=\hbox{% + \begin{pspicture}[shift=-\SquareWidth] + (0,0)(\dimexpr\SquareWidth*3,\dimexpr\SquareWidth*3) + \psframe*[linecolor=SectionFrame1Color,linewidth=0pt] + (0,0)(\dimexpr\SquareWidth*3,\dimexpr\SquareWidth*3) + \psframe*[linecolor=SectionFrame2Color,linewidth=0pt] + (0,0)(\SquareWidth,\dimexpr\SquareWidth*3) + \psframe*[linecolor=SectionFrame2Color,linewidth=0pt] + (0,0)(\dimexpr\SquareWidth*3,\SquareWidth) + \psframe*[linecolor=SectionFrame3Color,linewidth=0pt] + (0,0)(\SquareWidth,\SquareWidth) + \rput[Br](\dimexpr\SquareWidth*3,\SquareWidth){% + \SectionNumFont + \textcolor{SectionNumColor}{\thesection}% +% \end{macrocode} +% Pour le point, on passe à la fonte de titre ou on garde la fonte du +% numéro (en fonction du choix de fontes) pour avoir un point carré +% comme ceux présents sur les \og i \fg{}. Il y a également une +% correction horizontale pour que le point soit exactement sur la +% frontière droite du cadre. Cette correction est sensible aux fontes +% utilisées. +% \begin{macrocode} + \SectionNumFont + \textcolor{SectionNumColor}{.}% + \hspace*{\SectionCorrectionChassePoint}% + } + \end{pspicture}% +% \end{macrocode} +% On affiche le titre après un certain décalage horizontal. Le titre +% sera placé dans une minipage alilgné en haut pour que ce soit la +% première ligne du titre qui soit alignée avec le numéro. +% \begin{macrocode} + \hspace{\SectionNumTitleHSpace}% + \begin{minipage}[t]{\dimexpr\linewidth-\SectionNumTitleHSpace-\SquareWidth*3} + \SectionTitleFont + \textcolor{SectionTitleColor}{#2}% + \end{minipage}% + }% +% \end{macrocode} +% Avant d'afficher le contenu de la boîte |\smc@boxa|, on diminue sa +% hauteur afin de l'afficher avec sa ligne de base correctement +% placé. La longueur |\BeforeSectionVSpace| corrigera ce manque. +% \begin{macrocode} + \smc@dima=\dimexpr \ht\smc@boxa-\SquareWidth + \ht\smc@boxa \smc@dima + \leavevmode\box\smc@boxa +% \end{macrocode} +% On termine en plaçant un espacement vertical donné et une +% interdiction de coupe. Il n'y a pas besoin de s'occuper du retrait +% d'alinéa puisqu'il n'y en a pas ! +% \begin{macrocode} + \par\nobreak\addvspace{\AfterSectionVSpace} +} +% \end{macrocode} +% On définit également la commande |\smc@normalsection| pour permettre +% de restaurer les sections \og normales \fg{} avec la commande +% |\RestoreSection|. +% \begin{macrocode} +\let\smc@normalsection\section +\newcommand*\RestoreSection{\let\section\smc@normalsection} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\subsection} +% La syntaxe est la même que pour |\section|. La composition du titre +% est bien plus simple. On gardera quand même la possibilité d'avoir +% un titre sur plusieurs lignes en l'alignant à gauche avec un retrait +% tenant compte de celui de la lettre +% \begin{macrocode} +\renewcommand{\thesubsection}{\Alph{subsection}} +\renewcommand\subsection{\@ifstar{\smc@subsec}{\smc@subsec}} +\newcommand*\smc@subsec[2][]{% + \ifx\relax#1\relax + \smc@@subsec{#2}{#2}% + \else + \smc@@subsec{#1}{#2}% + \fi +} +\newcommand*\smc@@subsec[2]{% +% \end{macrocode} +% On teste si le dernier saut était celui d'une section. Si oui, on +% garde un espace insécable sinon, on réalise un saut avec une +% préférence pour la coupure de page. +% \begin{macrocode} + \ifdim\lastskip=\AfterSectionVSpace + \par\nobreak + \else + \par\goodbreak\addvspace{\BeforeSubsectionVSpace} + \fi + \refstepcounter{subsection}% +% \end{macrocode} +% Le titre court sera éventuellement utilisé pour une TDM. Ce sera à +% voir plus tard. +% \begin{macrocode} + \relax +% \end{macrocode} +% On compose ensuite le numéro et le titre de la section. On commence +% avec le numéro composé dans une boîte pour en connaître la largeur. +% \begin{macrocode} + \setbox\smc@boxa=\hbox{% + \SubsectionNumFont + \textcolor{SubsectionNumColor}{\thesubsection.~}% + }% +% \end{macrocode} +% On affiche alors la boîte (sans la détruire et on compose le titre +% dans une minipage de largeur l'empagement moins la largeur du numéro. +% \begin{macrocode} + \leavevmode\copy\smc@boxa + \begin{minipage}[t]{\dimexpr\linewidth-\wd\smc@boxa} + \SubsectionTitleFont + \textcolor{SubsectionTitleColor}{#2}% + \end{minipage} + \par\nobreak\addvspace{\AfterSubsectionVSpace} +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\subsubsection} +% La classe n'accepte pas les commandes de sectionnement à partir de +% ce niveau ni la commande |\part|. On redéfinit ces commandes pour +% qu'elles déclenchent une erreur de compilation. +% \begin{macrocode} +\newcommand*\smc@error@section[1]{% + \ClassError{sesamanuel}{La commande \string#1 n'existe pas}{Les seules + commandes disponibles sont \string\chapter\space + \string\section\space et \string\subsection.}% +} +\renewcommand\part{% + \@ifstar{\smc@part}{\smc@part}% +} +\newcommand\smc@part[2][]{% + \smc@error@section{\part}% +} +\renewcommand\subsubsection{% + \@ifstar{\smc@subsubsection}{\smc@subsubsection}% +} +\newcommand\smc@subsubsection[2][]{% + \smc@error@section{\subsubsection}% +} +\renewcommand\paragraph{% + \@ifstar{\smc@paragraph}{\smc@paragraph}% +} +\newcommand\smc@paragraph[2][]{% + \smc@error@section{\paragraph}% +} +\renewcommand\subparagraph{% + \@ifstar{\smc@subparagraph}{\smc@subparagraph}% +} +\newcommand\smc@subparagraph[2][]{% + \smc@error@section{\subparagraph}% +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\DeclareDefLike} +% Les cadres de type définition vont partager la même façon de se +% faire composer et la même syntaxe d'appel : +% \begin{center} +% |\begin{def}[sous-titre]| +% \end{center} +% où |sous-titre| est un sous-titre optionnel. +% +% On les déclare avec la macro |\DeclareDefLike| en donnant dans +% l'ordre le nom de l'environnement et le mot à afficher comme titre. +% \begin{macrocode} +\newcommand*\DeclareDefLike[2]{% + \newenvironment{#1}[1][]{% + \par\addvspace{\BeforeDefVSpace} +% \end{macrocode} +% On redéfinit les listes avant de composer quoi que ce soit. +% \begin{macrocode} + \let\itemize\smc@defitemize + \let\enditemize\endsmc@defitemize + \let\colitemize\smc@defcolitemize + \let\endcolitemize\endsmc@defcolitemize + \let\enumerate\smc@defenumerate + \let\endenumerate\endsmc@defenumerate + \let\colenumerate\smc@defcolenumerate + \let\endcolenumerate\endsmc@defcolenumerate + \let\partie\smc@nopartie + \let\exercice\smc@noexercice + \let\endexercice\endsmc@noexercice + \let\corrige\smc@nocorrige + \let\endcorrige\endsmc@nocorrige + \def\smc@currpart{#1}% +% \end{macrocode} +% Le carré est composé avec un retrait de 2|\SquareWidth| pour que son +% côté droit soit aligné avec celui des sections. +% \begin{macrocode} + \hspace*{\dimexpr\SquareWidth*2}% + \textcolor{DefSquareColor}{\rule{\SquareWidth}{\SquareWidth}}% + \space +% \end{macrocode} +% Après le carré, on affiche le titre de l'environnement. Celui qui a +% été passé en deuxième argument de |\DeclareDefLike|. +% \begin{macrocode} +% \end{macrocode} +% S'il y a un argument optionnel, c'est-à-dire un sous-titre, on +% compoosera un caractère deux points à la suite du titre suivi du +% sous titre sinon, le titre sans les deux points. +% \begin{macrocode} + \ifx\relax##1\relax + {% + \DefTitleFont + \textcolor{DefTitleColor}{#2}% + }% + \else + {% + \DefTitleFont + \textcolor{DefTitleColor}{#2 : }% + }% + {% + \DefSubtitleFont + \textcolor{DefSubtitleColor}{##1}% + }% + \fi + \par\nobreak\addvspace{\DefTitleFrameVSep} +% \end{macrocode} +% La ligne de titre est maintenant composée, il reste à composer +% l'intérieur du cadre. Le texte est sauvegardé dans une minipage dont +% la largeur tient compte des retraits gauche +% (3|\SquareWidth|+|\DefFrameHSep|) et droit +% (|\ExtraMarginRight|+|\DefFrameHSep|). Il y a aussi un +% |\ignorespaces| pour supprimer l'espace automatique créé après le +% |\begin{definition}|. +% \begin{macrocode} + \begin{lrbox}{\smc@boxa} + \minipage{\dimexpr\linewidth-\SquareWidth*3-\DefFrameHSep*2-\ExtraMarginRight} + \par\vspace{\DefFrameVSep} + \ignorespaces + } +% \end{macrocode} +% Partie terminale de l'environnement. On commence par placer l'espace +% vertical adéquat puis on ferme la minipage et la boîte. +% \begin{macrocode} + {% + \par\vspace{\DefFrameVSep} + \endminipage + \end{lrbox} +% \end{macrocode} +% Le contenu de l'environnement est sauvegardé dans la boîte +% |\smc@boxa|, il reste à la placer avec les espacements corrects dans +% le cadre coloré. Pour controler les espaces pour chaque côté du +% cadre, on annule les espacements globaux avant d'utiliser la +% commande |\colorbox|. +% \begin{macrocode} + {% + \setlength{\fboxsep}{0pt}% + \hspace*{\dimexpr\SquareWidth*3}% + \colorbox{DefFrameColor}{% + \hspace*{\DefFrameHSep}% + \usebox{\smc@boxa}% + \hspace*{\DefFrameHSep}% + } + }% + \par + } +} +% \end{macrocode} +% \end{macro} +% \begin{environment}{definition} +% On se sert maintenant de la macro |\DeclareDefLike| pour déclarer +% l'environnement de définition. +% \begin{macrocode} +\DeclareDefLike{definition}{\StringDEFINITION} +% \end{macrocode} +% \end{environment} +% \begin{environment}{propriete} +% L'environnement |propriete| suit les mêmes règles que |definition| +% \begin{macrocode} +\DeclareDefLike{propriete}{\StringPROPRIETE} +% \end{macrocode} +% \end{environment} +% \begin{environment}{theoreme} +% L'environnement |theoreme|. +% \begin{macrocode} +\DeclareDefLike{theoreme}{\StringTHEOREME} +% \end{macrocode} +% \end{environment} +% \begin{macro}{\DeclareRemLike} +% La déclaration des environnements de type remarque se fait comme +% pour les environnements de type définition. C'est le contenu de +% l'environnement qui n'est pas du tout le même. +% \begin{macrocode} +\newcommand*\DeclareRemLike[2]{% +% \end{macrocode} +% Cela commence dès le début où il n'y a pas de paramètre optionnel, +% le texte pouvant commencer directement après le titre. En fait, les +% choses sont beaucoup plus simples : l'environnement fait que +% l'ensemble du texte traité l'est dans un empagement réduit (y +% compris le titre). Il s'agit du même empagement que celui des +% définitions d'où le même calcul de largeur de la minipage et le même +% retrait initial. +% \begin{macrocode} + \newenvironment{#1}{% + \par\addvspace{\BeforeRemVSpace} + \hspace*{\dimexpr\SquareWidth*3+\DefFrameHSep}% +% \end{macrocode} +% On redéfinit aussi les listes avant d'appeler la minipage. +% \begin{macrocode} + \let\itemize\smc@remitemize + \let\enditemize\endsmc@remitemize + \let\colitemize\smc@remcolitemize + \let\endcolitemize\endsmc@remcolitemize + \let\enumerate\smc@remenumerate + \let\endenumerate\endsmc@remenumerate + \let\colenumerate\smc@remcolenumerate + \let\endcolenumerate\endsmc@remcolenumerate + \let\partie\smc@nopartie + \let\exercice\smc@noexercice + \let\endexercice\endsmc@noexercice + \let\corrige\smc@nocorrige + \let\endcorrige\endsmc@nocorrige + \def\smc@currpart{#1}% + \minipage{\dimexpr\linewidth-\SquareWidth*3-\DefFrameHSep*2-\ExtraMarginRight} + \strut + {\RemTitleFont \textcolor{RemTitleColor}{#2 : }}% + \ignorespaces + } +% \end{macrocode} +% La partie terminale de l'environnement ferme la minipage et passe au +% paragraphe suivant. +% \begin{macrocode} + {% + \endminipage + \par\addvspace{\AfterRemVSpace} + } +} +% \end{macrocode} +% \end{macro} +% \begin{environment}{remarque} +% On se sert maintenant de la macro |\DeclareRemLike| pour créer les +% environnements de type remarque. +% \begin{macrocode} +\DeclareRemLike{remarque}{Remarque} +% \end{macrocode} +% \end{environment} +% \begin{environment}{remarques} +% \begin{macrocode} +\DeclareRemLike{remarques}{Remarques} +% \end{macrocode} +% \end{environment} +% \begin{environment}{notation} +% \begin{macrocode} +\DeclareRemLike{notation}{Notation} +% \end{macrocode} +% \end{environment} +% \begin{environment}{notations} +% \begin{macrocode} +\DeclareRemLike{notations}{Notations} +% \end{macrocode} +% \end{environment} +% \begin{environment}{vocabulaire} +% \begin{macrocode} +\DeclareRemLike{vocabulaire}{Vocabulaire} +% \end{macrocode} +% \end{environment} +% \begin{macro}{\DeclareProofLike} +% On a également des environnements de type |preuve| qui seront créés +% par la macro |\DeclareProofLike|. Le premier argument est le nom de +% l'environnement et le deuxième et le titre. +% \begin{macrocode} +\newcommand*\DeclareProofLike[2]{% + \newenvironment{#1} + {% +% \end{macrocode} +% Au début, on place un espacement vertical puis un espacement +% horizontal; le filet et un autre espacement horizontal. +% \begin{macrocode} + \par\addvspace{\BeforeProofVSpace} + \hspace*{\dimexpr\SquareWidth*3}% + {% + \color{ProofRuleColor}% + \vrule width \RuleWidth + } + \hspace*{\dimexpr \SquareWidth-\RuleWidth}% +% \end{macrocode} +% On redéfinit aussi les listes avant d'appeler la minipage. +% \begin{macrocode} + \let\itemize\smc@proofitemize + \let\enditemize\endsmc@proofitemize + \let\colitemize\smc@proofcolitemize + \let\endcolitemize\endsmc@proofcolitemize + \let\enumerate\smc@proofenumerate + \let\endenumerate\endsmc@proofenumerate + \let\colenumerate\smc@proofcolenumerate + \let\endcolenumerate\endsmc@proofcolenumerate + \let\partie\smc@nopartie + \let\exercice\smc@noexercice + \let\endexercice\endsmc@noexercice + \let\corrige\smc@nocorrige + \let\endcorrige\endsmc@nocorrige + \def\smc@currpart{#1}% + \minipage{\dimexpr\linewidth-\SquareWidth*4-\ExtraMarginRight} +% \end{macrocode} +% Le titre est placé dans un boîte avec les espacements adéquat afin +% de pouvoir le placer sur le cartouche adéquat au niveau de la +% largeur. +% \begin{macrocode} + \setbox\smc@boxa=\hbox{% + \hspace*{\dimexpr\ProofHeightFrame+\ProofLeftSpace}% + \ProofTitleFont + \textcolor{ProofTitleColor}{#2}% + \hspace*{\ProofRightSpace}% + }% +% \end{macrocode} +% Maintenant que le titre complet est dans une boîte, on peut +% construire le cartouche suivi d'une espace. +% \begin{macrocode} + \begin{pspicture}(0,0)(\wd\smc@boxa,\ProofHeightFrame) + \psframe*[linestyle=none,linecolor=ProofBottomFrameColor] + (0,-\ProofDepthFrame)(\wd\smc@boxa,0) + \psframe*[linestyle=none,linecolor=ProofTopFrameColor] + (0,0)(\wd\smc@boxa,\ProofHeightFrame) + \pspolygon*[linestyle=none,linecolor=ProofTriangleFrameColor] + (0,0)(0,\ProofHeightFrame)(\ProofHeightFrame,\ProofHeightFrame) + \rput[Bl](\dimexpr\ProofHeightFrame+\ProofLeftSpace,0){% + \ProofTitleFont + \textcolor{ProofTitleColor}{#2}% + } + \end{pspicture}% + \hspace{\AfterProofTitleHSpace}% + \ignorespaces + } +% \end{macrocode} +% La partie terminale de l'environnement ferme la minipage et passe au +% paragraphe suivant. +% \begin{macrocode} + {% + \endminipage + \par\addvspace{\AfterProofVSpace} + } +} +% \end{macrocode} +% \end{macro} +% \begin{environment}{preuve} +% On utilise la macro précédente pour déclarer l'environnement +% |preuve|. +% \begin{macrocode} +\DeclareProofLike{preuve}{\StringPREUVE} +% \end{macrocode} +% \end{environment} +% \begin{environment}{exemple} +% Comme il y a plusieurs environnements de type exemple, on va +% regrouper dans des macros séparés les parties communes. À savoir les +% affichages des cartouches. +% \begin{macrocode} +\newcommand*\smc@cartoucheexemple{% + \begin{pspicture}(-\ExempleVRuleWidthFrame,0) + (\ExempleWidthFrame,\ExempleHeightFrame) + \psframe*[linewidth=0pt,linecolor=ExempleEdgeFrameColor] + (-\ExempleVRuleWidthFrame,-\ExempleHRuleWidthFrame) + (\ExempleWidthFrame,\ExempleHeightFrame) + \psframe*[linewidth=0pt,linecolor=ExempleBkgFrameColor] + (0mm,-0mm)(\ExempleWidthFrame,\ExempleHeightFrame) + \rput[B](\dimexpr\ExempleWidthFrame/2,0){% + \ExempleTitleFont + \textcolor{ExempleTitleColor}{\StringExemple}% + } + \end{pspicture}% +} +\newcommand*\smc@cartouchecorrection{% + \begin{pspicture}(-\ExempleVRuleWidthFrame,0) + (\ExempleWidthFrame,\ExempleHeightFrame) + \psframe*[linewidth=0pt,linecolor=ExempleEdgeFrameColor] + (-\ExempleVRuleWidthFrame,-\ExempleHRuleWidthFrame) + (\ExempleWidthFrame,\ExempleHeightFrame) + \psframe*[linewidth=0pt,linecolor=ExempleBkgFrameColor] + (0mm,-0mm)(\ExempleWidthFrame,\ExempleHeightFrame) + \rput[B](\dimexpr\ExempleWidthFrame/2,0){% + \ExempleTitleFont + \textcolor{ExempleTitleColor}{\StringCorrection}% + } + \end{pspicture}% +} +% \end{macrocode} +% Le premier environnement de type exemple compose un exemple et sa +% correction dans deux colonnes. La syntaxe est : +% +% |\begin{exemple}[ratio]|\\ +% \quad texte de l'exemple\\ +% |\correction|\\ +% \quad texte de la correction\\ +% |\end{exemple}| +% +% où |ratio| est un argument optionnel indiquant la proportion de la +% largeur disponible réservée au texte d'énoncé (valeur par défaut de +% 0,4 correspondant au $\frac{2}{5}$ de la place. +% +% On commence par placer le bon espacement vertical et à initialiser +% la macro |\correction| valable pour cet environnement. +% \begin{macrocode} +\newenvironment{exemple}[1][0.4]{% + \par\addvspace{\BeforeExempleVSpace} + \let\correction\smc@exemplecorrection +% \end{macrocode} +% On redéfinit ensuite la liste à puce. +% \begin{macrocode} + \let\itemize\smc@exempleitemize + \let\enditemize\endsmc@exempleitemize + \let\colitemize\smc@exemplecolitemize + \let\endcolitemize\endsmc@exemplecolitemize + \let\enumerate\smc@exempleenumerate + \let\endenumerate\endsmc@exempleenumerate + \let\colenumerate\smc@exemplecolenumerate + \let\endcolenumerate\endsmc@exemplecolenumerate + \let\exercice\smc@noexercice + \let\endexercice\endsmc@noexercice + \let\corrige\smc@nocorrige + \let\endcorrige\endsmc@nocorrige + \def\smc@currpart{Exemple}% + \let\partie\smc@nopartie +% \end{macrocode} +% Enfin, on mémorise la valeur du ratio. +% \begin{macrocode} + \def\smc@ratio{#1}% +% \end{macrocode} +% On doit afficher dans l'ordre : +% \begin{itemize} +% \item un espace de 3|\SquareWidth| ; +% \item un filet vertical avec un espace le tout faisant +% |\SquareWidth| de large ; +% \item le texte de l'exemple ; +% \item un espace de |\SquareWidth| ; +% \item un filet vertical avec un espace le tout faisant +% |\SquareWidth| de large ; +% \item le texte de la correction. +% \end{itemize} +% \begin{macrocode} + \hspace*{\dimexpr \SquareWidth*3}% + \color{ExempleRuleColor}% + \vrule width \RuleWidth + \hspace*{\dimexpr \SquareWidth-\RuleWidth}% +% \end{macrocode} +% Le texte de l'exemple fait |\smc@ratio| de l'espace a disposition, +% les $(1-|\smc@ratio|)$ restant étant pour la correction. La largeur +% à se partager fait |\linewidth|-6|\SquareWidth|. Les deux minipages +% sont alignées sur le haut. +% \begin{macrocode} + \minipage[t]{\smc@ratio\dimexpr\linewidth-\SquareWidth*6} +% \end{macrocode} +% Dans la colonne d'exemple, on commence par placer le mot \og exemple +% \fg{} avec son cadre. +% \begin{macrocode} + \smc@cartoucheexemple + \par + \color{Noir}% + \ignorespaces +} +{% + \endminipage + \par +} +% \end{macrocode} +% \end{environment} +% \begin{environment}{exemple*1} +% Le deuxième environnement de type exemple permet une composition sur +% une seule colonne. +% +% Le début du code est identique à celui de l'environnement +% |exemple|. On indiquera les différences. On laisse un argument +% optionnel mais celui-ci est inutile. +% \begin{macrocode} +\newenvironment{exemple*1}[1][]{% + \par\addvspace{\BeforeExempleVSpace} +% \end{macrocode} +% La macro |\correction| appelle une autre macro. +% \begin{macrocode} + \let\correction\smc@one@exemplecorrection + \let\itemize\smc@exempleitemize + \let\enditemize\endsmc@exempleitemize + \let\colitemize\smc@exemplecolitemize + \let\endcolitemize\endsmc@exemplecolitemize + \let\enumerate\smc@exempleenumerate + \let\endenumerate\endsmc@exempleenumerate + \let\colenumerate\smc@exemplecolenumerate + \let\endcolenumerate\endsmc@exemplecolenumerate + \let\partie\smc@nopartie + \let\exercice\smc@noexercice + \let\endexercice\endsmc@noexercice + \let\corrige\smc@nocorrige + \let\endcorrige\endsmc@nocorrige + \def\smc@currpart{Exemple}% +% \end{macrocode} +% On ne mémorise pas la valeur de l'argument optionnel puisqu'il n'y a +% plus de répartition entre deux colonnes. +% \begin{macrocode} + \hspace*{\dimexpr \SquareWidth*3}% + \color{ExempleRuleColor}% + \vrule width \RuleWidth + \hspace*{\dimexpr \SquareWidth-\RuleWidth}% +% \end{macrocode} +% La composition se fait dans une minipage qui prend l'empagement +% réduit moins |\SquareWidth*4|. +% \begin{macrocode} + \minipage[t]{\dimexpr\linewidth-\SquareWidth*4-\ExtraMarginRight} + \smc@cartoucheexemple +% \end{macrocode} +% Dans l'exemple sur une colonne, on permet au texte de suivre +% immédiatement le cartouche. +% \begin{macrocode} + \space + \color{Noir}% + \ignorespaces +} +{% + \strut + \endminipage + \par +} +% \end{macrocode} +% \end{environment} +% Pour que les environnements d'exemples soient complets, il faut +% également la macro |\correction|. Or, celle-ci sera appelée dans +% plusieurs environnements, il faut donc en déclarer \og plusieurs +% \fg{}. On commence avec celle qui est interdite (en-dehors des +% environnements). +% \begin{macrocode} +\newcommand*\smc@nocorrection{% + \ClassError{sesamanuel}{Vous ne pouvez pas utilisez la macro + \string\correction\space ici}{Reportez-vous à la documentation + pour l'utilisation de la macro \string\correction.}% +} +% \end{macrocode} +% Vient ensuite la macro pour l'environnement d'exemple sur deux +% colonnes. Elle reprend le code de l'environnement exemple mais en +% donnant $(1-|\smc@ratio|)$ de l'espace à la deuxième colonne au lieu +% de |\smc@ratio| ce qui oblige à un peu plus de travail. +% \begin{macrocode} +\newcommand*\smc@exemplecorrection{% + \endminipage + \hspace{\SquareWidth}% + \color{ExempleRuleColor}% + \vrule width \RuleWidth + \hspace*{\dimexpr \SquareWidth-\RuleWidth}% + \dimen0=\dimexpr\linewidth-\SquareWidth*6 + \minipage[t]{\dimen0-\smc@ratio\dimen0}% + \smc@cartouchecorrection + \par + \color{Noir}% + \ignorespaces +} +% \end{macrocode} +% On a ensuite la macro pour l'environnement d'exemple sur une seule +% colonne. Le code est beaucoup plus simple puisqu'il consiste à +% passer au paragraphe suivant et à afficher le cartouche de +% correction. +% \begin{macrocode} +\newcommand*\smc@one@exemplecorrection{% + \par + \smc@cartouchecorrection + \space +} +% \end{macrocode} +% \begin{environment}{methode} +% Il y a quatre environnements methodes. Le premier compose un seul +% exercice d'application avec sa correction un peu comme on composait +% l'exemple avec sa correction sur deux colonnes. Le deuxième compose +% l'exemple et sa correction sur une seule colonne. Le troisième +% compose deux exercices et leurs corrections sur deux colonnes. Le +% troisième compose autant d'exercices et de correction que l'on veut +% sur une véritable double colonne. +% +% Ces quatre environnements partagent la façon d'afficher un grand +% filet épais à gauche avec le titre \og MÉTHODE \fg{} suivi d'un +% éventuel sous-titre, ainsi que les cartouches \og Exercice +% d'application \fg{} et \og Correction \fg{}. On commence par définir +% tous ces éléments communs. +% +% Le premier est le titre. Il permet un paramètre optionnel donnant le +% sous-titre. Ce titre a besoin d'un compteur. Ce dernier est +% initialisé à chaque chapitre. +% \begin{macrocode} +\newcounter{methode}[chapter] +\newcommand*\smc@titremethode[1][]{% +% \end{macrocode} +% On écrit le titre dans le fichier de liste des méthodes +% correspondant au thème en cours. +% \begin{macrocode} + \smc@addtolom{#1}% +% \end{macrocode} +% On incrémente ensuite le compteur des méthodes avant de construire +% le titre proprement dit. +% \begin{macrocode} + \refstepcounter{methode}% + {% + \setlength{\fboxsep}{0pt}% + \colorbox{MethodeTitleFrameColor}{% + \hspace*{\MethodeTitleLeftSpace}% + \textcolor{MethodeTitleColor}{% + \MethodeTitleFont + \vrule width0pt height\ht\strutbox depth 1pt + \StringMETHODE\space \themethode + }% + \hspace*{\MethodeTitleRightSpace}% + }% + }% + \ifx\relax#1\relax + \else + \hspace{\MethodeSubtitleLeftSpace}% + \textcolor{MethodeSubtitleColor}{\MethodeSubtitleFont #1}% + \fi + \par\vspace{\AfterMethodeTitleVspace} +} +% \end{macrocode} +% La macro qui suit permet de composer \og Exercice d'application +% \fg{} dans son cartouche. +% \begin{macrocode} +\newcommand*\smc@cartoucheexapp{% + \begin{pspicture}(0,-\ExAppDepthFrame) + (\ExAppWidthFrame,\ExAppHeightFrame) + \psframe*[linewidth=0pt,linecolor=ExAppEdgeFrameColor] + (0,-\ExAppDepthFrame) + (\ExAppWidthFrame,\ExAppHeightFrame) + \psframe*[linewidth=0pt,linecolor=ExAppBkgFrameColor] + (0mm,-0mm)(\ExAppWidthFrame,\ExAppHeightFrame) + \rput[B](\dimexpr\ExAppWidthFrame/2,0){% + \ExAppTitleFont + \textcolor{ExAppTitleColor}{\StringExApp}% + } + \end{pspicture}% +} +% \end{macrocode} +% On a presque la même chose pour le cartouche \og Correction \fg{}. +% \begin{macrocode} +\newcommand*\smc@cartouchecorr{% + \begin{pspicture}(0,-\ExAppCorrDepthFrame) + (\ExAppCorrWidthFrame,\ExAppCorrHeightFrame) + \psframe*[linewidth=0pt,linecolor=ExAppCorrEdgeFrameColor] + (0,-\ExAppCorrDepthFrame) + (\ExAppCorrWidthFrame,\ExAppCorrHeightFrame) + \psframe*[linewidth=0pt,linecolor=ExAppCorrBkgFrameColor] + (0mm,-0mm)(\ExAppCorrWidthFrame,\ExAppCorrHeightFrame) + \rput[B](\dimexpr\ExAppCorrWidthFrame/2,0){% + \ExAppCorrTitleFont + \textcolor{ExAppCorrTitleColor}{\StringCorrection}% + } + \end{pspicture}% +} +% \end{macrocode} +% On peut maintenant écrire le code des quatre environnements +% méthode. L'environnement donnant un seul exemple avec sa correction +% en vis à vis s'appelle |methode| et sa syntaxe est :\\ +% |\begin{methode}[sous-titre]|\\ +% \quad texte introductif dans le cadre bleu\\ +% |\exercice|\\ +% \quad texte de l'exercice d'application\\ +% |\correction|\\ +% \quad texte de la correction\\ +% |\end{methode}| +% +% On commence par placer l'espace avant le bloc et à redéfinir les +% macros |\exercice| et |\correction| ainsi que la liste à puce. +% \begin{macrocode} +\newenvironment{methode}[1][]{% + \par\addvspace{\BeforeMethodeVSpace} + \let\itemize\smc@exappitemize + \let\enditemize\endsmc@exappitemize + \let\colitemize\smc@exappcolitemize + \let\endcolitemize\endsmc@exappcolitemize + \let\enumerate\smc@exappenumerate + \let\endenumerate\endsmc@exappenumerate + \let\colenumerate\smc@exappcolenumerate + \let\endcolenumerate\endsmc@exappcolenumerate + \let\partie\smc@nopartie + \let\exercice\smc@exappexercice + \let\correction\smc@exappcorrection + \let\corrige\smc@nocorrige + \let\endcorrige\endsmc@nocorrige + \def\smc@currpart{Methode}% +% \end{macrocode} +% On doit afficher dans l'ordre : +% \begin{itemize} +% \item un espacement horizontal ; +% \item le grand filet gauche ; +% \item un espacement horizontal ; +% \item une grande minipage qui contiendra tout, à savoir : +% \begin{itemize} +% \item le titre en le décalant suffisament sur la gauche pour qu'il +% écrase le filet gauche, +% \item un saut de ligne, +% \item un cadre bleu qui touche au filet gauche avec un texte sur +% un empagement réduit, +% \item une minipage de 1/3 de la place restante hors espacement et +% filet, c'est-à-dire empagement - 6|\SquareWidth|-|\RuleWidth|, +% \item un espacement horizontal de |\SquareWidth|, +% \item un filet vertical de |\RuleWidth| d'épaisseur, +% \item un espacement horizontal de |\SquareWidth|, +% \item une minipage de 2/3 de la place restante hors espacement et +% filet. +% \end{itemize} +% \end{itemize} +% +% On commence par l'espace à gauche et le filet gauche principal +% \begin{macrocode} + \hspace*{\dimexpr\SquareWidth*2}% + {% + \color{MethodeRuleColor}% + \vrule width \SquareWidth + }% +% \end{macrocode} +% Ensuite, on place l'espace et la minipage qui contient tout. +% \begin{macrocode} + \hspace{\SquareWidth}% + \minipage{\dimexpr\linewidth-\SquareWidth*4}% +% \end{macrocode} +% Affichage du titre (avec son sous-titre éventuel). +% \begin{macrocode} + \hspace*{\dimexpr-\SquareWidth*2}% + \smc@titremethode[#1]% + \par +% \end{macrocode} +% À partir de maintenant, il faut tenir compte du contenu de +% l'environnement. Le premier contenu est, potentiellement, le texte +% introductif. Pour tester sa présence ou non, on le place dans une +% boîte qu'on analysera plus tard. +% \begin{macrocode} + \begin{lrbox}{\smc@boxa}% + \minipage{\dimexpr\linewidth-\SquareWidth*5-\MethodeFrameHSep*2}% + \ignorespaces +} +% \end{macrocode} +% En partie terminale, on a uniquement à fermer la dernière minipage +% ouverte ainsi que la minipage principale et à passer au paragraphe suivant. +% \begin{macrocode} +{% + \endminipage + \endminipage + \par +} +% \end{macrocode} +% On définit la macro |\exercice| réelle pour cet environnement. Elle +% accepte un argument optionnel indiquant la proportion de +% l'empagement occupé par cette partie. +% \begin{macrocode} +\newcommand*\smc@exappexercice[1][0.4]{% + \endminipage + \end{lrbox}% + \def\smc@ratio{#1}% +% \end{macrocode} +% Il faut détecter si la boîte est vide. Pour cela, on va se fonder +% sur sa hauteur et sa profondeur. Les valeurs pour un texte +% totalement vide sont respectivement |2.375pt| et |0pt|. Le +% test se fera sur une hauteur totale de plus de |2.4pt|. +% \begin{macrocode} + \ifdim\dimexpr\ht\smc@boxa+\dp\smc@boxa > 2.4pt +% \end{macrocode} +% On est dans le cas où il y a une partie introductive. On va placer +% le tout dans un |\colorbox| en ayant pris soin de contrôler +% totalement les espacements. Les marges gauche et droite de la boîte +% sont assurés par des |\hspace*|. Les marges haute et basse par une +% manipulation des dimensions de la boîte +% \begin{macrocode} + {% + \setlength{\fboxsep}{0pt}% + \ht\smc@boxa=\dimexpr\ht\smc@boxa+\MethodeFrameTopSep + \dp\smc@boxa=\dimexpr\dp\smc@boxa+\MethodeFrameBottomSep + \hspace*{-\SquareWidth}% + \colorbox{MethodeIntroBkgFrameColor}{% + \hspace*{\MethodeFrameHSep}% + \usebox{\smc@boxa}% + \hspace*{\MethodeFrameHSep}% + }% + \par\vspace{5mm} + }% + \fi +% \end{macrocode} +% On ouvre maintenant la minipage pour l'exercice d'application. Avant +% de regarder son contenu, on place le cartouche. La largeur de la +% minipage est de 0.4 (par défaut) de la place restante. Comme on est +% dans une minipage, cela donne +% |(\linewidth-2*\SquareWidth-\RuleWidth)*\smc@ratio| +% \begin{macrocode} + \minipage[t]{\smc@ratio\dimexpr\linewidth-\SquareWidth*2-\RuleWidth}% + \smc@cartoucheexapp + \par +} +% \end{macrocode} +% On définit la macro |\correction| réelle pour cet +% environnement. Elle commence à fermer la minipage précédemment +% ouverte avant de passer à la ligne et d'ouvrir sa propre +% minipage. Entre les deux minipages, il y a les espacements et le +% filet. +% \begin{macrocode} +\newcommand*\smc@exappcorrection{% + \endminipage + \hspace{\SquareWidth}% + {% + \color{MethodeRuleColor}% + \vrule width \RuleWidth + }% + \hspace{\SquareWidth}% +% \end{macrocode} +% La largeur de la minipage est la même que celle pour l'énoncé de +% l'exercice sauf que c'est |1-\smc@ratio| au lieu de |\smc@ratio|. Cela +% oblige à un calcul externe. +% \begin{macrocode} + \dimen0=\dimexpr\linewidth-\SquareWidth*2-\RuleWidth + \minipage[t]{\dimen0-\smc@ratio\dimen0}% + \smc@cartouchecorr + \par +} +% \end{macrocode} +% \end{environment} +% \begin{environment}{methode*1} +% Le deuxième environnement méthode fonctionne comme le premier mais +% compose les exercices et les corrections sur une seule colonne. La +% syntaxe de cet environnement est :\\ +% |\begin{methode*1}[sous-titre]|\\ +% \quad texte introductif dans le cadre bleu\\ +% |\exercice|\\ +% \quad texte de l'exercice d'application\\ +% |\correction|\\ +% \quad texte de la correction\\ +% |\end{methode*1}|\\ +% En sachant qu'en fait, on peut répéter autant de fois que l'on veut +% les exercices et le corrections. +% \begin{macrocode} +\newenvironment{methode*1}[1][]{% + \par\addvspace{\BeforeMethodeVSpace} +% \end{macrocode} +% Seules les deux lignes suivantes diffèrent. +% \begin{macrocode} + \let\itemize\smc@exappitemize + \let\enditemize\endsmc@exappitemize + \let\colitemize\smc@exappcolitemize + \let\endcolitemize\endsmc@exappcolitemize + \let\enumerate\smc@exappenumerate + \let\endenumerate\endsmc@exappenumerate + \let\colenumerate\smc@exappcolenumerate + \let\endcolenumerate\endsmc@exappcolenumerate + \let\partie\smc@nopartie + \let\exercice\smc@one@exappexercice + \let\correction\smc@one@exappcorrection + \let\corrige\smc@nocorrige + \let\endcorrige\endsmc@nocorrige + \def\smc@currpart{Methode}% + \hspace*{\dimexpr\SquareWidth*2}% + {% + \color{MethodeRuleColor}% + \vrule width \SquareWidth + }% + \hspace{\SquareWidth}% + \minipage{\dimexpr\linewidth-\SquareWidth*4}% + \hspace*{\dimexpr-\SquareWidth*2}% + \smc@titremethode[#1]% + \par + \begin{lrbox}{\smc@boxa}% + \minipage{\dimexpr\linewidth-\SquareWidth*5-\MethodeFrameHSep*2}% + \ignorespaces +} +{% + \end{changemargin} + \endminipage + \par +} +% \end{macrocode} +% On définit maintenant les macros qui deviendront les macros +% |\exercice| et |\correction| de l'environnement |methode*1|. +% +% On commence par le code de |\exercice|. Le début du code est +% similaire à celui de |\smc@exappexercice|, on indiquera uniquement +% les différences. Cela commence immédiatement avec une absence de +% paramètre optionnel puisqu'il n'y a qu'une seule colonne. En +% réalité, on acceptera un argument optionnel sans utilité (cela +% pourra servir lors de copier-coller). +% \begin{macrocode} +\newcommand*\smc@one@exappexercice[1][]{% + \endminipage + \end{lrbox}% + \ifdim\dimexpr\ht\smc@boxa+\dp\smc@boxa > 2.4pt + {% + \setlength{\fboxsep}{0pt}% + \ht\smc@boxa=\dimexpr\ht\smc@boxa+\MethodeFrameTopSep + \dp\smc@boxa=\dimexpr\dp\smc@boxa+\MethodeFrameBottomSep + \hspace*{-\SquareWidth}% + \colorbox{MethodeIntroBkgFrameColor}{% + \hspace*{\MethodeFrameHSep}% + \usebox{\smc@boxa}% + \hspace*{\MethodeFrameHSep}% + }% + \par\vspace{5mm} + }% + \fi +% \end{macrocode} +% On redéfinit la macro |\exercice| pour permettre plusieurs exercices +% dans le même environnement. +% \begin{macrocode} + \let\exercice\smc@one@@exappexercice +% \end{macrocode} +% Le code est maintenant beaucoup plus simple : il n'y a pas de début +% de minipage. On ne fait que composer le cartouche avec son espace +% après. Cela dit on doit revenir à une composition dans un empagement +% réduit. +% \begin{macrocode} + \begin{changemargin}{0mm}{\dimexpr\ExtraMarginRight}% + \smc@cartoucheexapp + \hspace{\AfterCartoucheHSpace}% +} +% \end{macrocode} +% Le code pour |\correction| est encore plus simple, il faut juste +% passer au paragraphe suivant et afficher le cartouche avec son +% espace après. +% \begin{macrocode} +\newcommand*\smc@one@exappcorrection{% + \par\vspace{\AfterExAppMethodeVSpace} + \smc@cartouchecorr + \hspace{\AfterCartoucheHSpace}% +} +% \end{macrocode} +% Les autres exercices sont comme |\correction| : très simples ! +% \begin{macrocode} +\newcommand\smc@one@@exappexercice[1][]{% + \par\vspace{\AfterExAppMethodeVSpace} + \smc@cartoucheexapp + \hspace{\AfterCartoucheHSpace}% +} +% \end{macrocode} +% \end{environment} +% \begin{environment}{methode*2*2} +% Le troisième environnement méthode fonctionne comme les deux +% premiers mais compose deux exercices d'application avec leurs +% corrections sur deux colonnes séparées par un filet aussi large que +% le filet gauche. +% +% La syntaxe de cet environnement est :\\ +% |\begin{methode*2*2}[sous-titre]|\\ +% \quad texte introductif dans le cadre bleu\\ +% |\exercice|\\ +% \quad texte du 1\ier{} exercice d'application\\ +% |\correction|\\ +% \quad texte de la 1\iere{} correction\\ +% |\exercice|\\ +% \quad texte du 2\ieme{} exercice d'application\\ +% |\correction|\\ +% \quad texte de la 2\ieme{} correction\\ +% |\end{methode*2}| +% +% Le code est quasiment identique à l'environnement |methode|, seule +% les assignations des macros |\exercice| et |\correction| sont +% différentes. +% \begin{macrocode} +\newenvironment{methode*2*2}[1][]{% + \par\addvspace{\BeforeMethodeVSpace} +% \end{macrocode} +% Les deux lignes suivantes sont la seule différence (appels de +% |\smc@@xxx| au lieu de |\smc@xxx|). +% \begin{macrocode} + \let\itemize\smc@exappitemize + \let\enditemize\endsmc@exappitemize + \let\colitemize\smc@exappcolitemize + \let\endcolitemize\endsmc@exappcolitemize + \let\enumerate\smc@exappenumerate + \let\endenumerate\endsmc@exappenumerate + \let\colenumerate\smc@exappcolenumerate + \let\endcolenumerate\endsmc@exappcolenumerate + \let\partie\smc@nopartie + \let\exercice\smc@@exappexercice + \let\correction\smc@@exappcorrection + \let\corrige\smc@nocorrige + \let\endcorrige\endsmc@nocorrige + \def\smc@currpart{Methode}% + \hspace*{\dimexpr\SquareWidth*2}% + {% + \color{MethodeRuleColor}% + \vrule width \SquareWidth + }% + \hspace{\SquareWidth}% + \minipage{\dimexpr\linewidth-\SquareWidth*4}% + \hspace*{\dimexpr-\SquareWidth*2}% + \smc@titremethode[#1]% + \par + \begin{lrbox}{\smc@boxa}% + \minipage{\dimexpr\linewidth-\SquareWidth*5-\MethodeFrameHSep*2}% + \ignorespaces +} +{% + \endminipage + \endminipage + \par +} +% \end{macrocode} +% Il faut maintenant indiquer le code des macros qui deviendront les +% |\exercice| et |\correction| de l'environnement |methode*2*2|. +% +% On commence par le code de |\exercice|. Le code est très similaire +% à celui de |\smc@exappexercice|, on indiquera uniquement les +% différences. Cela commence immédiatement avec la valeur par défaut +% de la proportion de l'empagement pris : ce sera 0.5. +% \begin{macrocode} +\newcommand*\smc@@exappexercice[1][0.5]{% + \endminipage + \end{lrbox}% + \def\smc@ratio{#1}% + \ifdim\dimexpr\ht\smc@boxa+\dp\smc@boxa > 2.4pt + {% + \setlength{\fboxsep}{0pt}% + \ht\smc@boxa=\dimexpr\ht\smc@boxa+\MethodeFrameTopSep + \dp\smc@boxa=\dimexpr\dp\smc@boxa+\MethodeFrameBottomSep + \hspace*{-\SquareWidth}% + \colorbox{MethodeIntroBkgFrameColor}{% + \hspace*{\MethodeFrameHSep}% + \usebox{\smc@boxa}% + \hspace*{\MethodeFrameHSep}% + }% + \par\vspace{5mm} + }% + \fi +% \end{macrocode} +% La différence la plus importante et que le prochain appel de +% |\exercice| n'aura pas du tout le même rôle et pour cela, on modifie +% la signification de cette macro. +% \begin{macrocode} + \let\exercice\smc@@@exappexercice +% \end{macrocode} +% La largeur de la minipage n'est pas calculée exactement de la même +% façon et il n'y a pas de saut de paragraphe après le cartouche +% (seulement un espace). +% \begin{macrocode} + \minipage[t]{\smc@ratio\dimexpr\linewidth-\SquareWidth*3}% + \smc@cartoucheexapp + \hspace{\AfterCartoucheHSpace}% +} +% \end{macrocode} +% La macro de correction est beaucoup plus simple (encore que là +% aussi, il va falloir en prévoir deux). Elle ne fait que passer à la +% ligne, afficher le cartouche et l'espace horizontale. +% \begin{macrocode} +\newcommand\smc@@exappcorrection{% + \par\vspace{\AfterExAppMethodeVSpace} + \smc@cartouchecorr + \hspace{\AfterCartoucheHSpace}% +% \end{macrocode} +% En revanche, il faut prévoir que le prochain appel à |\correction| +% ne sera pas identique. D'où la redéfinition suivante. +% \begin{macrocode} + \let\correction\smc@@@exappcorrection +} +% \end{macrocode} +% On arrive maintenant dans l'appel de |\exercice| au moment où on +% commence la colonne de droite. +% \begin{macrocode} +\newcommand\smc@@@exappexercice{% +% \end{macrocode} +% On commence par fermer la minipage de la colonne de gauche puis à +% placer l'espacement, le filet large et l'espacement. +% \begin{macrocode} + \endminipage + \hspace{\SquareWidth}% + {% + \color{MethodeRuleColor}% + \vrule width \SquareWidth + }% + \hspace{\SquareWidth}% +% \end{macrocode} +% On peut alors ouvrir la deuxième minipage (colonne de droite). Il +% faut calculer sa largeur avec le ratio |1-\smc@ratio| +% \begin{macrocode} + \dimen0=\dimexpr\linewidth-\SquareWidth*3 + \minipage[t]{\dimen0-\smc@ratio\dimen0}% +% \end{macrocode} +% On termine comme précédemment en affichant le cartouche et +% l'espace. +% \begin{macrocode} + \smc@cartoucheexapp + \hspace{\AfterCartoucheHSpace}% +} +% \end{macrocode} +% Le code de la macro |\correction| de la deuxième colonne est +% exactement celle de la première mais sans avoir besoin de redéfinir +% cette macro. +% \begin{macrocode} +\newcommand\smc@@@exappcorrection{% + \par\vspace{\AfterExAppMethodeVSpace} + \smc@cartouchecorr + \hspace{\AfterCartoucheHSpace}% +} +% \end{macrocode} +% \end{environment} +% \begin{environment}{methode*2} +% Le quatrième environnement méthode fonctionne comme les trois +% premiers au niveau de la syntaxe mais compose les deux colonnes en +% mode effectivement double colonne. C'est-à-dire que ce n'est pas le +% début de la correction qui déterminera le début de la colonne de +% droite. +% +% La syntaxe de cet environnement est :\\ +% |\begin{methode*2}[sous-titre]|\\ +% \quad texte introductif dans le cadre bleu\\ +% |\exercice|\\ +% \quad texte du 1\ier{} exercice d'application\\ +% |\correction|\\ +% \quad texte de la 1\iere{} correction\\ +% |\end{methode*2}| +% +% Tout le début du code ne change pas (sauf pour la définition de +% |\exercice|. +% \begin{macrocode} +\newenvironment{methode*2}[1][]{% + \par\addvspace{\BeforeMethodeVSpace} + \let\itemize\smc@exappitemize + \let\enditemize\endsmc@exappitemize + \let\colitemize\smc@exappcolitemize + \let\endcolitemize\endsmc@exappcolitemize + \let\enumerate\smc@exappenumerate + \let\endenumerate\endsmc@exappenumerate + \let\colenumerate\smc@exappcolenumerate + \let\endcolenumerate\endsmc@exappcolenumerate + \let\partie\smc@nopartie + \let\exercice\smc@@@@exappexercice +% \end{macrocode} +% La définition précédente de |\correction| est celle qui convient ici. +% \begin{macrocode} + \let\correction\smc@@@exappcorrection + \let\corrige\smc@nocorrige + \let\endcorrige\endsmc@nocorrige + \def\smc@currpart{Methode}% + \hspace*{\dimexpr\SquareWidth*2}% + {% + \color{MethodeRuleColor}% + \vrule width \SquareWidth + }% + \hspace{\SquareWidth}% + \minipage{\dimexpr\linewidth-\SquareWidth*4}% + \hspace*{\dimexpr-\SquareWidth*2}% + \smc@titremethode[#1]% + \par + \begin{lrbox}{\smc@boxa}% + \minipage{\dimexpr\linewidth-\SquareWidth*5-\MethodeFrameHSep*2}% + \ignorespaces +} +{% +% \end{macrocode} +% En fin d'environnement, on termine la boîte verticale. +% \begin{macrocode} + \egroup +% \end{macrocode} +% On coupe cette boîte en deux boîtes de hauteur approximativement +% égale. Et on place ces deux boîtes côte à côte après avoir restauré +% l'empagement. +% \begin{macrocode} + \dimen0=\dimexpr (\ht\smc@boxa+\dp\smc@boxa)/2 + \setbox\smc@boxb = \vsplit\smc@boxa to \dimen0 +% \end{macrocode} +% On restaure alors l'empagement et on affiche les deux boîtes côte à +% côte. +% \begin{macrocode} + \hsize \smc@hsize + \linewidth \smc@linewidth + \usebox{\smc@boxb} + \hspace{\SquareWidth}% + {% + \color{MethodeRuleColor}% + \vrule width \RuleWidth + }% + \hspace{\SquareWidth}% + \usebox{\smc@boxa} + \endminipage + \par +} +% \end{macrocode} +% On définit maintenant le code pour la macro |\exercice| de +% l'environnement |methode*1|. Le début du code sert à gérer +% l'éventuel texte préliminaire et ne présente pas de différence avec +% les codes des autres environnements de méthode. +% \begin{macrocode} +\newcommand*\smc@@@@exappexercice{% + \endminipage + \end{lrbox}% + \ifdim\dimexpr\ht\smc@boxa+\dp\smc@boxa > 2.4pt + {% + \setlength{\fboxsep}{0pt}% + \ht\smc@boxa=\dimexpr\ht\smc@boxa+\MethodeFrameTopSep + \dp\smc@boxa=\dimexpr\dp\smc@boxa+\MethodeFrameBottomSep + \hspace*{-\SquareWidth}% + \colorbox{MethodeIntroBkgFrameColor}{% + \hspace*{\MethodeFrameHSep}% + \usebox{\smc@boxa}% + \hspace*{\MethodeFrameHSep}% + }% + \par\vspace{5mm} + }% + \fi +% \end{macrocode} +% En revanche, la suite est nettement différente. Il va falloir +% remplir une boîte verticale avec le reste du corps de +% l'environnement (en commençant par le cartouche exercice). Cette +% boîte verticale se construit avec un |\hsize| et |\linewidth| +% particuliers. On sauvegarde donc leurs valeurs. +% \begin{macrocode} + \edef\smc@hsize{\the\hsize}% + \edef\smc@linewidth{\the\linewidth}% + \hsize = \dimexpr (\linewidth-\SquareWidth*3-\RuleWidth)/2 + \linewidth = \hsize + \setbox\smc@boxa = \vbox\bgroup +% \end{macrocode} +% On commence par placer le cartouche +% \begin{macrocode} + \smc@cartoucheexapp + \hspace{\AfterCartoucheHSpace}% +} +% \end{macrocode} +% \end{environment} +% \begin{environment}{commentaire} +% L'environnement |commentaire| permet d'avoir un texte libre ayant le +% même empagement que le texte de définition. +% \begin{macrocode} +\newenvironment{commentaire}{% + \let\itemize\smc@commentaireitemize + \let\enditemize\endsmc@commentaireitemize + \let\colitemize\smc@commentairecolitemize + \let\endcolitemize\endsmc@commentairecolitemize + \let\enumerate\smc@commentaireenumerate + \let\endenumerate\endsmc@commentaireenumerate + \let\colenumerate\smc@commentairecolenumerate + \let\endcolenumerate\endsmc@commentairecolenumerate + \let\exercice\smc@noexercice + \let\endexercice\endsmc@noexercice + \let\corrige\smc@nocorrige + \let\endcorrige\endsmc@nocorrige + \begin{changemargin}{\dimexpr\SquareWidth*4} + {\dimexpr\ExtraMarginRight+\SquareWidth} +} +{\end{changemargin}} +% \end{macrocode} +% \end{environment} +% \subsection{Exercices de base} +% \begin{macro}{\exercicesbase} +% Cette macro introduit la partie \og Exercices de base \fg{} dans un +% chapitre. Elle autorise l'utilisation des listes et des macros +% |\exercice| et |\correction| en dehors de tout environnement ainsi +% que de la macro |\partie|. +% \begin{macrocode} +\newcommand*\exercicesbase{% + \clearpage + \pagestyle{exercicesbase} + \addtocontents{cor}{\protect\smc@corrigeexercicesbase}% + \let\itemize\smc@exerciceitemize + \let\enditemize\endsmc@exerciceitemize + \let\colitemize\smc@exercicecolitemize + \let\endcolitemize\endsmc@exercicecolitemize + \let\enumerate\smc@exerciceenumerate + \let\endenumerate\endsmc@exerciceenumerate + \let\colenumerate\smc@exercicecolenumerate + \let\endcolenumerate\endsmc@exercicecolenumerate + \let\exercice\smc@exobaseexercice + \let\endexercice\endsmc@exobaseexercice + \let\corrige\smc@exobasecorrige + \let\endcorrige\endsmc@exobasecorrige + \let\correction\smc@nocorrection + \let\partie\smc@exercice@partie + \def\smc@currpart{ExoBase}% +} +% \end{macrocode} +% \end{macro} +% \begin{environment}{colonne*exercice} +% Il faut un environnement particulier pour composer les exercices sur +% deux colonnes. Cet environnement sera le même pour les exercices de +% base et les exercices d'approfondissement. +% \begin{macrocode} +\newenvironment{colonne*exercice}{% +% \end{macrocode} +% Cet environnement ne fait que composer le matériel en double colonne +% avec un séparation faite d'un filet vertical et de deux espacements +% horizontaux d'un |\Squarewidth| chacun. +% \begin{macrocode} + \columnsep \dimexpr \SquareWidth*2 + \columnseprule \RuleWidth + \def\columnseprulecolor{\color{ExerciceColumnRuleColor}}% + \begin{multicols}{2}% + \ignorespaces +} +{\end{multicols}} +% \end{macrocode} +% \end{environment} +% \begin{macro}{\serie} +% Cette macro permet de composer un titre pour un groupement +% d'exercices. L'argument est le titre. +% \begin{macrocode} +\newcommand*\serie[1]{% + \par\addvspace{\BeforeExercicesTitleVSpace} + \begin{pspicture}(0,-\SquareWidth) + (\linewidth,\dimexpr\SquareWidth*2) + \psframe*[linewidth=0pt,linecolor=ExercicesTitleHRuleColor] + (0,-\SquareWidth)(\linewidth,0) + \psframe*[linewidth=0pt,linecolor=ExercicesTitleVRuleColor] + (0,-\SquareWidth)(\SquareWidth,\dimexpr \SquareWidth*2) + \psframe*[linewidth=0pt,linecolor=ExercicesTitleSquareColor] + (0,-\SquareWidth)(\SquareWidth,0) + \rput[Bl](\dimexpr \SquareWidth+\ExercicesTitleHSep, + \ExercicesTitleVSep) + {\ExercicesTitleFont \textcolor{ExercicesTitleColor}{#1}} + \end{pspicture}% +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\exercice} +% Chaque exercice est indiqué par la macro |\exercice|. Celle-ci admet +% deux arguments optionnels qui donnent dans l'ordre le titre et un +% logo pour l'exercice. Pour gérer les endroits où on peut ou non +% utiliser la macro |\exercice|. On procède en deux temps. On définit +% une macro |\smc@exercice| et une macro |\smc@noexercice|. +% +% La macro |\smc@noexercice| est très simple : elle ne fait que lever +% une erreur. +% \begin{macrocode} +\newcommand\smc@noexercice{% + \ClassError{sesamanuel}{Vous ne pouvez pas utiliser la macro + \string\exercice\space ici}{Reportez-vous à la documentation pour + l'utilisation de la macro \string\exercice.} +} +% \end{macrocode} +% Par défaut, ce sont les macros |\smc@noexercice| et +% |\smc@nocorrection| qui sont actives. +% \begin{macrocode} +\let\exercice\smc@noexercice +\let\correction\smc@nocorrection +% \end{macrocode} +% On définit maintenant la macro |\smc@exobaseexercice| qui indiquera la +% façon de composer les exercices dans la partie dédiée aux +% exercices d'entrainement. +% +% Cette macro a deux arguments optionnels. Le premier est le titre, le +% second est le logo. Elle propose également une version étoilée qui +% indique que la correction sera affichée dans l'ouvrage. +% \begin{macrocode} +\newif\ifsmc@exercicecorrige +\newcounter{exercice}[chapter] +% \end{macrocode} +% On regarde s'il y a ou non une étoile. Selon le cas, on met le +% booléen |\ifsmc@exercicecorrige| à la bonne valeur. +% \begin{macrocode} +\newcommand*\smc@exobaseexercice{% + \@ifstar + {% + \smc@exercicecorrigetrue + \smc@@exercice + } + {% + \smc@exercicecorrigefalse + \smc@@exercice + } +} +% \end{macrocode} +% On lit ensuite le premier argument optionnel +% \begin{macrocode} +\newcommand*\smc@@exercice[1][]{% +% \end{macrocode} +% On sauvegarde le texte du titre est on appelle la macro auxiliaire +% pour lire le deuxième argument optionnel. +% \begin{macrocode} + \def\smc@exercicetitle{#1}% + \smc@@@exercice +} +\newcommand*\smc@@@exercice[1][]{% +% \end{macrocode} +% On commence par passer au paragraphe suivant et réinitialiser le compteur +% partie. +% \begin{macrocode} + \par\addvspace{\BeforeExerciceVSpace} + \setcounter{partie}{0} +% \end{macrocode} +% La présence d'un logo va faire qu'on ne composera pas le titre (ou +% le texte) de la même façon. S'il y a un logo, on utilise la commande +% |\parpic| pour habiller le logo. Sinon on ne fait rien de spécial. +% \begin{macrocode} + \@ifnotmtarg{#1}{% + \setbox0=\hbox{#1}% + \parpic[r]{\makebox[\wd0][l]{{#1}}} + }% +% \end{macrocode} +% On compose le numéro de l'exercice. La couleur du cadre dépend du +% fait que l'exercice est corrigé ou non. +% \begin{macrocode} + \refstepcounter{exercice}% + \begin{pspicture}(0,0)(\ExerciceNumFrameWidth,\ExerciceNumFrameHeight) + \ifsmc@exercicecorrige + \psframe*[linewidth=0pt, linecolor=ExerciceCorrigeNumFrameColor] + (0,-\ExerciceNumFrameDepth) + (\ExerciceNumFrameWidth,\ExerciceNumFrameHeight) + \else + \psframe*[linewidth=0pt, linecolor=ExerciceNumFrameColor] + (0,-\ExerciceNumFrameDepth) + (\ExerciceNumFrameWidth,\ExerciceNumFrameHeight) + \fi + \rput[B](\dimexpr\ExerciceNumFrameWidth/2,0){% + \textcolor{ExerciceNumColor}{\ExerciceNumFont \theexercice}% + } + \end{pspicture}% +% \end{macrocode} +% Y a-t-il un titre d'exercice ? +% \begin{macrocode} + \ifx\smc@exercicetitle\empty +% \end{macrocode} +% S'il n'y a pas de titre, on commence le texte de l'exercice (après +% un certain espacement horizontal). +% \begin{macrocode} + \hspace{\ExerciceTextHSep}% + \else +% \end{macrocode} +% S'il y a un titre, on le compose et on passe au paragraphe suivant. +% \begin{macrocode} + \hspace{\ExerciceTextHSep}% + \textcolor{ExerciceTitleColor} + {\ExerciceTitleFont \smc@exercicetitle}% + \par\nobreak + \fi +} +% \end{macrocode} +% En fait, on utilisera plutôt la forme d'environnement pour entrer +% les exercices. Le code terminal ne fait que placer un |\par| (cela +% peut être utile pour activer un éventuel |\centering| en fin de +% code. +% \begin{macrocode} +\def\endsmc@exercice{\par} +% \end{macrocode} +% Pour la forme en environnement, on doit définir l'environnement +% |exercice*|. Cet environnement fait le travail initial de la macro +% étoilée et revient immédiatement sur la partie commune. +% \begin{macrocode} +\newenvironment{exercice*} +{% + \smc@exercicecorrigetrue + \smc@@exercice +} +{\par} +% \end{macrocode} +% On définit l'environnement |smc@exoapprexercice| comme étant un +% alias de |smc@exobaseexercice|. +% \begin{macrocode} +\let\smc@exoapprexercice\smc@exobaseexercice +\let\endsmc@exoapprexercice\endsmc@exobaseexercice +% \end{macrocode} +% \end{macro} +% \begin{environment}{corrige} +% L'environnement |corrige| va enregistrer la correction d'un exercice +% dont l'énoncé vient d'être fourni. Le principe général va être de +% sauvegarder les corrigés dans des fichiers |.tex| séparés. +% +% \begin{macro}{\killienc} +% Pour utiliser \package{fancyvrb} même en UTF-8, il faut désactiver +% tous les codes de caractère supérieurs à 127. La commande +% |\killienc| va automatiquement construire la suite de commande :\\ +% |\catcode=12|\\ +% où || ira de 128 à 255. +% \begin{macrocode} +\newcommand\killienc{} +\count@128 +\@whilenum\count@<\@cclvi\do{% + \edef\killienc{\killienc\catcode\the\count@=12}% + \advance\count@\@ne} +% \end{macrocode} +% \end{macro} +% La macro |\killienc| étant en place, on peut définir l'environnement +% |corrige|. En réalité, comme pour plusieurs éléments de la classe, +% il y aura plusieurs types d'environnement |corrige|, la sélection se +% faisant au moment des besoins. On commence par définir +% l'environnement qui indique qu'on n'a pas le droit d'utiliser cet +% environnement ! +% \begin{macrocode} +\newenvironment{smc@nocorrige} +{% + \ClassError{sesamanuel}{Il est interdit d'utiliser corrige ici} + {Consultez la documentation pour plus de renseignements.}% +} +{} +% \end{macrocode} +% En réalité, il y a de multiples environnements qui auront pour nom +% |corrige|. On définit d'abord celui pour l'auto-évaluation. +% \begin{macrocode} +\newenvironment{smc@AEcorrige} +{% +% \end{macrocode} +% On écrit dans le fichier de correction général l'ordre de chargement +% du corrigé en cours. +% \begin{macrocode} + \addtocontents{cor}{% + \protect\inputcor{\smc@currpart}{\smc@thema@initcap\thechapter} + {\the\c@AEexo}% + }% +% \end{macrocode} +% On utilise ensuite |killienc| pour tuer les caractères actifs. +% \begin{macrocode} + \killienc +% \end{macrocode} +% Vient ensuite la commande magique du package \package{fancyvrb} pour +% permettre de créer soi-même des environnements verbatim. +% \begin{macrocode} + \VerbatimEnvironment +% \end{macrocode} +% Attention, cette ligne doit être la dernière et il ne doit même pas +% y avoir de saut de ligne avant l'accolade fermante de la partie +% initiale de l'environnent. +% \begin{macrocode} + \begin{VerbatimOut}{\PrefixeCorrection corr-\smc@currpart-\smc@thema@initcap\thechapter-\the\c@AEexo}} +{% + \end{VerbatimOut} +} +% \end{macrocode} +% Le corrigé pour les exercices de base se comporte de la même façon +% (sauf pour le compteur d'exercice). +% \begin{macrocode} +\newenvironment{smc@exobasecorrige} +{% + \addtocontents{cor}{% + \protect\inputcor{\smc@currpart}{\smc@thema@initcap\thechapter} + {\the\c@exercice}% + }% + \killienc + \VerbatimEnvironment + \begin{VerbatimOut}{\PrefixeCorrection corr-\smc@currpart-\smc@thema@initcap\thechapter-\the\c@exercice}} +{% + \end{VerbatimOut} +} +% \end{macrocode} +% Un certain nombre d'environnements de correction se comportent +% exactement comme le précédent. On les définit en tant qu'alias. +% \begin{macrocode} +\let\smc@exoapprcorrige\smc@exobasecorrige +\let\endsmc@exoapprcorrige\endsmc@exobasecorrige +\let\smc@recreationcorrige\smc@exobasecorrige +\let\endsmc@recreationcorrige\endsmc@exobasecorrige +\let\smc@QCMcorrige\smc@exobasecorrige +\let\endsmc@QCMcorrige\endsmc@exobasecorrige +\let\smc@librecorrige\smc@exobasecorrige +\let\endsmc@librecorrige\endsmc@exobasecorrige +% \end{macrocode} +% La correction des énigmes ne peut pas se faire strictement de la +% même façon puisqu'il n'y a pas de numéro d'exercice. C'est le seul +% point qui diffère. +% \begin{macrocode} +\newenvironment{smc@enigmecorrige} +{% + \addtocontents{cor}{% + \protect\inputcor{\smc@currpart}{\smc@thema@initcap\thechapter}{}% + }% + \killienc + \VerbatimEnvironment + \begin{VerbatimOut}{\PrefixeCorrection corr-\smc@currpart-\smc@thema@initcap\thechapter}} +{% + \end{VerbatimOut} +} +% \end{macrocode} +% La correction des TP se fait avec le numéro de TP +% \begin{macrocode} +\newenvironment{smc@TPcorrige} +{% + \addtocontents{cor}{% + \protect\inputcor{\smc@currpart}{\smc@thema@initcap\thechapter} + {\the\c@activite}% + }% + \killienc + \VerbatimEnvironment + \begin{VerbatimOut}{\PrefixeCorrection corr-\smc@currpart-\smc@thema@initcap\thechapter-\the\c@activite}} +{% + \end{VerbatimOut} +} +% \end{macrocode} +% \end{environment} +% \subsection{Exercices d'approfondissement} +% \begin{macro}{\exercicesappr} +% Cette macro introduit la partie \og Exercices d'approfondissement +% \fg{} dans un chapitre. Elle autorise l'utilisation des listes et +% des macros |\exercice| et |\correction| en dehors de tout +% environnement. +% \begin{macrocode} +\newcommand*\exercicesappr{% + \clearpage + \pagestyle{exercicesappr} + \addtocontents{cor}{\protect\smc@corrigeexercicesappr}% + \let\itemize\smc@exerciceitemize + \let\enditemize\endsmc@exerciceitemize + \let\colitemize\smc@exercicecolitemize + \let\endcolitemize\endsmc@exercicecolitemize + \let\enumerate\smc@exerciceenumerate + \let\endenumerate\endsmc@exerciceenumerate + \let\colenumerate\smc@exercicecolenumerate + \let\endcolenumerate\endsmc@exercicecolenumerate + \let\exercice\smc@exoapprexercice + \let\endexercice\endsmc@exoapprexercice + \let\corrige\smc@exoapprcorrige + \let\endcorrige\endsmc@exoapprcorrige + \let\correction\smc@nocorrection + \let\partie\smc@exercice@partie + \def\smc@currpart{ExoAppr}% +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\recreation} +% Cette macro introduit la partie \og Récréation, énigme \fg{} avec +% son bandeau. +% \begin{macrocode} +\newcommand*\recreation{% + \par\addvspace{\BeforeRecreationVSpace} + \begin{pspicture}(0,0)(\linewidth,\dimexpr\SquareWidth*3) + \psframe*[linewidth=0pt,linecolor=RecreationHeadFrame5Color] + (0,0)(\linewidth,\dimexpr\SquareWidth*3) + \psset{fillstyle=solid} + \smc@antidiagonal(0mm,0mm){RecreationHeadFrame} + \rput[Bl](\dimexpr \SquareWidth*4,\SquareWidth){% + \textcolor{RecreationHeadFrame0Color}{\RecreationFont \StringRecreation}% + } + \psset{linewidth=0pt} + \smc@putsquare(32,2){J1} + \smc@putsquare(33,0){H4} + \smc@putsquare(34,1){H2} + \smc@putsquare(37,1){F3} + \smc@putsquare(39,0){H2} + \smc@putsquare(42,2){J2} + \smc@putsquare(46,1){H4} + \end{pspicture} + \par\addvspace{\AfterRecreationVSpace} +} +% \end{macrocode} +% La macro suivante permet de limiter le code dans la macro +% précédente. Elle place un carré de la couleur indiquée en troisième +% argument à la position indiquée en unité |\SquareWidth| +% \begin{macrocode} +\def\smc@putsquare(#1,#2)#3{% + \rput(\dimexpr \SquareWidth*#1,\dimexpr \SquareWidth*#2) + {\psframe*[linecolor=#3](0,0)(\SquareWidth,\SquareWidth)} + \ignorespaces +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\Recreation} +% Cette macro propose une présentation avec les en-tête de page. Elle +% va fonctionner comme toutes les autres commandes de parties. +% \begin{macrocode} +\newcommand*\Recreation{% + \clearpage +% \end{macrocode} +% On modifie l'en-tête de page. +% \begin{macrocode} + \pagestyle{recreation} +% \end{macrocode} +% Contrairement aux autres parties, on ne redéfinit pas les listes et +% les exercices. Il s'agit en fait d'une parti fictive qui va prendre +% les valeurs de la partie en cours. On ne va même pas redéfinir la +% macro |\smc@currpart|. +% \begin{macrocode} +} +% \end{macrocode} +% \end{macro} +% \subsection{Je teste mes connaissances} +% \begin{macro}{\connaissances} +% Cette macro introduit la partie \og Je teste mes connaissances \fg{} +% dans un chapitre. Elle ne se comporte pas comme les autres parties +% de chapitre. Elle interdit l'utilisation des listes et des macros +% |\exercice| et |\correction| en dehors des environnements. +% \begin{macrocode} +\newcommand*\connaissances{% + \clearpage +% \end{macrocode} +% Les en-têtes et pieds de page sont spéciales (voire définition de +% |\ps@connaissances| et |\ps@firstconnaissances|). +% \begin{macrocode} + \pagestyle{connaissances} + \thispagestyle{firstconnaissances} + \addtocontents{cor}{\protect\smc@corrigeconnaissances}% + \let\itemize\smc@noitemize + \let\enditemize\endsmc@noitemize + \let\colitemize\smc@nocolitemize + \let\endcolitemize\endsmc@nocolitemize + \let\enumerate\smc@noenumerate + \let\endenumerate\endsmc@noenumerate + \let\colenumerate\smc@nocolenumerate + \let\endcolenumerate\endsmc@nocolenumerate +% \end{macrocode} +% Les exercices ne seront accessibles qu'une fois la macro +% |\QCMautoevaluation| appelée. Avant cette macro, il faut +% effectivement que les exercices soient interdits. +% \begin{macrocode} + \let\exercice\smc@noexercice + \let\endexercice\endsmc@noexercice + \let\corrige\smc@nocorrige + \let\endcorrige\endsmc@nocorrige + \let\correction\smc@nocorrection + \let\partie\smc@nopartie + \def\smc@currpart{Connaissances}% +} +% \end{macrocode} +% \end{macro} +% \begin{environment}{acquis} +% L'environnement |acquis| permet de composer la liste des capacités +% que l'élève doit avoir en fin de chapitre. Il se compose d'une +% phrase introductive suivi d'un cadre en double colonne où on compose +% la liste des capacités attendues. +% \begin{macrocode} +\newenvironment{acquis}{% + \par +% \end{macrocode} +% On commence par redéfinir les listes à puces. En théorie, cela ne +% sert à rien mais on va également définir les listes numérotées. +% \begin{macrocode} + \let\itemize\smc@acquisitemize + \let\enditemize\endsmc@acquisitemize + \let\colitemize\smc@acquiscolitemize + \let\endcolitemize\endsmc@acquiscolitemize + \let\enumerate\smc@acquisenumerate + \let\endenumerate\endsmc@acquisenumerate + \let\colenumerate\smc@acquiscolenumerate + \let\endcolenumerate\endsmc@acquiscolenumerate + \let\exercice\smc@noexercice + \let\endexercice\endsmc@noexercice + \let\corrige\smc@nocorrige + \let\endcorrige\endsmc@nocorrige + \let\correction\smc@nocorrection + \let\partie\smc@nopartie + \def\smc@currpart{Acquis}% +% \end{macrocode} +% Titre du cadre. +% \begin{macrocode} + {% + \AcquisTitleFont + \textcolor{AcquisTitleColor}{\StringAcquisTitle}% + \par\vspace{\AcquisTitleVSpace}% + }% +% \end{macrocode} +% Cadre lui même. L'environnement \environ{multicols} oblige à ajouter +% un espace vertical négatif. +% \begin{macrocode} + \smc@cadre{AcquisBkgColor} + \vspace*{-4.5pt} + \begin{multicols}{2} + \AcquisTextFont +} +{% + \end{multicols}% + \endsmc@cadre + \par +} +% \end{macrocode} +% \end{environment} +% \begin{macro}{\QCMautoevaluation} +% Macro d'introduction à la partie des QCM. Cela consiste à afficher +% le cartouche avec le texte \og QCM d'auto-évaluation \fg{} ainsi +% qu'un éventuel texte en gras au-dessous (passé en paramètre). +% \begin{macrocode} +\newcommand*\QCMautoevaluation[1]{% + \def\smc@currpart{QCM}% + \par\addvspace{\BeforeQCMAEVSpace} +% \end{macrocode} +% Le cadre est placé dans une minipage de la bonne largeur. On +% supprime tous les espacements entre les bords du cadre et on +% redéfinit |\FrameArc| pour que les arrondis du cadre se définissent +% avec 10/2 pour épouser les disques. +% \begin{macrocode} + \begingroup + \def\FrameSep{0pt}% + \edef\FrameArc{\QCMAETitleHeight}% + \minipage[b][\QCMAETitleHeight]{\QCMAETitleWidth}% + \begin{smc@cadre}[5,0,5,5]{QCMAEFrameColor}% + \minipage[b][\QCMAETitleHeight]{\QCMAETitleWidth}% +% \end{macrocode} +% Il reste un mini débord du cadre qu'on supprime en commençant +% l'image à |1pt| au lieu de |0| à gauche. +% \begin{macrocode} + \begin{pspicture}(1pt,0)(\QCMAETitleHeight,\QCMAETitleHeight) +% \end{macrocode} +% Les trois disques concentriques. Le plus grand faisant toute la +% hauteur, le plus petit deux tiers de la hauteur et celui du milieu à +% mi-chemin. +% \begin{macrocode} + \pscircle*[linecolor=QCMAETitleCircle1Color] + (\dimexpr\QCMAETitleHeight/2, + \dimexpr\QCMAETitleHeight/2) + {\dimexpr\QCMAETitleHeight/2} + \pscircle*[linecolor=QCMAETitleCircle2Color] + (\dimexpr\QCMAETitleHeight*5/12, + \dimexpr\QCMAETitleHeight*7/12) + {\dimexpr\QCMAETitleHeight*5/12} + \pscircle*[linecolor=QCMAETitleCircle3Color] + (\dimexpr\QCMAETitleHeight/3, + \dimexpr\QCMAETitleHeight*2/3) + {\dimexpr\QCMAETitleHeight/3} +% \end{macrocode} +% Le titre. +% \begin{macrocode} + \rput[Bl](\QCMAETitleLeftSpace,\dimexpr\QCMAETitleHeight/6) + {\textcolor{QCMAETitleColor}{\QCMAETitleFont\StringQCMAE}} + \end{pspicture}% + \endminipage + \end{smc@cadre} + \endminipage + \endgroup +% \end{macrocode} +% À la suite du cartouche, on place les lignes de référence au manuel +% numérique. +% \begin{macrocode} + \hspace*{\stretch{1}}% + \begin{minipage}[b]{\QCMAEManuelWidth} + \raggedright + \QCMAEManuelFont + \StringManuel + \par\vspace*{\AfterQCMAEManuelVSpace} + \end{minipage}% +% \end{macrocode} +% On affiche ensuite le logo. +% \begin{macrocode} + \hspace{\QCMAEManuelRightSpace}% + \raisebox{\AfterQCMAEManuelVSpace} + {\psscaleboxto(\AELogoManuelWidth,0){\LogoManuel}}% +% \end{macrocode} +% Il reste à placer un espace vertical, à afficher le texte en +% argument puis à placer un dernier espace vertical. +% \begin{macrocode} + \par\nobreak\vspace{\AfterQCMAETitleVSpace} + {\QCMAETextAfterTitleFont #1\par\nobreak} + \par\nobreak\addvspace{\AfterQCMAETextVSpace} +} +% \end{macrocode} +% \end{macro} +% \begin{environment}{QCM} +% L'environnement |QCM| regroupe un éventuel énoncé commun à plusieurs +% QCM et une série de plusieurs QCM. Le tout va être encadré par un +% cadre à bord arrondi en haut. +% \begin{macrocode} +\newenvironment{QCM}{% + \begin{lrbox}{\smc@boxa} + \minipage{\dimexpr\linewidth-\QCMLineWidth*2-\QCMFrameSep*2} +% \end{macrocode} +% On pose les nœuds du haut du cadre dès l'entrée dans la +% minipage. Pour que ces nœuds soient toujours correctement posés, on +% commence par faire une petite manœuvre de paragraphe +% \begin{macrocode} + \par\null + \pnode(\dimexpr -\QCMFrameSep-\QCMLineWidth/2, + \dimexpr \QCMFrameSep+\QCMLineWidth/2){A} + \pnode(\dimexpr \linewidth+\QCMFrameSep+\QCMLineWidth/2, + \dimexpr +\QCMFrameSep+\QCMLineWidth/2){B} + \par +} +{% +% \end{macrocode} +% En fin de minipage, on pose les nœuds du bas du cadre et ceux de +% milieu de cadre. +% \begin{macrocode} + \par\vspace{-\baselineskip} + \pnode(\dimexpr -\QCMFrameSep-\QCMLineWidth/2, + \dimexpr -\QCMFrameSep-\QCMLineWidth/2){C} + \pnode(\dimexpr \linewidth+\QCMFrameSep+\QCMLineWidth/2, + \dimexpr -\QCMFrameSep-\QCMLineWidth/2){D} + \psRelNode(A)(C){0.5}{AC} + \psRelNode(B)(D){0.5}{BD} + \endminipage + \end{lrbox} +% \end{macrocode} +% Le contenu de l'environnement est placé dans la boîte +% |\smc@boxa|. On place maintenant l'espace vertical qui précède. +% \begin{macrocode} + \par\addvspace{\BeforeQCMVSpace} +% \end{macrocode} +% On place ensuite la boîte en ayant pris soin de descendre de la +% distance correspondant à la largeur de ligne plus la séparation +% d'avec le cadre. +% \begin{macrocode} + \vspace{\dimexpr\QCMLineWidth+\QCMFrameSep} + \hspace*{\dimexpr\QCMLineWidth+\QCMFrameSep}% + \copy\smc@boxa +% \end{macrocode} +% On peut alors tracer le cadre. +% \begin{macrocode} + \psline[linewidth=\QCMLineWidth, linecolor=QCMLineColor](AC)(C)(D)(BD) + \psline[linewidth=\QCMLineWidth, linecolor=QCMLineColor, + linearc=\QCMLineArc](C)(A)(B)(D) +% \end{macrocode} +% On place alors l'espace vertical de compensation de la largeur de +% ligne et de l'espace d'avec le cadre l'espace après le groupe de QCM. +% \begin{macrocode} + \par\vspace{\dimexpr\QCMLineWidth+\QCMFrameSep} + \addvspace{\AfterQCMVSpace} +} +% \end{macrocode} +% \end{environment} +% \begin{environment}{EnonceCommunQCM} +% L'environnement |EnonceCommunQCM| permet d'avoir un chapeau pour un +% groupe de QCM. Il n'y a rien de spécial à ce niveau. +% \begin{macrocode} +\newenvironment{EnonceCommunQCM}{% +} +{% +} +% \end{macrocode} +% \end{environment} +% \begin{environment}{GroupeQCM} +% Dans cet environnement, on place l'ensemble des exercices d'un +% groupe. On va donc définir l'environnement exercice. +% \begin{macrocode} +\newenvironment{GroupeQCM}{% + \let\exercice\smc@QCMexercice + \let\endexercice\endsmc@QCMexercice + \let\corrige\smc@QCMcorrige + \let\endcorrige\endsmc@QCMcorrige +} +{% +} +% \end{macrocode} +% \end{environment} +% \begin{environment}{smc@QCMexercice} +% Environnement \environ{exercice} pour les QCM. C'est le même code +% que pour l'environnement \environ{exercice} de l'auto-évaluation. +% \begin{macrocode} +\newenvironment{smc@QCMexercice}{% + \par + \refstepcounter{exercice}% + \psframebox*[linestyle=none, linewidth=0pt, + fillcolor=QCMExoNumFrameColor, framesep=\QCMExoFrameTopSep]{% + \hbox to\dimexpr\QCMExoFrameWidth-\QCMExoFrameTopSep*2{% + \hss + \QCMExoNumFont + \textcolor{QCMExoNumColor}{\theexercice}% + \hss + }% + }% + \hspace{\AfterQCMExoFrameHSpace}% + \ignorespaces +} +{\par} +% \end{macrocode} +% \end{environment} +% \begin{environment}{ChoixQCM} +% L'environnement \environ{ChoixQCM} se comporte exactement comme un +% \environ{colenumerate} sauf que la façon de composer le numéro n'est +% pas le même (il n'y a qu'un seul niveau et les numéros sont +% encerclés et écrits alphabétiquement). +% +% Le nombre est composé sous forme d'une lettre encerclée. Le package +% \package{pifont} offre cette fonctionnalité à partir du code 172 +% (seulement jusqu'à 10). La macro de mise en forme peut être définie +% en dehors de l'environnement puisqu'elle servira toujours de la même +% façon. +% \begin{macrocode} +\newcounter{QCM} +\newcommand*\QCMLabel[1]{% + \textcolor{QCMItemNumColor} + {% + \QCMItemNumFont + \pscirclebox[linewidth=0.4pt, framesep=1pt, + linecolor=QCMItemNumColor, boxsep=true] + {\vphantom{dp}\@alph{#1}} + }% +}% +\newenvironment{ChoixQCM}[1]{% + \par\leavevmode +% \end{macrocode} +% Le reste ressemble au code général des \environ{colenumerate}. +% \begin{macrocode} + \def\smc@nbcolumn{#1}% + \smc@nbitem \z@ + \def\StringColCurrent{ChoixQCM}% + \toks@{}% + \smc@getbody +} +{% + \expandafter\smc@splititem\the\toks@\item\@nil\item + \smc@nbline \numexpr \smc@nbitem+\smc@nbcolumn-1 + \divide\smc@nbline \smc@nbcolumn + \multido{\n=1+1}{\smc@nbline}{% + \multido{\ni=\n+\the\smc@nbline}{\smc@nbcolumn}{% + \unless\ifnum\ni>\smc@nbitem + \makebox[\QCMLabelWidth]{\QCMLabel{\ni}\hss}% + \begin{minipage}[t]{\dimexpr + (\linewidth-\ListHSep*(\smc@nbcolumn-1))% + /\smc@nbcolumn-\QCMLabelWidth} + \strut\@nameuse{smc@item\ni}\strut + \end{minipage}% + \hspace{\ListHSep}% + \fi + }% +% \end{macrocode} +% Ici, contrairement aux environnement colenumerate normaux, on laisse +% un |\\| y compris à la dernière ligne pour avoir un grand espacement +% vertical après la liste. +% \begin{macrocode} + \\ + }% +} +% \end{macrocode} +% \end{environment} +% \subsection{Travaux pratiques} +% \begin{macro}{\TravauxPratiques} +% Cette macro introduit la partie \og Travaux pratiques \fg{} dans un +% chapitre. Elle interdit l'utilisation des listes et des macros +% |\exercice| et |\correction| en dehors des environnements. +% \begin{macrocode} +\newcommand*\TravauxPratiques{% + \clearpage + \pagestyle{TP} + \def\smc@currpart{TP}% +% \end{macrocode} +% Les TP utilisent le compteur |activite| qu'il faut donc +% réinitialiser. +% \begin{macrocode} + \setcounter{activite}{0}% +% \end{macrocode} +% Les parties sont composées de façon spéciales dans les TP. +% \begin{macrocode} + \let\partie\smc@TP@partie +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\DeclareTPLike} +% Les environnements de TP sont déclarées avec la macro +% |\DeclareTPLike|. Celle-ci demande quatre arguments : +% \begin{enumerate} +% \item le nom de l'environnement ; +% \item le titre affiché ; +% \item la couleur de la partie supérieure du cartouche ; +% \item la couleur de la partie inférieure du cartouche ; +% \item la couleur du titre et du losange de numéro. +% \end{enumerate} +% C'est exactement la syntaxe et le code de |\DeclareActivityLike|. +% \begin{macrocode} +\newcommand*\DeclareTPLike[5]{% + \expandafter\newcommand\csname#1\endcsname[1][]{% + \def\smc@activite@title{##1}% + \csname#1@aux\endcsname + }% + \expandafter\newcommand\csname#1@aux\endcsname[1][]{% + \par + \addvspace{\BeforeActiviteVSpace} + \refstepcounter{activite} + \setbox\smc@boxa=\hbox{% + \ActiviteTitleFont + #2% + }% + \begin{pspicture}(0,0) + (\dimexpr \ActiviteTitleLeftSpace+\wd\smc@boxa+\ActiviteTitleRightSpace+1.4142\ActiviteTitleTopHeight,\ActiviteTitleTopHeight) + \psframe*[linewidth=0, linecolor= #3] + (0,0)(\dimexpr\ActiviteTitleLeftSpace+\wd\smc@boxa+\ActiviteTitleRightSpace+0.7071\ActiviteTitleTopHeight, + \ActiviteTitleTopHeight) + \psframe*[linewidth=0, linecolor= #4] + (0,0)(\dimexpr\ActiviteTitleLeftSpace+\wd\smc@boxa+\ActiviteTitleRightSpace+0.7071\ActiviteTitleTopHeight, + -\ActiviteTitleBottomHeight) + \rput[l](\ActiviteTitleLeftSpace, + 0.5\dimexpr\ActiviteTitleTopHeight-\ActiviteTitleBottomHeight){% + \ActiviteTitleFont + \textcolor{#5}{#2}% + } + \rput + (\dimexpr\ActiviteTitleLeftSpace+\wd\smc@boxa+\ActiviteTitleRightSpace, + 0.5\dimexpr\ActiviteTitleTopHeight-\ActiviteTitleBottomHeight) + {% + \pspolygon*[linewidth=0, linecolor=#5] + (0,0) + (0.7071\ActiviteTitleTopHeight,0.7071\ActiviteTitleTopHeight) + (1.4142\ActiviteTitleTopHeight,0) + (0.7071\ActiviteTitleTopHeight,-0.7071\ActiviteTitleTopHeight) + \rput(0.7071\ActiviteTitleTopHeight,0){% + \ActiviteNumFont + \textcolor{ActiviteNumColor}{\theactivite}% + } + } + \end{pspicture}% + \hspace*{\AfterActiviteTitleHSpace}% + \@ifmtarg{##1} + {\setbox0=\hbox{}} + {\setbox0=\hbox{##1\ }}% + \minipage[t]{\dimexpr\linewidth-\ActiviteTitleLeftSpace-\wd\smc@boxa-\ActiviteTitleRightSpace-1.4142\ActiviteTitleTopHeight-\AfterActiviteTitleHSpace-\wd0} + \ActiviteSubtitleFont + \textcolor{ActiviteSubtitleColor}{\smc@activite@title}% + \endminipage + \@ifnotmtarg{##1}{\hfill##1}% + \par\vspace{\AfterActiviteTitleVSpace} + \let\itemize\smc@activiteitemize + \let\enditemize\endsmc@activiteitemize + \let\colitemize\smc@activitecolitemize + \let\endcolitemize\endsmc@activitecolitemize + \let\enumerate\smc@activiteenumerate + \let\endenumerate\endsmc@activiteenumerate + \let\colenumerate\smc@activitecolenumerate + \let\endcolenumerate\endsmc@activitecolenumerate +% \end{macrocode} +% Voici la seule différénce avec les activités : les parties ne sont +% pas composées de la même façon. +% \begin{macrocode} + \let\partie\smc@TP@partie + \let\exercice\smc@noexercice + \let\endexercice\endsmc@noexercice + \let\corrige\smc@nocorrige + \let\endcorrige\endsmc@nocorrige + \def\smc@currpart{Activite}% + \begin{changemargin}{\dimexpr\SquareWidth*4}{\ExtraMarginRight} + }% + \expandafter\def\csname end#1\endcsname{% + \end{changemargin} + }% +} +% \end{macrocode} +% \end{macro} +% \begin{environment}{TP} +% Les TP suivent très exactement les mêmes règles de composition que +% les activités. Il suffit de les déclarer de la même façon ! +% \begin{macrocode} +\DeclareTPLike{TP}{\StringTP} + {TPTopColor} + {TPBottomColor} + {TPTitleColor} +% \end{macrocode} +% \end{environment} +% \begin{environment}{enigme} +% Il s'agit de l'environnement permettant d'indiquer le texte d'une +% \emph{récréation, énigmes}. L'unique paramètre est le titre de l'énigme. +% \begin{macrocode} +\newenvironment{enigme}[1][]{% +% \end{macrocode} +% Les énigmes peuvent donner lieu à un corrigé, on prévoit une +% indication dans le fichier de correction +% \begin{macrocode} + \addtocontents{cor}{\protect\smc@corrigeenigme}% +% \end{macrocode} +% On redéfinit les listes et les parties. Les exercices ne sont pas +% permis. +% \begin{macrocode} + \let\itemize\smc@recreationitemize + \let\enditemize\endsmc@recreationitemize + \let\colitemize\smc@recreationcolitemize + \let\endcolitemize\endsmc@recreationcolitemize + \let\enumerate\smc@recreationenumerate + \let\endenumerate\endsmc@recreationenumerate + \let\colenumerate\smc@recreationcolenumerate + \let\endcolenumerate\endsmc@recreationcolenumerate + \let\exercice\smc@noexercice + \let\endexercice\endsmc@noexercice + \let\corrige\smc@nocorrige + \let\endcorrige\endsmc@nocorrige + \let\correction\smc@nocorrection + \let\partie\smc@recreation@partie + \def\smc@currpart{Enigme}% +% \end{macrocode} +% On affiche alors le titre s'il existe. +% \begin{macrocode} + \par + \@ifmtarg{#1}{}{% + {\RecreationTitleFont \textcolor{RecreationTitleColor}{#1}\par}% + } +% \end{macrocode} +% Il faut remettre le compteur de partie à zéro. +% \begin{macrocode} + \setcounter{partie}{0} +} +{\par} +% \end{macrocode} +% \end{environment} +% \subsection{partie} +% Il s'agit de sous-parties autorisées seulement dans certains +% environnements. Pour l'instant, seules les activités peuvent +% utiliser cette commande. +% \begin{macro}{\partie} +% On commence par définir la macro qui sera active en dehors des +% environnements autorisés. Elle ne fait que lever une erreur. +% \begin{macrocode} +\newcommand*\smc@nopartie{% + \ClassError{sesamanuel} + {La commande \string\partie\space est interdite ici.} + {Reportez-vous à la documentation pour + l'utilisation de la macro \string\partie.}% +} +\let\partie\smc@nopartie +% \end{macrocode} +% \end{macro} +% \begin{macro}{\smc@activite@partie} +% La macro |\smc@activite@partie| est le code de la macro |\partie| +% dans les environnements de type |activite|. +% \begin{macrocode} +\newcommand*\smc@activite@partie[1][]{% +% \end{macrocode} +% Les trois sauvegardes suivantes permettent d'utiliser les +% présentations des parties dans des références. +% \begin{macrocode} + \colorlet{smc@curr@partiecolor}{ActivitePartieColor}% + \colorlet{smc@curr@partiebkgcolor}{Blanc}% + \let\smc@curr@partiefont\ActivitePartieFont +% \end{macrocode} +% On commence ensuite le code réel de la commande |\partie|. +% \begin{macrocode} + \par\addvspace{\BeforeActivitePartieVSpace} + \refstepcounter{partie}% + \@ifmtarg{#1} + {% + \textcolor{ActivitePartieColor} + {\ActivitePartieFont \StringPartie{} \thepartie} + } + {% + \textcolor{ActivitePartieColor} + {\ActivitePartieFont \StringPartie{} \thepartie{} : #1} + } + \par\nobreak\addvspace{\AfterActivitePartieVSpace} +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\smc@exercice@partie} +% La macro |\smc@exercice@partie| est le code de la macro |\partie| +% dans les exercices. +% \begin{macrocode} +\newcommand*\smc@exercice@partie[1][]{% + \colorlet{smc@curr@partiecolor}{ExercicePartieColor}% + \colorlet{smc@curr@partiebkgcolor}{Blanc}% + \let\smc@curr@partiefont\ExercicePartieFont + \par\addvspace{\BeforeExercicePartieVSpace} + \refstepcounter{partie}% + \@ifmtarg{#1} + {% + \textcolor{ExercicePartieColor} + {\ExercicePartieFont \textsc{\StringPartie} \Alph{partie}} + } + {% + \textcolor{ExercicePartieColor} + {\ExercicePartieFont \textsc{\StringPartie} \Alph{partie} : #1} + } + \par\nobreak\addvspace{\AfterExercicePartieVSpace} +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\smc@TP@partie} +% La macro |\smc@TP@partie| est le code de la macro |\partie| dans +% les TP. +% \begin{macrocode} +\newcommand*\smc@TP@partie[1]{% + \colorlet{smc@curr@partiecolor}{TPPartieNumColor}% + \colorlet{smc@curr@partiebkgcolor}{TPPartieBkgColor}% + \let\smc@curr@partiefont\TPPartieFont + \par\addvspace{\BeforeTPPartieVSpace} + \refstepcounter{partie}% + \leavevmode + \hbox to\z@{% + \hss + \psframebox[linestyle=none, linewidth=0pt, fillstyle=solid, + fillcolor=TPPartieBkgColor] + {\textcolor{TPPartieNumColor}{\TPPartieFont \thepartie}}% + \hspace*{\TPPartieHSep}% + }% + \textcolor{TPPartieColor}{\TPPartieFont #1} + \par\nobreak\addvspace{\AfterTPPartieVSpace} +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\smc@recreation@partie} +% La macro |\smc@recreation@partie| est le code de la macro |\partie| dans +% la partie Récréation, énigmes. +% \begin{macrocode} +\newcommand*\smc@recreation@partie[1][]{% + \colorlet{smc@curr@partiecolor}{RecreationPartieColor}% + \colorlet{smc@curr@partiebkgcolor}{Blanc}% + \let\smc@curr@partiefont\RecreationPartieFont + \par\addvspace{\BeforeRecreationPartieVSpace} + \refstepcounter{partie}% + \@ifmtarg{#1} + {% + \textcolor{RecreationPartieColor} + {\RecreationPartieFont \StringPartie{} \Alph{partie}} + } + {% + \textcolor{RecreationPartieColor} + {\RecreationPartieFont \StringPartie{} \Alph{partie} :} + \textcolor{RecreationPartieColor}{\RecreationPartieTitleFont #1} + } + \par\nobreak\addvspace{\AfterRecreationPartieVSpace} +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\smc@annexe@partie} +% La macro |\smc@annexe@partie| est le code de la macro |\partie| +% pour les annexes (en fait pour les exercices des annexes). +% \begin{macrocode} +\newcommand\smc@annexe@partie[1][]{% + \colorlet{smc@curr@partiecolor}{AnnexePartieColor}% + \colorlet{smc@curr@partiebkgcolor}{Blanc}% + \let\smc@curr@partiefont\AnnexePartieFont + \par\addvspace{\BeforeAnnexePartieVSpace} + \refstepcounter{partie}% + \@ifmtarg{#1} + {% + \textcolor{AnnexePartieColor} + {\AnnexePartieFont \textsc{\StringPartie} \Alph{partie}} + } + {% + \textcolor{AnnexePartieColor} + {\AnnexePartieFont \textsc{\StringPartie} \Alph{partie} : #1} + } + \par\nobreak\addvspace{\AfterAnnexePartieVSpace} +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\smc@libre@partie} +% La macro |\smc@libre@partie| est le code de la macro |\partie| +% pour les textes libres. +% \begin{macrocode} +\newcommand\smc@libre@partie[1][]{% + \colorlet{smc@curr@partiecolor}{LibrePartieColor}% + \colorlet{smc@curr@partiebkgcolor}{Blanc}% + \let\smc@curr@partiefont\LibrePartieFont + \par\addvspace{\BeforeLibrePartieVSpace} + \refstepcounter{partie}% + \@ifmtarg{#1} + {% + \textcolor{LibrePartieColor} + {\LibrePartieFont \textsc{\StringPartie} \Alph{partie}} + } + {% + \textcolor{LibrePartieColor} + {\LibrePartieFont \textsc{\StringPartie} \Alph{partie} : #1} + } + \par\nobreak\addvspace{\AfterLibrePartieVSpace} +} +% \end{macrocode} +% \end{macro} +% \section{Annexes} +% \subsection{Corrigés} +% \begin{macro}{\AfficheCorriges} +% Dans cette partie, on affiche l'ensemble des corrections du +% livre. Tout se fait avec la seule macro |\AfficheCorriges|. Celle-ci +% accepte un argument optionnel indiquant le nombre de colonnes sur +% lesquelles seront composés les corrigés. Pour avoir un maximum de +% souplesse, la valeur par défaut sera stockée dans la variable +% publique |\NombreColonnesCorriges|. La classe fixe à 3 cette valeur +% par défaut. On a également une variable publique +% |\PrefixeCorrection| dont le but est de préfixer les noms des +% fichiers de correction (par exemple par un nom de répertoire). +% \begin{macrocode} +\newcommand*\NombreColonnesCorriges{3} +\newcommand*\PrefixeCorrection{} +\newcommand*\AfficheCorriges[1][\NombreColonnesCorriges]{% +% \end{macrocode} +% On commence par changer de page et indiquer les styles de page à +% utiliser pour la suite. On va également poser une étiquette pour +% permettre le référencement de la page de manière automatique. +% \begin{macrocode} + \clearpage + \label{toutes-solutions} + \pagestyle{corrige} + \thispagestyle{firstcorrige} +% \end{macrocode} +% On compose le titre de l'annexe. +% \begin{macrocode} + \rput[Bl](0,9mm){\CorrigeTitleFont \MakeUppercase{\StringCorriges}} + \vspace*{-5mm} +% \end{macrocode} +% Enfin, on ouvre l'environnement de colonnage avant d'appeler le +% fichier externe de correction. +% \begin{macrocode} + \begingroup + \columnsep \dimexpr \SquareWidth*2 + \columnseprule \CorrigeRuleWidth + \def\columnseprulecolor{\color{ExerciceColumnRuleColor}}% +% \end{macrocode} +% Avant d'ouvrir le muticolonnage, on mémorise le nombre de colonnes +% (cela servira plus tard pour les QCM). +% \begin{macrocode} + \xdef\smc@NbColonneCorrige{#1}% + \ifnum#1>\@ne + \begin{multicols}{#1}% + \@starttoc{cor} + \end{multicols} + \vfill~\par + \else + \@starttoc{cor} + \vfill~\par + \fi + \endgroup +} +% \end{macrocode} +% \end{macro} +% Le fichier de correction va comporter un certain nombre de commandes +% particulières qu'on définit ici. +% \begin{macro}{\smc@corrigechapter} +% Affiche les chapitres dans l'annexe des corrigés. Le premier +% paramètre contient le texte \og Chapitre \fg où le +% || est l'abréviation du type de chapitre (Fonction, Géométrie +% ou statistique), le deuxième le titre du chapitre, le troisième la +% couleur de cadre et de titre et le quatrième la couleur du texte +% dans le cadre. +% \begin{macrocode} +\newcommand*\smc@corrigechapter[4]{% +% \end{macrocode} +% Avant de procéder à la composition du titre de chapitre, on +% initialise le fait que les environnements |exercice| et |corrige| +% ainsi que la macro |\correction| seront interdits à l'intérieur d'un +% corrigé ! +% \begin{macrocode} + \let\exercice\smc@noexercice + \let\endexercice\endsmc@noexercice + \let\corrige\smc@nocorrige + \let\endcorrige\endsmc@nocorrige + \let\correction\smc@nocorrection +% \end{macrocode} +% On place le saut vertical avant le titre puis dans l'ordre, le cadre +% avec le mot Chapitre puis le titre de l'exercice. +% \begin{macrocode} + \par\addvspace{\BeforeCorrigeChapterVspace} + \begin{pspicture}(0,0)(\linewidth,4.5mm) + \psframe[linestyle=none, linewidth=0pt, + fillstyle=solid, fillcolor=#3] + (0,0)(\linewidth,4.5mm) + \rput[B](0.5\linewidth,1mm){% + \textcolor{#4}{\CorrigeChapterFont #1}% + } + \end{pspicture}% + \\[-1mm] + {% + \centering + \color{#3} + \CorrigeChapterFont \smc@nobsbs{#2} + \par\nobreak + }% +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\smc@corrigeautoeval} +% Affiche le titre pour les auto-évaluations. En réalité, le titre +% n'est pas immédiatement affiché. Il est placé dans la macro +% |\smc@BeforeCorrige| qui comporte un mécanisme +% d'auto-destruction. Cette macro sera systématiquement appelée par +% chaque corrigé d'exercice. Ainsi, avant d'afficher le premier +% exercice, le titre sera composé et ne le sera plus pour les +% exercices suivant. S'il n'y a aucun corrigé dans la partie, il n'y +% aura pas de titre affiché du tout. +% \begin{macrocode} +\newcommand\smc@corrigeautoeval{% +% \end{macrocode} +% On commence par indiquer les façon de composer les listes et les +% parties. On indique également la partie en cours. Pour l'instant, la +% partie en cours ne sert à rien à ce niveau mais c'est une précaution +% pour l'avenir. +% \begin{macrocode} + \let\itemize\smc@corrAEitemize + \let\enditemize\endsmc@corrAEitemize + \let\colitemize\smc@AEcolitemize + \let\endcolitemize\endsmc@AEcolitemize + \let\enumerate\smc@corrAEenumerate + \let\endenumerate\endsmc@corrAEenumerate + \let\colenumerate\smc@AEcolenumerate + \let\endcolenumerate\endsmc@AEcolenumerate + \let\partie\smc@nopartie + \def\smc@currpart{CorrigeAE}% +% \end{macrocode} +% On définit maintenant la macro à double détente. On commence par la +% première détente : la composition du titre. +% \begin{macrocode} + \def\smc@BeforeCorrige{% + \par\addvspace{\BeforeCorrigePartieTitleVSpace} + \textcolor{CorrigeAETitleColor} + {\CorrigePartieFont \StringAE} + \par\nobreak +% \end{macrocode} +% Vient ensuite la deuxième détente : la redéfinition de la macro par +% elle-même pour n'être qu'un alias de |\par| +% \begin{macrocode} + \def\smc@BeforeCorrige{\par}% + }% +% \end{macrocode} +% La dernière chose à préciser est la couleur des cadres des numéros +% d'exercice. +% \begin{macrocode} + \colorlet{CorrigeNumExerciceFrameBkg}{J1}% + \colorlet{CorrigeNumExerciceFrameTxt}{Blanc}% +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\smc@corrigeactivite} +% C'est la même chose que précédemment pour les corrigés des +% activités. +% \begin{macrocode} +\newcommand\smc@corrigeactivite{% + \let\itemize\smc@noitemize + \let\enditemize\endsmc@noitemize + \let\colitemize\smc@nocolitemize + \let\endcolitemize\endsmc@nocolitemize + \let\enumerate\smc@noenumerate + \let\endenumerate\endsmc@noenumerate + \let\colenumerate\smc@nocolenumerate + \let\endcolenumerate\endsmc@nocolenumerate + \def\smc@currpart{CorrectionActivite}% + \def\smc@BeforeCorrige{% + \par\addvspace{\BeforeCorrigePartieTitleVSpace} + \textcolor{CorrigeActiviteTitleColor} + {\CorrigePartieFont \StringACTIVITE} + \par\nobreak + \def\smc@BeforeCorrige{\par}% + }% + \colorlet{CorrigeNumExerciceFrameBkg}{J1}% + \colorlet{CorrigeNumExerciceFrameTxt}{Blanc}% +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\smc@corrigeexercicesbase} +% Idem pour les corrigés de la partie exercices de base. +% \begin{macrocode} +\newcommand\smc@corrigeexercicesbase{% + \let\itemize\smc@correxerciceitemize + \let\enditemize\endsmc@correxerciceitemize + \let\colitemize\smc@exercicecolitemize + \let\endcolitemize\endsmc@exercicecolitemize + \let\enumerate\smc@correxerciceenumerate + \let\endenumerate\endsmc@correxerciceenumerate + \let\colenumerate\smc@exercicecolenumerate + \let\endcolenumerate\endsmc@exercicecolenumerate + \let\partie\smc@exercice@partie + \def\smc@currpart{CorrigeExoBase}% + \def\smc@BeforeCorrige{% + \par\addvspace{\BeforeCorrigePartieTitleVSpace} + \textcolor{CorrigeExercicesBaseTitleColor} + {\CorrigePartieFont \StringExercicesBase} + \par\nobreak + \def\smc@BeforeCorrige{\par}% + }% + \colorlet{CorrigeNumExerciceFrameBkg}{J1}% + \colorlet{CorrigeNumExerciceFrameTxt}{Blanc}% +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\smc@corrigeexercicesappr} +% Idem pour les corrigés de la partie exercices d'approfondissement. +% \begin{macrocode} +\newcommand\smc@corrigeexercicesappr{% + \let\itemize\smc@correxerciceitemize + \let\enditemize\endsmc@correxerciceitemize + \let\colitemize\smc@exercicecolitemize + \let\endcolitemize\endsmc@exercicecolitemize + \let\enumerate\smc@correxerciceenumerate + \let\endenumerate\endsmc@correxerciceenumerate + \let\colenumerate\smc@exercicecolenumerate + \let\endcolenumerate\endsmc@exercicecolenumerate + \let\partie\smc@exercice@partie + \def\smc@currpart{CorrigeExoAppr}% + \def\smc@BeforeCorrige{% + \par\addvspace{\BeforeCorrigePartieTitleVSpace} + \textcolor{CorrigeExercicesApprTitleColor} + {\CorrigePartieFont \StringExercicesAppr} + \par\nobreak + \def\smc@BeforeCorrige{\par}% + }% + \colorlet{CorrigeNumExerciceFrameBkg}{J1}% + \colorlet{CorrigeNumExerciceFrameTxt}{Blanc}% +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\smc@corrigeconnaissances} +% Idem pour les corrigés de la partie Je teste mes connaissances (QCM). +% \begin{macrocode} +\newcommand\smc@corrigeconnaissances{% + \let\itemize\smc@noitemize + \let\enditemize\endsmc@noitemize + \let\colitemize\smc@nocolitemize + \let\endcolitemize\endsmc@nocolitemize + \let\enumerate\smc@noenumerate + \let\endenumerate\endsmc@noenumerate + \let\colenumerate\smc@nocolenumerate + \let\endcolenumerate\endsmc@nocolenumerate + \let\partie\smc@nopartie + \def\smc@currpart{CorrigeConnaissances}% +% \end{macrocode} +% La macro effectuée à chaque passage à l'exercice suivant ne comporte +% pas de saut de paragraphe. En fait, chaque corrigé va être inclu +% dans une boîte du tiers de l'empagement pour avoir trois corrigés +% par ligne. +% \begin{macrocode} + \def\smc@BeforeCorrige{% + \par\addvspace{\BeforeCorrigePartieTitleVSpace} + \textcolor{CorrigeConnaissancesTitleColor} + {\CorrigePartieFont \StringConnaissances} + \par\nobreak + \def\smc@BeforeCorrige{}% + }% + \colorlet{CorrigeNumExerciceFrameBkg}{J1}% + \colorlet{CorrigeNumExerciceFrameTxt}{Blanc}% +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\smc@corrigeenigme} +% Idem pour les corrigés des énigmes. +% \begin{macrocode} +\newcommand\smc@corrigeenigme{% + \let\itemize\smc@corrrecreationitemize + \let\enditemize\endsmc@corrrecreationitemize + \let\colitemize\smc@recreationcolitemize + \let\endcolitemize\endsmc@recreationcolitemize + \let\enumerate\smc@corrrecreationenumerate + \let\endenumerate\endsmc@corrrecreationenumerate + \let\colenumerate\smc@recreationcolenumerate + \let\endcolenumerate\endsmc@recreationcolenumerate + \let\partie\smc@recreation@partie + \def\smc@currpart{CorrigeEnigme}% + \def\smc@BeforeCorrige{% + \par\addvspace{\BeforeCorrigePartieTitleVSpace} + \textcolor{CorrigeEnigmeTitleColor} + {\CorrigePartieFont \StringEnigme} + \par\nobreak + \def\smc@BeforeCorrige{\par}% + }% + \colorlet{CorrigeNumExerciceFrameBkg}{J1}% + \colorlet{CorrigeNumExerciceFrameTxt}{Blanc}% +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\smc@corrigelibre} +% Pour les textes libres, les choses sont assez différentes. Le +% début est identique : on modifie les listes +% \begin{macrocode} +\newcommand\smc@corrigelibre{% + \let\itemize\smc@corrlibreitemize + \let\enditemize\endsmc@corrlibreitemize + \let\colitemize\smc@librecolitemize + \let\endcolitemize\endsmc@librecolitemize + \let\enumerate\smc@corrlibreenumerate + \let\endenumerate\endsmc@corrlibreenumerate + \let\colenumerate\smc@librecolenumerate + \let\endcolenumerate\endsmc@librecolenumerate + \let\partie\smc@exercice@partie + \def\smc@currpart{Libre}% +% \end{macrocode} +% En revanche, ensuite, on n'affiche strictement rien +% \begin{macrocode} + \def\smc@BeforeCorrige{% + \par + }% + \colorlet{CorrigeNumExerciceFrameBkg}{J1}% + \colorlet{CorrigeNumExerciceFrameTxt}{Blanc}% +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\inputcor} +% Macro permettant le chargement d'un fichier de correction indiqué +% par les trois paramètres : +% \begin{itemize} +% \item le type de la partie en cours ; +% \item le numéro de chapitre ; +% \item le numéro d'exercice. +% \end{itemize} +% Ces trois paramètres vont permettre de reconstituer le nom du +% fichier à charger. +% \begin{macrocode} +\newcommand*\inputcor[3]{% +% \end{macrocode} +% On commence par composer soit le titre de la partie en cours, soit +% un saut de paragraphe seul (soit rien pour les QCM). +% \begin{macrocode} + \smc@BeforeCorrige +% \end{macrocode} +% Si on est dans les corrections de QCM, on doit composer la +% correction dans des minipages de la moitié de la largeur +% d'empagement moins la largeur de séparation. et du tiers de la +% largeur de l'empagement si on est en corrigé sur deux colonnes. +% \begin{macrocode} + \def\smc@arg{#1}% + \ifx\smc@arg\StringQCM + \ifnum\smc@NbColonneCorrige=2 + \edef\smc@LargeurColonneCorrige + {\the\dimexpr \linewidth/3-\QCMHSep}% + \else + \edef\smc@LargeurColonneCorrige + {\the\dimexpr \linewidth/2-\QCMHSep}% + \fi + \minipage[t]{\smc@LargeurColonneCorrige}% + \fi +% \end{macrocode} +% On affiche alors le numéro d'exercice dans un cadre. +% \begin{macrocode} + \@ifmtarg{#3}{}{% + \begin{pspicture}(0,0)(5mm,2.5mm) + \psframe[linestyle=none, linewidth=0pt, + fillstyle=solid, fillcolor=CorrigeNumExerciceFrameBkg] + (0,-0.5mm)(5mm,2.5mm) + \rput[B](2.5mm,0){% + \textcolor{CorrigeNumExerciceFrameTxt} + {\CorrigeNumExerciceFont #3}% + } + \end{pspicture} + }% +% \end{macrocode} +% On charge ensuite la correction de l'exercice. Il faut alors +% reconstruire le nom du fichier. Le seul point à prendre en compte +% est que sur un troisième argument vide, on n'a pas de trait d'union +% entre le numéro de chapitre et le numéro d'exercice. Pour des +% raisons de mise en page, on compose les réponses dans une minipage +% de la largeur d'empagement en cours moins la largeur du cadre du +% numéro d'exercice. Le 6.5mm est le 5mm de la largeur du cadre plus +% une petite goutière de séparation. On ajoute également +% systématiquement un |\strut| à la fin de l'inclusion pour que la +% minipage ne donne pas un interlignage anormal sur la dernière +% ligne. +% \begin{macrocode} + \hfill\begin{minipage}[t]{\linewidth-6.5mm} + \raggedright + \@ifmtarg{#3} + {\input{\PrefixeCorrection corr-#1-#2}\strut} + {\input{\PrefixeCorrection corr-#1-#2-#3}\strut}% + \end{minipage} +% \end{macrocode} +% Si c'est une correction de QCM, on ferme la minipage et on place un +% espace |\QCMHSep|. Il faut redéfinir |\smc@arg| car il peut être +% modifié par l'appel des corrigés. +% \begin{macrocode} + \def\smc@arg{#1}% + \ifx\smc@arg\StringQCM + \endminipage + \hspace{\QCMHSep}% + \else + \par\vfil + \fi +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\Coupe} +% Macro permettant une coupure de colonne au niveau des solutions. +% \begin{macrocode} +\newcommand\Coupe{% + \strut + \end{minipage} + \par\hfill + \begin{minipage}[t]{\linewidth-6.5mm} +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\reponseQCM} +% Macro pour indiquer une réponse de QCM. Il s'agit uniquement de la +% ou des réponse(s) placée(s) dans un cercle. En fait, l'argument peut +% être une suite de lettres. Chacune doit être encerclée. Il faut donc +% lire l'argument caractère par caractère. On appelle donc la macro +% auxiliaire |\smc@reponseQCM| en plaçant la balise de fin |\@nil|. +% \begin{macrocode} +\newcommand\reponseQCM[1]{% + \smc@reponseQCM#1\@nil +} +% \end{macrocode} +% |\smc@reponseQCM| ne traite qu'une seule lettre (ASCII). +% \begin{macrocode} +\def\smc@reponseQCM#1{% + \def\smc@arg{#1}% +% \end{macrocode} +% Si la balise de fin est rencontrée, on ne fait strictement rien +% \begin{macrocode} + \ifx\smc@arg\@nnil + \else +% \end{macrocode} +% Sinon, on entoure la lettre lue\ldots +% \begin{macrocode} + \textcolor{CorrigeQCMItemNumColor} + {% + \CorrigeQCMItemNumFont + \pscirclebox[linewidth=0.4pt, framesep=1pt, + linecolor=CorrigeQCMItemNumColor, boxsep=true] + {\vphantom{dp}#1}% + } +% \end{macrocode} +% \ldots{} et on procède à un appel récursif. +% \begin{macrocode} + \expandafter\smc@reponseQCM + \fi +} +% \end{macrocode} +% \end{macro} +% \subsection{Annexes générales} +% Initialement la maquette présentait cette annexe pour énoncer des +% \og propriétés pour démontrer en géométrie \fg{}. On va généraliser +% un peu cette possibilité en laissant le titre libre, en +% redéfinissant les commandes de sectionnement et en fournissant un +% environnement pour les énoncés sur trois colonnes (\emph{a priori} +% une figure, la propriété et une remarque). +% +% Pour garder toute sa généralité à la macro |\annexe|, il faut +% l'accompagner d'une macro permettant de modifier les couleurs des +% bandeaux de bord de page et de section. On va commencer par définir +% cette macro et l'appeler immédiatement avec les couleurs indiquées +% par défaut dans la maquette. +% \begin{macro}{\ChangeAnnexe} +% \begin{macrocode} +\newcommand*\ChangeAnnexe[4]{% + \colorlet{AnnexeHeadFrameColor}{#1}% + \colorlet{AnnexeSectionRuleColor}{#2}% + \colorlet{AnnexeItemColor}{#2}% + \colorlet{AnnexeExerciceCorrigeNumFrameColor}{#2}% + \colorlet{AnnexeExerciceNumFrameColor}{#2}% + \colorlet{AnnexeSectionTitleColor}{#3}% + \colorlet{AnnexeExerciceTitleColor}{#3} + \colorlet{AnnexeExerciceNumColor}{#4} +} +% \end{macrocode} +% On appelle maintenant cette macro avec les couleurs par défaut de la +% maquette. +% \begin{macrocode} +\ChangeAnnexe{G3}{A1}{G1}{Blanc} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\annexe} +% On peut maintenant définir la macro |\annexe|. L'argument est le +% titre de l'annexe. Avant cela on définit un certain nombre de +% compteur à initialiser à ce niveau. +% \begin{macrocode} +\newcounter{propriete} +\newcommand*\annexe[1]{% + \let\itemize\smc@annexeitemize + \let\enditemize\endsmc@annexeitemize + \let\colitemize\smc@annexecolitemize + \let\endcolitemize\endsmc@annexecolitemize + \let\enumerate\smc@annexeenumerate + \let\endenumerate\endsmc@annexeenumerate + \let\colenumerate\smc@annexecolenumerate + \let\endcolenumerate\endsmc@annexecolenumerate + \let\partie\smc@nopartie + \let\exercice\smc@annexeexercice + \let\endexercice\endsmc@annexeexercice + \let\corrige\smc@nocorrige + \let\endcorrige\endsmc@nocorrige + \let\section\smc@annexesection + \def\smc@currpart{Annexe}% + \setcounter{propriete}{0}% + \setcounter{exercice}{0}% +% \end{macrocode} +% On commence par changer de page et indiquer les styles de page à +% utiliser pour la suite. +% \begin{macrocode} + \clearpage + \pagestyle{annexe} + \thispagestyle{firstannexe} +% \end{macrocode} +% On compose le titre de l'annexe. +% \begin{macrocode} + \vspace*{\BeforeAnnexeTitleVSpace} + {\raggedright \AnnexeTitleFont \MakeUppercase{#1}\par} + \addvspace{\AfterAnnexeTitleVSpace} +% \end{macrocode} +% On sauvegarde le titre pour les pieds de page. +% \begin{macrocode} + \def\smc@TitleAnnexe{#1}% +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\ListeProprietes} +% On garde quasiment le même code que pour la macro |\propriete| +% interne au tableau de type |pr| mais on lui donne un argument au +% lieu du texte \og Propriété \fg avec le numéro. +% \begin{macrocode} +\newcommand*\ListeProprietes[1]{% + \psframebox*[fillcolor=TablePropertyTitleBkgColor]{% + \ProprieteFont + \textcolor{TablePropertyTitleTextColor} + {\MakeUppercase{\StringPropriete}~#1}% + }% +} +% \end{macrocode} +% \end{macro} +% \begin{environment}{smc@annexeexercice} +% Exercice pour la partie annexe. On commence par regarder s'il y a +% une étoile. +% \begin{macrocode} +\newcommand*\smc@annexeexercice{% + \@ifstar + {% + \smc@exercicecorrigetrue + \smc@@annexeexercice + } + {% + \smc@exercicecorrigefalse + \smc@@annexeexercice + } +} +% \end{macrocode} +% On lit ensuite le premier argument optionnel. +% \begin{macrocode} +\newcommand*\smc@@annexeexercice[1][]{% +% \end{macrocode} +% On sauvegarde le texte du titre est on appelle la macro auxiliaire +% pour lire le deuxième argument optionnel. +% \begin{macrocode} + \def\smc@exercicetitle{#1}% + \smc@@@annexeexercice +} +\newcommand*\smc@@@annexeexercice[1][]{% +% \end{macrocode} +% On commence par passer au paragraphe suivant et réinitialiser le compteur +% partie ainsi que la façon de composer les parties. +% \begin{macrocode} + \par\addvspace{\BeforeExerciceVSpace} + \let\partie\smc@annexe@partie + \setcounter{partie}{0} +% \end{macrocode} +% La présence d'un logo va faire qu'on ne composera pas le titre (ou +% le texte) de la même façon. S'il y a un logo, on utilise la commande +% |\parpic| pour habiller le logo. Sinon on ne fait rien de spécial. +% \begin{macrocode} + \@ifnotmtarg{#1}{% + \setbox0=\hbox{#1}% + \parpic[r]{\makebox[\wd0][l]{{#1}}} + }% +% \end{macrocode} +% On compose le numéro de l'exercice. La couleur du cadre dépend du +% fait que l'exercice est corrigé ou non. En fait, pour l'instant, les +% exercices de la partie annexe ne seront pas corrigés et il n'y aura +% qu'une seule couleur : celle du liseré. À part les couleurs, on +% garde les mêmes macros de fonte et de longueurs que pour les +% exercices des chapitres normaux. +% \begin{macrocode} + \refstepcounter{exercice}% + \begin{pspicture}(0,0)(\ExerciceNumFrameWidth,\ExerciceNumFrameHeight) + \ifsmc@exercicecorrige + \psframe*[linewidth=0pt, + linecolor=AnnexeExerciceCorrigeNumFrameColor] + (0,-\ExerciceNumFrameDepth) + (\ExerciceNumFrameWidth,\ExerciceNumFrameHeight) + \else + \psframe*[linewidth=0pt, + linecolor=AnnexeExerciceNumFrameColor] + (0,-\ExerciceNumFrameDepth) + (\ExerciceNumFrameWidth,\ExerciceNumFrameHeight) + \fi + \rput[B](\dimexpr\ExerciceNumFrameWidth/2,0){% + \textcolor{AnnexeExerciceNumColor}{\ExerciceNumFont \theexercice}% + } + \end{pspicture}% +% \end{macrocode} +% Y a-t-il un titre d'exercice ? +% \begin{macrocode} + \ifx\smc@exercicetitle\empty +% \end{macrocode} +% S'il n'y a pas de titre, on commence le texte de l'exercice (après +% un certain espacement horizontal). +% \begin{macrocode} + \hspace{\ExerciceTextHSep}% + \else +% \end{macrocode} +% S'il y a un titre, on le compose et on passe au paragraphe suivant. +% \begin{macrocode} + \hspace{\ExerciceTextHSep}% + \textcolor{AnnexeExerciceTitleColor} + {\ExerciceTitleFont \smc@exercicetitle}% + \par\nobreak + \fi +} +% \end{macrocode} +% En fait, on utilisera plutôt la forme d'environnement pour entrer +% les exercices. Le code terminal ne fait que placer un |\par| (cela +% peut être utile pour activer un éventuel |\centering| en fin de +% code. +% \begin{macrocode} +\def\endsmc@annexeexercice{\par} +% \end{macrocode} +% \end{environment} +% \begin{macro}{\smc@annexesection} +% Les annexes redéfinissent la macro |\section|. Pour cela on la +% stocke sous la forme de la macro |\smc@annexesection|. Au départ, on +% la définit comme une macro |\section| habituelle, en particulier, on +% autorise la forme étoilée (même si pour l'instant elle n'apporte +% rien de plus que la forme non étoilée). +% \begin{macrocode} +\newcommand*\smc@annexesection{% + \@ifstar{\smc@annexesec}{\smc@annexesec}% +} +\newcommand*\smc@annexesec[2][]{% +% \end{macrocode} +% On commence par regarder si l'argument optionnel est vide. Si oui, +% le titre court sera égal au titre long. +% \begin{macrocode} + \ifx\relax#1\relax + \smc@@annexesec{#2}{#2}% + \else + \smc@@annexesec{#1}{#2}% + \fi +} +% \end{macrocode} +% À ce stade, on a un titre court en premier argument et un titre long +% en deuxième argument. Le travail effectif peut commencer. +% \begin{macrocode} +\newcommand*\smc@@annexesec[2]{% + \par\goodbreak\addvspace{\BeforeAnnexeSectionVSpace}% +% \end{macrocode} +% Le titre court sera éventuellement utilisé pour une TDM. Ce sera à +% voir plus tard. +% \begin{macrocode} + \@ifmtarg{#1}{}{}% +% \end{macrocode} +% On compose le carré avec la bonne couleur. +% \begin{macrocode} + \begin{pspicture}(0,0)(\AnnexeSectionRuleWidth,\AnnexeSectionRuleWidth) + \psframe*[linecolor=AnnexeSectionRuleColor] + (0,0)(\AnnexeSectionRuleWidth,\AnnexeSectionRuleWidth) + \end{pspicture}% + \hspace{\AnnexeSectionRuleHSpace}% +% \end{macrocode} +% On place enfin le titre dans une minipage de la bonne largeur. +% \begin{macrocode} + \begin{minipage}[t]{\dimexpr\linewidth-\AnnexeSectionRuleWidth-\AnnexeSectionRuleHSpace} + \AnnexeSectionTitleFont + \textcolor{AnnexeSectionTitleColor}{#2}% + \end{minipage} +% \end{macrocode} +% On termine en plaçant un espacement vertical donné et une +% interdiction de coupe. Il n'y a pas besoin de s'occuper du retrait +% d'alinéa puisqu'il n'y en a pas ! +% \begin{macrocode} + \par\nobreak\addvspace{\AfterAnnexeSectionVSpace} +} +% \end{macrocode} +% \end{macro} +% \subsection{Lexique} +% \begin{macro}{\MotDefinition} +% La classe propose un système de glossaire. La macro |\MotDefinition| +% demande un premier argument qui est le mot à placer dans le lexique +% et un deuxième argument. Si le deuxième argument est vide, le mot à +% placer dans le lexique est également composé en gras à l'emplacement +% actuel et le lexique contient une référence à ce mot avec un renvoi +% à la page en cours. Si le deuxième argument n'est pas vide, la +% commande ne provoque rien au niveau où elle est émise et le mot sera +% placé dans le lexique avec une définition correspondant au deuxième +% argument. +% +% Il y aura également un deuxième argument optionnel situé entre les +% deux arguments obligatoires qui permettra d'indiquer la chaîne de +% tri pour le lexique. +% +% Pour homogénéiser le traitement, on place le tout dans un fichier +% annexe. +% \begin{macrocode} +\newcommand*\MotDefinition[2][]{% + \def\smc@MDlexique{#1}% + \def\smc@MDentree{#2}% + \smc@MotDefinition +} +\newcommand*\smc@MotDefinition[2][]{% + \@ifmtarg{#2}{% +% \end{macrocode} +% Si le deuxième argument obligatoire est vide, on compose le premier +% en gras et on écrit dans le fichier annexe avec la référence à la +% page en cours. +% \begin{macrocode} + \textbf{\smc@MDentree}% + \ifx\smc@MDlexique\empty +% \end{macrocode} +% Si l'argument optionnel est vide, l'entrée est le mot mis en +% gras. On ne fait pas de mise en forme directe avec ce type d'entrée +% puisqu'il peut y avoir plusieurs pages référencées. +% \begin{macrocode} + \smc@noprotectaddtolexique{#1}{\smc@MDentree}{\thepage}% + \else +% \end{macrocode} +% Sinon, l'argument optionnel devient l'entrée du Lexique. +% \begin{macrocode} + \smc@noprotectaddtolexique{#1}{\smc@MDlexique}{\thepage}% + \fi + } + {% +% \end{macrocode} +% Si le deuxième argument n'est pas vide, on ne compose pas le premier +% argument et on écrit dans le fichier annexe avec le deuxième +% argument comme texte explicatif. +% \begin{macrocode} + \ifx\smc@MDlexique\empty + \smc@addtolexique{#1}{\smc@MDentree}{% + \par\nobreak + #2% + \par\addvspace{\AfterEntreeVSpace}% + }% + \else + \smc@addtolexique{#1}{\smc@MDlexique}{% + \par\nobreak + #2% + \par\addvspace{\AfterEntreeVSpace}% + }% + \fi + }% +} +% \end{macrocode} +% Pour les entrées d'index, on se sert de la macro |\Lexique| qui +% permet de faire référence à un autre mot du lexique. Elle ne fait +% que mettre le mot dans la bonne couleur. +% \begin{macrocode} +\newcommand*\Lexique[1]{% + \textcolor{LexiqueEntreeColor}{\LexiqueFont #1}% +} +% \end{macrocode} +% Il reste à définir la macro d'ajout dans le fichier +% annexe. L'empilement des |\unexpanded| va permettre d'écrire ce que +% l'on veut dans le deuxième argument des entrées de lexique. Le +% premier |\unexpanded| va écrire |\unexpanded{...}| dans le fichier +% aux et le deuxième permettra l'écriture sans développement dans le +% fichier lex. +% \begin{macrocode} +\long\def\smc@addtolexique#1#2#3{% + \protected@write\@auxout{} + {% + \string\@writefile{lex}{% + \protect\smc@insertlexique[#1]{#2}{\unexpanded{\unexpanded{#3}}}% + }% + }% +} +% \end{macrocode} +% On fait une deuxième version non protégée pour pouvoir avoir le +% numéro de page. Pour gérer les pages multiples, c'est la macro +% |\smc@preinsertlexique| qui est alors utilisée. +% \begin{macrocode} +\long\def\smc@noprotectaddtolexique#1#2#3{% + \protected@write\@auxout{} + {% + \string\@writefile{lex}{% + \protect\smc@preinsertlexique[#1]{#2}{#3}% + }% + }% +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\smc@addtolom} +% Macro équivalente pour écrire dans la table des méthodes. +% \begin{macrocode} +\long\def\smc@addtolom#1{% + \protected@write\@auxout{} + {% + \protect\expandafter\global\protect\csname smc@lom\smc@thema@init + true\protect\endcsname +% \end{macrocode} +% On doit écrire dans le fichier lom qui dépend du thème général en +% cours (il y a trois fichiers séparés). +% \begin{macrocode} + \string\@writefile{lom\smc@thema@init}{% + \protect\l@methode{\unexpanded{\unexpanded{#1}}}{\thepage}% + }% + }% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\AfficheLexique} +% Pour afficher le lexique on utilise la seule macro +% |\AfficheLexique|. Celle-ci accepte un argument optionnel indiquant +% le nombre de colonnes sur lesquelles sera composé le lexique. Pour +% avoir un maximum de souplesse, la valeur par défaut sera stockée +% dans la variable publique |\NombreColonnesLexique|. La classe fixe à +% 2 cette valeur par défaut. +% \begin{macrocode} +\newcommand*\NombreColonnesLexique{2} +\newcommand*\AfficheLexique[1][\NombreColonnesLexique]{% +% \end{macrocode} +% On commence par changer de page et indiquer les styles de page à +% utiliser pour la suite. +% \begin{macrocode} + \clearpage + \pagestyle{lexique} + \thispagestyle{firstlexique} +% \end{macrocode} +% On définit ensuite les éléments permis dans le lexique. +% \begin{macrocode} + \let\itemize\smc@lexiqueitemize + \let\enditemize\endsmc@lexiqueitemize + \let\colitemize\smc@lexiquecolitemize + \let\endcolitemize\endsmc@lexiquecolitemize + \let\enumerate\smc@lexiqueenumerate + \let\endenumerate\endsmc@lexiqueenumerate + \let\colenumerate\smc@lexiquecolenumerate + \let\endcolenumerate\endsmc@lexiquecolenumerate + \let\partie\smc@nopartie + \let\exercice\smc@noexercice + \let\endexercice\endsmc@noexercice + \let\corrige\smc@nocorrige + \let\endcorrige\endsmc@nocorrige + \def\smc@currpart{Lexique}% +% \end{macrocode} +% On compose le titre du lexique. +% \begin{macrocode} + \rput[Bl](0,9mm){\LexiqueTitleFont \MakeUppercase{\StringLexique}} + \vspace*{-5mm} +% \end{macrocode} +% Enfin, on ouvre l'environnement de colonnage avant d'appeler la +% macro de mise en forme du lexique. +% \begin{macrocode} + \begingroup + \columnsep \dimexpr \SquareWidth*2 + \columnseprule \LexiqueRuleWidth + \def\columnseprulecolor{\color{LexiqueColumnRuleColor}}% +% \end{macrocode} +% On met le compteur d'entrées du lexique à zéro avant de lire le +% fichier de lexique. La lecture finale se fera avec les macros finales +% de lecture des entrées. Auparavant, il aura fallu lire le fichier +% avec les macros de lecture des doublons. +% \begin{macrocode} + \smc@numlexique \z@ + \begin{multicols}{#1}% +% \end{macrocode} +% Avant la lecture pour les doublons, on initialise les macros +% |\smc@insertlexique| et |\smc@preinsertlexique| à leurs valeurs +% initiales. +% \begin{macrocode} + \let\smc@insertlexique\smc@insertlexiqueinitial + \let\smc@preinsertlexique\smc@preinsertlexiqueinitial +% \end{macrocode} +% La première lecture ne doit pas se faire avec |\@starttoc| puisque +% cette commande détruit le fichier. En revanche cela demande quelques +% précautions. D'abord, faire de |@| une lettre ensuite utiliser +% |\@input| au lieu de |\input| puisque le fichier n'existe pas +% nécessairement. +% \begin{macrocode} + \begingroup + \makeatletter + \@input{\jobname.lex}% + \endgroup + \let\smc@insertlexique\smc@insertlexiquefinal + \let\smc@preinsertlexique\smc@preinsertlexiquefinal + \@starttoc{lex}% +% \end{macrocode} +% À ce stade, les entrées ont été mises en forme. Il faut les classer +% avant de les composer effectivement. Le tri se fera avec +% l'algorithme de tri fusion en se servant du tableau +% |\tri|. Comme le tri va porter à la fois sur |\tri| et +% |\lexique|, il va être plus efficace de construire une liste +% d'index et de faire le tri sur ces index. Au départ, le tableau +% d'index est index[1]=1, index[]=2, etc. ce qui fait que le contenu +% du tableau est son indice. +% \begin{macrocode} + \multido{\n=1+1}{\smc@numlexique}{% + \expandafter\xdef\csname index\n\endcsname{\n}% + }% +% \end{macrocode} +% Il faut également faire attention au cas où la liste est vide. Si +% oui, il ne faut pas lancer le tri fusion (ni affficher). +% \begin{macrocode} + \ifnum\smc@numlexique>\z@ + \smc@trifusion{1}{\the\smc@numlexique}% +% \end{macrocode} +% Affichage effectif des entrées. Avant de lancer cet affichage, il +% faut initialiser la lettre initiale en cours. Les lettres en cours +% ne peuvent être que des bas de casse non diacritiques on va donc +% initialiser avec une capitale pour être certain que la première +% entrée déclenche un changement de lettre. +% \begin{macrocode} + \def\smc@currentletter{A}% + \multido{\n=1+1}{\smc@numlexique}{% + \smc@afficheentree{\n}% + }% + \fi + \end{multicols} + \endgroup +} +% \end{macrocode} +% La macro d'affichage des entrées de lexique gère également +% l'affichage des changement de lettre. L'argument est l'index de +% l'entrée. +% \begin{macrocode} +\newcommand*\smc@afficheentree[1]{% +% \end{macrocode} +% Le premier travail est de détecter la première lettre de |tri[#1]| +% et de voir si celle-ci est la première d'une nouvelle série. Cela se +% fait avec l'appel à la macro |\smc@testfirstletter| en passant la +% chaîne de tri (en bas de casse) comme argument délimité. +% \begin{macrocode} + \edef\smc@arg{\csname tri\csname index#1\endcsname\endcsname}% + \expandafter\smc@testfirstletter\smc@arg\@nil +% \end{macrocode} +% On affiche ensuite l'entrée proprement dite. +% \begin{macrocode} + \csname lexique\csname index#1\endcsname\endcsname\endgraf +} +% \end{macrocode} +% La macro |\smc@testfirstletter| regarde la première lettre de son +% argument, affiche le bandeau de nouvelle lettre si cette lettre est +% différente de |\smc@currentletter|. +% \begin{macrocode} +\def\smc@testfirstletter#1#2\@nil{% + \def\smc@arg{#1}% + \unless\ifx\smc@arg\smc@currentletter + \def\smc@currentletter{#1}% + \par\addvspace{\BeforeFirstLetterVSpace} + \setbox0=\hbox{% + \textcolor{FirstLetterTxtColor}{\FirstLetterFont \MakeUppercase{#1}}% + }% + \begin{pspicture}(0,\dimexpr\ht0+\FirstLetterFrameHSep) + \psframe[linewidth=0pt, linestyle=none, fillstyle=solid, + fillcolor=FirstLetterBkgColor] + (0,\dimexpr\ht0+\FirstLetterFrameHSep) + (\linewidth,-\FirstLetterFrameHSep) + \rput[B](0.5\linewidth,0){\box0} + \end{pspicture} + \par\addvspace{\AfterFirstLetterVSpace} + \nobreak + \fi +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\smc@trifusion} +% La macro |\smc@trifusion| effectue le tri des entrées +% |\lexique| en se servant de la table |\tri|. Pour cela, +% les échanges effectifs se font sur la table d'index +% |\index|. Cette macro, dans la phase de fusion, va utiliser +% cinq compteurs. +% \begin{macrocode} +\newcount\smc@firsttable +\newcount\smc@endfirsttable +\newcount\smc@secondtable +\newcount\smc@endsecondtable +\newcount\smc@writetable +% \end{macrocode} +% Au départ, on passe en paramètre les index extrêmes de la table. +% \begin{macrocode} +\newcommand*\smc@trifusion[2]{% + \ifnum#1=#2 +% \end{macrocode} +% Si la table à trier ne fait qu'un seul élément, on ne fait rien. +% \begin{macrocode} + \else +% \end{macrocode} +% Sinon, on trie les deux sous-tables en coupant en deux. Les deux +% sous-tables ont donc chacune au moins un élément. +% \begin{macrocode} + \edef\smc@arg{{#1}{\the\numexpr(#1+#2-1)/2}}% + \expandafter\smc@trifusion\smc@arg + \edef\smc@arg{{\the\numexpr(#1+#2+1)/2}{#2}}% + \expandafter\smc@trifusion\smc@arg +% \end{macrocode} +% et on fusionne les deux sous-tables triées qui ont donc toujours au +% moins un élément chacune. +% \begin{macrocode} + \smc@fusion{#1}{#2}% + \fi +} +% \end{macrocode} +% Pour le mécanisme de fusion, on fait appel à la macro +% |\smc@fusion|. +% \begin{macrocode} +\newcommand*\smc@fusion[2]{% +% \end{macrocode} +% On commence par initialiser le pointeur sur le début la première +% liste, le pointeur sur le début de la seconde liste, les bornes pour +% la première liste et la seconde liste et le pointeur sur la zone +% d'écriture +% \begin{macrocode} + \smc@firsttable=#1 + \smc@endfirsttable=\numexpr(#1+#2+1)/2 + \smc@secondtable=\numexpr(#1+#2+1)/2 + \smc@endsecondtable=\numexpr #2+1 +% \end{macrocode} +% L'initialisation de l'index d'écriture se fait avec la valeur +% antérieure à la valeur de départ car on procède à l'incrémentation +% avant l'utilisation. +% \begin{macrocode} + \smc@writetable=\numexpr #1-1 +% \end{macrocode} +% On réalise alors l'appel récursif sur la première phase de fusion +% (où les deux sous-tables n'ont pas encore été épuisées). +% \begin{macrocode} + \let\smc@next\smc@fusionrec + \smc@next +% \end{macrocode} +% La fusion a eu lieu dans un tableau temporaire, il faut la réécrire +% Appel récursif sur la bonne fonction dans le tableau index. +% \begin{macrocode} + \multido{\n=#1+1}{\numexpr #2-#1+1}{% + \edef\smc@tmp{\csname tmp\n\endcsname}% + \expandafter\xdef\csname index\n\endcsname{\smc@tmp}% + } +} +% \end{macrocode} +% La distribution des deux sous-tables dans la table temporaire +% (triée) se fait avec |\smc@fusionrec|. +% \begin{macrocode} +\newcommand*\smc@fusionrec{% +% \end{macrocode} +% On commence par mettre l'index d'écriture à jour. +% \begin{macrocode} + \advance\smc@writetable \@ne +% \end{macrocode} +% Ensuite, on compare les chaînes de tri ayant les index indiqués de +% chaque sous-tableau. À l'appel de cette fonction, aucun des deux +% sous-tableaux n'a été épuisé. +% \begin{macrocode} + \ifnum \pdfstrcmp{% + \csname tri\csname index\the\smc@firsttable\endcsname\endcsname + }{% + \csname tri\csname index\the\smc@secondtable\endcsname\endcsname + }=-1 +% \end{macrocode} +% Si c'est tri[index[first]] qui est inférieur, c'est index[first] qui +% prend place dans le sous-tableau temporaire. +% \begin{macrocode} + \edef\smc@tmp{\csname index\the\smc@firsttable\endcsname}% + \expandafter\let\csname tmp\the\smc@writetable\endcsname\smc@tmp +% \end{macrocode} +% On incrémente alors le pointeur du premier sous-tableau et on teste +% si on n'a pas épuisé ce premier sous-tableau. +% \begin{macrocode} + \advance\smc@firsttable \@ne + \ifnum\smc@firsttable=\smc@endfirsttable +% \end{macrocode} +% Si le premier sous-tableau est épuisé, il faut remplir la fin du +% tableau temporaire avec le second sous-tableau. +% \begin{macrocode} + \let\smc@next\smc@fusionsecond + \fi + \else +% \end{macrocode} +% Si c'est tri[index[second]] qui est inférieur, c'est index[second] qui +% prend place dans le sous-tableau temporaire. +% \begin{macrocode} + \edef\smc@tmp{\csname index\the\smc@secondtable\endcsname}% + \expandafter\let\csname tmp\the\smc@writetable\endcsname\smc@tmp +% \end{macrocode} +% On incrémente alors le pointeur du premier sous-tableau et on teste +% si on n'a pas épuisé ce premier sous-tableau. +% \begin{macrocode} + \advance\smc@secondtable \@ne + \ifnum\smc@secondtable=\smc@endsecondtable +% \end{macrocode} +% Si le second sous-tableau est épuisé, il faut remplir la fin du +% tableau temporaire avec le premier sous-tableau. +% \begin{macrocode} + \let\smc@next\smc@fusionfirst + \fi + \fi +% \end{macrocode} +% Appel récursif sur la bonne fonction. +% \begin{macrocode} + \smc@next +} +% \end{macrocode} +% Il reste à définir les deux macros qui remplissent la fin du tableau +% temporaire avec le sous-tableau non épuisé. +% \begin{macrocode} +\newcommand*\smc@fusionfirst{% +% \end{macrocode} +% À l'appel, le sous-tableau ne peut pas être vide, on effectue donc +% la copie d'abord puis les tests de fin de tableau ensuite. +% \begin{macrocode} + \advance\smc@writetable \@ne + \edef\smc@tmp{\csname index\the\smc@firsttable\endcsname}% + \expandafter\let\csname tmp\the\smc@writetable\endcsname\smc@tmp + \advance\smc@firsttable \@ne + \ifnum\smc@firsttable=\smc@endfirsttable +% \end{macrocode} +% Si le premier tableau est épuisé, on a fini la fusion +% \begin{macrocode} + \let\smc@next\relax + \fi + \smc@next +} +% \end{macrocode} +% La macro |\smc@fusionsecond| fonctionne exactement de la même façon. +% \begin{macrocode} +\newcommand*\smc@fusionsecond{% + \advance\smc@writetable \@ne + \edef\smc@tmp{\csname index\the\smc@secondtable\endcsname}% + \expandafter\let\csname tmp\the\smc@writetable\endcsname\smc@tmp + \advance\smc@secondtable \@ne + \ifnum\smc@secondtable=\smc@endsecondtable + \let\smc@next\relax + \fi + \smc@next +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\smc@insertlexique} +% Cette macro existe en deux versions à cause du travail sur les +% doublons au niveau du lexique. La première version est une version +% fantome qui permet de supprimer les actions de cette macro, la +% deuxième version est celle qui permet la composition effective de +% l'entrée dans le lexique. +% +% On commence par la version fantome qui ne fait qu'avaler les paramètres. +% \begin{macrocode} +\newcommand\smc@insertlexiqueinitial[3][]{} +% \end{macrocode} +% La deuxième version est celle qui effectue le travail +% véritable. Elle réalise deux conversions : +% \begin{itemize} +% \item elle met en capitale la première lettre du mot (ou de +% l'expression) et sauvegarde le résultat dans la macro +% |\lexique| ; +% \item elle construit une chaîne équivalente sans diacritique (repéré +% avec |IeC|) et sauvegarde le résultat dans la macro |\tri|. +% \end{itemize} +% \begin{macrocode} +\newcount\smc@numlexique +\newcommand\smc@insertlexiquefinal[3][]{% + \global\advance\smc@numlexique \@ne +% \end{macrocode} +% Appel de la macro auxiliaire pour mettre la première lettre de +% l'entrée en capitale et régler la mise en forme globale de +% l'ensemble de l'entrée. +% \begin{macrocode} + \@ifmtarg{#1}% + {\smc@@FirstUppercase#2\@nil#3\@nil}% +% \end{macrocode} +% Si l'argument optionnel de tri n'est pas vide, on ne cherche pas à +% mettre en forme l'entrée de l'index. +% \begin{macrocode} + {\expandafter\protected@xdef\csname lexique\the\smc@numlexique\endcsname + {% + \protect\textcolor{LexiqueEntreeColor} + {% + \protect\LexiqueEntreeFont #2% + }% + \unexpanded{#3}% + }% + }% +% \end{macrocode} +% Appel de la macro auxiliaire pour écrire tout en minuscule sans +% diacritique. +% \begin{macrocode} + \@ifmtarg{#1}% + {\smc@sansdiacritique{#2}}% + {\smc@sansdiacritique{#1}}% +% \end{macrocode} +% La macro précédente renvoie la chaîne sans espace et sans +% diacritique dans la macro |\smc@tri|. On l'écrit dans +% |\tri|. +% \begin{macrocode} + \expandafter\xdef\csname tri\the\smc@numlexique\endcsname{\smc@tri}% +} +% \end{macrocode} +% La macro |\smc@preinsertlexique| existe également en deux versions +% pour traiter les doublons. Et c'est effectivement les entrées +% utilisant cette macro qui nécessitent le traitement particulier. +% \begin{macrocode} +\newcommand\smc@preinsertlexiqueinitial[3][]{% +% \end{macrocode} +% Le repérage des doublons se fera sur le critère de tri. On commence +% donc par calculer ce dernier +% \begin{macrocode} + \@ifmtarg{#1}% + {\smc@sansdiacritique{#2}}% + {\smc@sansdiacritique{#1}}% +% \end{macrocode} +% La chaîne de tri est stockée dans |\smc@tri|. On regarde si la macro +% |\nb-| existe. +% \begin{macrocode} + \ifcsname nb-\smc@tri\endcsname +% \end{macrocode} +% La macro existe, il y a donc des doublons. On met à jour les macros +% |\nb-| et |\pages-| qui contiennent repectivement le +% nombre de pages et la liste des pages de l'entrée en cours. Il faut +% également que la page en cours ne soit pas la dernière entrée. +% +% On incrémente |\nb-| et on ajoute la page indiquée à +% |\pages-|. +% \begin{macrocode} + \unless\ifnum\csname lastpage-\smc@tri\endcsname=#3 + \expandafter\gdef\csname lastpage-\smc@tri\endcsname{#3}% + \expandafter\xdef\csname nb-\smc@tri\endcsname{% + \the\numexpr\csname nb-\smc@tri\endcsname+1 + }% + \edef\smc@tmp{\csname pages-\smc@tri\endcsname}% + \expandafter\xdef\csname pages-\smc@tri\endcsname{\smc@tmp, #3}% + \fi + \else +% \end{macrocode} +% Si la macro n'existe pas, c'est que c'est la première occurrence de +% cette entrée. On initialise la page en cours et les deux macros. +% \begin{macrocode} + \expandafter\gdef\csname lastpage-\smc@tri\endcsname{#3}% + \expandafter\gdef\csname nb-\smc@tri\endcsname{1}% + \expandafter\gdef\csname pages-\smc@tri\endcsname{#3}% + \fi +} +% \end{macrocode} +% La verion finale permet la composition proprement dite. +% \begin{macrocode} +\newcommand\smc@preinsertlexiquefinal[3][]{% +% \end{macrocode} +% On regarde si l'entrée à déjà été rencontrée. Pour cela, on si la +% macro |\affiche-| existe. +% \begin{macrocode} + \@ifmtarg{#1}% + {\smc@sansdiacritique{#2}}% + {\smc@sansdiacritique{#1}}% + \ifcsname affiche-\smc@tri\endcsname + \else +% \end{macrocode} +% Il n'y aura traitement que si cette macro n'existe pas. Dans ce cas, +% on commence par définir cette macro pour éviter les doublons. +% \begin{macrocode} + \expandafter\gdef\csname affiche-\smc@tri\endcsname{true}% +% \end{macrocode} +% Le reste du traitement est presque comme celui d'une entrée avec +% définition. La différence est qu'ici, on affiche une liste de pages +% au lieu d'une définition et qu'on a besoin pour cela du critère de +% tri (d'où l'appel initial de |\smc@sansdiacritique|). +% \begin{macrocode} + \@ifmtarg{#1}% + {\smc@sansdiacritique{#2}}% + {\smc@sansdiacritique{#1}}% + \global\advance\smc@numlexique \@ne +% \end{macrocode} +% On va s'occuper de l'entrée numéro |\smc@numlexique|. +% \begin{macrocode} + \@ifmtarg{#1}% +% \end{macrocode} +% S'il n'y a pas d'argument optionnel, le traitement se fera avec une +% macro annexe. +% \begin{macrocode} + {\smc@@preFirstUppercase#2\@nil#3\@nil}% +% \end{macrocode} +% Sinon, on compose l'entrée comme d'habitude. +% \begin{macrocode} + {\expandafter\protected@xdef\csname lexique\the\smc@numlexique\endcsname + {% + \protect\textcolor{LexiqueEntreeColor}{% + \protect\LexiqueEntreeFont #2% + }% +% \end{macrocode} +% La valeur |4.4em| est en fait $10\times0.44\mathtt{em}$. Elle sert +% à gérer correctement l'alignement des points de suite en assurant un +% minimum de 10 points de suite. +% \begin{macrocode} + \space\hbox to4.4em{\rdotfill}\kern-0.44em\rdotfill +% \end{macrocode} +% Test de pluriel pour le mot \og Page(s) \fg{}. +% \begin{macrocode} + \ifnum\csname nb-\smc@tri\endcsname>\@ne + \protect\emph{ Pages \csname pages-\smc@tri\endcsname}% + \else + \protect\emph{ Page \csname pages-\smc@tri\endcsname}% + \fi + }% + }% +% \end{macrocode} +% La macro |\smc@tri| est déjà calculée, on peut s'en servir +% directement. +% \begin{macrocode} + \expandafter\xdef\csname tri\the\smc@numlexique\endcsname + {\smc@tri}% + \fi +} +% \end{macrocode} +% Pour gérer les diacritiques, on a besoin d'un très grand nombre de +% macros de comparaison. La première détecte le |\IeC| indiquant un +% caractère hors ASCII. Les autres permettent de distinguer toutes les +% diacritiques et ligatures utilisées en français (et un peu au-delà). +% \begin{macrocode} +\def\smc@IeC{\IeC} +\def\smcl@Ag{\`A} +\def\smcl@Aa{\'A} +\def\smcl@Ac{\^A} +\def\smcl@At{\~A} +\def\smcl@Au{\"A} +\def\smcl@Ar{\r A} +\def\smcl@AE{\AE} +\def\smcl@Cc{\c C} +\def\smcl@Eg{\`E} +\def\smcl@Ea{\'E} +\def\smcl@Ec{\^E} +\def\smcl@Eu{\"E} +\def\smcl@Ig{\`I} +\def\smcl@Ia{\'I} +\def\smcl@Ic{\^I} +\def\smcl@Iu{\"I} +\def\smcl@Nn{\~N} +\def\smcl@Og{\`O} +\def\smcl@Oa{\'O} +\def\smcl@Oc{\^O} +\def\smcl@Ot{\~O} +\def\smcl@Ou{\"O} +\def\smcl@Oo{\O} +\def\smcl@OE{\OE} +\def\smcl@Ug{\`U} +\def\smcl@Ua{\'U} +\def\smcl@Uc{\^U} +\def\smcl@Uu{\"U} +\def\smcl@Yt{\"Y} +\def\smcl@ss{\ss} +\def\smcl@ag{\`a} +\def\smcl@aa{\'a} +\def\smcl@ac{\^a} +\def\smcl@at{\~a} +\def\smcl@au{\"a} +\def\smcl@ar{\r a} +\def\smcl@ae{\ae} +\def\smcl@cc{\c c} +\def\smcl@eg{\`e} +\def\smcl@ea{\'e} +\def\smcl@ec{\^e} +\def\smcl@eu{\"e} +\def\smcl@ig{\`i} +\def\smcl@ia{\'i} +\def\smcl@ic{\^i} +\def\smcl@iu{\"i} +\def\smcl@nn{\~n} +\def\smcl@og{\`o} +\def\smcl@oa{\'o} +\def\smcl@oc{\^o} +\def\smcl@ot{\~o} +\def\smcl@ou{\"o} +\def\smcl@oo{\o} +\def\smcl@oe{\oe} +\def\smcl@ug{\`u} +\def\smcl@ua{\'u} +\def\smcl@uc{\^u} +\def\smcl@uu{\"u} +\def\smcl@yt{\"y} +% \end{macrocode} +% La première macro auxiliaire permet de composer son entrée avec sa +% première lettre en capitale et toutes les autres en bas de casse. +% \begin{macrocode} +\long\def\smc@@FirstUppercase#1#2#3\@nil#4\@nil{% + \def\smc@arg{#1}% + \ifx\smc@arg\smc@IeC +% \end{macrocode} +% Si la première unité lexicale est |\IeC|, c'est qu'il faut prendre +% les deux première unités lexicales pour la première lettre à mettre +% en capitale. +% \begin{macrocode} + \expandafter\protected@xdef\csname lexique\the\smc@numlexique\endcsname + {% + \protect\textcolor{LexiqueEntreeColor} + {% + \protect\LexiqueEntreeFont + \MakeUppercase{#1#2}% + \MakeLowercase{#3}% + }% + \unexpanded{#4}% + }% + \else +% \end{macrocode} +% Sinon, on ne met en capitale que la première lettre qui correpond à +% la première unité lexicale. +% \begin{macrocode} + \expandafter\protected@xdef\csname lexique\the\smc@numlexique\endcsname + {% + \protect\textcolor{LexiqueEntreeColor} + {% + \protect\LexiqueEntreeFont + \MakeUppercase{#1}% + \MakeLowercase{#2#3}% + }% + \unexpanded{#4}% + }% + \fi +} +% \end{macrocode} +% Il existe une variante à la macro précédente pour les entrées avec +% liste de pages. Elle est identique sauf en ce qui concerne +% l'affichage de la liste de page. +% \begin{macrocode} +\long\def\smc@@preFirstUppercase#1#2#3\@nil#4\@nil{% + \def\smc@arg{#1}% + \ifx\smc@arg\smc@IeC + \expandafter\protected@xdef\csname lexique\the\smc@numlexique\endcsname + {% + \protect\textcolor{LexiqueEntreeColor} + {% + \protect\LexiqueEntreeFont + \MakeUppercase{#1#2}% + \MakeLowercase{#3}% + }% + \space\hbox to4.4em{\rdotfill}\kern-0.44em\rdotfill + \ifnum\csname nb-\smc@tri\endcsname>\@ne + \protect\emph{ Pages \csname pages-\smc@tri\endcsname}% + \else + \protect\emph{ Page \csname pages-\smc@tri\endcsname}% + \fi + }% + \else + \expandafter\protected@xdef\csname lexique\the\smc@numlexique\endcsname + {% + \protect\textcolor{LexiqueEntreeColor} + {% + \protect\LexiqueEntreeFont + \MakeUppercase{#1}% + \MakeLowercase{#2#3}% + }% + \space\hbox to4.4em{\rdotfill}\kern-0.44em\rdotfill + \ifnum\csname nb-\smc@tri\endcsname>\@ne + \protect\emph{ Pages \csname pages-\smc@tri\endcsname}% + \else + \protect\emph{ Page \csname pages-\smc@tri\endcsname}% + \fi + }% + \fi +} +% \end{macrocode} +% Deuxième macro auxiliaire pour récrire un mot ou une expression sans +% diacritiques, ligatures et espace et le tout en minuscule. Cela va +% servir pour effectuer un tri alphabétique. +% \begin{macrocode} +\def\smc@sansdiacritique#1{% +% \end{macrocode} +% On commence par vider la macro qui va recevoir le résultat. +% \begin{macrocode} + \def\smc@tri{}% +% \end{macrocode} +% Pour avoir la forme avec les éventuels |\IeC|, il faut procéder à un +% développement protégé de l'argument. +% \begin{macrocode} + \protected@edef\smc@arg{#1}% +% \end{macrocode} +% Ensuite, on initialise et on lance le traitement récurrent. +% \begin{macrocode} + \let\smc@next\smc@sd + \expandafter\smc@next\smc@arg\@nil +} +% \end{macrocode} +% Macro récursive de remplacement d'une diacritique par la lettre +% simple correspondante ou de la ligature par les deux lettres la +% composant. Elle met également tout en minuscule. +% \begin{macrocode} +\def\smc@sd#1{% + \def\smc@arg{#1}% + \ifx\smc@arg\@nnil +% \end{macrocode} +% Si on a atteint le |\@nil|, on arrête la récurrence. +% \begin{macrocode} + \let\smc@next\relax + \else + \ifx\smc@arg\smc@IeC +% \end{macrocode} +% Si on vient de lire un |\IeC|, on a à procéder à un traitement +% spécial assuré par la macro |\smc@@sd|. +% \begin{macrocode} + \let\smc@next\smc@@sd + \else +% \end{macrocode} +% Sinon, c'est une lettre non diacritique et on la recopie dans la +% macro de résultat en minuscule. +% \begin{macrocode} + \def\smc@arg{#1}% + \ifnum`#1<`A + \edef\smc@tri{\smc@tri#1}% + \else\ifnum`#1>`Z + \edef\smc@tri{\smc@tri#1}% + \else + \edef\smc@tri{\smc@tri\smc@bdc{\numexpr`#1-`A}}% + \fi\fi + \fi + \fi + \smc@next +} +% \end{macrocode} +% Macro pour changer les capitales ASCII en bas de casse ASCII +% correspondant. L'argument est le rang de la capitale (de 0 à 25) +% \begin{macrocode} +\newcommand*\smc@bdc[1]{% + \ifcase#1 + a% + \or b% + \or c% + \or d% + \or e% + \or f% + \or g% + \or h% + \or i% + \or j% + \or k% + \or l% + \or m% + \or n% + \or o% + \or p% + \or q% + \or r% + \or s% + \or t% + \or u% + \or v% + \or w% + \or x% + \or y% + \or z% + \else ???% + \fi +} +% \end{macrocode} +% Macro pour changer les diacritiques (ou ligatures) en équivalent +% ASCII (minuscule). +% \begin{macrocode} +\def\smc@@sd#1{% + \def\smc@arg{#1} + \ifx\smc@arg\smcl@Ag + \edef\smc@tri{\smc@tri a}% + \else\ifx\smc@arg\smcl@Aa + \edef\smc@tri{\smc@tri a}% + \else\ifx\smc@arg\smcl@Ac + \edef\smc@tri{\smc@tri a}% + \else\ifx\smc@arg\smcl@At + \edef\smc@tri{\smc@tri a}% + \else\ifx\smc@arg\smcl@Au + \edef\smc@tri{\smc@tri a}% + \else\ifx\smc@arg\smcl@Ar + \edef\smc@tri{\smc@tri a}% + \else\ifx\smc@arg\smcl@AE + \edef\smc@tri{\smc@tri ae}% + \else\ifx\smc@arg\smcl@Cc + \edef\smc@tri{\smc@tri c}% + \else\ifx\smc@arg\smcl@Eg + \edef\smc@tri{\smc@tri e}% + \else\ifx\smc@arg\smcl@Ea + \edef\smc@tri{\smc@tri e}% + \else\ifx\smc@arg\smcl@Ec + \edef\smc@tri{\smc@tri e}% + \else\ifx\smc@arg\smcl@Eu + \edef\smc@tri{\smc@tri e}% + \else\ifx\smc@arg\smcl@Ig + \edef\smc@tri{\smc@tri i}% + \else\ifx\smc@arg\smcl@Ia + \edef\smc@tri{\smc@tri i}% + \else\ifx\smc@arg\smcl@Ic + \edef\smc@tri{\smc@tri i}% + \else\ifx\smc@arg\smcl@Iu + \edef\smc@tri{\smc@tri i}% + \else\ifx\smc@arg\smcl@Nn + \edef\smc@tri{\smc@tri n}% + \else\ifx\smc@arg\smcl@Og + \edef\smc@tri{\smc@tri o}% + \else\ifx\smc@arg\smcl@Oa + \edef\smc@tri{\smc@tri o}% + \else\ifx\smc@arg\smcl@Oc + \edef\smc@tri{\smc@tri o}% + \else\ifx\smc@arg\smcl@Ot + \edef\smc@tri{\smc@tri o}% + \else\ifx\smc@arg\smcl@Ou + \edef\smc@tri{\smc@tri o}% + \else\ifx\smc@arg\smcl@Oo + \edef\smc@tri{\smc@tri o}% + \else\ifx\smc@arg\smcl@OE + \edef\smc@tri{\smc@tri oe}% + \else\ifx\smc@arg\smcl@Ug + \edef\smc@tri{\smc@tri u}% + \else\ifx\smc@arg\smcl@Ua + \edef\smc@tri{\smc@tri u}% + \else\ifx\smc@arg\smcl@Uc + \edef\smc@tri{\smc@tri u}% + \else\ifx\smc@arg\smcl@Uu + \edef\smc@tri{\smc@tri u}% + \else\ifx\smc@arg\smcl@Yt + \edef\smc@tri{\smc@tri y}% + \else\ifx\smc@arg\smcl@ss + \edef\smc@tri{\smc@tri s}% + \else\ifx\smc@arg\smcl@ag + \edef\smc@tri{\smc@tri a}% + \else\ifx\smc@arg\smcl@aa + \edef\smc@tri{\smc@tri a}% + \else\ifx\smc@arg\smcl@ac + \edef\smc@tri{\smc@tri a}% + \else\ifx\smc@arg\smcl@at + \edef\smc@tri{\smc@tri a}% + \else\ifx\smc@arg\smcl@au + \edef\smc@tri{\smc@tri a}% + \else\ifx\smc@arg\smcl@ar + \edef\smc@tri{\smc@tri a}% + \else\ifx\smc@arg\smcl@ae + \edef\smc@tri{\smc@tri ae}% + \else\ifx\smc@arg\smcl@cc + \edef\smc@tri{\smc@tri c}% + \else\ifx\smc@arg\smcl@eg + \edef\smc@tri{\smc@tri e}% + \else\ifx\smc@arg\smcl@ea + \edef\smc@tri{\smc@tri e}% + \else\ifx\smc@arg\smcl@ec + \edef\smc@tri{\smc@tri e}% + \else\ifx\smc@arg\smcl@eu + \edef\smc@tri{\smc@tri e}% + \else\ifx\smc@arg\smcl@ig + \edef\smc@tri{\smc@tri i}% + \else\ifx\smc@arg\smcl@ia + \edef\smc@tri{\smc@tri i}% + \else\ifx\smc@arg\smcl@ic + \edef\smc@tri{\smc@tri i}% + \else\ifx\smc@arg\smcl@iu + \edef\smc@tri{\smc@tri i}% + \else\ifx\smc@arg\smcl@nn + \edef\smc@tri{\smc@tri n}% + \else\ifx\smc@arg\smcl@og + \edef\smc@tri{\smc@tri o}% + \else\ifx\smc@arg\smcl@oa + \edef\smc@tri{\smc@tri o}% + \else\ifx\smc@arg\smcl@oc + \edef\smc@tri{\smc@tri o}% + \else\ifx\smc@arg\smcl@ot + \edef\smc@tri{\smc@tri o}% + \else\ifx\smc@arg\smcl@ou + \edef\smc@tri{\smc@tri o}% + \else\ifx\smc@arg\smcl@oo + \edef\smc@tri{\smc@tri o}% + \else\ifx\smc@arg\smcl@oe + \edef\smc@tri{\smc@tri oe}% + \else\ifx\smc@arg\smcl@ug + \edef\smc@tri{\smc@tri u}% + \else\ifx\smc@arg\smcl@ua + \edef\smc@tri{\smc@tri u}% + \else\ifx\smc@arg\smcl@uc + \edef\smc@tri{\smc@tri u}% + \else\ifx\smc@arg\smcl@uu + \edef\smc@tri{\smc@tri u}% + \else\ifx\smc@arg\smcl@yt + \edef\smc@tri{\smc@tri y}% + \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi +% \end{macrocode} +% Les appels récursifs suivants reviennent sur |\smc@sd|. +% \begin{macrocode} + \let\smc@next\smc@sd + \smc@next +} +% \end{macrocode} +% \end{macro} +% \subsection{Liste des méthodes} +% \begin{macro}{\rdotfill} +% Pour les besoins de |\l@methode| on a besoin de points de suite +% calés sur la droite et non centré comme ceux proposés par \LaTeX. +% \begin{macrocode} +\newcommand*\rdotfill{% + \leavevmode + \leaders \hb@xt@ .44em{\hss.}\hfill + \kern\z@ +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\l@methode} +% La liste des méthodes emploie un mécanisme similaire à celui de la +% table des matières. En particulier, la mise en forme des titres des +% méthodes est assurée par la macro |\l@methode| qui prend deux +% arguments : le titre et le numéro de page. +% \begin{macrocode} +\newcommand*\l@methode[2]{% + \begin{minipage}[b]{\linewidth-1.5cm} + \raggedright + \ListeMethodeTitleFont + \begin{pspicture}(0,0)(\TriangleMethodeSize,\TriangleMethodeSize) + \pspolygon*[linecolor=\CorrigeChapterFrameColor] + (0,0)(0,\TriangleMethodeSize) + (\TriangleMethodeSize,\dimexpr\TriangleMethodeSize/2) + \end{pspicture} + \textcolor{ListeMethodeTitleColor}{#1}% + \rdotfill + \end{minipage}\kern-0.44em + {\ListeMethodePageFont \rdotfill#2\strut}% + \par\addvspace{\AfterMethodeVSpace} +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\ListeMethodesThemes} +% La liste des méthodes se fait normalement dans l'ordre des thèmes +% suivant : +% \begin{itemize} +% \item Statistiques et probabilité ; +% \item Fonctions ; +% \item Géométrie. +% \end{itemize} +% En réalité, c'est la macro |\ListeMethodesThemes| qui indiquera +% quels seront les thèmes inclus et dans quel ordre. Pour cela, la +% macro contiendra la liste des codes minuscules et majuscules de +% chaque thème séparés par des virgules. Comme il y a possibilité +% d'avoir des codes sur plusieurs lettres, il est plus sage de +% spécifier ces lettres entre accolades. La classe donne l'ordre et le +% contenu par défaut listé ci-dessus. +% \end{macro} +% \begin{macrocode} +\newcommand\ListeMethodesThemes{{sp}{SP},{f}{F},{g}{G}} +% \end{macrocode} +% \begin{macro}{\AfficheListeMethodes} +% La classe permet de faire la liste des méthodes. Pour cela, on +% utilisera la macro |\AfficheListeMethodes|. +% +% Celle-ci utilise des cadres d'en-tête basés sur le même modèle que +% celui des récréations mais avec des couleurs différentes et qui +% dépendent du thème en cours. +% \begin{macrocode} +\newcommand*\smc@bandeaulistemethodes[1]{% + \par\addvspace{\BeforeRecreationVSpace} + \begin{pspicture}(0,0)(\linewidth,\dimexpr\SquareWidth*3) + \psframe*[linewidth=0pt,linecolor=ChapterNumSquare5Color] + (0,0)(\linewidth,\dimexpr\SquareWidth*3) + \psset{fillstyle=solid} + \smc@antidiagonal(0mm,0mm){ChapterNumSquare} + \rput[Bl](\dimexpr \SquareWidth*4,\SquareWidth){% + \textcolor{ChapterNumSquare0Color}{\RecreationFont #1}% + } + \psset{linewidth=0pt} + \smc@putsquare(32,2){J1} + \smc@putsquare(33,0){H4} + \smc@putsquare(34,1){H2} + \smc@putsquare(37,1){F3} + \smc@putsquare(39,0){H2} + \smc@putsquare(42,2){J2} + \smc@putsquare(46,1){H4} + \end{pspicture} + \par\nobreak\addvspace{\AfterRecreationVSpace} +} +% \end{macrocode} +% L'affichage ou non des blocs de liste de méthodes par thème est sous +% la dépendance des booléens associés. +% \begin{macrocode} +\newif\ifsmc@lomsp +\newif\ifsmc@lomf +\newif\ifsmc@lomg +% \end{macrocode} +% On indique le nombre de colonnes de la liste des méthodes soit par +% l'intermédiaire de la macro |\NombreColonnesListeMethodes|, soit en +% utilisant l'argument optionnel de |\AfficheListeMethodes|. +% \begin{macrocode} +\newcommand*\NombreColonnesListeMethodes{2} +\newcommand*\AfficheListeMethodes[1][\NombreColonnesListeMethodes]{% +% \end{macrocode} +% On commence par changer de page et indiquer les styles de page à +% utiliser pour la suite. +% \begin{macrocode} + \clearpage + \pagestyle{affichemethode} + \thispagestyle{firstaffichemethode} +% \end{macrocode} +% On compose le titre de l'annexe. +% \begin{macrocode} + \rput[Bl](0,9mm){\ListeMethodeChapterFont \MakeUppercase{\StringListeMethode}} + \vspace*{-5mm} +% \end{macrocode} +% Enfin, on ouvre l'environnement de colonnage avant d'appeler les +% trois fichiers qui contiennent les listes des méthodes. +% \begin{macrocode} + \begingroup + \columnsep \dimexpr \SquareWidth*2 + \columnseprule \ListeMethodeRuleWidth + \def\columnseprulecolor{\color{ListeMethodeColumnRuleColor}}% +% \end{macrocode} +% Avant d'afficher la liste des méthodes, il faut tuer la macro +% |\MethodeRefExercice| +% \begin{macrocode} + \renewcommand*\MethodeRefExercice{\@ifstar{\@gobble}{\@gobble}} +% \end{macrocode} +% On sauvegarde le nombre de colonnes dans une macro auxiliaire qui +% servira dans |\smc@AfficheListeMethodesTheme|. +% \begin{macrocode} + \def\smc@NombreColonnesListeMethodes{#1}% +% \end{macrocode} +% On compose maintenant la liste des méthodes dans l'ordre des thèmes indiqués. +% \begin{macrocode} + \tracingifs=1 + \@for\smc@currtheme:=\ListeMethodesThemes\do{% + \expandafter\smc@AfficheListeMethodesTheme\smc@currtheme + }% + \endgroup +} +% \end{macrocode} +% La macro suivante affiche la liste des méthodes pour le thème donné +% en arguments (la ou les lettres minuscules puis la ou les lettres +% capitales). +% \begin{macrocode} +\newcommand\smc@AfficheListeMethodesTheme[2]{% +% \end{macrocode} +% La liste des méthodes pour le thème ne sera affichée que s'il y a au +% moins une méthode ce qui est indiqué avec le booléen +% |\ifsmc@lom|. +% \begin{macrocode} + \expandafter\ifx\csname ifsmc@lom#1\endcsname\iftrue + \csname smc@thema#2Color\endcsname + \expandafter\smc@bandeaulistemethodes + \expandafter{\csname StringListeMethode#2\endcsname} +% \end{macrocode} +% Malheureusement l'environnement \environ{multicols} n'est pas +% capable de composer sur une seule colonne. D'où la construction +% suivante. +% \begin{macrocode} + \ifnum \smc@NombreColonnesListeMethodes=\@ne + \@starttoc{lom#1} + \else + \begin{multicols}{\smc@NombreColonnesListeMethodes} + \@starttoc{lom#1} + \end{multicols} + \fi + \fi +} +% \end{macrocode} +% \end{macro} +% \subsection{Texte libre} +% Afin de permettre à l'utilisateur de se servir de la classe pour +% composer une ou quelques feuilles sans devoir suivre la structure +% d'un ouvrage entier, on met à disposition la commande |\libre|. Elle +% va permettre, par exemple, de prendre le texte source d'un exercice +% et de pouvoir le composer sans avoir à passer par toute la +% machinerie d'un ouvrage (thème, en-tête coloré, etc.). +% +% L'ensemble du code est pris sur celui de la commande |\annexe| et +% des ses macros satellites. Quelques éléments sont simplifiés. On +% commence avec la macro permettant de modifier les couleurs par l'utilisateur +% \begin{macro}{\ChangeLibre} +% \begin{macrocode} +\newcommand*\ChangeLibre[4]{% + \colorlet{LibreHeadFrameColor}{#1}% + \colorlet{LibreSectionRuleColor}{#2}% + \colorlet{LibreItemColor}{#2}% + \colorlet{LibreExerciceCorrigeNumFrameColor}{#2}% + \colorlet{LibreExerciceNumFrameColor}{#2}% + \colorlet{LibreSectionTitleColor}{#3}% + \colorlet{LibreExerciceTitleColor}{#3} + \colorlet{LibreExerciceNumColor}{#4} +} +% \end{macrocode} +% On appelle maintenant cette macro avec les couleurs par défaut. +% \begin{macrocode} +\ChangeLibre{G3}{A1}{G1}{Blanc} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\libre} +% On peut maintenant définir la macro |\libre|. Avant cela on définit +% un certain nombre de compteur à initialiser à ce +% niveau. Contrairement aux annexes générales, il n'y a pas de titre +% ici donc pas d'argument à cette commande. +% \begin{macrocode} +\newcommand*\libre{% + \let\itemize\smc@libreitemize + \let\enditemize\endsmc@libreitemize + \let\colitemize\smc@librecolitemize + \let\endcolitemize\endsmc@librecolitemize + \let\enumerate\smc@libreenumerate + \let\endenumerate\endsmc@libreenumerate + \let\colenumerate\smc@librecolenumerate + \let\endcolenumerate\endsmc@librecolenumerate + \let\partie\smc@nopartie + \let\exercice\smc@libreexercice + \let\endexercice\endsmc@libreexercice + \let\corrige\smc@librecorrige + \let\endcorrige\endsmc@librecorrige + \let\section\smc@libresection + \def\smc@currpart{Libre}% + \setcounter{propriete}{0}% + \setcounter{exercice}{0}% +% \end{macrocode} +% Il faut placer une balise quelconque dans le fichier de correction +% pour qu'il existe. +% \begin{macrocode} + \addtocontents{cor}{\protect\smc@corrigelibre}% +% \end{macrocode} +% On commence par changer de page et indiquer les styles de page à +% utiliser pour la suite. +% \begin{macrocode} + \clearpage + \pagestyle{libre} + \thispagestyle{firstlibre} +% \end{macrocode} +% La partie libre utilise le pseudo-thème libre. +% \begin{macrocode} + \themaL +} +% \end{macrocode} +% \end{macro} +% \begin{environment}{smc@libreexercice} +% Exercice pour le texte libre. On commence par regarder s'il y a +% une étoile. +% \begin{macrocode} +\newcommand*\smc@libreexercice{% + \@ifstar + {% + \smc@exercicecorrigetrue + \smc@@libreexercice + } + {% + \smc@exercicecorrigefalse + \smc@@libreexercice + } +} +% \end{macrocode} +% On lit ensuite le premier argument optionnel. +% \begin{macrocode} +\newcommand*\smc@@libreexercice[1][]{% +% \end{macrocode} +% On sauvegarde le texte du titre est on appelle la macro auxiliaire +% pour lire le deuxième argument optionnel. +% \begin{macrocode} + \def\smc@exercicetitle{#1}% + \smc@@@libreexercice +} +\newcommand*\smc@@@libreexercice[1][]{% +% \end{macrocode} +% On commence par passer au paragraphe suivant et réinitialiser le compteur +% partie ainsi que la façon de composer les parties. +% \begin{macrocode} + \par\addvspace{\BeforeExerciceVSpace} + \let\partie\smc@exercice@partie + \setcounter{partie}{0} +% \end{macrocode} +% La présence d'un logo va faire qu'on ne composera pas le titre (ou +% le texte) de la même façon. S'il y a un logo, on utilise la commande +% |\parpic| pour habiller le logo. Sinon on ne fait rien de spécial. +% \begin{macrocode} + \@ifnotmtarg{#1}{% + \setbox0=\hbox{#1}% + \parpic[r]{\makebox[\wd0][l]{{#1}}} + }% +% \end{macrocode} +% On compose le numéro de l'exercice. La couleur du cadre dépend du +% fait que l'exercice est corrigé ou non. À part les couleurs, on +% garde les mêmes macros de fonte et de longueurs que pour les +% exercices des chapitres normaux. +% \begin{macrocode} + \refstepcounter{exercice}% + \begin{pspicture}(0,0)(\ExerciceNumFrameWidth,\ExerciceNumFrameHeight) + \ifsmc@exercicecorrige + \psframe*[linewidth=0pt, + linecolor=LibreExerciceCorrigeNumFrameColor] + (0,-\ExerciceNumFrameDepth) + (\ExerciceNumFrameWidth,\ExerciceNumFrameHeight) + \else + \psframe*[linewidth=0pt, + linecolor=LibreExerciceNumFrameColor] + (0,-\ExerciceNumFrameDepth) + (\ExerciceNumFrameWidth,\ExerciceNumFrameHeight) + \fi + \rput[B](\dimexpr\ExerciceNumFrameWidth/2,0){% + \textcolor{LibreExerciceNumColor}{\ExerciceNumFont \theexercice}% + } + \end{pspicture}% +% \end{macrocode} +% Y a-t-il un titre d'exercice ? +% \begin{macrocode} + \ifx\smc@exercicetitle\empty +% \end{macrocode} +% S'il n'y a pas de titre, on commence le texte de l'exercice (après +% un certain espacement horizontal). +% \begin{macrocode} + \hspace{\ExerciceTextHSep}% + \else +% \end{macrocode} +% S'il y a un titre, on le compose et on passe au paragraphe suivant. +% \begin{macrocode} + \hspace{\ExerciceTextHSep}% + \textcolor{LibreExerciceTitleColor} + {\ExerciceTitleFont \smc@exercicetitle}% + \par\nobreak + \fi +} +% \end{macrocode} +% En fait, on utilisera plutôt la forme d'environnement pour entrer +% les exercices. Le code terminal ne fait que placer un |\par| (cela +% peut être utile pour activer un éventuel |\centering| en fin de +% code. +% \begin{macrocode} +\def\endsmc@libreexercice{\par} +% \end{macrocode} +% \end{environment} +% \begin{macro}{\smc@annexesection} +% Les textes libres redéfinissent la macro |\section|. Pour cela on la +% stocke sous la forme de la macro |\smc@libresection|. Au départ, on +% la définit comme une macro |\section| habituelle, en particulier, on +% autorise la forme étoilée (même si pour l'instant elle n'apporte +% rien de plus que la forme non étoilée). +% \begin{macrocode} +\newcommand*\smc@libresection{% + \@ifstar{\smc@libresec}{\smc@libresec}% +} +\newcommand*\smc@libresec[2][]{% +% \end{macrocode} +% On commence par regarder si l'argument optionnel est vide. Si oui, +% le titre court sera égal au titre long. +% \begin{macrocode} + \ifx\relax#1\relax + \smc@@libresec{#2}{#2}% + \else + \smc@@libresec{#1}{#2}% + \fi +} +% \end{macrocode} +% À ce stade, on a un titre court en premier argument et un titre long +% en deuxième argument. Le travail effectif peut commencer. +% \begin{macrocode} +\newcommand*\smc@@libresec[2]{% + \par\goodbreak\addvspace{\BeforeLibreSectionVSpace}% +% \end{macrocode} +% Le titre court sera éventuellement utilisé pour une TDM. Ce sera à +% voir plus tard. +% \begin{macrocode} + \@ifmtarg{#1}{}{}% +% \end{macrocode} +% On compose le carré avec la bonne couleur. +% \begin{macrocode} + \begin{pspicture}(0,0)(\LibreSectionRuleWidth,\LibreSectionRuleWidth) + \psframe*[linecolor=LibreSectionRuleColor] + (0,0)(\LibreSectionRuleWidth,\LibreSectionRuleWidth) + \end{pspicture}% + \hspace{\LibreSectionRuleHSpace}% +% \end{macrocode} +% On place enfin le titre dans une minipage de la bonne largeur. +% \begin{macrocode} + \begin{minipage}[t]{\dimexpr\linewidth-\LibreSectionRuleWidth-\LibreSectionRuleHSpace} + \LibreSectionTitleFont + \textcolor{LibreSectionTitleColor}{#2}% + \end{minipage} +% \end{macrocode} +% On termine en plaçant un espacement vertical donné et une +% interdiction de coupe. Il n'y a pas besoin de s'occuper du retrait +% d'alinéa puisqu'il n'y en a pas ! +% \begin{macrocode} + \par\nobreak\addvspace{\AfterLibreSectionVSpace} +} +% \end{macrocode} +% \end{macro} +% \section{Habillage de texte} +% On a vraiment besoin de l'extension \package{picins}. Comme elle +% n'est plus disponible sur \TeX Live ou Mik\TeX{}, on la recopie ici. +% \begin{macrocode} +\newbox\@BILD +\newbox\@TEXT +\newdimen\d@breite +\newdimen\d@hoehe +\newdimen\d@xoff +\newdimen\d@yoff +\newdimen\d@shad +\newdimen\d@dash +\newdimen\d@boxl +\newdimen\d@pichskip +\newdimen\d@tmp +\newdimen\d@tmpa +\newdimen\d@bskip +\newdimen\hsiz@ +\newdimen\p@getot@l +\newcount\c@breite +\newcount\c@hoehe +\newcount\c@xoff +\newcount\c@yoff +\newcount\c@pos +\newcount\c@shad +\newcount\c@dash +\newcount\c@boxl +\newcount\c@zeilen +\newcount\@changemode +\newcount\c@piccaption +\newcount\c@piccaptionpos +\newcount\c@picpos +\newcount\c@whole +\newcount\c@half +\newcount\c@tmp +\newcount\c@tmpa +\newcount\c@tmpb +\newcount\c@tmpc +\newcount\c@tmpd +\newskip\d@leftskip +\newif\if@list \@listfalse +\newif\if@offset +\c@piccaptionpos=1 +\c@picpos=0 +\d@shad=4pt +\d@dash=4pt +\d@boxl=10pt +\d@pichskip=1em +\@changemode=0 +\def\@captype{figure} +\let\old@par=\par +\def\pichskip#1{\d@pichskip #1\relax} +\def\shadowthickness#1{\d@shad #1\relax} +\def\dashlength#1{\d@dash #1\relax} +\def\boxlength#1{\d@boxl #1\relax} +\def\picchangemode{\@changemode=1} +\def\nopicchangemode{\@changemode=0} +\def\piccaptionoutside{\c@piccaptionpos=1} +\def\piccaptioninside{\c@piccaptionpos=2} +\def\piccaptionside{\c@piccaptionpos=3} +\def\piccaptiontopside{\c@piccaptionpos=4} +\def\piccaption{\@ifnextchar [{\@piccaption}{\@piccaption[]}} +\def\@piccaption[#1]#2{\c@piccaption=1\def\sh@rtf@rm{#1}\def\capti@nt@xt{#2}} +\def\make@piccaption{% + \hsiz@\d@breite + \ifnum\c@piccaptionpos=2 + \advance\hsiz@ -2\fboxsep + \fi + \ifnum\c@piccaptionpos>2 + \hsiz@\hsize\advance\hsiz@-\d@breite\advance\hsiz@-\d@pichskip + \fi + \setbox\@TEXT=\vbox{\hsize\hsiz@\caption[\sh@rtf@rm]{\capti@nt@xt}}% +} +\def\newcaption{\refstepcounter\@captype\@dblarg{\@newcaption\@captype}} +\long\def\@newcaption#1[#2]#3{% + \old@par + \addcontentsline{\csname ext@#1\endcsname }{#1} + {\protect\numberline{\csname the#1\endcsname}{\ignorespaces #2}}% + \begingroup + \@parboxrestore + \normalsize + \@newmakecaption{\csname fnum@#1\endcsname}{\ignorespaces #3}% + \old@par + \endgroup +} +\long\def\@newmakecaption#1#2{% + \vskip 10pt% + \setbox\@tempboxa \hbox {#1: #2}% + \ifdim \wd\@tempboxa >\hsize% + \setbox0=\hbox{#1: }\dimen0=\hsize\advance\dimen0 by-\wd0 + \setbox1=\vtop{\hsize=\dimen0 #2} + \hbox{\box0 \box1} + \par + \else \hbox to\hsize {\hfil \box \@tempboxa \hfil} + \fi +} +\def\parpic{% + \@ifnextchar ({\iparpic}{\iparpic(0pt,0pt)} +} +\def\iparpic(#1,#2){% + \@ifnextchar ({\@offsettrue\iiparpic(#1,#2)}% + {\@offsetfalse\iiparpic(#1,#2)(0pt,0pt)} +} +\def\iiparpic(#1,#2)(#3,#4){% + \@ifnextchar [{\iiiparpic(#1,#2)(#3,#4)}{\iiiparpic(#1,#2)(#3,#4)[l]} +} +\def\iiiparpic(#1,#2)(#3,#4)[#5]{% + \@ifnextchar [{\ivparpic(#1,#2)(#3,#4)[#5]}{\ivparpic(#1,#2)(#3,#4)[#5][]} +} +\def\ivparpic(#1,#2)(#3,#4)[#5][#6]#7{% + \let\par=\old@par\par% + \hangindent0pt\hangafter1% + \setbox\@BILD=\hbox{#7}% + \d@breite=#1\d@breite=\the\d@breite% + \ifdim\d@breite=0pt\d@breite=\wd\@BILD\fi% + \c@breite=\d@breite\divide\c@breite by65536% + \multiply\c@piccaption\c@piccaptionpos% + \d@hoehe=#2\d@hoehe=\the\d@hoehe% + \ifdim\d@hoehe=0pt\d@hoehe=\ht\@BILD\advance\d@hoehe by\dp\@BILD\fi% + \c@hoehe=\d@hoehe\divide\c@hoehe by65536% + \d@xoff=#3\c@xoff=\d@xoff\divide\c@xoff by65536% + \d@yoff=\d@hoehe% + \advance\d@yoff by-#4\c@yoff=\d@yoff\divide\c@yoff by65536% + \c@pos=1\unitlength1pt% + \if@offset% + \setbox\@BILD=\hbox{% + \begin{picture}(\c@breite,\c@hoehe)% + \put(0,0){\makebox(\c@breite,\c@hoehe){}}% + \put(\c@xoff,\c@yoff){\box\@BILD}% + \end{picture}% + }% + \else% + \setbox\@BILD=\hbox{% + \begin{picture}(\c@breite,\c@hoehe)% + \put(0,0){\makebox(\c@breite,\c@hoehe)[#6]{\box\@BILD}}% + \end{picture}% + }% + \fi% + \ifnum\c@piccaption=2% + \make@piccaption% + \advance\d@hoehe\ht\@TEXT\advance\d@hoehe\dp\@TEXT% + \c@hoehe=\d@hoehe\divide\c@hoehe by65536% + \setbox\@BILD=\vbox{\box\@BILD\vspace{-5pt}% + \hbox{\hspace{\fboxsep}\box\@TEXT}% + \vspace{4pt}}% + \fi% + \@tfor\@tempa := #5\do{% + \if\@tempa f\setbox\@BILD=\hbox{\Rahmen(\c@breite,\c@hoehe){\box\@BILD}}\fi% + \if\@tempa s\setbox\@BILD=\hbox{\Schatten(\c@breite,\c@hoehe){\box\@BILD}}\fi% + \if\@tempa o\setbox\@BILD=\hbox{\Oval(\c@breite,\c@hoehe){\box\@BILD}}\fi% + \if\@tempa d\setbox\@BILD=\hbox{\Strich(\c@breite,\c@hoehe){\box\@BILD}}\fi% + \if\@tempa x\setbox\@BILD=\hbox{\Kasten(\c@breite,\c@hoehe){\box\@BILD}}\fi% + \if\@tempa l\c@pos=1\fi% + \if\@tempa r\c@pos=2\fi% + }% + \ifnum\c@piccaption=1% + \make@piccaption% + \advance\d@hoehe\ht\@TEXT\advance\d@hoehe\dp\@TEXT% + \c@hoehe=\d@hoehe\divide\c@hoehe by65536% + \setbox\@BILD=\vbox{\box\@BILD\vspace{-5pt}\hbox{\box\@TEXT}\vspace{4pt}}% + \fi% + \ifodd\count0\c@picpos=0\else\c@picpos=\@changemode\fi% + \pagetotal=\the\pagetotal% + \d@tmp=\pagegoal\advance\d@tmp by-\pagetotal\advance\d@tmp by-\baselineskip% + \ifdim\d@hoehe>\d@tmp% + \vskip 0pt plus\d@hoehe\relax\pagebreak[3]\vskip 0pt plus-\d@hoehe\relax% + \ifnum\c@picpos=1\c@picpos=0\else\c@picpos=\@changemode\fi% + \fi% + \ifnum\c@picpos=1\ifnum\c@pos=1\c@pos=2\else\c@pos=1\fi\fi% + \ifnum\@listdepth>0 + \@listtrue\parshape 0% + \advance\hsize -\rightmargin% + \d@leftskip \leftskip% + \leftskip \@totalleftmargin% + \if@inlabel\rule{\linewidth}{0pt}\vskip-\baselineskip\relax\fi% + \else\@listfalse\medskip% + \fi% + \if@list\d@tmpa=\linewidth\else\d@tmpa=\hsize\fi% + \ifnum\c@piccaption=3% + \make@piccaption% + \d@tmp\ht\@TEXT\advance\d@tmp\dp\@TEXT% + \ifdim\d@hoehe>\d@tmp% + \setbox\@TEXT=\vbox to\d@hoehe{\vfill\box\@TEXT\vspace{.2\baselineskip}\vfill}% + \else% + \setbox\@BILD=\vbox to\d@tmp{\vfill\box\@BILD\vfill}% + \d@hoehe\d@tmp% + \fi% + \fi% + \ifnum\c@piccaption=4% + \make@piccaption% + \d@tmp\ht\@TEXT\advance\d@tmp\dp\@TEXT% + \setbox\@TEXT=\vbox to\d@hoehe{\vspace{-10pt}\box\@TEXT\vfil}% + \advance\d@hoehe-\d@tmp% + \fi% + \ifnum\c@pos=1\d@tmpa=0pt% + \ifnum\c@piccaption>2% + \setbox\@BILD=\hbox{\box\@BILD\hspace{\d@pichskip}\hbox{\box\@TEXT}}% + \fi% + \else\advance\d@tmpa by-\wd\@BILD\d@breite=-\d@breite% + \ifnum\c@piccaption>2% + \d@tmpa=0pt% + \setbox\@BILD=\hbox{\hbox{\box\@TEXT}\hspace{\d@pichskip}\box\@BILD}% + \fi% + \fi% + \p@getot@l\the\pagetotal% + \d@bskip\d@hoehe\advance\d@bskip by\parskip\advance\d@bskip by.3\baselineskip% + {\noindent\hspace*{\d@tmpa}\relax% + \box\@BILD\nopagebreak\vskip-\d@bskip\relax\nopagebreak}% + \d@tmp=-\d@hoehe\divide\d@tmp by\baselineskip% + \c@zeilen=\d@tmp\advance\c@zeilen by-1% + \ifdim\d@breite<0pt\advance\d@breite by-\d@pichskip% + \else\advance\d@breite by\d@pichskip% + \fi% + \hangindent=\d@breite% + \hangafter=\c@zeilen% + \let\par=\x@par% + \ifnum\c@piccaption=3% + \hangindent0pt\hangafter1\let\par=\old@par% + \vskip\d@hoehe\vskip.2\baselineskip% + \fi% + \c@piccaption=0% +} +\newdimen\ptoti +\newdimen\ptotii +\def\x@par{% + \ptoti\pagetotal + \old@par + \ptotii\pagetotal + \ifdim\ptoti=\ptotii + \d@tmp\d@hoehe + \else + \d@tmp\baselineskip + \multiply\d@tmp by\prevgraf + \advance\d@tmp by\parskip + \global\advance\d@hoehe by-\d@tmp\d@tmp=\d@hoehe + \fi + \ifdim\d@hoehe>0pt + \divide\d@tmp by\baselineskip\c@zeilen=-\d@tmp\advance\c@zeilen by-1 + \c@zeilen=\the\c@zeilen + \else\c@zeilen=0 + \fi + \ifnum\c@zeilen<0\hangafter=\c@zeilen\hangindent=\d@breite + \else\let\par=\old@par + \hangindent 0pt + \leftskip \d@leftskip + \if@list\parshape \@ne \@totalleftmargin \linewidth + \advance\hsize \rightmargin + \fi + \fi +} +\def\picskip#1{% + \let\par=\old@par + \par + \pagetotal\the\pagetotal + \c@tmp=#1\relax + \ifnum\c@tmp=0 + \d@tmp\baselineskip\multiply\d@tmp by\prevgraf\advance\d@tmp\parskip + \ifdim\p@getot@l<\pagetotal + \advance\d@hoehe by-\d@tmp\advance\d@hoehe by1ex + \ifdim\d@hoehe>0pt\vspace*{\d@hoehe}\fi + \fi + \ifdim\p@getot@l=\pagetotal + \advance\d@hoehe by-\d@tmp\advance\d@hoehe by1ex + \ifdim\d@hoehe>0pt\vspace*{\d@hoehe}\fi + \fi + \else\hangafter=-\c@tmp\hangindent=\d@breite + \fi + \leftskip \d@leftskip + \if@list\parshape \@ne \@totalleftmargin \linewidth + \advance\hsize \rightmargin + \fi +} +\def\hpic{% + \@ifnextchar ({\ihpic}{\ihpic(0pt,0pt)}%) +} +\def\ihpic(#1,#2){% + \@ifnextchar ({\@offsettrue\iihpic(#1,#2)}%) + {\@offsetfalse\iihpic(#1,#2)(0pt,0pt)}% +} +\def\iihpic(#1,#2)(#3,#4){% + \@ifnextchar [{\iiihpic(#1,#2)(#3,#4)}{\iiihpic(#1,#2)(#3,#4)[l]}%] +} +\def\iiihpic(#1,#2)(#3,#4)[#5]{% + \@ifnextchar [{\ivhpic(#1,#2)(#3,#4)[#5]}{\ivhpic(#1,#2)(#3,#4)[#5][]}%] +} +\def\ivhpic(#1,#2)(#3,#4)[#5][#6]#7{% + \setbox\@BILD=\hbox{#7}% + \d@breite=#1\d@breite=\the\d@breite% + \ifdim\d@breite=0pt\d@breite=\wd\@BILD\fi% + \c@breite=\d@breite\divide\c@breite by65536% + \d@hoehe=#2\d@hoehe=\the\d@hoehe% + \ifdim\d@hoehe=0pt\d@hoehe=\ht\@BILD\advance\d@hoehe by\dp\@BILD\fi% + \c@hoehe=\d@hoehe\divide\c@hoehe by65536% + \d@xoff=#3\c@xoff=\d@xoff\divide\c@xoff by65536% + \d@yoff=\d@hoehe% + \advance\d@yoff by-#4\c@yoff=\d@yoff\divide\c@yoff by65536% + \c@pos=0\d@tmpa=\parindent\parindent=0pt\unitlength1pt% + \if@offset + \setbox\@BILD=\hbox{% + \begin{picture}(\c@breite,\c@hoehe)% + \put(0,0){\makebox(\c@breite,\c@hoehe){}}% + \put(\c@xoff,\c@yoff){\box\@BILD}% + \end{picture}% + }% + \else% + \setbox\@BILD=\hbox{% + \begin{picture}(\c@breite,\c@hoehe)% + \put(0,0){\makebox(\c@breite,\c@hoehe)[#6]{\box\@BILD}}% + \end{picture}% + }% + \fi% + \@tfor\@tempa := #5\do{% + \if\@tempa f\setbox\@BILD=\hbox{\Rahmen(\c@breite,\c@hoehe){\box\@BILD}}\fi% + \if\@tempa s\setbox\@BILD=\hbox{\Schatten(\c@breite,\c@hoehe){\box\@BILD}}\fi% + \if\@tempa o\setbox\@BILD=\hbox{\Oval(\c@breite,\c@hoehe){\box\@BILD}}\fi% + \if\@tempa d\setbox\@BILD=\hbox{\Strich(\c@breite,\c@hoehe){\box\@BILD}}\fi% + \if\@tempa x\setbox\@BILD=\hbox{\Kasten(\c@breite,\c@hoehe){\box\@BILD}}\fi% + \if\@tempa t\c@pos=1\fi% + \if\@tempa b\c@pos=2\fi% + }% + \ifnum\c@pos=0\parbox{\d@breite}{\makebox[0cm]{}\\\box\@BILD\smallskip}\fi% + \ifnum\c@pos=1\parbox[t]{\d@breite}{\makebox[0cm]{}\\\box\@BILD\smallskip}\fi% + \ifnum\c@pos=2\parbox[b]{\d@breite}{\makebox[0cm]{}\\\box\@BILD\smallskip}\fi% + \parindent=\d@tmpa% +} +\def\Rahmen(#1,#2)#3{% + \c@whole=\@wholewidth\divide\c@whole by65536% + \c@half=\@halfwidth\divide\c@half by65536% + \c@tmpa=#1\advance\c@tmpa by\c@whole\advance\c@tmpa by\c@whole% + \c@tmpb=#2\advance\c@tmpb by\c@whole\advance\c@tmpb by\c@whole% + \begin{picture}(\c@tmpa,\c@tmpb)% + \put(\c@whole,\c@half){\framebox(#1,#2){#3}}% + \end{picture}% + \global\advance\d@breite by2\@wholewidth% + \global\advance\d@hoehe by2\@wholewidth% +} +\def\Schatten(#1,#2)#3{% + \c@whole=\@wholewidth\divide\c@whole by65536% + \c@half=\@halfwidth\divide\c@half by65536% + \c@shad=\d@shad\divide\c@shad by65536% + \c@tmp=\c@whole\advance\c@tmp by\c@whole\c@tmpd=\c@tmp% + \advance\c@tmp by\c@shad% + \advance\c@tmpd by#1% + \advance\c@half by\c@shad% + \c@tmpa=#1\advance\c@tmpa by\c@tmp% + \c@tmpb=#2\advance\c@tmpb by\c@tmp% + \begin{picture}(\c@tmpa,\c@tmpb)% + \put(\c@whole,\c@half){\framebox(#1,#2){#3}}% + \put(\c@shad,0){\rule{\c@tmpd pt}{\c@shad pt}}% + \put(\c@tmpd,0){\rule{\c@shad pt}{#2 pt}}% + \end{picture}% + \global\advance\d@breite by2\@wholewidth\global\advance\d@breite by\d@shad% + \global\advance\d@hoehe by2\@wholewidth\global\advance\d@hoehe by\d@shad% +} +\def\Oval(#1,#2)#3{% + \@wholewidth=0.4pt% + \c@tmpa=\the#1\divide\c@tmpa by2% + \c@tmpb=\the#2\divide\c@tmpb by2% + \begin{picture}(#1,#2)% + \put(\c@tmpa,\c@tmpb){\oval(#1,#2)}% + \put(0.4,0.4){#3}% + \end{picture}% + \global\advance\d@breite by1pt\global\advance\d@hoehe by1pt% +} +\def\Strich(#1,#2)#3{% + \c@whole=\@wholewidth\divide\c@whole by65536% + \c@half=\@halfwidth\divide\c@half by65536% + \c@dash=\d@dash\divide\c@dash by65536% + \c@tmp=\c@whole\advance\c@tmp by\c@whole% + \c@tmpa=#1\advance\c@tmpa by\c@tmp% + \c@tmpb=#2\advance\c@tmpb by\c@tmp% + \c@tmpc=#1\advance\c@tmpc by\c@whole% + \c@tmpd=#2\advance\c@tmpd by\c@whole% + \begin{picture}(\c@tmpa,\c@tmpb)% + \put(\c@half,\c@half){\dashbox{\c@dash}(\c@tmpc,\c@tmpd){#3}}% + \end{picture}% + \global\advance\d@breite by2\@wholewidth% + \global\advance\d@hoehe by2\@wholewidth% +} +\def\Kasten(#1,#2)#3{% + \@wholewidth=0.4pt% + \c@boxl=\d@boxl\divide\c@boxl by65536\c@boxl=\the\c@boxl% + \c@tmpa=#1\advance\c@tmpa by\c@boxl% + \c@tmpb=#2\advance\c@tmpb by\c@boxl% + \c@tmp=#2% + \begin{picture}(\c@tmpa,\c@tmpb)% + \put(0,\c@boxl){\framebox(#1,#2){#3}}% + \put(\c@boxl,0){\line(-1,1){\c@boxl}}% + \put(\c@boxl,0){\line(1,0){#1}\line(-1,1){\c@boxl}}% + \put(\c@boxl,0){\put(#1,0){\line(0,1){\c@tmp}% + \put(0,\c@tmp){\line(-1,1){\c@boxl}}}}% + \end{picture}% + \global\advance\d@breite by\d@boxl% + \global\advance\d@hoehe by\d@boxl% +} +\newbox\env@box% +\newdimen\d@envdp +\newcount\c@hsize +\newcount\c@envdp +\newdimen\d@envb +\long\def\frameenv{\@ifnextchar [{\@frameenv}{\@frameenv[\textwidth]}} +\long\def\@frameenv[#1]{% + \hsiz@=\textwidth \textwidth=#1 \d@envb=#1 + \advance\textwidth by-2\@wholewidth + \advance\textwidth by-2\fboxsep + \hsize=\textwidth \linewidth=\textwidth + \setbox\env@box=\vbox\bgroup}% +\def\endframeenv{% + \egroup% + \hsize=\hsiz@ \textwidth=\hsiz@ \linewidth=\hsiz@ + \c@breite=\d@envb \divide\c@breite by65536 + \advance\d@envb by-2\@wholewidth + \c@hsize=\d@envb \divide\c@hsize by65536% + \d@envdp=\dp\env@box \advance\d@envdp by\ht\env@box% + \advance\d@envdp by2\fboxsep% + \d@hoehe=\d@envdp \advance\d@hoehe by2\@wholewidth + \c@hoehe=\d@hoehe \divide\c@hoehe by65536 + \c@envdp=\d@envdp \divide\c@envdp by65536% + \c@tmp=\@wholewidth \divide\c@tmp by65536 + \vskip\@wholewidth% + \unitlength 1pt\noindent% + \begin{picture}(\c@breite,\c@hoehe)(0,0) + \put(\c@tmp,\c@tmp){\framebox(\c@hsize,\c@envdp){\box\env@box}} + \end{picture}% +} +\long\def\shadowenv{\@ifnextchar [{\@shadowenv}{\@shadowenv[\textwidth]}} +\long\def\@shadowenv[#1]{% + \hsiz@=\textwidth \textwidth=#1 \d@envb=#1 + \advance\textwidth by-2\@wholewidth + \advance\textwidth by-2\fboxsep + \advance\textwidth by-\d@shad% + \hsize=\textwidth \linewidth=\textwidth + \setbox\env@box=\vbox\bgroup}% +\def\endshadowenv{% + \egroup + \hsize=\hsiz@ \textwidth=\hsiz@ \linewidth=\hsiz@ + \d@tmpa=\d@envb + \c@breite=\d@envb \divide\c@breite by65536 + \advance\d@envb by-2\@wholewidth \advance\d@envb by-\d@shad + \c@hsize=\d@envb \divide\c@hsize by65536% + \d@envdp=\dp\env@box \advance\d@envdp by\ht\env@box% + \advance\d@envdp by2\fboxsep% + \c@envdp=\d@envdp \divide\c@envdp by65536% + \d@hoehe=\d@envdp + \advance\d@hoehe by2\@wholewidth \advance\d@hoehe by\d@shad + \c@hoehe=\d@hoehe \divide\c@hoehe by65536 + \c@shad =\d@shad \divide\c@shad by65536 + \c@tmp=\@wholewidth \divide\c@tmp by65536 + \advance\d@tmpa by-2\d@shad + \c@xoff =\d@tmpa \divide\c@xoff by65536 + \advance\c@xoff by\c@shad \advance\c@xoff by-1 + \advance\d@envdp by\@wholewidth + \vskip\@halfwidth + \unitlength 1pt\noindent% + \begin{picture}(\c@breite,\c@hoehe)(0,0) + \put(\c@tmp,\c@shad){\framebox(\c@hsize,\c@envdp){\box\env@box}} + \put(\c@shad,0){\rule{\d@tmpa}{\d@shad}}% + \put(\c@xoff,0){\rule{\d@shad}{\d@envdp}}% + \end{picture}% + \vskip\@halfwidth +} +\long\def\dashenv{\@ifnextchar [{\@dashenv}{\@dashenv[\textwidth]}} +\long\def\@dashenv[#1]{% + \hsiz@=\textwidth \textwidth=#1 \d@envb=#1 + \advance\textwidth by-2\@wholewidth \advance\textwidth by-2\fboxsep + \hsize=\textwidth \linewidth=\textwidth + \setbox\env@box=\vbox\bgroup}% +\long\def\enddashenv{% + \egroup + \hsize=\hsiz@ \textwidth=\hsiz@ \linewidth=\hsiz@ + \c@breite=\d@envb \divide\c@breite by65536 + \advance\d@envb by-\@wholewidth + \c@hsize=\d@envb \divide\c@hsize by65536% + \d@envdp=\dp\env@box \advance\d@envdp by\ht\env@box% + \advance\d@envdp by2\fboxsep% + \advance\d@envdp by\@wholewidth + \d@hoehe=\d@envdp \advance\d@hoehe by2\@wholewidth + \c@hoehe=\d@hoehe \divide\c@hoehe by65536 + \c@envdp=\d@envdp \divide\c@envdp by65536% + \c@dash=\d@dash \divide\c@dash by65536% + \c@whole=\@wholewidth \divide\c@whole by65536 + \c@half=\@halfwidth \divide\c@half by 65536 + \noindent\unitlength 1pt + \begin{picture}(\c@breite,\c@hoehe)(0,0) + \put(\c@half,\c@whole){\dashbox{\c@dash}(\c@hsize,\c@envdp){\box\env@box}} + \end{picture}% +} +\long\def\ovalenv{\@ifnextchar [{\@ovalenv}{\@ovalenv[\textwidth]}}% +\long\def\@ovalenv[#1]{% + \hsiz@=\textwidth \textwidth=#1 \d@envb=#1 + \advance\textwidth by-4\fboxsep + \hsize=\textwidth \linewidth=\textwidth + \setbox\env@box=\vbox\bgroup}% +\long\def\endovalenv{% + \egroup + \hsize=\hsiz@ \textwidth=\hsiz@ \linewidth=\hsiz@ + \@wholewidth=0.4pt + \c@breite=\d@envb \divide\c@breite by65536 + \advance\d@envb by-2\@wholewidth + \c@hsize=\d@envb \divide\c@hsize by65536% + \d@envdp=\dp\env@box \advance\d@envdp by\ht\env@box% + \advance\d@envdp by4\fboxsep% + \c@envdp=\d@envdp \divide\c@envdp by65536% + \d@hoehe=\d@envdp \advance\d@hoehe by2\@wholewidth + \c@hoehe=\d@hoehe \divide\c@hoehe by65536 + \c@tmpa=\c@hsize \divide\c@tmpa by2% + \c@tmpb=\c@envdp \divide\c@tmpb by2% + \d@tmpa=2\fboxsep \advance\d@tmpa by\@wholewidth + \c@xoff=\d@tmpa \divide\c@xoff by65536% + \advance\d@tmpa by\dp\env@box + \c@yoff=\d@tmpa \divide\c@yoff by65536% + \unitlength 1pt\noindent + \begin{picture}(\c@breite,\c@hoehe)(0,0) + \put(\c@tmpa,\c@tmpb){\oval(\c@hsize,\c@envdp)} + \put(\c@xoff,\c@yoff){\box\env@box}% + \end{picture}% +} +% \end{macrocode} +% \section{Overprint} +% \begin{macrocode} +\let\set@op\relax +\newif\if@op +\def\overprint{% + \@optrue + \set@op + \ignorespaces +} +\def\knockout{% + \@opfalse + \set@op + \ignorespaces +} +\def\testname{pdftex.def} +\ifx \Gin@driver \testname + \AtBeginDocument{ + \immediate\pdfobj{<< /Type /ExtGState /op false /OP false /OPM 0 >>} + \edef\op@off{\the\pdflastobj} + \immediate\pdfobj{<< /Type /ExtGState /op true /OP true /OPM 1 >>} + \edef\op@on{\the\pdflastobj} + \immediate\pdfobj{ << % + /GSko \op@off\space 0 R % + /GSop \op@on\space 0 R >>} + \edef\@extgs{\the\pdflastobj} + \edef\next{\global\noexpand\pdfpageresources={\the\pdfpageresources + \space /ExtGState \@extgs\space 0 R }} + \next + } + \def\set@op{% + \if@op + \pdfliteral direct {/GSop gs}% + \else + \pdfliteral direct {/GSko gs}% + \fi + \aftergroup\reset@op} + \def\reset@op{% + \if@op + \pdfliteral direct {/GSop gs}% + \else + \pdfliteral direct {/GSko gs}% + \fi + } +\fi +\def\testname{dvips.def} +\ifx \Gin@driver \testname + \def\set@op{% + \if@op + \special{ps:true setoverprint}% + \else + \special{ps:false setoverprint}% + \fi + \aftergroup\reset@op} + \def\reset@op{% + \if@op + \special{ps:true setoverprint}% + \else + \special{ps:false setoverprint}% + \fi + } +\fi +\@opfalse +\overprint +% \end{macrocode} +% \iffalse +% +%<*package> +% \fi +% \section{Package} +% On crée également un package qui va reprendre les éléments +% syntaxiques sans la mise en page générale. Cela doit servir à +% compiler des petits bouts de codes extraits de toute la gangue +% propre à un manuel complet et de pouvoir utiliser une autre classe, +% particulièrement \class{beamer}. +% +% L'idée générale est de reprendre les commandes et environnements +% concernant: +% \begin{itemize} +% \item les tableaux : +% \item les algorithmes ; +% \item les unités ; +% \item les macros |\TopStrut| et |\BottomStrut| ; +% \item les listes. +% \end{itemize} +% Il n'y a donc rien de très sorcier : c'est essentiellement de la +% recopie verbatim de certaines sections de la classe +% \class{sesamanuel}. Il n'y a que les listes qui posent un tout petit +% problème. On ne commentera donc quaisment pas le code qui suit (les +% explications (sont données plus haut). +% +% On commence par les initialisations habituelles et le chargement +% d'un certain nombre d'extensions. On garde l'option pour indiquer le +% codage d'entrée. +% \begin{macrocode} +\def\filedate{2015/03/03} +\def\fileversion{0.4} +\NeedsTeXFormat{LaTeX2e}[1995/06/01] +\ProvidesPackage{sesamanuel}[% + \filedate\space v\fileversion\space + Package pour Sesamath (SM/JCC/SM)% +] +\def\smc@enc@opt#1{\DeclareOption{#1}{\def\smc@encoding{#1}}} +\smc@enc@opt{ascii} +\smc@enc@opt{latin1} +\smc@enc@opt{latin2} +\smc@enc@opt{latin3} +\smc@enc@opt{latin4} +\smc@enc@opt{latin5} +\smc@enc@opt{latin9} +\smc@enc@opt{latin10} +\smc@enc@opt{decmulti} +\smc@enc@opt{cp850} +\smc@enc@opt{cp852} +\smc@enc@opt{cp858} +\smc@enc@opt{cp437} +\smc@enc@opt{cp437de} +\smc@enc@opt{cp865} +\smc@enc@opt{applemac} +\smc@enc@opt{macce} +\smc@enc@opt{next} +\smc@enc@opt{cp1250} +\smc@enc@opt{cp1252} +\smc@enc@opt{cp1257} +\smc@enc@opt{ansinew} +\smc@enc@opt{utf8} +\ExecuteOptions{utf8} +\ProcessOptions +\newif\ifxetex +\begingroup\expandafter\expandafter\expandafter\endgroup +\expandafter\ifx\csname XeTeXrevision\endcsname\relax + \xetexfalse +\else + \xetextrue +\fi +\RequirePackage{etex} +\ifxetex + \RequirePackage{fontspec} + \RequirePackage{xunicode} + \defaultfontfeatures{Ligatures=TeX} + \unless\ifx\smc@encoding\smc@string@utfviii + \ClassError{sesamanuel}{Vous ne pouvez pas utiliser un codage autre + que utf8 avec xelatex}{Changez les codages de tous vos fichiers + pour les transformer en utf8.}% + \fi +\else + \RequirePackage[T1]{fontenc} + \RequirePackage[\smc@encoding]{inputenc} +\fi +\RequirePackage[scaled=0.87]{helvet} +\RequirePackage{mathpazo} +\renewcommand{\ttdefault}{lmtt} +\RequirePackage{mathrsfs} +\RequirePackage{pifont} +\RequirePackage[official]{eurosym} +\RequirePackage{ifmtarg} +\RequirePackage{mathtools} +\RequirePackage{amssymb} +\RequirePackage{longtable, tabularx} +\RequirePackage{multirow} +% \end{macrocode} +% Certaines classes comme beamer peuvent appeler |xcolor| avec +% d'autres options d'extension. Il faut donc se prémunir d'un clash +% avec le test suivant. +% \begin{macrocode} +\ifdefined \XC@catcodes + \RequirePackage{colortbl} +\else + \RequirePackage[table]{xcolor} +\fi +\RequirePackage{multido} +\RequirePackage{multicol} +\RequirePackage[french]{babel} +\RequirePackage[autolanguage]{numprint} +% \end{macrocode} +% On reprend le même nuancier complet que celui de la classe. +% \begin{macrocode} +\definecolor{A1} {cmyk}{1.00, 0.00, 0.00, 0.50} +\definecolor{A2} {cmyk}{0.60, 0.00, 0.00, 0.10} +\definecolor{A3} {cmyk}{0.30, 0.00, 0.00, 0.05} +\definecolor{A4} {cmyk}{0.10, 0.00, 0.00, 0.00} +\definecolor{B1} {cmyk}{0.00, 1.00, 0.60, 0.40} +\definecolor{B2} {cmyk}{0.00, 0.85, 0.60, 0.15} +\definecolor{B3} {cmyk}{0.00, 0.20, 0.15, 0.05} +\definecolor{B4} {cmyk}{0.00, 0.05, 0.05, 0.00} +\definecolor{C1} {cmyk}{0.00, 1.00, 0.00, 0.50} +\definecolor{C2} {cmyk}{0.00, 0.60, 0.00, 0.20} +\definecolor{C3} {cmyk}{0.00, 0.30, 0.00, 0.05} +\definecolor{C4} {cmyk}{0.00, 0.10, 0.00, 0.05} +\definecolor{D1} {cmyk}{0.00, 0.00, 1.00, 0.50} +\definecolor{D2} {cmyk}{0.20, 0.20, 0.80, 0.00} +\definecolor{D3} {cmyk}{0.00, 0.00, 0.20, 0.10} +\definecolor{D4} {cmyk}{0.00, 0.00, 0.20, 0.05} +\definecolor{F1} {cmyk}{0.00, 0.80, 0.50, 0.00} +\definecolor{F2} {cmyk}{0.00, 0.40, 0.30, 0.00} +\definecolor{F3} {cmyk}{0.00, 0.15, 0.10, 0.00} +\definecolor{F4} {cmyk}{0.00, 0.07, 0.05, 0.00} +\definecolor{G1} {cmyk}{1.00, 0.00, 0.50, 0.00} +\definecolor{G2} {cmyk}{0.50, 0.00, 0.20, 0.00} +\definecolor{G3} {cmyk}{0.20, 0.00, 0.10, 0.00} +\definecolor{G4} {cmyk}{0.10, 0.00, 0.05, 0.00} +\definecolor{H1} {cmyk}{0.40, 0.00, 1.00, 0.10} +\definecolor{H2} {cmyk}{0.20, 0.00, 0.50, 0.05} +\definecolor{H3} {cmyk}{0.10, 0.00, 0.20, 0.00} +\definecolor{H4} {cmyk}{0.07, 0.00, 0.15, 0.00} +\definecolor{J1} {cmyk}{0.00, 0.50, 1.00, 0.00} +\definecolor{J2} {cmyk}{0.00, 0.20, 0.50, 0.00} +\definecolor{J3} {cmyk}{0.00, 0.10, 0.20, 0.00} +\definecolor{J4} {cmyk}{0.00, 0.07, 0.15, 0.00} +\definecolor{FondOuv} {cmyk}{0.00, 0.05, 0.10, 0.00} +\definecolor{FondAutoEvaluation}{cmyk}{0.00, 0.03, 0.15, 0.00} +\definecolor{FondTableaux} {cmyk}{0.00, 0.00, 0.20, 0.00} +\definecolor{FondAlgo} {cmyk}{0.07, 0.00, 0.30, 0.00} +\definecolor{BleuOuv} {cmyk}{1.00, 0.00, 0.00, 0.00} +\definecolor{PartieFonction} {cmyk}{1.00, 0.00, 0.00, 0.00} +\definecolor{PartieGeometrie} {cmyk}{0.80, 0.80, 0.00, 0.00} +\definecolor{PartieStatistique} {cmyk}{0.60, 0.95, 0.00, 0.20} +\definecolor{PartieStatistiqueOLD}{cmyk}{0.95, 0.60, 0.20, 0.00} +\definecolor{PartieStatistique*}{cmyk}{0.30, 1.00, 0.00, 0.00} +\definecolor{U1} {cmyk}{0.50, 0.10, 0.00, 0.10} +\definecolor{U2} {cmyk}{0.20, 0.15, 0.00, 0.00} +\definecolor{U3} {cmyk}{0.50, 0.00, 1.00, 0.00} +\definecolor{U4} {cmyk}{0.40, 0.00, 0.00, 0.00} +\definecolor{Blanc} {cmyk}{0.00, 0.00, 0.00, 0.00} +\definecolor{Gris1} {cmyk}{0.00, 0.00, 0.00, 0.20} +\definecolor{Gris2} {cmyk}{0.00, 0.00, 0.00, 0.40} +\definecolor{Gris3} {cmyk}{0.00, 0.00, 0.00, 0.50} +\definecolor{Noir} {cmyk}{0.00, 0.00, 0.00, 1.00} +\AtBeginDocument{\def\default@color{cmyk 0 0 0 1}\normalcolor} +% \end{macrocode} +% Code pour tout ce qui concerne les tableaux. On a regroupé ici les +% macros de couleurs et de longueurs utilisées pour construire les tableaux. +% \begin{macrocode} +\def\BeforeTableVSpace{1.5mm} +\def\AfterTableVSpace{1.5mm} +\colorlet{FiletTableauColor}{Gris3} +\newcommand{\tableau}[1][c]{% + \arrayrulecolor{FiletTableauColor}% + \renewcommand\tabularxcolumn[1]{>{\centering\arraybackslash}m{##1}}% + \ifcsname#1tableau\endcsname + \expandafter\let\expandafter\smc@next\csname#1tableau\endcsname + \expandafter\let\expandafter\endtableau\csname end#1tableau\endcsname + \else + \ClassError{sesamanuel} + {Le type de tableau #1 n'existe pas} + {Les types possibles sont 't', 'c', 'l', 'cl', 'T', 'C', + 'L', 'CL' et 'pr'.}% + \let\smc@next\ctableau + \let\endtableau\endctableau + \fi + \par\addvspace{\BeforeTableVSpace} + \smc@next +} +\newenvironment{ttableau}[2] +{\tabularx{#1}{|*{#2}{X|}}} +{\endtabularx\par\addvspace{\AfterTableVSpace}} +\newenvironment{Ttableau}[3] +{\tabularx{#1}{|#3|*{\numexpr#2-1}{X|}}} +{\endtabularx\par\addvspace{\AfterTableVSpace}} +\newenvironment{ctableau}[2] +{% + \tabularx{#1}{% + |>{\columncolor{FondTableaux}[\dimexpr\tabcolsep-0.5pt]}X| + *{\numexpr#2-1}{X|}}% +} +{\endtabularx\par\addvspace{\AfterTableVSpace}} +\newenvironment{Ctableau}[3] +{% + \tabularx{#1}{% + |>{\columncolor{FondTableaux}[\dimexpr\tabcolsep-0.5pt]}#3| + *{\numexpr#2-1}{X|}}% +} +{\endtabularx\par\addvspace{\AfterTableVSpace}} +\newenvironment{ltableau}[2] +{% + \tabularx{#1}{|*{#2}{X|}} + \rowcolor{FondTableaux} +} +{\endtabularx\par\addvspace{\AfterTableVSpace}} +\newenvironment{Ltableau}[3] +{% + \tabularx{#1}{|#3|*{\numexpr#2-1}{X|}} + \rowcolor{FondTableaux} +} +{\endtabularx\par\addvspace{\AfterTableVSpace}} +\newenvironment{cltableau}[2] +{% + \tabularx{#1}{% + |>{\columncolor{FondTableaux}[\dimexpr\tabcolsep-0.5pt]}X| + *{\numexpr#2-1}{X|}}% + \rowcolor{FondTableaux} +} +{\endtabularx\par\addvspace{\AfterTableVSpace}} +\newenvironment{CLtableau}[3] +{% + \tabularx{#1}{% + |>{\columncolor{FondTableaux}[\dimexpr\tabcolsep-0.5pt]}#3| + *{\numexpr#2-1}{X|}}% + \rowcolor{FondTableaux} +} +{\endtabularx\par\addvspace{\AfterTableVSpace}} +\let\lctableau\cltableau +\let\endlctableau\endcltableau +\let\LCtableau\CLtableau +\let\endLCtableau\endCLtableau +\newenvironment{prtableau}[1] +{% + \def\propriete{% + \refstepcounter{propriete}% + \psframebox*[fillcolor=TablePropertyTitleBkgColor]{% + \ProprieteFont + \textcolor{TablePropertyTitleTextColor}{ \MakeUppercase{\StringPropriete}} + \NumProprieteFont + \textcolor{TablePropertyTitleTextColor}{\thepropriete} + } + }% + \longtable{% + >{\leavevmode\endgraf\vspace{-0.3\baselineskip}} + m{0.24\dimexpr#1-6\tabcolsep} + <{\endgraf\vspace{-0.3\baselineskip}} + >{% + \leavevmode\endgraf\vspace{-0.3\baselineskip} + \columncolor{TablePropertyBkgColor} + } + m{0.46\dimexpr#1-6\tabcolsep} + <{\endgraf\vspace{-0.3\baselineskip}} + >{% + \centering\arraybackslash + \leavevmode\endgraf\vspace{-0.3\baselineskip} + } + m{0.30\dimexpr#1-6\tabcolsep} + <{\endgraf\vspace{-0.3\baselineskip}} + }% +} +{\endlongtable\par\addvspace{\AfterTableVSpace}} +\newcommand\tabX[1][\ht\@arstrutbox,\dp\@arstrutbox]{% + \smc@GetVTabX#1,,\@nil + \vrule width0pt height\smc@htTabX depth-\smc@dpTabX + \pnode(-\tabcolsep,\smc@htTabX){ul} + \pnode(-\tabcolsep,\smc@dpTabX){dl} + \hspace*{\stretch{1}}% + \pnode(\tabcolsep,\smc@htTabX){ur} + \pnode(\tabcolsep,\smc@dpTabX){dr} + \psline(ul)(dr) + \psline(dl)(ur) +} +\def\smc@GetVTabX#1,#2,{% + \edef\smc@htTabX{\the\dimexpr#1}% + \edef\smc@dpTabX{-\the\dimexpr#2}% + \smc@gobblenil +} +\def\smc@gobblenil#1\@nil{} +% \end{macrocode} +% Code pour les algorithmes. Comme pour les tableaux, on a besoin d'un +% certains nombre de longueurs et de couleurs. On les définit en +% premier lieu. +% \begin{macrocode} +\definecolor{FondAlgo} {cmyk}{0.07, 0.00, 0.30, 0.00} +\colorlet{AlgorithmeRuleColor}{D2} +\colorlet{AlgorithmeBkgColor}{FondAlgo} +\colorlet{CouleurAlgoAffiche}{Noir} +\colorlet{CouleurAlgoDemander}{Noir} +\colorlet{CouleurAlgoSaisir}{Noir} +\colorlet{CouleurAlgoStocker}{Noir} +\colorlet{CouleurAlgoSi}{Noir} +\colorlet{CouleurAlgoTantque}{Noir} +\colorlet{CouleurAlgoPour}{Noir} +\colorlet{CouleurAlgoCalcule}{Noir} +\colorlet{CouleurAlgoInitialiser}{Noir} +\colorlet{CouleurAlgoIncrementer}{Noir} +\colorlet{CouleurAlgoCommentaire}{Noir} +\colorlet{CouleurAlgoDonnerValeur}{Noir} +\def\AlgorithmeRuleWidth{1pt} +\def\AlgorithmeSep{2mm} +\def\AlgorithmeNumWidth{6mm} +\def\AlgoIndent{1em} +\def\BeforeAlgorithmeVSpace{1.5mm} +\def\AfterAlgorithmeVSpace{1.5mm} +% \end{macrocode} +% On garde les deux façons de composer les algorithmes. L'ancienne +% façon en premier. +% \begin{macrocode} +\newcounter{smc@line} +\newenvironment{oldalgorithme}{% + \ttfamily + \c@smc@line \z@ + \def\par{% + \@@par + \afterassignment\smc@displaynum\let\next=% + }% + \def\smc@displaynum{% + \ifx\next\end + \expandafter\end + \else + \global\advance\c@smc@line\@ne% + \leavevmode\hb@xt@\AlgorithmeNumWidth{\the\c@smc@line.\hss}% + \expandafter\next + \fi% + }% + \shorthandoff{;:!?}% + \@vobeyspaces + \obeylines + \begin{lrbox}{\smc@boxa}% + \minipage{\dimexpr\linewidth-\AlgorithmeRuleWidth*2-\AlgorithmeSep*2}% +} +{% + \endminipage + \end{lrbox}% + \@@par\addvspace{\BeforeAlgorithmeVSpace} + \psframebox[linecolor=AlgorithmeRuleColor, + linewidth=\AlgorithmeRuleWidth, + fillstyle=solid, + fillcolor=AlgorithmeBkgColor, + framesep=\AlgorithmeSep, + cornersize=absolute, + linearc=\AlgorithmeSep]% + {\usebox{\smc@boxa}}% + \@@par\addvspace{\AfterAlgorithmeVSpace} +} +% \end{macrocode} +% La nouvelle façon ensuite. +% \begin{macrocode} +\newcount\smc@indent +\newcommand*\smc@inc@indent{% + \advance\smc@indent\@ne +} +\newcommand*\smc@dec@indent{% + \ifnum\smc@indent>\z@ + \advance\smc@indent\m@ne + \fi +} +\newcommand*\smc@write@indent{% + \par + \refstepcounter{smc@line}% + \dimen0 \dimexpr\AlgoIndent*\smc@indent + \leavevmode\hb@xt@\AlgorithmeNumWidth{\texttt{\the\c@smc@line.}\hss}% + \hspace*{\dimen0}% +} +\newcommand*\BlocVariables{% + \smc@dec@indent + \smc@write@indent + \textit{Liste des variables utilis\'ees}% + \smc@inc@indent +} +\newcommand*\BlocEntrees{% + \smc@dec@indent + \smc@write@indent + \textit{Entr\'ees}% + \smc@inc@indent +} +\newcommand*\BlocTraitements{% + \smc@dec@indent + \smc@write@indent + \textit{Traitements} + \smc@inc@indent +} +\newcommand*\BlocAffichage{% + \smc@dec@indent + \smc@write@indent + \textit{Affichage} + \smc@inc@indent +} +\newcommand\BlocTraitementsEtAffichage{% + \smc@dec@indent + \smc@write@indent + \textit{Traitements et affichage} + \smc@inc@indent +} +\newcommand*\DeclareVar[3]{% + \smc@write@indent + \texttt{#1 \string: }% + \textit{#2}\hfill + \textcolor{CouleurAlgoCommentaire}{#3}% +} +\newcommand*\TantQue[2]{% + \smc@write@indent + \texttt{\textcolor{CouleurAlgoTantque}{\bfseries Tant que} (\texttt{#1})} + \texttt{\bfseries faire} + \smc@inc@indent + #2 + \smc@dec@indent + \smc@write@indent + \texttt{\textcolor{CouleurAlgoTantque}{\bfseries Fin Tant que}}% +} +\newcommand*\Pour[4]{% + \smc@write@indent + \texttt{\textcolor{CouleurAlgoPour}{\bfseries Pour}} + \texttt{#1} + \textcolor{CouleurAlgoPour}{\bfseries variant de} + \texttt{#2} + \textcolor{CouleurAlgoPour}{\bfseries \`a} + \texttt{#3} + \texttt{\bfseries faire} + \smc@inc@indent + #4 + \smc@dec@indent + \smc@write@indent + \texttt{\textcolor{CouleurAlgoTantque}{\bfseries Fin Pour}}% +} +\newcommand*\PourAvecPas[5]{% + \smc@write@indent + \texttt{\textcolor{CouleurAlgoPour}{\bfseries Pour}} + \texttt{#1} + \textcolor{CouleurAlgoPour}{\bfseries variant de} + \texttt{#2} + \textcolor{CouleurAlgoPour}{\bfseries \`a} + \texttt{#3} + \textcolor{CouleurAlgoPour}{\bfseries avec un pas de} + \texttt{#4} + \texttt{faire} + \smc@inc@indent + #5 + \smc@dec@indent + \smc@write@indent + \texttt{\textcolor{CouleurAlgoTantque}{\bfseries Fin Pour}}% +} +\newcommand*\SiAlors[2]{% + \smc@write@indent + \texttt{\textcolor{CouleurAlgoSi}{\bfseries Si}} + {#1} + \texttt{\textcolor{CouleurAlgoSi}{\bfseries Alors}} + \smc@inc@indent + #2 + \smc@dec@indent + \smc@write@indent + \texttt{\textcolor{CouleurAlgoSi}{\bfseries Fin Si}}% +} +\newcommand*\SiAlorsSinon[3]{% + \smc@write@indent + \texttt{\textcolor{CouleurAlgoSi}{\bfseries Si}} + {#1} + \texttt{\textcolor{CouleurAlgoSi}{\bfseries Alors}} + \smc@inc@indent + #2 + \smc@dec@indent + \smc@write@indent + \texttt{\textcolor{CouleurAlgoSi}{\bfseries Sinon}} + \smc@inc@indent + #3 + \smc@dec@indent + \smc@write@indent + \texttt{\textcolor{CouleurAlgoSi}{\bfseries Fin Si}}% +} +\newcommand*\AfficherVar[1]{% + \smc@write@indent + \textcolor{CouleurAlgoAffiche}{Afficher la valeur de} + \texttt{#1}% +} +\newcommand*\Afficher[1]{% + \smc@write@indent + \textcolor{CouleurAlgoAffiche}{Afficher} + #1% +} +\newcommand*\Calculer[1]{% + \smc@write@indent + \textcolor{CouleurAlgoCalcule}{Calculer} + #1% +} +\newcommand*\Demander[1]{% + \smc@write@indent + \textcolor{CouleurAlgoDemander}{Demander} + \texttt{#1}% +} +\newcommand*\Saisir[1]{% + \smc@write@indent + \textcolor{CouleurAlgoSaisir}{Saisir} + \texttt{#1}% +} +\newcommand*\Stocker[1]{% + \smc@write@indent + \textcolor{CouleurAlgoStocker}{Stocker} la r\'eponse dans + \texttt{#1}% +} +\newcommand*\DonnerValeur[2]{% + \smc@write@indent + \textcolor{CouleurAlgoDonnerValeur}{Donner} \`a \texttt{#1} + la valeur de \texttt{#2}% +} +\newcommand*\TitreAlgo[1]{% + \smc@write@indent + \textit{Algorithme \string: }#1 +} +\newcommand*\FinAlgo{% + \smc@dec@indent + \smc@write@indent + \textit{Fin de l'algorithme}% +} +\newenvironment{algorithme}{% + \c@smc@line\z@ + \shorthandoff{;:!?}% + \begin{lrbox}{\smc@boxa}% + \minipage{\dimexpr\linewidth-\AlgorithmeRuleWidth*2-\AlgorithmeSep*2}% +} +{% + \endminipage + \end{lrbox}% + \par\addvspace{\BeforeAlgorithmeVSpace} + \psframebox[linecolor=AlgorithmeRuleColor, + linewidth=\AlgorithmeRuleWidth, + fillstyle=solid, + fillcolor=AlgorithmeBkgColor, + framesep=\AlgorithmeSep, + cornersize=absolute, + linearc=\AlgorithmeSep]% + {\usebox{\smc@boxa}}% + \par\addvspace{\AfterAlgorithmeVSpace} +} +% \end{macrocode} +% Code pour les unités. +% \begin{macrocode} +\let\uori\u +\let\Uori\U +\let\U\relax +\newcommand\U[1]{\ensuremath{#1}} +\renewcommand\u[1]{\ensuremath{\nombre{#1}}} +\newcommand\newunit[2]{% + \expandafter\newcommand\csname u#1\endcsname[1]{% + \@ifmtarg{##1} + {\ensuremath{#2}} + {\ensuremath{\nombre{##1}\,#2}}% + }% + \expandafter\newcommand\csname U#1\endcsname[1]{% + \@ifmtarg{##1} + {\ensuremath{#2}} + {\ensuremath{##1\,#2}}% + }% +} +\newcommand\renewunit[2]{% + \expandafter\renewcommand\csname u#1\endcsname[1]{% + \@ifmtarg{##1} + {\ensuremath{#2}} + {\ensuremath{\nombre{##1}\,#2}}% + }% + \expandafter\renewcommand\csname U#1\endcsname[1]{% + \@ifmtarg{##1} + {\ensuremath{#2}} + {\ensuremath{##1\,#2}}% + }% +} +\newunit{ym}{\text{ym}} +\newunit{zm}{\text{zm}} +\newunit{am}{\text{am}} +\newunit{fm}{\text{fm}} +\newunit{pm}{\text{pm}} +\newunit{nm}{\text{nm}} +\newunit{micron}{\mu\text{m}} +\newunit{mm}{\text{mm}} +\newunit{cm}{\text{cm}} +\newunit{dm}{\text{dm}} +\newunit{m}{\text{m}} +\newunit{dam}{\text{dam}} +\newunit{hm}{\text{hm}} +\newunit{km}{\text{km}} +\newunit{Mm}{\text{Mm}} +\newunit{Gm}{\text{Gm}} +\newunit{Tm}{\text{Tm}} +\newunit{Pm}{\text{Pm}} +\newunit{Em}{\text{Em}} +\newunit{Zm}{\text{Zm}} +\newunit{Ym}{\text{Ym}} +\newunit{mmq}{\text{mm}^2} +\newunit{cmq}{\text{cm}^2} +\newunit{dmq}{\text{dm}^2} +\newunit{mq}{\text{m}^2} +\newunit{damq}{\text{dam}^2} +\newunit{hmq}{\text{hm}^2} +\newunit{kmq}{\text{km}^2} +\newunit{ha}{\text{ha}} +\newunit{mmc}{\text{mm}^3} +\newunit{cmc}{\text{cm}^3} +\newunit{dmc}{\text{dm}^3} +\newunit{mc}{\text{m}^3} +\newunit{damc}{\text{dam}^3} +\newunit{hmc}{\text{hm}^3} +\newunit{kmc}{\text{km}^3} +\newunit{hl}{\text{hl}} +\newunit{dal}{\text{dal}} +\newunit{l}{\text{l}} +\newunit{dl}{\text{dl}} +\newunit{cl}{\text{cl}} +\newunit{ml}{\text{ml}} +\newunit{hel}{\text{h$\ell$}} +\newunit{dael}{\text{da$\ell$}} +\newunit{el}{\text{$\ell$}} +\newunit{del}{\text{d$\ell$}} +\newunit{cel}{\text{c$\ell$}} +\newunit{mel}{\text{m$\ell$}} +\newunit{s}{\text{s}} +\newunit{min}{\text{min}} +\newunit{h}{\text{h}} +\newunit{ms}{\text{m$\cdot$s}^{-1}} +\newunit{mh}{\text{m$\cdot$h}^{-1}} +\newunit{kms}{\text{km$\cdot$s}^{-1}} +\newunit{kmmin}{\text{km$\cdot$min}^{-1}} +\newunit{kmh}{\text{km$\cdot$h}^{-1}} +\newunit{ls}{\text{$\ell\cdot$s}^{-1}} +\newunit{mg}{\text{mg}} +\newunit{cg}{\text{cg}} +\newunit{dg}{\text{dg}} +\newunit{g}{\text{g}} +\newunit{dag}{\text{dag}} +\newunit{hg}{\text{hg}} +\newunit{kg}{\text{kg}} +\newunit{T}{\text{T}} +\newunit{pc}{\%} +\newunit{deg}{\text{\degre}} +\newunit{degc}{\text{\degre C}} +\newunit{euro}{\text{\euro}} +% \end{macrocode} +% Code pour les strut +% \begin{macrocode} +\newcommand*\Strut[1][1]{% + \leavevmode + \vrule \@height #1\ht\strutbox + \@depth #1\dp\strutbox + \@width\z@ +} +\newcommand*\TopStrut[1][1]{% + \leavevmode + \vrule \@height #1\ht\strutbox + \@depth \z@ + \@width \z@ +} +\newcommand*\BotStrut[1][1]{% + \leavevmode + \vrule \@height \z@ + \@depth #1\dp\strutbox + \@width \z@ +} +% \end{macrocode} +% \begin{macro}{\setlist} +% Code pour les listes. Ici, il faut choisir le type de liste qu'on +% veut obtenir. Pour cela, on utilise la macro |\setlist| qui va +% permettre à l'utilisateur de pouvoir choisir lui-même l'aspect des +% listes. +% +% Le principe est de passer en paramètre le code de la partie +% voulue. On a les possibilités : +% \begin{itemize} +% \item prerequis ; +% \item AE ; +% \item exapp ; +% \item def ; +% \item activite ; +% \item rem ; +% \item exemple ; +% \item proof ; +% \item exercice ; +% \item acquis ; +% \item commentaire ; +% \item recreation ; +% \item annexe ; +% \item lexique ; +% \item libre. +% \end{itemize} +% \begin{macrocode} +\newcommand\setlist[1]{% + \expandafter\let\expandafter\itemize + \csname smc@#1itemize\endcsname + \expandafter\let\expandafter\enditemize + \csname endsmc@#1itemize\endcsname + \expandafter\let\expandafter\colitemize + \csname smc@#1colitemize\endcsname + \expandafter\let\expandafter\endcolitemize + \csname endsmc@#1colitemize\endcsname + \expandafter\let\expandafter\enumerate + \csname smc@#1enumerate\endcsname + \expandafter\let\expandafter\endenumerate + \csname endsmc@#1enumerate\endcsname + \expandafter\let\expandafter\colenumerate + \csname smc@#1colenumerate\endcsname + \expandafter\let\expandafter\endcolenumerate + \csname endsmc@#1colenumerate\endcsname +} +% \end{macrocode} +% \end{macro} +% Auparavant, il faut toutes les couleurs et les longueurs utilisées +% par les listes. +% \begin{macrocode} +\colorlet{CommentaireItemColor}{Noir} +\colorlet{PrerequisItemColor}{B2} +\colorlet{AEItemColor}{B2} +\colorlet{ActiviteItemColor}{C1} +\colorlet{DefItemColor}{B2} +\colorlet{RemItemColor}{H1} +\colorlet{ExempleItemColor}{J1} +\colorlet{ExAppItemColor}{A2} +\colorlet{ProofItemColor}{J2} +\colorlet{ExerciceItemColor}{G1} +\colorlet{AcquisItemColor}{F1} +\colorlet{RecreationItemColor}{U3} +\colorlet{LexiqueItemColor}{B2} +\def\ListLabelWidth{4mm} +\def\EnumerateLabelWidth{5mm} +% \end{macrocode} +% Listes de type itemize et corritemize +% \begin{macrocode} +\newcommand*\DeclareCorrItemize[2]{% + \newenvironment{smc@corr#1itemize}{% + \def\item{\par#2~}% + \ignorespaces + } + {\par} +} +\def\smc@setalllist{% + \setlength{\leftmargin}{\ListLabelWidth}% + \setlength{\rightmargin}{0mm}% + \setlength{\labelwidth}{\ListLabelWidth}% + \setlength{\labelsep}{0mm}% + \setlength{\itemindent}{0mm}% + \setlength{\listparindent}{0mm}% + \setlength{\topsep}{0mm}% + \setlength{\partopsep}{\baselineskip}% + \setlength{\itemsep}{0mm}% + \setlength{\parsep}{0mm}% + \def\makelabel##1{##1\hss}% +} +\let\smc@setallfirstlist\smc@setalllist +\def\smc@setallbiglist{% + \setlength{\leftmargin}{\EnumerateLabelWidth}% + \setlength{\rightmargin}{0mm}% + \setlength{\labelwidth}{\EnumerateLabelWidth}% + \setlength{\labelsep}{0mm}% + \setlength{\itemindent}{0mm}% + \setlength{\listparindent}{0mm}% + \setlength{\topsep}{0mm}% + \setlength{\partopsep}{\baselineskip}% + \setlength{\itemsep}{0mm}% + \setlength{\parsep}{0mm}% + \def\makelabel##1{##1\hss}% +} +\newenvironment{smc@prerequisitemize}{% + \ifnum\@listdepth=\z@ + \list{\textcolor{PrerequisItemColor}{$\blacktriangleright$}} + {\smc@setalllist}% + \else + \list{\textcolor{PrerequisItemColor}{$\blacktriangleright$}} + {\smc@setalllist}% + \fi +} +{\endlist} +\DeclareCorrItemize{prerequis} + {\textcolor{PrerequisItemColor}{$\blacktriangleright$}} +\newenvironment{smc@AEitemize}{% + \ifnum\@listdepth=\z@ + \list{\textcolor{AEItemColor}{$\bullet$}} + {\smc@setalllist}% + \else + \list{\textcolor{AEItemColor}{$\bullet$}} + {\smc@setalllist}% + \fi +} +{\endlist} +\DeclareCorrItemize{AE}{\textcolor{AEItemColor}{$\bullet$}} +\newenvironment{smc@exappitemize}{% + \ifnum\@listdepth=\z@ + \list{\textcolor{ExAppItemColor}{$\bullet$}} + {\smc@setalllist}% + \else + \list{\textcolor{ExAppItemColor}{$\bullet$}} + {\smc@setalllist}% + \fi +} +{\endlist} +\DeclareCorrItemize{exapp}{\textcolor{ExAppItemColor}{$\bullet$}} +\newenvironment{smc@defitemize}{% + \ifnum\@listdepth=\z@ + \list{% + \color{DefItemColor}% + \vrule width \ItemRuleWidth + height \ItemRuleHeight + depth \ItemRuleDepth + \relax} + {\smc@setalllist}% + \else + \list{% + \color{DefItemColor}% + \vrule width \ItemRuleWidth + height \ItemRuleHeight + depth \ItemRuleDepth + \relax} + {\smc@setalllist}% + \fi +} +{\endlist} +\DeclareCorrItemize{def}{% + \textcolor{DefItemColor}{% + \vrule width \ItemRuleWidth + height \ItemRuleHeight + depth \ItemRuleDepth + }% +} +\newenvironment{smc@activiteitemize}{% + \ifnum\@listdepth=\z@ + \list{\textcolor{ActiviteItemColor}{$\bullet$}} + {\smc@setalllist}% + \else + \list{\textcolor{ActiviteItemColor}{$\bullet$}} + {\smc@setalllist}% + \fi +} +{\endlist} +\DeclareCorrItemize{activite}{\textcolor{ActiviteItemColor}{$\bullet$}} +\newenvironment{smc@remitemize}{% + \ifnum\@listdepth=\z@ + \list{% + \color{RemItemColor} + \vrule width \ItemRuleWidth + height \ItemRuleHeight + depth \ItemRuleDepth + \relax} + {\smc@setalllist}% + \else + \list{% + \color{RemItemColor} + \vrule width \ItemRuleWidth + height \ItemRuleHeight + depth \ItemRuleDepth + \relax} + {\smc@setalllist}% + \fi +} +{\endlist} +\DeclareCorrItemize{rem}{% + \textcolor{RemItemColor}{% + \vrule width \ItemRuleWidth + height \ItemRuleHeight + depth \ItemRuleDepth + }% +} +\newenvironment{smc@exempleitemize}{% + \ifnum\@listdepth=\z@ + \list{\textcolor{ExempleItemColor}{$\bullet$}} + {\smc@setalllist}% + \else + \list{\textcolor{ExempleItemColor}{$\bullet$}} + {\smc@setalllist}% + \fi +} +{\endlist} +\DeclareCorrItemize{exemple}{\textcolor{ExempleItemColor}{$\bullet$}} +\newenvironment{smc@proofitemize}{% + \ifnum\@listdepth=\z@ + \list{\textcolor{ProofItemColor}{$\bullet$}} + {\smc@setalllist}% + \else + \list{\textcolor{ProofItemColor}{$\bullet$}} + {\smc@setalllist}% + \fi +} +{\endlist} +\DeclareCorrItemize{proof}{\textcolor{ProofItemColor}{$\bullet$}} +\newenvironment{smc@exerciceitemize}{% + \ifnum\@listdepth=\z@ + \list{\textcolor{ExerciceItemColor}{$\bullet$}} + {\smc@setalllist}% + \else + \list{\textcolor{ExerciceItemColor}{$\bullet$}} + {\smc@setalllist}% + \fi +} +{\endlist} +\DeclareCorrItemize{exercice}{\textcolor{ExerciceItemColor}{$\bullet$}} +\newenvironment{smc@acquisitemize}{% + \ifnum\@listdepth=\z@ + \list{\textcolor{AcquisItemColor}{\footnotesize$\blacktriangleright$}} + {\smc@setalllist}% + \else + \list{\textcolor{AcquisItemColor}{$\bullet$}} + {\smc@setalllist}% + \fi +} +{\endlist} +\DeclareCorrItemize{acquis}{\textcolor{AcquisItemColor}{$\bullet$}} +\newenvironment{smc@commentaireitemize}{% + \ifnum\@listdepth=\z@ + \list{\textcolor{CommentaireItemColor}{$\bullet$}} + {\smc@setalllist}% + \else + \list{\textcolor{CommentaireItemColor}{$\bullet$}} + {\smc@setalllist}% + \fi +} +{\endlist} +\DeclareCorrItemize{commentaire}{\textcolor{CommentaireItemColor}{$\bullet$}} +\newenvironment{smc@recreationitemize}{% + \ifnum\@listdepth=\z@ + \list{\textcolor{RecreationItemColor}{$\bullet$}} + {\smc@setalllist}% + \else + \list{\textcolor{RecreationItemColor}{$\bullet$}} + {\smc@setalllist}% + \fi +} +{\endlist} +\DeclareCorrItemize{recreation}{\textcolor{RecreationItemColor}{$\bullet$}} +\newenvironment{smc@annexeitemize}{% + \ifnum\@listdepth=\z@ + \list{% + \color{AnnexeItemColor} + \vrule width \ItemRuleWidth + height \ItemRuleHeight + depth \ItemRuleDepth + \relax} + {\smc@setalllist}% + \else + \list{% + \color{AnnexeItemColor} + \vrule width \ItemRuleWidth + height \ItemRuleHeight + depth \ItemRuleDepth + \relax} + {\smc@setalllist}% + \fi +} +{\endlist} +\newenvironment{smc@lexiqueitemize}{% + \ifnum\@listdepth=\z@ + \list{\textcolor{LexiqueItemColor}{$\bullet$}} + {\smc@setalllist}% + \else + \list{\textcolor{LexiqueItemColor}{$\bullet$}} + {\smc@setalllist}% + \fi +} +{\endlist} +\newenvironment{smc@libreitemize}{% + \ifnum\@listdepth=\z@ + \list{% + \color{LibreItemColor} + \vrule width \ItemRuleWidth + height \ItemRuleHeight + depth \ItemRuleDepth + \relax} + {\smc@setalllist}% + \else + \list{% + \color{LibreItemColor} + \vrule width \ItemRuleWidth + height \ItemRuleHeight + depth \ItemRuleDepth + \relax} + {\smc@setalllist}% + \fi +} +{\endlist} +\DeclareCorrItemize{libre}{% + \textcolor{LibreItemColor}{% + \vrule width \ItemRuleWidth + height \ItemRuleHeight + depth \ItemRuleDepth + }% +} +% \end{macrocode} +% Listes de type enumerate +% \begin{macrocode} +\newenvironment{bigenumerate} + {% + \let\smc@setallfirstlist\smc@setallbiglist + \begin{enumerate} + } + {\end{enumerate}} +\newcommand\DeclareEnumerate[3]{% + \newenvironment{smc@#1enumerate}{% + \gdef\smc@curr@itemcmd{#2}% + \gdef\smc@curr@itemcolor{#3}%( + \renewcommand\labelenumi{\textcolor{#3}{#2\theenumi)}}%( + \renewcommand\labelenumii{\textcolor{#3}{#2\theenumii)}}%( + \renewcommand\labelenumiii{\textcolor{#3}{#2\theenumiii)}}% + \advance\@enumdepth \@ne + \ifnum\@enumdepth>\thr@@ + \ClassError{sesamanuel}{Pas plus de 3 niveaux de liste} + {Consultez la documentation pour plus de renseignements.} + \else\ifnum\@enumdepth=\@ne + \edef\@enumctr{enum\romannumeral\the\@enumdepth}% + \expandafter + \list + \csname label\@enumctr\endcsname + {% + \usecounter{\@enumctr}% + \smc@setallfirstlist + }% + \else + \edef\@enumctr{enum\romannumeral\the\@enumdepth}% + \expandafter + \list + \csname label\@enumctr\endcsname + {% + \usecounter{\@enumctr}% + \smc@setalllist + }% + \fi\fi + } + {\endlist} + \newenvironment{smc@corr#1enumerate}{% + \gdef\smc@curr@itemcmd{#2}% + \gdef\smc@curr@itemcolor{#3}%( + \setcounter{enumi}{0}% + \setcounter{enumii}{0}% + \setcounter{enumiii}{0}% + \renewcommand\labelenumi{\textcolor{#3}{#2\theenumi)}}%( + \renewcommand\labelenumii{\textcolor{#3}{#2\theenumii)}}%( + \renewcommand\labelenumiii{\textcolor{#3}{#2\theenumiii)}}% + \advance\@enumdepth \@ne + \ifnum\@enumdepth>\thr@@ + \ClassError{sesamanuel}{Pas plus de 3 niveaux de liste} + {Consultez la documentation pour plus de renseignements.} + \else + \def\smc@enum{% + \refstepcounter{enum\romannumeral\@enumdepth}% + \csname labelenum\romannumeral\@enumdepth\endcsname~ + }% + \def\item{% + \smc@enum + \def\item{\par\smc@enum}% + }% + \fi + \ignorespaces + } + {\par} +} +\DeclareEnumerate{prerequis}{}{PrerequisItemColor} +\DeclareEnumerate{exapp}{\bfseries}{ExAppItemColor} +\DeclareEnumerate{def}{\bfseries}{DefItemColor} +\DeclareEnumerate{AE}{\bfseries}{AEItemColor} +\DeclareEnumerate{activite}{\bfseries}{ActiviteItemColor} +\DeclareEnumerate{rem}{}{RemItemColor} +\DeclareEnumerate{exemple}{}{ExempleItemColor} +\DeclareEnumerate{proof}{}{ProofItemColor} +\DeclareEnumerate{exercice}{\bfseries}{ExerciceItemColor} +\DeclareEnumerate{acquis}{\bfseries}{AcquisItemColor} +\DeclareEnumerate{commentaire}{}{CommentaireItemColor} +\DeclareEnumerate{recreation}{\bfseries}{RecreationItemColor} +\DeclareEnumerate{annexe}{}{AnnexeItemColor} +\DeclareEnumerate{lexique}{}{LexiqueItemColor} +\DeclareEnumerate{libre}{}{LibreItemColor} +% \end{macrocode} +% Listes de type colitemize. On a besoin d'une longueur, de deux +% compteurs et de deux chaînes fixes pour les \environ{colitemize} et +% \environ{colenumerate} +% \begin{macrocode} +\def\ListHSep{2mm} +\newcount\smc@nbitem +\newcount\smc@nbline +\newcommand*\StringColitemize{colitemize} +\newcommand*\StringColenumerate{colenumerate} +\newcommand*\DeclareColItemize[3]{% + \newenvironment{#1}[1]{% + \par + \def\smc@nbcolumn{##1}% + \smc@nbitem \z@ + \edef\StringColCurrent{\StringColitemize}% + \toks@{}% + \smc@getbody + }% + {% + \expandafter\smc@splititem\the\toks@\item\@nil\item + \smc@nbline \numexpr \smc@nbitem+\smc@nbcolumn-1 + \divide\smc@nbline \smc@nbcolumn + \multido{\n=1+1}{\smc@nbline}{% + \multido{\ni=\n+\the\smc@nbline}{\smc@nbcolumn}{% + \unless\ifnum\ni>\smc@nbitem + \makebox[\ListLabelWidth]{\textcolor{#2}{#3}\hss}% + \begin{minipage}[t]{\dimexpr + (\linewidth-\ListHSep*(\smc@nbcolumn-1))% + /\smc@nbcolumn-\ListLabelWidth} + \strut\@nameuse{smc@item\ni}\strut + \end{minipage}% + \hspace{\ListHSep}% + \fi + }% + \ifnum\n=\smc@nbline + \endgraf + \else + \\ + \fi + }% + }% +} +\long\def\smc@getbody#1\end{% + \toks@\expandafter{\the\toks@#1}\smc@testend +} +\long\def\smc@testend#1{% + \def\smc@arg{#1}% + \ifx\smc@arg\StringColCurrent + \end{#1}% + \else + \toks@\expandafter{\the\toks@\end{#1}}% + \expandafter\smc@getbody + \fi +} +\long\def\smc@splititem#1\item{% + \smc@@splititem +} +\long\def\smc@@splititem#1\item{% + \def\smc@arg{#1}% + \ifx\smc@arg\@nnil + \else + \advance\smc@nbitem\@ne + \@namedef{smc@item\the\smc@nbitem}{#1}% + \expandafter\smc@@splititem + \fi +} +\DeclareColItemize{smc@prerequiscolitemize} + {PrerequisItemColor}{$\blacktriangleright$} +\DeclareColItemize{smc@AEcolitemize} + {AEItemColor}{$\bullet$} +\DeclareColItemize{smc@exappcolitemize} + {ExAppItemColor}{$\bullet$} +\DeclareColItemize{smc@defcolitemize} + {DefItemColor} + {% + \vrule width \ItemRuleWidth + height \ItemRuleHeight + depth \ItemRuleDepth + \relax + } +\DeclareColItemize{smc@activitecolitemize} + {ActiviteItemColor}{$\bullet$} +\DeclareColItemize{smc@remcolitemize} + {RemItemColor} + {% + \vrule width \ItemRuleWidth + height \ItemRuleHeight + depth \ItemRuleDepth + \relax + } +\DeclareColItemize{smc@exemplecolitemize} + {ExempleItemColor}{$\bullet$} +\DeclareColItemize{smc@proofcolitemize} + {ProofItemColor}{$\bullet$} +\DeclareColItemize{smc@exercicecolitemize} + {ExerciceItemColor}{$\bullet$} +\DeclareColItemize{smc@acquiscolitemize} + {AcquisItemColor}{$\bullet$} +\DeclareColItemize{smc@commentairecolitemize} + {CommentaireItemColor}{$\bullet$} +\DeclareColItemize{smc@recreationcolitemize} + {RecreationItemColor}{$\bullet$} +\DeclareColItemize{smc@annexecolitemize} + {AnnexeItemColor} + {% + \vrule width \ItemRuleWidth + height \ItemRuleHeight + depth \ItemRuleDepth + \relax + } +\DeclareColItemize{smc@lexiquecolitemize} + {LexiqueItemColor}{$\bullet$} +\DeclareColItemize{smc@librecolitemize} + {LibreItemColor} + {% + \vrule width \ItemRuleWidth + height \ItemRuleHeight + depth \ItemRuleDepth + \relax + } +% \end{macrocode} +% Listes de type colenumerate. +% \begin{macrocode} +\newcommand*\DeclareColEnumerate[3]{% + \newenvironment{#1}[1]{% + \par\leavevmode + \advance\@enumdepth \@ne + \ifnum\@enumdepth>\thr@@ + \ClassError{sesamanuel}{Pas plus de 3 niveaux de liste} + {Consultez la documentation pour plus de renseignements.} + \else + \ifcase\@enumdepth + \or %( + \def\@enumlabel{\textcolor{#3}{#2\ni)}}%( + \or + \def\@enumlabel{\textcolor{#3}{#2{\@alph\ni})}}%( + \or + \def\@enumlabel{\textcolor{#3}{#2{\@roman\ni)}}}% + \fi + \fi + \def\smc@nbcolumn{##1}% + \smc@nbitem \z@ + \edef\StringColCurrent{\StringColenumerate}% + \toks@{}% + \smc@getbody + } + {% + \expandafter\smc@splititem\the\toks@\item\@nil\item + \smc@nbline \numexpr \smc@nbitem+\smc@nbcolumn-1 + \divide\smc@nbline \smc@nbcolumn + \multido{\n=1+1}{\smc@nbline}{% + \multido{\ni=\n+\the\smc@nbline}{\smc@nbcolumn}{% + \unless\ifnum\ni>\smc@nbitem + \makebox[\ListLabelWidth]{\@enumlabel\hss}% + \begin{minipage}[t]{\dimexpr + (\linewidth-\ListHSep*(\smc@nbcolumn-1))% + /\smc@nbcolumn-\ListLabelWidth} + \strut\@nameuse{smc@item\ni}\strut + \end{minipage}% + \hspace{\ListHSep}% + \fi + }% + \ifnum\n=\smc@nbline + \endgraf + \else + \\ + \fi + }% + }% +} +\DeclareColEnumerate{smc@prerequiscolenumerate} + {}{PrerequisItemColor} +\DeclareColEnumerate{smc@exappcolenumerate} + {\bfseries}{ExAppItemColor} +\DeclareColEnumerate{smc@defcolenumerate} + {\bfseries}{DefItemColor} +\DeclareColEnumerate{smc@AEcolenumerate} + {\bfseries}{AEItemColor} +\DeclareColEnumerate{smc@activitecolenumerate} + {}{ActiviteItemColor} +\DeclareColEnumerate{smc@remcolenumerate} + {}{RemItemColor} +\DeclareColEnumerate{smc@exemplecolenumerate} + {}{ExempleItemColor} +\DeclareColEnumerate{smc@proofcolenumerate} + {}{ProofItemColor} +\DeclareColEnumerate{smc@exercicecolenumerate} + {\bfseries}{ExerciceItemColor} +\DeclareColEnumerate{smc@acquiscolenumerate} + {\bfseries}{AcquisItemColor} +\DeclareColEnumerate{smc@commentairecolenumerate} + {\bfseries}{CommentaireItemColor} +\DeclareColEnumerate{smc@recreationcolenumerate} + {\bfseries}{RecreationItemColor} +\DeclareColEnumerate{smc@annexecolenumerate} + {\bfseries}{AnnexeItemColor} +\DeclareColEnumerate{smc@lexiquecolenumerate} + {\bfseries}{RecreationItemColor} +\DeclareColEnumerate{smc@librecolenumerate} + {\bfseries}{LibreItemColor} +% \end{macrocode} +% \iffalse +% +%<*packageTIKZ> +% \fi +% \section{Package TIKZ} +% Cette extension propose un certains nombre d'outils spécifiques (la +% majorité concernant TikZ d'où son nom) pour composer l'ouvrage de +% seconde. +% \begin{macrocode} +\def\filedate{2015/03/03} +\def\fileversion{1.0} +\NeedsTeXFormat{LaTeX2e}[1995/06/01] +\ProvidesPackage{sesamanuelTIKZ}[% + \filedate\space v\fileversion\space + compagnon de Sesamanuel (SM/JCC/SM)% +] +% \end{macrocode} +% On commence par charger quelques extensions annexes. La première +% pour les vecteurs, les autres pour TikZ. +% \begin{macrocode} +\RequirePackage{esvect} +\RequirePackage{tikz} +\RequirePackage{tkz-tab} +\RequirePackage{pgf} +\usetikzlibrary{arrows} +\usetikzlibrary{patterns} +% \end{macrocode} +% \begin{macro}{\chapeaumelon} +% La macro |\chapeaumelon| est utilisée pour noter les arcs de cercle. +% \begin{macrocode} +\newcommand{\chapeaumelon}[1]{\stackrel{\Large \frown}{#1}} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\Logosesa} +% La macro |\Logosesa| sert à composer le logo en couleur de Sesamath. +% \begin{macrocode} +\newcommand{\Logosesa}{% + \textcolor{orange}{% + \boldmath + $ + \overline{\textcolor{gray}{S}} + \acute{\textcolor{gray}e} + \overline{ + \textcolor{gray}{sa} + \textcolor{black}{math} + } + $% + }% +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\TikZ} +% La macro |\TikZ| sert à composer le logo officiel de TikZ. +% \begin{macrocode} +\newcommand\TikZ{Ti\textit{k}Z} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\UniteGras} +% La macro |\UniteGras| met en gras ce qui suit indifféremment en mode +% mathématique ou texte (à condition que la fonte correspondant grasse +% existe bien). +% \begin{macrocode} +\newcommand\UniteGras[1]{{\bfseries \boldmath #1}} +% \end{macrocode} +% \end{macro} +% \begin{macro}{couleurs} +% On définit ici deux couleurs qui ont servi lors de l'impression de +% l'ouvrage car les couleurs B1 et H1 posaient des problèmes de +% passage dans la rotative. Ces couleurs peuvent être certainement +% ignorées par un utilisateur non professionnel de l'imprimerie. +% \begin{macrocode} +\definecolor{B1prime}{cmyk}{0.00, 1.00, 0.00, 0.50} +\definecolor{H1prime}{cmyk}{0.50, 0.00, 1.00, 0.00} +% \end{macrocode} +% \end{macro} +% \begin{macro}{macros TikZ} +% Le reste du code de cette extension sert pour les figures en +% TikZ. On ne détaillera pas outre mesure ces macros. +% \begin{macrocode} +\definecolor{CyanTikz40}{cmyk}{.4,0,0,0} +\definecolor{CyanTikz20}{cmyk}{.2,0,0,0} +\tikzstyle{general}=[line width=0.3mm, >=stealth, x=1cm, y=1cm, + line cap=round, line join=round] +\tikzstyle{quadrillage}=[line width=0.3mm, color=CyanTikz40] +\tikzstyle{quadrillageNIV2}=[line width=0.3mm, color=CyanTikz20] +\tikzstyle{quadrillage55}=[line width=0.3mm, color=CyanTikz40, + xstep=0.5, ystep=0.5] +\tikzstyle{cote}=[line width=0.3mm, <->] +\tikzstyle{epais}=[line width=0.5mm, line cap=butt] +\tikzstyle{tres epais}=[line width=0.8mm, line cap=butt] +\tikzstyle{axe}=[line width=0.3mm, ->, color=Noir, line cap=rect] +\newcommand{\quadrillageSeyes}[2]{% + \draw[line width=0.3mm, color=A1!10, ystep=0.2, xstep=0.8] + #1 grid #2; + \draw[line width=0.3mm, color=A1!30, xstep=0.8, ystep=0.8] + #1 grid #2; +} +\newcommand{\axeX}[4][0]{% + \draw[axe] (#2,#1)--(#3,#1); + \foreach \x in {#4} {% + \draw (\x,#1) node {\small $+$}; + \draw (\x,#1) node[below] {\small $\x$}; + }% +} +\newcommand{\axeY}[4][0]{% + \draw[axe] (#1,#2)--(#1,#3); + \foreach \y in {#4} {% + \draw (#1, \y) node {\small $+$}; + \draw (#1, \y) node[left] {\small $\y$}; + }% +} +\newcommand{\axeOI}[3][0]{% + \draw[axe] (#2,#1)--(#3,#1); + \draw (1,#1) node {\small $+$}; + \draw (1,#1) node[below] {\small $I$}; +} +\newcommand{\axeOJ}[3][0]{% + \draw[axe] (#1,#2)--(#1,#3); + \draw (#1, 1) node {\small $+$}; + \draw (#1, 1) node[left] {\small $J$}; +} +\newcommand{\axeXgraduation}[2][0]{% + \foreach \x in {#2} {% + \draw (\x,#1) node {\small $+$}; + }% +} +\newcommand{\axeYgraduation}[2][0]{% + \foreach \y in {#2} {% + \draw (#1, \y) node {\small $+$}; + }% +} +\newcommand{\origine}{\draw (0,0) node[below left] {\small $0$};} +\newcommand{\origineO}{\draw (0,0) node[below left] {$O$};} +\newcommand{\point}[4]{\draw (#1,#2) node[#4] {$#3$};} +\newcommand{\pointGraphique}[4]{% + \draw (#1,#2) node[#4] {$#3$}; + \draw (#1,#2) node {$+$}; +} +\newcommand{\pointFigure}[4]{% + \draw (#1,#2) node[#4] {$#3$}; + \draw (#1,#2) node {$\times$}; +} +\newcommand{\pointC}[3]{\draw (#1) node[#3] {$#2$};} +\newcommand{\pointCGraphique}[3]{% + \draw (#1) node[#3] {$#2$}; + \draw (#1) node {$+$}; +} +\newcommand{\pointCFigure}[3]{% + \draw (#1) node[#3] {$#2$}; + \draw (#1) node {$\times$}; +} +% \end{macrocode} +% \end{macro} +% \iffalse +% +% \fi +% \setcounter{IndexColumns}{2}\PrintIndex +% \newpage +% \PrintChanges +% \endinput -- cgit v1.2.3