%\NeedsTeXFormat{LaTeX2e}
%\RequirePackage{graphicx}
%\RequirePackage[all]{xy}
%\RequirePackage{ifthen}

\newdimen\fboxrulesave
\newdimen\fboxsepsave
\newenvironment{variation}[1]%
{\setlength{\fboxsepsave}{\fboxsep}%
\setlength{\fboxrulesave}{\fboxrule}%
\setlength{\fboxsep}{0pt}\setlength{\fboxrule}{1pt}\fbox{#1}}%
{\setlength{\fboxsep}{\fboxsepsave}%
\setlength{\fboxrule}{\fboxrulesave}}

\newsavebox{\testa} \newdimen\hauteura
\newsavebox{\testb} \newdimen\hauteurb
\newsavebox{\testc} \newdimen\hauteurc
\newsavebox{\testd} \newdimen\hauteurd
\newsavebox{\teste} \newdimen\hauteure
\newsavebox{\testf} \newdimen\hauteurf
\newsavebox{\testx} 

\newdimen\hauteurtotale
\newdimen\hauteur
\newdimen\profondeur
\newdimen\largeura
\newdimen\largeurb
\newdimen\retrait
\newdimen\depart 
\newdimen\arrivee \setlength{\arrivee}{0mm}

\newsavebox{\vertical}
\savebox{\vertical}{\rule[-2mm]{0mm}{7mm}}
\newsavebox{\fleche}%amplitude en largeur des flèches
\savebox{\fleche}{\rule{0.6cm}{0mm}}
\newsavebox{\horizontala}
\newsavebox{\horizontalb}
\newsavebox{\signe}

\newcommand{\ajustement}[1]{%
\savebox{\testx}{$#1$}\setlength{\hauteur}{\ht\testx}%
\savebox{\testx}{\raisebox{\depth}{$#1$}}\setlength{\hauteurtotale}{\ht\testx}%
\setlength{\profondeur}{\hauteurtotale}\addtolength{\profondeur}{-\hauteur}%
\ifthenelse{\lengthtest{\hauteurtotale>6mm}\or{\lengthtest{\hauteur>4mm}}%
\or{\lengthtest{\profondeur>2mm}}}%
{\raisebox{-2mm}{\resizebox*{!}{6mm}{\raisebox{\depth}{$#1$}}}}%
{\usebox{\vertical}$#1$}}

%partie gauche du tableau de variation
\newcommand{\debvar}[6]{%
\savebox{\testa}{\ajustement{#1}}\setlength{\largeura}{\wd\testa}%
\savebox{\testb}{\ajustement{#2}}%
\ifthenelse{\lengthtest{\largeura<\wd\testb}}%
{\setlength{\largeura}{\wd\testb}}{}%
\savebox{\testc}{\ajustement{#3}}%
\ifthenelse{\lengthtest{\largeura<\wd\testc}}%
{\setlength{\largeura}{\wd\testc}}{}%
\savebox{\horizontala}{\rule{\largeura}{0mm}}%
\savebox{\testd}{\ajustement{#4}}\setlength{\largeurb}{\wd\testd}%%
\savebox{\teste}{\ajustement{#5}}%
\ifthenelse{\lengthtest{\largeurb<\wd\teste}}%
{\setlength{\largeurb}{\wd\teste}}{}%
\savebox{\testf}{\ajustement{#6}}%
\ifthenelse{\lengthtest{\largeurb<\wd\testf}}%
{\setlength{\largeurb}{\wd\testf}}{}%
\savebox{\horizontalb}{\rule{\largeurb}{0mm}}%
\ensuremath{\xymatrix@R=0pt@C=0pt{%
\usebox{\testa}      &\usebox{\vertical}&\usebox{\testd}      \\% ligne 1
\usebox{\horizontala}&                  &\usebox{\horizontalb}\\% ligne 2
\usebox{\testb}      &\usebox{\vertical}&                     \\% ligne 3
\usebox{\horizontala}&                  &\usebox{\horizontalb}\\% ligne 4
                     &\usebox{\vertical}&\usebox{\teste}      \\% ligne 5
\usebox{\testc}      &\usebox{\vertical}&                     \\% ligne 6
                     &\usebox{\vertical}&\usebox{\testf} % ligne 8
\save "1,2"+U \ar@{-} "7,2"+D  \restore  %ligne verticale 
\save "2,1"+L \ar@{-} "2,3"+R  \restore  %1e ligne horizontale
\save "4,1"+L \ar@{-} "4,3"+R  \restore  %2e ligne horizontale
}}\setlength{\retrait}{-1ex}}

%partie gauche du tableau de variation
\newcommand{\departvar}[7]{%
\setlength{\arrivee}{#7}
\savebox{\testa}{\ajustement{#1}}\setlength{\largeura}{\wd\testa}%
\savebox{\testb}{\ajustement{#2}}%
\ifthenelse{\lengthtest{\largeura<\wd\testb}}%
{\setlength{\largeura}{\wd\testb}}{}%
\savebox{\testc}{\ajustement{#3}}%
\ifthenelse{\lengthtest{\largeura<\wd\testc}}%
{\setlength{\largeura}{\wd\testc}}{}%
\savebox{\horizontala}{\rule{\largeura}{0mm}}%
\savebox{\testd}{\ajustement{#4}}\setlength{\largeurb}{\wd\testd}%%
\savebox{\teste}{\ajustement{#5}}%
\ifthenelse{\lengthtest{\largeurb<\wd\teste}}%
{\setlength{\largeurb}{\wd\teste}}{}%
\savebox{\horizontalb}{\rule{\largeurb}{0mm}}%
\ensuremath{\xymatrix@R=0pt@C=0pt{%
\usebox{\testa}      &\usebox{\vertical}&\usebox{\testd}      \\% ligne 1
\usebox{\horizontala}&                  &\usebox{\horizontalb}\\% ligne 2
\usebox{\testb}      &\usebox{\vertical}&                     \\% ligne 3
\usebox{\horizontala}&                  &\usebox{\horizontalb}\\% ligne 4
                     &\usebox{\vertical}&                     \\% ligne 5
\usebox{\testc}      &\usebox{\vertical}&                     \\% ligne 6
                     &\usebox{\vertical}& % ligne 8
\save "1,2"+U \ar@{-} "7,2"+D  \restore  %ligne verticale 
\save "2,1"+L \ar@{-} "2,3"+R  \restore  %1e ligne horizontale
\save "4,1"+L \ar@{-} "4,3"+R  \restore  %2e ligne horizontale
\save "7,3" \ar@{}|(#6)*{\usebox{\teste}} "5,3" \restore% valeur de depart de la fonction
}}\setlength{\retrait}{-1.5ex}}



%prolongement à droite du tableau de variation par 
%adjonction d'une flèche indiquant les variations de la fonction
\newcommand{\varie}[6][]{%
\ifthenelse{\equal{#1}{}}%
{\setlength{\depart}{\arrivee}}{\setlength{\depart}{#1}}%
\savebox{\testa}{\ajustement{#3}}\setlength{\largeura}{\wd\testa}%
\savebox{\testb}{\ajustement{#4}}%
\ifthenelse{\lengthtest{\largeura<\wd\testb}}%
{\setlength{\largeura}{\wd\testb}}{}%
\savebox{\testc}{\ajustement{#5}}%
\ifthenelse{\lengthtest{\largeura<\wd\testc}}%
{\setlength{\largeura}{\wd\testc}}{}%
\setlength{\largeura}{\largeura/2}\addtolength{\largeura}{1mm}%
\setlength{\arrivee}{#2}%
\ifthenelse{\lengthtest{\arrivee<\depart}}%
{\savebox{\signe}{\Large --}}{\savebox{\signe}{\Large +}}%
\hspace{\retrait}%
\ensuremath{\xymatrix@R=0pt@C=0pt{%
\usebox{\vertical}&\\% ligne 1
\usebox{\fleche}  &\rule{\largeura}{0mm}\usebox{\fleche}\\% ligne 2
\usebox{\vertical}&\\% ligne 3
\usebox{\fleche}  &\rule{\largeura}{0mm}\usebox{\fleche}\\% ligne 4
\usebox{\vertical}&\rule[-2mm]{\largeura}{0mm}\usebox{\fleche}\\% ligne 5
\usebox{\vertical}&\\% ligne 6
\rule[2mm]{0.6cm}{0mm}  &\usebox{\vertical}  % ligne 7
\save "2,1"+L \ar@{-} "2,2"+R   \restore % règle horizontale en ligne 2
\save "4,1"+L \ar@{-} "4,2"+R   \restore % règle horizontale en ligne 4
\ifthenelse{\equal{#3}{0}}%
{\save "1,2"+D \ar@{.}|(0.4)*+={\usebox{\testa}}"5,2"+D\restore%
\save "5,2"+U \ar@{.} "7,2"+<0mm,\arrivee>\restore}{}% valeur de la dérivée (0 par défaut)
\save "1,2"  \ar@{}|(0)*{\usebox{\testb}} "7,2"  \restore% valeur de la variable où a lieu le max
\save "7,2" \ar@{}|(#6)*{\usebox{\testc}} "5,2"  \restore% valeur du maximum
\save "3,1" \ar@{}|(0.3)*{\usebox{\signe}}"3,2"  \restore%signe +
\save "7,1"+<-1ex,\depart> \ar@{->}"7,2"+<-\largeura,\arrivee>\restore % flèche de croissance
}}\setlength{\retrait}{-2.5ex}}



%prolongement à droite du tableau de variation par 
%adjonction d'une flèche indiquant que la fonction est croissante
\newcommand{\croissance}[3][0]{%
\savebox{\testa}{\ajustement{#1}}\setlength{\largeura}{\wd\testa}%
\savebox{\testb}{\ajustement{#2}}%
\ifthenelse{\lengthtest{\largeura<\wd\testb}}
{\setlength{\largeura}{\wd\testb}}{}%
\savebox{\testc}{\ajustement{#3}}%
\ifthenelse{\lengthtest{\largeura<\wd\testc}}%
{\setlength{\largeura}{\wd\testc}}{}%
\setlength{\largeura}{\largeura/2}
\hspace{\retrait}%
\ensuremath{\xymatrix@R=0pt@C=0pt{%
\usebox{\vertical}&\\% ligne 1
\usebox{\fleche}  &\rule{\largeura}{0mm}\usebox{\fleche}\\% ligne 2
\usebox{\vertical}&\\% ligne 3
\usebox{\fleche}  &\rule{\largeura}{0mm}\usebox{\fleche}\\% ligne 4
\usebox{\vertical}&\rule[-2mm]{\largeura}{0mm}\usebox{\fleche}\\% ligne 5
\usebox{\vertical}&\\% ligne 6
\rule[2mm]{0.6cm}{0mm}  &\usebox{\vertical}  % ligne 7
\save "2,1"+L \ar@{-} "2,2"+R   \restore % règle horizontale en ligne 2
\save "4,1"+L \ar@{-} "4,2"+R   \restore % règle horizontale en ligne 4
\ifthenelse{\equal{#1}{0}}%
{\save "1,2"+D \ar@{.}|(0.5)*+={\usebox{\testa}}"5,2"+U\restore}{}% valeur de la dérivée (0 par défaut)
\save "1,2" \ar@{}|(0)*{\usebox{\testb}}"7,2" \restore% valeur de la variable où a lieu le max
\save "5,2" \ar@{}|(0)*{\usebox{\testc}}"7,2" \restore% valeur du maximum
\save "3,1"\ar@{}|(0.3)*{\text{\Large +}} "3,2"  \restore%signe +
\save "7,1"+UL \ar@{->}"5,2"+D+<-\largeura,0mm>\restore % flèche de croissance
}}\setlength{\retrait}{-2ex}}

%prolongement à droite du tableau de variation par 
%adjonction d'une flèche indiquant que la fonction est décroissante
\newcommand{\decroissance}[3][0]{%
\savebox{\testa}{\ajustement{#1}}\setlength{\largeura}{\wd\testa}%
\savebox{\testb}{\ajustement{#2}}%
\ifthenelse{\lengthtest{\largeura<\wd\testb}}
{\setlength{\largeura}{\wd\testb}}{}%
\savebox{\testc}{\ajustement{#3}}%
\ifthenelse{\lengthtest{\largeura<\wd\testc}}%
{\setlength{\largeura}{\wd\testc}}{}%
\setlength{\largeura}{\largeura/2}
\hspace{\retrait}%
\ensuremath{\xymatrix@R=0pt@C=0pt{%
\usebox{\vertical}&\\% ligne 1
\usebox{\fleche}  &\rule{\largeura}{0mm}\usebox{\fleche}\\% ligne 2
\usebox{\vertical}&\\% ligne 3
\usebox{\fleche}  &\rule{\largeura}{0mm}\usebox{\fleche}\\% ligne 4
\rule[-2mm]{0.6cm}{0mm} &\usebox{\vertical}\\  % ligne 5
\usebox{\vertical}&\\% ligne 6
\usebox{\vertical}&\rule[-2mm]{\largeura}{0mm}\usebox{\fleche}% ligne 7
\save "2,1"+L \ar@{-} "2,2"+R   \restore % règle horizontale en ligne 2
\save "4,1"+L \ar@{-} "4,2"+R   \restore % règle horizontale en ligne 4
\ifthenelse{\equal{#1}{0}}%
{\save "1,2"+D \ar@{.}|(0.5)*+={\usebox{\testa}}"4,2"+U\restore
 \save "4,2"+D \ar@{.} "7,2"+U\restore
}{}% valeur de la dérivée (0 par défaut)
\save "1,2" \ar@{}|(0)*{\usebox{\testb}}"7,2" \restore% valeur de la variable où a lieu le max
\save "5,2" \ar@{}|(1)*{\usebox{\testc}}"7,2" \restore% valeur du maximum
\save "3,1"\ar@{}|(0.3)*{\text{\Large --}} "3,2"  \restore%signe -
\save "5,1"+DL \ar@{->}"7,2"+U+<-\largeura,0mm>\restore % flèche de decroissance
}}\setlength{\retrait}{-2ex}}

%indication d'une asymptote verticale (1ère forme)
\newcommand{\asymptotebis}[3]{%
\savebox{\testa}{\ajustement{#1}}\setlength{\largeura}{\wd\testa}%
\savebox{\testb}{\ajustement{#2}}%
\ifthenelse{\lengthtest{\largeura<\wd\testb}}%
{\setlength{\largeura}{\wd\testb}}{}%
\savebox{\testc}{\ajustement{#3}}%
\ifthenelse{\lengthtest{\largeura<\wd\testc}}%
{\setlength{\largeura}{\wd\testc}}{}%
\savebox{\horizontala}{\rule{\largeura}{0mm}}%
\hspace{\retrait}%
\ensuremath{\xymatrix@R=0pt@C=0pt{%
\usebox{\vertical}%
\\%\usebox{\testa}                  \\% ligne 1
\usebox{\horizontala}            \\% ligne 2
\usebox{\vertical}               \\% ligne 3
\usebox{\horizontala}            \\% ligne 4
\usebox{\vertical}\\%\usebox{\testb}\\% ligne 5
\usebox{\vertical}               \\% ligne 6
\usebox{\vertical}%\usebox{\testc}  % ligne 7
\save "2,1"+L  \ar@{-} "2,1"+R  \restore %2eme horizontale
\save "4,1"+L  \ar@{-} "4,1"+R  \restore%3eme horizontale
\save "1,1"+U  \ar@{=}|(0.25)*{\usebox{\testa}} "4,1"+D \restore 
\save "5,1"+U  \ar@{=}|(0.15)*{\usebox{\testb}} "6,1"+D \restore
\save "6,1"+U  \ar@{=}|(0.75)*{\usebox{\testc}} "7,1"+D \restore%
}}\setlength{\retrait}{-1ex}}


%indication d'une asymptote verticale (2ème forme)
\newcommand{\asymptote}[3]{%
\savebox{\testa}{\ajustement{#1}}%
\savebox{\horizontala}{\rule{\wd\testa/2}{0mm}}%
\savebox{\testb}{\ajustement{#2}}%
\setlength{\largeurb}{\wd\testb}%
\savebox{\testc}{\ajustement{#3}}%
\ifthenelse{\lengthtest{\largeurb<\wd\testc}}%
{\setlength{\largeurb}{\wd\testc}}{}%
\savebox{\horizontalb}{\rule{\largeurb/2}{0mm}}%
\hspace{\retrait}%
\ensuremath{\xymatrix@R=0pt@C=0pt{%
\usebox{\vertical}   &&\\% ligne 1
\usebox{\horizontala}&\usebox{\horizontalb}&\\% ligne 2
\usebox{\vertical}   &&\\% ligne 3
                     &&\\% ligne 4
\usebox{\vertical}   &&\\%% ligne 5
\usebox{\vertical}   &&\\% ligne 6
\usebox{\vertical}   &&% ligne 7
\save "2,1"+L  \ar@{-} "2,3"+R  \restore   %2eme horizontale
\save "4,1"+L  \ar@{-} "4,3"+R  \restore   %3eme horizontale
\save "1,1"+U  \ar@{=}|(0.1)*{\usebox{\testa}} "7,1"+D  \restore   %double ligne verticale
\save "5,2"  \ar@{}|(0)*{\usebox{\testb}} "7,2"  \restore%
\save "5,2"  \ar@{}|(1)*{\usebox{\testc}} "7,2"  \restore%
}}\setlength{\retrait}{-2ex}}

%indication d'un intervalle où la fonction n'est pas définie
\newcommand{\nondefini}{%
\hspace{\retrait}%
\ensuremath{\xymatrix@R=0pt@C=0pt{%
&\usebox{\vertical}&\\% ligne 1
&\rule{1cm}{0mm}   &\\% ligne 2
&\usebox{\vertical}&\\% ligne 3
&\rule{1cm}{0mm}   &\\% ligne 4
&\usebox{\vertical}&\\% ligne 5
&\usebox{\vertical}&\\% ligne 6
&\usebox{\vertical}&  %ligne 7
\save "2,1"+L \ar@{-} "2,3"+R \restore %1e ligne horizontale
\save "4,1"+L \ar@{-} "4,3"+R \restore %2e ligne horizontale
\save "1,1"+L \ar@{.} "1,3" \restore %
\save "3,1"+L \ar@{.} "3,3" \restore %
\save "5,1"+L \ar@{.} "5,3" \restore %
\save "6,1"+L \ar@{.} "6,3" \restore %
\save "7,1"+L \ar@{.} "7,3" \restore %
}}\setlength{\retrait}{-1ex}}
