%
% Colorrgb.tex version 2.9/19-08-1991
% for Apple-Laserwriter
%
% Written by
%   Christophe C\'erin and Benoit Lemaire
%   Universit\'e de Paris Sud
%   L.R.I bat 490
%   91405 ORSAY France
%   mailing address : cerin@lri.lri.fr or LEMAIRE@FRLRI61.BITNET
%
% Permission is granted for use and non-profit distribution of color/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
%		    Apple LaserWriter for PostScript operators
\catcode`\@=11\relax%
\newwrite\@unused%
\def\typeout#1{{\let\protect\string\immediate\write\@unused{#1}}}%
\typeout{ColoRrgb/tex 2.9-by Christophe Cerin and Benoit Lemaire}%
\typeout{ColoRrgb/tex 2.9-for Apple LaserWriter and dvips driver}%
\typeout{ColoRrgb/tex 2.9 version au 19-8-91}%
%
\def\begincolor#1#2#3{%
    \special{ps::[begin]%
	 currentrgbcolor #1 255 div #2 255 div #3 255 div setrgbcolor}}
\def\endcolor{%
	\special{ps::[end] setrgbcolor}}

\def\color#1#2#3{\aftergroup\endcolor%
	\begincolor{#1}{#2}{#3}}

% 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%
   \begincolor{#2}{#3}{#4}%
   \hbox{\lower\@tempdima\hbox%
	{\vbox{\hrule\@height\fboxrule%
          \hbox{\vrule\@width\fboxrule\hskip\fboxsep%
	    \vbox{\endcolor\vskip\fboxsep\box\@tempboxa\vskip\fboxsep}%
		   \begincolor{#2}{#3}{#4}\hskip 1pt%
			 \hskip\fboxsep\vrule\@width\fboxrule}%
		   \hrule\@height\fboxrule\endcolor}}}}%

% \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%
	\begincolor{#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{\endcolor
		\vskip\fboxsep\box\@myboxb\vskip\fboxsep}%
}}}}}%

\def\underlinecolor#1#2#3#4{%
	\setbox0=\hbox{#1}%
	\setbox1=\hbox{\begincolor{#2}{#3}{#4}%
		   \vrule height .5pt depth 0pt width \wd0\endcolor}
	\hbox{\raise -2.8pt\vbox{\offinterlineskip\box0\box1}}}


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

%---Definitions des macros pour tracer des cercles.
%---Versions historiques qui effectuaient un degrade
%-sur une seule des 3 composantes RGB

\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 
		/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 
	#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\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
	\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	
      \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 
	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 %
	/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 mul #3 12 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 0.352777 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 mul yy 12.0 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 %
	/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 %
	/bidon {(a) search pop pop pop cvx exec} def %
	/ancien-nt 0 def /ancien-y 0 def /ancien-x 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 #2 def %
	/blanc {\the\BlancInterLettre} %
	def debut newpath #2 12 mul #3 12 mul neg moveto ( }%
\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 %
					0.352777 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 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 ( }\hss%
			\special{ps: ) bidon %
				{ fonctionX long le %
					{ /n-t n-t 0.001 add def }{exit} ifelse } loop %
				/xx fonctionX def %
				/yy fonctionY def %
				currentpoint translate currentpoint %
				angle neg rotate neg exch neg exch translate ( }\hss%
			\setbox21=\hbox{##1\hss}\box21%
			\special{ps: ) bidon %
				grestore %
				xx 12.0 mul yy 12.0 mul neg moveto ( %
			}%
			}\let\next=\COURBEBIS\fi%
			\next}\COURBEBIS}%


\catcode`\@=12\relax%
