texlive[65769] Master/texmf-dist: repere (9feb23)

commits+karl at tug.org commits+karl at tug.org
Thu Feb 9 22:16:55 CET 2023


Revision: 65769
          http://tug.org/svn/texlive?view=revision&revision=65769
Author:   karl
Date:     2023-02-09 22:16:55 +0100 (Thu, 09 Feb 2023)
Log Message:
-----------
repere (9feb23)

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	2023-02-09 21:16:36 UTC (rev 65768)
+++ trunk/Master/texmf-dist/doc/metapost/repere/README.md	2023-02-09 21:16:55 UTC (rev 65769)
@@ -1,4 +1,4 @@
-Package repere - Version 23.01 - January 1, 2023
+Package repere - Version 23.02 - February 9, 2023
 
 ---
 

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	2023-02-09 21:16:36 UTC (rev 65768)
+++ trunk/Master/texmf-dist/doc/metapost/repere/repere-doc.tex	2023-02-09 21:16:55 UTC (rev 65769)
@@ -1116,17 +1116,16 @@
 
 
 \begin{rpdeclaration}{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+. Le tableau \verb+X+ doit être déclaré avant d'utiliser cette macro.
+Stocke dans le tableau de nombres \verb+X+ (qu'il n'est pas nécessaire de déclarer) les antécédents de \verb+y+ par la fonction dont la courbe représentative est le chemin \verb+p+.
 \end{rpdeclaration}
 
 \begin{rpdeclaration}{ptantecedents(<P>,<y>,<p>)}
-Stocke dans le tableau de points \verb+P+ les points du chemin \verb+p+ d'ordonnée \verb+y+. Le tableau \verb+P+ doit être déclaré avant d'utiliser cette macro.
+Stocke dans le tableau de points \verb+P+ (qu'il n'est pas nécessaire de déclarer) les points du chemin \verb+p+ d'ordonnée \verb+y+.
 \end{rpdeclaration}
 
 \begin{exemple}
 repere(-2.5,4.5,1cm,-3.5,2.5,1cm);
 path p;
-pair A[];numeric n[];
 p=(-2,-2)..(-1,1)..(0,2)..(1,1)
        ..(2,-2)..(3,-3)..(3.5,-2.5)
        ..(4,-1);
@@ -1144,12 +1143,12 @@
 \end{exemple}
 
 \begin{rpdeclaration}{intercourbes(<P>,<p>,<q>)}
-Stocke dans le tableau de points \verb+P+ les points d'intersection des chemins \verb+p+ et \verb+q+.  Il faut, avant d'utiliser cette macro, déclarer le tableau \verb+P+.
+Stocke dans le tableau de points \verb+P+ (qu'il n'est pas nécessaire de déclarer) les points d'intersection des chemins \verb+p+ et \verb+q+.
 \end{rpdeclaration}
 
 \begin{exemple}
 repere(-2.5,3,1cm,-2.5,2.5,1cm);
-path p,C_f; pair I[];
+path p,C_f;
 vardef f(expr x)= x**2-2x enddef;
 p=(-2,-2)..(-1,1)..(0,2)..(1,1)
        ..(2,-2)..(3,-3)..(3.5,-2.5)
@@ -2040,6 +2039,10 @@
 Figure formée d'une marque sur le segment $[AB]$. Des paramètres permettent de contrôler la forme et la taille de la marque.
 \end{rpobjet}
 
+\begin{rpobjet}{marquesegment(<p>)}{picture}
+Figure formée d'une marque sur le chemin \verb|p|. Des paramètres permettent de contrôler la forme et la taille de la marque.
+\end{rpobjet}
+
 \begin{rpobjet}{marquesegment(<A>,<B>,<C>,<D>...)}{picture}
 Plusieurs segments peuvent être marqués simultanément.
 \end{rpobjet}
@@ -2075,10 +2078,12 @@
 \begin{exemple}[lefthand ratio=0.6]
 repere();
 pair A[],B[];
-for i=1 upto 5:
+path p;
+for i=1 upto 6:
   A[i]:=(0,-i);B[i]:=(3,-i);
   draw A[i]--B[i];  nomme.lft(A[i]);nomme.rt(B[i]);
 endfor
+p:=A[6]..(1,-6.5)..B[6];
 draw marquesegment(A[1],B[1],"o");
 draw marquesegment(A[2],B[2],"ss");
 draw marquesegment(A[3],B[3],"/",3);
@@ -2086,6 +2091,10 @@
 draw marquesegment(A[4],B[4],"xxx");
 angle_marque_s:=90;echelle_marque_s:=2;
 draw marquesegment(A[5],B[5],"/");
+sep_marque_s:=2;
+angle_marque_s:=60;echelle_marque_s:=1;
+draw p;
+draw marquesegment(p,"/");
 fin;
 \end{exemple}
 
@@ -2621,6 +2630,88 @@
 fin;
 \end{exemple}
 
+\section{Dessin à main levée}
+L'idée de dessiner une figure comme si elle était faite à main levée vient de Christophe \bsc{Poulain} dans les macros de \verb|geometriesyr16.mp|\footnote{\url{https://melusine.eu.org/syracuse/poulecl/geometriesyr16/}} . Cette idée est reprise par Toby \bsc{Thurston} dans le document « Drawing with MetaPost »\footnote{\url{https://github.com/thruston/Drawing-with-Metapost/blob/master/Drawing-with-Metapost.pdf}}. Le principe est de modifier le tracé des chemins en changeant légèrement les angles de départ et d'arrivée pour créer une déformation qui rappelle le dessin à main levée.
+
+C. \bsc{Poulain} ajoute un angle de \ang{5}. Dans son document, T. \bsc{Thurston} reprend l'idée et ajoute une composante aléatoire.
+
+Dans la version proposée ici, la valeur par défaut est aléatoire mais peut être modifiée.
+
+\medskip
+\begin{rpdeclaration}{drawmainlevee}
+Dessine une figure en représentant les chemins comme s'ils étaient dessinés à main levée
+\end{rpdeclaration}
+
+\begin{exemple}[lefthand ratio=0.6]
+repere(-0.5,5,1cm,-0.5,5,1cm);
+pair A,B,C,D;
+A=(0.5,0.5);B=(4,1);C=(3,4);
+drawmainlevee axes(1,1);
+drawmainlevee Triangle(A,B,C)()()() withcolor red;
+drawmainlevee cercle(A,B,C) withcolor blue;
+fin;
+\end{exemple}
+
+\begin{rpparam}
+type_trace & string & "" & Paramètre qui peut prendre la valeur \verb|"mainlevee"| pour indiquer que tous les dessins qui suivent seront faits « à main levée ». Toute autre valeur donne un dessin normal.
+\end{rpparam}
+
+\begin{exemple}
+repere(-0.5,5,1cm,-0.5,5,1cm);
+pair A,B,C,D;
+A=(0.5,0.5);B=(4,1);C=(3,4);
+draw axes(1,1);
+type_trace:="mainlevee";
+draw Triangle(A,B,C)()()() withcolor red;
+draw cercle(A,B,C) withcolor blue;
+fin;
+\end{exemple}
+
+\begin{rpobjet}{mainlevee(<objet>)}{path ou picture}
+Transforme le chemin ou la figure en un objet de même nature « dessiné à main levée ».
+\end{rpobjet}
+
+
+\begin{exemple}
+repere(-0.5,5,1cm,-0.5,5,1cm);
+pair A,B,C,D;
+A=(0.5,0.5);B=(4,1);C=(3,4);
+draw axes(1,1);
+picture tri;
+path cer;
+tri:=mainlevee(Triangle(A,B,C)()()());
+cer:=mainlevee(cercle(A,B,C));
+draw tri withcolor red;
+draw cer withcolor blue;
+fin;
+\end{exemple}
+
+\begin{rpdeclaration}{anglemainlevee(<nombre>)}
+Fonction qui permet de définir comment seront dessinés les figures à main levée : le \verb|nombre| sera ajouté à l'angle de départ et à l'angle d'arrivée des chemins pour créer une déformation. \verb|nombre| peut contenir un calcul avec les fonctions \verb|normaldeviate| et \verb|uniformdeviate()|.
+
+Au chargement de \verb|repere|, la fonction est appelée de la façon suivante :
+
+ \verb|anglemainlevee(5*signe(normaldeviate)+normaldeviate);|
+\end{rpdeclaration}
+
+\begin{exemple}
+repere(-0.5,5,1cm,-0.5,5,1cm);
+pair A[],B[];
+draw axes(1,1);
+for i=1 upto 4:
+  A[i]:=(1,i);B[i]:=(4,i);
+  nomme.lft(A[i]);nomme.rt(B[i]);
+endfor
+draw A[1]--B[1];
+drawmainlevee A[2]--B[2];
+anglemainlevee(10);
+drawmainlevee A[3]--B[3];
+anglemainlevee(uniformdeviate 20 + 10);
+drawmainlevee A[4]--B[4];
+fin;
+\end{exemple}
+
+
 \section{Divers}
 
 \subsection{Compilation avec \texttt{mpost}}

Modified: trunk/Master/texmf-dist/metapost/repere/repere.mp
===================================================================
--- trunk/Master/texmf-dist/metapost/repere/repere.mp	2023-02-09 21:16:36 UTC (rev 65768)
+++ trunk/Master/texmf-dist/metapost/repere/repere.mp	2023-02-09 21:16:55 UTC (rev 65769)
@@ -2,7 +2,7 @@
 %%                        repere.mp                           %%
 %%   Macros pour la construction de figures dans un repère    %%
 %%                    o.peault at posteo.net                     %%
-%%               Version 23.01 (Janvier 2023)                 %%
+%%               Version 23.02 (Février 2023)                 %%
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %
 % This work may be distributed and/or modified under the conditions of
@@ -20,6 +20,7 @@
 %             angle_cote
 %             segments, vecteurs, polygones complets
 % Octobre-Décembre 2022 : doc
+% Février 2023 : Main levée
 
 input format;
 if not known mplib: input latexmp fi;
@@ -139,7 +140,7 @@
   Ux:=_def3;Uy:=_def6;
   _T:=identity xscaled Ux yscaled Uy slanted cosd(theta) yscaled sind(theta);
   _defcadre;
-  settout(Xmin,Xmax,Ymin,Ymax);
+  setrepere(Xmin,Xmax,Ymin,Ymax);
   _O:=_cart(0,0); xO:=0 ; yO:=0;_O_:=(0,0);
   _I:=_cart(1,0); _J:=_cart(0,1);
   taillegrad:=0.8mm;taillepoint:=3;taillecroix:=5;_nbaxes:=0;_axorlab:=nullpicture;poslabO:=(0,0);
@@ -157,7 +158,7 @@
 %%%% Initialisations tracés (redéfinition draw etc.)
 def init_traces =
   %% draw
-  def draw expr p =
+  def ddraw expr p =
     addto currentpicture
     if picture p:
       also p
@@ -166,6 +167,13 @@
     fi
     _op_
   enddef;
+  def draw expr p=
+    if (path p) and (type_trace="mainlevee"):
+         ddraw mainleveepath(p)
+    else:
+         ddraw p
+    fi
+  enddef;
   %% fill
   def fill expr c =
     if path c:
@@ -201,8 +209,22 @@
   enddef;
   def labelrot = draw thelabelrot enddef;
   %% drawarrow
-  def drawarrow expr p = _apth:=p transformed _T; _finarr enddef;
-  def drawdblarrow expr p = _apth:=p transformed _T; _findarr enddef;
+  def ddrawarrow expr p = _apth:=p transformed _T; _finarr enddef;
+  def drawarrow expr p=
+    if type_trace="mainlevee":
+         ddrawarrow mainleveepath(p)
+    else:
+         ddrawarrow p
+    fi
+  enddef;
+  def ddrawdblarrow expr p = _apth:=p transformed _T; _findarr enddef;
+  def drawdblarrow expr p=
+    if type_trace="mainlevee":
+         ddrawdblarrow mainleveepath(p)
+    else:
+         ddrawdblarrow p
+    fi
+  enddef;
   %% bbox
   vardef bbox primary p =
     if picture p: oldbbox p transformed inverse _T
@@ -261,12 +283,80 @@
   (q rotated .5ahangle & reverse q rotated -.5ahangle -- 0.5*(point 0 of q)-- cycle)  shifted e
 enddef;
 
+%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%% Main levée %%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+vardef signe(expr n)=
+  if n=0:
+    0
+  elseif n>0:
+    1
+  else:
+    -1
+  fi
+enddef;
+
+
+% D'après Toby Thurston :  https://raw.githubusercontent.com/thruston/Drawing-with-Metapost/master/Drawing-with-Metapost.pdf
+%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+string type_trace;
+type_trace:="";
+
+def anglemainlevee(text t) =
+  def _anglemainlevee_ = t enddef
+enddef;
+
+anglemainlevee(5*signe(normaldeviate)+normaldeviate);
+
+
+%% Chemin de longueur 1, on rajoute l'angle aux extrémités
+def mainleveeseg(expr p) =
+  point 0 of p {(direction 0 of p) rotated (_anglemainlevee_)} ..
+  point 1 of p {(direction 1 of p) rotated (_anglemainlevee_)}
+enddef;
+
+%% Chemin de longueur quelconque, on divise en chemins simples
+def mainleveepath(expr p) =
+    mainleveeseg(subpath(0,1) of p)
+       for i=1 upto length(p)-1:
+           & mainleveeseg(subpath(i,i+1) of p)
+       endfor
+    if cycle p: & cycle fi
+enddef;
+string _tmp_type_trace_;
+_tmp_type_trace_:="";
+
+def drawmainlevee text t=
+  _tmp_type_trace_:=type_trace;
+  type_trace:="mainlevee";
+  draw t;
+  type_trace:=_tmp_type_trace_;
+enddef;
+
+def mainlevee(text t)=
+ if path t:
+    mainleveepath(t)
+ else:
+   image(drawmainlevee t)
+ fi
+enddef;
+
+
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
 def setaxes(expr a,b,c,d)=
-  AxeXmin:=a;AxeXmax:=b;AxeYmin:=c;AxeYmax:=d
+  AxeXmin:=a;AxeXmax:=b;AxeYmin:=c;AxeYmax:=d;
+  setgrad(a,b,c,d);
+  setval(a,b,c,d);
 enddef;
 
 def setgrad(expr a,b,c,d)=
-  GradXmin:=a;GradXmax:=b;GradYmin:=c;GradYmax:=d
+  GradXmin:=a;GradXmax:=b;GradYmin:=c;GradYmax:=d;
+  setval(a,b,c,d);
 enddef;
 
 def setval(expr a,b,c,d)=
@@ -331,32 +421,48 @@
 _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);
 
+path _dessin_axe_x_,_dessin_axe_y_;
+
 vardef _etiqx_@#(expr ab,dec,st)=   %étiquettes axe des abscisses
-  save pic;
+  save pic,tmppos;
   picture pic;
+   pair tmppos;
+   tmppos = _dessin_axe_x_ intersectionpoint droite(ab);
   if numeric st: pic:=LaTeX("$\num{" & decimal(st) & extranumx & "}$")
   elseif string st: pic:=LaTeX(st)
   else: pic:=st fi;
-  theoldlabel.@#(pic,_cart(ab,yO) shifted (dec*_posgradx@#))
+%  theoldlabel.@#(pic,_cart(ab,yO) shifted (dec*_posgradx@#))
+  theoldlabel.@#(pic,_cart(tmppos) shifted (dec*_posgradx@#))
 enddef;
 
 vardef _etiqy_@#(expr ro,dec,st)=   %étiquettes axe des ordonnées
-  save pic;
+  save pic,tmppos;
   picture pic;
+   pair tmppos;
+   tmppos = _dessin_axe_y_ intersectionpoint droite(0,ro);
   if numeric st: pic:=LaTeX("$\num{" & decimal(st) & extranumy & "}$")
   elseif string st: pic:=LaTeX(st)
   else: pic:=st fi;
-  theoldlabel.@#(pic,_cart(xO,ro) shifted (dec*_posgrady@#))
+%  theoldlabel.@#(pic,_cart(xO,ro) shifted (dec*_posgrady@#))
+  theoldlabel.@#(pic,_cart(tmppos) shifted (dec*_posgrady@#))
 enddef;
 
 
 vardef graduationx(expr x)=          %%%%%%% graduation axe des abscisses
-   ((0,taillegrad)--(0,-taillegrad)) rotated (theta-90) shifted _cart(x,yO)
+   save tmppos;
+   pair tmppos;
+   tmppos = _dessin_axe_x_ intersectionpoint droite(x);
+%   ((0,taillegrad)--(0,-taillegrad)) rotated (theta-90) shifted _cart(x,yO)
+   ((0,taillegrad)--(0,-taillegrad)) rotated (theta-90) shifted _cart(tmppos)
 enddef;
 
 
 vardef graduationy(expr y)=          %%%%%%% graduation axe des ordonnées
-   ((taillegrad,0)--(-taillegrad,0)) shifted _cart(xO,y)
+   save tmppos;
+   pair tmppos;
+   tmppos = _dessin_axe_y_ intersectionpoint droite(0,y);
+%   ((taillegrad,0)--(-taillegrad,0)) shifted _cart(xO,y)
+   ((taillegrad,0)--(-taillegrad,0)) shifted _cart(tmppos)
 enddef;
 
 vardef etiquettex@#(expr x)=
@@ -369,11 +475,27 @@
 enddef;
 
 
-vardef dessinaxex=_cart(AxeXmin,yO)--_cart(AxeXmax,yO) enddef;
+%vardef cheminaxex=_cart(AxeXmin,yO)--_cart(AxeXmax,yO) enddef;
 
-vardef dessinaxey=_cart(xO,AxeYmin)--_cart(xO,AxeYmax) enddef;
+%vardef cheminaxey=_cart(xO,AxeYmin)--_cart(xO,AxeYmax) enddef;
 
+vardef cheminaxex=
+      (AxeXmin,yO)--
+        if (AxeXmin<xO) and (xO<AxeXmax):
+           (xO,yO)--
+        fi
+      (AxeXmax,yO)
+enddef;
 
+vardef cheminaxey=
+      (xO,AxeYmin)--
+        if (AxeYmin<yO) and (yO<AxeYmax):
+           (xO,yO)--
+        fi
+      (xO,AxeYmax)
+enddef;
+
+
 vardef graduationsaxex(expr grad)=      %%%% ensemble des graduations abscisses
    save $;picture $;
    $=image(%
@@ -404,27 +526,27 @@
    picture $,labmin,labmax;
    numeric imin,imax;
      $=image(%
-   	imin:=ceiling((ValXmin-xO)/val);imax:=floor((ValXmax-xO)/val);
-   	% définition première étiquette
+     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
+         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: olddraw labmin fi;
-   	% tracé autres étiquettes
-   	for i=imin+1 upto imax-1:
-    		if (i<>0):
-    		  olddraw etiquettex.@#(arrondimil(i*val)+xO)
-    		fi;
-   	endfor;
-   	% tracé dernière étiquette
-   	if xpart ((lrcorner labmax) transformed inverse _T)<=Xmax: olddraw labmax fi;
+         labmax:= etiquettex.@#(arrondimil(imax*val)+xO)
+     else: labmax:=nullpicture
+     fi;
+     % tracé première étiquette
+     if xpart ((ulcorner labmin) transformed inverse _T)>=Xmin: olddraw labmin fi;
+     % tracé autres étiquettes
+     for i=imin+1 upto imax-1:
+        if (i<>0):
+          olddraw etiquettex.@#(arrondimil(i*val)+xO)
+        fi;
+     endfor;
+     % tracé dernière étiquette
+     if xpart ((lrcorner labmax) transformed inverse _T)<=Xmax: olddraw labmax fi;
         );
       $
 enddef;
@@ -434,27 +556,27 @@
    picture $,labmin,labmax;
    numeric imin,imax;
      $=image(%
-   	imin:=ceiling((ValYmin-yO)/val);imax:=floor((ValYmax-yO)/val);
-   	% définition première étiquette
+     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
+         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 _cart(Xmin,Ymin): olddraw labmin fi;
-   	% tracé autres étiquettes
-   	for i=imin+1 upto imax-1:
-    		if (i<>0):
-    		  olddraw etiquettey.@#(arrondimil(i*val)+yO)
-    		fi;
-   	endfor;
-   	% tracé dernière étiquette
-   	if ypart (ulcorner labmax) <=ypart _cart(Xmax,Ymax): olddraw labmax fi
+         labmax:= etiquettey.@#(arrondimil(imax*val)+yO)
+     else: labmax:=nullpicture
+     fi;
+     % tracé première étiquette
+     if ypart (llcorner labmin) >=ypart _cart(Xmin,Ymin): olddraw labmin fi;
+     % tracé autres étiquettes
+     for i=imin+1 upto imax-1:
+        if (i<>0):
+          olddraw etiquettey.@#(arrondimil(i*val)+yO)
+        fi;
+     endfor;
+     % tracé dernière étiquette
+     if ypart (ulcorner labmax) <=ypart _cart(Xmax,Ymax): olddraw labmax fi
          );
       $
 enddef;
@@ -462,42 +584,48 @@
 vardef _axex_@#(expr grad,val,nn)=
    save $;
    picture $;
+   _dessin_axe_x_:= 
+              if type_trace="mainlevee": 
+                  mainlevee(cheminaxex) 
+              else: 
+                  cheminaxex
+              fi;
    $=image(
    %    axe
-   if flecheaxe: olddrawarrow  else: olddraw fi dessinaxex;
+   if flecheaxe: ddrawarrow  else: ddraw fi _dessin_axe_x_;
    %    graduations
    if grad>0: olddraw graduationsaxex(grad) fi;
    %    étiquettes
    if val>0:
-   	if nn=1:
-	       if str @#<>"":
-		  olddraw etiquettesaxex@#(val);
-		  _axorlab:=etiquettex@#(xO)
-	       else:
-		  olddraw etiquettesaxex.bot(val);
-		  _axorlab:=etiquettex.bot(xO)
-	       fi;
-	       poslabO:=poslabO + unitvector(0,ypart _posgradx@#);
-	       if xO<>yO:
-		  olddraw _axorlab
-	       elseif _nbaxes=2:
-		  olddraw _etiqx_(xO,0,xO) shifted (0.7*abs(llcorner _axorlab - urcorner _axorlab)*poslabO)
-	       fi
-	elseif nn=2:
-	       if str @#<>"":
-		  olddraw etiquettesaxex@#(val);
-		  olddraw etiquettex@#(xO)
-	       else:
-		  olddraw etiquettesaxex.bot(val);
-		  olddraw etiquettex.bot(xO)
-	       fi
-	else:
-	       if str @#<>"":
-		  olddraw etiquettesaxex@#(val)
-	       else:
-		  olddraw etiquettesaxex.bot(val)
-	       fi
-	fi
+     if nn=1:
+         if str @#<>"":
+      olddraw etiquettesaxex@#(val);
+      _axorlab:=etiquettex@#(xO)
+         else:
+      olddraw etiquettesaxex.bot(val);
+      _axorlab:=etiquettex.bot(xO)
+         fi;
+         poslabO:=poslabO + unitvector(0,ypart _posgradx@#);
+         if xO<>yO:
+      olddraw _axorlab
+         elseif _nbaxes=2:
+      olddraw _etiqx_(xO,0,xO) shifted (0.7*abs(llcorner _axorlab - urcorner _axorlab)*poslabO)
+         fi
+  elseif nn=2:
+         if str @#<>"":
+      olddraw etiquettesaxex@#(val);
+      olddraw etiquettex@#(xO)
+         else:
+      olddraw etiquettesaxex.bot(val);
+      olddraw etiquettex.bot(xO)
+         fi
+  else:
+         if str @#<>"":
+      olddraw etiquettesaxex@#(val)
+         else:
+      olddraw etiquettesaxex.bot(val)
+         fi
+  fi
    fi
    );
    $
@@ -506,42 +634,48 @@
 vardef _axey_@#(expr grad,val,nn)=
    save $;
    picture $;
+   _dessin_axe_y_:=
+        if type_trace="mainlevee":
+           mainlevee(cheminaxey)
+        else:
+           cheminaxey
+        fi;
    $=image(
    %    axe
-   if flecheaxe: olddrawarrow  else: olddraw fi dessinaxey;
+   if flecheaxe: ddrawarrow  else: ddraw fi _dessin_axe_y_;
    %    graduations
    if grad>0: olddraw graduationsaxey(grad) fi;
    %    étiquettes
    if val>0:
-   	if nn=1:
-	       if str @#<>"":
-		  olddraw etiquettesaxey@#(val);
-		  _axorlab:=etiquettey@#(yO)
-	       else:
-		  olddraw etiquettesaxey.lft(val);
-		  _axorlab:=etiquettey.lft(yO)
-	       fi;
-	       poslabO:=poslabO + unitvector(xpart _posgrady@#,0);
-	       if xO<>yO:
-		  olddraw _axorlab
-	       elseif _nbaxes=2:
-		  olddraw _etiqy_(yO,0,yO) shifted (0.7*abs(llcorner _axorlab - urcorner _axorlab)*poslabO)
-	       fi
-	elseif nn=2:
-	       if str @#<>"":
-		  olddraw etiquettesaxey@#(val);
-		  olddraw etiquettey@#(yO)
-	       else:
-		  olddraw etiquettesaxey.lft(val);
-		  olddraw etiquettey.lft(yO)
-	       fi
-	else:
-	       if str @#<>"":
-		  olddraw etiquettesaxey@#(val)
-	       else:
-		  olddraw etiquettesaxey.lft(val)
-	       fi
-	fi
+     if nn=1:
+         if str @#<>"":
+      olddraw etiquettesaxey@#(val);
+      _axorlab:=etiquettey@#(yO)
+         else:
+      olddraw etiquettesaxey.lft(val);
+      _axorlab:=etiquettey.lft(yO)
+         fi;
+         poslabO:=poslabO + unitvector(xpart _posgrady@#,0);
+         if xO<>yO:
+      olddraw _axorlab
+         elseif _nbaxes=2:
+      olddraw _etiqy_(yO,0,yO) shifted (0.7*abs(llcorner _axorlab - urcorner _axorlab)*poslabO)
+         fi
+  elseif nn=2:
+         if str @#<>"":
+      olddraw etiquettesaxey@#(val);
+      olddraw etiquettey@#(yO)
+         else:
+      olddraw etiquettesaxey.lft(val);
+      olddraw etiquettey.lft(yO)
+         fi
+  else:
+         if str @#<>"":
+      olddraw etiquettesaxey@#(val)
+         else:
+      olddraw etiquettesaxey.lft(val)
+         fi
+  fi
    fi
    );
    $
@@ -625,15 +759,15 @@
      else: fraction:=""
    fi;
    if dd=1:
-   	if nn=1:
-   	  fr:=tt
-   	  else: fr:=decimal nn & tt
-   	fi
+     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
+     if nn=1:
+       fr:="\" & fraction & "frac{" & tt & "}{" & decimal dd & "}"
+       else: fr:="\" & fraction & "frac{" & decimal nn & tt & "}{" & decimal dd & "}"
+     fi
    fi;
    if n<0:
      s:="-"
@@ -666,27 +800,27 @@
    numeric imin,imax,val;
     val:=n*pi/d;
      $=image(%
-   	imin:=ceiling((ValXmin-xO)/val);imax:=floor((ValXmax-xO)/val);
-   	% définition première étiquette
+     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
+         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;
+         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;
@@ -697,27 +831,27 @@
    numeric imin,imax,val;
     val:=n*pi/d;
      $=image(%
-   	imin:=ceiling((ValYmin-yO)/val);imax:=floor((ValYmax-yO)/val);
-   	% définition première étiquette
+     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
+         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 _cart(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 _cart(Xmax,Ymax): draw labmax fi
+         labmax:= etiquetteypi.@#(imax*n,d)
+     else: labmax:=nullpicture
+     fi;
+     % tracé première étiquette
+     if ypart (llcorner labmin) >=ypart _cart(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 _cart(Xmax,Ymax): draw labmax fi
          );
       $
 enddef;
@@ -727,39 +861,45 @@
    numeric grad;
    picture $;
    grad:=num*pi/den;
+   _dessin_axe_x_:= 
+              if type_trace="mainlevee": 
+                  mainlevee(cheminaxex) 
+              else: 
+                  cheminaxex
+              fi;
    $=image(
    %    axe
-   if flecheaxe: olddrawarrow  else: olddraw fi dessinaxex;
+   if flecheaxe: ddrawarrow  else: ddraw fi _dessin_axe_x_;
    %    graduations
    if grad>0: draw graduationsaxex(grad) fi;
    %    étiquettes
    if nn=1:
        if str @#<>"":
-	  draw etiquettesaxexpi@#(num,den);
-	  _axorlab:=etiquettexpi@#(xO/pi,1)
+    draw etiquettesaxexpi@#(num,den);
+    _axorlab:=etiquettexpi@#(xO/pi,1)
        else:
-	  draw etiquettesaxexpi.bot(num,den);
-	  _axorlab:=etiquettexpi.bot(xO/pi,1)
+    draw etiquettesaxexpi.bot(num,den);
+    _axorlab:=etiquettexpi.bot(xO/pi,1)
        fi;
        poslabO:=poslabO + unitvector(0,ypart _posgradx@#);
        if xO<>yO:
-	  draw _axorlab
+    draw _axorlab
        elseif _nbaxes=2:
-	  draw  _etiqx_(xO,0,fracmultpi(xO/pi,1)) shifted (0.7*abs(llcorner _axorlab - urcorner _axorlab)*poslabO)
+    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)
+    draw etiquettesaxexpi@#(num,den);
+    draw etiquettexpi@#(xO/pi,1)
        else:
-	  draw etiquettesaxexpi.bot(num,den);
-	  draw etiquettexpi.bot(xO/pi,1)
+    draw etiquettesaxexpi.bot(num,den);
+    draw etiquettexpi.bot(xO/pi,1)
        fi
    else:
        if str @#<>"":
-	  draw etiquettesaxexpi@#(num,den)
+    draw etiquettesaxexpi@#(num,den)
        else:
-	  draw etiquettesaxexpi.bot(num,den)
+    draw etiquettesaxexpi.bot(num,den)
        fi
    fi
    );
@@ -771,40 +911,46 @@
    numeric grad;
    picture $;
    grad:=num*pi/den;
+   _dessin_axe_y_:= 
+              if type_trace="mainlevee": 
+                  mainlevee(cheminaxey) 
+              else: 
+                  cheminaxey
+              fi;
    $=image(
    %    axe
-   if flecheaxe: olddrawarrow  else: olddraw fi dessinaxey;
+   if flecheaxe: ddrawarrow  else: ddraw fi _dessin_axe_y_;
    %    graduations
    if grad>0: draw graduationsaxey(grad) fi;
    %    étiquettes
    if nn=1:
        if str @#<>"":
-	  draw etiquettesaxeypi@#(num,den);
-	  _axorlab:=etiquetteypi@#(yO/pi,1)
+    draw etiquettesaxeypi@#(num,den);
+    _axorlab:=etiquetteypi@#(yO/pi,1)
        else:
-	  draw etiquettesaxeypi.lft(num,den);
-	  _axorlab:=etiquetteypi.lft(yO/pi,1)
+    draw etiquettesaxeypi.lft(num,den);
+    _axorlab:=etiquetteypi.lft(yO/pi,1)
        fi;
        poslabO:=poslabO + unitvector(xpart _posgrady@#,0);
        if xO<>yO:
-	  draw _axorlab
+    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)
+    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)
+    draw etiquettesaxeypi@#(num,den);
+    draw etiquetteypi@#(yO/pi,1)
        else:
-	  draw etiquettesaxeypi.lft(num,den);
-	  draw etiquetteypi.lft(yO/pi,1)
+    draw etiquettesaxeypi.lft(num,den);
+    draw etiquetteypi.lft(yO/pi,1)
        fi
    else:
        if str @#<>"":
-	  draw etiquettesaxeypi@#(num,den)
+    draw etiquettesaxeypi@#(num,den)
        else:
-	  draw etiquettesaxeypi.lft(num,den)
+    draw etiquettesaxeypi.lft(num,den)
        fi
    fi
    );
@@ -886,19 +1032,19 @@
    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;
-		if gradxpart:
-		   olddraw graduationx(_i) withpen pencircle scaled 0.8bp
-		fi;
-		tmp:=_i;
-		var:=true
-	   else:
-		if str @#="": draw _etiqx_.bot(tmp,taillegrad,_i) else: draw _etiqx_@#(tmp,taillegrad,_i) fi;
-		var:=false
-	   fi;
-	endfor;
+  for _i=t:
+     if numeric _i:
+    if var: if str @#="": draw _etiqx_.bot(tmp,taillegrad,tmp) else: draw _etiqx_@#(tmp,taillegrad,tmp) fi fi;
+    if gradxpart:
+       olddraw graduationx(_i) withpen pencircle scaled 0.8bp
+    fi;
+    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;
@@ -910,20 +1056,20 @@
    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;
-%		olddraw ((taillegrad,0)--(-taillegrad,0)) shifted _cart(xO,_i) withpen pencircle scaled 0.8bp;
-		if gradypart:
-		   olddraw graduationy(_i) withpen pencircle scaled 0.8bp
-		fi;
-		tmp:=_i;
-		var:=true
-	   else:
-		if str @#="": draw _etiqy_.lft(tmp,taillegrad,_i) else: draw _etiqy_@#(tmp,taillegrad,_i) fi;
-		var:=false
-	   fi;
-	endfor;
+  for _i=t:
+     if numeric _i:
+    if var: if str @#="": draw _etiqy_.lft(tmp,taillegrad,tmp) else: draw _etiqy_@#(tmp,taillegrad,tmp) fi fi;
+%    olddraw ((taillegrad,0)--(-taillegrad,0)) shifted _cart(xO,_i) withpen pencircle scaled 0.8bp;
+    if gradypart:
+       olddraw graduationy(_i) withpen pencircle scaled 0.8bp
+    fi;
+    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;
@@ -1009,12 +1155,13 @@
   draw marquepointFig(pp)
 enddef;
 
+let MarquePoint = marquepoint;
 
 def marquepoints(text t) text q =      %geometriesyr15
-  for p_ = t: show p_; if pair p_: marquepoint(p_) q; fi endfor;
+  for p_ = t: if pair p_: marquepoint(p_) q; fi endfor;
 enddef;
 
-let MarquePoint = marquepoint;
+let pointe = marquepoints;
 
 % Juin 2019 : placement fin des étiquettes (angle donné)
 vardef thelabelang@#(expr s,z)=
@@ -1596,6 +1743,7 @@
   save i,pp;
   numeric i;
   path pp;
+  if unknown P: pair P[] fi;
   pp:=p;
   i:=1;
   forever:
@@ -1629,6 +1777,7 @@
 
 vardef antecedents(suffix P)(expr y,p)=
   pair PP[];
+  numeric P[];
   ptantecedents(PP,y,p);
   for i=1 upto 10: P[i]:=xpart (PP[i]); endfor
 enddef;
@@ -1919,9 +2068,9 @@
    c:= ypart direction t of p;
    _v:=N2*unitvector(direction t of p);
    $=image(%
-		marquepoint(M);
-		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;
+    marquepoint(M);
+    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+ )
@@ -1993,22 +2142,34 @@
 %%%%%%%%%%   DROITES   %%%%%%%%%
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 vardef droiteeqred(expr a,b)=
- save $;
- path $;
- if (-(Ymax-Ymin)/(Xmax-Xmin)<a) and ((Ymax-Ymin)/(Xmax-Xmin)>a):
-  $:=(XmiN,a*XmiN+b)--(XmaX,a*XmaX+b);
+ save Pdr;
+ pair Pdr[];
+ if ((Ymin<a*Xmin+b) and (a*Xmin+b<Ymax)) or (a=0):
+  Pdr[1]:=(Xmin,a*Xmin+b)
  elseif a>0:
-  $:=(YmiN/a-b/a,YmiN)--(YmaX/a-b/a,YmaX);
+  Pdr[1]:=((Ymin-b)/a,Ymin)
  else:
-  $:=(YmaX/a-b/a,YmaX)--(YmiN/a-b/a,YmiN);
+  Pdr[1]:=((Ymax-b)/a,Ymax)
  fi;
- $
+ if ((Ymin<a*Xmax+b) and (a*Xmax+b<Ymax)) or (a=0):
+  Pdr[2]:=(Xmax,a*Xmax+b)
+ elseif a>0:
+  Pdr[2]:=((Ymax-b)/a,Ymax)
+ else:
+  Pdr[2]:=((Ymin-b)/a,Ymin)
+ fi;
+ Pdr[1]--
+   if (Xmin<0) and (0<Xmax) and (Ymin<b) and (b<Ymax): (0,b)-- fi
+ Pdr[2]
 enddef;
 
 vardef droiteeqx(expr c)=
-  (c,2*Ymin-Ymax)--(c,2*Ymax-Ymin)
+  (c,Ymax)--
+     if (Ymin<c) and (c<Ymax): (c,0)-- fi
+  (c,Ymin)
 enddef;
 
+
 vardef droiteeqcart(expr a,b,c)=
  save $;
  path $;
@@ -2030,8 +2191,8 @@
 enddef;
 
 
-vardef droitept(expr A,B)=  %geometrie15syr
-  (_diag/abs(A-B))[B,A]--(_diag/abs(A-B))[A,B]
+vardef droitept(expr A,B)=
+  (_diag/abs(A-B))[B,A]--A--B--(_diag/abs(A-B))[A,B]
 enddef;
 
 vardef droite(text t)=
@@ -2185,7 +2346,7 @@
 
 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
+  _suiterecdeb_:=deb;_suiterecfin_:=fin;_suiterecinit_:=init;  %stocke les valeurs pour réutilisation
   save $,un;
   path $;
   numeric un;
@@ -2198,7 +2359,7 @@
   $
 enddef;
 
-vardef suiterecprojx@#(text t)=   	%projections et étiquettes sur axe x, utilise les valeurs de suiterec
+vardef suiterecprojx@#(text t)=     %projections et étiquettes sur axe x, utilise les valeurs de suiterec
   save $,deb,fin,nom,_qw_,un,lab;
   picture $;
   string nom,lab;
@@ -2205,13 +2366,13 @@
   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
+  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
+        deb:=i;
+        for j=_suiterecdeb_ upto i-1:
+          un:=_suiterecfonc_(un);
+        endfor
     elseif _qw_=3: fin:=i
     fi;
     _qw_:=_qw_+1;
@@ -2249,7 +2410,7 @@
   $
 enddef;
 
-vardef suiterecprojy@#(text t)=   	%projections et étiquettes sur axe y, utilise les valeurs de suiterec
+vardef suiterecprojy@#(text t)=     %projections et étiquettes sur axe y, utilise les valeurs de suiterec
   save $,deb,fin,nom,_qw_,un,lab;
   picture $;
   string nom,lab;
@@ -2256,13 +2417,13 @@
   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
+  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
+        deb:=i;
+        for j=_suiterecdeb_ upto i-2:
+          un:=_suiterecfonc_(un);
+        endfor
     elseif _qw_=3: fin:=i
     fi;
     _qw_:=_qw_+1;
@@ -2694,11 +2855,9 @@
   poly
 enddef;
 
-if not known typetrace:
-  vardef triangle(expr A,B,C)=
+vardef triangle(expr A,B,C)=
     polygone(A,B,C)
-  enddef;
-fi
+enddef;
 
 vardef parallelogramme(expr A,O,B)=
   O--A--(A+B-O)--B--cycle
@@ -2859,6 +3018,9 @@
    fullcircle scaled (0.5taille_marque_s*echelle_marque_s)
 enddef;
 
+%%
+%% Figure de forme f, orientée en fonction de A--B
+%%
 vardef marqueunique_s(expr A,B,f)=
    if f="o":
       marqueuniquerond_s(A,B)
@@ -2872,6 +3034,23 @@
 enddef;
 
 
+vardef marquepathpos(expr p,n,f,t)=
+ save $,AA,BB;
+ pair AA,BB;
+ AA:= point 0 of p;
+ BB:= point (length p) of p;
+ picture $;
+ $=image(
+    for i=1 upto n:
+      draw marqueunique_s(AA,BB,f) shifted ((i-1-(n-1)/2)*sep_marque_s*unitvector(_cart(BB)-_cart(AA))) transformed inverse _T;
+    endfor
+    );
+  $ shifted ((point (arctime t*(arclength p) of p) of p) transformed _T)
+enddef;
+
+%%
+%% n figures de forme f orientée en fonction de A--B et placées autour du milieu
+%%
 vardef marqueseg(expr A,B,n,f)=
  save $;
  picture $;
@@ -2883,12 +3062,18 @@
   $ shifted milieu(_cart(A),_cart(B))
 enddef;
 
+%%
+%% Macro utilisateur t=A,B,n,f ou t=A,B,f ou t=A,B,n
+%%
 vardef marquesegment(text t)=
- save n,N,Pti,Ptii,tmpfig,tmpforme;
+ save n,N,Pti,Ptii,tmpfig,tmpforme,boolpath,tmppath;
  numeric n,N;
  picture tmpfig;
  string tmpforme;
  pair Pti,Ptii;
+ path tmppath;
+ boolean boolpath;
+ boolpath:=false;
  tmpforme:=substring (0,1) of forme_marque_s;
  N:=0;
  n:=1;
@@ -2895,19 +3080,24 @@
  for i=t:
    if numeric i: n:=i 
    elseif string i: tmpforme:=substring (0,1) of i;n:=length i
+   elseif path i: boolpath:=true;tmppath:=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,tmpforme);
-  fi;
- endfor
-     );
+ if boolpath:
+   tmpfig:= marquepathpos(tmppath,n,tmpforme,0.5)
+ else:
+   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,tmpforme);
+    fi;
+   endfor
+     )
+ fi;
   tmpfig
 enddef;
 
@@ -3183,7 +3373,7 @@
    fi
 enddef;
 
-vardef TriangleComplet(suffix AA,BB,CC)(expr chAA,chBB,chCC,coteAB,coteBC,coteCA,angAA,angBB,angCC) text t =
+vardef TriangleComplet(suffix AA,BB,CC)(expr chAA,chBB,chCC,coteAB,coteBC,coteCA,angAA,angBB,angCC) =
 %% Trace le triangle, les noms des points, les cotes et les angles
   save tmpang,tmpfig,tmpscale,sensdir;
   numeric tmpang,tmpscale;
@@ -3196,66 +3386,66 @@
   tmpscale:=defaultscale;
   picture tmpfig;
   tmpfig:=image(%
-     draw triangle (AA,BB,CC) t;
+     draw triangle (AA,BB,CC);
      if AffPoints:
         tmpang:=angle(0.5BB+0.5CC-AA)+180;
-        nomme[tmpang](AA,chAA) t withpen currentpen;
+        nomme[tmpang](AA,chAA) withpen currentpen;
         tmpang:=angle(0.5AA+0.5CC-BB)+180;
-        nomme[tmpang](BB,chBB) t withpen currentpen;
+        nomme[tmpang](BB,chBB) withpen currentpen;
         tmpang:=angle(0.5BB+0.5AA-CC)+180;
-        nomme[tmpang](CC,chCC) t withpen currentpen;
+        nomme[tmpang](CC,chCC) 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;
+        cote(AA,BB,coteAB);
+        if rep_type_triangle=0: cote(BB,CC,coteBC) fi;
+        if rep_type_triangle<=1: cote(CC,AA,coteCA) fi;
 %     elseif AffCotes:
      else:
-        cotepolyplacee(AA,BB)(coteAB,sensdir) t;
-        cotepolyplacee(BB,CC)(coteBC,sensdir) t;
-        cotepolyplacee(CC,AA)(coteCA,sensdir) t;
+        cotepolyplacee(AA,BB)(coteAB,sensdir);
+        cotepolyplacee(BB,CC)(coteBC,sensdir);
+        cotepolyplacee(CC,AA)(coteCA,sensdir);
      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
+             draw marqueangledroit(BB,AA,CC) withpen currentpen
           else:
-             draw marqueangle(BB,AA,CC,1) t withpen currentpen;
-             nomme(BB,AA,CC,angAA) t;
+             draw marqueangle(BB,AA,CC) withpen currentpen;
+             nomme(BB,AA,CC,angAA);
           fi;
         fi;
         if rep_type_triangle=2:
           if rep_ad_B and AutoAngleDroit:
-             draw marqueangledroit(CC,BB,AA) t withpen currentpen
+             draw marqueangledroit(CC,BB,AA) withpen currentpen
           else:
-             draw marqueangle(CC,BB,AA,1) t withpen currentpen;
-             nomme(CC,BB,AA,angBB) t;
+             draw marqueangle(CC,BB,AA) withpen currentpen;
+             nomme(CC,BB,AA,angBB);
           fi;
         fi;
      else:
         if (nang>=1):
           if rep_ad_A and AutoAngleDroit:
-             draw marqueangledroit(BB,AA,CC) t withpen currentpen
+             draw marqueangledroit(BB,AA,CC) withpen currentpen
           else:
-             draw marqueangle(BB,AA,CC,1) t withpen currentpen;
-             nomme(BB,AA,CC,angAA) t;
+             draw marqueangle(BB,AA,CC);
+             nomme(BB,AA,CC,angAA);
           fi;
         fi
         if (nang>=2):
           if rep_ad_B and AutoAngleDroit:
-             draw marqueangledroit(CC,BB,AA) t withpen currentpen
+             draw marqueangledroit(CC,BB,AA) withpen currentpen
           else:
-             draw marqueangle(CC,BB,AA,1) t withpen currentpen;
-             nomme(CC,BB,AA,angBB) t;
+             draw marqueangle(CC,BB,AA) withpen currentpen;
+             nomme(CC,BB,AA,angBB);
           fi;
         fi
         if (nang=3):
           if rep_ad_C and AutoAngleDroit:
-             draw marqueangledroit(AA,CC,BB) t withpen currentpen
+             draw marqueangledroit(AA,CC,BB) withpen currentpen
           else:
-             draw marqueangle(AA,CC,BB,1) t withpen currentpen;
-             nomme(AA,CC,BB,angCC) t;
+             draw marqueangle(AA,CC,BB) withpen currentpen;
+             nomme(AA,CC,BB,angCC);
           fi;
         fi
      fi
@@ -3556,11 +3746,11 @@
   rep_tri_la:=arrondi(10**ArrondiCotes,rep_tri_la);
 enddef;
 
-vardef TriangleLLA(text q)(text s)(text p)(text c)(text a) text r=
+vardef TriangleLLA(text q)(text s)(text p)(text c)(text a)=
 %% Macro utilisateur, definit le triangle et appelle la macro de tracé
   defTriangleLLA(q)(s);
   rep_type_triangle:=1;
-  ProcessAffTriangles(q)(p)(c)(a) r
+  ProcessAffTriangles(q)(p)(c)(a)
 enddef;
 
 vardef triangleLLA(suffix AA,BB,CC)(text s)=
@@ -3570,11 +3760,11 @@
   triangle(AA,BB,CC)
 enddef;
 
-vardef TriangleLAA(text q)(text s)(text p)(text c)(text a) text r=
+vardef TriangleLAA(text q)(text s)(text p)(text c)(text a)=
 %% Macro utilisateur, definit le triangle et appelle la macro de tracé
   defTriangleLAA(q)(s);
   rep_type_triangle:=2;
-  ProcessAffTriangles(q)(p)(c)(a) r
+  ProcessAffTriangles(q)(p)(c)(a)
 enddef;
 
 vardef triangleLAA(suffix AA,BB,CC)(text s)=
@@ -3584,11 +3774,11 @@
   triangle(AA,BB,CC)
 enddef;
 
-vardef TriangleLLL(text q)(text s)(text p)(text c)(text a) text r=
+vardef TriangleLLL(text q)(text s)(text p)(text c)(text a)=
 %% Macro utilisateur, definit le triangle et appelle la macro de tracé
   defTriangleLLL(q)(s);
   rep_type_triangle:=0;
-  ProcessAffTriangles(q)(p)(c)(a) r
+  ProcessAffTriangles(q)(p)(c)(a)
 enddef;
 
 vardef triangleLLL(suffix AA,BB,CC)(text s)=
@@ -3599,15 +3789,15 @@
 enddef;
 
 
-vardef Triangle(text q)(text p)(text c)(text a) text r=
+vardef Triangle(text q)(text p)(text c)(text a)=
   defTriangle(q);
   rep_type_triangle:=3;
-  ProcessAffTriangles(q)(p)(c)(a) r
+  ProcessAffTriangles(q)(p)(c)(a)
 enddef;
 
 
 
-vardef ProcessAffTriangles(text q)(text p)(text c)(text a) text r=
+vardef ProcessAffTriangles(text q)(text p)(text c)(text a)=
 %% 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;
@@ -3676,7 +3866,7 @@
   if count_tmp>0: nang:= count_tmp elseif AffAngles: nang:=3 else: nang:=0 fi;
   AffCotes:=tmpaffcotes;AffAngles:=tmpaffangles;
 %
-  TriangleComplet(q)(chAA,chBB,chCC,chc,cha,chb,changA,changB,changC) r
+  TriangleComplet(q)(chAA,chBB,chCC,chc,cha,chb,changA,changB,changC)
 enddef;
 
 



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