%
% ColorRgb.tex version 3.3 au 17-12-1993
% for PostScript printers.
%
% ColorRgb.tex is a set of color macros for TeX & LaTeX written by:
%
% 					  Christophe C\'erin
%
%   Universit\'e de Paris Sud		Universit\'e de Picardie Jules Verne
%   L.R.I bat 490					UFR Maths & Informatique
%   91405 ORSAY France				33, rue St Leu
%   email: cerin@lri.lri.fr			80039 Amiens France
%
% from a initial version named "Colorrgb.tex 2.9" in collaboration with 
% Benoit Lemaire.
%
% Permission is granted for use and non-profit distribution of rgb.tex
% providing that this notice be clearly maintained, but the right to
% distribute any portion of color/tex for profit or as part of any commercial
% product is specifically reserved for the author.
%
% compatibilities : LaTeX : use of variables \fboxsep and \fboxrule in \fboxc
%
\ifx\colorrgbloaded\relax\let\next\endinput
\else \let\colorrgbloaded\relax\let\next\relax \fi
\next
\catcode`\@=11\relax%
\newwrite\@unused%
\def\typeout#1{{\let\protect\string\immediate\write\@unused{#1}}}%
\typeout{ColorRgb.tex 3.3 by Christophe Cerin}%
\typeout{ColorRgb.tex 3.3 for PostScript Laser Printer and dvips driver}%
\typeout{ColorRgb.tex 3.3 release, 17-12-1993}%
%
%-------RGB---------
\def\beginrgbcolor#1#2#3{%
    \special{ps::[begin]%
	 currentrgbcolor #1 255 div #2 255 div #3 255 div setrgbcolor}}
\def\endrgbcolor{%
	\special{ps::[end] setrgbcolor}}

\def\rgbcolor#1#2#3{\aftergroup\endrgbcolor%
	\beginrgbcolor{#1}{#2}{#3}}
%-------HSB--------
\def\beginhsbcolor#1#2#3{%
    \special{ps::[begin]%
	 currenthsbcolor #1 255 div #2 255 div #3 255 div sethsbcolor}}
\def\endhsbcolor{%
	\special{ps::[end] sethsbcolor}}

\def\hsbcolor#1#2#3{\aftergroup\endhsbcolor%
	\beginhsbcolor{#1}{#2}{#3}}
%-------CMYK--------
\def\begincymkcolor#1#2#3#4{%
    \special{ps::[begin]%
	 currentcymkcolor #1 255 div #2 255 div %
		#3 255 div #4 255 div setcymkcolor}}
\def\endcymkcolor{%
	\special{ps::[end] setcymkcolor}}

\def\cymkcolor#1#2#3#4{\aftergroup\endcymkcolor%
	\begincymkcolor{#1}{#2}{#3}{4}}
%------------------
%	Init forme des traits
\countdef\CCap=90
\countdef\Join=91
\CCap=1\Join=1
\def\InitCapJoinMatrix#1#2{%
\ifnum #1 >2 #2 > 2 #1 < 0 #2 < 0 {%
	\typeout{***bad argument range in function InitCapJoinMatrix}
}\else{%
	\CCap=#1\Join=#2%
}
\fi
}

\def\SetCapJoinMatrix#1#2{%
% modification de la facon de terminer les traits :
%	si #1 = 0 alors terminaison de trait nette
%	si #1 = 1 alors terminaison de trait arrondi centre'
%	si #1 = 2 alors terminaison de trait carre'
%	si #2 = 0 alors angle de trait carre
%	si #2 = 1 alors angle de trait arrondi
%	si #2 = 2 alors angle de trait carre
\ifnum #1 >2 #2 > 2 #1 < 0 #2 < 0 {%
	\typeout{***bad argument range in function InitCapJoinMatrix}
}\else%
	(\the\CCap ) cvi setlinecap (\the\Join ) cvi setlinejoin %
\fi
}
%------------------
% boite dont le contour est trac\'e en couleur :
% il s'agit de la meme definition que celle fournit dans Latex.tex 1.09
% et utilise les variables \fboxrule et \fboxsep : elle ne peut donc
% s'utiliser directement que sous LaTeX
% appel \fboxcolor{text}{red}{green}{bleu}
\def\fboxcolor#1#2#3#4{\leavevmode%
   \setbox\@tempboxa\hbox{#1}\@tempdima\fboxrule%
   \advance\@tempdima \fboxsep \advance\@tempdima\dp\@tempboxa%
   \beginrgbcolor{#2}{#3}{#4}%
   \hbox{\lower\@tempdima\hbox%
	{\vbox{\hrule\@height\fboxrule%
          \hbox{\vrule\@width\fboxrule\hskip\fboxsep%
	    \vbox{\vskip\fboxsep\endrgbcolor\box\@tempboxa%
		\beginrgbcolor{#2}{#3}{#4}\vskip\fboxsep}%
		   \hskip 1pt%
			 \hskip\fboxsep\vrule\@width\fboxrule}%
		   \hrule\@height\fboxrule}}}\endrgbcolor}%

% \boxcolor : boite dont le contenu est en couleur,
% on utilise les variables \fboxrule et \fboxsep : elle ne peut donc
% s'utiliser directement que sous LaTeX. De plus, on utilise la boite
% \@myboxb et la dimension \@mydimb afin de pouvoir effectuer un \fboxcolor
% qui n'aurait pas ete possible avec l'utilisation de \@tempboxa (conflit
% de variable)
% appel \boxcolor{text}{red}{green}{bleu}
\def\boxcolor#1#2#3#4{\leavevmode%
	\newbox\@myboxb\newdimen\@mydimb%
	\setbox\@myboxb\hbox{\hskip\fboxsep\hbox{#1}%
	\hskip\fboxsep}\@mydimb\fboxrule%
	\advance\@mydimb\dp\@myboxb%
	\beginrgbcolor{#2}{#3}{#4}%
	\hbox{%\hskip\fboxsep%
		\lower\@mydimb\hbox%
		{\vbox{\hsize=\ht\@myboxb\vsize=\wd\@myboxb%
		\hbox{\vrule\@width\wd\@myboxb%
		\hskip-\wd\@myboxb%
		\vbox{\endrgbcolor%
		\vskip\fboxsep\box\@myboxb\vskip\fboxsep}%
}}}}}%

\def\underlinecolor#1#2#3#4{%
	\newbox\@myboxbb\newbox\@myboxcc%
	\setbox\@myboxbb=\hbox{#1}%
	\setbox\@myboxcc=\hbox{\beginrgbcolor{#2}{#3}{#4}%
		   \vrule height .5pt depth 0pt width \wd\@myboxbb\endrgbcolor}
	\hbox{\raise -2.8pt\vbox{\offinterlineskip\@myboxbb\@myboxcc}}}


\countdef\rouge=112% contient la valeur de la composante rouge
\countdef\vert=113% contient la valeur de la composante vert
\countdef\bleu=114% contient la valeur de la composante bleu
\countdef\increrouge=115% contient la valeur de l'increment du rouge
\countdef\increvert=116% contient la valeur de l'increment du vert
\countdef\increbleu=117% contient la valeur de l'increment du bleu
\countdef\modulo=118% valeur du nombre de lettres dans la meme couleur
\countdef\sauverouge=119% contient la valeur de la composante rouge sauvegardee
\countdef\sauvevert=120% contient la valeur de la composante vert sauvegardee
\countdef\sauvebleu=121% contient la valeur de la composante bleu sauvegardee
\countdef\maxrouge=122% contient la valeur de la composante rouge maximale
\countdef\maxvert=123% contient la valeur de la composante vert maximale
\countdef\maxbleu=124% contient la valeur de la composante bleu maximale
% procedure d'initialisation des couleurs, utilisation :
% \initcolor{rouge}{vert}{bleu}{maxrouge}{maxvert}{maxbleu}{modulo}
\def\initcolor#1#2#3#4#5#6#7{% procedure d'initialisation des couleurs
	\rouge=#1\vert=#2\bleu=#3\modulo=#7%
	\sauverouge=#1\sauvevert=#2\sauvebleu=#3%
	\maxrouge=#4\maxvert=#5\maxbleu=#6}
\def\initinc#1#2#3{% procedure d'initialisation des increments
	\increrouge=#1\increvert=#2\increbleu=#3}
\def\incrouge#1{%
	\global\advance\rouge by #1}
\def\incvert#1{%
	\global\advance\vert by #1}
\def\incbleu#1{%
	\global\advance\bleu by #1}
\def\decrouge#1{%
	\global\advance\rouge by -#1}
\def\decvert#1{%
	\global\advance\vert by -#1}
\def\decbleu#1{%
	\global\advance\bleu by -#1}
\def\incmodulo#1{% procedure d'increment du modulo
	\global\advance\modulo by #1}
\initcolor{20}{20}{20}{210}{210}{210}{1}%
\initinc{40}{40}{40}%
% La procedure echelon prend une chaine de caracteres et imprime les
% modulo premiers caracteres dans la couleur specifiee par les 3 composantes
% rouge, vert, bleu puis incremente chaque composante d'une valeur, puis imprime
% encore modulo caracteres dans cette nouvelle couleur jusqu'a ce que modulo
% atteigne une borne max. Dans ce cas on recommence l'affichage des modulo 
% caracteres suivants a partir de la couleur du 
% tout debut qui est constituee par les variables \sauvexxx.
% Utilisation : 
%	texte texte .....
%	\initcolor{rouge}{vert}{bleu}{maxrouge}{maxvert}{maxbleu}{modulo}
%	\initinc{incrouge}{incvert}{incbleu}
%	\echelon{blablabla}
%	texte texte .....
\def\echelon#1{\echelons[#1]}
\def\echelons#1{\def\tete{}%
	\countdef\myinc=200%
	\myinc=1%
	\def\ECHELON##1{\ifx##1]%
	    \def\next{\tete}%
	    \else\ifnum\myinc>\modulo{%
			\ifnum\sauverouge<\maxrouge
				{\incrouge{\the\increrouge}}%
			\else
				{\decrouge{\the\increrouge}}%
			\fi
			\ifnum\sauvevert<\maxvert
				{\incvert{\the\increvert}}%
			\else
				{\decvert{\the\increvert}}%
			\fi
			\ifnum\sauvebleu<\maxbleu
				{\incbleu{\the\increbleu}}%
			\else
				{\decbleu{\the\increbleu}}%
			\fi
			\multiply\myinc by 0%
			\global\advance\myinc by 2%
		}\else{%
			\global\advance\myinc by 1%
		}\fi
		\ifnum\sauverouge<\maxrouge
			{\ifnum\rouge>\maxrouge{%
				\global\rouge=\sauverouge%
			}\fi}%
		\else
			{\ifnum\rouge<\maxrouge{%
				\global\rouge=\sauverouge%
			}\fi}%
		\fi%
		\ifnum\sauvevert<\maxvert
			{\ifnum\vert>\maxvert{%
				\global\vert=\sauvevert%
			}\fi}%
		\else
			{\ifnum\vert<\maxvert{%
				\global\vert=\sauvevert%
			}\fi}%
		\fi%
		\ifnum\sauvebleu<\maxbleu
			{\ifnum\bleu>\maxbleu{%
				\global\bleu=\sauvebleu%
			}\fi}%
		\else
			{\ifnum\bleu<\maxbleu{%
				\global\bleu=\sauvebleu%
			}\fi}%
		\fi%
		\edef\tete{\tete\beginrgbcolor{\number\rouge}{\number\vert}{\number\bleu}##1\endrgbcolor}%
		\let\next=\ECHELON\fi%
		\next}\ECHELON}

% La procedure dentdescie prend une chaine de caracteres et imprime les
% modulo premiers caracteres dans la couleur specifiee par les 3 composantes
% rouge, vert, bleu puis incremente chaque composante d'une valeur, puis imprime
% encore modulo caracteres dans cette nouvelle couleur jusqu'a ce que modulo
% atteigne une borne max. Dans ce cas on recommence l'affichage des modulo 
% caracteres suivants en decrementant les couleurs jusqu'aux valeurs initiales
% qui sont sauvegardees dans les variables \sauvexxx. La variable globale
% \sens initialisee a 1 determine un eclaircissement des couleurs, alors que
% sens = 0 determine un noircissement des couleurs.
% Utilisation : 
%	texte texte .....
%	\initcolor{rouge}{vert}{bleu}{maxrouge}{maxvert}{maxbleu}{modulo}
%	\initinc{incrouge}{incvert}{incbleu}
%	\sens=1%
%	\dentdescie{blablabla}
%	texte texte .....
\countdef\sens=201%
\sens=1% pour eclaircir et 0 pour noircir
\def\dentdescie#1{\dentdescies[#1]}
\def\dentdescies#1{\def\tete{}%
	\countdef\myinc=200%
	\myinc=1%
	\def\DENTDESCIE##1{\ifx##1]%
	    \def\next{\tete}%
	    \else\ifnum\myinc>\modulo{%
			\ifnum\sens>0{%
				\incrouge{\the\increrouge}%
				\incvert{\the\increvert}%
				\incbleu{\the\increbleu}%
			}\else{%
				\decrouge{\the\increrouge}%
				\decvert{\the\increvert}%
				\decbleu{\the\increbleu}%
			}\fi%
			\global\myinc=2%
		}\else{%
			\global\advance\myinc by 1%
		}\fi
		\ifnum\rouge>\maxrouge{%
			\global\rouge=\maxrouge%
			\global\sens=0%
		}\fi%
		\ifnum\vert>\maxvert{%
			\global\sens=0%
			\global\vert=\maxvert%
		}\fi%
		\ifnum\bleu>\maxbleu{%
			\global\bleu=\maxbleu%
			\global\sens=0%
		}\fi%
		\ifnum\rouge<\sauverouge{%
			\global\rouge=\sauverouge%
			\global\sens=1%
		}\fi%
		\ifnum\vert<\sauvevert{%
			\global\sens=1%
			\global\vert=\sauvevert%
		}\fi%
		\ifnum\bleu<\sauvebleu{%
			\global\bleu=\sauvebleu%
			\global\sens=1%
		}\fi%
		\edef\tete{\tete\beginrgbcolor{\number\rouge}{\number\vert}{\number\bleu}##1\endrgbcolor}%
		\let\next=\DENTDESCIE\fi%
		\next}\DENTDESCIE}

%La macro degrade prend une chaine de caracteres puis repartit uniformement
%les gammes de couleurs definies par initcolor sur l'ensemble de la chaine
\def\degrade#1{%
	\countdef\lg=220%
	\longueur[#1]%
	\ifnum\lg=0{%
		\typeout{macro degrade : parametre vide}}
	\else{%
	    \ifnum\lg>1{%
		\global\advance\lg by -1% astuce des piquets et des barrieres
		\ifnum\sauverouge<\maxrouge{%
			\increrouge=\maxrouge%
			\global\advance\increrouge by -\sauverouge}%
		\else{%
			\increrouge=\sauverouge%
			\global\advance\increrouge by -\maxrouge}%
		\fi
		\global\divide\increrouge by \lg%
		\ifnum\sauvevert<\maxvert{%
			\increvert=\maxvert%
			\global\advance\increvert by -\sauvevert}%
		\else{%
			\increvert=\sauvevert%
			\global\advance\increvert by -\maxvert}%
		\fi
		\global\divide\increvert by \lg%
		\ifnum\sauvebleu<\maxbleu{%
			\increbleu=\maxbleu%
			\global\advance\increbleu by -\sauvebleu}%
		\else{%
			\increbleu=\sauvebleu%
			\global\advance\increbleu by -\maxbleu}%
		\fi
		\global\divide\increbleu by \lg}%
	    \fi%
	    \echelons[#1]}%
	\fi}%


%La macro longueur calcule la longueur d'une chaine. Le resultat est stocke
%dans la variable globale \lg. Le parametre doit etre entre crochets
\def\longueur#1{%
	\lg=0%
	\def\LONGUEUR##1{%
		\ifx##1]%
			\def\next{}%
		\else%
			\global\advance\lg by 1%
			\let\next=\LONGUEUR%
		\fi
		\next}
	\LONGUEUR}

% quelques redefinitions

\def\icone{
    \item[\beginrgbcolor{255}{255}{0}$\bullet$\endcolor]}
\def\ictwo{
    \item[\beginrgbcolor{255}{255}{0}$\bf\diamond$\endcolor]}
\def\bcrouge{\beginrgbcolor{255}{0}{0}}
\def\bcbleu{\beginrgbcolor{0}{0}{255}}
\def\bcjaune{\beginrgbcolor{255}{255}{0}}
\def\bcvert{\beginrgbcolor{0}{255}{0}}
\def\bcmauve{\beginrgbcolor{255}{255}{0}}
\def\bcmagenta{\beginrgbcolor{0}{255}{0}}
\def\bcorange{\beginrgbcolor{0}{153}{255}}
\def\bcvj{\beginrgbcolor{153}{51}{255}}
\def\bcblanc{\beginrgbcolor{255}{255}{255}}
\def\ec{\endrgbcolor}
\def\aquamarine{\beginrgbcolor{112}{219}{147}}		
\def\MediumAquamarine{\beginrgbcolor{50}{204}{153}}
\def\black{\beginrgbcolor{0}{0}{0}}
\def\blue{\beginrgbcolor{0}{0}{255}}
\def\CadetBlue{\beginrgbcolor{95}{159}{159}}
\def\CornflowerBlue{\beginrgbcolor{66}{66}{111}}
\def\DarkSlateBlue{\beginrgbcolor{107}{35}{142}}
\def\LightBlue{\beginrgbcolor{191}{216}{216}}
\def\LightSteelBlue{\beginrgbcolor{143}{143}{188}}
\def\MediumBlue{\beginrgbcolor{50}{50}{204}}
\def\MediumSlateBlue{\beginrgbcolor{127}{0}{255}}
\def\MidnightBlue{\beginrgbcolor{47}{47}{79}}
\def\NavyBlue{\beginrgbcolor{35}{35}{142}}
\def\navy{\beginrgbcolor{35}{35}{142}}
\def\SkyBlue{\beginrgbcolor{50}{153}{204}}
\def\SlateBlue{\beginrgbcolor{0}{127}{255}}
\def\SteelBlue{\beginrgbcolor{35}{107}{142}}
\def\coral{\beginrgbcolor{255}{127}{0}}
\def\cyan{\beginrgbcolor{0}{255}{255}}
\def\purple{\beginrgbcolor{176}{0}{255}}
\def\firebrick{\beginrgbcolor{142}{35}{35}}
\def\brown{\beginrgbcolor{165}{42}{42}}
\def\SandyBrown{\beginrgbcolor{244}{164}{96}}
\def\gold{\beginrgbcolor{204}{127}{50}}
\def\goldenrod{\beginrgbcolor{219}{219}{112}}
\def\MediumGoldenrod{\beginrgbcolor{234}{234}{173}}
\def\green{\beginrgbcolor{0}{255}{0}}
\def\DarkGreen{\beginrgbcolor{47}{79}{47}}
\def\DarkOliveGreen{\beginrgbcolor{79}{79}{47}}
\def\ForestGreen{\beginrgbcolor{35}{142}{35}}
\def\LimeGreen{\beginrgbcolor{50}{204}{50}}
\def\MediumForestGreen{\beginrgbcolor{107}{142}{35}}
\def\MediumSeaGreen{\beginrgbcolor{66}{111}{66}}
\def\MediumSpringGreen{\beginrgbcolor{127}{255}{0}}
\def\PaleGreen{\beginrgbcolor{143}{188}{143}}
\def\SeaGreen{\beginrgbcolor{35}{142}{107}}
\def\SpringGreen{\beginrgbcolor{0}{255}{127}}
\def\YellowGreen{\beginrgbcolor{153}{204}{50}}
\def\DarkSlateGrey{\beginrgbcolor{47}{79}{79}}
\def\DarkSlateGray{\beginrgbcolor{47}{79}{79}}
\def\DimGrey{\beginrgbcolor{84}{84}{84}}
\def\DimGray{\beginrgbcolor{84}{84}{84}}
\def\LightGrey{\beginrgbcolor{168}{168}{168}}
\def\LightGray{\beginrgbcolor{168}{168}{168}}
\def\gray{\beginrgbcolor{192}{192}{192}}
\def\grey{\beginrgbcolor{192}{192}{192}}
\def\khaki{\beginrgbcolor{159}{159}{95}}
\def\magenta{\beginrgbcolor{255}{0}{255}}
\def\maroon{\beginrgbcolor{142}{35}{107}}
\def\orange{\beginrgbcolor{204}{50}{50}}
\def\orchid{\beginrgbcolor{219}{112}{219}}
\def\DarkOrchid{\beginrgbcolor{153}{50}{204}}
\def\MediumOrchid{\beginrgbcolor{147}{112}{219}}
\def\pink{\beginrgbcolor{188}{143}{143}}
\def\plum{\beginrgbcolor{234}{173}{234}}
\def\red{\beginrgbcolor{255}{0}{0}}
\def\IndianRed{\beginrgbcolor{79}{47}{47}}
\def\MediumVioletRed{\beginrgbcolor{219}{112}{147}}
\def\OrangeRed{\beginrgbcolor{255}{0}{127}}
\def\VioletRed{\beginrgbcolor{204}{50}{153}}
\def\salmon{\beginrgbcolor{111}{66}{66}}
\def\sienna{\beginrgbcolor{142}{107}{35}}
\def\tan{\beginrgbcolor{219}{147}{112}}
\def\thistle{\beginrgbcolor{216}{191}{216}}
\def\turquoise{\beginrgbcolor{173}{234}{234}}
\def\DarkTurquoise{\beginrgbcolor{112}{147}{219}}
\def\MediumTurquoise{\beginrgbcolor{112}{219}{219}}
\def\violet{\beginrgbcolor{79}{47}{79}}
\def\BlueViolet{\beginrgbcolor{159}{95}{159}}
\def\wheat{\beginrgbcolor{216}{216}{191}}
\def\white{\beginrgbcolor{255}{255}{255}}
\def\yellow{\beginrgbcolor{255}{255}{0}}
\def\GreenYellow{\beginrgbcolor{147}{219}{112}}

%---Definitions des macros pour tracer des cercles.

\def\PScouleur#1#2#3#4#5#6{%
% le parametre #4 est de la forme 123.24556pt : le "pt" est de
% trop ce qui necessite le traitement avec la macro /pttt pour
% recuperer le reel 123.24556. Le parametre #6 represente la couleur.
\ifcase #6\or\special{"gsave 
		/pttt (#4) (pt) search pop 3 1 roll pop pop cvr def
		0 0 moveto
		currentpoint translate
		#2 #2 #3 sub #5 div cvi neg #3{
%			newpath dup /valeur exch def
			newpath /valeur exch def
			valeur 255 div 0 0 setrgbcolor
			0 0 moveto
			0 0 valeur #3 sub #2 #3 sub div
			pttt mul 72 div 35 mul 0 360 arc fill
			closepath
		} for
		grestore}
\or\special{"gsave 
		/pttt (#4) (pt) search pop 3 1 roll pop pop cvr def
		0 0 moveto
		currentpoint translate
		#2 #2 #3 sub #5 div cvi neg #3{
			newpath /valeur exch def
			0 valeur 255 div 0 setrgbcolor
			0 0 moveto
			0 0 valeur #3 sub #2 #3 sub div
			pttt mul 72 div 35 mul 0 360 arc fill
			closepath
		} for
		grestore}
\or\special{"gsave 
		/pttt (#4) (pt) search pop 3 1 roll pop pop cvr def
		0 0 moveto
		currentpoint translate
		#2 #2 #3 sub #5 div cvi neg #3{
			newpath /valeur exch def
			0 0 valeur 255 div setrgbcolor
			0 0 moveto
			0 0 valeur #3 sub #2 #3 sub div
			pttt mul 72 div 35 mul 0 360 arc fill
			closepath
		} for
		grestore}\fi}

\def\CercleCouleurRGB#1#2#3#4#5#6{%
% appel : \CercleCouleurRouge{texte}{max}{min}{rayon}{nb-nuances}
% trace un cercle degrade autour du texte "texte" en commencant
% par un grand cercle de rayon max "max" jusqu'au petit cercle de
% rayon min "min" en tracant "nb-nuances" nuances de couleur
\dimen4=#4
\divide\dimen4 by 2
\hbox{\hsize\dimen4\hskip\dimen4
	\vbox to #4{\vskip\dimen4
		\PScouleur{#1}{#2}{#3}{#4}{#5}{#6}
	}%
      \hskip-\dimen4\hskip8pt
      \setbox1=\hbox{#1}%
      \dimen5=\wd1%
      \divide\dimen5 by 2%
      \raise\dimen5\vbox{\hbox{#1}}
}}

\def\CercleCouleur#1#2#3#4#5{%
% appel : \CercleCouleur{texte}{max}{min}{couleur}{nb-nuances}
% trace un cercle degrade autour du texte "texte" en commencant
% par un grand cercle de couleur "max" jusqu'au petit cercle de
% couleur "min" en tracant "nb-nuances" nuances de couleur
% "couleur"
\setbox3\hbox{#1}\newdimen\rayon
\ifdim\ht3>\wd3%
	\rayon=\ht3%
\else%
	\rayon=\wd3%
\fi%
\advance\rayon by 16pt
%\typeout{rayon = \the\rayon}
% diametre du cercle = (max{largueur texte, hauteur texte} + 16pt)
\ifnum #2 > 255 #3 <0
	\typeout{Les parametres de CercleCouleur sont incorrectes !!!}
\else
	\ifcase #4\or\CercleCouleurRGB{#1}{#2}{#3}{\the\rayon}{#5}{1}
			  \or\CercleCouleurRGB{#1}{#2}{#3}{\the\rayon}{#5}{2}
			  \or\CercleCouleurRGB{#1}{#2}{#3}{\the\rayon}{#5}{3}
	\fi
	\ifnum #4 > 3
	    \typeout{+++++Mauvais parametre dans Cercle Couleur : #4}
	\fi
\fi
}

%--------definitions generales des cercles en couleur-------------

% ces variables determinent l'offset du clipping path
\newdimen\xtrans\xtrans=0pt
\newdimen\ytrans\ytrans=0pt

\def\PSgenerale#1#2#3#4#5#6#7#8{%
% le parametre #9 est de la forme 123.24556pt : le "pt" est de
% trop ce qui necessite le traitement avec la macro /pttt pour
% recuperer le reel 123.24556.
\special{"gsave 
		/pttt (#8) (pt) search pop 3 1 roll pop pop cvr def
		/xtrans (\the\xtrans ) (pt) search pop 3 1 roll pop pop cvr def
		/ytrans (\the\ytrans ) (pt) search pop 3 1 roll pop pop cvr def
		/offsetrayon {xtrans dup mul ytrans dup mul add sqrt 2 mul} def
		/valeurrouge #1 def
		/valeurvert #2 def
		/valeurbleu #3 def
		0 0 moveto
		currentpoint translate
		newpath
			0 0 moveto
			0 0 #1 #4 sub #1 #4 sub div
			pttt mul 72 div 35 mul 0 360 arc 
		closepath clip
		xtrans ytrans translate
		#1 #1 #4 sub #7 1 sub div cvi neg #4{
			newpath 
			/valeur exch def
			valeurrouge 255 div 
			valeurvert 255 div 
			valeurbleu 255 div
			setrgbcolor
			0 0 moveto
			0 0 valeur #4 sub #1 #4 sub div
			pttt offsetrayon add mul 0.5 mul 0 360 arc fill
			stroke
			/valeurrouge valeurrouge #1 #3 sub #7 div cvi neg add def
			/valeurvert valeurvert #2 #5 sub #7 div cvi neg add def
			/valeurbleu valeurbleu #3 #6 sub #7 div cvi neg add def
		} for
		grestore}
}

\def\CercleGRGB#1#2#3#4#5#6#7#8#9{%
% appel : \CercleGRGB{texte}{rouge}{vert}{bleu}
%			{maxrouge}{maxvert}{maxbleu}{nb-nuances}{rayon}
% trace un cercle degrade autour du texte "texte" en commencant
% par un grand cercle de couleur "rouge"+"vert"+"bleu" jusqu'au 
% petit cercle de couleur "maxrouge"+"maxvert"+"maxbleu" en tracant 
% "nb-nuances=#8" nuances de couleur
\dimen4=#9%
\divide\dimen4 by 2%
\dimen5\dimen4
%\advance\dimen5 by 16pt
\hbox to #9{\hskip\dimen5
	\vbox to #9{\vskip\dimen4%
		\PSgenerale{#2}{#3}{#4}{#5}{#6}{#7}{#8}{#9}%
	}%
	\hskip-\dimen5%\hskip-6pt
	\setbox1=\hbox{#1}%
	\dimen5=#9\divide\dimen5 by 2%
	\dimen4=\ht1\divide\dimen4 by 2
	\advance\dimen5 by -\dimen4
	\raise\dimen5\vbox{\hbox{#1}}
}}

\def\CercleGeneral#1#2#3#4#5#6#7#8{%
% appel : \CercleGeneral{texte}{rouge}{vert}{bleu}{maxrouge}
%			{maxvert}{maxbleu}{nb-nuances}
% trace un cercle degrade autour du texte "texte" en commencant
% par un grand cercle de couleur "rouge"+"vert"+bleu" jusqu'au 
% petit cercle de couleur "maxrouge"+"maxvert"+"maxbleu" en tracant 
% "nb-nuances" nuances de couleur.
\setbox3\hbox{#1}\newdimen\rayon%
\ifdim\ht3>\wd3%
	\rayon=\ht3%
\else%
	\rayon=\wd3%
\fi%
\advance\rayon by 16pt%
%\typeout{rayon = \the\rayon}
% diametre du cercle = (max{largueur texte, hauteur texte} + 16pt)
\ifnum #2 > 255 #5 <0 #3 > 255 #6 <0 #4 > 255 #7 <0%
	\typeout{Les parametres de CercleGeneral sont incorrects !!!}
\else
	\CercleGRGB{#1}{#2}{#3}{#4}{#5}{#6}{#7}{#8}{\the\rayon}%
\fi
}

%--------definitions generales des rectancles degrades en couleur-------

\newif\ifhorizontal% determine le "sens" du degrade : gauche-droite
\horizontaltrue  % ou haut-bas

\def\PSrectangle#1#2#3#4#5#6#7#8{%
% trace un rectangle divise en #7 rectangles chacun dans une couleur
% differente. Si \ifhorizontal est vrai alors les rectangles sont empiles
% horizontalement, sinon verticalement. Le parametre #8==la boite
% dont on peut extraire la hauteur et la largueur.
% ATTENTION : on ecrit des commandes \TeX au milieu d'un ordre
% \special !!!
\setbox6\hbox{#8}
\special{" gsave 
		\SetCapJoinMatrix{\the\CCap}{\the\Join}
		/pthauteur (\the\ht6) (pt) search pop 3 1 roll pop pop cvr def
		/ptlargueur (\the\wd6) (pt) search pop 3 1 roll pop pop cvr def
		/valeurrouge #1 def
		/valeurvert #2 def
		/valeurbleu #3 def
		0 0 moveto 
		currentpoint translate
		\ifhorizontal
		#1 #1 #4 sub #7 1 sub div cvi neg #4{
			pop
			valeurrouge 255 div abs
			valeurvert 255 div abs
			valeurbleu 255 div abs
			setrgbcolor
			newpath
				0 0 moveto
				ptlargueur 0 rlineto
				0 pthauteur #7 div neg rlineto
				ptlargueur neg 0 rlineto
			closepath fill
			/valeurrouge valeurrouge #2 #5 sub #7 1 sub div neg add def
			/valeurvert valeurvert #2 #5 sub #7 1 sub div neg add def
			/valeurbleu valeurbleu #3 #6 sub #7 1 sub div neg add def
			0 pthauteur #7 div neg moveto currentpoint translate
		} for
		\else
		#1 #1 #4 sub #7 1 sub div cvi neg #4{
			pop
			valeurrouge 255 div valeurvert 255 div valeurbleu 255 div
			setrgbcolor
			newpath
				0 0 moveto
				ptlargueur #7 div 0 rlineto
				0 pthauteur neg rlineto
				ptlargueur neg #7 div 0 rlineto
			closepath fill
			/valeurrouge valeurrouge #2 #5 sub #7 1 sub div neg add def
			/valeurvert valeurvert #2 #5 sub #7 1 sub div neg add def
			/valeurbleu valeurbleu #3 #6 sub #7 1 sub div neg add def
			ptlargueur #7 div 0 moveto currentpoint translate
		} for
		\fi
		grestore}}

\def\RectangleDegrade#1#2#3#4#5#6#7#8{%
% appel : \RectangleDegrade{texte}{rouge}{vert}{bleu}{maxrouge}
%			{maxvert}{maxbleu}{nb-nuances}
% trace un rectangle degrade autour du texte "texte" en commencant
% par un rectangle de couleur "rouge"+"vert"+bleu" jusqu'au 
% rectangle de couleur "maxrouge"+"maxvert"+"maxbleu" en tracant 
% "nb-nuances" nuances de couleur. Le sens du degrade est determine par la
% variable booleene \ifhorizontal.
\setbox3=\hbox{\hskip 8pt\vbox{\vskip 2pt\hbox{#1}\vskip 2pt}\hskip 8pt}
\ifnum #2 > 255 #5 <0 #3 > 255 #6 <0 #4 > 255 #7 <0
	\typeout{Les parametres de RectangleGeneral sont incorrects !!!}
\else
\hbox{\hskip-4pt
\hbox{\hsize\wd3%
	\vbox to \ht3{%
		\vskip-3pt%
		\PSrectangle{#2}{#3}{#4}{#5}{#6}{#7}{#8}{\copy3}
	}%
	\hskip 11pt%
	\raise 8pt\vbox{\hbox{#1}}}
}
\fi
}

%-----------------------Des macros pour le dessin-----------------

\newif\ifdashps % determine si on veut des pointilles
\dashpsfalse
\def\bezierps#1 \endbezierps#2#3#4#5#6#7{%
% trace une courbe de bezier avec les points du parametre #1 qui
% est un tableau de tableaux. Le parametre #2 contient la largueur
% des traits. Lorsque l'on veut tracer des courbes pointillees, il faut
% positionner le boolean \ifdashps a vrai (\dashpstrue) et a ce moment
% #3 contient le nombre total d'espaces noirs et d'espaces blancs selon
% les unites de mesures courantes ; #4 definit le nombre d'unites \`a
% placer en debut de trait : [9] 4 setdash --> un trait pointille. Si
% on a positionner \dashpsfalse alors la courbe est continue.
% attention ; les unites sont des millimetres et il faut un blanc avant
%	      \endbezierps
% constitue de 4 unites, puis 5, puis 4, puis 5 ...
% l'ordre des parametres est :
%	\bezierps [ [ x0 y0 x1 y1 x2 y2 x3 y3 ] ...] \endbezierps{}{}
% #5 = intensite du rouge < 256, #6 = intensite du vert < 256
% #7 = intensite du bleu < 256
%	Enfin, la constante 2.85 = 72 / 25.6 ==> pour travailler en mm
\special{" gsave 2.85 2.85 scale #2 setlinewidth  
	\ifdashps [ #3 ] #4 setdash \fi 
	\SetCapJoinMatrix{\the\CCap}{\the\Join}
	#5 255 div #6 255 div #7 255 div setrgbcolor 
	newpath 0 0 moveto currentpoint translate 
	#1 { aload pop 8 -2 roll moveto curveto } forall stroke grestore}}


\def\ellipseps#1#2#3#4#5#6#7#8{%
% trace une ellipse avec les dimensions (#1,#2). #1 represente la "largeur" de 
% l'ellipse et #2 la hauteur (exprimees en mm). Le parametre #3 
% contient la largueur des traits. Lorsque l'on veut tracer une
% ellipse en  pointillees, il faut
% positionner le boolean \ifdashps a vrai (\dashpstrue) et a ce moment
% #4 contient le nombre total d'espaces noirs et d'espaces blancs selon
% les unites de mesures courantes ; #5 definit le nombre d'unites \`a
% placer en debut de trait : [9] 4 setdash --> un trait pointille. Si
% on a positionne \dashpsfalse alors la courbe est continue.
% attention ; les unites sont des MILLIMETRES
% #6 = intensite du rouge < 256, #7 = intensite du vert < 256
% #8 = intensite du bleu < 256
% Le contour est trace dans la couleur actuelle definie par les composantes
% \rouge, \vert, \bleu
%	Enfin, la constante 2.85 = 72 / 25.6 ==> pour travailler en mm
\special{" gsave 2.85 2.85 scale #3 setlinewidth  
	0 0 moveto currentpoint translate 
	/cm { matrix currentmatrix } def
	/mtrx cm def
	/mymax { #1 #2 ge { #1 } { #2 } ifelse 10 mul } def
	/mymin { #1 #2 le { #1 } { #2 } ifelse 10 mul } def
	mymax mymin scale
	% contenu
	newpath
		0 0 mymax 0 360 arc 
		#6 255 div #7 255 div #8 255 div setrgbcolor fill
	stroke
	% contour
	ifdashps [ #4 ] #5 setdash \fi 
	\SetCapJoinMatrix{\the\CCap}{\the\Join}
	(\the\rouge ) cvr 255 div (\the\vert ) cvr 255 div (\the\bleu ) 
	cvr 255 div setrgbcolor
	newpath
		0 0 mymax 0 360 arc
		mtrx setmatrix
	stroke
}}

\def\Line
#1 \endLine#2#3#4#5#6#7{%
% trace une ligne avec les points du parametre #1 qui
% est un tableau de tableaux. Le parametre #2 contient la largueur
% des traits. Lorsque l'on veut tracer des courbes pointillees, il faut
% positionner le boolean \ifdashps a vrai (\dashpstrue) et a ce moment
% #3 contient le nombre total d'espaces noirs et d'espaces blancs selon
% les unites de mesures courantes ; #4 definit le nombre d'unites \`a
% placer en debut de trait : [9] 4 setdash --> un trait pointille. Si
% on a positionner \dashpsfalse alors la courbe est continue.
% attention ; les unites sont des millimetres et il faut un blanc avant
%	      \endLine
% constitue de 4 unites, puis 5, puis 4, puis 5 ...
% l'ordre des parametres est :
%	\Line [ [ x0 y0 x1 y1 ] [ x1 y1 x2 y2 ] ...] \endLine{}{}...
%	trace une ligne brisee
% #5 = intensite du rouge < 256, #6 = intensite du vert < 256
% #7 = intensite du bleu < 256
%	Enfin, la constante 2.85 = 72 / 25.6 ==> pour travailler en mm
\special{" gsave 2.85 2.85 scale #2 setlinewidth  
	\ifdashps [ #3 ] #4 setdash \fi 
	#5 255 div #6 255 div #7 255 div setrgbcolor 
	\SetCapJoinMatrix{\the\CCap}{\the\Join}
	newpath 0 0 moveto currentpoint translate 
	#1 { aload pop 4 -2 roll moveto lineto } forall stroke grestore}}

\def\CercleHachure#1#2#3#4#5#6#7#8{%
% trace un cercle de rayon #1mm et d'epaisseur du trait = #2mm,
% puis remplit ce cercle avec des hachures de largueur = #3mm inclinees
% de #4 degres. La couleur est specifiee par les parametres #5 #6 #7
% (r g b : dans cet ordre). Le parametre #8 donne l'espacement entre
% les hachures. Les angles doivent etre compris entre 0 et 180 degres.
\ifnum #4 > 180 #4 <0
    \typeout{---CercleHachure : le rayon #4 n'est pas <= 180 ni >= 0}
\else
    \special{" gsave 2.85 2.85 scale
	#5 255 div #6 255 div #7 255 div setrgbcolor 
	0 0 moveto currentpoint translate newpath
	0 0 #1 0 360 arc #2 setlinewidth stroke
	newpath 0 0 #1 0 360 arc closepath clip
	newpath
	#3 setlinewidth
	\SetCapJoinMatrix{\the\CCap}{\the\Join}
	\ifdashps [ 2 2 ] 0 setdash \fi 
	#4 90 ge { 
		180 #4 sub cos abs #1 mul #4 sin abs #1 mul add
		180 #4 sub cos abs #1 mul #4 sin abs #1 mul sub
		translate #4 rotate
		0 #8 #1 2 mul {
			pop 0 0 moveto
			#1 2 mul 0 lineto
			0 #8 moveto currentpoint translate
		} for
	} {
		180 #4 sub cos abs #1 mul #4 sin abs #1 mul sub
		180 #4 sub cos abs #1 mul #4 sin abs #1 mul add
		translate #4 rotate
		0 #8 #1 2 mul {
			pop 0 0 moveto
			#1 2 mul neg 0 lineto
			0 #8 neg moveto currentpoint translate
		} for
	} ifelse
	stroke}
\fi}

\def\CarreHachure#1#2#3#4#5#6#7#8{%
% trace un carre incline de largueur 2* #1mm et d'epaisseur du trait = #2mm,
% puis remplit ce carre avec des hachures de largueur = #3mm inclinees
% de #4 degres. La couleur est specifiee par les parametres #5 #6 #7
% (r g b : dans cet ordre). Le parametre #8 donne l'espacement entre
% les hachures. Les angles doivent etre compris entre 0 et 180 degres.
\ifnum #4 > 180 #4 <0
    \typeout{---CarreHachure : l'angle #4 n'est pas <= 180 ni >= 0}
\else
    \special{" gsave 2.85 2.85 scale #2 setlinewidth  
	#5 255 div #6 255 div #7 255 div setrgbcolor 
	#3 setlinewidth
	\SetCapJoinMatrix{\the\CCap}{\the\Join}
	\ifdashps [ 2 2 ] 0 setdash \fi 
	#4 90 ge { 
		180 #4 sub cos abs #1 mul #4 sin abs #1 mul add
		180 #4 sub cos abs #1 mul #4 sin abs #1 mul sub
		translate #4 rotate
		1 #8 #1 2 mul {
			pop 0 0 moveto
			#1 2 mul 0 lineto
			0 #8 moveto currentpoint translate
		} for
	stroke
	newpath 0 0 moveto
	0 #1 2 mul neg rlineto 
	#1 2 mul 0 rlineto 
	0 #1 2 mul rlineto 
	closepath
	#2 setlinewidth
	} {
		180 #4 sub cos abs #1 mul #4 sin abs #1 mul sub
		180 #4 sub cos abs #1 mul #4 sin abs #1 mul add
		translate #4 rotate
		1 #8 #1 2 mul {
			pop 0 0 moveto
			#1 2 mul neg 0 lineto
			0 #8 neg moveto currentpoint translate
		} for
	stroke
	newpath 0 0 moveto
	0 #1 2 mul rlineto 
	#1 2 mul neg 0 rlineto 
	0 #1 2 mul neg rlineto 
	closepath
	#2 setlinewidth
	} ifelse
	stroke}
\fi}

\def\CourbeFermee#1 \endcourbe#2#3#4#5#6#7{%
% Trace une courbe fermee au moyen de courbes de Bezier avec les points
% du parametre #1 qui est un tableau de tableaux. Le parametre #2
% contient la largueur des traits. Lorsque l'on veut tracer le contour en
% pointillees, il faut positionner le boolean \ifdashps a vrai
% (\dashpstrue) et a ce moment
% #3 contient le nombre total d'espaces noirs et d'espaces blancs selon
% les unites de mesures courantes ; #4 definit le nombre d'unites \`a
% placer en debut de trait (cf la macro \bezierps)
%
% Attention ; les unites sont des millimetres et il faut un blanc avant
% \endcourbe
%
% L'ordre des parametres est :
%	\CourbeFermee [ [ x0 y0 x1 y1 x2 y2 x3 y3 ] ...] \endcourbe{}{}
%
% Le remplissage est effectue avec les couleurs :
% #5 = intensite du rouge < 256, #6 = intensite du vert < 256
% #7 = intensite du bleu < 256
%
% Le contour est trace dans la couleur actuelle definie par les composantes
% \rouge, \vert, \bleu
% Enfin, la constante 2.85 = 72 / 25.6 ==> pour travailler en mm
\typeout{+++coordonnees: #1}
\special{"gsave 2.85 2.85 scale #2 setlinewidth  
	\ifdashps [ #3 ] #4 setdash \fi 
	\SetCapJoinMatrix{\the\CCap}{\the\Join}
	newpath \filtre #1
	moveto currentpoint translate
	#1 { aload pop curveto } forall 
	\ifclosepath closepath \fi
	gsave #5 255 div #6 255 div #7 255 div setrgbcolor eofill grestore
 	(\the\rouge ) cvr 255 div (\the\vert ) cvr 255 div (\the\bleu ) 
	cvr 255 div setrgbcolor stroke grestore}}
\def\filtre[ [ #1 #2 #3 ] ] {#1 #2 }
\newif\ifclosepath
\closepathtrue

%----------------------------------------
% Pour mettre du texte ou autre chose en rotation :
%		RotObj{angle}{texte}
% Suivant les valeurs de \t@vss, \b@vss, \l@vss, \r@vss le point \`a
% partir duquel la rotation se fait, peut varier : par defaut ce point est
% fix\'e au centre du texte. Par exemple, les definitions \def\t@vss{\vss},
% \def\b@vss{} \def\l@hss{\hss}, \def\r@hss{} positionne le point en
% question au bout de la chaine.
\def\RotObj#1#2{%
\special{ps: gsave currentpoint currentpoint translate
	#1 neg rotate neg exch neg exch translate}%
	\RotBis{#2}%
	\special{ps: currentpoint grestore moveto}}
% Par defaut, le point a partir duquel se fait la rotation est situe 
% au debut de la chaine
\def\dc{\edef\t@vss{}\edef\b@vss{\vss}\edef\l@hss{}\edef\r@hss{\hss}}
\dc
\def\RotBis#1{\vbox to 0pt{\normalbaselines
	\t@vss
	\hbox to 0pt{\l@hss
		\hbox {#1}%
	\r@hss}%
	\b@vss}}
\def\fc{\edef\t@vss{\vss}\edef\b@vss{}\edef\l@hss{\hss}\edef\r@hss{}}
\def\mc{\edef\t@vss{\vss}\edef\b@vss{\vss}\edef\l@hss{\hss}\edef\r@hss{\hss}}

%----------------------------------------
%	Les macros pour coller du texte le long de courbes de Bezier.
%   L'implantation est comment\'e dans le manuel d'utilisation
%----------------------------------------
\def\ColleTexte#1#2#3#4#5#6#7#8#9{%
\typeout{***** limitation de ColleTexte : dvips 5.4 uniquement ****}
\countdef\lg=220%
\longueur[#1]\hss%
\special{ps: /debut {gsave currentpoint translate currentpoint %
	exch neg exch translate} def %
	% je me suis plac'e en (x_0,y_0)
	/xx #2 def %
	/yy #3 def %
	/angle #5 #3 sub #4 #2 sub 0.001 add atan def %
	/n-t 0 def /bidonxone #8 def /bidonxtwo #2 def %
	/cx #4 #2 sub 3 mul def %
	/bx #6 #4 sub 3 mul cx sub def %
	/ax #8 #2 sub cx sub bx sub def %
	/cy #5 #3 sub 3 mul def %
	/by #7 #5 sub 3 mul cy sub def %
	/ay #9 #3 sub cy sub by sub def %
	/ConstanteX { 0.35 Resolution 300 div mul } def %
	/bidon {(a) search pop pop pop cvx exec} def %
	/ancien-y 0 def /ancien-x 0 def /ancien-nt 0 def (%
}%
\special{ps: ) bidon
	/fonctionX { n-t n-t n-t ax mul mul mul n-t n-t bx mul mul n-t cx mul %
#2 add add add} def %
	/fonctionY { n-t n-t n-t ay mul mul mul n-t n-t by mul mul n-t cy mul %
#3 add add add} def %
	/long {\the\lg} def %
	/pas-nt { long 1 sub 1 gt { 1 long 1 sub div }{ 0.5 } ifelse } def %
	debut newpath #2 12 Resolution 300 div mul mul #3 12 %
		Resolution 300 div mul mul neg moveto ( }%
\courbebisbis[#1]}%
\def\courbebisbis#1{\def\tete{}%
	\def\COURBEBISBIS##1{\ifx##1]%
	    \def\next{\tete\special{ps: ) bidon closepath grestore}}%
	    \else%
		\setbox20=\hbox{##1}%
		\edef\tete{\tete%
			\hss\special{ps: ) bidon %
				gsave %
				currentpoint translate currentpoint %
				angle neg rotate neg exch neg exch translate ( }\hss%
			\setbox21=\hbox{##1\hss}\box21%
			\special{ps: ) bidon %
				/wdcar (\the\wd20) (pt) search pop 3 1 roll pop pop cvr %
						ConstanteX mul def %
				/ancien-nt n-t def /ancien-y yy def /ancien-x xx def %
				/n-t wdcar bidonxone bidonxtwo sub 0.001 add div ancien-nt %
						add def %
				/xx fonctionX def %
				/yy fonctionY def %
				/angle yy ancien-y sub xx ancien-x sub 0.001 add atan def %
				/n-t ancien-nt pas-nt add def %
				/xx fonctionX def %
				/yy fonctionY def %
				grestore %
				xx 12.0 Resolution 300 div mul mul yy 12.0 %
				Resolution 300 div mul mul neg moveto ( }%
			}\let\next=\COURBEBISBIS\fi%
			\next}\COURBEBISBIS}%

\countdef\BlancInterLettre=221%
\BlancInterLettre=1% par defaut 1mm

\def\TraceTexte#1#2#3#4#5#6#7#8#9{%
\typeout{***** limitation de TraceTexte : dvips 5.4 uniquement ****}
\special{ps:/debut {gsave currentpoint translate currentpoint %
	exch neg exch translate} def %
	% je me suis plac'e en (x_0,y_0)
	/xx #2 def %
	/yy #3 def %
	/angle #5 #3 sub #4 #2 sub 0.001 add atan def %
	/n-t 0 def /bidonxone #8 def /bidonxtwo #2 def %
	/bidon {(a) search pop pop pop cvx exec} def %
	/cx #4 #2 sub 3 mul def %
	/bx #6 #4 sub 3 mul cx sub def %
	/ax #8 #2 sub cx sub bx sub def %
	/cy #5 #3 sub 3 mul def %
	/by #7 #5 sub 3 mul cy sub def %
	/ay #9 #3 sub cy sub by sub def ( }\hss%
\special{ps: ) bidon %
	/D { 12.0 Resolution 300 div mul } def %
	/CY { Resolution 300 div } def %
	/MyCte { 0.35277 } def %
	/ancien-nt 0 def /ancien-y 0 def /ancien-x 0 def ( }\hss%
\special{ps: ) bidon %
	/fonctionX { n-t n-t n-t ax mul mul mul n-t n-t bx mul mul n-t cx mul %
		#2 add add add} def %
	/fonctionY { n-t n-t n-t ay mul mul mul n-t n-t by mul mul n-t cy mul %
		#3 add add add} def %
	/long #2 def %
	/blanc {\the\BlancInterLettre} def ( }\hss%
\special{ps: ) bidon %
	/MyFunction{/n-t wdcar bidonxone bidonxtwo sub 0.001 %
		add div ancien-nt add def %
		/xx fonctionX def %
		/yy fonctionY def %
		/angle yy ancien-y sub xx ancien-x %
			sub 0.001 add atan def %
		/n-t ancien-nt def %
		/n-t angle cos wdcar mul bidonxone %
		     bidonxtwo sub 0.001 add div n-t add def %
		/long angle cos wdcar mul long add blanc add def %
	} def %
	debut newpath #2 D mul #3 D mul neg moveto ( }\hss%
\courbebis[#1]}%

\def\courbebis#1{\def\tete{}%
	\def\COURBEBIS##1{\ifx##1]%
	    \def\next{\tete\hss\special{ps: ) bidon closepath grestore}}%
	    \else%
		\setbox20=\hbox{##1}%
		\edef\tete{\tete\hss%
			\special{ps: ) bidon %
				gsave %
/wdcar (\the\wd20) (pt) search pop 3 1 roll pop pop cvr %
MyCte mul def %
				/ancien-nt n-t def /ancien-y yy def /ancien-x xx def ( }\hss%
			\special{ps: ) bidon %
				MyFunction %
				{ fonctionX long le %
					{ /n-t n-t 0.001 add def } %
					{exit} ifelse } loop %
				/xx fonctionX def %
				/yy fonctionY def ( }\hss%
			\special{ps: ) bidon %
				currentpoint translate currentpoint %
				angle neg rotate neg exch neg exch %
				translate ( }\hss%
			\setbox21=\hbox{##1\hss}\box21%
			\special{ps: ) bidon %
				grestore %
				xx D mul yy D mul neg moveto ( %
			}%
			}\let\next=\COURBEBIS\fi%
			\next}\COURBEBIS}%

%------------------------------
%	Macro pour tracer des splines terminees par des fleches,
% des ronds, des triangles... Plusieurs modes sont suportes :
% les symboles (fleches, ronds...) peuvent apparaitre aux deux
% extremites, au debut ou a la fin du spline.

\newif\ifarrowheads
\newif\ifarrowheadleft
\newif\ifarrowheadright
\def\ArrowForm#1{
	\arrowheadsfalse
	\arrowheadleftfalse
	\arrowheadrightfalse
	\ifx#1h%
		\arrowheadstrue
	\else
		\ifx#1l%
			\arrowheadlefttrue
		\else
			\ifx#1r%
				\arrowheadrighttrue
			\else
				\typeout{*** bad parameter in function ArrowForm}
			\fi
		\fi
	\fi
}

%%% On tape :
%%%		\ArrowForm{h} % pour obtenir des symboles des deux cotes
%%% 	\ArrowForm{l} % pour obtenir des symboles "a gauche"
%%%		\ArrowForm{r} % pour obtenir des symboles "a droite"

\countdef\Psymbol=205\countdef\Ssymbol=206

\def\PositionPsymbol#1{
	\ifnum#1>100 #1<0
		\typeout{*** bad parameter in function PositionPsymbol}
	\else
		\Psymbol=#1
	\fi
}

\def\PositionSsymbol#1{
	\ifnum#1>100 #1<0
		\typeout{*** bad parameter in function PositionSsymbol}
	\else
		\Ssymbol=#1
	\fi
}

%-------Nouveaux developpement pour la version 3.0--------------


\newif\ifinnerbox\innerboxtrue
\def\TroisDbox#1#2#3#4#5#6#7#8{% 
% D'apres le PostScript Language Journal vol 2 - number 1 - pages 
% 19, 31 et 32 -- modifie par mes soins pour 
% tracer une boite 3D de hauteur #1mm et #2mm orient\'e de #3.  
% la couleur de la boite est donne par le parametre #4 qui doit 
% etre de la forme 'rouge vert bleu'. Le parametre #5 est la 
% couleur des faces. Ces faces ont une hauteur egale a #1 - 2*#6mm 
% et une largeur de #2 - 2*#7mm. Le parametre #8 est le rayon des 
% arondis au quatre coins des faces. Noter que si ce parametre vaut 
% 0 alors on obtient le dessin d'un rectangle. De plus, lorsque le
% booleen innerbox est True (\innerboxtrue) la face avant de la boite
% ne comporte pas de boite interieure en couleur.
\ifnum#1=0
\typeout{===== Le 2eme Parametre de \TroisDBox doit etre <>0 =====}
\else
\special{"%
gsave %
%%% Variables importantes comme la hauteur, la largeur\ldots
/xheight #1 def
/ywidth #2 def
/angle #3 def
/csquare { #4 } def
/cround { #5 } def
/x-retrait #6 def
/y-retrait #7 def
/ang-round #8 def
%%%
/left 1 def
/right -1 def
/scaler 2 31 exp 1 sub def
/pop4 { pop pop pop pop } def

%box with rounded corners
/roundedbox {
   gsave
     /corner exch def
     /y y-retrait def % retrait en y
     /x x-retrait def % retrait en x
     newpath
	     /height xheight y 2 mul sub def
	     /width ywidth x 2 mul sub def
	     /xend x width add def
    	 /yend y height add def
	     x y corner add moveto
	     x yend xend yend corner arcto pop4
	     xend yend xend y corner arcto pop4
	     xend y x y corner arcto pop4
	     x y x yend corner arcto pop4
	     cround setrgbcolor 
    	 fill
   grestore
} def

%draw a xheight*width color square stroked
/square {
   gsave
     newpath 0 0 moveto
     ywidth 0 rlineto 0 xheight rlineto
     ywidth neg 0 rlineto
     closepath currentrgbcolor fill stroke
   grestore
} def

%draw a block
/block {% 
   /slant exch def
   slant 0 lt {
         /doside left def
         /slant slant neg def
   }{
         /doside right def
   } ifelse
   %side length is based on size of slant
   /sidelen slant 100 div .35 add def
   [ 1 slant 100 div doside mul 0 1 0 0 ] concat
   %draw front
   gsave
     %draw the outline square
     csquare setrgbcolor square %
     %draw the inner rounded box
	 \ifinnerbox ang-round roundedbox \fi %
  grestore
  %draw side
  gsave
    doside left eq {
           -1 1 scale
    }{
          ywidth 0 translate
    } ifelse
    [ 1 .5 0 1 0 0] concat
    sidelen 1 scale
    %darken side away from light
    csquare setrgbcolor square
    ang-round roundedbox
  grestore
  %draw top of box
  gsave
    doside left eq {
          ywidth xheight translate -1 1 scale
    }{
          0 xheight translate
    } ifelse
%	1 1 scale
    [ 1 0 2 1 0 0] concat
    1 sidelen 2 xheight ywidth div mul div scale
    csquare setrgbcolor square
    ang-round roundedbox
  grestore
grestore
} def
%%% Programme principal
0 0 moveto
2.85 2.85 scale
0.1 setlinewidth
0 setlinecap 2 setlinejoin
angle block
%%% fin programme principal
grestore
}\fi}

\def\plotfunction#1#2#3#4#5#6#7{%
%	trace d'une fonction decrite au format PostScript dans le parametre
% #7. Le parametre en x a faire figurer doit s'appele XX. La valeur de
% XX varie de #1 a #2. On applique le facteur d'echelle #3 selon l'axe
% des x et le facteur #4 selon l'axe des y. #5 est l'epaisseur des traits.
% #6 specifie le parametre des pointilles
\special{"%
	gsave %
		2.85 2.85 scale #5 setlinewidth %
		\ifdashps #6 setdash \fi%
		1 setlinecap 1 setlinejoin %
		(\the\rouge ) cvr 255 div (\the\vert ) cvr 255 div %
		(\the\bleu ) cvr 255 div setrgbcolor %
		/XX #1 def
		/Myfunction { #7 } def
		/inc #2 #1 sub 60 div def
		gsave 
		#3 10 mul #4 10 mul scale % pour passer en echelle des cm
		#1 Myfunction moveto currentpoint
		24 {
			/x1 XX def
			/y1 Myfunction def
			/XX XX inc add def
			/x2 XX def
			/y2 Myfunction def
			/XX XX inc add def
			/x3 XX def
			/y3 Myfunction def
			x1 y1 x2 y2 x3 y3 curveto
			/XX XX inc add def
		} repeat
		stroke grestore
	grestore
}%
}

\newcount\pasx % ``pas'' pour les graduations selon axe des x
\newcount\pasy % ``pas'' pour les graduations selon axe des y
\pasx=10\pasy=10
% compteurs intermediaires
\newcount\mycinterone\newcount\mycintertwo
% valeurs initiales et d'incrementation des axes
\newcount\vinitx\newcount\vincx
\newcount\vinity\newcount\vincy
\vinitx=0
\vincx=10
\vinity=10
\vincy=1
\def\GridNumPuiss(#1,#2)(#3,#4)(#5,#6)#7#8#9{%
%	Trace d'une grille avec echelles gradu\'ees au point (#1,#2). Les
% graduations sur l'axes des x sont des entiers de la forme $\vinitx$, les
% graduations sur l'axes des y de la forme $\vinity^\vincy$. Les
% autres parametres de cette macros sont ceux de Grille. Les valeurs de
% \pasx et \pasy sont les valeurs en mm d'espacement entre 2 graduations
% consecutives.
	%------les vecteurs-----------------------
	\put(#1,#2){\vector(1,0){#3}}
	\put(#1,#2){\vector(0,1){#4}}
	%------les graduations horizontales-------
	\mycinterone=#2
	\advance\mycinterone by -5
	\mycintertwo=#3
	\divide\mycintertwo by \pasx\advance\mycintertwo by 1
	\multiputnum(#1,\number\mycinterone)(\number\pasx,0)%
		{\number\mycintertwo}{\number\vinitx}{\number\vincx}
	%------les graduations verticales---------
	\mycintertwo=#4
	\divide\mycintertwo by \pasy\advance\mycintertwo by 1
	\multiputpuissance(\number\mycinterone,#2)(0,\number\pasy)%
		{\number\mycintertwo}{\number\vinity}{\number\vincy}
	%------les marqueurs horizontaux-----------
	\mycinterone=#1
	\advance\mycinterone by -2
	\multiput(\number\mycinterone,\number\pasy)(0,\number\pasy)%
		{\number\mycintertwo}{\traith{3}}
	%------les marquers verticaux--------------
	\mycinterone=#3
	\divide\mycinterone by \pasx\advance\mycinterone by 1
	\mycintertwo=#2
	\advance\mycintertwo by -2
	\multiput(\number\pasx,\number\mycintertwo)(\number\pasx,0)%
		{\number\mycinterone}{\traitv{4}}
	%-------la grille, enfin !-----------------
	\put(#1,#2){\Grille(#3,#4)(#5,#6){#7}{#8}{#9}}
}


\def\GridNumNum(#1,#2)(#3,#4)(#5,#6)#7#8#9{%
%	Trace d'une grille avec echelles gradu\'ees au point (#1,#2). Les
% graduations sur l'axes des x sont des entiers de la forme $\vinitx$, les
% graduations sur l'axes des y de la forme $\vinity. Les autres
% parametres de cette macros sont ceux de Grille. Les valeurs de
% \pasx et \pasy sont les valeurs en mm d'espacement entre 2 graduations
% consecutives.
	%------les vecteurs-----------------------
	\put(#1,#2){\vector(1,0){#3}}
	\put(#1,#2){\vector(0,1){#4}}
	%------les graduations horizontales-------
	\mycinterone=#2
	\advance\mycinterone by -5
	\mycintertwo=#3
	\divide\mycintertwo by \pasx\advance\mycintertwo by 1
	\multiputnum(#1,\number\mycinterone)(\number\pasx,0)%
		{\number\mycintertwo}{\number\vinitx}{\number\vincx}
	%------les graduations verticales---------
	\mycintertwo=#4
	\divide\mycintertwo by \pasy\advance\mycintertwo by 1
	\multiputnum(\number\mycinterone,#2)(0,\number\pasy)%
		{\number\mycintertwo}{\number\vinity}{\number\vincy}
	%------les marqueurs horizontaux-----------
	\mycinterone=#1
	\advance\mycinterone by -2
	\multiput(\number\mycinterone,\number\pasy)(0,\number\pasy)%
		{\number\mycintertwo}{\traith{3}}
	%------les marquers verticaux--------------
	\mycinterone=#3
	\divide\mycinterone by \pasx\advance\mycinterone by 1
	\mycintertwo=#2
	\advance\mycintertwo by -2
	\multiput(\number\pasx,\number\mycintertwo)(\number\pasx,0)%
		{\number\mycinterone}{\traitv{4}}
	%-------la grille, enfin !-----------------
	\put(#1,#2){\Grille(#3,#4)(#5,#6){#7}{#8}{#9}}
}

\def\Grille(#1,#2)(#3,#4)#5#6#7{%
%	Trace une grille au point courant sur #1mm de largeur et de #2mm
% de hauteur. Les lignes de la grille sont espaces de #3mm selon l'axe
% des x et de #4mm selon l'axe des y. Les parametres #5 et #6 sont les 
% parametres du setdash dans le cas ou l'on souhaite tracer des lignes 
% pointillees. #7 est la largeur des traits.
\special{"%
	/height #1 def
	/width #2 def
	/divx #3 def	% division spacing along x axis
	/divy #4 def	% division spacing along y axis
	2.85 2.85 scale
	\ifdashps [ #5 ] #6 setdash \fi %
	(\the\rouge ) cvr 255 div (\the\vert ) cvr 255 div %
	(\the\bleu ) cvr 255 div setrgbcolor %
	0 0 moveto currentpoint translate %
	#7 setlinewidth
	2 setlinecap
	gsave 
		/index divx def
		divx 0 translate
		width divx div cvi 1 sub
	    { 
			newpath  
				0 0 moveto   
				0 height lineto
	      	stroke   
	      	divx 0 translate
	      	/index index divx add def
	    } repeat 
	grestore
	gsave	
		/index divy def
		0 divy translate
		height divy div cvi 1 sub
	    { 
			newpath  
				0 0 moveto   
				width 0 lineto
			stroke   
	      0 divy translate
	      /index index divy add def
	    } repeat 
	grestore
}%
}

\def\Fleche#1 \endfleche#2#3#4#5#6#7#8#9{%
% #1 est un tableau de points definissant les splines
% #2 est le pourcentage
% #3 est la profondeur de la fleche, #4 sa hauteur, #5 sa largeur
% #6 est la hauteur de la fonte pour le texte
% #7 est l'epaisseur des traits
% #8 et #9 permettent de tracer des pointilles
\special{"/ed { exch def } def %
	/Arrow { /w ed /h ed /a ed %
		0 0 moveto h neg w 2 div lineto a w 2 div neg rlineto %
		a neg w 2 div neg rlineto h w 2 div rlineto %
		gsave fill grestore }def %
	/pointsize #6 def %
	/Helvetica-Bold findfont pointsize scalefont setfont %
	1 setlinecap 1 setlinejoin %
	\ifarrowheadright%
			/pourcentage 100 def %
	\else%
			/pourcentage #2 def %
	\fi%
	/fonctionX { n-t n-t n-t ax mul mul mul %
		n-t n-t bx mul mul n-t cx mul %
		x1 add add add} def %
	/fonctionY { n-t n-t n-t ay mul mul mul %
		n-t n-t by mul %
		mul n-t cy mul %
		y1 add add add} def %
	gsave %
		2.85 2.85 scale #7 setlinewidth  %
		\ifdashps [ #8 ] #9 setdash \fi %
		(\the\rouge ) cvr 255 div (\the\vert ) cvr 255 div %
		(\the\bleu ) cvr 255 div setrgbcolor %
		newpath 0 0 moveto currentpoint translate %
		#1 %
	 	{ 	aload pop %
			/spline exch def %
			/mystr exch 0 get def %
			spline aload pop 8 -2 roll %
			moveto curveto stroke gsave newpath %
			/x1 spline 0 get def %
			/y1 spline 1 get def %
			/x2 spline 2 get def %
			/y2 spline 3 get def %
			/x3 spline 4 get def %
			/y3 spline 5 get def %
			/x4 spline 6 get def %
			/y4 spline 7 get def %
			x1 y1 moveto %
			/cx x2 x1 sub 3 mul def %
			/bx x3 x2 sub 3 mul cx sub def  %
			/ax x4 x1 sub cx sub bx sub def  %
			/cy y2 y1 sub 3 mul def  %
			/by y3 y2 sub 3 mul cy sub def  %
			/ay y4 y1 sub cy sub by sub def  %
		\ifarrowheads%
			gsave %
			/n-t 1 def %
			/xx fonctionX def /yy fonctionY  def %
			xx yy moveto %
			/n-t n-t 0.05 add def %
			gsave 
%			xx yy translate fonctionY yy sub fonctionX xx %
x4 y4 translate fonctionY yy sub fonctionX xx %
			sub 0.001 add atan rotate %
			% call: depth height weight Arrow %
			\ifdashps [ 1 0 ] 0 setdash \fi %
			#3 #4 #5 Arrow  %
			grestore gsave %
			/n-t 0 def %
			/xx fonctionX def /yy fonctionY  def %
			xx yy moveto %
			/n-t n-t 0.05 add def %
%			gsave xx yy translate fonctionY yy sub fonctionX xx  %
			gsave x1 y1 translate fonctionY yy sub fonctionX xx  %
			sub 0.001 add atan 180 sub rotate %
			% call: depth height weight Arrow %
			\ifdashps [ 1 0 ] 0 setdash \fi%
			#3 #4 #5 Arrow %
			grestore gsave %
			/n-t 0.5 def %
			/xx fonctionX def /yy fonctionY  def %
			xx yy moveto %
			/n-t n-t 0.05 add def %
			gsave xx yy translate fonctionY yy sub fonctionX xx  %
			sub 0.001 add atan rotate %
			%		enlever le neg dans 15 neg pour texte %
			%		15 neg --> 5 %
			mystr stringwidth pop 2 div neg pointsize neg moveto %
			mystr show stroke grestore %
		\else%
		\ifarrowheadleft%
			gsave %
			/n-t 0 def %
			/xx fonctionX def /yy fonctionY def %
			xx yy moveto %
			/n-t n-t 0.05 add def %
%			gsave xx yy translate fonctionY yy sub fonctionX xx %
			gsave x1 y1 translate fonctionY yy sub fonctionX xx %
			sub 0.001 add atan 180 sub rotate %
			% call: depth height weight Arrow %
			\ifdashps [ 1 0 ] 0 setdash \fi%
			#3 #4 #5 Arrow %
			grestore gsave %
			/n-t 0.5 def %
			/xx fonctionX def /yy fonctionY  def %
			xx yy moveto %
			/n-t n-t 0.05 add def %
			gsave xx yy translate fonctionY yy sub fonctionX xx %
			sub 0.001 add atan rotate %
			%		enlever le neg dans 15 neg pour texte %
			%		15 neg --> 5 %
			mystr stringwidth pop 2 div neg pointsize neg moveto %
			mystr show stroke grestore %
		\else%
			/n-t pourcentage 100 div def %
			/xx fonctionX def /yy fonctionY  def %
			xx yy moveto %
			/n-t n-t 0.05 add def %
			gsave xx yy translate fonctionY yy sub fonctionX xx %
			sub 0.001 add atan rotate %
			% call: depth height weight Arrow %
			\ifdashps [ 1 0 ] 0 setdash \fi%
			#3 #4 #5 Arrow %
			%		enlever le neg dans 15 neg pour texte %
			%		15 neg --> 5 %
			mystr stringwidth pop 2 div neg pointsize neg moveto %
			mystr show stroke %
		\fi\fi%
			grestore %
			closepath %
			grestore %
			newpath %
	 	} forall closepath closepath%
}%end special %
\arrowheadsfalse%
\arrowheadleftfalse%
\arrowheadrightfalse%
}
		
\def\Cotes(#1,#2)(#3,#4)[#5,#6][#7,#8]|#9|{%
% trace une droite du point A=(#1,#2) au point B=(#3,#4) d'epaisseur
% #5mm puis deux traits perpendiculaires a la droite precedente d'epaisseur
% #6 et de longueur respectives #7mm du point A et #8mm du point B.
% Enfin, si \dashps est true alors #9 specifie les pointilles. #9 doit
% etre de la forme : "[ xx ] yy"
\special{"newpath %
	gsave %
		2.85 2.85 scale #5 setlinewidth %
		\ifdashps #9 setdash \fi%
		1 setlinecap 1 setlinejoin %
		(\the\rouge ) cvr 255 div (\the\vert ) cvr 255 div %
		(\the\bleu ) cvr 255 div setrgbcolor %
		newpath 0 0 moveto currentpoint translate %
		#1 #2 moveto #3 #4 lineto stroke %
		\ifdashps [ 1 0 ] 0 setdash \fi%
		#6 setlinewidth gsave #3 #4 translate %
		#4 #2 sub #3 #1 %
		sub 0.001 add atan 90 add rotate %
		0 0 moveto currentpoint exch currentlinewidth 3 mul %
		sub exch moveto %
		#8 currentlinewidth 3 mul add 0 lineto stroke grestore %
		gsave #1 #2 translate %
		#4 #2 sub #3 #1 %
		sub 0.001 add atan 90 add rotate %
		0 0 moveto currentpoint exch currentlinewidth 3 mul %
		sub exch moveto %
		#7 currentlinewidth 3 mul add 0 lineto stroke grestore %
		closepath %
	grestore %
closepath%
}%end special
}

\def\EtatTransition#1{
\special{"	newpath
		[
	 	[ [ (8 \(C E\))] [100 40] ]
	 [ [ (6 \(A B\))] [40 140] ]
	]
	 { 	aload pop
		/cercle exch def 
		/mystr exch 0 get def
		cercle aload pop 
		pointsize 2 mul 0 360 arc
		stroke
		gsave cercle aload pop translate 
		mystr stringwidth pop 2 div neg pointsize neg 2 div 
		pointsize 3 div add moveto % 
		mystr show grestore
		closepath
		newpath
	 } forall closepath
grestore
showpage
}%end special
}

\newif\ifarrowheads\arrowheadsfalse
\newif\ifarrowheadleft\arrowheadleftfalse
\newif\ifarrowheadright\arrowheadrightfalse
\newif\ifencore\encoretrue
\def\ArrowForm#1{%
	\arrowheadsfalse%
	\arrowheadleftfalse%
	\arrowheadrightfalse%
	\def\bidonarrow{#1 }%
	\def\hh{h }\def\rr{r }\def\ll{l }%
	\loop\message{Initialisation de la forme des fleches}%
	\ifx\bidonarrow\hh%
		\arrowheadstrue\encorefalse%
	\else%
		\ifx\bidonarrow\ll%
			\arrowheadlefttrue\encorefalse%
		\else%
			\ifx\bidonarrow\rr%
				\arrowheadrighttrue\encorefalse%
			\else%
				\message{*** bad parameter in function ArrowForm (h l r)}%
				\read16 to \bidonarrow%
				\encoretrue%
			\fi%
		\fi%
	\fi%
	\ifencore%
	\repeat%
}

\def\FlecheSpeciale#1 \endflechespeciale#2#3#4#5#6#7#8#9{%
% le parametre #2 est soit un h soit un r soit un l
\ArrowForm{#2}\Fleche #1 \endfleche{100}{#3}{#4}{#5}{#6}{#7}{#8}{#9}%
}


\def\TraceArrow(#1,#2)(#3,#4)|#5|{%
% trace une paire de fleches aux points (#1,2) et (#3,#4)
% #5 est de la forme "p h w" ou p, h, w sont respectivement la 
% profondeur la hauteur et la largeur de la fleche
% Enfin, si on a externetrue alors les fleches sont tournees vers
% l'exterieur, sinon vers l'interieur.
\special{"newpath gsave %
		/ed { exch def } def %
		/Arrow { /w ed /h ed /a ed %
			0 0 moveto h neg w 2 div lineto a w 2 div neg rlineto %
			a neg w 2 div neg rlineto h w 2 div rlineto %
			gsave fill grestore }def %
		\ifexterne /ang-sup 0 def \else /ang-sup 180 def \fi%
		2.85 2.85 scale %
		1 setlinecap 1 setlinejoin %
		(\the\rouge ) cvr 255 div (\the\vert ) cvr 255 div %
		(\the\bleu ) cvr 255 div setrgbcolor %
		newpath gsave #3 #4 translate %
		#4 #2 sub #3 #1 sub 0.001 add atan ang-sup add rotate %
		#5 Arrow  grestore %
		gsave #1 #2 translate %
		#4 #2 sub #3 #1 %
		sub 0.001 add atan 180 add ang-sup add rotate %
		#5 Arrow  grestore %
grestore closepath%
}%
}%

\newif\ifexterne\externetrue
\def\CotesFleche(#1,#2)(#3,#4)[#5,#6][#7,#8]|#9|{%
% trace une droite du point A=(#1,#2) au point B=(#3,#4) d'epaisseur
% #5mm puis deux traits perpendiculaires a la droite precedente d'epaisseur
% #6 et de longueur respectives #7mm du point A et #8mm du point B.
% Le parametre #9 est de la forme w h w pour un appel a Arrow.
% Enfin, si on a externetrue alors les fleches sont tournees vers
% l'exterieur, sinon vers l'interieur.
\Cotes(#1,#2)(#3,#4)[#5,#6][#7,#8]|#9|\TraceArrow(#1,#2)(#3,#4)|#9|%
}

%------------------trace des grilles, axes----------------
\newcount\multicnt 
\newdimen\xdim
\newdimen\ydim
\newcount\fechelle

\def\whilenoop#1{}
\def\whilenum#1\do #2{\ifnum #1\relax #2\relax\iwhilenum{#1\relax 
     #2\relax}\fi}
\def\iwhilenum#1{\ifnum #1\let\nextwhile=\iwhilenum 
         \else\let\nextwhile=\whilenoop\fi\nextwhile{#1}}

\def\whiledim#1\do #2{\ifdim #1\relax#2\iwhiledim{#1\relax#2}\fi}
\def\iwhiledim#1{\ifdim #1\let\nextwhile=\iwhiledim 
        \else\let\nextwhile=\whilenoop\fi\nextwhile{#1}}

\long\def\multiputnum(#1,#2)(#3,#4)#5#6#7{\killglue\multicnt=#5\relax
% Place #5 objets a partir de (#1,#2) en se translatant de #3 et #4
% a chaque nouvel objet. L'objet de d\'epart est #6, puis #6 + #7 (pas
% d'iteration), puis #6 + (2 * #7) ... Attention, #6 doit etre entier.
\xdim=#1\unitlength%
\ydim=#2\unitlength%
\fechelle=#6%\unitlength
\whilenum \multicnt > 0\do%
{\raise\ydim\hbox to 0mm{\setbox2=\hbox{{\the\fechelle}}%
\dimen1=\wd2\divide\dimen1 by 2\wd2=\dimen1%
\dimen1=\ht2\divide\dimen1 by 2\ht2=\dimen1%
\kern-\wd2\kern\xdim\raise-\ht2\hbox{\the\fechelle}\hss}\advance\multicnt-1%
\advance\fechelle#7%
\advance\xdim#3\unitlength\advance\ydim #4\unitlength}\ignorespaces}

\long\def\multiputpuissance(#1,#2)(#3,#4)#5#6#7{\killglue\multicnt=#5\relax
% Place #5 objets a partir de (#1,#2) en se translatant de #3 et #4
% a chaque nouvel objet. L'objet de d\'epart est #6^{#7}, puis #6^{#7+1}
% d'iteration), puis #6^{#7+2}... Attention, #6 doit etre entier.
\xdim=#1\unitlength
\ydim=#2\unitlength
\fechelle=#7%\unitlength
\whilenum \multicnt > 0\do%
{\raise\ydim\hbox to 0mm{\setbox2=\hbox{$#6^{\the\fechelle}$}%
\dimen1=\wd2\divide\dimen1 by 2\wd2=\dimen1%
\dimen1=\ht2\divide\dimen1 by 2\ht2=\dimen1%
\kern-\wd2\kern\xdim\raise-\ht2\hbox{$#6^{\the\fechelle}$}\hss}%
\advance\multicnt-1%
\advance\fechelle#7%
\advance\xdim#3\unitlength\advance\ydim#4\unitlength}\ignorespaces}

\def\killglue{\unskip\whiledim \lastskip >0mm\do{\unskip}}

\def\traith#1{\hbox{\vrule height .4pt depth 0pt width #1mm}}
\def\traitv#1{\hbox{\vrule height #1mm depth 0pt width 0.4pt}}

%--------------------------------------------------
%	Logos de fleches (eventuellement ecrits dans la
%	marge gauche)
%--------------------------------------------------
% Trace' d'un logo de fleche dont les traits sont d'epaisseur #1mm. #2 et
% #3 sont les facteurs d'echelle que l'on peut appliquer pour deformer le
% dessin. Si le booleen \ifclosepath est vrai alors la fleche est remplie
% dans la couleur donnee par les parametres \rouge, \vert, \bleu.
\def\LogoFlecheOne#1#2#3{%
\special{" %
	gsave %
		2.85 2.85 scale #1 setlinewidth %
		1 setlinecap 1 setlinejoin %
		(\the\rouge ) cvr 255 div (\the\vert ) cvr 255 div %
		(\the\bleu ) cvr 255 div setrgbcolor %
		gsave %
		#2 10 mul #3 10 mul scale % pour passer en echelle des cm
		0 0 moveto 0.4 neg 0.4 neg lineto 0 0.15 rlineto %
		0.4 neg 0 rlineto 0 0.5 rlineto %
		0.4 0 rlineto 0 0.15 rlineto %
		0.4 0.4 neg rlineto %
		\ifclosepath gsave fill grestore \fi %
		stroke grestore %
	grestore %
}%
}

\newdimen\dimeminter
% Trace le logo de la fleche precedente dans la marge gauche
\def\LeftLogoFlecheOne{\leavevmode\vadjust{\setbox1=\vtop{\hsize 10mm %
	\parindent=0pt\baselineskip=9pt\rightskip=4mm plus %
	4mm\LogoFlecheOne{0.04}{0.9}{0.9}}%
	\dimeminter=\textwidth \advance\dimeminter by -\leftmargin
	\hbox to \dimeminter{\rlap{%
		\kern\leftmargin\kern-15mm\smash{\raise6pt\box1}}\hfill}}}

% Une variante de logo avec des courbes au lieu de ligne. Pour les
% parametres voir la macro precedente
\def\LogoFlecheTwo#1#2#3{%
\special{" %
	gsave %
		2.85 2.85 scale #1 setlinewidth %
		1 setlinecap 1 setlinejoin %
		(\the\rouge ) cvr 255 div (\the\vert ) cvr 255 div %
		(\the\bleu ) cvr 255 div setrgbcolor %
		gsave %
		#2 10 mul #3 10 mul scale % pour passer en echelle des cm
		newpath %
		0 0 moveto 0.1 neg 0.01 0.65 neg 0.23 0.7 neg 0.3 rcurveto %
		0.1 0.05 neg 0.25 0.07 neg 0.3 0.007 rcurveto %
		0.1 neg 0.2 0.4 neg 0.9 0.65 neg 1.1 rcurveto %
		0.2 0 0.3 0 0.4 0 rcurveto %
		0.1 0.2 neg 0.4 0.9 neg 0.45 1.1 neg rcurveto %
		0.08 0.05 0.10 0.06 0.12 0.15 rcurveto %
		closepath \ifclosepath gsave fill grestore \fi %
		stroke grestore %
	grestore %
}%
}

% Trace le logo de la fleche precedente dans la marge gauche
\def\LeftLogoFlecheTwo{\leavevmode\vadjust{\setbox1=\vtop{\hsize 10mm %
	\parindent=0pt\baselineskip=9pt\rightskip=4mm plus %
	4mm\LogoFlecheTwo{0.02}{0.55}{0.55}}%
	\dimeminter=\textwidth \advance\dimeminter by -\leftmargin
	\hbox to \dimeminter{\rlap{%
		\kern\leftmargin\kern-15mm\smash{\raise6pt\box1}}\hfill}}}

%--------------------------------------------------
%	Logos "informatiques" : stations de travail, disques, serveurs,
%	routeurs.
%--------------------------------------------------

% Trace d'un logo de Station Sun dont les traits sont d'epaisseur #1,
% #2 et #3 sont les facteurs d'echelle que l'on peut appliquer pour
% deformer le dessin. 
\def\SunStation#1#2#3{
\special{"
	gsave %
	0 0 moveto %
%------- modifier le scaling ici----
% faire qq chose comme : 0.3 #1 mul 0.3 #2 mul scale
	0.3 #2 mul 0.3 #3 mul scale %
%---------------------
	#1 0.3 div 72 25.6 div mul setlinewidth %
	1 setlinecap 1 setlinejoin %
	(\the\rouge ) cvr 255 div (\the\vert ) cvr 255 div %
	(\the\bleu ) cvr 255 div setrgbcolor %
	gsave %
	-63.0 162.0 translate %
	0.900 -0.900 scale %
	newpath	%
		204 134 moveto 204 39 lineto 79 39 lineto 79 134 lineto %
	closepath stroke %
	newpath %
		199 129 moveto 199 44 lineto 84 44 lineto 84 129 lineto %
	closepath stroke %
	newpath %
		214 174 moveto 214 134 lineto 69 134 lineto 69 174 lineto %
	closepath stroke %
	newpath %
		209 179 moveto 209 174 lineto 74 174 lineto 74 179 lineto %
	closepath stroke %
	grestore %
}%
}

% Trace d'un logo d'unite de sauvegarde disk dont les traits sont %
% d'epaisseur #1, #2 et #3 sont les  facteurs d'echelle que l'on peut
% appliquer pour deformer le dessin. 
\def\SunDisk#1#2#3{
\special{"
	gsave %
	0 0 moveto %
%--- modifier le scalling ici
% faire qq chose comme : 0.3 #1 mul 0.3 #2 mul scale
	0.3 #2 mul 0.3 #3 mul scale %
%-------------------------------
	1 setlinecap 1 setlinejoin %
	#1 0.3 div 72 25.6 div mul setlinewidth %
	(\the\rouge ) cvr 255 div (\the\vert ) cvr 255 div %
	(\the\bleu ) cvr 255 div setrgbcolor %
	gsave %
	-81.0 165.0 translate 0.900 -0.900 scale %
	gsave %
		136 94 translate 47 20 scale %
		#1 0.3 div 72 25.6 div mul 47 div setlinewidth %
		newpath 0 0 1 0 360 arc stroke %
	grestore %
	gsave %
		136 163 translate 47 20 scale %
		#1 0.3 div 72 25.6 div mul 47 div setlinewidth %
		newpath 0 0 1 0 360 arc stroke %
	grestore %
	gsave newpath %
		89 94 moveto 89 159 lineto % lineto %
	stroke grestore gsave newpath %
		184 94 moveto 184 164 lineto % lineto %
	stroke grestore %
	grestore %
}}

% Trace d'un logo de Serveur Sun dont les traits sont d'epaisseur #1, #2
% et #3 sont les facteurs d'echelle que l'on peut appliquer pour deformer
% le dessin. 
\def\SunServer#1#2#3{
\special{"
	gsave %
	0 0 moveto %
%------- modifier le scaling ici----
	0.3 #2 mul 0.3 #3 mul scale %
% faire qq chose comme : 0.3 #1 mul 0.3 #2 mul scale
%---------------------
	#1 0.3 div 72 25.6 div mul setlinewidth %
	1 setlinecap 1 setlinejoin %
	(\the\rouge ) cvr 255 div (\the\vert ) cvr 255 div %
	(\the\bleu ) cvr 255 div setrgbcolor %
	gsave %
%---- translation originale
%	-63.0 162.0 translate 
%----------
	-43.0 205.0 translate %
	0.900 -0.900 scale %
	newpath	%
		169 219 moveto 169 39 lineto  79 39 lineto  79 219 lineto %
	closepath stroke %
	newpath %
		159 64 moveto 159 54 lineto  89 54 lineto  89 64 lineto %
	closepath stroke %
	newpath %
		94 139 moveto 94 204 lineto %
	closepath stroke %
	newpath %
		104 139 moveto 104 204 lineto %
	closepath stroke %
	newpath %
		114 139 moveto 114 204 lineto %
	closepath stroke %
	newpath %
		124 139 moveto 124 204 lineto %
	closepath stroke %
	newpath %
		134 139 moveto 134 204 lineto %
	closepath stroke %
	newpath %
		144 139 moveto 144 204 lineto %
	closepath stroke %
	newpath %
		154 139 moveto 154 204 lineto %
	closepath stroke %
	newpath %
		79 199 moveto 44 219 lineto  44 229 lineto %
		79 229 lineto 79 219 lineto %
	closepath stroke %
	newpath %
		169 199 moveto 204 219 lineto %
		204 229 lineto  169 229 lineto 169 219 lineto %
	closepath stroke %
	grestore %
}%
}

% Trace d'un logo d'un router - modem dont les traits sont d'epaisseur #1,
% #2 et #3 sont les facteurs d'echelle que l'on peut appliquer pour
% deformer le dessin. 
\def\SunRouter#1#2#3{
\special{"%
	gsave %
	0 0 moveto %
%------- modifier le scaling ici----
	0.3 #2 mul 0.3 #3 mul scale %
% faire qq chose comme : 0.3 #1 mul 0.3 #2 mul scale
%---------------------
	#1 0.3 div 72 25.6 div mul setlinewidth %
	1 setlinecap 1 setlinejoin %
	(\the\rouge ) cvr 255 div (\the\vert ) cvr 255 div %
	(\the\bleu ) cvr 255 div setrgbcolor %
	gsave %
	-63.0 162.0 translate %
	0.900 -0.900 scale %
	newpath %
		75 165 moveto 75 144 lineto %
%		78 165 moveto 78 144 lineto %
		81 165 moveto 81 144 lineto %
%		84 165 moveto 84 144 lineto %
		87 165 moveto 87 144 lineto %
	closepath stroke %
	newpath %
	   gsave %
		90 165 moveto 180 rotate -1 1 scale %
		/Helvetica findfont 10 scalefont setfont %
		(ROUTER) show %
	   grestore %
	closepath %
	newpath %
		164 174 moveto 164 134 lineto 69 134 lineto 69 174 lineto %
	closepath stroke %
	newpath %
		159 179 moveto 159 174 lineto 74 174 lineto 74 179 lineto %
	closepath stroke %
 	grestore %
}}
\catcode`\@=12\relax%
