summaryrefslogtreecommitdiff
path: root/Master
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2019-06-11 21:01:20 +0000
committerKarl Berry <karl@freefriends.org>2019-06-11 21:01:20 +0000
commit67fdef123d0cd393e03d0e6a37e2a427e064d47e (patch)
treee96cef4f33394332603a5b87685fbb96f81121ae /Master
parent53e76e173ff235ac45b40637cf0763fb02359af1 (diff)
repere (11jun19)
git-svn-id: svn://tug.org/texlive/trunk@51363 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master')
-rw-r--r--Master/texmf-dist/doc/metapost/repere/README.md2
-rw-r--r--Master/texmf-dist/doc/metapost/repere/repere-doc.pdfbin456296 -> 479044 bytes
-rw-r--r--Master/texmf-dist/doc/metapost/repere/repere-doc.tex89
-rw-r--r--Master/texmf-dist/metapost/repere/repere.mp165
4 files changed, 224 insertions, 32 deletions
diff --git a/Master/texmf-dist/doc/metapost/repere/README.md b/Master/texmf-dist/doc/metapost/repere/README.md
index 51ec41481bc..9759657f6ae 100644
--- a/Master/texmf-dist/doc/metapost/repere/README.md
+++ b/Master/texmf-dist/doc/metapost/repere/README.md
@@ -1,4 +1,4 @@
-Package repere - Version 17.11.2 - November 12, 2017
+Package repere - Version 19.06 - June 11, 2019
This package provides MetaPost macros for drawing sec­ondary school math­e­mat­ics figures in a coordinate system :
- axis, grids
diff --git a/Master/texmf-dist/doc/metapost/repere/repere-doc.pdf b/Master/texmf-dist/doc/metapost/repere/repere-doc.pdf
index ab144948041..2ba3e22bec9 100644
--- a/Master/texmf-dist/doc/metapost/repere/repere-doc.pdf
+++ b/Master/texmf-dist/doc/metapost/repere/repere-doc.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/metapost/repere/repere-doc.tex b/Master/texmf-dist/doc/metapost/repere/repere-doc.tex
index f2e4d1f9397..b13edafcd68 100644
--- a/Master/texmf-dist/doc/metapost/repere/repere-doc.tex
+++ b/Master/texmf-dist/doc/metapost/repere/repere-doc.tex
@@ -3,10 +3,10 @@
%http://melusine.eu.org/syracuse/poulecl/geometriesyr16/distrib/geometriesyr16-050408.tgz
% To compile:
-% (pdf)latex repere-doc.tex
-% mpost repere-doc.mp
-% mpost repere-doc.mp
-% (pdf)latex repere-doc.tex
+% pdflatex repere-doc.tex
+% mptopdf repere-doc.mp
+% mptopdf repere-doc.mp
+% pdflatex repere-doc.tex
\usepackage{calc,ifthen}
@@ -149,6 +149,7 @@
\IfFileExists{\jobname.\thenumfig}%
{\begin{minipage}[c]{\largeurfig}
\centering \includegraphics{\jobname.\thenumfig}\par
+% \centering a\includegraphics{reperedocfig2.mps}a\par
\end{minipage}}{}
\par}
@@ -239,6 +240,7 @@
\begin{codecache}
+%outputtemplate := "%j-%c.mps";
input geometriesyr16;
input repere;
\end{codecache}
@@ -592,7 +594,7 @@ Les macros suivantes sont directement inspirées des macros similaires de \verb+
\item[pointe(A,B,C...)] permet de marquer plusieurs points.
-\item[nomme.pos(A,nom)] marque le point et affiche son nom à la position \verb+pos+. \verb+nom+ peut être soit une chaîne de caractères, soit une expression du type \verb+btex ... etex+, soit une autre figure. Si \verb+nom+ est omis, le nom \verb+A+ est affiché. S'il s'agit d'un élément d'un tableau de points (\verb+A1+, \verb+A2+...), le nombre est affiché en indice.
+\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.
\end{description}
@@ -618,7 +620,23 @@ 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[];
+ A=(-2,-1);B=(1,-2);
+ nomme[40](A);nomme[70](A);nomme[100](A);
+ nomme[-110](B);
+ for i=0 upto 8:
+ C[i]:= (1+1.5*cosd(40i),1+1.5*sind(40i));
+ nomme[40*i](C[i]) couleur pourpre;
+ endfor
+draw cadre;
+fin;
+\end{exemple}
\subsection{Vecteurs}
@@ -680,6 +698,28 @@ draw droite(2,3,-1) withcolor vertfonce; %2x+3y-1=0
fin;
\end{exemple}
+\subsection{Demi-droites}
+\begin{description}
+\item[demidroite(A,B)] demi-droite $[AB)$.
+
+\item[demidroite(A,a)] demi-droite d'origine $A$ qui fait un angle $a$ avec la direction $(Ox)$.
+\end{description}
+
+
+\begin{exemple}
+repere(-4,4,0.9cm,-3,4,0.9cm);
+pair A,B,C;
+numeric a;
+A=(-1,1);B=(2,2);C=(-1,-2);
+draw axes(1,0);
+draw demidroite(A,B);
+nomme.llft(A);nomme.lrt(B);
+draw demidroite(C,0) dashed evenly;
+draw demidroite(C,120);
+nomme.llft(C);
+fin;
+\end{exemple}
+
\subsection{Courbes et fonctions}
\MP{} permet de définir simplement des fonctions (en utilisant par exemple la syntaxe suivante :
\verb|vardef f(expr x)=2x+1 enddef;|) et de définir des courbes passant par des points donnés (\verb+A..B..C+). Ces possibilités sont utilisées dans les macros qui suivent.
@@ -973,6 +1013,30 @@ endfor
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;
+A=(0,1);B=(3,7);C=(6,2);D=(9,6);
+path S,T;
+S=spline(A,B,C,D)();
+T=spline(A,0.5,B,C,0,D,-2)();
+draw quadrillage(1,1);
+draw axes(1,1);
+draw S epaisseur 1 couleur bleu;
+draw T epaisseur 1 couleur rouge;
+draw tangente.double(T,0) couleur rouge;
+draw tangente.double(T,6) couleur rouge;
+draw tangente.double(T,9) couleur rouge;
+nomme.lrt(A);nomme.top(B);
+nomme.llft(C);nomme.rt(D);
+fin;
+\end{exemple}
+
\section{Suites}
\begin{description}
@@ -1442,13 +1506,19 @@ fin;
\subsection{Codage des segments et des angles}
\begin{description}
-\item[marqueangle(A,O,B,n)] Figure formée de \verb|n| arcs de cercle de centre $O$ et de rayon moyen \verb|taille_marque_a| (qui vaut par défaut \verb|0.4cm|) permettant de marquer l'angle géométrique $\widehat{AOB}$. Les arcs son séparés de \verb|sep_marque_a| qui vaut par défaut \verb|1.5|.
+\item[taille\_marque\_a] Valeur numérique (qui vaut par défaut \verb|0.4cm|) donnant le rayon des arcs de cercles servant à marquer les angles.
+
+\item[sep\_marque\_a] Valeur numérique (qui vaut par défaut \verb|1.5bp|) donnant la différence de rayon entre les différents arcs servant à marquer les angles.
+
+\item[marqueangle(A,O,B,n)] Figure formée de \verb|n| arcs de cercle de centre $O$ et de rayon moyen \verb|taille_marque_a| permettant de marquer l'angle géométrique $\widehat{AOB}$. Les arcs (si \verb|n| est supérieur à 1) sont séparés de \verb|sep_marque_a|.
Il s'agit d'un chemin fermé qui peut donc être rempli.
\item[marqueangle(A,O,B)] Arc de cercle de centre \verb|O| et de rayon \verb|taille_marque_a| permettant de marquer l'angle orienté avec \verb|drawarrow|.
-\item[nomme.pos(A,O,B,texte)] Place le texte entre \verb|A| et \verb|B|, à une distance \verb|taille_marque_a| du centre, à la position \verb|pos|.
+\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.
\end{description}
@@ -1464,7 +1534,8 @@ draw marqueangle(C,B,A,3);
drawarrow marqueangle(A,C,B);
fill marqueangle(B,A,C,1) withcolor vert;
draw marqueangle(B,A,C,1);
-nomme.rt(B,A,C,"\ang{45}");
+nomme[20](B,A,C,"\ang{45}");
+nomme(C,B,A,"$\alpha$");
fin;
\end{exemple}
@@ -1491,7 +1562,7 @@ nomme.llft(A');nomme.lrt(B');nomme.ulft(C');
drawoptions(withcolor vertfonce);
draw vecteur.lrt(B,u);draw vecteur.lrt(C,u);
fin;
-\end{exemple}%
+\end{exemple}
\section{Divers}
\subsection{Composition des étiquettes}
diff --git a/Master/texmf-dist/metapost/repere/repere.mp b/Master/texmf-dist/metapost/repere/repere.mp
index 2c568e3884c..02595f91aa8 100644
--- a/Master/texmf-dist/metapost/repere/repere.mp
+++ b/Master/texmf-dist/metapost/repere/repere.mp
@@ -2,7 +2,7 @@
%% repere.mp %%
%% Macros pour la construction de figures dans un repère %%
%% o.peault@posteo.net %%
-%% Version 17.11.2 (Novembre 2017) %%
+%% Version 19.06 (Juin 2019) %%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% This work may be distributed and/or modified under the conditions of
@@ -12,6 +12,10 @@
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Mars 2019 : changement spline
+% Juin 2019 : demi-droites, nomme[<angle>]
+% À faire : extratextx, extratexty
+
input format;
if not known mplib: input latexmp fi;
@@ -965,21 +969,50 @@ vardef pointe(text t) = %geometriesyr15
for p_ = t: if pair p_: MarquePoint(p_); fi endfor;
enddef;
+% Juin 2019 : placement fin des étiquettes (angle donné)
+vardef thelabelang@#(expr s,z)=
+ save tmpang,tmpfig,tmppt,tmppath,tmpstr;
+ string tmpstr;
+ numeric tmpang;
+ pair tmppt;
+ path tmppath;
+ save p; picture p;
+ tmpstr := str @#;
+ if picture s: p=s
+ else: p = LaTeX(s)
+ fi;
+ tmppath := llcorner p -- lrcorner p -- urcorner p -- ulcorner p -- cycle;
+ if ASCII tmpstr = 91:
+ tmpang := scantokens substring(1,length(tmpstr)-1) of tmpstr
+ else:
+ tmpang := scantokens tmpstr
+ fi;
+ tmppt := tmppath intersectionpoint (0.5urcorner p-- (0.5urcorner p + 100 * (dir (180+tmpang))));
+ p shifted (-tmppt + _cart(z) + labeloffset*(cosd(tmpang),sind(tmpang)) )
+enddef;
+
+def labelang = draw thelabelang enddef;
+
vardef nommepoint@#(text t)=
save $,ch,dess,latch;
pair $;
string ch,latch;
picture dess;
+ if (ASCII str @# < 58) or (ASCII str @# = 91):
+ def mylabel = labelang enddef
+ else:
+ def mylabel = label enddef
+ fi;
if long_texte(t)=1:
dess:=image(draw MarquePointFig(t);
ch:=_chaine(t);
- label@#("$" & ch & "$",t) withcolor coullabel)
+ mylabel@#("$" & ch & "$",t) withcolor coullabel)
else:
dess:=image(%
for PP=t:
if pair PP: MarquePoint(PP); $:=PP
- else: if string PP: label@#(PP,$) else: label@#(PP scaled defaultscale,$) fi withcolor coullabel
+ else: if string PP: mylabel@#(PP,$) else: mylabel@#(PP scaled defaultscale,$) fi withcolor coullabel
fi;
endfor)
fi;
@@ -987,6 +1020,8 @@ vardef nommepoint@#(text t)=
enddef;
+
+
vardef nommecourbe@#(suffix p)(text t)=
save A,ch,dess;
pair A;
@@ -1043,7 +1078,7 @@ tertiarydef A estmieuxplace B =
elseif prefnomme="left": xpart A < xpart B
elseif prefnomme="top": ypart A > ypart B
elseif prefnomme="bottom": ypart A < ypart B
- elseif hide(errmessage "string 'prefnomme' should be set to left, right, top or bottom")
+ else: hide(errmessage "string 'prefnomme' should be set to left, right, top or bottom")
fi
enddef;
@@ -1053,6 +1088,7 @@ vardef pointnommetime(expr p)=
pair Pt,P[];
numeric nbint,pp,T[];
intercourbestimes(T)(cadre,p);
+ show T[1];
Pt:=_O;pp:=0;
if known T[1]:
Pt:= point T[1] of p;
@@ -1103,22 +1139,39 @@ vardef nommeautoobjsuf(suffix p)=
nommeautoobjtex(p,"$" & _chaine(p) & "$")
enddef;
+vardef estcadree primary f =
+ show llcorner f; show llcorner cadre transformed _T;
+ show urcorner f; show urcorner cadre;
+ (xpart urcorner f <= xpart urcorner (cadre transformed _T))
+ and (ypart urcorner f <= ypart urcorner (cadre transformed _T))
+ and (xpart llcorner f >= xpart llcorner (cadre transformed _T))
+ and (ypart llcorner f >= ypart llcorner (cadre transformed _T))
+enddef;
+
% Avec label donné
vardef nommeautoobjtex(expr p,leg)=
- save ptA,pos,ttmp;
+ save ptA,pos,ttmp,tmpfig;
pair ptA;
+ picture tmpfig;
numeric ttmp;
string pos;
ttmp:=pointnommetime(p);
ptA:= point ttmp of p;
pos:=position(ptA,ttmp,p);
- if string leg:
- scantokens("thelabel." & pos)(leg,ptA)
- else:
- scantokens("thelabel." & pos)(leg scaled defaultscale,ptA)
- fi
+ for i=0 upto 120:
+ tmpfig :=
+ if string leg:
+ scantokens("thelabel." & pos)(leg,ptA)
+ else:
+ scantokens("thelabel." & pos)(leg scaled defaultscale,ptA)
+ fi;
+ exitif estcadree tmpfig;
+ ptA := point (ttmp + ((-1)**(i+1))*round((i+1)/2)*length(p)/60) of p;
+ endfor
+ tmpfig
enddef;
+
vardef nommeautoobj(text t)=
if long_texte(t)=1: nommeautoobjsuf(t)
else: nommeautoobjtex(t)
@@ -1420,6 +1473,7 @@ vardef intercourbestimes(suffix T)(expr p,q)= %renvoie le "time" de q des points
pp:=subpath(xpart(pp intersectiontimes q)+0.01,length pp) of pp;
%0.01(?!) pour que le point trouvé ne soit pas dans le sous-chemin...
i:=i+1;
+ exitif i=10;
endfor;
enddef;
@@ -1620,28 +1674,67 @@ vardef splineder(text t)(text q)=
enddef;
-% Novembre 2017
+%% Novembre 2017
+%vardef deriveesplinecubique(suffix k)(suffix xs,ys)(expr n)=
+%% renvoie les dérivées pour interpolation avec splines cubiques
+%% source : https://en.wikipedia.org/wiki/Spline_interpolation
+%% xs[] et ys[] sont des listes, n est le nombre de valeurs
+%% Renvoie les dérivées dans la liste k[]
+% (2k[0] + k[1])/(xs[1] - xs[0]) = 3(ys[1]-ys[0])/((xs[1]-xs[0])**2);
+% for i=1 upto n-1:
+% k[i-1]/(xs[i] - xs[i-1]) + 2k[i]/(xs[i] - xs[i-1]) + 2k[i]/(xs[i+1] - xs[i]) + k[i+1]/(xs[i+1] - xs[i]) = 3(ys[i] - ys[i-1])/((xs[i]-xs[i-1])**2) + 3(ys[i+1] - ys[i])/((xs[i+1]-xs[i])**2);
+% endfor
+% (k[n-1] + 2k[n])/(xs[n]-xs[n-1]) = 3(ys[n]-ys[n-1])/((xs[n]-xs[n-1])**2);
+%enddef;
+
+%Mars 2019
vardef deriveesplinecubique(suffix k)(suffix xs,ys)(expr n)=
% renvoie les dérivées pour interpolation avec splines cubiques
% source : https://en.wikipedia.org/wiki/Spline_interpolation
% xs[] et ys[] sont des listes, n est le nombre de valeurs
% Renvoie les dérivées dans la liste k[]
- (2k[0] + k[1])/(xs[1] - xs[0]) = 3(ys[1]-ys[0])/((xs[1]-xs[0])**2);
+ if not derex[0]:
+ (2k[0] + k[1])/(xs[1] - xs[0]) = 3(ys[1]-ys[0])/((xs[1]-xs[0])**2)
+ fi;
for i=1 upto n-1:
- k[i-1]/(xs[i] - xs[i-1]) + 2k[i]/(xs[i] - xs[i-1]) + 2k[i]/(xs[i+1] - xs[i]) + k[i+1]/(xs[i+1] - xs[i]) = 3(ys[i] - ys[i-1])/((xs[i]-xs[i-1])**2) + 3(ys[i+1] - ys[i])/((xs[i+1]-xs[i])**2);
+ if not derex[i]:
+ k[i-1]/(xs[i] - xs[i-1]) + 2k[i]/(xs[i] - xs[i-1]) + 2k[i]/(xs[i+1] - xs[i]) + k[i+1]/(xs[i+1] - xs[i]) = 3(ys[i] - ys[i-1])/((xs[i]-xs[i-1])**2) + 3(ys[i+1] - ys[i])/((xs[i+1]-xs[i])**2)
+ fi;
endfor
- (k[n-1] + 2k[n])/(xs[n]-xs[n-1]) = 3(ys[n]-ys[n-1])/((xs[n]-xs[n-1])**2);
+ if not derex[n]:
+ (k[n-1] + 2k[n])/(xs[n]-xs[n-1]) = 3(ys[n]-ys[n-1])/((xs[n]-xs[n-1])**2)
+ fi;
enddef;
-% Novembre 2017
+%% Novembre 2017
+%vardef splineinterpolfonct_pt(text t)(expr x)=
+%% t est la liste des points A,B,C...
+% save xa,ya,dd,n;
+% numeric xa[],ya[],dd[],n;
+% n:=-1;
+% for i=t:
+% n := n + 1;
+% xa[n] := xpart i; ya[n] := ypart i;
+% endfor
+% deriveesplinecubique(dd)(xa,ya)(n);
+% splinederfonct((xa[0],ya[0],dd[0]) for ii=1 upto n: , (xa[ii],ya[ii],dd[ii]) endfor)(x)
+%enddef;
+
+% Mars 2019
vardef splineinterpolfonct_pt(text t)(expr x)=
-% t est la liste des points A,B,C...
- save xa,ya,dd,n;
+% t est la liste A,[y'1,]B,[y'2,]C,[y'3,]...
+ save xa,ya,dd,n,derex;
numeric xa[],ya[],dd[],n;
+ boolean derex[];
n:=-1;
for i=t:
- n := n + 1;
- xa[n] := xpart i; ya[n] := ypart i;
+ if numeric i:
+ dd[n]:=i;derex[n]:=true;
+ else:
+ n := n + 1;
+ derex[n]:=false;
+ xa[n] := xpart i; ya[n] := ypart i
+ fi;
endfor
deriveesplinecubique(dd)(xa,ya)(n);
splinederfonct((xa[0],ya[0],dd[0]) for ii=1 upto n: , (xa[ii],ya[ii],dd[ii]) endfor)(x)
@@ -1827,6 +1920,31 @@ vardef droite(text t)=
enddef;
+% demi-droites juin 2019
+vardef demidroitept(expr A,B)=
+ A--(_diag/abs(A-B))[A,B]
+enddef;
+
+vardef demidroiteangle(expr A,alpha)=
+ demidroitept(A,A + dir alpha)
+enddef;
+
+vardef demidroite(text t)=
+ save reptmp,repbool;
+ path reptmp;
+ boolean repbool;
+ repbool:=false;
+ for i=t:
+ if numeric i: repbool := true fi;
+ endfor
+ if repbool:
+ reptmp := demidroiteangle(t)
+ else:
+ reptmp := demidroitept(t)
+ fi;
+ reptmp
+enddef;
+
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%% DEMI-PLANS %%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -2420,15 +2538,18 @@ enddef;
vardef nommeangle@#(expr A,O,B,p)=
save P,a;pair P;path a;
+ save marque_p; string marque_p;
+ marque_p:="";
a:=arc_marqueangle(A,O,B,taille_marque_a);
P:= point (arctime 0.5*arclength a of a) of a;
- if string p: thelabel@#(p,P)
- else: thelabel@#(p scaled defaultscale,P)
+ if str @# = "":
+ nommepoint[angle (P-O)](P,p)
+ else:
+ nommepoint@#(P,p)
fi
enddef;
-
taille_marque_ad:=0.3cm;
vardef marqueangledroit(expr A,O,B)=