texlive[63836] Master/texmf-dist: repere (8jul22)

commits+karl at tug.org commits+karl at tug.org
Fri Jul 8 23:48:12 CEST 2022


Revision: 63836
          http://tug.org/svn/texlive?view=revision&revision=63836
Author:   karl
Date:     2022-07-08 23:48:11 +0200 (Fri, 08 Jul 2022)
Log Message:
-----------
repere (8jul22)

Modified Paths:
--------------
    trunk/Master/texmf-dist/doc/metapost/repere/README.md
    trunk/Master/texmf-dist/doc/metapost/repere/repere-doc.pdf
    trunk/Master/texmf-dist/doc/metapost/repere/repere-doc.tex
    trunk/Master/texmf-dist/metapost/repere/repere.mp

Modified: trunk/Master/texmf-dist/doc/metapost/repere/README.md
===================================================================
--- trunk/Master/texmf-dist/doc/metapost/repere/README.md	2022-07-07 23:50:12 UTC (rev 63835)
+++ trunk/Master/texmf-dist/doc/metapost/repere/README.md	2022-07-08 21:48:11 UTC (rev 63836)
@@ -1,8 +1,8 @@
-Package repere - Version 21.11 - November 4, 2021
+Package repere - Version 22.07 - July 8, 2022
 
 ---
 
-This package provides MetaPost macros for drawing sec­ondary school math­e­mat­ics figures in a coordinate system :
+This package provides MetaPost macros for sec­ondary school math­e­mat­ics teachers to draw figures in a coordinate system.
 - axis, grids
 - points, vectors
 - functions (curves, tangents, integrals, sequences)
@@ -14,7 +14,8 @@
 
 ---
 
-Author : Olivier Péault   
+Author : Olivier Péault
+
 E-mail : o.peault at posteo.net
 
 Licence   : Released under the LaTeX Project Public License v1.3c or later, see http://www.latex-project.org/lppl.txt

Modified: trunk/Master/texmf-dist/doc/metapost/repere/repere-doc.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/metapost/repere/repere-doc.tex
===================================================================
--- trunk/Master/texmf-dist/doc/metapost/repere/repere-doc.tex	2022-07-07 23:50:12 UTC (rev 63835)
+++ trunk/Master/texmf-dist/doc/metapost/repere/repere-doc.tex	2022-07-08 21:48:11 UTC (rev 63836)
@@ -251,18 +251,145 @@
 input repere;
 \end{codecache}
 
-
+\part{Repères et géométrie}
 \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 possible aux besoins de l'enseignement secondaire de mathématiques.
 
+\subsection{Généralités}
+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 possible aux besoins de l'enseignement secondaire français 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 montre l'exemple 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+). De plus, la ligne \verb+input repere;+ doit apparaître dans le document contenant les figures.
 
 
-Les étiquettes (noms de points, de courbes, de vecteurs...) sont composées automatiquement au format \LaTeX{} avec le package \verb+latexmp.mp+. Il est donc nécessaire de compiler deux fois les documents.
+Les étiquettes (noms de points, de courbes, de vecteurs...) sont composées automatiquement au format \LaTeX{} avec le package \verb+latexmp.mp+. Il est donc nécessaire de compiler deux fois les documents. Cette double compilation n'est pas nécessaire si on utilise Lua\LaTeX{} avec le package \verb|luamplib|.
 
+\subsection{Figures dans un document avec \LaTeX}
+Chacun des documents peut être compilé avec la commande \verb|mpost| puis inclus dans un document à l'aide de la commande \verb|\includegraphics| du package \verb|graphicx|.
 
+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|.
+
+
+%\subsection{Code embarqué dans un document \LaTeX}
+%
+%
+%\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 repere;
+%\end{empcmds}
+%\begin{emp}(0,0)
+%  repere(-3,3,1cm,-2,2,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 repere;
+%\end{mpdefs}
+%\begin{mpdisplay}
+%  repere(-3,3,1cm,-2,2,1cm);
+%   draw axes(1,1);
+%  fin;
+%\end{mpdisplay}
+%\end{document}
+%\end{lstlisting}
+%\end{minipage}
+
+
+\subsection{Figures dans un document avec Lua\LaTeX}
+
+Il est aussi possible d'utiliser Lua\LaTeX{} avec le package \verb|luamplib|. Il faut alors charger les packages \verb|siunitx| et \verb|esvect| utilisés par \verb|repere|.
+
+\medskip
+\begin{minipage}[t]{0.45\linewidth}
+{\centering \textbf{Figure isolée}\par}
+
+
+\verb|lualatex mafigure.tex|
+
+\begin{lstlisting}[frame=single,frameround=tttt,backgroundcolor=\color{LightSteelBlue},language={[LaTeX]TeX}]
+\documentclass{standalone}
+\usepackage{fontspec}
+\usepackage{siunitx,esvect}
+\usepackage{luamplib}
+\mplibnumbersystem{decimal} %Si besoin
+\everymplib{input repere;}
+\begin{document}
+\begin{mplibcode}
+  repere(-3,3,1cm,-2,2,1cm);
+  draw axes(1,1);
+fin;
+\end{mplibcode}
+\end{document}
+\end{lstlisting}
+\end{minipage}
+\hfill
+\begin{minipage}[t]{0.45\linewidth}
+{\centering \textbf{Code embarqué}\par}
+
+
+\verb|lualatex monfichier.tex|
+
+\begin{lstlisting}[frame=single,frameround=tttt,backgroundcolor=\color{LightSteelBlue},language={[LaTeX]TeX}]
+\documentclass{article}
+\usepackage{fontspec}
+\usepackage{siunitx,esvect}
+\usepackage{luamplib}
+\mplibnumbersystem{decimal} %Si besoin
+\everymplib{verbatimtex \leavevmode etex;
+            input repere;}
+\begin{document}
+Mon texte, mon texte, mon texte
+
+\begin{mplibcode}
+  repere(-3,3,1cm,-2,2,1cm);
+  draw axes(1,1);
+fin;
+\end{mplibcode}
+
+Mon texte, mon texte, mon texte
+\end{document}
+\end{lstlisting}
+\end{minipage}
+
 \section{Repère utilisateur}
 
 \subsection{Numérotation des figures}
@@ -390,6 +517,10 @@
 \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.
+
+ \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}
@@ -403,13 +534,7 @@
 \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);
@@ -497,6 +622,12 @@
 \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+.
+
+
+\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+.
+
+
+\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}
 
 
@@ -517,9 +648,6 @@
 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}
@@ -530,11 +658,6 @@
 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);
@@ -601,9 +724,17 @@
 \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+ (qui peut être \verb|rt|, \verb|urt|, \verb|top|, \verb|ulft|...). \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.
+
+\item[nomme{[a]}(A,nom)] Il est possible d'obtenir un placement plus fin des étiquettes en remplaçant la position au sens de \MP{} (\verb|rt|, \verb|urt|...) par un nombre qui représente alors la position de l'étiquette par rapport au point en degrés.
+
+\item[nommerot.pos(A,nom)(angle)] Même chose que \verb|nomme.pos(A,nom)| mais l'étiquette est tournée d'un angle \verb|angle|.
+\item[nommerot{[a]}(A,nom)(angle)] Même chose que \verb|nomme[a](A,nom)| mais l'étiquette est tournée d'un angle \verb|angle|.
+
 \end{description}
 
 
+
+
 \begin{exemple}[0.6]
 repere(-3,3,0.9cm,-2.5,5,0.9cm);
 pair A,B,C[],D,E,F;
@@ -625,11 +756,6 @@
 draw cadre;
 fin;
 \end{exemple}
-
-\begin{description}
-\item[nomme{[a]}(A,nom)] Il est possible d'obtenir un placement plus fin des étiquettes en remplaçant la position au sens de \MP{} (\verb|rt|, \verb|urt|...) par un nombre qui représente alors la position de l'étiquette par rapport au point en degrés.
-\end{description}
-
 \begin{exemple}[0.55]
 repere(-3,3.5,1cm,-3,3,1cm);
  pair A,B,C[];
@@ -644,37 +770,63 @@
 fin;
 \end{exemple}
 
+\begin{exemple}[0.5]
+repere(-2,3,1cm,-1,3,1cm);
+ pair A,B,C;
+ A=(2,2);B=(-1,1);C=(1,0);
+ nommerot.bot(A)(60);
+ nommerot[120](B)(180);
+ nommerot[-45](C,"Nom")(40);
+ 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=(2,2);v=(2,-1);
+%A=(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]=(1,i-4);w[i]=(1.5,0.5*i-1);
+%draw vecteur.bot(C[i],w[i]);
+%endfor
+%draw cadre;
+%fin;
+%\end{exemple}
+
 \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.
+\item[drawvecteur(A,u)] Trace le représentant d'origine \verb|A| du vecteur \verb|u|. C'est l'équivalent de \verb|drawarrow A--A+u|
 \end{description}
 
-
 \begin{exemple}[0.6]
-repere(-1,5.5,0.7cm,-4,4,0.8cm);
-pair A,B,C[],u,v,w[];
-u=(2,2);v=(2,-1);
-A=(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]=(1,i-4);w[i]=(1.5,0.5*i-1);
-draw vecteur.bot(C[i],w[i]);
-endfor
-draw cadre;
+repere(-1,5,1cm,-1,4,1cm);
+ pair A,u;
+ A=(1,0);u=(3,3);
+ draw quadrillage(1,1);
+ draw axes(1,1);
+ drawvecteur(A,u) couleur bleu;
+ drawvecteur((1,3),(2,-2)) epaisseur 1;
 fin;
 \end{exemple}
 
 
-
 \section{Droites, courbes...}
 
 \subsection{Droites}
@@ -742,6 +894,19 @@
 \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.
+
+
+\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.
+
+
+\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+-iè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}
 
 
@@ -760,15 +925,6 @@
 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;
@@ -792,15 +948,7 @@
 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+-iè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;
@@ -821,9 +969,9 @@
 \end{exemple}
 
 
-\subsection{Nommage automatique des courbes}
+\subsection{Placement automatique du nom des courbes}
 \begin{description}
-\item[nomme(p,nom)] affiche \verb|nom| au niveau d'un point d'intersection de \verb|p| et du contour de la figure. Ce point est choisi en fonction de la chaine \verb|prefnomme| qui peut prendre les valeurs \verb|"right"| (valeur par défaut), \verb|"left"|, \verb|"top"| ou \verb|"bottom"|.
+\item[nomme(p,nom)] affiche \verb|nom| au niveau d'un point d'intersection de \verb|p| et du contour de la figure. La position est choisie en fonction de la chaine \verb|prefnomme| qui peut prendre les valeurs \verb|"right"| (valeur par défaut), \verb|"left"|, \verb|"top"| ou \verb|"bottom"| et de la place restante.
 \end{description}
 
 \begin{exemple}
@@ -916,6 +1064,11 @@
 \item[lagrange(A,B,C,...)(xmin,xmax)] Même courbe que précédemment mais sur l'intervalle $[xmin;xmax]$.
 \item[lagrange(x1,y1,x2,y2,x3,y3...)()]  Courbe passant par les points $(x_1;y_1)$, $(x_2;y_2)$, $(x_3;y_3)$... représentant le polynôme de degré maximal $n-1$ tel que $P(x_i)=y_i$ sur l'intervalle définissant le repère.
 \item[lagrange(x1,y1,x2,y2,x3,y3...)(xmin,xmax)] Même courbe que précédemment mais sur l'intervalle $[xmin;xmax]$.
+
+\item[hermite((x1,y1,y'1),(x2,y2,y'2)...)()] Courbe passant par les points $(x_1;y_1)$, $(x_2;y_2)$, $(x_3;y_3)$... représentant le polynôme de degré maximal $2n-1$ tel que $P(x_i)=y_i$ et $P'(x_i)=y'_i$ sur l'intervalle définissant le repère.
+\item[hermite((x1,y1,y'1),(x2,y2,y'2)...)(xmin,xmax)] Même courbe que précédemment mais sur l'intervalle $[xmin;xmax]$.
+\item[hermite(A,y'A,B,y'B,C,y'C...)()] Courbe passant par les points $A$, $B$, $C$... représentant le polynôme de degré maximal $2n-1$ tel que $P(x_A)=y_A$ et $P'(x_A)=y'_A$... sur l'intervalle définissant le repère.
+\item[hermite(A,y'A,B,y'B,C,y'C...)(xmin,xmax)] Même courbe que précédemment mais sur l'intervalle $[xmin;xmax]$.
 \end{description}
 
 \begin{exemple}[0.55]
@@ -937,14 +1090,6 @@
 fin;
 \end{exemple}
 
-
-\begin{description}
-\item[hermite((x1,y1,y'1),(x2,y2,y'2)...)()] Courbe passant par les points $(x_1;y_1)$, $(x_2;y_2)$, $(x_3;y_3)$... représentant le polynôme de degré maximal $2n-1$ tel que $P(x_i)=y_i$ et $P'(x_i)=y'_i$ sur l'intervalle définissant le repère.
-\item[hermite((x1,y1,y'1),(x2,y2,y'2)...)(xmin,xmax)] Même courbe que précédemment mais sur l'intervalle $[xmin;xmax]$.
-\item[hermite(A,y'A,B,y'B,C,y'C...)()] Courbe passant par les points $A$, $B$, $C$... représentant le polynôme de degré maximal $2n-1$ tel que $P(x_A)=y_A$ et $P'(x_A)=y'_A$... sur l'intervalle définissant le repère.
-\item[hermite(A,y'A,B,y'B,C,y'C...)(xmin,xmax)] Même courbe que précédemment mais sur l'intervalle $[xmin;xmax]$.
-\end{description}
-
 \begin{exemple}[0.55]
 repere.orth(-1,10,7cm,-1,10);
 draw quadrillage(1,1);
@@ -998,6 +1143,10 @@
 \item[spline(A,B,C...)(xmin,xmax)] Même courbe que précédemment mais sur l'intervalle $[xmin;xmax]$.
 \item[spline(xA,yA,xB,yB,xC,yC,...)()] Même courbe que précédemment (sur l'intervalle définissant le repère) mais les valeurs sont données sous forme de liste. 
 \item[spline(xA,yA,xB,yB,xC,yC...)(xmin,xmax)] Même courbe que précédemment mais sur l'intervalle $[xmin;xmax]$.
+
+
+\item[spline(A,<y'A>,B,<y'B>,C,<y'C>...)()] Courbe passant par les points $A$, $B$, $C$ représentant une fonction cubique par morceaux telle que $f(x_A)=y_A$, $f(x_B)=y_B$... et, le cas échéant, $f'(x_A)=y'_A$, $f'(x_B)=y'_B$... sur l'intervalle définissant le repère.
+\item[spline(A,<y'A>,B,<y'B>,C,<y'C>...)(xmin,xmax)] Même courbe que précédemment mais sur l'intervalle $[xmin;xmax]$.
 \end{description}
 
 \begin{exemple}[0.55]
@@ -1019,11 +1168,6 @@
 fin;
 \end{exemple}
 
-\begin{description}
-\item[spline(A,<y'A>,B,<y'B>,C,<y'C>...)()] Courbe passant par les points $A$, $B$, $C$ représentant une fonction cubique par morceaux telle que $f(x_A)=y_A$, $f(x_B)=y_B$... et, le cas échéant, $f'(x_A)=y'_A$, $f'(x_B)=y'_B$... sur l'intervalle définissant le repère.
-\item[spline(A,<y'A>,B,<y'B>,C,<y'C>...)(xmin,xmax)] Même courbe que précédemment mais sur l'intervalle $[xmin;xmax]$.
-\end{description}
-
 \begin{exemple}[0.55]
 repere.orth(-1,10,7cm,-1,10);
 pair A,B,C,D;
@@ -1043,13 +1187,23 @@
 fin;
 \end{exemple}
 
+Attention : lorsque la courbure est importante, l'utilisation de \verb|tangente| peut  donner des résultats erronés...
 
 \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}
 
 
+\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}
 repere(-0.9,7,0.8cm,-1.2,1.2,1.5cm);
 vardef u(expr n)=(-1)**n/n enddef;
@@ -1059,16 +1213,6 @@
 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;
@@ -1115,9 +1259,13 @@
 \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+$.
+
+
+\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(-3.5,6,0.7cm,-2.5,4.5,0.7cm);
 vardef f(expr x)= -(x/4)**3+0.75x enddef;
@@ -1140,11 +1288,7 @@
 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)=
@@ -1300,6 +1444,8 @@
 \subsection{Diagrammes}
 \begin{description}
 \item[diagrammebatons((v1,e1),(v2,e2),...(vn,en))] Figure formée des \verb|n| segments joignant les points \verb|(v1,e1),(v2,e2),...(vn,en)| et leur projeté sur l'axe des abscisses. Les bâtons sont surmontés d'un point dont le diamètre est égal à la largeur des segments multiplié par \verb|diampointsbatons|. \verb|diampointsbatons| est égal à 5 par défaut. On peut lui donner la valeur 0 pour ne pas avoir ces points.
+
+\item[diagrammebarres((a1,h1),(a2,h2),...(an,hn))] Figure formée de \verb|n| barres rectangulaires de hauteurs \verb|h1| \dots \verb|hn| aux abscisses \verb|a1| \dots \verb|an|. La largeur de ces barres est le nombre \verb|largbarres| qui vaut \verb|20bp| par défaut.
 \end{description}
 
 \begin{exemple}[0.6]
@@ -1312,10 +1458,6 @@
 \end{exemple}
 
 
-\begin{description}
-\item[diagrammebarres((a1,h1),(a2,h2),...(an,hn))] Figure formée de \verb|n| barres rectangulaires de hauteurs \verb|h1| \dots \verb|hn| aux abscisses \verb|a1| \dots \verb|an|. La largeur de ces barres est le nombre \verb|largbarres| qui vaut \verb|20bp| par défaut.
-\end{description}
-
 \begin{exemple}[0.6]
 repere(-0.5,5,1cm,-0.5,5,1cm);
  path diag;
@@ -1332,7 +1474,7 @@
 
 \subsection{Probabilités}
 
-Quelques fonctions mathématiques sont proposées. Pour les grandes valeurs, on dépasse rapidement les capacités de \MP. Il est dans ce cas conseillé de compiler en utilisant la ligne de commande \verb|mpost -numbersystem="decimal" <fichier>.mp|.
+Quelques fonctions mathématiques sont proposées. Pour les grandes valeurs, on dépasse rapidement les capacités de \MP. Il est dans ce cas conseillé de compiler en utilisant la ligne de commande \verb|mpost -numbersystem="decimal" <fichier>.mp| ou, avec Lua\LaTeX{} et le package \verb|luamplib|, d'utiliser \verb|\mplibnumbersystem{decimal}|.
 
 
 \begin{description}
@@ -1343,9 +1485,13 @@
 \item[diagrammeuniforme(n,m)] Diagramme en bâtons de la loi uniforme discrète sur les entiers consécutifs de \verb|n| à \verb|m|.
 \item[diagrammegeometrique(p)] Diagramme en bâtons de la loi géométrique de paramètre \verb|p|.
 \item[diagrammepoisson(lambda)] Diagramme en bâtons de la loi de Poisson de moyenne \verb|lambda|.
+
+\item[densitenormale(mu,sigma,a,b)] Courbe représentant la densité de la loi normale de moyenne \verb|mu| et d'écart type \verb|sigma| entre \verb|a| et \verb|b|. Si \verb|a| et \verb|b| sont omis, le tracé est fait sur l'intervalle définissant le repère.
+\item[densiteexponentielle(lambda)] Courbe représentant la densité de la loi normale de paramètre \verb|lambda|.
 \end{description}
 
 
+
 \begin{exemple}
 repere(-2,16,0.45cm,-0.1,0.25,15cm);
 setall(0,16,0,0.25);
@@ -1384,11 +1530,6 @@
 fin;
 \end{exemple}
 
-\begin{description}
-\item[densitenormale(mu,sigma,a,b)] Courbe représentant la densité de la loi normale de moyenne \verb|mu| et d'écart type \verb|sigma| entre \verb|a| et \verb|b|. Si \verb|a| et \verb|b| sont omis, le tracé est fait sur l'intervalle définissant le repère.
-\item[densiteexponentielle(lambda)] Courbe représentant la densité de la loi normale de paramètre \verb|lambda|.
-\end{description}
-
 \begin{codecache}
 prefnomme:="top";
 \end{codecache}
@@ -1526,9 +1667,12 @@
 \item[nomme.pos(A,O,B,texte)] Place le texte à la position \verb|pos| par rapport au point central de l'arc de cercle de centre $O$ et de rayon \verb|taille_marque_a|. \verb|pos| peut être \verb|rt|, \verb|urt|, \verb|top|, etc. ou un angle donné par rapport à la direction $(Ox)$.
 
 \item[nomme(A,O,B,texte)] Même chose que précédemment mais la position est calculée automatiquement en fonction de l'angle.
+
+\item[marqueangledroit(A,O,B)] Chemin fermé permettant de marquer l'angle droit $\widehat{AOB}$ sous forme d'un losange (il s'agit donc d'un carré si l'angle est réellement droit). Le côté du losange est \verb|taille_marque_ad| et vaut \verb|0.3cm| par défaut.
+\item[marquesegment(A,B,n)] Figure formées de \verb|n| marques sur le segment $[AB]$. Ces marques ont une taille de \verb|taille_marque_s| (\verb|0.3cm| par défaut), forment un angle en degrés de \verb|angle_marque_s| avec le segment (\verb|60| par défaut) et sont séparées de \verb|sep_marque_s| (\verb|2| par défaut).
+\item[marquesegment(A,B,C,D,...,n)] Permet de marquer plusieurs segments simultanément.
 \end{description}
 
-
 \begin{exemple}
 repere(-2,12,0.4cm,-2,10,0.4cm);
 pair A,B,C;
@@ -1546,10 +1690,6 @@
 fin;
 \end{exemple}
 
-\begin{description}
-\item[marqueangledroit(A,O,B)] Chemin fermé permettant de marquer l'angle droit $\widehat{AOB}$ sous forme d'un losange (il s'agit donc d'un carré si l'angle est réellement droit). Le côté du losange est \verb|taille_marque_ad| et vaut \verb|0.3cm| par défaut.
-\item[marquesegment(A,B,n)] Figure formées de \verb|n| marques sur le segment $[AB]$. Ces marques ont une taille de \verb|taille_marque_s| (\verb|0.3cm| par défaut), forment un angle en degrés de \verb|angle_marque_s| avec le segment (\verb|60| par défaut) et sont séparées de \verb|sep_marque_s| (\verb|2| par défaut).
-\end{description}
 
 \begin{exemple}[0.6]
 repere(-1,10,0.5cm,-1,9,0.5cm);
@@ -1556,18 +1696,16 @@
 pair A,B,C,A',B',C',u;
 A=(3,1);B=(5,2);C=(1,5);u=(3,3);
 A'-A=B'-B=C'-C=u;
-draw projectionaxes(A,"$x_A$","$y_A$") dashed evenly;
 draw axes(0,0);
 drawoptions(withcolor pourpre);
 draw triangle(A,B,C);draw triangle(A',B',C');
+nomme.llft(A);nomme.lrt(B);nomme.ulft(C);
+nomme.llft(A');nomme.lrt(B');nomme.ulft(C');
 draw marqueangledroit(B,A,C);
 draw marqueangledroit(B',A',C');
 draw marquesegment(B,C,2);
 draw marquesegment(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);
+draw marquesegment(A,C,A',C',1);
 fin;
 \end{exemple}
 
@@ -1578,6 +1716,16 @@
 \item[cote(A,B,texte)] Figure formée du texte orienté dans la direction du segment $[AB]$, placé au niveau du milieu et situé « sous » le segment.
 
 \item[cote.top(A,B,texte)] Même chose mais le texte est placé au-dessus du segment.
+
+\item[angle\_cote] Variable numérique qui fixe l'angle de rotation de l'étiquette. La valeur par défaut de $-1$ indique que l'étiquette est tournée en fonction de l'angle du segment.
+\item[cotefleche(A,B,texte)] Figure formée d'une double flèche et du texte orienté dans la direction du segment $[AB]$, placés au niveau du milieu et situés « sous » le segment.
+
+\item[cotefleche.top(A,B,texte)] Même chose mais la double flèche et le texte sont placés au-dessus du segment.
+
+\item[dec\_cote] Variable numérique qui indique le décalage entre le segment et la double flèche. La valeur par défaut est \SI{4}{mm}.
+
+\item[traits\_cote] Variable booléenne qui indique si des traits délimitant la double flèche doivent être tracés. La valeur par défaut est \verb|false|.
+
 \end{description}
 
 \begin{exemple}
@@ -1584,9 +1732,7 @@
 repere(0,6,1cm,0,6,1cm);
 pair A,B,C;
 A=(1,1);B=(2,5);C=(5,2);
-nomme.llft(A);
-nomme.top(B);
-nomme.lrt(C);
+nomme.llft(A);nomme.top(B);nomme.lrt(C);
 draw triangle(A,B,C);
 cote(A,C,"\SI{5}{cm}");
 cote(B,C,"de $B$ vers $C$") couleur rouge;
@@ -1595,24 +1741,29 @@
 fin;
 \end{exemple}
 
-\begin{description}
-\item[cotefleche(A,B,texte)] Figure formée d'une double flèche et du texte orienté dans la direction du segment $[AB]$, placés au niveau du milieu et situés « sous » le segment.
 
-\item[cotefleche.top(A,B,texte)] Même chose mais la double flèche et le texte sont placés au-dessus du segment.
 
-\item[dec\_cote] Variable numérique qui indique le décalage entre le segment et la double flèche. La valeur par défaut est \SI{4}{mm}.
+\begin{exemple}
+repere(0,6,1cm,0,6,1cm);
+pair A,B,C;
+A=(1,1);B=(2,5);C=(5,2);
+nomme.llft(A);nomme.top(B);nomme.lrt(C);
+draw triangle(A,B,C);
+angle_cote:=90;
+cote.top(A,B,"10");
+angle_cote:=0;
+cote(A,C,"5");
+angle_cote:=-1;
+cote(B,C,"de $B$ vers $C$") couleur rouge;
+fin;
+\end{exemple}
 
-\item[traits\_cote] Variable booléenne qui indique si des traits délimitant la double flèche doivent être tracés. La valeur par défaut est \verb|false|.
 
-\end{description}
-
 \begin{exemple}
 repere(0,6,1cm,0,6,1cm);
 pair A,B,C;
 A=(1,1);B=(2,5);C=(5,2);
-nomme.llft(A);
-nomme.top(B);
-nomme.lrt(C);
+nomme.llft(A);nomme.top(B);nomme.lrt(C);
 draw triangle(A,B,C);
 cotefleche(A,C,"\SI{5}{cm}");
 cotefleche.top(A,B,"Texte") couleur rouge;
@@ -1622,6 +1773,270 @@
 fin;
 \end{exemple}
 
+\subsection{Figures complètes}
+Par rapport aux polygones décrits précédemment, les macros qui suivent diffèrent dans le sens où ce ne sont pas des chemins (paths) mais des figures « complètes ».
+
+D'une part, les points sont définis (selon les données passées par l'utilisateur) puis la figure est tracée avec noms et légendes. Des macros pour ne faire que la définition des points ou que le tracé quand les points sont déjà définis sont décrites plus loin.
+
+Pour les distinguer, leur nom commence par une majuscule.
+
+\subsubsection*{Figures}
+
+\begin{description}
+\item[Segment(A,B)(longueur,ptdepart,angle)(légende)] Figure formée du segment $[AB]$, des noms des points et de la cote.
+
+Les points doivent être déclarés mais s'ils n'existent pas, il sont définis de sorte que le segment mesure \verb|longueur|, démarre à \verb|ptdepart| et fasse l'angle \verb|angle| avec l'horizontale. \verb|ptdepart| vaut \verb|(0,0)| par défaut et \verb|angle| vaut \verb|0|.
+
+Les noms des points et la cote peuvent être éventuellement modifiés dans \verb|légende|.
+
+\item[Vecteur(u,A,B)(longueur,ptdepart,angle)(légende)] Figure formée du représentant du vecteur $\vect{u}$ d'origine $A$, des noms des points et du vecteur.
+
+Les points et le vecteur doivent être déclarés mais s'ils n'existent pas, il sont définis de sorte que le vecteur ait une norme de \verb|longueur|, pour origine \verb|ptdepart| et fasse l'angle \verb|angle| avec l'horizontale. \verb|ptdepart| vaut \verb|(0,0)| par défaut et \verb|angle| vaut \verb|0|.
+
+Les noms des points et du vecteur peuvent être éventuellement modifiés dans \verb|légende|.
+
+
+\item[TriangleLLL(A,B,C)(longAB,longAC,longBC,ptdepart,angle)(points)(cotes)(angles)] Figure formée du triangle $ABC$, donné par trois longueurs, et des noms des points, cotes et angles. \verb|ptdepart| vaut \verb|(0,0)| par défaut et \verb|angle| vaut \verb|0|.
+
+Les étiquettes sont composées automatiquement mais peuvent être modifiées en passant des valeurs à \verb|(points)|, \verb|(cotes)| ou \verb|(angles)|.
+
+\item[TriangleLLA(A,B,C)(longAB,longAC,angleA,ptdepart,angle)(points)(cotes)(angles)] Figure formée du triangle $ABC$, donné par deux longueurs et un angle, et des noms des points, cotes et angles. \verb|ptdepart| vaut \verb|(0,0)| par défaut et \verb|angle| vaut \verb|0|.
+
+Les étiquettes sont composées automatiquement mais peuvent être modifiées en passant des valeurs à \verb|(points)|, \verb|(cotes)| ou \verb|(angles)|.
+
+\item[TriangleLAA(A,B,C)(longAB,angleA,angleB,ptdepart,angle)(points)(cotes)(angles)] Figure formée du triangle $ABC$, donné par une longueur et deux angles, et des noms des points, cotes et angles. \verb|ptdepart| vaut \verb|(0,0)| par défaut et \verb|angle| vaut \verb|0|.
+
+Les étiquettes sont composées automatiquement mais peuvent être modifiées en passant des valeurs à \verb|(points)|, \verb|(cotes)| ou \verb|(angles)|.
+\end{description}
+
+
+\begin{exemple}
+repere(-1,6,1cm,-1,6,1cm);
+pair A,B,C,D,E,F;
+draw quadrillage(1,1);
+draw Segment(A,B)(4,(1,5),-20)();
+draw Segment(C,D)(2.52,10)("$x$")
+                               couleur bleu;
+E:=(1,2);
+draw Segment(E,F)(3)("$l$","$M$","$N$")
+                              couleur rouge;
+fin;
+\end{exemple}
+
+
+\begin{exemple}[0.53]
+repere(-1,6,1cm,-1,6,1cm);
+pair A,B,C,D,E,F,u,v,w;
+draw quadrillage(1,1);
+draw Vecteur(v,B,C)(3,(1,4),10)();
+A:=(0,1);u:=(3,-1);
+draw Vecteur(u,A)()() couleur rouge
+                                  dashed evenly;
+D:=(1,2);
+draw Vecteur(w,D)(4)("$\vv{MN}$","$M$","$N$")
+                                   couleur bleu;
+fin;
+\end{exemple}
+
+
+\begin{exemple}
+repere(-1,6,1cm,-5,6,1cm);
+pair A,B,C,D,E,F,G,H,I;
+angle_cote:=0;
+draw quadrillage(1,1);
+draw TriangleLLL(A,B,C)(4,3,2,(0,4))()()()
+                                 couleur bleu;
+draw TriangleLLA(D,E,F)(4,3,45)
+      ()()("$\alpha$","$\beta$","$\gamma$")
+                                couleur rouge;
+G:=(0,-4);
+draw TriangleLAA(G,H,I)(4,60,40,10)
+               ("$O$")("$a$","$b$","$c$")();
+fin;
+\end{exemple}
+
+
+\subsubsection*{Paramètres}
+\begin{description}
+\item[AffPoints] Booléen qui indique si les noms des points doivent être affichés. La valeur par défaut est \verb|true|. Les noms sont affichés quelle que soit la valeur de \verb|AffPoints| si le nom est donné explicitement.
+
+\item[AffCotes] Booléen qui indique si la cote des segment doit être affichée. La valeur par défaut est \verb|true|. La cote est affichée quelle que soit la valeur de \verb|AffCotes| si une cote est donnée explicitement.
+
+\item[UnitCotes] Chaine de caractère qui indique l'unité à rajouter à la cote lorsqu'elle est composée automatiquement. La valeur par défaut est la chaine vide.
+
+\item[ArrondiCotes] Valeur entière qui indique à quelle décimale la cote doit être arrondie lorsqu'elle est affichée automatiquement.
+
+\item[AffVect] Booléen qui indique si le nom du vecteur doit être affiché. La valeur par défaut est \verb|true|. Le nom sont affiché quelle que soit la valeur de \verb|AffVect| s'il est donné explicitement.
+
+\item[AffAngles] Booléen qui indique si les angles doivent être marqués et leur nom affiché. La valeur par défaut est \verb|false|. Les noms sont affichés quelle que soit la valeur de \verb|AffAngles| si le nom est donné explicitement.
+\item[ArrondiAngles] Valeur entière qui indique à quelle décimale l'angle doit être arrondi lorsqu'il est affiché automatiquement.
+\item[EchelleAngles] Valeur numérique indiquant le facteur d'échelle de l'affichage des angles. La valeur par défaut est \verb|0.8|.
+\item[AutoAngleDroit] Booléen qui indique si les angles droits doivent être marqués comme tels. La valeur par défaut est \verb|false|.
+
+\item[AffDonnees] Booléen qui permet de n'afficher que les valeurs des côtés et des angles correspondant aux données. La valeur par défaut est \verb|false|.
+\end{description}
+
+
+\begin{exemple}
+repere(-1,6,1cm,-1,6,1cm);
+pair A,B,C,D,E,F;
+draw quadrillage(1,1);
+UnitCotes:="cm";
+draw Segment(A,B)(4,(1,5),-20)();
+AffPoints:=false;
+ArrondiCotes:=1;
+draw Segment(C,D)(2.52,10)() couleur bleu;
+E:=(1,2);
+draw Segment(E,F)(3)("$l$","$M$","$N$")
+                               couleur rouge;
+fin;
+\end{exemple}
+\begin{codecache}
+ArrondiCotes:=2;
+AffPoints:=true;
+UnitCotes:="";
+\end{codecache}
+
+
+\begin{exemple}[0.53]
+repere(-1,6,1cm,-1,6,1cm);
+pair A,B,C,D,u,v,w;
+draw quadrillage(1,1);
+AffVect:=false;
+draw Vecteur(v,B,C)(3,(1,4),10)();
+A:=(0,1);u:=(3,-1);
+AffVect:=true;
+AffPoints:=false;
+draw Vecteur(u,A)()() couleur rouge
+                                  dashed evenly;
+D:=(1,2);
+draw Vecteur(w,D)(4)("$\vv{MN}$","$M$","$N$")
+                                   couleur bleu;
+fin;
+\end{exemple}
+
+\begin{codecache}
+AffPoints:=true;
+\end{codecache}
+
+\begin{exemple}
+repere(-1,6,1cm,-5,6,1cm);
+pair A,B,C,D,E,F,G,H,I;
+draw quadrillage(1,1);
+angle_cote:=0;
+AffAngles:=true;
+draw TriangleLLL(A,B,C)(4,3,2,(0,4))()()()
+                                couleur bleu;
+ArrondiAngles:=2;
+EchelleAngles:=0.6;
+draw TriangleLLA(D,E,F)(4,3,45)()()()
+                               couleur rouge;
+G:=(0,-4);
+EchelleAngles:=0.8;
+AutoAngleDroit:=true;
+draw TriangleLAA(G,H,I)(5,60,30,10)
+             ("$O$")("$a$","$b$","$c$")();
+fin;
+\end{exemple}
+
+\begin{codecache}
+AutoAngleDroit:=false;
+ArrondiAngles:=1;
+AffAngles:=false;
+\end{codecache}
+
+\begin{exemple}
+repere(-1,6,1cm,-5,6,1cm);
+pair A,B,C,D,E,F,G,H,I;
+angle_cote:=0;
+AffDonnees:=true;
+draw quadrillage(1,1);
+draw TriangleLLL(A,B,C)(4,3,2,(0,4))()()()
+                                 couleur bleu;
+draw TriangleLLA(D,E,F)(4,3,45)
+      ()()("$\alpha$","$\beta$","$\gamma$")
+                                couleur rouge;
+G:=(0,-4);
+draw TriangleLAA(G,H,I)(4,60,40,10)
+               ("$O$")("$a$","$b$","$c$")();
+fin;
+\end{exemple}
+\begin{codecache}
+AffDonnees:=false;
+\end{codecache}
+
+\subsubsection*{Définitions seules}
+
+\begin{description}
+\item[defSegment(A,B)(longueur,ptdepart,angle)] Macro permettant de définir les points $A$ et $B$ sans dessiner le segment.
+
+\item[defVecteur(u,A,B)(longueur,ptdepart,angle)] Macro permettant de définir les points $A$ et $B$ et le vecteur $\vect{u}$ sans les dessiner.
+
+\item[defTriangleLLL(A,B,C)(longAB,longAC,longBC,ptdepart,angle)] Macro permettant de définir les points $A$, $B$ et $C$ sans dessiner le triangle.
+
+\item[defTriangleLLA(A,B,C)(longAB,longAC,angleA,ptdepart,angle)]  Macro permettant de définir les points $A$, $B$ et $C$ sans dessiner le triangle.
+
+\item[defTriangleLAA(A,B,C)(longAB,angleA,angleB,ptdepart,angle)]  Macro permettant de définir les points $A$, $B$ et $C$ sans dessiner le triangle.
+\end{description}
+
+
+\begin{exemple}
+repere(0,6,1cm,0,6,1cm);
+pair A,B,C,D,E,F;
+draw quadrillage(1,1);
+A:=(1,1);
+defSegment(A,B)(4,70);
+defSegment(B,C)(3);
+draw A--B--C;
+nomme.llft(A);nomme.ulft(B);
+nomme.rt(C);
+fin;
+\end{exemple}
+
+\begin{exemple}
+repere(-1,6,1cm,0,5,1cm);
+pair A,B,C,D,E,F,u,v,w,ve;
+draw quadrillage(1,1);
+defVecteur(u,A,B)(3,(2,1),30);
+draw A--B;
+nomme.llft(A);nomme.urt(B);
+defVecteur(v)(4,70);
+C:=(0,1);
+draw C--(C+v);
+nomme.llft(C);
+fin;
+\end{exemple}
+
+\begin{exemple}
+repere(-1,5,1cm,-1,3,1cm);
+pair A,B,C;
+draw quadrillage(1,1);
+defTriangleLLL(A,B,C)(4,3,2,15);
+nomme.llft(A);nomme.rt(B);
+nomme.top(C);
+fin;
+\end{exemple}
+
+\subsubsection*{Tracé seul}
+
+Si les points sont définis, on peut utiliser la macro de tracé ci-dessous.
+
+\begin{description}
+\item[Triangle(A,B,C)(points)(cotes)(angles)] Figure formée du triangle $ABC$ et des noms des points, cotes et éventuellement des angles.
+\end{description}
+
+
+\begin{exemple}
+repere(-1,5,1cm,-1,4,1cm);
+pair D,E,F;
+angle_cote:=0;
+draw quadrillage(1,1);
+D:=(0,0);E:=(4,1);F:=(2,3);
+draw Triangle(D,E,F)()()();
+fin;
+\end{exemple}
+
+
 \section{Divers}
 \subsection{Composition des étiquettes}
 Tous les textes et étiquettes peuvent être composés en utilisant la macro ci-dessous.
@@ -1803,99 +2218,7 @@
 
 
 
-\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 repere;
-\end{empcmds}
-\begin{emp}(0,0)
-  repere(-3,3,1cm,-2,2,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 repere;
-\end{mpdefs}
-\begin{mpdisplay}
-  repere(-3,3,1cm,-2,2,1cm);
-   draw axes(1,1);
-  fin;
-\end{mpdisplay}
-\end{document}
-\end{lstlisting}
-\end{minipage}
-
-
-Il est aussi possible d'utiliser Lua\LaTeX{} avex le package \verb|luamplib|. Il faut alors charger les packages \verb|siunitx| et \verb|esvect| utilisés par \verb|repere|.
-
-\begin{center}
-\begin{minipage}[t]{0.5\linewidth}
-{\centering \textbf{Utilisation de Lua\LaTeX}\par}
-
-
-\verb|lualatex monfichier.tex|
-
-\begin{lstlisting}[frame=single,frameround=tttt,backgroundcolor=\color{LightSteelBlue},language={[LaTeX]TeX}]
-\documentclass{article}
-\usepackage{fontspec}
-\usepackage{siunitx}
-\usepackage{esvect}
-\usepackage{luamplib}
-\mplibnumbersystem{double} % Si nécessaire
-\begin{document}
-\everymplib{input repere;}
-\begin{mplibcode}
-  repere(-3,3,1cm,-2,2,1cm);
-  draw axes(1,1);
-fin;
-\end{mplibcode}
-\end{document}
-\end{lstlisting}
-\end{minipage}
-\end{center}
-
 \section{Dessin à main levée avec \texttt{geometriesyr}}
 
 \label{exgeom}Il est possible, dans une figure créée avec \verb+repere+, d'utiliser le \og dessin à main levée \fg{} de \verb+geometriesyr+. Il faut alors charger \verb+geometriesyr+ \emph{avant} \verb|repere| et utiliser les fonctions de dessin telles que \verb|cercles|, \verb|triangle|...
@@ -1916,9 +2239,11 @@
 fin;
 \end{exemple}
 
-\section{Tableaux et grilles}
+\newpage
+\part{Tableaux et grilles}
 Il est possible d'utiliser \verb|repere| pour représenter des tableaux ou « damiers » et placer des objets dans chacune des cases. La figure devra alors débuter par une commande \verb|tableau| au lieu de la commande \verb|repere| et la numérotation sera automatique.
 
+\section{Définition et grilles}
 \subsection{Définition du tableau}
 
 \begin{description}
@@ -1984,6 +2309,7 @@
 fin;
 \end{exemple}
 
+\section{Repérage et cases}
 \subsection{Coordonnées}
 
 \begin{description}
@@ -2091,7 +2417,7 @@
 fin;
 \end{exemple}
 
-\subsection{Quelques dessins}
+\section{Quelques dessins}
 
 
 \begin{center}
@@ -2249,9 +2575,9 @@
 \end{center}
 
 
-\subsection{Exemples}
+\section{Exemples}
 
-\subsubsection*{Mots croisés}
+\subsection{Mots croisés}
 
 \begin{exemple}
 def moth(expr ch,n,m)=
@@ -2273,7 +2599,7 @@
 
 \end{exemple}
 
-\subsubsection*{Sudokus}
+\subsection{Sudokus}
 
 \begin{exemple}
 tableau(9,9,0.8cm);
@@ -2291,7 +2617,7 @@
 fin;
 \end{exemple}
 
-\subsubsection*{Dames}
+\subsection{Dames}
 
 \begin{exemple}
 tableau(10,10,0.8cm);
@@ -2312,7 +2638,7 @@
 fin;
 \end{exemple}
 
-\subsubsection*{Bataille navale}
+\subsection{Bataille navale}
 
 \begin{exemplev}{1}
 tableau(10,10,0.8cm);
@@ -2330,7 +2656,7 @@
 fin;
 \end{exemplev}
 
-\subsubsection*{Algoréa}
+\subsection{Algoréa}
 
 \begin{exemplev}{1}
 tableau(13,5,1cm);

Modified: trunk/Master/texmf-dist/metapost/repere/repere.mp
===================================================================
--- trunk/Master/texmf-dist/metapost/repere/repere.mp	2022-07-07 23:50:12 UTC (rev 63835)
+++ trunk/Master/texmf-dist/metapost/repere/repere.mp	2022-07-08 21:48:11 UTC (rev 63836)
@@ -2,7 +2,7 @@
 %%                        repere.mp                           %%
 %%   Macros pour la construction de figures dans un repère    %%
 %%                    o.peault at posteo.net                     %%
-%%                 Version 19.06 (Juin 2019)                  %%
+%%               Version 22.07 (Juillet 2022)                 %%
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %
 % This work may be distributed and/or modified under the conditions of
@@ -16,6 +16,9 @@
 % Juin 2019 : demi-droites, nomme[<angle>]
 % Mars 2020 : filldraw
 % Octobre 2021 : nommerot, cote
+% Juin 2022 : marquesegment plusieurs segments
+%             angle_cote
+%             segments, vecteurs, polygones complets
 % À faire : extratextx, extratexty
 
 input format;
@@ -89,7 +92,7 @@
 %%%%%%%%%% Définition du repère
 
 vardef repere@#(text t)=
- if (str @#="") or (str @#="larg") or (str @#="orth") or (str @#="prop"): 
+ if (str @#="") or (str @#="larg") or (str @#="width") or (str @#="orth") or (str @#="prop"): 
     definitionrepere@#(t)
  else:
     reperenum@#(t)
@@ -113,7 +116,7 @@
   _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))
+  if (str @#="larg") or (str @#="width"): _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;
@@ -1016,7 +1019,7 @@
    pair $;
    string ch,latch;
    picture dess;
-   if (ASCII str @# < 58) or (ASCII str @# = 91):
+   if ((ASCII str @# < 58) or (ASCII str @# = 91)) and (str @#<>""):
        def mylabel = labelang enddef
    else:
        def mylabel = label enddef
@@ -1240,7 +1243,7 @@
 enddef;
 
 
-
+% obsolète juin 2022
 vardef vecteur@#(expr A)(text t)=
    save $,ch,m;
    picture $;
@@ -1258,6 +1261,13 @@
    $
 enddef;
 
+% juin 2022
+def drawvecteur(expr A,u)=
+  drawarrow A--A+u
+enddef;
+
+
+
 vardef marquepointcourbefig(suffix p)(text t)=
    save $;
    picture $;
@@ -1676,7 +1686,7 @@
     else:
        pta:=ptb;
        ptb:=i;
-       if x< redpart ptb: sortie:=true fi;
+       if x<= redpart ptb: sortie:=true fi;
     fi;
     exitif sortie;
   endfor
@@ -1819,11 +1829,11 @@
 numeric longtan;
 longtan:=20;
 
-vardef tangentefleche@# (suffix p)(text tt) =
-   save t,$,pp,i,N;
+vardef tangentefleche@# (expr p)(text tt) =
+   save t,$,pp,i,N,c;
 pair senstan.gauche,senstan.droite,senstan.double;
 senstan.gauche=(1,0);senstan.droite=(0,1);senstan.double=(1,1);
-   numeric N[],i;
+   numeric N[],i,c;
    i:=0;
    pair _v,M;
    picture $;
@@ -1831,6 +1841,7 @@
    if i=1: N2:=longtan fi;
    (t,whatever) = p intersectiontimes ((N1,Ymin)--(N1,Ymax));
    M:=point t of p;
+   c:= ypart direction t of p;
    _v:=N2*unitvector(direction t of p);
    $=image(%
 		MarquePoint(M);
@@ -1837,17 +1848,22 @@
 		if (xpart senstan@#) <> 0: olddrawarrow _cart(M)--_cart(M)-_v*(xpart senstan@#) fi;
 		if (ypart senstan@#) <> 0: olddrawarrow _cart(M)--_cart(M)+_v*(ypart senstan@#) fi;
     );
+%   $=image(%
+%    drawdblarrow (M-)--(M+ )
+%   );
    $
 enddef;
 
 vardef tangentedroite(expr p,a) =
- save $,m,M,t;
+ save $,m,M,t,c;
  path $;
- numeric m,t;
+ numeric m,t,c;
  pair M;
  (t,whatever) = p intersectiontimes ((a,Ymin)--(a,Ymax));
  M:=point t of p;
- $=M-_diag*unitvector(direction t of p)--M+_diag*unitvector(direction t of p);
+ c:= (ypart direction t of p)/(xpart direction t of p);
+% $=M-_diag*unitvector(direction t of p)--M+_diag*unitvector(direction t of p);
+ $=droite(c,ypart M - (xpart M)*c);
  $
 enddef;
 
@@ -2602,7 +2618,8 @@
    ((-taille_marque_s*unitvector(_cart(A)-_cart(B))/2)--(taille_marque_s*unitvector(_cart(A)-_cart(B))/2)) rotated angle_marque_s
 enddef;
 
-vardef marquesegment(expr A,B,n)=
+
+vardef marqueseg(expr A,B,n)=
  save $;
  picture $;
  $=image(
@@ -2613,8 +2630,735 @@
   $ shifted milieu(_cart(A),_cart(B))
 enddef;
 
+vardef marquesegment(text t)=
+ save n,N,Pti,Ptii,tmpfig;
+ numeric n,N;
+ picture tmpfig;
+ pair Pti,Ptii;
+ N:=0;
+ for i=t:
+   if numeric i: n:=i fi;
+ endfor
+ tmpfig:=image(%
+ for i=t:
+  N:=N+1;
+  if ((N mod 2) = 1) and (pair i):
+     Pti := i;
+  elseif pair i:
+     Ptii := i;
+     draw marqueseg(Pti,Ptii,n);
+  fi;
+ endfor
+     );
+  tmpfig
+enddef;
 
 
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%   FIGURES GÉOMÉTRIQUES COMPLÈTES   %%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+boolean AffPoints, AffCotes, AffAngles, AffVect, AffDonnees;
+AffPoints:=true; % 
+AffCotes:=true;
+AffAngles:=false;
+AffVect:=true;
+AffDonnees:=false;
+
+string UnitCotes;
+UnitCotes:="";
+
+numeric ArrondiCotes,ArrondiAngles,EchelleAngles;
+boolean AutoAngleDroit;
+ArrondiCotes:=2;
+ArrondiAngles:=1;
+EchelleAngles:=0.8;
+AutoAngleDroit:=false;
+
+numeric rep_int_arr;
+if numbersystem="decimal": rep_int_arr:= 9 else: rep_int_arr:=4 fi;
+
+numeric rep_type_triangle; %0 : lll ; 1 : lla ; 2 : lla
+
+vardef AffichageCoteSansUnite(expr nb,arr)=
+   "\num[round-pad = false,round-mode=places,round-precision=" & decimal(arr) & "]{" & decimal(nb) & "}"
+enddef;
+
+vardef AffichageCoteAvecUnite(expr nb,arr,unit)=
+   "\SI[round-pad = false,round-mode=places,round-precision=" & decimal(arr) & "]{" & decimal(nb) & "}{" & unit & "}"
+enddef;
+
+%vardef AffichageAngle(expr nb,arr)=
+%   "\ang[round-mode=places,round-pad = false,drop-zero-decimal,round-precision=" & decimal(arr) & "]{" & decimal(nb) & "}"
+%enddef;
+
+vardef AffichageAngle(expr nb,arr)=
+   "\ang{" & decimal(arrondi(10**(arr),nb)) & "}"
+enddef;
+
+
+%
+%%%%%%%%%%%%%%%%   Segments   %%%%%%%%%%%%%%%
+
+
+vardef SegmentComplet(expr AA,BB)(expr chAA,chBB,cotei) text t=
+%% Les extrémités étant données, trace le segment, le nom des points et la cote
+%% La position du nom est calculée automatiquement
+  save tmp,anghh,tmpana,tmpanb;
+  picture tmp;
+  numeric anghh,tmpana,tmpanb;
+  anghh:=angle(BB-AA);
+  tmpana=anghh+180 ;
+  tmpanb=anghh ;
+  tmp:=image(%
+    draw AA--BB t;
+    nomme[tmpana](AA,chAA) t withpen currentpen;
+    nomme[tmpanb](BB,chBB) t withpen currentpen;
+    cote(AA,BB,cotei) t;
+  );
+  tmp
+enddef;
+
+numeric ll_seg;
+
+vardef defSegment(suffix AA,BB)(text s)=
+%% Définit les points AA et BB en fonction de la longueur, le point de départ et l'angle
+  save count_tmp,anghh,posAA;
+  numeric count_tmp,anghh;
+  pair posAA;
+  posAA:=(0,0);anghh:=0;ll_seg:=0;
+  count_tmp:=0;
+    for i=s:
+      count_tmp:=count_tmp+1;
+      if count_tmp=1:
+        ll_seg:=i
+      elseif pair i:
+        posAA:=i
+      else:
+        anghh:=i
+      fi;
+    endfor
+  % Point A
+  if unknown AA: AA:=posAA fi;
+  % Point B
+  if unknown BB:
+        BB:=(ll_seg,0) rotated anghh shifted AA;
+  else: %du coup, on change la valeur de l et angh
+        ll_seg:=abs(BB-AA);anghh:=angle(BB-AA);
+  fi;
+enddef;
+
+vardef Segment(suffix AA,BB)(text s)(text t)=
+%% Macro utilisateur, definit les points A et B et trace la figure complète en fonctions des données
+  save ll_seg,posAA,anghh,count_tmp,chAA,chBB,chcote;
+  numeric ll_seg,anghh,count_tmp;
+  string chAA,chBB,chcote;
+  defSegment(AA,BB)(s);
+  count_tmp:=0;
+  if AffCotes:
+     if ll_seg=0:
+       chcote:=decimal(abs(BB-AA))
+     else:
+       chcote:=decimal(ll_seg)
+     fi;
+     if UnitCotes<>"":
+       chcote:="\SI[round-pad = false,round-mode=places,round-precision=" & decimal(ArrondiCotes) & "]{" & chcote & "}{" & UnitCotes & "}"
+     else:
+       chcote:="\num[round-pad = false,round-mode=places,round-precision=" & decimal(ArrondiCotes) & "]{" & chcote & "}";
+     fi
+  else:
+     chcote:=""
+  fi;
+  if AffPoints:
+     chAA:="$" & _chaine(AA) & "$";
+     chBB:="$" & _chaine(BB) & "$";
+  else:
+    chAA:="";chBB:="";
+  fi;
+  for i=t:
+    count_tmp:=count_tmp+1;
+    if count_tmp = 1: chcote:=i
+    elseif count_tmp=2: chAA:=i
+    else: chBB:=i
+    fi;
+  endfor
+  SegmentComplet(AA,BB)(chAA,chBB,chcote)
+enddef;
+
+
+
+
+%%%%%%%%%%%%%%%%   Vecteurs   %%%%%%%%%%%%%%%
+
+
+vardef VecteurComplet(expr AA,uu)(expr chAA,chBB,cotei) text t=
+%% Les extrémités étant données, trace le vecteur, le nom des points et le nom du vecteur
+%% La position des noms est calculée automatiquement
+  save tmp,anghh,tmpana,tmpanb,marque_p_tmp;
+  string marque_p_tmp;
+  picture tmp;
+  numeric anghh,tmpana,tmpanb;
+  anghh:=angle(uu);
+  tmpana=anghh+180 ;
+  tmpanb=anghh ;
+  marque_p_tmp:=marque_p;
+  tmp:=image(%
+    drawarrow AA--(AA+uu) t;
+    nomme[tmpana](AA,chAA) t withpen currentpen;
+    marque_p:="";
+    nomme[tmpanb](AA+uu,chBB) t;
+    marque_p:=marque_p_tmp;
+    cote(AA,AA+uu,cotei) t;
+  );
+  tmp
+enddef;
+
+pair AA_vect,uu_vect;
+
+vardef defVecteur(text t)(text s)=
+%% t peut être (u), (u,A) ou (u,A,B)
+%% Définit le vecteur u et, éventuellement, les points AA et BB en fonction de la longueur, le point de départ et l'angle
+  save anghh,count_tmp,ufixe,ll,posAA,anghh;
+  numeric anghh,count_tmp,ll;
+  pair posAA;
+  boolean ufixe;
+  ufixe:=false;
+  count_tmp:=0;
+  posAA:=(0,0);anghh:=0;ll:=0;
+  for i=s:
+    count_tmp:=count_tmp+1;
+    if count_tmp=1:
+      ll:=i
+    elseif pair i:
+      posAA:=i
+    else:
+      anghh:=i
+    fi;
+  endfor
+  count_tmp:=0;
+  forsuffixes i=t:
+    count_tmp:=count_tmp+1;
+    if count_tmp=1:
+       if unknown i:
+         i:=(ll,0) rotated anghh;
+         uu_vect:=i
+       else:
+         uu_vect:=i
+%         ll:=abs(uu_vect);anghh:=angle(uu_vect)
+       fi;
+    elseif count_tmp=2:
+       if unknown i: i:=posAA fi;
+       AA_vect:=i;
+    else:
+       i:=AA_vect+uu_vect
+    fi;
+  endfor
+enddef;
+
+
+vardef Vecteur(text q)(text s)(text t) text r=
+%% Macro utilisateur, definit le vecteur u et éventuellement les points A et B et trace la figure complète en fonctions des données
+  save tmp,posAA,count_tmp,chAA,chBB,chvect,AA_vect,uu_vect,ch;
+  numeric count_tmp;
+  pair posAA,AA_vect,uu_vect;
+  string chAA,chBB,chvect,ch;
+  picture tmp;
+  defVecteur(q)(s);
+  chAA:="";chBB:="";chvect:="";
+  count_tmp:=0;
+  forsuffixes i=q:
+    count_tmp:=count_tmp+1;
+    ch:=_chaine(i);
+    if count_tmp=1:
+       if AffVect: chvect:="$\vv{" & ijmath(ch) & "}$" fi
+    elseif count_tmp=2:
+       if AffPoints: chAA:="$" & ch & "$" fi
+    else:
+       if AffPoints: chBB:="$" & ch & "$" fi
+    fi;
+  endfor
+  count_tmp:=0;
+  for i=t:
+    count_tmp:=count_tmp+1;
+    if count_tmp = 1: chvect:=i
+    elseif count_tmp=2: chAA:=i
+    else: chBB:=i
+    fi;
+  endfor
+  VecteurComplet(AA_vect,uu_vect)(chAA,chBB,chvect) r
+enddef;
+
+
+%%%%%%%%%%%%%%%%   Triangles   %%%%%%%%%%%%%%%
+
+pair rep_tri_AA,rep_tri_BB,rep_tri_CC;
+numeric rep_tri_la,rep_tri_lb,rep_tri_lc,
+        rep_tri_angA,rep_tri_angB,rep_tri_angC;
+
+boolean rep_ad_A,rep_ad_B,rep_ad_C;
+
+vardef TriangleComplet(suffix AA,BB,CC)(expr chAA,chBB,chCC,coteAB,coteBC,coteCA,angAA,angBB,angCC) text t =
+%% Trace le triangle, les noms des points, les cotes et le sangles
+  save tmpang,tmpfig,tmpscale;
+  numeric tmpang,tmpscale;
+  tmpscale:=defaultscale;
+  picture tmpfig;
+  tmpfig:=image(%
+     draw triangle (AA,BB,CC) t;
+     if AffPoints:
+        tmpang:=angle(0.5BB+0.5CC-AA)+180;
+        nomme[tmpang](AA,chAA) t withpen currentpen;
+        tmpang:=angle(0.5AA+0.5CC-BB)+180;
+        nomme[tmpang](BB,chBB) t withpen currentpen;
+        tmpang:=angle(0.5BB+0.5AA-CC)+180;
+        nomme[tmpang](CC,chCC) t withpen currentpen;
+     fi
+     if AffDonnees:
+        cote(AA,BB,coteAB) t;
+        if rep_type_triangle=0: cote(BB,CC,coteBC) t fi;
+        if rep_type_triangle<=1: cote(CC,AA,coteCA) t fi;
+     elseif AffCotes:
+        cote(AA,BB,coteAB) t;
+        cote(BB,CC,coteBC) t;
+        cote(CC,AA,coteCA) t;
+     fi
+     defaultscale:=EchelleAngles;
+     if AffDonnees and (rep_type_triangle<3):
+        if rep_type_triangle>=1:
+          if rep_ad_A and AutoAngleDroit:
+             draw marqueangledroit(BB,AA,CC) t withpen currentpen
+          else:
+             draw marqueangle(BB,AA,CC,1) t withpen currentpen;
+             nomme(BB,AA,CC,angAA) t;
+          fi;
+        fi;
+        if rep_type_triangle=2:
+          if rep_ad_B and AutoAngleDroit:
+             draw marqueangledroit(CC,BB,AA) t withpen currentpen
+          else:
+             draw marqueangle(CC,BB,AA,1) t withpen currentpen;
+             nomme(CC,BB,AA,angBB) t;
+          fi;
+        fi;
+     else:
+        if (nang>=1):
+          if rep_ad_A and AutoAngleDroit:
+             draw marqueangledroit(BB,AA,CC) t withpen currentpen
+          else:
+             draw marqueangle(BB,AA,CC,1) t withpen currentpen;
+             nomme(BB,AA,CC,angAA) t;
+          fi;
+        fi
+        if (nang>=2):
+          if rep_ad_B and AutoAngleDroit:
+             draw marqueangledroit(CC,BB,AA) t withpen currentpen
+          else:
+             draw marqueangle(CC,BB,AA,1) t withpen currentpen;
+             nomme(CC,BB,AA,angBB) t;
+          fi;
+        fi
+        if (nang=3):
+          if rep_ad_C and AutoAngleDroit:
+             draw marqueangledroit(AA,CC,BB) t withpen currentpen
+          else:
+             draw marqueangle(AA,CC,BB,1) t withpen currentpen;
+             nomme(AA,CC,BB,angCC) t;
+          fi;
+        fi
+     fi
+     defaultscale:=tmpscale;
+  );
+  tmpfig
+enddef;
+
+vardef defTriangleLLA(text t)(text s)=
+  save nbsommet,count_tmp,posAA,anghh,sommetdefiniA,sommetdefiniB,sommetdefiniC,ang_tmp;
+  numeric nbsommet,count_tmp,anghh,ang_tmp;
+  boolean sommetdefiniA,sommetdefiniB,sommetdefiniC;
+  pair posAA;
+  nbsommet:=0;
+  sommetdefiniA=sommetdefiniB=sommetdefiniC=false;
+  rep_ad_A:=false;rep_ad_B:=false;rep_ad_C:=false;
+  % on compte le nombre de sommets et on prend en compte lesquels sont définis
+  forsuffixes i=t:
+    nbsommet:=nbsommet+1;
+    if nbsommet=1:
+       if known i: sommetdefiniA:=true; rep_tri_AA:=i fi
+    elseif nbsommet=2:
+       if known i: sommetdefiniB:=true; rep_tri_BB:=i fi
+    else:
+       if known i: sommetdefiniC:=true; rep_tri_CC:=i fi
+    fi;
+  endfor
+  count_tmp:=0;
+  posAA:=(0,0);anghh:=0;
+  % on définit les valeurs de départ
+  for i=s:
+    count_tmp:=count_tmp+1;
+    if count_tmp=1: rep_tri_lc:=i
+    elseif count_tmp=2: rep_tri_lb:=i
+    elseif count_tmp=3: rep_tri_angA:=i
+    elseif pair i: if (not sommetdefiniA): posAA:=i fi
+    else: anghh:=i
+    fi;
+  endfor
+  % Angles droits ?
+  if rep_tri_angA=90:
+     rep_ad_A:=true
+  elseif arrondi(10**(rep_int_arr),cosd(rep_tri_angA)*rep_tri_lc) = arrondi(10**(rep_int_arr),rep_tri_lb):
+     rep_ad_C:=true
+  elseif arrondi(10**(rep_int_arr),cosd(rep_tri_angA)*rep_tri_lb) = arrondi(10**(rep_int_arr),rep_tri_lc):
+     rep_ad_B:=true
+  fi; 
+  count_tmp:=0;
+  % on calcule les coordonnées des sommets
+  forsuffixes i=t:
+    count_tmp:=count_tmp+1;
+    if count_tmp=1: %On définit A s'il n'existe pas. À partir de B ou C éventuellement
+       if unknown i: 
+          if sommetdefiniC and sommetdefiniB:
+             rep_tri_la:=abs(rep_tri_CC-rep_tri_BB);
+             if abs(sind(rep_tri_angA))<rep_tri_la/rep_tri_lc:
+                ang_tmp:=180-Arcsind(rep_tri_lc*abs(sind(rep_tri_angA))/rep_tri_la);
+                i:=(rep_tri_lc,0) rotated ((angle(rep_tri_CC-rep_tri_BB) mod 360) + ang_tmp);
+             else:
+                i:=(-rep_tri_lc,0) rotated anghh shifted rep_tri_BB;
+                rep_tri_angA:=(angle(rep_tri_CC-i) mod 360)-(angle(rep_tri_BB-i) mod 360);
+             fi;
+             rep_tri_lb:=abs(rep_tri_CC-i);
+          elseif sommetdefiniB: i:=(-rep_tri_lc,0) rotated anghh shifted rep_tri_BB
+%          if sommetdefiniB: i:=(-rep_tri_lc,0) rotated anghh shifted rep_tri_BB
+          elseif sommetdefiniC: i=(-rep_tri_lb,0) rotated (anghh+rep_tri_angA) shifted rep_tri_CC
+          else: i:=posAA
+          fi;
+          rep_tri_AA:=i
+       else:
+          if sommetdefiniB: rep_tri_lc:= abs(rep_tri_BB-rep_tri_AA) fi;
+          if sommetdefiniC: rep_tri_lb:= abs(rep_tri_CC-rep_tri_AA) fi;
+          if sommetdefiniC and sommetdefiniB:
+             rep_tri_angA:=angle(rep_tri_CC-rep_tri_AA)-angle(rep_tri_BB-rep_tri_AA)
+          fi;
+       fi;
+    elseif count_tmp=2: %On définit B à partir de C si C existe
+       if unknown i:
+          if sommetdefiniC: 
+              i:= (rep_tri_lc,0) rotated (angle(rep_tri_CC-rep_tri_AA)-rep_tri_angA) shifted rep_tri_AA
+          else:
+              i:=(rep_tri_lc,0) rotated anghh shifted rep_tri_AA
+          fi;
+          rep_tri_BB:=i
+       fi;
+     else:           %On définit C s'il n'existe pas
+        if unknown i:
+           i:=(rep_tri_lb,0) rotated (angle(rep_tri_BB-rep_tri_AA)+rep_tri_angA) shifted rep_tri_AA;
+        rep_tri_CC:=i
+        fi;
+     fi;
+  endfor
+  rep_tri_la:=abs(rep_tri_CC-rep_tri_BB);
+  rep_tri_angB:=(angle(rep_tri_AA-rep_tri_BB) mod 360)-(angle(rep_tri_CC-rep_tri_BB) mod 360);
+  rep_tri_angC:=(angle(rep_tri_BB-rep_tri_CC) mod 360)-(angle(rep_tri_AA-rep_tri_CC) mod 360);
+enddef;
+
+
+vardef defTriangleLAA(text t)(text s)=
+  save nbsommet,count_tmp,posAA,anghh,sommetdefiniA,sommetdefiniB,sommetdefiniC,ang_tmp;
+  numeric nbsommet,count_tmp,anghh,ang_tmp;
+  boolean sommetdefiniA,sommetdefiniB,sommetdefiniC;
+  pair posAA;
+  nbsommet:=0;
+  sommetdefiniA=sommetdefiniB=sommetdefiniC=false;
+  rep_ad_A:=false;rep_ad_B:=false;rep_ad_C:=false;
+  % on compte le nombre de sommets et on prend en compte lesquels sont définis
+  forsuffixes i=t:
+    nbsommet:=nbsommet+1;
+    if nbsommet=1:
+       if known i: sommetdefiniA:=true; rep_tri_AA:=i fi
+    elseif nbsommet=2:
+       if known i: sommetdefiniB:=true; rep_tri_BB:=i fi
+    else:
+       if known i: sommetdefiniC:=true; rep_tri_CC:=i fi
+    fi;
+  endfor
+  count_tmp:=0;
+  posAA:=(0,0);anghh:=0;
+  % on définit les valeurs de départ
+  for i=s:
+    count_tmp:=count_tmp+1;
+    if count_tmp=1: rep_tri_lc:=i
+    elseif count_tmp=2: rep_tri_angA:=i
+    elseif count_tmp=3: rep_tri_angB:=i
+    elseif pair i: if (not sommetdefiniA): posAA:=i fi
+    else: anghh:=i
+    fi;
+  endfor
+  % Angles droits ?
+  if rep_tri_angA=90: rep_ad_A:=true elseif rep_tri_angB=90: rep_ad_B:=true elseif rep_tri_angA+rep_tri_angB=90: rep_ad_C:=true fi;
+  rep_tri_angC:=180-rep_tri_angA-rep_tri_angB;
+  count_tmp:=0;
+  % on calcule les coordonnées des sommets
+  forsuffixes i=t:
+    count_tmp:=count_tmp+1;
+    if count_tmp=1: %On définit A s'il n'existe pas. À partir de B ou C éventuellement
+       if unknown i: 
+          if sommetdefiniC and sommetdefiniB:
+             i:=(rep_tri_lc,0) rotated (angle(rep_tri_CC-rep_tri_BB)+rep_tri_angB) shifted rep_tri_BB;
+             rep_tri_angA:=(angle(rep_tri_CC-rep_tri_AA) mod 360)-(angle(rep_tri_BB-rep_tri_AA) mod 360);
+          elseif sommetdefiniB: i:=(-rep_tri_lc,0) rotated anghh shifted rep_tri_BB
+          elseif sommetdefiniC: 
+             rep_tri_lb:=rep_tri_lc*abs(sind(rep_tri_angB)/sind(rep_tri_angC));
+             i=(-rep_tri_lb,0) rotated (anghh+rep_tri_angA) shifted rep_tri_CC
+          else: i:=posAA
+          fi;
+          rep_tri_AA:=i
+       else:
+          if sommetdefiniB: rep_tri_lc:= abs(rep_tri_BB-rep_tri_AA) fi;
+          if sommetdefiniC: rep_tri_lb:= abs(rep_tri_CC-rep_tri_AA) fi;
+          if sommetdefiniC and sommetdefiniB:
+             rep_tri_angA:=(angle(rep_tri_CC-rep_tri_AA) mod 360)-(angle(rep_tri_BB-rep_tri_AA) mod 360);
+             rep_tri_angB:=(angle(rep_tri_AA-rep_tri_BB) mod 360)-(angle(rep_tri_CC-rep_tri_BB) mod 360);
+          fi;
+       fi;
+    elseif count_tmp=2: %On définit B à partir de C si C existe
+       if unknown i:
+          if sommetdefiniC: 
+              i:= (rep_tri_lc,0) rotated (angle(rep_tri_CC-rep_tri_AA)-rep_tri_angA) shifted rep_tri_AA;
+              rep_tri_angB:=(angle(rep_tri_AA-i) mod 360)-(angle(rep_tri_CC-i) mod 360);
+          else:
+              i:=(rep_tri_lc,0) rotated anghh shifted rep_tri_AA
+          fi;
+          rep_tri_BB:=i
+       fi;
+     else:           %On définit C s'il n'existe pas
+        if unknown i:
+           i = whatever[rep_tri_AA,rep_tri_BB rotatedaround(rep_tri_AA,rep_tri_angA)] = whatever[rep_tri_BB,rep_tri_AA rotatedaround(rep_tri_BB,-rep_tri_angB)];
+        rep_tri_CC:=i
+        fi;
+     fi;
+  endfor
+  rep_tri_la:=abs(rep_tri_CC-rep_tri_BB);
+  rep_tri_lb:=abs(rep_tri_CC-rep_tri_AA);
+  rep_tri_angC:=180 - rep_tri_angB - rep_tri_angA;
+enddef;
+
+
+vardef defTriangleLLL(text t)(text s)=
+  save nbsommet,count_tmp,posAA,anghh,sommetdefiniA,sommetdefiniB,sommetdefiniC,ab_tmp,or_tmp,ang_tmp;
+  numeric nbsommet,count_tmp,anghh,ab_tmp,or_tmp,ang_tmp;
+  boolean sommetdefiniA,sommetdefiniB,sommetdefiniC;
+  pair posAA;
+  nbsommet:=0;
+  sommetdefiniA=sommetdefiniB=sommetdefiniC=false;
+  rep_ad_A:=false;rep_ad_B:=false;rep_ad_C:=false;
+  % on compte le nombre de sommets et on prend en compte lesquels sont définis
+  forsuffixes i=t:
+    nbsommet:=nbsommet+1;
+    if nbsommet=1:
+       if known i: sommetdefiniA:=true; rep_tri_AA:=i fi
+    elseif nbsommet=2:
+       if known i: sommetdefiniB:=true; rep_tri_BB:=i fi
+    else:
+       if known i: sommetdefiniC:=true; rep_tri_CC:=i fi
+    fi;
+  endfor
+  count_tmp:=0;
+  posAA:=(0,0);anghh:=0;
+  % on définit les valeurs de départ
+  for i=s:
+    count_tmp:=count_tmp+1;
+    if count_tmp=1: rep_tri_lc:=i
+    elseif count_tmp=2: rep_tri_lb:=i
+    elseif count_tmp=3: rep_tri_la:=i
+    elseif pair i: if (not sommetdefiniA): posAA:=i fi
+    else: anghh:=i
+    fi;
+  endfor
+  % Angles droits ?
+  if arrondi(10**rep_int_arr,rep_tri_lc**2)=arrondi(10**rep_int_arr,(rep_tri_la)**2+(rep_tri_lb)**2):
+     rep_ad_C:=true
+  elseif arrondi(10**rep_int_arr,rep_tri_lb**2)=arrondi(10**rep_int_arr,(rep_tri_la)**2+(rep_tri_lc)**2):
+       rep_ad_B:=true
+  elseif arrondi(10**rep_int_arr,rep_tri_la**2)=arrondi(10**rep_int_arr,(rep_tri_lc)**2+(rep_tri_lb)**2):
+         rep_ad_A:=true
+  fi;
+  count_tmp:=0;
+  % on calcule les coordonnées des sommets
+  forsuffixes i=t:
+    count_tmp:=count_tmp+1;
+    if count_tmp=1: %On définit A s'il n'existe pas. À partir de B ou C éventuellement
+       if unknown i: 
+          if sommetdefiniC and sommetdefiniB:
+             rep_tri_la:=abs(rep_tri_BB-rep_tri_CC);
+             ab_tmp:=((rep_tri_lc**2)+(rep_tri_la**2)-(rep_tri_lb**2))/(2*rep_tri_la);
+             or_tmp:=sqrt((rep_tri_lc**2)-(ab_tmp**2));
+             i := (ab_tmp,or_tmp) rotated angle(rep_tri_CC-rep_tri_BB) shifted rep_tri_BB;
+          elseif sommetdefiniB: i:=(-rep_tri_lc,0) rotated anghh shifted rep_tri_BB
+          elseif sommetdefiniC: 
+             ang_tmp:=Arccosd(((rep_tri_lb**2)+(rep_tri_lc**2)-(rep_tri_la**2))/(2*rep_tri_lc*rep_tri_lb));
+             i:=(-rep_tri_lb,0) rotated (ang_tmp + anghh) shifted rep_tri_CC
+          else: i:=posAA
+          fi;
+          rep_tri_AA:=i
+       else:
+          if sommetdefiniB: rep_tri_lc:= abs(rep_tri_BB-rep_tri_AA) fi;
+          if sommetdefiniC: rep_tri_lb:= abs(rep_tri_CC-rep_tri_AA) fi;
+          if sommetdefiniC and sommetdefiniB:
+             rep_tri_la:= abs(rep_tri_BB-rep_tri_CC)
+          fi;
+       fi;
+    elseif count_tmp=2: %On définit B à partir de C si C existe
+       if unknown i:
+          if sommetdefiniC:
+             rep_tri_lb:=abs(rep_tri_AA-rep_tri_CC);
+             ab_tmp:=((rep_tri_la**2)+(rep_tri_lb**2)-(rep_tri_lc**2))/(2*rep_tri_lb);
+             or_tmp:=sqrt((rep_tri_la**2)-(ab_tmp**2));
+             i := (ab_tmp,or_tmp) rotated angle(rep_tri_AA-rep_tri_CC) shifted rep_tri_CC;
+          else:
+              i:=(rep_tri_lc,0) rotated anghh shifted rep_tri_AA
+          fi;
+          rep_tri_BB:=i
+       fi;
+     else:           %On définit C s'il n'existe pas
+        if unknown i:
+           ab_tmp:=((rep_tri_lb**2)+(rep_tri_lc**2)-(rep_tri_la**2))/(2*rep_tri_lc);
+           or_tmp:=sqrt((rep_tri_lb**2)-(ab_tmp**2));
+           i := (ab_tmp,or_tmp) rotated angle(rep_tri_BB-rep_tri_AA) shifted rep_tri_AA;
+           rep_tri_CC:=i
+        fi;
+     fi;
+  endfor
+  rep_tri_angA:=(angle(rep_tri_CC-rep_tri_AA) -angle(rep_tri_BB-rep_tri_AA) ) mod 360;
+  rep_tri_angB:=(angle(rep_tri_AA-rep_tri_BB)-angle(rep_tri_CC-rep_tri_BB)) mod 360;
+  rep_tri_angC:=180 - rep_tri_angB - rep_tri_angA;
+enddef;
+
+vardef defTriangle(text q)=
+  save count_tmp;
+  numeric count_tmp;
+  rep_ad_A:=false;rep_ad_B:=false;rep_ad_C:=false;
+  count_tmp:=0;
+  for i=q:
+    count_tmp:=count_tmp+1;
+    if count_tmp=1: rep_tri_AA:=i
+    elseif count_tmp=2: rep_tri_BB:=i
+    else: rep_tri_CC:=i
+    fi;
+  endfor
+  rep_tri_lc:=abs(rep_tri_BB-rep_tri_AA);
+  rep_tri_lb:=abs(rep_tri_CC-rep_tri_AA);
+  rep_tri_la:=abs(rep_tri_BB-rep_tri_CC);
+  rep_tri_angA:=(angle(rep_tri_CC-rep_tri_AA) -angle(rep_tri_BB-rep_tri_AA) ) mod 360;
+  rep_tri_angB:=(angle(rep_tri_AA-rep_tri_BB)-angle(rep_tri_CC-rep_tri_BB)) mod 360;
+  rep_tri_angC:=180 - rep_tri_angB - rep_tri_angA;
+  % Angles droits ?
+  if arrondi(10**rep_int_arr,rep_tri_lc**2)=arrondi(10**rep_int_arr,(rep_tri_la)**2+(rep_tri_lb)**2):
+     rep_ad_C:=true
+  elseif arrondi(10**rep_int_arr,rep_tri_lb**2)=arrondi(10**rep_int_arr,(rep_tri_la)**2+(rep_tri_lc)**2):
+       rep_ad_B:=true
+  elseif arrondi(10**rep_int_arr,rep_tri_la**2)=arrondi(10**rep_int_arr,(rep_tri_lc)**2+(rep_tri_lb)**2):
+         rep_ad_A:=true
+  fi;
+enddef;
+
+vardef TriangleLLA(text q)(text s)(text p)(text c)(text a) text r=
+%% Macro utilisateur, definit le triangle et appelle la macro de tracé
+  defTriangleLLA(q)(s);
+  rep_type_triangle:=1;
+  ProcessAffTriangles(q)(p)(c)(a) r
+enddef;
+
+vardef TriangleLAA(text q)(text s)(text p)(text c)(text a) text r=
+%% Macro utilisateur, definit le triangle et appelle la macro de tracé
+  defTriangleLAA(q)(s);
+  rep_type_triangle:=2;
+  ProcessAffTriangles(q)(p)(c)(a) r
+enddef;
+
+vardef TriangleLLL(text q)(text s)(text p)(text c)(text a) text r=
+%% Macro utilisateur, definit le triangle et appelle la macro de tracé
+  defTriangleLLL(q)(s);
+  rep_type_triangle:=0;
+  ProcessAffTriangles(q)(p)(c)(a) r
+enddef;
+
+vardef Triangle(text q)(text p)(text c)(text a) text r=
+  defTriangle(q);
+  rep_type_triangle:=3;
+  ProcessAffTriangles(q)(p)(c)(a) r
+enddef;
+
+
+
+vardef ProcessAffTriangles(text q)(text p)(text c)(text a) text r=
+%% Gestion de l'affichage 
+  save chAA,chBB,chCC,cha,chb,chc,changA,changB,changC,count_tmp,ch,nang;
+  string chAA,chBB,chCC,cha,chb,chc,changA,changB,changC,ch;
+  chAA=chBB=chCC=cha=chb=chc=changA=changB=changC="";
+  numeric count_tmp,nang;
+  % Noms des points passés en argument
+  count_tmp:=0;
+  forsuffixes i=q:
+    count_tmp:=count_tmp+1;
+    ch:=_chaine(i);
+    if count_tmp=1:     chAA:=
+    elseif count_tmp=2: chBB:=
+    else:               chCC:=
+    fi
+    "$" & ch & "$";
+  endfor
+  % On modifie le nom des points si des valeurs sont passées dans p
+  count_tmp:=0;
+  for i=p:
+    count_tmp:=count_tmp+1;
+    if count_tmp=1:     chAA:=
+    elseif count_tmp=2: chBB:=
+    else:               chCC:=
+    fi
+    i;
+  endfor
+  % Cotes données par les longueurs
+    if UnitCotes<>"":
+       cha:=AffichageCoteAvecUnite(rep_tri_la,ArrondiCotes,UnitCotes);
+       chb:=AffichageCoteAvecUnite(rep_tri_lb,ArrondiCotes,UnitCotes);
+       chc:=AffichageCoteAvecUnite(rep_tri_lc,ArrondiCotes,UnitCotes);
+     else:
+       cha:=AffichageCoteSansUnite(rep_tri_la,ArrondiCotes);
+       chb:=AffichageCoteSansUnite(rep_tri_lb,ArrondiCotes);
+       chc:=AffichageCoteSansUnite(rep_tri_lc,ArrondiCotes);
+     fi
+  % On modifie les cotes si des valeurs sont passées dans c
+  count_tmp:=0;
+  for i=c:
+    count_tmp:=count_tmp+1;
+    if count_tmp=1:     cha:=
+    elseif count_tmp=2: chb:=
+    else:               chc:=
+    fi
+    i;
+  endfor
+  % Angles donnés ou calculés
+  changA:=AffichageAngle(rep_tri_angA,ArrondiAngles);
+  changB:=AffichageAngle(rep_tri_angB,ArrondiAngles);
+  changC:=AffichageAngle(rep_tri_angC,ArrondiAngles);  
+  % On modifie les angles si des valeurs sont passées dans a
+  count_tmp:=0;
+  for i=a:
+    count_tmp:=count_tmp+1;
+    if count_tmp=1:     changA:=
+    elseif count_tmp=2: changB:=
+    else:               changC:=
+    fi
+    i;
+  endfor
+  if count_tmp>0: nang:= count_tmp elseif AffAngles: nang:=3 else: nang:=0 fi;
+%
+  TriangleComplet(q)(chAA,chBB,chCC,chc,cha,chb,changA,changB,changC) r
+enddef;
+
+
+
+
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %%%%%%%%%%   FONCTIONS USUELLES   %%%%%%%%%
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -2637,10 +3381,13 @@
 vardef sh(expr x)=(exp(x)-exp(-x))/2 enddef;
 
 vardef Arctan(expr x)= pi*angle(1,x)/180 enddef;
+vardef Arctand(expr x)= angle(1,x) enddef;
 
 vardef Arcsin(expr x)= Arctan(x/sqrt(1-x**2)) enddef;
+vardef Arcsind(expr x)= Arctand(x/sqrt(1-x**2)) enddef;
 
 vardef Arccos(expr x)= pi/2-Arcsin(x) enddef;
+vardef Arccosd(expr x)=  Arctand((sqrt(1-x**2))/x)enddef;
 
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -2775,6 +3522,18 @@
 enddef;
 
 
+
+%%%% Cotes et légendes
+
+
+numeric dec_cote;
+dec_cote:=4mm;
+boolean traits_cote;
+traits_cote:=false;
+numeric angle_cote;
+angle_cote:=-1;
+
+
 % Mai 2017
 % Légende avec flèche
 vardef thelegende@#(expr lab,p) =
@@ -2785,29 +3544,41 @@
 
 def legende = draw thelegende enddef;
 
-% Octobre 2021
+% Octobre 2021 - Juin 2022
 % Cote sans flèche
 vardef thecote@#(expr A, B, texte)=
   save I; pair I;
-  save an; numeric an;
+  save an,ac; numeric an,ac;
   I=0.5[A,B];
   an=angle(B-A);
+  if angle_cote = -1: ac:=an else: ac:=angle_cote fi;
   if str @# ="top":
-     thelabelangrot[an+90](texte,I,an)
+     thelabelangrot[an+90](texte,I,ac)
   else:
-     thelabelangrot[an-90](texte,I,an)
+     thelabelangrot[an-90](texte,I,ac)
   fi
 enddef;
 
 def cote = draw thecote enddef;
 
+% Mai 2022
+% Cote sans flèche sans rotation du texte
+vardef thecoted@#(expr A, B, texte)=
+  save I; pair I;
+  save an; numeric an;
+  I=0.5[A,B];
+  an=angle(B-A);
+  if str @# ="top":
+     thelabelang[an+90](texte,I)
+  else:
+     thelabelang[an-90](texte,I)
+  fi
+enddef;
+
+def coted = draw thecoted enddef;
+
 % Octobre 2021
 % Cote avec flèche
-numeric dec_cote;
-dec_cote:=4mm;
-boolean traits_cote;
-traits_cote:=false;
-
 vardef thecotefleche@#(expr a,b,t)=
   save pp,an;
   pair pp[];numeric an;
@@ -3497,7 +4268,6 @@
   for i=1 upto 7:
     draw (a--b) shifted (0,0.1*i) epaisseur (0.7*Ux/cm) couleur coulext;
   endfor
-  show Ux/cm;
   draw a--b--c--d--cycle epaisseur (1.5*Ux/cm) couleur coulext;
   draw a--c epaisseur (1.5*Ux/cm) couleur coulext;
   draw b--d epaisseur (1.5*Ux/cm) couleur coulext;
@@ -3630,3 +4400,16 @@
         draw tmp couleur coulext)
 enddef;
 
+%%%%%%% Anglicisation
+let coordxy = repere;
+let endxy = fin;
+let xaxis = axex;
+let yaxis = axey;
+let axis = axes;
+let interaxis = interaxes;
+let setlab = setval;
+let arrowaxis = flecheaxe;
+let frame = cadre;
+
+
+let purple = pourpre;



More information about the tex-live-commits mailing list.