summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Master/texmf-dist/doc/metapost/repere/README12
-rw-r--r--Master/texmf-dist/doc/metapost/repere/repere-doc.pdfbin0 -> 621123 bytes
-rw-r--r--Master/texmf-dist/doc/metapost/repere/repere-doc.tex1363
-rw-r--r--Master/texmf-dist/metapost/repere/repere.mp1944
-rwxr-xr-xMaster/tlpkg/bin/tlpkg-ctan-check2
-rw-r--r--Master/tlpkg/tlpsrc/collection-metapost.tlpsrc1
-rw-r--r--Master/tlpkg/tlpsrc/repere.tlpsrc0
7 files changed, 3321 insertions, 1 deletions
diff --git a/Master/texmf-dist/doc/metapost/repere/README b/Master/texmf-dist/doc/metapost/repere/README
new file mode 100644
index 00000000000..b4fe5d2ceb0
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/repere/README
@@ -0,0 +1,12 @@
+repere.mp
+
+This package provides MetaPost macros for drawing in a coordinate system :
+- axis, grids
+- points, vectors
+- functions (curves, tangents, integrals, sequences)
+- statistic diagrams
+
+The doc is in french, sorry for that
+
+License LPPL
+
diff --git a/Master/texmf-dist/doc/metapost/repere/repere-doc.pdf b/Master/texmf-dist/doc/metapost/repere/repere-doc.pdf
new file mode 100644
index 00000000000..4ebe22e1ee5
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/repere/repere-doc.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/metapost/repere/repere-doc.tex b/Master/texmf-dist/doc/metapost/repere/repere-doc.tex
new file mode 100644
index 00000000000..b51602fd4f9
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/repere/repere-doc.tex
@@ -0,0 +1,1363 @@
+\documentclass[11pt,a4paper,french]{article}
+% to compile this doc (needs geometriesyr16.mp http://melusine.eu.org/syracuse/poulecl/macros/):
+% (pdf)latex repere-doc.tex
+% mpost repere-doc.mp
+% mpost repere-doc.mp
+% (pdf)latex repere-doc.tex
+
+ \usepackage{calc,ifthen}
+
+ \usepackage[utf8]{inputenc}
+ \usepackage[T1]{fontenc}
+ \usepackage{lmodern}
+ \usepackage{textcomp}
+
+ \usepackage{geometry}
+ \geometry{twoside,hmargin=2cm,vmargin={1.5cm,1.8cm},includefoot}
+
+ \usepackage{mflogo}
+
+ \usepackage[output-decimal-marker={,}]{siunitx}
+
+ \usepackage{multicol}
+ \setlength{\multicolsep}{3pt}
+ \setlength{\columnsep}{0pt}
+
+ \usepackage[toc]{multitoc}
+
+ \usepackage{enumitem}
+ \setlist[description]{font=\ttfamily\bfseries\color{blue}}
+
+ \usepackage[svgnames]{xcolor}
+
+ \usepackage{graphicx}
+ \usepackage{ifpdf}
+ \ifpdf
+ \DeclareGraphicsRule{*}{mps}{*}{}
+ \fi
+
+ \usepackage{url}
+ \usepackage{verbatim}
+ \usepackage{fancyvrb}
+
+ \usepackage{array}
+ \usepackage{tabularx}
+ \renewcommand{\tabularxcolumn}[1]{>{\arraybackslash}m{#1}}
+
+ \usepackage{tcolorbox}
+ \tcbset{colframe=black,boxsep=0pt,left=3pt,right=3pt,top=0pt,bottom=0pt,boxrule=0.4pt,colback=LightGoldenrod}
+
+ \usepackage{listings}
+ \lstset{columns=flexible,%
+ language=MetaPost,%
+ showstringspaces=false,%
+ basicstyle=\ttfamily}
+
+
+ \usepackage{babel}
+ \usepackage[colorlinks=true,urlcolor=blue]{hyperref}
+
+
+
+%%%%%%%%%%%%%%%%%%% moreverb.sty
+\makeatletter
+\newwrite\verbatim@out
+ \immediate\openout \verbatim@out \jobname.mp
+\newwrite\temp@code
+\def\verbatimwrite{%
+ \@bsphack
+ \immediate\openout \temp@code figtmp.mp
+ \let\do\@makeother\dospecials
+ \catcode`\^^M\active \catcode`\^^I=12
+ \def\verbatim@processline{%
+ \immediate\write\verbatim@out
+ {\the\verbatim@line}%
+ \immediate\write\temp@code
+ {\the\verbatim@line}
+ }%
+ \verbatim@start}
+
+\def\endverbatimwrite{%
+ \immediate\closeout\temp@code
+ \@esphack
+ }%
+\makeatother
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\newlength{\largeurcode}
+\newlength{\largeurfig}
+\newcounter{numfig}
+\setcounter{numfig}{0}
+
+\newcommand{\codedeuxcol}{%
+ \begin{tcolorbox}
+ \begin{minipage}[c]{\largeurcode}
+ \begin{multicols}{2}
+ \lstinputlisting{figtmp.mp}
+ \end{multicols}
+ \end{minipage}
+ \end{tcolorbox}
+ \par\noindent
+ }
+
+
+\newcommand{\codehoriz}{%
+ \begin{minipage}[c]{\largeurcode}
+ \lstinputlisting[frame=single,frameround=tttt,backgroundcolor=\color{LightGoldenrod}]{figtmp.mp}
+ \end{minipage}
+ \hfill
+ }
+
+\newcommand{\codevert}{%
+ {\centering
+ \begin{minipage}[c]{\largeurcode}
+ \lstinputlisting[frame=single,frameround=tttt,backgroundcolor=\color{LightGoldenrod}]{figtmp.mp}
+ \end{minipage}
+ \par\noindent}
+ }
+
+\newenvironment{codefigure}[3]%
+ {%
+ \refstepcounter{numfig}
+ \setlength{\largeurcode}{#2\linewidth}
+ \ifnum#1=0
+ \setlength{\largeurfig}{\linewidth-\largeurcode-2\fboxsep-2\fboxrule}
+ \def\inscode{\codehoriz}
+ \else
+ \setlength{\largeurfig}{\linewidth}
+ \def\inscode{\codevert}
+ \ifnum#3=1
+ \relax
+ \else
+ \def\inscode{\codedeuxcol}
+ \fi
+ \fi
+ \verbatimwrite
+ }%
+ {%
+ \endverbatimwrite
+ \par
+ \noindent
+ \inscode
+ \IfFileExists{\jobname.\thenumfig}%
+ {\begin{minipage}[c]{\largeurfig}
+ \centering \includegraphics{\jobname.\thenumfig}\par
+ \end{minipage}}{}
+ \par}
+
+
+\newenvironment{codecache}%
+ {\verbatimwrite}{\endverbatimwrite}
+
+\newcounter{reptmp}
+
+\newenvironment{codefigureinter}[2][1]%
+ {%
+ \setcounter{reptmp}{\value{numfig}+#2}
+ \setlength{\largeurcode}{#1\linewidth}
+ \def\inscode{\codevert}
+ \verbatimwrite
+ }%
+ {\endverbatimwrite
+ \par
+ \noindent
+ \inscode
+ \whiledo{\value{numfig}<\value{reptmp}}
+ {\refstepcounter{numfig}
+ \IfFileExists{\jobname.\thenumfig}%
+ {\includegraphics{\jobname.\thenumfig}
+ \qquad}{}
+ }
+ \par}
+
+
+\newcounter{repexemple}
+\setcounter{repexemple}{0}
+
+\newcommand{\debutexemple}{\par\vspace{2ex}
+ \refstepcounter{repexemple}
+ \noindent {\bfseries \color{blue!20!black}
+ Exemple \arabic{repexemple}}
+ \par\nopagebreak\vspace{1ex}
+ }
+
+
+\newenvironment{exemple}[1][0.5]%
+ {\debutexemple
+ \codefigure{0}{#1}{1}
+ }%
+ {\endcodefigure
+ \par\vspace{2ex}}
+
+\newenvironment{exemplev}[2][1]%
+ {\debutexemple
+ \codefigure{1}{#1}{#2}
+ }%
+ {\endcodefigure
+ \par\vspace{2ex}}
+
+\newenvironment{exemplefiginter}[2][1]%
+ {\debutexemple
+ \codefigureinter[#1]{#2}
+ }%
+ {\endcodefigureinter
+ \par\vspace{2ex}}
+
+\newenvironment{figreperedoc}%
+ {\refstepcounter{numfig}
+ \verbatimwrite}%
+ {%
+ \endverbatimwrite%
+ \IfFileExists{\jobname.\thenumfig}%
+ {\includegraphics{\jobname.\thenumfig}}{}
+ }
+
+
+\newcommand{\vect}[1]{\overrightarrow{#1\rule{0.1em}{0ex}}}
+
+\begin{document}
+\title{Documentation de \texttt{repere.mp}}
+\date{\today}
+\author{Olivier \textsc{Péault}%
+\footnote{E-mail : \href{mailto:o.peault@gmail.com}{\texttt{o.peault@gmail.com}}}}
+\maketitle
+
+\setcounter{tocdepth}{2}
+
+\setlength{\columnsep}{25pt}
+\tableofcontents
+\setlength{\columnsep}{10pt}
+
+
+
+
+\begin{codecache}
+input geometriesyr16;
+input latexmp;
+input repere;
+\end{codecache}
+
+
+\section{Utilisation du fichier}
+Les macros du fichier \verb+repere.mp+ ont pour but de simplifier la création de figures dans un repère du plan avec \MP{}. L'idée de départ est de coller le plus possibles aux besoins de l'enseignement secondaire de mathématiques.
+
+Il est possible d'utiliser \verb+repere+ et \verb+geometriesyr+ (les macros de Christophe \textsc{Poulain} pour la géométrie disponibles à l'adresse \url{http://melusine.eu.org/syracuse/poulecl/macros/}) dans une même figure comme le montrent les exemples page \pageref{exgeom}.
+
+Le fichier \verb+repere.mp+ doit être placé dans un répertoire accessible à \MP{} (Par ex. le répertoire \verb+metapost+ du \verb+texmf+ local). De plus, la ligne \verb+input repere;+ doit apparaître dans le document contenant les figures.
+
+
+Certaines des étiquettes (noms de points, de courbes, de vecteurs...) sont composées automatiquement au format \LaTeX{} mais la compilation peut devenir assez longue pour un nombre important de figures car un fichier est créé et compilé automatiquement par \MP{} pour chaque étiquette. Il est alors possible d'utiliser le fichier \verb+latexmp.mp+ à condition de placer l'instruction \verb+input latexmp;+ avant l'instruction \verb+input repere;+. Attention, utiliser \verb+latexmp.mp+ oblige à compiler deux fois les documents.
+
+
+\section{Repère utilisateur}
+
+\subsection{Numérotation des figures}
+Chaque figure devra débuter par une instruction \verb|repere()| et se terminer par \verb|fin| (voir ci-dessous). Si ces instructions se trouvent en dehors d'un environnement \verb|beginfig()|-\verb|endfig| la numérotation est automatique :
+
+\bigskip
+\begin{minipage}[c]{0.3\linewidth}
+\begin{lstlisting}[frame=single,frameround=tttt,backgroundcolor=\color{LightGoldenrod}]
+beginfig(2);
+repere(...);
+<instructions de dessin>
+fin;
+endfig;
+\end{lstlisting}
+\end{minipage}
+\hfill
+\begin{minipage}[c]{0.6\linewidth}
+La figure porte le numéro 2
+\end{minipage}
+
+\bigskip
+\begin{minipage}[c]{0.3\linewidth}
+\begin{lstlisting}[frame=single,frameround=tttt,backgroundcolor=\color{LightGoldenrod}]
+repere(...);
+<instructions de dessin>
+fin;
+\end{lstlisting}
+\end{minipage}
+\hfill
+\begin{minipage}[c]{0.6\linewidth}
+La numérotation est automatique. La figure porte le numéro qui suit la figure précédemment dessinée. S'il s'agit de la première, elle porte le numéro 1.
+\end{minipage}
+
+
+
+\subsection{Définition du repère}
+\begin{description}
+\item[repere(xmin,xmax,ux,ymin,ymax,uy,theta)] débute une figure et définit le repère utilisateur : axe des abscisses de \verb+xmin+ à \verb+xmax+, unité \verb+ux+, axe des ordonnées de \verb+ymin+ à \verb+ymax+, unité \verb+uy+ et \verb+theta+ est l'angle en degrés entre les axes. Le paramètre \verb+theta+ est optionnel. Il est égal à 90 par défaut.
+
+\item[repere.larg(xmin,xmax,Lx,ymin,ymax,Ly,theta)] définit un repère tel que la largeur totale de la figure produite soit \verb+Lx+ et sa hauteur \verb+Ly+.
+
+\item[repere.orth(xmin,xmax,Lx,ymin,ymax)] définit un repère orthonormé de largeur totale \verb+Lx+.
+
+\item[interaxes(x,y)] définit les coordonnées du point d'intersection des axes. Par défaut ces coordonnées sont $(0,0)$.
+
+\item[cadre] chemin fermé qui fait le tour du repère.
+
+\item[fin] termine la figure et la découpe pour ne garder que la partie limitée par le repère utilisateur.
+\end{description}
+
+
+
+
+\subsection{Axes}
+
+\subsubsection{Généralités}
+\begin{description}
+\item[axex.pos(grad,val)] axe des abscisses gradué avec un pas de \verb+grad+ et étiqueté avec un pas de \verb+val+.
+
+Si \verb+grad+ est négatif ou nul, l'axe n'est pas gradué et si \verb+val+ est négatif ou nul, l'axe n'est pas étiqueté.
+
+\verb+pos+ est un paramètre optionnel qui désigne la position (au sens de \MP : \verb+rt+, \verb+urt+, \verb+top+, \verb+ulft+, \verb+lft+, \verb+llft+, \verb+bot+ ou \verb+lrt+) des étiquettes. \verb+pos+ peut être omis, la valeur par défaut est \verb+bot+.
+
+Les étiquettes qui ne sont pas entièrement à l'intérieur du cadre ne sont pas dessinées.
+
+\item[axey.pos(grad,val)] axe des ordonnées. La valeur par défaut de \verb+pos+ est \verb+lft+.
+\end{description}
+
+
+Au niveau de l'intersection des axes, les étiquettes sont tracées à la position \verb+pos+ si l'abscisse est différente de l'ordonnée ou si un seul axe est tracé. Dans le cas contraire, une seule étiquette est tracée pour les deux axes à une position \og intermédiaire \fg{} (pour \verb+axex.bot+ et \verb+axey.lft+, on obtient la position \verb+llft+)
+
+\begin{description}
+\item[axes.pos(grad,val)] figure formée par les deux axes gradués avec le même pas \verb+grad+ et étiquetés avec le même pas \verb+val+. \verb+pos+ désigne la position de l'étiquette de l'intersection des axes, sa valeur par défaut est \verb|llft|. La position des étiquettes des axes est définie à partir de \verb+pos+ (pour \verb+urt+ on obtient \verb+top+ pour l'axe des abscisses et \verb+rt+ pour l'axe des ordonnées.
+
+\end{description}
+
+Les axes sont dessinés, gradués et étiquetés par défaut sur toute la longueur du repère utilisateur. Pour des valeurs différentes on peut utiliser les macros suivantes :
+
+
+
+\begin{exemple}
+repere(-3,3,1cm,-1,1,1cm);
+draw axex(1,1);
+fin;
+\end{exemple}
+
+\begin{exemple}
+repere(-3,3,1cm,-1,1,1cm);
+draw axex.top(1,1);
+fin;
+\end{exemple}
+
+\begin{exemple}
+repere(-3,3,0.8cm,-2.5,2.5,1cm);
+draw axes(1,1) withcolor pourpre;
+draw cadre;
+fin;
+\end{exemple}
+
+\begin{exemple}
+repere(-3,3,0.8cm,-2.5,2.5,1cm,60);
+draw axes.lrt(1,1);
+draw cadre;
+fin;
+\end{exemple}
+
+\begin{exemple}
+repere.orth(-3,3,5cm,-2.5,2.5);
+draw axex.top(0.5,1) withcolor bleu;
+draw axey(1,1) withcolor bleu;
+fin;
+\end{exemple}
+
+\subsubsection{Réglages des axes}
+
+Les axes sont dessinés, gradués et étiquetés par défaut sur toute la longueur du repère utilisateur. Pour des valeurs différentes on peut utiliser les macros suivantes :
+
+
+\begin{description}
+\item[setaxes(xmin,xmax,ymin,ymax)] définit les valeurs minimales et maximales pour les axes.
+
+\item[setgrad(xmin,xmax,ymin,ymax)] définit les valeurs minimales et maximales pour les graduations.
+
+\item[setval(xmin,xmax,ymin,ymax)] définit les valeurs minimales et maximales pour l'étiquetage.
+
+\item[flecheaxe] booléen égal à \verb|true| par défaut qui permet de dessiner, ou non, des flèches au bout des axes.
+\end{description}
+
+\begin{exemple}
+repere.larg(110,160,5cm,2000,7000,5cm);
+interaxes(120,3000);
+setaxes(120,160,3000,7000);
+setgrad(120,160,3000,7000);
+draw axex(10,10);
+draw axey(1000,1000);
+fin;
+\end{exemple}
+
+
+\begin{description}
+ \item[axexo.pos(grad,val), axeyo.pos(grad,val), axeso.pos(grad,val)] macros identiques aux précédentes sauf pour l'étiquette correspondant à l'intersection des axes qui est toujours dessinée.
+
+ \item[axexn.pos(grad,val), axeyn.pos(grad,val), axesn.pos(grad,val)] macros identiques aux précédentes sauf pour l'étiquette correspondant à l'intersection des axes qui n'est jamais dessinée.
+\end{description}
+
+
+\begin{exemple}
+repere(-0.5,3,0.8cm,-0.5,2.5,1cm);
+setaxes(0,3,0,2.5);
+draw axeso(1,1);
+fin;
+\end{exemple}
+
+\begin{exemple}
+repere.larg(-3,3,6cm,-3,4,3.5cm,60);
+draw axexn(1,2) withcolor rouge;
+draw axeyn(1,1) withcolor olive;
+draw cadre;
+fin;
+\end{exemple}
+
+\subsubsection{Graduations multiples de $\pi$}
+
+\begin{description}
+\item[axexpi.pos(n,d)] axe des abscisses gradué et étiqueté avec un pas de $\frac{n\pi}{d}$. Les fractions sont composées en mode normal. Pour les obtenir en mode \og displaystyle \fg, la variable de type booléen \verb+displayfrac+ doit être égale à \verb+true+.
+
+\item[axeypi.pos(n,d)] axe des ordonnées gradué et étiqueté avec un pas de $\frac{n\pi}{d}$.
+
+\item[axespi.pos(n,d)] les deux axes gradués et étiquetés avec un pas de $\frac{n\pi}{d}$.
+
+\item[axexpio.pos(n,d), axeypio.pos(n,d), axespio.pos(n,d)] même chose que précédemment sauf pour l'étiquette correspondant à l'intersection des axes qui est toujours dessinée.
+
+\item[axexpin.pos(n,d), axeypin.pos(n,d), axespin.pos(n,d)] même chose que précédemment sauf pour l'étiquette correspondant à l'intersection des axes qui n'est jamais dessinée.
+\end{description}
+
+
+\begin{exemple}
+repere(-2.5,2.5,1.3cm,-3.5,3.5,0.8cm);
+draw axexpi(1,6) withcolor grisfonce;
+draw axeypi(1,4) withcolor grisfonce;
+draw cadre;
+fin;
+\end{exemple}
+
+\subsubsection{Graduations isolées}
+
+\begin{description}
+\item[axexpart.pos(x1,lab1,x2,lab2,...)] graduation et étiquetage partiels de l'axe des abscisses pour les valeurs \verb+x1+, \verb+x2+... et les étiquettes \verb+lab1+, \verb+lab2+... à la position \verb+pos+. Si \verb+pos+ est omis, les étiquettes sont placées à la position \verb+bot+. Les étiquettes peuvent être soit des chaînes de caractères ("aa", "bonjour"), soit des expressions du type \verb+btex $\pi$ etex+ (ou \verb|LaTeX("$\pi$")| voir page \pageref{latex}), soit d'autres figures. Si \verb+labn+ est omis, la valeur de \verb+xn+ sera utilisée comme étiquette. Pour obtenir une graduation sans étiquette, on peut utiliser la chaîne vide \verb+""+.
+
+\item[axeypart.pos(y1,lab1,y2,lab2,...)] même chose sur l'axe des ordonnées. Si \verb+pos+ est omis, les étiquettes sont placées à la position \verb+lft+.
+\end{description}
+
+
+
+\begin{exemple}[0.55]
+repere.orth(-4,5,6cm,-3,4.5);
+setgrad(0,5,0,3);
+setval(0,5,0,3);
+draw axex(1,2);
+draw axey(1,0);
+draw axexpart(-1.8,-pi,LaTeX("$-\pi$"))
+ withcolor bleu;
+draw axeypart.rt(-2.5,"dd",-1,2.5,"")
+ withcolor rouge;
+fin;
+\end{exemple}
+
+\subsubsection{Ajout de texte sur les graduations}
+
+\begin{description}
+\item[extranumx] chaine de caractères qui sera ajoutée après les valeurs des graduations sur l'axe des abscisses avant d'être composée avec la commande \verb|\num| de \verb|siunitx|.
+\item[extranumy] même chose sur l'axe des ordonnées.
+
+\end{description}
+
+\begin{exemple}
+repere(-1,4,1.2cm,-1,3.5,1cm);
+extranumx:="e3";
+extranumy:="0000";
+draw axes(1,1);
+draw cadre;
+fin;
+\end{exemple}
+
+
+\subsection{Quadrillages}
+\begin{description}
+\VerbatimFootnotes
+\item[setquad(xmin,xmax,ymin,ymax)] définit les valeurs minimales et maximales pour le tracé des quadrillages.\footnote{Il existe une macro \verb|settout| qui appelle successivement \verb+setaxes+, \verb+setgrad+, \verb+setval+ et \verb+setquad+.}
+
+\item[quadrillage(x,y)] quadrillage avec un pas de \verb+x+ sur l'axe des abscisses et de \verb+y+ sur l'axe des ordonnées. L'épaisseur des traits par défaut est \verb+0.3bp+ et la couleur par défaut est \verb+0.7white+.
+\end{description}
+
+
+\begin{exemple}
+repere(-3,3,0.8cm,-2.5,2.5,1cm);
+draw quadrillage(1,0.5);
+draw axes(1,1);
+draw cadre;
+fin;
+\end{exemple}
+
+\begin{exemple}
+repere(-3,3,0.8cm,-2.5,2.5,1cm);
+draw quadrillage(1,1) dashed evenly
+ withcolor (1,0.5,0.5);
+draw axes(1,1) withcolor marine;
+draw cadre;
+fin;
+\end{exemple}
+
+\begin{description}
+\item[papiermillimetre] comme son nom l'indique... Les couleurs et les épaisseurs des traits sont stockées dans \verb+pm_coula+, \verb+pm_coulb+, \verb+pm_coulc+ et \verb+pm_epa+, \verb+pm_epb+, \verb+pm_epc+.
+\end{description}
+
+
+\begin{exemple}
+repere(-2.5,2.5,1cm,-2.5,2.5,1cm);
+setquad(-2,2,-2,2);
+draw papiermillimetre;
+draw axes(1,1);
+fin;
+\end{exemple}
+
+\begin{description}
+\item[papierpointe(x,y)] quadrillage formé de points avec un pas de \verb+x+ sur l'axe des abscisses et de \verb+y+ sur l'axe des ordonnées. La taille des points par défaut est \verb+2bp+.
+\end{description}
+
+
+\begin{exemple}
+repere(-3,3,0.8cm,-2.5,2.5,1cm);
+setquad(0,3,0,2.5);
+draw papierpointe(0.5,0.5);
+setquad(-3,0,-2.5,2.5);
+draw quadrillage(1,1) dashed
+ withdots withcolor magenta;
+draw axes(1,1);
+draw cadre;
+fin;
+\end{exemple}
+
+\subsection{Base}
+\begin{description}
+\item[base(O,i,j)] figure formée par le point d'intersection des axes et son nom (\verb+O+), ainsi que des deux vecteurs de la base et leurs noms (\verb+i+ et \verb+j+ surmontés d'une flèche). Si les noms sont de la forme \og lettre + nombre\fg, le nombre est affiché en indice.
+
+\item[basep(O,I,J)] figure formée par le point d'intersection des axes et son nom (\verb+O+), ainsi que des deux points qui définissent le repère.
+\end{description}
+
+
+\begin{exemple}
+repere(-1.5,3.5,0.8cm,-1,3,1cm);
+flecheaxe:=false;
+draw axesn(1,1);
+drawoptions(withcolor marine);
+draw base(O,i,j);
+interaxes(2,1);
+draw base(I,e1,e2);
+drawoptions();
+draw cadre;
+fin;
+\end{exemple}
+
+\begin{exemple}
+repere(-1,2.5,0.8cm,-1,2,1cm);
+flecheaxe:=false;
+draw axes(1,0);
+draw basep(O,I,J);
+draw cadre;
+fin;
+\end{exemple}
+
+\section{Points, vecteurs}
+
+\subsection{Points}
+\label{points}
+\begin{description}
+\item[\_c(x,y)] désigne le point (ou le vecteur) de coordonnées cartésiennes \verb+x+ et \verb+y+ dans le repère utilisateur.
+
+\item[pol(r,t)] désigne le point (ou le vecteur) de coordonnées $(r\cos t;r\sin t)$ dans le repère utilisateur.
+
+\item[pold(r,t)] même chose avec l'angle donné en degrés.
+\end{description}
+
+Les macros suivantes sont directement inspirées des macros similaires de \verb+geometriesyr16.mp+.
+
+
+\begin{description}
+\item[MarquePoint(A)] marque le point \verb+A+. Le style de marque est contrôlé par le paramètre \verb+marque_p+ qui peut prendre les valeurs \verb+"plein"+ (valeur par défaut), \verb+"creux"+ ou \verb+"croix"+. Une autre valeur que celles-ci ne produira aucune marque.
+
+\item[pointe(A,B,C...)] permet de marquer plusieurs points.
+
+\item[nomme.pos(A,nom)] marque le point et affiche son nom à la position \verb+pos+. \verb+nom+ peut être soit une chaîne de caractères, soit une expression du type \verb+btex ... etex+, soit une autre figure. Si \verb+nom+ est omis, le nom \verb+A+ est affiché. S'il s'agit d'un élément d'un tableau de points (\verb+A1+, \verb+A2+...), le nombre est affiché en indice.
+\end{description}
+
+
+\begin{exemple}[0.6]
+repere(-3,3,0.9cm,-2.5,5,0.9cm);
+pair A,B,C[],D,E,F;
+A=_c(1,1);B=_c(2,3);
+D=_c(-2,-1);E=_c(-1,-1);F=_c(-1,-2);
+draw axes(1,0);
+marque_p:="";drawoptions(withcolor magenta);
+nomme.llft(A);nomme.top(B);draw A--B;
+marque_p:="croix";drawoptions(withcolor rouge);
+pointe(D,E,F);
+marque_p:="creux";drawoptions(withcolor orange);
+nomme.bot(pol(sqrt(2),-pi/4),
+ LaTeX("$\sqrt{2}e^{-i\frac{\pi}{4}}$"));
+nomme.bot(_c(-1.5,1),LaTeX("$(-1,5;1)$"));
+marque_p:="plein";drawoptions(withcolor violet);
+for i=2 upto 4:
+ C[i]=_c(-3+i/2,i);nomme.lft(C[i]);
+endfor
+draw cadre;
+fin;
+\end{exemple}
+
+\subsection{Vecteurs}
+\begin{description}
+\item[vecteur.pos(A,u,nom)] figure formée du représentant du vecteur \verb+u+ d'origine \verb+A+ ainsi que de \verb+nom+ placé à la position \verb+pos+ par rapport au milieu de la flèche. Si \verb+nom+ est une chaine de caractère, il sera affiché avec une flèche. Si \verb+nom+ est omis, \verb+u+ surmonté d'une flèche est utilisé. S'il s'agit d'un élément d'un tableau de points (\verb+u1+, \verb+u2+...), le nombre est affiché en indice.
+\end{description}
+
+
+\begin{exemple}[0.6]
+repere(-1,5.5,0.7cm,-4,4,0.8cm);
+pair A,B,C[],u,v,w[];
+u=_c(2,2);v=_c(2,-1);
+A=_c(1,1);B=A+u;
+draw axes(1,0);
+draw base(O,i,j);
+drawoptions(withcolor cyan);
+nomme.llft(A);nomme.top(B);
+draw vecteur.ulft(A,u,"AB");
+draw vecteur.urt(B,v);
+draw vecteur.bot(A,u+v,%
+ LaTeX("$\vect{u}+\vect{v}$"));
+drawoptions(withcolor marine);
+for i=1 upto 3:
+ C[i]=_c(1,i-4);w[i]=_c(1.5,0.5*i-1);
+draw vecteur.bot(C[i],w[i]);
+endfor
+draw cadre;
+fin;
+\end{exemple}
+
+
+\section{Droites, courbes...}
+
+\subsection{Droites}
+\begin{description}
+\item[droite(A,B)] droite $(AB)$.
+
+\item[droite(a,b,c)] droite d'équation $ax+by+c=0$ dans le repère utilisateur.
+
+\item[droite(a,b)] droite d'équation $y=ax+b$ dans le repère utilisateur.
+
+\item[droite(c)] droite d'équation $x=c$ dans le repère utilisateur.
+\end{description}
+
+
+\begin{exemple}[0.65]
+repere(-2,3,1cm,-2,3,1cm);
+pair A,B;
+A=_c(-0.5,-1);B=_c(1.5,1.5);
+draw axes(1,0);
+nomme.ulft(A);
+nomme.lrt(B);
+drawoptions(withpen pencircle scaled 1);
+draw droite(A,B) withcolor olive;
+draw droite(1) withcolor vertfonce; %x=1
+draw droite(1/3,3/2) withcolor vertfonce; %y=(1/3)x+3/2
+draw droite(2,3,-1) withcolor vertfonce; %2x+3y-1=0
+fin;
+\end{exemple}
+
+\subsection{Courbes et fonctions}
+\MP{} permet de définir simplement des fonctions (en utilisant par exemple la syntaxe suivante :
+\verb|vardef f(expr x)=2x+1 enddef;|) et de définir des courbes passant par des points donnés (\verb+A..B..C+). Ces possibilités sont utilisées dans les macros qui suivent.
+
+\begin{description}
+\item[courbefonc(f,xmin,xmax,n) ou courbefonc(f)(xmin,xmax,n)] courbe représentant la fonction \verb+f+ entre \verb+xmin+ et \verb+xmax+ en utilisant \verb+n+ points d'interpolation.
+
+\item[courbepoints(f,xmin,xmax,n)] ne trace que les \verb+n+ points sans les relier. Les points sont dessinés en fonction de la valeur de \verb+marque_p+ (voir \ref{points}).
+
+\item[fonccourbe.p(x)] image de \verb+x+ par la fonction dont la courbe représentative est le chemin \verb+p+. La macro renvoie 0 si la fonction n'est pas définie.
+
+\item[nomme.pos(p,x,nom)] affiche \verb+nom+ au point d'abscisse \verb+x+ de la courbe \verb+p+ à la position \verb+pos+. \verb+nom+ peut être soit une chaîne de caractères, soit une expression du type \verb+btex ... etex+, soit une autre figure. Si \verb+nom+ est omis, le nom \verb+p+ est affiché. S'il s'agit d'un élément d'un tableau de points (\verb+p1+, \verb+p2+...), le nombre est affiché en indice.
+\end{description}
+
+
+\begin{exemple}[0.5]
+repere(-2,5,0.7cm,-3,3,0.7cm);
+vardef f(expr x)=-0.5(x**2)+2*x enddef;
+vardef g(expr x)=exp(x)/10-3 enddef;
+path C_f;
+draw axes(1,1);
+drawoptions(withcolor moutarde);
+C_f=courbefonc(f)(-2,5,50);
+draw C_f withpen pencircle scaled 1;
+nomme.llft(C_f,4.7);
+drawoptions(withcolor beige);
+draw courbepoints(g,0,4,9);
+fin;
+\end{exemple}
+
+\begin{description}
+\item[intercourbes(P,p,q)] stocke dans le tableau de points \verb+P+ les points d'intersection des chemins \verb+p+ et \verb+q+. \verb+P1+ est un des points d'intersection, \verb+P2+ un autre etc. Il faut, avant d'utiliser cette macro, déclarer le tableau \verb+P+ de la façon suivante : \verb+pair P[];+
+
+\item[ptantecedents(P,y,p)] stocke dans le tableau de points \verb+P+ les points du chemin \verb+p+ d'ordonnée \verb+y+. De même que précédemment, le tableau \verb+P+ doit être déclaré avant d'utiliser cette macro.
+
+\item[antecedents(X,y,p)] stocke dans le tableau de nombres \verb+X+ les antécédents de \verb+y+ par la fonction dont la courbe représentative est le chemin \verb+p+. De même que précédemment, le tableau \verb+X+ doit être déclaré avant d'utiliser cette macro.
+\end{description}
+
+
+\begin{exemple}
+repere(-2.5,4.5,1cm,-3.5,2.5,1cm);
+path p,C_f;
+pair I[],A[];
+vardef f(expr x)= x**2-2x enddef;
+p=_c(-2,-2).._c(-1,1).._c(0,2).._c(1,1)
+ .._c(2,-2).._c(3,-3).._c(3.5,-2.5)
+ .._c(4,-1);
+C_f=courbefonc(f,-2,4,40);
+draw axes(1,1);
+drawoptions(withpen pencircle scaled 1);
+draw p withcolor bleu;
+draw C_f withcolor rouge;
+intercourbes(I,C_f,p);
+drawoptions(withcolor violet);
+nomme.lft(I1);nomme.rt(I2);
+draw droite(0,-1.5) dashed evenly;
+ptantecedents(A,-1.5,p);
+nomme.lrt(A1);nomme.llft(A2);
+nomme.lrt(A3);
+fin;
+\end{exemple}
+
+\begin{description}
+\item[marquepointcourbe(p,x1,x2,...)] marque les points de la courbe \verb+p+ d'abscisses \verb+x1+, \verb+x2+... La marque dépend de la valeur de \verb+marque_p+.
+
+\item[marquepointchemin(p,n1,n2,...)] dans le cas d'un chemin défini par \verb+A..B..C..+, marque le \verb+n1+ème point, le \verb+n2+ième point... La marque dépend de la valeur de \verb+marque_p+. Attention, le premier point est numéroté 0.
+
+\end{description}
+
+
+
+\begin{exemple}
+repere(-2.5,4.5,1cm,-3.5,2.5,1cm);
+path p,C_f;
+pair I[],A[];
+vardef f(expr x)= x**2-2x enddef;
+p=_c(-2,-2).._c(-1,1).._c(0,2)
+ .._c(1,1).._c(2,-2).._c(3,-3)
+ .._c(3.5,-2.5).._c(4,-1);
+C_f=courbefonc(f,-2,4,40);
+draw axes(1,1);
+drawoptions(withpen pencircle scaled 1);
+draw p withcolor bleu;
+draw C_f withcolor rouge;
+drawoptions(withcolor violet);
+marquepointcourbe(C_f,-0.5,0.8,2.2,2.6);
+marquepointchemin(p,0,2,3,5);
+fin;
+\end{exemple}
+
+
+\subsection{Dérivée et tangentes}
+\begin{description}
+\item[der.p(x)] image de \verb+x+ par la dérivée de la fonction dont la courbe représentative est \verb+p+.
+%\item[der2.f(x)] image de \verb+x+ par la dérivée de la fonction \verb+f+.
+
+\item[tangente(p,x)] tangente à la courbe \verb+p+ au point d'abscisse \verb+x+.
+
+\item[tangente.gauche(p,x,long)] flèche de longueur \verb+long+ représentant la demi-tangente gauche à la courbe \verb+p+ au point d'abscisse \verb+x+. Le paramètre \verb+long+ est optionnel. Sa valeur par défaut est \verb+20bp+.
+
+\item[tangente.droite(p,x,long)] idem à droite.
+
+\item[tangente.double(p,x,long)] idem des deux côtés.
+\end{description}
+
+
+\begin{exemple}
+repere(-2.5,4.5,1cm,-3.5,2.5,1cm);
+path p,q;
+p=_c(-2,-2){dir 60}.._c(-1,1)
+ .._c(0,2){right}.._c(1,1).._c(2,-2)
+ .._c(3,-3){right}.._c(4,-2){(1,2)};
+q=courbefonc(der.p,-1,4,40);
+draw axes(1,1);
+drawoptions(withpen pencircle scaled 1);
+draw p withcolor bleu;
+nomme.rt(p,0.7,LaTeX("$y=f(x)$"));
+draw q withcolor rouge;
+nomme.lft(q,3.7,LaTeX("$y=f'(x)$"));
+drawoptions(withpen pencircle scaled 1
+ withcolor violet);
+draw tangente.double(p,0);
+draw tangente.droite(p,-2,40);
+draw tangente.gauche(p,4,30);
+draw tangente(p,2.5);
+fin;
+\end{exemple}
+
+
+
+\section{Suites}
+\begin{description}
+\item[suite(u,deb,fin)] figure formée des points $(i;u_i)$ pour $i$ variant entre \verb+deb+ et \verb+fin+.
+\end{description}
+
+
+\begin{exemple}
+repere(-0.9,7,0.8cm,-1.2,1.2,1.5cm);
+vardef u(expr n)=(-1)**n/n enddef;
+taillepoint:=4;
+draw axes(1,1);
+draw suite(u,1,6) withcolor vertfonce;
+fin;
+\end{exemple}
+
+\begin{description}
+\item[suiterec(f,deb,fin,init)] ligne brisée (\og escalier \fg{} ou \og escargot \fg) permettant de visualiser les termes de la suite définie par $u_{n+1}=f(u_n)$ de premier terme $u_{deb}=init$ et de dernier terme $u_{fin}$.
+
+\item[suiterecprojx.pos(lab,min,max)] figure formée des segments joignant les points $(u_n;u_n)$ et $(u_n;0)$ pour $n$ compris entre \verb+min+ et \verb+max+. La suite $u$ et sa valeur initiale sont définies par le dernier appel de la macro \verb+suiterec+. \verb+lab+ désigne l'étiquette au niveau de l'axe des abscisse placée à la position \verb+pos+. Si \verb+lab+ est la chaîne vide \verb+""+, rien n'est écrit ; si \verb+lab+ est une autre chaîne de caractère (par ex. \verb+"u"+), elle est utilisée comme nom de la suite (on obtiendra $u_0$, $u_1$...) ; si \verb+lab+ est un nombre, les valeurs de la suites seront affichées et arrondies à \verb+lab+ décimales. Les valeurs \verb+min+ et \verb+max+ sont facultatives et égales par défaut aux valeurs \verb+deb+ et \verb+fin+ passées à la macro \verb+suiterec+.
+
+\item[suiterecprojy.pos(lab,min,max)] même chose sur l'axe des ordonnées.
+
+\item[suiterecproj(lab,min,max)] même chose sur les deux axes. Les positions sont \verb+bot+ sur l'axe des abscisses et \verb+lft+ sur l'axe des ordonnées.
+
+
+\begin{exemple}[0.55]
+repere(-2,4.5,1cm,-1,4,1cm);
+vardef f(expr x)=sqrt(2*x+4) enddef;
+path C_f,sr;
+C_f=courbefonc(f,-2,5,50);
+sr=suiterec(f,0,3,-1.2);
+draw axes(1,0);
+drawoptions(withpen pencircle scaled 1);
+draw C_f withcolor bleu;
+draw droite(1,0);
+drawoptions(withcolor rouge);
+draw suiterecprojx.bot(1) dashed evenly;
+draw suiterecprojy.lft("") dashed evenly;
+draw sr withcolor rouge;
+fin;
+\end{exemple}
+
+\begin{exemple}
+repere(-0.5,5,1cm,-0.5,5,1cm);
+vardef f(expr x)=4-0.8*x enddef;
+path C_f,sr;
+C_f=courbefonc(f,-1,5,10);
+sr=suiterec(f,0,5,0.2);
+draw axes(1,0);
+drawoptions(withpen pencircle scaled 1);
+draw C_f withcolor bleu;
+draw droite(1,0);
+drawoptions(withcolor rouge);
+draw suiterecproj("u",1,3) dashed evenly;
+draw sr withcolor rouge;
+fin;
+\end{exemple}
+
+
+
+\end{description}
+
+
+
+
+\section{Surfaces}
+
+\subsection{Calcul intégral}
+\begin{description}
+\item[entrecourbes(p,q,xmin,xmax)] chemin fermé délimitant la zone comprise entre les courbes \verb+p+ et \verb+q+ et les droites d'équations $y=\verb+xmin+$ et $y=\verb+xmax+$. Il peut donc être dessiné, rempli...
+
+\item[souscourbe(p,xmin,xmax)] chemin fermé délimitant la zone comprise entre la courbe \verb+p+, l'axe des abscisses et les droites d'équations $y=\verb+xmin+$ et $y=\verb+xmax+$.
+\end{description}
+
+
+\begin{exemple}
+repere(-3.5,6,0.7cm,-2.5,4.5,0.7cm);
+vardef f(expr x)= -(x/4)**3+0.75x enddef;
+vardef g(expr x)= -((x-2)**2)/9+4 enddef;
+path C_f,C_g,p,q;
+C_f:=courbefonc(f,-3.5,6,40);
+C_g:=courbefonc(g,-3.5,6,40);
+p:=entrecourbes(C_f,C_g,-2,1);
+q:=souscourbe(C_f,3,5);
+fill p withcolor 0.5Violet;
+draw p withpen pencircle scaled 2
+ withcolor Violet;
+fill q withcolor 0.5Bleu;
+draw q dashed evenly withcolor Bleu;
+draw axes(1,1);
+drawoptions(withpen pencircle scaled 1);
+draw C_f withcolor Bleu;
+draw C_g withcolor Rouge;
+draw cadre;
+fin;
+\end{exemple}
+
+\begin{description}
+\item[rectangles.type(p,a,b,n)] figure formée de \verb+n+ rectangles s'appuyant sur la courbe \verb+p+ entre les abscisses \verb+a+ et \verb+b+. \verb+type+ peut être \verb+min+, \verb+max+, \verb+droite+ ou \verb+gauche+.
+\end{description}
+
+
+\begin{exemple}
+repere(-2.5,6,0.8cm,-2,5,0.8cm);
+vardef f(expr x)=
+ -((x-2)**4)/32+((x-2)**2)/2+1
+enddef;
+path Cf,r[];
+Cf=courbefonc(f,-2.5,6.5,50);
+r1=rectangles.max(Cf,2,5.5,8);
+r2=rectangles.min(Cf,2,5.5,8);
+r3=rectangles.droite(Cf,-2,1,10);
+fill r1 withcolor 0.8Rouge;
+fill r2 withcolor 0.4Rouge;
+fill r3 withcolor 0.5Bleu;
+draw r1;draw r2 withcolor 0.8Rouge;
+draw r3;
+draw axes(1,0);
+draw Cf withcolor Bleu
+ withpen pencircle scaled 1;
+fin;
+\end{exemple}
+
+\subsection{Demi-plans}
+\begin{description}
+ \item[demiplaninf(d)] chemin fermé délimité par la droite \verb+d+ et par la partie inférieure de \verb+cadre+ (ou la partie gauche si \verb+d+ est parallèle à l'axe des ordonnées.
+ \item[demiplansup(d)] chemin fermé délimité par la droite \verb+d+ et par la partie supérieure de \verb+cadre+ (ou la partie droite si \verb+d+ est parallèle à l'axe des ordonnées.
+\end{description}
+
+
+\begin{exemple}
+repere(-2.5,3.5,1cm,-2.5,3.5,1cm);
+numeric qqw;qqw=6;
+path d[],dp[];
+d1=droite(2);
+d2=droite(1,1);
+d3=droite(-0.5,-0.5);
+dp1=demiplansup(d1);
+dp2=demiplansup(d2);
+dp3=demiplaninf(d3);
+for i=1 upto 3:
+fill dp[i] withcolor 0.7Lime;
+endfor
+draw axes(1,1);
+drawoptions(withpen pencircle scaled 1
+ withcolor Vertfonce);
+draw d1;draw d2;
+draw d3 dashed evenly;
+drawoptions();
+draw cadre;
+fin;
+\end{exemple}
+
+\subsection{Remplissage}
+Pour remplir des chemins fermés avec autre chose que de la couleur, \verb+repere+ permet l'utilisation de la syntaxe \verb+fill p avec motif+ où \verb+motif+ est un des motifs décrits ci-dessous. Cette instruction peut être complétée par des options de dessin (\verb+withpen+, \verb+withcolor+...).
+
+\begin{description}
+\item[hachures(pas,angle)] hachures espacées de \verb+pas+ et formant un angle en degrés de \verb+angle+ avec l'horizontale. Si les valeurs sont omises, \verb|pas| vaut 5 et \verb+angle+ vaut 60.
+
+
+\item[briques(larg,haut,dec)] briques de largeur \verb+larg+, de hauteur \verb+haut+ et décalées d'une ligne à l'autre de \verb+dec+. Si les valeurs sont omises, \verb|larg| vaut 12, \verb|haut| vaut 6 et \verb+dec+ vaut 6.
+
+
+\item[vagues(per,amp,dec)] (d'après le manuel de l'utilisateur) \og vagues \fg{} de période \verb+per+, d'amplitude \verb+amp+ et décalées d'une ligne à l'autre de \verb+dec+. Si les valeurs sont omises, \verb|per| vaut 20, \verb|amp| vaut 3 et \verb+dec+ vaut 10.
+\end{description}
+
+
+
+\begin{exemple}[0.55]
+repere(-1.5,4.5,1cm,-1.5,7.5,1cm);
+path c[];picture lab;numeric u;u:=3cm;
+c1=fullcircle scaled 2.5cm;
+for k=1 upto 6:
+ i:=(k-1) mod 2;j:=(k-1) div 2;
+ c[k]:=c1 shifted (u*i,u*j);
+endfor;
+fill c1 withcolor lime;
+fill c1 avec hachures(10,30) dashed evenly;
+fill c2 withcolor lime;
+fill c2 avec hachures();
+fill c3 withcolor (0,0.65,0.8,0.48);
+fill c3 avec briques(15,5,4);
+fill c4 withcolor (0,0.65,0.8,0.48);
+fill c4 avec briques();
+fill c5 withcolor (1,0,0,0.2);
+fill c5 avec vagues(30,10,20)
+ withpen pencircle scaled 2;
+fill c6 withcolor (1,0,0,0.2);
+fill c6 avec vagues();
+for k=1 upto 6:
+ i:=(k-1) mod 2;j:=(k-1) div 2;
+ draw c[k];
+ lab:=thelabel("c"&decimal(k),u*(i,j));
+ unfill bbox lab;draw lab;
+endfor;
+fin;
+\end{exemple}
+
+
+
+\section{Projections sur les axes}
+
+\subsection{Projetés}
+\begin{description}
+\item[projetex(A)] projeté de \verb+A+ sur l'axe des abscisses parallèlement à l'axe des ordonnées.
+
+\item[projetey(A)] projeté de \verb+A+ sur l'axe des ordonnées parallèlement à l'axe des abscisses.
+
+\item[projectionx.pos(A,lab,dec)] figure constituée du segment joignant \verb+A+ à son projeté sur l'axe des abscisses ainsi que de l'étiquette \verb+lab+ placée à la position \verb+pos+ par rapport à ce projeté. La valeur \verb+dec+ indique un décalage par rapport à l'axe des abscisses. L'étiquette et le décalage sont optionnels.
+
+\item[projectiony.pos(A,lab,dec)] même chose sur l'axe des ordonnées.
+
+\item[projectionaxes(A,labx,laby,dec)] figure constituée des segments joignant \verb+A+ à ses projetés sur les axes ainsi que des étiquettes \verb+labx+ et \verb+laby+ positionnées automatiquement avec un décalage \verb+dec+ par rapport aux axes. Les étiquettes et le décalage sont optionnels.
+\end{description}
+
+
+
+\begin{exemple}[0.6]
+repere(-1.5,3.5,1cm,-2.2,2.5,1cm);
+path Cf; pair A[];
+vardef f(expr x)= x**2-2x-0.5 enddef;
+Cf=courbefonc(f,-2,4,40);
+ptantecedents(A,2,Cf);
+draw axes(1,1);
+draw Cf withpen pencircle scaled 1 withcolor bleu;
+drawoptions(dashed evenly withcolor rouge);
+draw projectionaxes(_c(1.3,f(1.3)),
+ LaTeX("$x$"),LaTeX("$f(x)$"));
+draw projectionx.urt(A1,LaTeX("$x_1$"));
+draw projectionx.llft(A2,LaTeX("$x_2$"),-6);
+draw A1--A2;
+fin;
+\end{exemple}
+
+\subsection{Intervalles}
+\begin{description}
+\item[intervallex.bornes(a,b)] intervalle dessiné sur l'axe des abscisses entre \verb+a+ et \verb+b+ avec une épaisseur par défaut de \verb+1.5bp+. \verb+bornes+ peut être \verb+OO+ (ouvert à gauche, ouvert à droite), \verb+OF+, \verb+FO+ ou \verb+FF+.
+
+\item[intervalley.bornes(a,b)] même chose sur l'axe des ordonnées.
+\end{description}
+
+
+\begin{exemple}[0.6]
+repere(-1,5,0.9cm,-1,4.5,1cm);
+vardef f(expr x)=x**2-5x+7 enddef;
+draw axes(1,1);
+draw courbefonc(f,-1,5,50)
+ withpen pencircle scaled 1 withcolor bleu;
+drawoptions(dashed evenly withcolor rouge);
+draw projectionx.bot(_c(1,f(1)));
+draw projectiony.llft(_c(2.5,f(2.5)),"0,75");
+draw projectionaxes(_c(4,f(4)));
+drawoptions(withcolor violet);
+draw intervallex.OF(1,4);
+draw intervalley.FF(0.75,3);
+label(LaTeX("$f(]1;4])=[0,75;3]$"),_c(2.5,4));
+draw cadre;
+fin;
+\end{exemple}
+
+
+
+\section{Statistiques}
+
+\subsection{Boite à moustache}
+\begin{description}
+\item[boitemoustache(min,Q1,Me,Q3,max,dec,larg)] \og Boite à moustache \fg{} correspondant aux données en argument. Elle est située à un distance \verb|dec| de l'axe des abscisses et le rectangle a une largeur de \verb|larg|. Ces deux dernières valeurs sont optionnelles et valent par défaut \SI{1,5}{cm} et \SI{1}{cm}.
+
+\item[projboitemoustache(t)] Figure formée des lignes joignant les cinq valeurs du dernier diagramme en boite dessiné à son projeté sur l'axe des abscisses ainsi que de certaines étiquettes : Si \verb|t| est vide, les textes $X_{min}$, $Q_1$, $M_e$, $Q_3$ et $X_{max}$ sont affichés ; si \verb|t| est un entier, les valeurs arrondies à $10^{-t}$ sont affichées ; si \verb|t| est une liste de cinq textes (ou valeurs), ceux-ci sont affichés.
+\end{description}
+
+
+\begin{exemple}
+repere(-0.5,10,0.7cm,-1,5,0.7cm);
+ setaxes(0,10,0,1);
+ draw axex(1,0);
+ draw boitemoustache(1,4,5,7,9)
+ withcolor marine;
+ draw projboitemoustache.bot()
+ withcolor 0.7rouge dashed evenly;
+fin;
+\end{exemple}
+
+\begin{exemplev}[1]{1}
+repere(-1,11,0.8cm,-1,5,0.7cm);
+ settout(-0.5,10.5,0,1);
+ draw axex(1,0);
+ drawoptions(withcolor rouge);
+ draw boitemoustache(1.22,3.9,5,7.18,9.05,1cm,0.7cm);
+ draw projboitemoustache.bot(1) dashed evenly;
+ drawoptions(withcolor blue);
+ draw boitemoustache(0,3.14,6,8,10,2cm,0.7cm);
+ draw projboitemoustache.bot(0.00456,"$\pi$","$\num{2x3}$","$x$","Max")
+ dashed evenly;
+fin;
+\end{exemplev}
+
+\section{Divers}
+\subsection{Composition des étiquettes}
+Tous les textes et étiquettes peuvent être composés en utilisant la macro ci-dessous. Cette macro utilise \verb+latexmp+ si ce fichier est chargé ou l'écriture dans un fichier externe (adaptation de la macro \verb+TEX+) dans le cas contraire.
+\begin{description}
+ \item[LaTeX(ch)] \label{latex} Figure formée de la chaîne \verb+ch+ composée avec \LaTeX. Il est donc possible d'utiliser la macro \verb|decimal()| de \MP.
+\end{description}
+
+
+\begin{exemple}[0.65]
+repere(-1,7,1cm,-1,1,1cm);
+for i=2 upto 6:
+label(LaTeX("$\frac{1}{"&decimal(i)&"}$"),(i*cm,0));
+endfor
+fin;
+\end{exemple}
+
+
+\subsection{Couleurs}
+Certaines couleurs sont définies par leur nom et peuvent être utilisées directement :
+
+\begin{center}
+\begin{figreperedoc}
+repere(0,18,1cm,-3,1,1cm);
+ path rectangle;
+ save a,b,dech,decv;
+ a:=25;b:=12;dech:=70;decv:=-20;
+ rectangle = (0,0)--(a,0)--(a,b)--(0,b)--cycle;
+ vardef couleur(expr t)=
+ image(%
+ fill rectangle withcolor scantokens(t);
+ label.rt(LaTeX("\smash{" & t & "}"),(a,b/4))
+ )
+ enddef;
+ draw couleur("rouge");
+ draw couleur("vert") shifted (dech,0);
+ draw couleur("bleu") shifted (2*dech,0);
+ draw couleur("cyan") shifted (3*dech,0);
+ draw couleur("magenta") shifted (4*dech,0);
+ draw couleur("jaune") shifted (5*dech,0);
+ draw couleur("noir") shifted (6*dech,0);
+ draw couleur("marron") shifted (0,decv);
+ draw couleur("lime") shifted (dech,decv);
+ draw couleur("orange") shifted (2*dech,decv);
+ draw couleur("rose") shifted (3*dech,decv);
+ draw couleur("pourpre") shifted (4*dech,decv);
+ draw couleur("olive") shifted (5*dech,decv);
+ draw couleur("violet") shifted (6*dech,decv);
+ draw couleur("beige") shifted (0,2decv);
+ draw couleur("marine") shifted (dech,2decv);
+ draw couleur("moutarde") shifted (2*dech,2decv);
+ draw couleur("grisclair") shifted (3*dech,2decv);
+ draw couleur("gris") shifted (4*dech,2decv);
+ draw couleur("grisfonce") shifted (5*dech,2decv);
+ draw couleur("vertfonce") shifted (6*dech,2decv);
+fin;
+\end{figreperedoc}
+\end{center}
+
+Toutes ces couleurs sont définies selon le modèle \og rgb \fg. Pour les obtenir selon le modèle \og cmyk \fg, remplacer la première lettre par une majuscule.
+
+\subsection{Figures pour une présentation}
+\begin{description}
+\item[figureinter] exporte la figure telle qu'elle est au moment où cette commande apparait. La numérotation est incrémentée et la figure peut continuer.
+\end{description}
+ L'exemple ci-dessous crée trois figures :
+
+ \begin{exemplefiginter}[0.7]{3}
+ repere(-3,3,0.7cm,-1,5,0.7cm);
+ path C_f;
+ vardef f(expr x)=x**2 enddef;
+ C_f=courbefonc(f,-3,3,50);
+ draw quadrillage(1,1);
+ draw axes(1,1);
+ draw cadre;
+ figureinter;
+ draw courbepoints(f,-2,2,9) withcolor rouge;
+ figureinter;
+ draw C_f withcolor bleu withpen pencircle scaled 1;
+ fin;
+ \end{exemplefiginter}
+
+
+Si ces trois figures s'appellent \verb|mafigure.1|, \verb|mafigure.2| et \verb|mafigure.3|, elles peuvent être incluses dans un document de la classe \verb|beamer| avec le code ci-dessous :
+
+\begin{center}
+\begin{minipage}{0.6\linewidth}
+\begin{lstlisting}[frame=single,frameround=tttt,backgroundcolor=\color{LightSteelBlue},language={[LaTeX]TeX}]
+\documentclass{beamer}
+ \ifpdf % Pour utiliser pdflatex
+ \DeclareGraphicsRule{*}{mps}{*}{}
+ \fi
+\begin{document}
+\begin{frame}
+\includegraphics<+>{mafigure.1}%
+\includegraphics<+>{mafigure.2}%
+\includegraphics<+>{mafigure.3}%
+\end{frame}
+\end{document}
+\end{lstlisting}
+\end{minipage}
+\end{center}
+
+\subsection{Code embarqué dans un document \LaTeX}
+
+Certains packages permettent d'écrire du code \MP{} directement dans un document \LaTeX. \verb|repere| est compatible avec, entre autres, \verb|emp| et \verb|mpgraphics|.
+
+\medskip
+
+\begin{minipage}[t]{0.45\linewidth}
+{\centering \textbf{Utilisation du package \texttt{emp}}\par}
+
+
+
+\verb|pdflatex monfichier.tex|
+
+\verb|mpost monfichier.mp|
+
+\verb|mpost monfichier.mp|
+
+\verb|pdflatex monfichier.tex|
+
+
+\begin{lstlisting}[frame=single,frameround=tttt,backgroundcolor=\color{LightSteelBlue},language={[LaTeX]TeX}]
+\documentclass{article}
+\usepackage{emp}
+\usepackage{ifpdf}
+ \ifpdf % Pour utiliser pdflatex
+ \DeclareGraphicsRule{*}{mps}{*}{}
+ \fi
+\begin{document}
+\begin{empfile}
+\begin{empcmds}
+ input latexmp;
+ input repere;
+\end{empcmds}
+\begin{emp}(0,0)
+ repere(-3,3,0.8cm,-2.5,2.5,1cm);
+ draw axes(1,1);
+ fin;
+\end{emp}
+\end{empfile}
+\end{document}
+\end{lstlisting}
+\end{minipage}
+\hfill
+\begin{minipage}[t]{0.45\linewidth}
+{\centering \textbf{Utilisation du package \texttt{mpgraphics}}\par}
+
+
+\verb|pdflatex -shell-escape monfichier.tex|
+
+\begin{lstlisting}[frame=single,frameround=tttt,backgroundcolor=\color{LightSteelBlue},language={[LaTeX]TeX}]
+\documentclass{article}
+\usepackage[runs=2]{mpgraphics}
+\begin{document}
+\begin{mpdefs}
+ input latexmp;
+ input repere;
+\end{mpdefs}
+\begin{mpdisplay}
+ repere(-3,3,0.8cm,-2.5,2.5,1cm);
+ draw axes(1,1);
+ fin;
+\end{mpdisplay}
+\end{document}
+\end{lstlisting}
+\end{minipage}
+
+
+\section{Exemples d'utilisation simultanée de \texttt{repere} et \texttt{geometriesyr}}
+
+\label{exgeom}Il est possible, dans une figure créée avec \verb+repere+, d'utiliser certaines macros de \verb+geometriesyr+. Il faut alors charger \verb+geometriesyr+ \emph{avant} \verb|repere|.
+
+\begin{exemple}[0.6]
+repere(-1,10,0.5cm,-1,9,0.5cm);
+pair A,B,C,A',B',C',u;
+A=_c(3,1);B=_c(5,2);C=_c(1,5);u=_c(3,3);
+A'-A=B'-B=C'-C=u;
+draw projectionaxes(A,LaTeX("$x_A$"),
+ LaTeX("$y_A$")) dashed evenly;
+draw axes(0,0);
+drawoptions(withcolor pourpre);
+draw triangle(A,B,C);draw triangle(A',B',C');
+draw codeperp(B,A,C,7);draw codeperp(B',A',C',7);
+draw codesegments(B,C,B',C',2);
+nomme.llft(A);nomme.lrt(B);nomme.ulft(C);
+nomme.llft(A');nomme.lrt(B');nomme.ulft(C');
+drawoptions(withcolor vertfonce);
+draw vecteur.lrt(B,u);draw vecteur.lrt(C,u);
+fin;
+\end{exemple}%
+
+\vspace{2em}
+
+
+\begin{exemplev}[1]{2}
+repere(-9.5,6,1cm,-1.25,1.25,2cm);
+%cercle
+pair O,A,A',B,B',M,S,C;
+numeric x;x=pi/4;
+O=_c(-7,0);A=_c(-5,0);
+B=_c(-7,1);A+A'=B+B'=2O;
+M=rotation(A,O,180*x/pi);
+C=projection(M,A,A');
+S=projection(M,B,B');
+draw cerclepoint(O,A);
+drawarrow A'--A;drawarrow B'--B;
+nomme.rt(A);nomme.top(B);nomme.llft(O);
+drawoptions(withcolor rouge);
+draw O--M;draw C--M--S dashed evenly;
+draw codeperp(M,C,O,5);
+draw codeperp(O,S,M,5);
+draw codeangle.urt(A,O,M,0,
+ LaTeX("$x$"));
+marque_p:="";
+nomme.urt(M);
+label.lft(LaTeX("$\sin x$"),S);
+%repere
+settout(-4.5,6,-1.25,1.25);
+path C_f;
+C_f=courbefonc(sin,-4.5,6,80);
+pair m;m=_c(x,sin(x));
+drawoptions();
+draw axexpi.bot(1,2);
+draw axey(0.5,1);
+drawoptions(withcolor bleu);
+draw C_f withpen pencircle scaled 1.5;
+nomme.urt(C_f,2.5,LaTeX("$y=\sin x$"));
+drawoptions(withcolor rouge);
+draw projectionx.bot(m,LaTeX("$x$"))
+ dashed evenly;
+%
+draw M--m dashed evenly;
+fin;
+\end{exemplev}
+
+\vspace{3em}
+
+\begin{exemple}
+repere(-0.5,5,1cm,-0.5,5,1cm);
+coulpoint:=blue;coullabel:=blue;
+pair A,B,C,D;
+A=_c(0.5,0.5);B=_c(4,1);C=_c(3,4);
+typetrace:="mainlevee";
+draw axes(1,1);
+drawoptions(withcolor violet);
+draw triangle(A,B,C);
+nomme.llft(A);nomme.lrt(B);
+nomme.top(C);
+draw marqueangle(B,A,C,0);
+drawoptions(withcolor vertfonce);
+draw cercles(CentreCercleC(A,B,C),A);
+fin;
+\end{exemple}
+
+
+
+
+
+\begin{codecache}
+end
+\end{codecache}
+
+\makeatletter
+\immediate\closeout\verbatim@out
+\makeatother
+%\addtocontents{toc}{\protect\end{multicols}}
+\end{document}
+
+
diff --git a/Master/texmf-dist/metapost/repere/repere.mp b/Master/texmf-dist/metapost/repere/repere.mp
new file mode 100644
index 00000000000..1d8b70c73a5
--- /dev/null
+++ b/Master/texmf-dist/metapost/repere/repere.mp
@@ -0,0 +1,1944 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% repere.mp %%
+%% Macros pour la construction de figures dans un repère %%
+%% o.peault@gmail.com %%
+%% Version 13.12 (Décembre 2013) %%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% This work may be distributed and/or modified under the conditions of
+% the LaTeX Project Public License, either version 1.3 of this license
+% or (at your option) any later version. The latest version of this
+% license is in http://www.latex-project.org/lppl.txt
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+input format;
+
+warningcheck:=0;
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%% REPERE %%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+numeric _nfig,_nbaxes,theta,taillegrad,taillepoint,taillecroix,facteurx,facteury;
+boolean flecheaxe,displayfrac,coupe;
+_nfig:=1;
+path cadre;
+numeric _diag,_largcadre,_hautcadre,_tfig;
+pair _O,_I,_J;
+transform _T;
+picture _axorlab; pair poslabO;
+
+string marque_p,fraction;
+
+facteury:=1;
+
+boolean rep_groupe;
+rep_groupe:=false;
+
+
+let oldbeginfig=beginfig;
+let oldendfig=endfig;
+
+def beginfig(expr c)=
+ oldbeginfig(c);
+ _nfig:=c;
+ rep_groupe:=true
+enddef;
+
+def endfig=
+ oldendfig;
+ _nfig:=_nfig+1;
+ rep_groupe:=false
+enddef;
+
+vardef repere@#(text t)=
+ if (str @#="") or (str @#="larg") or (str @#="orth") or (str @#="prop"):
+% _nfig:=_nfig+1;definitionrepere@#(t)
+ definitionrepere@#(t)
+ else:
+ reperenum@#(t)
+ fi
+enddef;
+
+
+vardef reperenum[]@#(text t)=
+ _nfig:=@;
+ definitionrepere@#(t)
+enddef;
+
+boolean bf;
+bf:=false;
+
+vardef definitionrepere@#(text t) =
+ save i,_def;
+ if not rep_groupe: oldbeginfig(_nfig);bf:=true fi;
+ numeric _def[],i,unitex,unitey,unite;
+ _def[7]:=90;i:=1;
+ for _i=t: _def[i]:=_i; i:=i+1; endfor;
+ Xmin:=_def1; Xmax:=_def2; Ymin:=_def4; Ymax:=_def5; theta:=_def7;
+ if str @#="larg": _def3:=(_def3-_def6*cosd(theta)/sind(theta))/(Xmax-Xmin);_def6:=_def6/((Ymax-Ymin)*sind(theta))
+ elseif str @#="orth": _def3:=_def3/(Xmax-Xmin); _def6:=_def3;theta:=90
+ elseif str @#="prop": _def3:=_def3/(Xmax-Xmin); _def6:=_def6*_def3;theta:=90
+ fi;
+ Ux:=_def3;Uy:=_def6;
+ _T:=identity xscaled Ux yscaled Uy slanted cosd(theta) yscaled sind(theta);
+ _defcadre;
+ settout(Xmin,Xmax,Ymin,Ymax);
+ _O:=_c(0,0); xO:=0 ; yO:=0;
+ _I:=_c(1,0); _J:=_c(0,1);
+ taillegrad:=0.8mm;taillepoint:=3;taillecroix:=1mm;_nbaxes:=0;_axorlab:=nullpicture;poslabO:=(0,0);
+ marque_p := "plein";displayfrac:=false;flecheaxe:=true;coupe:=true;
+ defaultscale:=1;
+ unitex:=abs(_I);unitey:=abs(_J);unite:=unitex;
+ facteurx:=1;facteury:=1;
+ string extranumx,extranumy;
+ extranumx=extranumy="";
+enddef;
+
+def setaxes(expr a,b,c,d)=
+ AxeXmin:=a;AxeXmax:=b;AxeYmin:=c;AxeYmax:=d
+enddef;
+
+def setgrad(expr a,b,c,d)=
+ GradXmin:=a;GradXmax:=b;GradYmin:=c;GradYmax:=d
+enddef;
+
+def setval(expr a,b,c,d)=
+ ValXmin:=a;ValXmax:=b;ValYmin:=c;ValYmax:=d
+enddef;
+
+def setquad(expr a,b,c,d)=
+ QuadXmin:=a;QuadXmax:=b;QuadYmin:=c;QuadYmax:=d
+enddef;
+
+def settout(expr a,b,c,d)=
+ setaxes(a,b,c,d);
+ setgrad(a,b,c,d);
+ setval(a,b,c,d);
+ setquad(a,b,c,d);
+enddef;
+
+let setall=settout;
+
+def fin =
+ if _nbaxes=1: draw _axorlab fi;
+ if coupe: clip currentpicture to cadre fi;
+ if bf: oldendfig; bf:=false;_nfig:=_nfig+1 fi;
+enddef;
+
+def _defcadre=
+ cadre:=_c(Xmin,Ymin)--_c(Xmin,Ymax)--_c(Xmax,Ymax)--_c(Xmax,Ymin)--cycle;
+ _diag:=abs(llcorner cadre - urcorner cadre);
+ _largcadre:=abs(llcorner cadre - lrcorner cadre);
+ _hautcadre:=abs(llcorner cadre - ulcorner cadre);
+ _tfig:=max(_largcadre,_hautcadre); % compatibilité geometriesyr
+enddef;
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%% ORIGINE %%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+def interaxes(expr a,b) =
+ _O:=_c(a,b);
+ xO:=a;
+ yO:=b;
+enddef;
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%% AXES %%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+pair _posgradx, _posgradx.lft, _posgradx.rt, _posgradx.ulft, _posgradx.top, _posgradx.urt, _posgradx.llft, _posgradx.bot, _posgradx.lrt;
+_posgradx=_posgradx.bot=_posgradx.lft=_posgradx.rt=-_posgradx.top=(0,-1);
+-_posgradx.llft=_posgradx.urt=(0.5,0.5);_posgradx.lrt=-_posgradx.ulft=(0.5,-0.5);
+
+
+pair _posgrady, _posgrady.lft, _posgrady.rt, _posgrady.ulft, _posgrady.top, _posgrady.urt, _posgrady.llft, _posgrady.bot, _posgrady.lrt;
+_posgrady=_posgrady.bot=_posgrady.lft=_posgrady.top=-_posgrady.rt=(-1,0);
+-_posgrady.llft=_posgrady.urt=(0.5,0.5);_posgrady.lrt=-_posgrady.ulft=(0.5,-0.5);
+
+vardef _etiqx_@#(expr ab,dec,st)= %étiquettes axe des abscisses
+ save pic;
+ picture pic;
+ if numeric st: pic:=LaTeX("$\num{" & decimal(st) & extranumx & "}$")
+ elseif string st: pic:=LaTeX(st)
+ else: pic:=st fi;
+ thelabel.@#(pic,_c(ab,yO) shifted (dec*_posgradx@#))
+enddef;
+
+vardef _etiqy_@#(expr ro,dec,st)= %étiquettes axe des ordonnées
+ save pic;
+ picture pic;
+ if numeric st: pic:=LaTeX("$\num{" & decimal(st) & extranumy & "}$")
+ elseif string st: pic:=LaTeX(st)
+ else: pic:=st fi;
+ thelabel.@#(pic,_c(xO,ro) shifted (dec*_posgrady@#))
+enddef;
+
+
+vardef graduationx(expr x)= %%%%%%% graduation axe des abscisses
+ ((0,taillegrad)--(0,-taillegrad)) rotated (theta-90) shifted _c(x,yO)
+enddef;
+
+
+vardef graduationy(expr y)= %%%%%%% graduation axe des ordonnées
+ ((taillegrad,0)--(-taillegrad,0)) shifted _c(xO,y)
+enddef;
+
+vardef etiquettex@#(expr x)=
+ _etiqx_@#(x,taillegrad,x*facteurx)
+enddef;
+
+
+vardef etiquettey@#(expr y)=
+ _etiqy_@#(y,taillegrad,y*facteury)
+enddef;
+
+
+vardef dessinaxex=_c(AxeXmin,yO)--_c(AxeXmax,yO) enddef;
+
+vardef dessinaxey=_c(xO,AxeYmin)--_c(xO,AxeYmax) enddef;
+
+
+vardef graduationsaxex(expr grad)= %%%% ensemble des graduations abscisses
+ save $;picture $;
+ $=image(%
+ imax:=floor((GradXmax-xO)/grad);imin:=ceiling((GradXmin-xO)/grad);
+ for i=imin upto imax-1:
+ draw graduationx(arrondimil(i*grad)+xO) withpen pencircle scaled 0.5bp;
+ endfor
+ % dernière graduation
+ if AxeXmax*Ux-(imax*grad+xO)*Ux>ahlength: draw graduationx(arrondimil(imax*grad)+xO) withpen pencircle scaled 0.5bp fi);
+ $
+enddef;
+
+vardef graduationsaxey(expr grad)= %%%% ensemble des graduations ordonnées
+ save $;picture $;
+ $=image(%
+ imax:=floor((GradYmax-yO)/grad);imin:=ceiling((GradYmin-yO)/grad);
+ for i=imin upto imax-1:
+ draw graduationy(arrondimil(i*grad)+yO) withpen pencircle scaled 0.5bp;
+ endfor;
+ % dernière graduation
+ if AxeYmax*Uy-(imax*grad+yO)*Uy>ahlength: draw graduationy(arrondimil(imax*grad)+yO) withpen pencircle scaled 0.5bp fi);
+ $
+enddef;
+
+
+vardef etiquettesaxex@#(expr val)= %%% ensemble des étiquettes abscisses
+ save $,imin,imax,labmin,labmax;
+ picture $,labmin,labmax;
+ numeric imin,imax;
+ $=image(%
+ imin:=ceiling((ValXmin-xO)/val);imax:=floor((ValXmax-xO)/val);
+ % définition première étiquette
+ if (imin<>0):
+ labmin:= etiquettex.@#(arrondimil(imin*val)+xO)
+ else: labmin:=nullpicture
+ fi;
+ % définition dernière étiquette
+ if (imax<>0):
+ labmax:= etiquettex.@#(arrondimil(imax*val)+xO)
+ else: labmax:=nullpicture
+ fi;
+ % tracé première étiquette
+ if xpart ((ulcorner labmin) transformed inverse _T)>=Xmin: draw labmin fi;
+ % tracé autres étiquettes
+ for i=imin+1 upto imax-1:
+ if (i<>0):
+ draw etiquettex.@#(arrondimil(i*val)+xO)
+ fi;
+ endfor;
+ % tracé dernière étiquette
+ if xpart ((lrcorner labmax) transformed inverse _T)<=Xmax: draw labmax fi;
+ );
+ $
+enddef;
+
+vardef etiquettesaxey@#(expr val)= %%% ensemble des étiquettes ordonnées
+ save $,imin,imax,labmin,labmax;
+ picture $,labmin,labmax;
+ numeric imin,imax;
+ $=image(%
+ imin:=ceiling((ValYmin-yO)/val);imax:=floor((ValYmax-yO)/val);
+ % définition première étiquette
+ if (imin<>0):
+ labmin:= etiquettey.@#(arrondimil(imin*val)+yO)
+ else: labmin:=nullpicture
+ fi;
+ % définition dernière étiquette
+ if (imax<>0):
+ labmax:= etiquettey.@#(arrondimil(imax*val)+yO)
+ else: labmax:=nullpicture
+ fi;
+ % tracé première étiquette
+ if ypart (llcorner labmin) >=ypart _c(Xmin,Ymin): draw labmin fi;
+ % tracé autres étiquettes
+ for i=imin+1 upto imax-1:
+ if (i<>0):
+ draw etiquettey.@#(arrondimil(i*val)+yO)
+ fi;
+ endfor;
+ % tracé dernière étiquette
+ if ypart (ulcorner labmax) <=ypart _c(Xmax,Ymax): draw labmax fi
+ );
+ $
+enddef;
+
+vardef _axex_@#(expr grad,val,nn)=
+ save $;
+ picture $;
+ $=image(
+ % axe
+ if flecheaxe: drawarrow else: draw fi dessinaxex;
+ % graduations
+ if grad>0: draw graduationsaxex(grad) fi;
+ % étiquettes
+ if val>0:
+ if nn=1:
+ if str @#<>"":
+ draw etiquettesaxex@#(val);
+ _axorlab:=etiquettex@#(xO)
+ else:
+ draw etiquettesaxex.bot(val);
+ _axorlab:=etiquettex.bot(xO)
+ fi;
+ poslabO:=poslabO + unitvector(0,ypart _posgradx@#);
+ if xO<>yO:
+ draw _axorlab
+ elseif _nbaxes=2:
+ draw _etiqx_(xO,0,xO) shifted (0.7*abs(llcorner _axorlab - urcorner _axorlab)*poslabO)
+ fi
+ elseif nn=2:
+ if str @#<>"":
+ draw etiquettesaxex@#(val);
+ draw etiquettex@#(xO)
+ else:
+ draw etiquettesaxex.bot(val);
+ draw etiquettex.bot(xO)
+ fi
+ else:
+ if str @#<>"":
+ draw etiquettesaxex@#(val)
+ else:
+ draw etiquettesaxex.bot(val)
+ fi
+ fi
+ fi
+ );
+ $
+enddef;
+
+vardef _axey_@#(expr grad,val,nn)=
+ save $;
+ picture $;
+ $=image(
+ % axe
+ if flecheaxe: drawarrow else: draw fi dessinaxey;
+ % graduations
+ if grad>0: draw graduationsaxey(grad) fi;
+ % étiquettes
+ if val>0:
+ if nn=1:
+ if str @#<>"":
+ draw etiquettesaxey@#(val);
+ _axorlab:=etiquettey@#(yO)
+ else:
+ draw etiquettesaxey.lft(val);
+ _axorlab:=etiquettey.lft(yO)
+ fi;
+ poslabO:=poslabO + unitvector(xpart _posgrady@#,0);
+ if xO<>yO:
+ draw _axorlab
+ elseif _nbaxes=2:
+ draw _etiqy_(yO,0,yO) shifted (0.7*abs(llcorner _axorlab - urcorner _axorlab)*poslabO)
+ fi
+ elseif nn=2:
+ if str @#<>"":
+ draw etiquettesaxey@#(val);
+ draw etiquettey@#(yO)
+ else:
+ draw etiquettesaxey.lft(val);
+ draw etiquettey.lft(yO)
+ fi
+ else:
+ if str @#<>"":
+ draw etiquettesaxey@#(val)
+ else:
+ draw etiquettesaxey.lft(val)
+ fi
+ fi
+ fi
+ );
+ $
+enddef;
+
+vardef axex@# (expr grad,val)= %%%%%%axe des abscisses avec gestion graduation origine
+ _nbaxes:=_nbaxes+1;
+ _axex_@#(grad,val,1)
+enddef;
+
+vardef axey@# (expr grad,val)= %%%%%%axe des ordonnées avec gestion graduation origine
+ _nbaxes:=_nbaxes+1;
+ _axey_@#(grad,val,1)
+enddef;
+
+vardef axexo@#(expr grad,val)= %%%%%%axe des abscisses avec graduation origine
+ _axex_@#(grad,val,2)
+enddef;
+
+vardef axeyo@#(expr grad,val)= %%%%%%axe des ordonnées avec graduation origine
+ _axey_@#(grad,val,2)
+enddef;
+
+vardef axexn@#(expr grad,val)= %%%%%%axe des abscisses sans graduation origine
+ _axex_@#(grad,val,3)
+enddef;
+
+vardef axeyn@#(expr grad,val)= %%%%%%axe des ordonnées sans graduation origine
+ _axey_@#(grad,val,3)
+enddef;
+
+vardef axes@# (expr grad,val)= %%%% les deux axes
+ save $,posx,posy;
+ picture $;
+ numeric posx,posy;
+ posx:=ypart (_posgradx@#+_posgrady@#);
+ posy:=xpart (_posgradx@#+_posgrady@#);
+ $=image(%
+ if posx>0: draw axex.top(grad,val) else: draw axex.bot(grad,val) fi;
+ if posy>0: draw axey.rt(grad,val) else: draw axey.lft(grad,val) fi
+ );
+ $
+enddef;
+
+vardef axeso@# (expr grad,val)= %%%% les deux axes avec origine
+ save $,posx,posy;
+ picture $;
+ numeric posx,posy;
+ posx:=ypart (_posgradx@#+_posgrady@#);
+ posy:=xpart (_posgradx@#+_posgrady@#);
+ $=image(%
+ if posx>0: draw axexo.top(grad,val) else: draw axexo.bot(grad,val) fi;
+ if posy>0: draw axeyo.rt(grad,val) else: draw axeyo.lft(grad,val) fi
+ );
+ $
+enddef;
+
+vardef axesn@# (expr grad,val)= %%%% les deux axes sans origine
+ save $,posx,posy;
+ picture $;
+ numeric posx,posy;
+ posx:=ypart (_posgradx@#+_posgrady@#);
+ posy:=xpart (_posgradx@#+_posgrady@#);
+ $=image(%
+ if posx>0: draw axexn.top(grad,val) else: draw axexn.bot(grad,val) fi;
+ if posy>0: draw axeyn.rt(grad,val) else: draw axeyn.lft(grad,val) fi
+ );
+ $
+enddef;
+
+% axes gradués avec multiples de pi
+
+vardef fracmulttext(expr n,d,tt)= %%%% construction de la fraction n*tt/d
+ save nn,dd,s,fr,$,fraction;
+ string s,fr,fraction;
+ picture $;
+ numeric nn,dd;
+ nn:=abs((n)/pgcd(n,d));dd:=d/pgcd(n,d);
+ if displayfrac:
+ fraction:="d"
+ else: fraction:=""
+ fi;
+ if dd=1:
+ if nn=1:
+ fr:=tt
+ else: fr:=decimal nn & tt
+ fi
+ else:
+ if nn=1:
+ fr:="\" & fraction & "frac{" & tt & "}{" & decimal dd & "}"
+ else: fr:="\" & fraction & "frac{" & decimal nn & tt & "}{" & decimal dd & "}"
+ fi
+ fi;
+ if n<0:
+ s:="-"
+ else: s:="";
+ if n=0:
+ fr:= "0"
+ fi
+ fi;
+ $=LaTeX("$" & s & fr & "$");
+ $
+enddef;
+
+vardef fracmultpi(expr n,d)=
+ fracmulttext(n,d,"\pi")
+enddef;
+
+
+vardef etiquettexpi@#(expr n,d)=
+ _etiqx_@#(n*pi/d,taillegrad,fracmultpi(n,d))
+enddef;
+
+vardef etiquetteypi@#(expr n,d)=
+ _etiqy_@#(n*pi/d,taillegrad,fracmultpi(n,d))
+enddef;
+
+
+vardef etiquettesaxexpi@#(expr n,d)= %%% ensemble des étiquettes multiples de pi abscisses
+ save $,imin,imax,labmin,labmax,val;
+ picture $,labmin,labmax;
+ numeric imin,imax,val;
+ val:=n*pi/d;
+ $=image(%
+ imin:=ceiling((ValXmin-xO)/val);imax:=floor((ValXmax-xO)/val);
+ % définition première étiquette
+ if (imin<>0):
+ labmin:= etiquettexpi.@#(imin*n,d)
+ else: labmin:=nullpicture
+ fi;
+ % définition dernière étiquette
+ if (imax<>0):
+ labmax:= etiquettexpi.@#(imax*n,d)
+ else: labmax:=nullpicture
+ fi;
+ % tracé première étiquette
+ if xpart ((ulcorner labmin) transformed inverse _T)>=Xmin: draw labmin fi;
+ % tracé autres étiquettes
+ for i=imin+1 upto imax-1:
+ if (i<>0):
+ draw etiquettexpi.@#(i*n,d)
+ fi;
+ endfor;
+ % tracé dernière étiquette
+ if xpart ((lrcorner labmax) transformed inverse _T)<=Xmax: draw labmax fi;
+ );
+ $
+enddef;
+
+vardef etiquettesaxeypi@#(expr n,d)= %%% ensemble des étiquettes multiples de pi ordonnées
+ save $,imin,imax,labmin,labmax,val;
+ picture $,labmin,labmax;
+ numeric imin,imax,val;
+ val:=n*pi/d;
+ $=image(%
+ imin:=ceiling((ValYmin-yO)/val);imax:=floor((ValYmax-yO)/val);
+ % définition première étiquette
+ if (imin<>0):
+ labmin:= etiquetteypi.@#(imin*n,d)
+ else: labmin:=nullpicture
+ fi;
+ % définition dernière étiquette
+ if (imax<>0):
+ labmax:= etiquetteypi.@#(imax*n,d)
+ else: labmax:=nullpicture
+ fi;
+ % tracé première étiquette
+ if ypart (llcorner labmin) >=ypart _c(Xmin,Ymin): draw labmin fi;
+ % tracé autres étiquettes
+ for i=imin+1 upto imax-1:
+ if (i<>0):
+ draw etiquetteypi.@#(i*n,d)
+ fi;
+ endfor;
+ % tracé dernière étiquette
+ if ypart (ulcorner labmax) <=ypart _c(Xmax,Ymax): draw labmax fi
+ );
+ $
+enddef;
+
+vardef _axexpi_@#(expr num,den,nn)=
+ save $,grad;
+ numeric grad;
+ picture $;
+ grad:=num*pi/den;
+ $=image(
+ % axe
+ if flecheaxe: drawarrow else: draw fi dessinaxex;
+ % graduations
+ if grad>0: draw graduationsaxex(grad) fi;
+ % étiquettes
+ if nn=1:
+ if str @#<>"":
+ draw etiquettesaxexpi@#(num,den);
+ _axorlab:=etiquettexpi@#(xO/pi,1)
+ else:
+ draw etiquettesaxexpi.bot(num,den);
+ _axorlab:=etiquettexpi.bot(xO/pi,1)
+ fi;
+ poslabO:=poslabO + unitvector(0,ypart _posgradx@#);
+ if xO<>yO:
+ draw _axorlab
+ elseif _nbaxes=2:
+ draw _etiqx_(xO,0,fracmultpi(xO/pi,1)) shifted (0.7*abs(llcorner _axorlab - urcorner _axorlab)*poslabO)
+ fi
+ elseif nn=2:
+ if str @#<>"":
+ draw etiquettesaxexpi@#(num,den);
+ draw etiquettexpi@#(xO/pi,1)
+ else:
+ draw etiquettesaxexpi.bot(num,den);
+ draw etiquettexpi.bot(xO/pi,1)
+ fi
+ else:
+ if str @#<>"":
+ draw etiquettesaxexpi@#(num,den)
+ else:
+ draw etiquettesaxexpi.bot(num,den)
+ fi
+ fi
+ );
+ $
+enddef;
+
+vardef _axeypi_@#(expr num,den,nn)=
+ save $,grad;
+ numeric grad;
+ picture $;
+ grad:=num*pi/den;
+ $=image(
+ % axe
+ if flecheaxe: drawarrow else: draw fi dessinaxey;
+ % graduations
+ if grad>0: draw graduationsaxey(grad) fi;
+ % étiquettes
+ if nn=1:
+ if str @#<>"":
+ draw etiquettesaxeypi@#(num,den);
+ _axorlab:=etiquetteypi@#(yO/pi,1)
+ else:
+ draw etiquettesaxeypi.lft(num,den);
+ _axorlab:=etiquetteypi.lft(yO/pi,1)
+ fi;
+ poslabO:=poslabO + unitvector(xpart _posgrady@#,0);
+ if xO<>yO:
+ draw _axorlab
+ elseif _nbaxes=2:
+ draw _etiqy_(yO,0,fracmultpi(yO/pi,1)) shifted (0.7*abs(llcorner _axorlab - urcorner _axorlab)*poslabO)
+% draw _etiqy_(yO,0,yO) shifted (0.7*abs(llcorner _axorlab - urcorner _axorlab)*poslabO)
+ fi
+ elseif nn=2:
+ if str @#<>"":
+ draw etiquettesaxeypi@#(num,den);
+ draw etiquetteypi@#(yO/pi,1)
+ else:
+ draw etiquettesaxeypi.lft(num,den);
+ draw etiquetteypi.lft(yO/pi,1)
+ fi
+ else:
+ if str @#<>"":
+ draw etiquettesaxeypi@#(num,den)
+ else:
+ draw etiquettesaxeypi.lft(num,den)
+ fi
+ fi
+ );
+ $
+enddef;
+
+vardef axexpi@# (expr n,d)= %%%%%%axe des abscisses avec gestion graduation origine mult pi
+ _nbaxes:=_nbaxes+1;
+ _axexpi_@#(n,d,1)
+enddef;
+
+vardef axeypi@# (expr n,d)= %%%%%%axe des ordonnées avec gestion graduation origine mult pi
+ _nbaxes:=_nbaxes+1;
+ _axeypi_@#(n,d,1)
+enddef;
+
+vardef axexpio@#(expr n,d)= %%%%%%axe des abscisses avec graduation origine mult pi
+ _axexpi_@#(n,d,2)
+enddef;
+
+vardef axeypio@#(expr n,d)= %%%%%%axe des ordonnées avec graduation origine mult pi
+ _axeypi_@#(n,d,2)
+enddef;
+
+vardef axexpin@#(expr n,d)= %%%%%%axe des abscisses sans graduation origine mult pi
+ _axexpi_@#(n,d,3)
+enddef;
+
+vardef axeypin@#(expr grad,val)= %%%%%%axe des ordonnées sans graduation origine mult pi
+ _axeypi_@#(n,d,3)
+enddef;
+
+vardef axespi@# (expr n,d)= %%%% les deux axes mult pi
+ save $,posx,posy;
+ picture $;
+ numeric posx,posy;
+ posx:=ypart (_posgradx@#+_posgrady@#);
+ posy:=xpart (_posgradx@#+_posgrady@#);
+ $=image(%
+ if posx>0: draw axexpi.top(n,d) else: draw axexpi.bot(n,d) fi;
+ if posy>0: draw axeypi.rt(n,d) else: draw axeypi.lft(n,d) fi
+ );
+ $
+enddef;
+
+vardef axespio@# (expr n,d)= %%%% les deux axes avec origine mult pi
+ save $,posx,posy;
+ picture $;
+ numeric posx,posy;
+ posx:=ypart (_posgradx@#+_posgrady@#);
+ posy:=xpart (_posgradx@#+_posgrady@#);
+ $=image(%
+ if posx>0: draw axexpio.top(n,d) else: draw axexpio.bot(n,d) fi;
+ if posy>0: draw axeypio.rt(n,d) else: draw axeypio.lft(n,d) fi
+ );
+ $
+enddef;
+
+vardef axespin@# (expr n,d)= %%%% les deux axes sans origine mult pi
+ save $,posx,posy;
+ picture $;
+ numeric posx,posy;
+ posx:=ypart (_posgradx@#+_posgrady@#);
+ posy:=xpart (_posgradx@#+_posgrady@#);
+ $=image(%
+ if posx>0: draw axexpin.top(n,d) else: draw axexpin.bot(n,d) fi;
+ if posy>0: draw axeypin.rt(n,d) else: draw axeypin.lft(n,d) fi
+ );
+ $
+enddef;
+
+
+%%%%%%%% graduations isolées
+
+vardef axexpart@#(text t)=
+ save $,tmp,var;
+ picture $;
+ numeric tmp;
+ boolean var;
+ var:=false;
+ $=image(%
+ for _i=t:
+ if numeric _i:
+ if var: if str @#="": draw _etiqx_.bot(tmp,taillegrad,tmp) else: draw _etiqx_@#(tmp,taillegrad,tmp) fi fi;
+% draw ((0,taillegrad)--(0,-taillegrad)) shifted _c(_i,yO) withpen pencircle scaled 0.8bp;
+ draw graduationx(_i) withpen pencircle scaled 0.8bp;
+ tmp:=_i;
+ var:=true
+ else:
+ if str @#="": draw _etiqx_.bot(tmp,taillegrad,_i) else: draw _etiqx_@#(tmp,taillegrad,_i) fi;
+ var:=false
+ fi;
+ endfor;
+ if var: if str @#="": draw _etiqx_.bot(tmp,taillegrad,tmp) else: draw _etiqx_@#(tmp,taillegrad,tmp) fi fi);
+ $
+enddef;
+
+vardef axeypart@#(text t)=
+ save $,tmp,var;
+ picture $;
+ numeric tmp;
+ boolean var;
+ var:=false;
+ $=image(%
+ for _i=t:
+ if numeric _i:
+ if var: if str @#="": draw _etiqy_.lft(tmp,taillegrad,tmp) else: draw _etiqy_@#(tmp,taillegrad,tmp) fi fi;
+ draw ((taillegrad,0)--(-taillegrad,0)) shifted _c(xO,_i) withpen pencircle scaled 0.8bp;
+ tmp:=_i;
+ var:=true
+ else:
+ if str @#="": draw _etiqy_.lft(tmp,taillegrad,_i) else: draw _etiqy_@#(tmp,taillegrad,_i) fi;
+ var:=false
+ fi;
+ endfor;
+ if var: if str @#="": draw _etiqy_.lft(tmp,taillegrad,tmp) else: draw _etiqy_@#(tmp,taillegrad,tmp) fi fi);
+ $
+enddef;
+
+
+vardef axesunit=
+ save $;
+ picture $;
+ $=image(%
+ draw axes(0,0);
+ draw axexpart(1);
+ draw axeypart(1);
+ label.llft(LaTeX("$0$"),_c(0,0));
+ % label.llft("0",_c(0,0));
+ );
+ $
+enddef;
+
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%% POINTS - VECTEURS %%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+vardef _ccoord(expr xA,yA)=
+ (xA,yA) transformed _T
+enddef;
+
+vardef _cobjet(expr obj)=
+ obj transformed _T
+enddef;
+
+vardef _c(text t)=
+ if long_texte(t)=2: _ccoord(t)
+ else: _cobjet(t)
+ fi
+enddef;
+
+vardef pol(expr r,theta)=
+ _c(r*cos(theta),r*sin(theta))
+enddef;
+
+vardef pold(expr r,theta)=
+ _c(r*cosd(theta),r*sind(theta))
+enddef;
+
+color coulpoint,coullabel,coullabelfonc;
+coulpoint:=black;coullabel:=black;coullabelfonc:=black;
+
+
+vardef MarquePointFig(expr pp)= % compatibilité geometriesyr15
+ save $;
+ picture $;
+ if marque_p = "plein":
+ $:=image(fill fullcircle scaled taillepoint shifted pp withcolor coulpoint);
+ elseif marque_p = "creux":
+ $:=image(%
+ fill fullcircle scaled taillepoint shifted pp withcolor background;
+ draw fullcircle scaled taillepoint shifted pp withcolor coulpoint);
+ elseif marque_p = "croix":
+ $:=image(%
+ draw ((-taillecroix,0)--(taillecroix,0)) shifted pp withcolor coulpoint;
+ draw ((0,-taillecroix)--(0,taillecroix)) shifted pp withcolor coulpoint)
+ else: $:=nullpicture
+ fi;
+ $
+enddef;
+
+def MarquePoint(expr pp)= % compatibilité geometriesyr15
+ draw MarquePointFig(pp)
+enddef;
+
+
+vardef pointe(text t) = %geometriesyr15
+ for p_ = t: if pair p_: MarquePoint(p_); fi endfor;
+enddef;
+
+
+vardef nommepoint@#(text t)=
+ save $,ch,dess,latch;
+ pair $;
+ string ch,latch;
+ picture dess;
+ if long_texte(t)=1:
+ dess:=image(draw MarquePointFig(t);
+ ch:=_chaine(t);
+ label@#(LaTeX("$" & ch & "$"),t) withcolor coullabel)
+ else:
+ dess:=image(%
+ for PP=t:
+ if pair PP: MarquePoint(PP); $:=PP
+ else: if string PP: label@#(PP,$) else: label@#(PP scaled defaultscale,$) fi withcolor coullabel
+ fi;
+ endfor)
+ fi;
+ dess
+enddef;
+
+vardef nommecourbe@#(suffix p)(text t)=
+ save A,ch,dess;
+ pair A;
+ string ch;
+ picture dess;
+ if long_texte(t)=1:
+ dess:=image(ch:=_chaine(p);
+ A:=_c(t,fonccourbe.p(t));
+ label@#(LaTeX("$" & ch & "$"),A) withcolor coullabelfonc)
+ else:
+ dess:=image(%
+ for _a=t:
+ if numeric _a: A:=_c(_a,fonccourbe.p(_a))
+ else: if string _a: label@#(_a,A) else: label@#(_a scaled defaultscale,A) fi withcolor coullabelfonc
+ fi;
+ endfor)
+ fi;
+ dess
+enddef;
+
+
+
+vardef nommeobj@#(text t)=
+ save $;
+ picture $;
+ for i=t:
+ if pair i: $:=nommepoint@#(t)
+ else: $:=nommecourbe@#(t)
+ fi;
+ exitif true;
+ endfor
+ $
+enddef;
+
+def nomme = draw nommeobj enddef;
+
+
+vardef vecteur@#(expr A)(text t)=
+ save $,ch,m;
+ picture $;
+ pair m;
+ string ch;
+ $=image(%
+ if long_texte(t)=1: drawarrow A--A+t;ch:=_chaine(t);label@#(LaTeX("$\vect{" & ijmath(ch) & "}$"),A+t/2)
+ else:
+ for u=t:
+ if pair u: drawarrow A--A+u; m:=A+u/2
+ else: if string u: if u<>"": label@#(LaTeX("$\vect{" & u & "}$"),m) fi else: label@#(u,m) fi
+ fi;
+ endfor
+ fi);
+ $
+enddef;
+
+vardef marquepointcourbefig(suffix p)(text t)=
+ save $;
+ picture $;
+ $=image(%
+ for i=t:
+ MarquePoint(_c(i,fonccourbe.p(i)));
+ endfor);
+ $
+enddef;
+
+def marquepointcourbe= draw marquepointcourbefig enddef;
+
+vardef marquepointcheminfig(suffix p)(text t)=
+ save $;
+ picture $;
+ $=image(%
+ for i=t:
+ MarquePoint(point i of p);
+ endfor);
+ $
+enddef;
+
+def marquepointchemin= draw marquepointcheminfig enddef;
+
+vardef marquecheminouvertdroitefig(expr p)=
+ halfcircle shifted (0,-0.5)
+ scaled (2*taillepoint)
+ rotated (90+angle(direction infinity of p))
+ shifted (point infinity of p)
+enddef;
+
+def marquecheminouvertdroite= draw marquecheminouvertdroitefig enddef;
+
+vardef marquecheminouvertgauchefig(expr p)=
+ halfcircle shifted (0,-0.5)
+ scaled (2*taillepoint)
+ rotated (-90+angle(direction 0 of p))
+ shifted (point 0 of p)
+enddef;
+
+def marquecheminouvertgauche= draw marquecheminouvertgauchefig enddef;
+
+vardef marquecheminouvert(expr p)=
+ marquecheminouvertdroite(p);
+ marquecheminouvertgauche(p)
+enddef;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%% BASE %%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+vardef ijmath(suffix s)=
+ if (substring (0,1) of s)="i": s:="\imath" & substring (1,infinity) of s fi;
+ if (substring (0,1) of s)="j": s:="\jmath" & substring (1,infinity) of s fi;
+ s
+enddef;
+
+
+color coulbase;
+coulbase:=black;
+
+vardef base(suffix a,b,c)=
+ save O,I,J,$;
+ string O,I,J;
+ picture $;
+ O:=_chaine(a); I:=_chaine(b); J:=_chaine(c);
+ $:=image(%
+ draw vecteur.bot(_O,_c(1,0),ijmath(I)) withpen pencircle scaled 0.8 withcolor coulbase;
+ draw vecteur.lft(_O,_c(0,1),ijmath(J)) withpen pencircle scaled 0.8 withcolor coulbase;
+ nomme.llft(_O,LaTeX("$" & O & "$")) withcolor coulbase
+ );
+ $
+enddef;
+
+
+vardef basep(suffix a,b,c)=
+ save O,I,J,$;
+ string O,I,J;
+ picture $;
+ O:=_chaine(a); I:=_chaine(b); J:=_chaine(c);
+ $:=image(%
+ nomme.llft(_O,LaTeX("$" & O & "$")) withcolor coulbase;
+ draw axexpart(1,LaTeX("$" & I & "$")) withcolor coulbase;
+ draw axeypart(1,LaTeX("$" & J & "$")) withcolor coulbase;
+ );
+ $
+enddef;
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%% QUADRILLAGE %%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ numeric ep; color coul;
+ ep:= .2bp; %%%%%%%% épaisseur du trait
+ coul := .7white; %%%%%%%% couleur du trait
+ def quadstyle= enddef;
+
+ vardef quadrillage(expr quadx,quady) =
+ save $;
+ picture $;
+ $=image(if quadx>0:
+ for i=ceiling((QuadXmin-xO)/quadx) upto floor((QuadXmax-xO)/quadx):
+ draw _c(arrondimil(i*quadx)+xO,QuadYmin)--_c(arrondimil(i*quadx)+xO,QuadYmax) quadstyle withpen pencircle scaled ep withcolor coul;
+ endfor;
+ fi;
+ if quady>0:
+ for i=ceiling((QuadYmin-yO)/quady) upto floor((QuadYmax-yO)/quady):
+ draw _c(QuadXmin,arrondimil(i*quady)+yO)--_c(QuadXmax,arrondimil(i*quady)+yO) withpen pencircle scaled ep withcolor coul quadstyle;
+ endfor;
+ fi);
+ $
+ enddef;
+
+ vardef papierpointe(expr quadx,quady) =
+ save $;
+ picture $;
+ $=image(if (quadx>0) and (quady>0):
+ for i=ceiling(QuadXmin/quadx) upto floor(QuadXmax/quadx):
+ for j=ceiling(QuadYmin/quady) upto floor(QuadYmax/quady):
+ draw (0,0) shifted _c(i*quadx,j*quady) withpen pencircle scaled 2;
+ endfor;
+ endfor;
+ fi);
+ $
+ enddef;
+
+ numeric pm_epa, pm_epb, pm_epc;
+ color pm_coula, pm_coulb, pm_coulc;
+ pm_epa := .2bp; pm_epb := .3bp; pm_epc := .4bp; %%%%%%%%%% épaisseurs des traits
+ pm_coula := .6*white; pm_coulb := .4*white; pm_coulc := black; %%%%%%%%%% couleurs des traits
+
+vardef papiermillimetre =
+ save $;
+ picture $;
+ $=image(%
+ for i= ceiling(QuadXmin*Ux*10/cm) upto floor(QuadXmax*Ux*10/cm):
+ if i mod 5 <> 0: draw (i*cm/10,QuadYmin*Uy)--(i*cm/10,QuadYmax*Uy) withpen pencircle scaled pm_epa withcolor pm_coula fi;
+ endfor
+ for i= ceiling(QuadYmin*Uy*10/cm) upto floor(QuadYmax*Uy*10/cm):
+ if i mod 5<> 0: draw (QuadXmin*Ux,i*cm/10)--(QuadXmax*Ux,i*cm/10) withpen pencircle scaled pm_epa withcolor pm_coula fi;
+ endfor
+ %
+ for i= ceiling(QuadXmin*Ux/cm)*2+1 step 2 until floor(QuadXmax*Ux/cm)*2-1:
+ draw (i*cm/2,QuadYmin*Uy)--(i*cm/2,QuadYmax*Uy) withpen pencircle scaled pm_epb withcolor pm_coulb;
+ endfor
+ for i= ceiling(QuadYmin*Uy/cm)*2+1 step 2 until floor(QuadYmax*Uy/cm)*2-1:
+ draw (QuadXmin*Ux,i*cm/2)--(QuadXmax*Ux,i*cm/2) withpen pencircle scaled pm_epb withcolor pm_coulb;
+ endfor
+ %
+ for i= ceiling(QuadXmin*Ux/cm) upto floor(QuadXmax*Ux/cm):
+ draw (i*cm,QuadYmin*Uy)--(i*cm,QuadYmax*Uy) withpen pencircle scaled pm_epc withcolor pm_coulc;
+ endfor
+ for i= ceiling(QuadYmin*Uy/cm) upto floor(QuadYmax*Uy/cm):
+ draw (QuadXmin*Ux,i*cm)--(QuadXmax*Ux,i*cm) withpen pencircle scaled pm_epc withcolor pm_coulc;
+ endfor);
+ $
+enddef;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%% FONCTIONS - COURBES %%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+vardef courbefonc(suffix f)(expr xmin, xmax, n) = %Courbe représentative d'une fonction
+ save $,x;
+ path $;
+ $=( _c(xmin,f(xmin))
+ for i=1 upto n-1:
+ .._c(xmin+i*(xmax-xmin)/(n-1),f(xmin+i*(xmax-xmin)/(n-1)))
+ endfor );
+ $
+enddef;
+
+%%%%%%%%%% TEST %%%%%%%%%%%%%
+vardef courbefonct@#(expr xmin, xmax, n) = %Courbe représentative d'une fonction
+ save $,x;
+ path $;
+ $=( _c(xmin,@#(xmin))
+ for i=1 upto n-1:
+ .._c(xmin+i*(xmax-xmin)/(n-1),@#(xmin+i*(xmax-xmin)/(n-1)))
+ endfor );
+ $
+enddef;
+%%%%%%%%%% FINTEST %%%%%%%%%%%%%
+
+vardef courbepoints(suffix f)(expr xmin, xmax, n) = %Points non reliés
+ save $,x;
+ picture $;
+ $=image(MarquePoint(_c(xmin,f(xmin)));
+ for i=1 upto n-1:
+ MarquePoint(_c(xmin+i*(xmax-xmin)/(n-1),f(xmin+i*(xmax-xmin)/(n-1))));
+ endfor );
+ $
+enddef;
+
+vardef fonccourbe@#(expr x)= %Ordonnée du point de la courbe @# d'abscisse x (dans le repère utilisateur)
+ ypart ((pointcourbe@#(x)) transformed inverse _T)
+enddef;
+
+vardef pointcourbe@#(expr x)= %Point de la courbe @# d'abscisse x dans le repère utilisateur
+save _P_,t;
+ numeric t; pair _P_;
+ (t,whatever)=@# intersectiontimes (_c(x,2*Ymin-Ymax)--_c(x,2*Ymax-Ymin));
+ if t=-1: _P_:=_c(x,0)
+ else: _P_:=point t of @#
+ fi;
+ _P_
+enddef;
+
+vardef der@#(expr x)= %Fonction dérivée
+ save pp,t,v,w,d;
+ path pp;
+ pair v,w;
+ pp:=@#;
+ (t,whatever) = pp intersectiontimes (_c(x,2*Ymin-Ymax)--_c(x,2*Ymax-Ymin));
+ v:=direction t of pp;
+ w:=unitvector(v transformed inverse _T);
+ if xpart w = 0: d:=0 else: d:= (ypart w)/(xpart w) fi;
+ d
+enddef;
+
+vardef intercourbes(suffix P)(expr p,q)= %renvoie les points d'intersections de p et q dans P[]
+ save i,pp;
+ numeric i;
+ path pp;
+ pp:=p;
+ i:=1;
+ forever:
+ exitif xpart(pp intersectiontimes q)=-1;
+ P[i]:=point xpart(pp intersectiontimes q) of pp;
+ pp:=subpath(xpart(pp intersectiontimes q)+0.01,length pp) of pp;
+ %0.01(?!) pour que le point trouvé ne soit pas dans le sous-chemin...
+ i:=i+1;
+ endfor;
+enddef;
+
+vardef ptantecedents(suffix P)(expr y,p)=
+ intercourbes(P,_c(Xmin,y)--_c(Xmax,y),p)
+enddef;
+
+vardef antecedents(suffix P)(expr y,p)=
+ pair PP[];
+ ptantecedents(PP,y,p);
+ for i=1 upto 10: P[i]:=xpart (PP[i] transformed inverse _T); endfor
+enddef;
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%% TANGENTES %%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+numeric longtan;
+longtan:=20;
+
+vardef tangentefleche@# (suffix p)(text tt) =
+ save t,$,pp,i,N;
+pair senstan.gauche,senstan.droite,senstan.double;
+senstan.gauche=(1,0);senstan.droite=(0,1);senstan.double=(1,1);
+ numeric N[],i;
+ i:=0;
+ pair _v,M;
+ picture $;
+ for n=tt: i:=incr i ; N[i]:=n; endfor;
+ if i=1: N2:=longtan fi;
+ (t,whatever) = p intersectiontimes (_c(N1,Ymin)--_c(N1,Ymax));
+ M:=point t of p;
+ _v:=N2*unitvector(direction t of p);
+ $=image(%
+ MarquePoint(M);
+ if (xpart senstan@#) <> 0: drawarrow M--M-_v*(xpart senstan@#) fi;
+ if (ypart senstan@#) <> 0: drawarrow M--M+_v*(ypart senstan@#) fi;
+ );
+ $
+enddef;
+
+vardef tangentedroite(expr p,a) =
+ save $,m,M,t;
+ path $;
+ numeric m,t;
+ pair M;
+ (t,whatever) = p intersectiontimes (_c(a,Ymin)--_c(a,Ymax));
+ M:=point t of p;
+ $=M-_diag*unitvector(direction t of p)--M+_diag*unitvector(direction t of p);
+ $
+enddef;
+
+vardef tangente@#(suffix p)(text tt) =
+ if str @#="": tangentedroite(p)(tt)
+ else: tangentefleche@#(p)(tt)
+ fi
+enddef;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%% CALCUL INTÉGRAL %%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+vardef entrecourbes(expr p,q,xmin,xmax)=
+ buildcycle(droiteeqx(xmax),p,droiteeqx(xmin),q)
+enddef;
+
+vardef souscourbe(expr p,xmin,xmax)=
+ buildcycle(droiteeqx(xmax),p,droiteeqx(xmin),_c(Xmin,0)--_c(Xmax,0))
+enddef;
+
+
+vardef rectangles@#(suffix p)(expr a,b,n)= %Riemann, renvoie un chemin fermé
+ save pas,_rect_;
+ numeric pas;
+ path _rect_;
+ pas=(b-a)/n;
+ _rect_ =
+ for i=0 upto n-1:
+ _c(a+i*pas,yO)--_segmrect_@#(p,a+i*pas,pas)--
+ endfor
+ _c(b,yO)--cycle;
+ _rect_
+enddef;
+
+numeric _typerect.min,_typerect.max,_typerect.droite,_typerect.gauche;
+_typerect.min=1;_typerect.max=2;_typerect.droite=3;_typerect.gauche=4;
+
+vardef _segmrect_@#(suffix p)(expr a,pas)=
+ save _sousp;
+ path _sousp;
+ _sousp=subpath (xpart(p intersectiontimes droiteeqx(a)),xpart(p intersectiontimes droiteeqx(a+pas))) of p;
+ if _typerect@#=1: llcorner _sousp -- lrcorner _sousp
+ elseif _typerect@#=2: ulcorner _sousp -- urcorner _sousp
+ elseif _typerect@#=3: (pointcourbe.p(a))--(pointcourbe.p(a) shifted _c(pas,0))
+ elseif _typerect@#=4: (pointcourbe.p(a+pas) shifted _c(-pas,0))--(pointcourbe.p(a+pas))
+ fi
+enddef;
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%% DROITES %%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+vardef droiteeqred(expr a,b)=
+ save $;
+ path $;
+ if (-(Ymax-Ymin)/(Xmax-Xmin)<a) and ((Ymax-Ymin)/(Xmax-Xmin)>a):
+ $:=_c(Xmin,a*Xmin+b)--_c(Xmax,a*Xmax+b);
+ else:
+ $:=_c(Ymin/a-b/a,Ymin)--_c(Ymax/a-b/a,Ymax);
+ fi;
+ $
+enddef;
+
+vardef droiteeqx(expr c)=
+ _c(c,2*Ymin-Ymax)--_c(c,2*Ymax-Ymin)
+enddef;
+
+vardef droiteeqcart(expr a,b,c)=
+ save $;
+ path $;
+ if b=0:
+ $=droiteeqx(-c/a)
+ else:
+ $:=droiteeqred(-a/b,-c/b)
+ fi;
+ $
+enddef;
+
+vardef droiteeq(text t)=
+ save $;
+ path $;
+ if long_texte(t)=1: $:= droiteeqx(t) fi;
+ if long_texte(t)=2: $:= droiteeqred(t) fi;
+ if long_texte(t)=3: $:= droiteeqcart(t) fi;
+ $
+enddef;
+
+
+vardef droitept(expr A,B)= %geometrie15syr
+ (_diag/abs(A-B))[B,A]--(_diag/abs(A-B))[A,B]
+enddef;
+
+vardef droite(text t)=
+ save $;
+ path $;
+ for i=t:
+ if pair i: $:=droitept(t) else: $:=droiteeq(t) fi;
+ exitif true;
+ endfor;
+ $
+enddef;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%% DEMI-PLANS %%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+vardef demiplaninf(expr d)=
+ save $,A,B;
+ path $;
+ pair A,B;
+ if (point 0 of d) yscaled -1 < (point infinity of d) yscaled -1:
+ A:=point 0 of d; B:= point infinity of d
+ else: B:=point 0 of d; A:= point infinity of d
+ fi;
+ $=A--
+ if ypart A>=ypart _c(Xmin,Ymax): _c(Xmin,Ymax)-- fi
+ if ypart A>ypart _c(Xmin,Ymin): _c(Xmin,Ymin)-- fi
+ if ypart B>ypart _c(Xmax,Ymin): _c(Xmax,Ymin)-- fi
+ if ypart B>=ypart _c(Xmax,Ymax): _c(Xmax,Ymax)-- fi
+ B--cycle;
+ $
+enddef;
+
+vardef demiplansup(expr d)=
+ save $,A,B;
+ path $;
+ pair A,B;
+ if (point 0 of d) yscaled -1 < (point infinity of d) yscaled -1:
+ A:=point 0 of d; B:= point infinity of d
+ else: B:=point 0 of d; A:= point infinity of d
+ fi;
+ $=A--
+ if ypart A<=ypart _c(Xmin,Ymin): _c(Xmin,Ymin)-- fi
+ if ypart A<ypart _c(Xmin,Ymax): _c(Xmin,Ymax)-- fi
+ if ypart B<ypart _c(Xmax,Ymax): _c(Xmax,Ymax)-- fi
+ if ypart B<=ypart _c(Xmax,Ymin): _c(Xmax,Ymin)-- fi
+ B--cycle;
+ $
+enddef;
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%% PROJECTIONS %%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+vardef projetex(expr A)=
+ _c(xpart (A transformed inverse _T),yO)
+enddef;
+
+vardef projetey(expr A)=
+ _c(xO,ypart (A transformed inverse _T))
+enddef;
+
+vardef projectionx@#(text t)=
+ save $,_a,_fg,dec;
+ picture $,_fg;_fg:=nullpicture;
+ numeric dec;dec=0;
+ pair _a;
+ $=image(%
+ for i=t:
+ if pair i: draw i--projetex(i);_a:=i elseif numeric i: dec:=i else: _fg:=thelabel.@#(i,projetex(_a)) fi;
+ endfor;
+ draw _fg shifted (0,dec));
+ $
+enddef;
+
+vardef projectiony@#(text t)=
+ save $,_a,_fg,dec;
+ picture $,_fg;_fg:=nullpicture;
+ numeric dec;dec=0;
+ pair _a;
+ $=image(%
+ for i=t:
+ if pair i: draw i--projetey(i);_a:=i elseif numeric i: dec:=i else: _fg:=thelabel.@#(i,projetey(_a)) fi;
+ endfor;
+ draw _fg shifted (dec,0));
+ $
+enddef;
+
+
+vardef projectionaxes(text t)=
+ save $,_A,n;
+ picture $,_fg[];_fg1=_fg2=nullpicture;
+ pair _A;
+ numeric n,dd;n=1;dd=0;
+ $=image(%
+ for i=t: if numeric i: dd:=i fi; endfor
+ for i=t:
+ if not numeric i:
+ if pair i: _A:=i;
+ elseif n=1: if ypart _A > ypart _O: draw projectionx.bot(_A,i,-dd) else: draw projectionx.top(_A,i,dd) fi;n:=n+1
+ else: if xpart _A > xpart _O: draw projectiony.lft(_A,i,-dd) else: draw projectiony.rt(_A,i,dd) fi;n:=n+1
+ fi;
+ fi;
+ endfor;
+ if n<=2: draw projectiony(_A) fi; if n=1: draw projectionx(_A) fi);
+ $
+enddef;
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%% SUITES %%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+vardef suite(suffix u)(expr deb,fin)=
+ save $;
+ picture $;
+ $=courbepoints(u,deb,fin,fin-deb+1);
+ $
+enddef;
+
+vardef _suiterecfonc_(expr x)=0 enddef;
+numeric _suiterecdeb_, _suiterecfin_, _suiterecinit_;
+
+vardef suiterec(suffix f)(expr deb,fin,init)= %escalier un+1=f(un), u_deb=init
+ vardef _suiterecfonc_(expr x)=f(x) enddef;
+ _suiterecdeb_:=deb;_suiterecfin_:=fin;_suiterecinit_:=init; %stocke les valeurs pour réutilisation
+ save $,un;
+ path $;
+ numeric un;
+ un=init;
+ $=_c(un,yO)
+ for i=deb upto fin-1:
+ --_c(un,f(un))--_c(f(un),f(un))
+ hide(un:=f(un))
+ endfor;
+ $
+enddef;
+
+vardef suiterecprojx@#(text t)= %projections et étiquettes sur axe x, utilise les valeurs de suiterec
+ save $,deb,fin,nom,_qw_,un;
+ picture $,lab;
+ string nom;
+ numeric deb,fin,_qw_,un,_prec;
+ deb:=_suiterecdeb_;fin:=_suiterecfin_;un:=_suiterecinit_;
+ _qw_:=1;
+ for i=t: %récupère les éventuelles nouvelles valeurs pour deb et fin
+ if _qw_ =1: if string i: nom:=i else: nom:="_val";_prec:=i fi;
+ elseif _qw_=2:
+ deb:=i;
+ for j=_suiterecdeb_ upto i-1:
+ un:=_suiterecfonc_(un);
+ endfor
+ elseif _qw_=3: fin:=i
+ fi;
+ _qw_:=_qw_+1;
+ endfor;
+ $=image(%
+ if nom="":
+ if deb=_suiterecdeb_:
+ deb:=deb+1;un:=_suiterecfonc_(un)
+ fi;
+ for i=deb upto fin:
+ draw projectionx.@#(_c(un,un));
+ un:=_suiterecfonc_(un);
+ endfor
+ elseif nom="_val":
+ if deb=_suiterecdeb_:
+% label.@#(format("%10f",arrondi(10**_prec,un)),_c(un,yO));
+ draw etiquettex.@#(arrondi(10**_prec,un));
+ deb:=deb+1;un:=_suiterecfonc_(un)
+ fi;
+ for i=deb upto fin:
+% draw projectionx.@#(_c(un,un),format("%10f",arrondi(10**_prec,un)));
+ lab:=LaTeX("$\num{" & decimal(arrondi(10**_prec,un)) & "}$");
+ draw projectionx.@#(_c(un,un),lab,-taillegrad);
+ un:=_suiterecfonc_(un);
+ endfor
+ else:
+ if deb=_suiterecdeb_:
+ label.@#(LaTeX("$" & nom & "_{" & decimal(deb) & "}" & "$"),_c(un,yO));
+ deb:=deb+1;un:=_suiterecfonc_(un)
+ fi;
+ for i=deb upto fin:
+ lab:=LaTeX("$" & nom & "_{" & decimal(i) & "}" & "$");
+ draw projectionx.@#(_c(un,un),lab);
+ un:=_suiterecfonc_(un);
+ endfor
+ fi);
+ $
+enddef;
+
+vardef suiterecprojy@#(text t)= %projections et étiquettes sur axe y, utilise les valeurs de suiterec
+ save $,deb,fin,nom,_qw_,un;
+ picture $,lab;
+ string nom;
+ numeric deb,fin,_qw_,un,_prec;
+ deb:=_suiterecdeb_;fin:=_suiterecfin_;un:=_suiterecinit_;
+ _qw_:=1;
+ for i=t: %récupère les éventuelles nouvelles valeurs pour deb et fin
+ if _qw_ =1: if string i: nom:=i else: nom:="_val";_prec:=i fi;
+ elseif _qw_=2:
+ deb:=i;
+ for j=_suiterecdeb_ upto i-2:
+ un:=_suiterecfonc_(un);
+ endfor
+ elseif _qw_=3: fin:=i
+ fi;
+ _qw_:=_qw_+1;
+ endfor;
+ $=image(%
+ if nom="":
+ if deb=_suiterecdeb_:
+ deb:=deb+1;
+ fi;
+ for i=deb-1 upto fin-1:
+ draw projectiony.@#(_c(un,_suiterecfonc_(un)));
+ un:=_suiterecfonc_(un);
+ endfor
+ elseif nom="_val":
+ if deb=_suiterecdeb_:
+ deb:=deb+1;
+ fi;
+ for i=deb-1 upto fin-1:
+ lab:=LaTeX("$\num{" & decimal(arrondi(10**_prec,un)) & "}$");
+ draw projectiony.@#(_c(un,_suiterecfonc_(un)),lab,-taillegrad);
+ un:=_suiterecfonc_(un);
+ endfor
+ else:
+ if deb=_suiterecdeb_:
+ deb:=deb+1;
+ fi;
+ for i=deb-1 upto fin-1:
+ lab:=LaTeX("$" & nom & "_{" & decimal(i+1) & "}" & "$");
+ draw projectiony.@#(_c(un,_suiterecfonc_(un)),lab);
+ un:=_suiterecfonc_(un);
+ endfor
+ fi);
+ $
+enddef;
+
+
+vardef suiterecproj(text t)=
+ save $;
+ picture $;
+ $=image(%
+ draw suiterecprojx.bot(t);
+ draw suiterecprojy.lft(t));
+ $
+enddef;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%% INTERVALLES %%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+vardef bornex[](expr val)=
+ ((1mm,-2mm)--(0,-2mm)--(0,2mm)--(1mm,2mm)) if @<0: xscaled -1 fi shifted _c(val,xO)
+enddef;
+
+vardef borney[](expr val)=
+ ((2mm,1mm)--(2mm,0)--(-2mm,0)--(-2mm,1mm)) if @<0: yscaled -1 fi shifted _c(yO,val)
+enddef;
+
+pair sensborne.FF,sensborne.FO,sensborne.OF,sensborne.OO;
+sensborne.FF=-sensborne.OO=(1,-1);sensborne.FO=-sensborne.OF=(1,1);
+
+vardef intervallex@#(expr vmin,vmax)=
+ save $;
+ picture $;
+ $=image(%
+ draw _c(vmin,xO)--_c(vmax,xO) withpen pencircle scaled 2pt;
+ draw bornex[xpart sensborne@#](vmin) withpen pencircle scaled 2pt;
+ draw bornex[ypart sensborne@#](vmax) withpen pencircle scaled 2pt);
+ $
+enddef;
+
+vardef intervalley@#(expr vmin,vmax)=
+ save $;
+ picture $;
+ $=image(%
+ draw _c(yO,vmin)--_c(yO,vmax) withpen pencircle scaled 2pt;
+ draw borney[xpart sensborne@#](vmin) withpen pencircle scaled 2pt;
+ draw borney[ypart sensborne@#](vmax) withpen pencircle scaled 2pt);
+ $
+enddef;
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%% STATISTIQUES %%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+numeric _decboitemoustache_,_largboitemoustache_;
+
+
+vardef boitemoustache(text t)=
+ _decboitemoustache_:=1.5cm;
+ _largboitemoustache_:=1cm;
+ save $,n;
+ picture $;
+ numeric n,_valeursboitemoustache_[];
+ n:=1;
+ for i=t:
+ _valeursboitemoustache_[n]:=i;
+ n:=n+1;
+ endfor;
+ if known _valeursboitemoustache_[6]: _decboitemoustache_:=_valeursboitemoustache_[6] fi;
+ if known _valeursboitemoustache_[7]: _largboitemoustache_:=_valeursboitemoustache_[7] fi;
+ $=image(%
+ fill fullcircle scaled 3 shifted _c(_valeursboitemoustache_[1],yO);
+ draw _c(_valeursboitemoustache_[1],yO)--_c(_valeursboitemoustache_[2],yO);
+ draw _c(_valeursboitemoustache_[2],yO) shifted (0,-_largboitemoustache_/2)--_c(_valeursboitemoustache_[2],yO) shifted (0,_largboitemoustache_/2)--_c(_valeursboitemoustache_[4],yO) shifted (0,_largboitemoustache_/2)--_c(_valeursboitemoustache_[4],yO) shifted (0,-_largboitemoustache_/2)--cycle;
+ draw _c(_valeursboitemoustache_[3],yO) shifted (0,-_largboitemoustache_/2)--_c(_valeursboitemoustache_[3],yO) shifted (0,_largboitemoustache_/2);
+ draw _c(_valeursboitemoustache_[4],yO)--_c(_valeursboitemoustache_[5],yO);
+ fill fullcircle scaled 3 shifted _c(_valeursboitemoustache_[5],yO)%
+ ) shifted (0,_decboitemoustache_);
+ $
+enddef;
+
+vardef projboitemoustache@#(text t)=
+ save $,n,_lab_,_comp_,A,tmp;
+ pair A;
+ picture $,_lab_[];
+ numeric n_comp_,tmp;
+ n:=long_texte(t);
+ if n=0:
+ _lab_[1]:=LaTeX("$X_{min}$");
+ _lab_[2]:=LaTeX("$Q_1$");
+ _lab_[3]:=LaTeX("$M_e$");
+ _lab_[4]:=LaTeX("$Q_3$");
+ _lab_[5]:=LaTeX("$X_{max}$");
+ elseif n=1:
+ if t=0: for i=1 upto 5: _lab_[i]:=nullpicture; endfor
+ else:
+ tmp:=floor(t);
+ for i=1 upto 5:
+ _lab_[i]:=LaTeX("\num{" & decimal(arrondi(10**tmp,_valeursboitemoustache_[i])) & "}");
+ endfor
+ fi
+ else: _comp_:=1; for i=t:
+ if numeric i: _lab_[_comp_]:=LaTeX("\num{" & decimal(i) & "}")
+ elseif string i: _lab_[_comp_]:=LaTeX(i)
+ else: _lab_[_comp_]:=i
+ fi;
+ _comp_:=_comp_+1;
+ endfor
+ fi;
+ $=image(%
+ for i=1 upto 5:
+ if (i=1) or (i=5):
+ A:=_c(_valeursboitemoustache_[i],yO) shifted(0,_decboitemoustache_)
+ else: A:=_c(_valeursboitemoustache_[i],yO) shifted(0,_decboitemoustache_-_largboitemoustache_/2)
+ fi;
+ draw projectionx@#(A,_lab_[i]);
+ endfor);
+ $
+enddef;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%% FONCTIONS USUELLES %%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+pi:=3.141592654;
+e:=2.718281828;
+
+vardef sin(expr x) = sind(180*x/pi) enddef;
+
+vardef cos(expr x) = cosd(180*x/pi) enddef;
+
+vardef tan(expr x) = sin(x)/cos(x) enddef;
+
+vardef exp(expr x) = mexp(x*256) enddef;
+
+vardef ln(expr x) = mlog(x)/256 enddef;
+
+vardef ch(expr x)=(exp(x)+exp(-x))/2 enddef;
+
+vardef sh(expr x)=(exp(x)-exp(-x))/2 enddef;
+
+vardef Arctan(expr x)= pi*angle(1,x)/180 enddef;
+
+vardef Arcsin(expr x)= Arctan(x/sqrt(1-x**2)) enddef;
+
+vardef Arccos(expr x)= pi/2-Arcsin(x) enddef;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%% REMPLISSAGE %%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+let _fill_ = fill;
+
+def fill expr c=
+if path c: _fill_ c else: draw c fi
+enddef;
+
+numeric largbriques,hautbriques,decbriques;
+largbriques=12;hautbriques=6;decbriques=6;
+
+vardef briques(text t)=
+ if long_texte(t)=0:
+ repbriques(largbriques,hautbriques,decbriques)
+ else:
+ repbriques(t)
+ fi
+enddef;
+
+
+
+vardef repbriques(expr larg,haut,dec)=
+ numeric d;d=0;
+ image(%
+ for j=0 upto _hautcadre/haut:
+ draw ((0,0)--(_largcadre,0)) shifted (0,j*haut);
+ d:=d+dec;if d>larg: d:=d-larg fi;
+ for i=0 upto _largcadre/larg:
+ draw ((0,0)--(0,haut)) shifted (i*larg+d,j*haut);
+ endfor;
+ endfor) shifted llcorner cadre
+enddef;
+
+
+numeric pashach,anglehach;
+pashach=5;anglehach=60;
+
+vardef hachures(text t)=
+ if long_texte(t)=0:
+ rephachures(pashach,anglehach)
+ else:
+ rephachures(t)
+ fi
+enddef;
+
+vardef rephachures(expr pas,angle)=
+ image(%
+ for i=floor(-_diag/(2*pas)) upto ceiling(_diag/(2*pas)):
+ draw ((-_diag/2,0)--(_diag/2,0)) shifted (0,i*pas);
+ endfor) rotated angle shifted center cadre
+enddef;
+
+numeric pervagues,ampvagues,decvagues;
+pervagues=20;ampvagues=3;decvagues=10;
+
+vardef vagues(text t)=
+ if long_texte(t)=0:
+ repvagues(pervagues,ampvagues,decvagues)
+ else:
+ repvagues(t)
+ fi
+enddef;
+
+
+vardef repvagues(expr per,amp,dec)= %D'après le manuel de l'utilisateur de MetaPost
+ image(%
+ for j=0 upto _hautcadre/dec:
+ for i=0 upto _largcadre/amp:
+ draw ((0,0){curl 0}..(per/4,-amp)..(per/2,0){curl 0}..(3*per/4,amp)..(per,0){curl 0}) shifted (i*per,j*dec);
+ endfor;
+ endfor) shifted llcorner cadre
+enddef;
+
+
+primarydef p avec c =
+ begingroup
+ save _des_;
+ picture _des_;
+ _des_:=c;
+ clip _des_ to p;
+ _des_
+ endgroup
+enddef;
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%% DIVERS %%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+string LaTeX_packages[],LaTeX_preamble,LaTeX_inputenc;
+LaTeX_preamble:="";LaTeX_inputenc:="";
+
+numeric n_packages;
+n_packages:=0;
+
+def LaTeX_AjoutPackage(expr t)=
+ if known latexmp_module:
+ latexmp_packages:=latexmp_packages & "," & t
+ else:
+ n_packages:=n_packages+1;
+ LaTeX_packages[n_packages]:=t
+ fi
+enddef;
+
+def LaTeX_AjoutCommande(expr t)=
+ LaTeX_preamble:=LaTeX_preamble & t
+enddef;
+
+def LaTeX_Encodage(expr t)=
+ LaTeX_inputenc:= t
+enddef;
+
+
+
+boolean LaTeXprem;
+LaTeXprem:=true;
+
+def LaTeXsetup =
+ if LaTeXprem:
+ LaTeXprem:=false;
+ latexmp_preamble:=LaTeX_preamble;
+ latexmp_inputenc:=LaTeX_inputenc;
+ if latexmp_inputenc="": latexmp_inputenc:="utf8" fi;
+ if latexmp_packages="": latexmp_packages:="fourier" fi;
+ latexmp_packages:=latexmp_packages & ",textcomp,mathtools,mathrsfs,esvect[e],siunitx[output-decimal-marker={,}],babel[frenchb]";
+ latexmp_preamble:=latexmp_preamble & "\newcommand{\vect}[1]{\vv{#1}}" & "\newcommand{\calc}{\mathscr{C}}" & "\newcommand{\calp}{\mathscr{P}}" & "\DecimalMathComma" ;
+ fi
+enddef;
+
+vardef LaTeX primary sc = %D'après TEX.mp
+ if known latexmp_module: LaTeXsetup; textext(sc) scaled defaultscale
+ else:
+ save n_p;
+ numeric n_p;
+ write "verbatimtex" to "mptextmp.mp";
+ write "%&latex" to "mptextmp.mp";
+ write "\documentclass[10pt]{article}" to "mptextmp.mp";
+ if LaTeX_inputenc="":
+ write "\usepackage[utf8]{inputenc}" to "mptextmp.mp"
+ else:
+ write "\usepackage[" & LaTeX_inputenc &"]{inputenc}" to "mptextmp.mp"
+ fi;
+ write "\usepackage[T1]{fontenc}" to "mptextmp.mp";
+ if known LaTeX_packages[1]:
+ n_p:=1;
+ forever: exitunless known LaTeX_packages[n_p];
+ write "\usepackage{" & LaTeX_packages[n_p] &"}" to "mptextmp.mp";
+ n_p:=n_p+1;
+ endfor
+ else:
+ write "\usepackage{fourier}" to "mptextmp.mp"
+ fi;
+ write "\usepackage{amsmath}" to "mptextmp.mp";
+ write "\usepackage{mathrsfs}" to "mptextmp.mp";
+ write "\usepackage[e]{esvect}" to "mptextmp.mp";
+ write "\usepackage[output-decimal-marker={,}]{siunitx}" to "mptextmp.mp";
+ write "\usepackage[frenchb]{babel}" to "mptextmp.mp";
+ write LaTeX_preamble to "mptextmp.mp";
+ write "\newcommand{\vect}[1]{\vv{#1}}" to "mptextmp.mp";
+ write "\newcommand{\calc}{\mathscr{C}}" to "mptextmp.mp";
+ write "\newcommand{\calp}{\mathscr{P}}" to "mptextmp.mp";
+ write "\begin{document}" to "mptextmp.mp";
+ write "etex" to "mptextmp.mp";
+ write "btex "& sc &" etex" to "mptextmp.mp";
+ write EOF to "mptextmp.mp";
+ scantokens "input mptextmp" scaled defaultscale
+ fi
+enddef;
+
+%%%%%%%%%%%%%%%Figure intermédiaire%%%%%%%%%%%%%%%%%%%
+def figureinter=
+ clip currentpicture to cadre;
+ shipit;
+ _nfig:=_nfig+1;
+ charcode:=charcode+1;
+enddef;
+
+
+vardef arrowhead expr p = %redéfinition flèches
+ save q,e; path q; pair e;
+ e = point length p of p;
+ q = gobble(p shifted -e cutafter makepath(pencircle scaled 2ahlength))
+ cuttings;
+ (q rotated .5ahangle & reverse q rotated -.5ahangle -- 0.5*(point 0 of q)-- cycle) shifted e
+enddef;
+
+def epaisseur=withpen pencircle scaled enddef;
+def couleur=withcolor enddef;
+
+
+vardef long_texte(text t)=
+ save i;
+ numeric i;
+ i:=0;
+ for n=t: i:=i+1; endfor
+ i
+enddef;
+
+vardef _chaine(suffix s)= %met les termes en indice si le 2e est un chiffre
+ save c,d;
+ string c,d;
+ d:= str s;
+ if length(d)=1:
+ c:=d
+ elseif isdigit (substring (1,2) of d):
+ c:= (substring (0,1) of d) & "_{" & substring (1,infinity) of d & "}"
+ else: c:=str s
+ fi;
+ c
+enddef;
+
+
+vardef arrondi(expr p,x)= %arrondi de x au p-ième
+ round((x-floor(x))*p)/p+floor(x)
+enddef;
+
+vardef arrondimil(expr x)=
+ arrondi(1000,x)
+enddef;
+
+vardef pgcd(expr a,b)=
+ save r_,a_,b_;
+ numeric r_,a_,b_;
+ a_=a;b_=b;
+ forever:
+ r_:=a_ mod b_;
+ exitif r_=0;
+ a_:=b_;
+ b_:=r_;
+ endfor;
+ b_
+enddef;
+
+%%%%%%%%%%%%%%% COULEURS %%%%%%%%%%%%%%%%%%%
+cmykcolor Rouge,Vert,Bleu,Marron,Lime,Orange,Rose,Pourpre,Violet,Cyan,Magenta,Jaune,Olive,Noir,Grisfonce,Gris,Grisclair,Blanc,Beige,Marine,Moutarde,Vertfonce;
+
+Rouge:=(0,1,1,0);
+Vert:=(1,0,1,0);
+Bleu:=(1,1,0,0);
+Marron:=(0,0.53,1,0.65);
+Lime:=(0.38,0,0.78,0.01);
+Orange:=(0,0.5,1,0);
+Rose:=(0,0.57,0.38,0.01);
+Pourpre:=(0,0.91,0.59,0.38);
+Violet:=(0.5,1,0,0.4);
+Cyan:=(1,0,0,0);
+Magenta:=(0,1,0,0);
+Jaune:=(0,0,1,0);
+Olive:=(0.21,0,0.75,0.45);
+Noir:=(0,0,0,1);
+Grisfonce:=(0,0,0,0.75);
+Gris:=(0,0,0,0.5);
+Grisclair:=(0,0,0,0.25);
+Blanc:=(0,0,0,0);
+Beige:=(0,0.14,0.37,0.22);
+Marine:=(1,1,0,0.5);
+Moutarde:=(0.04,0,1,0.19);
+Vertfonce:=(1,0,1,0.5);
+
+
+vardef conversion_cmyn_rvb(expr coul)=
+ ((1-cyanpart coul)*(1-blackpart coul),(1-magentapart coul)*(1-blackpart coul),(1-yellowpart coul)*(1-blackpart coul))
+enddef;
+
+color rouge,vert,bleu,marron,lime,orange,rose,pourpre,violet,cyan,magenta,jaune,olive,noir,grisfonce,gris,grisclair,blanc,beige,marine,moutarde,vertfonce;
+
+rouge:=conversion_cmyn_rvb(Rouge);
+vert:=conversion_cmyn_rvb(Vert);
+bleu:=conversion_cmyn_rvb(Bleu);
+marron:=conversion_cmyn_rvb(Marron);
+lime:=conversion_cmyn_rvb(Lime);
+orange:=conversion_cmyn_rvb(Orange);
+rose:=conversion_cmyn_rvb(Rose);
+pourpre:=conversion_cmyn_rvb(Pourpre);
+violet:=conversion_cmyn_rvb(Violet);
+cyan:=conversion_cmyn_rvb(Cyan);
+magenta:=conversion_cmyn_rvb(Magenta);
+jaune:=conversion_cmyn_rvb(Jaune);
+olive:=conversion_cmyn_rvb(Olive);
+noir:=conversion_cmyn_rvb(Noir);
+grisfonce:=conversion_cmyn_rvb(Grisfonce);
+gris:=conversion_cmyn_rvb(Gris);
+grisclair:=conversion_cmyn_rvb(Grisclair);
+blanc:=conversion_cmyn_rvb(Blanc);
+beige:=conversion_cmyn_rvb(Beige);
+marine:=conversion_cmyn_rvb(Marine);
+moutarde:=conversion_cmyn_rvb(Moutarde);
+vertfonce:=conversion_cmyn_rvb(Vertfonce);
+
diff --git a/Master/tlpkg/bin/tlpkg-ctan-check b/Master/tlpkg/bin/tlpkg-ctan-check
index f4444a199bc..19fe3da9e02 100755
--- a/Master/tlpkg/bin/tlpkg-ctan-check
+++ b/Master/tlpkg/bin/tlpkg-ctan-check
@@ -398,7 +398,7 @@ my @TLP_working = qw(
readarray realboxes realscripts rec-thy recipe recipecard recycle rectopma
refcheck refenums reflectgraphics refman refstyle
regcount regexpatch register regstats
- relenc relsize reotex repeatindex resphilosophica
+ relenc relsize reotex repeatindex repere resphilosophica
resumecls resumemac reverxii revtex
ribbonproofs rjlparshap rlepsf rmpage
robustcommand robustindex romanbar romande romanneg romannum
diff --git a/Master/tlpkg/tlpsrc/collection-metapost.tlpsrc b/Master/tlpkg/tlpsrc/collection-metapost.tlpsrc
index 8638db4f1d5..987993bd33a 100644
--- a/Master/tlpkg/tlpsrc/collection-metapost.tlpsrc
+++ b/Master/tlpkg/tlpsrc/collection-metapost.tlpsrc
@@ -33,6 +33,7 @@ depend mpcolornames
depend mpattern
depend mpgraphics
depend piechartmp
+depend repere
depend roex
depend slideshow
depend splines
diff --git a/Master/tlpkg/tlpsrc/repere.tlpsrc b/Master/tlpkg/tlpsrc/repere.tlpsrc
new file mode 100644
index 00000000000..e69de29bb2d
--- /dev/null
+++ b/Master/tlpkg/tlpsrc/repere.tlpsrc