summaryrefslogtreecommitdiff
path: root/graphics
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2023-05-03 03:01:08 +0000
committerNorbert Preining <norbert@preining.info>2023-05-03 03:01:08 +0000
commitfaf23b00f32bf5f3a94d891369bc55db1d305074 (patch)
treee28be735ce28e34e4a278408107115788dc8db47 /graphics
parent809279687ad6a85c7a45c9a469725248da509220 (diff)
CTAN sync 202305030301
Diffstat (limited to 'graphics')
-rw-r--r--graphics/metapost/contrib/macros/repere/README.md2
-rw-r--r--graphics/metapost/contrib/macros/repere/repere-doc.pdfbin988000 -> 1032694 bytes
-rw-r--r--graphics/metapost/contrib/macros/repere/repere-doc.tex304
-rw-r--r--graphics/metapost/contrib/macros/repere/repere.mp917
-rw-r--r--graphics/pgf/contrib/playcards/README.md11
-rw-r--r--graphics/pgf/contrib/playcards/playcards-en.pdfbin304943 -> 275684 bytes
-rw-r--r--graphics/pgf/contrib/playcards/playcards-en.tex48
-rw-r--r--graphics/pgf/contrib/playcards/playcards-fr.pdfbin323724 -> 294369 bytes
-rw-r--r--graphics/pgf/contrib/playcards/playcards-fr.tex32
-rw-r--r--graphics/pgf/contrib/playcards/playcards.sty20
-rw-r--r--graphics/pgf/contrib/tikz3d-fr/README.md7
-rw-r--r--graphics/pgf/contrib/tikz3d-fr/doc/tikz3d-fr-doc.pdfbin0 -> 603790 bytes
-rw-r--r--graphics/pgf/contrib/tikz3d-fr/doc/tikz3d-fr-doc.tex752
-rw-r--r--graphics/pgf/contrib/tikz3d-fr/tex/tikz3d-fr.sty314
14 files changed, 2073 insertions, 334 deletions
diff --git a/graphics/metapost/contrib/macros/repere/README.md b/graphics/metapost/contrib/macros/repere/README.md
index f68df80743..e96a0a0292 100644
--- a/graphics/metapost/contrib/macros/repere/README.md
+++ b/graphics/metapost/contrib/macros/repere/README.md
@@ -1,4 +1,4 @@
-Package repere - Version 23.02 - February 9, 2023
+Package repere - Version 23.05 - May 2, 2023
---
diff --git a/graphics/metapost/contrib/macros/repere/repere-doc.pdf b/graphics/metapost/contrib/macros/repere/repere-doc.pdf
index 255cb2cbb1..67f192c9eb 100644
--- a/graphics/metapost/contrib/macros/repere/repere-doc.pdf
+++ b/graphics/metapost/contrib/macros/repere/repere-doc.pdf
Binary files differ
diff --git a/graphics/metapost/contrib/macros/repere/repere-doc.tex b/graphics/metapost/contrib/macros/repere/repere-doc.tex
index 73b3d0e0ef..deddf7cef7 100644
--- a/graphics/metapost/contrib/macros/repere/repere-doc.tex
+++ b/graphics/metapost/contrib/macros/repere/repere-doc.tex
@@ -48,7 +48,6 @@
\usepackage{luamplib}
\everymplib{verbatimtex \leavevmode etex;
-% input geometriesyr16;
input repere;}
\mplibnumbersystem{decimal}
@@ -80,7 +79,6 @@
}
\makeatother
-%\definecolor{CoulParam}{rgb}{0.281,0.275,0.485}
\definecolor{CoulParam}{rgb}{0.4,0,0.5}
\definecolor{TestC}{rgb}{0.963,0.971,0.994}
@@ -525,7 +523,6 @@ Définit les valeurs minimales et maximales pour l'étiquetage.
repere.larg(110,160,5cm,2000,7000,5cm);
interaxes(120,3000);
setaxes(120,160,3000,7000);
- setgrad(120,160,3000,7000);
draw axex(10,10);
draw axey(1000,1000);
fin;
@@ -1156,8 +1153,8 @@ p=(-2,-2)..(-1,1)..(0,2)..(1,1)
C_f= courbefonc(f)(-2,2.5);
draw axes(1,1);
drawoptions(withpen pencircle scaled 1);
-draw p withcolor bleu;
-draw C_f withcolor rouge;
+draw p withcolor blue;
+draw C_f withcolor red;
intercourbes(I,C_f,p);
drawoptions(withcolor black);
nomme.lft(I1);nomme.rt(I2);
@@ -1689,13 +1686,13 @@ vardef f(expr x)= x**2-2x enddef;
Cf= courbefonc(f)();
ptantecedents(A,2,Cf);
draw axes(1,1);
-drawoptions(dashed evenly withcolor rouge);
+drawoptions(dashed evenly withcolor red);
draw Projectionx.lrt(A1,"$x_1$");
draw Projectionx(A2);
draw Projectiony(A1);
draw Projectiony.urt(A2,"$y$");
drawoptions();
-draw Cf withpen pencircle scaled 1 withcolor bleu;
+draw Cf withpen pencircle scaled 1 withcolor blue;
fin;
\end{exemple}
@@ -1711,12 +1708,12 @@ Cf= courbefonc(f)();
A1=(-0.5,f(-0.5));A2=(2.8,f(2.8));
A3=(0.75,f(0.75));
draw axes(1,1);
-drawoptions(dashed evenly withcolor rouge);
+drawoptions(dashed evenly withcolor red);
draw Projectionaxes(A1,"$x$","$f(x)$");
draw Projectionaxes(A2,"$x$","$f(x)$");
draw Projectionaxes(A3,"$x$","$f(x)$");
drawoptions();
-draw Cf withpen pencircle scaled 1 withcolor bleu;
+draw Cf withpen pencircle scaled 1 withcolor blue;
fin;
\end{exemple}
@@ -1840,7 +1837,7 @@ repere(-0.5,5,1cm,-0.5,5,1cm);
picture diag;
draw axes(1,1);
diag:=diagrammebatons((1,2),(2,4),(3,2),(4,1));
- draw diag withcolor rouge;
+ draw diag withcolor red;
fin
\end{exemple}
@@ -2048,7 +2045,7 @@ Plusieurs segments peuvent être marqués simultanément.
\end{rpobjet}
\begin{rpobjet}{marquesegment(<A>,<B>,<n>)}{picture}
-Figure formée d'une marque sur le segment $[AB]$. L'espace entre les marques est contrôlé par le paramètre \verb|sep_marque_s|.
+Figure formée de \verb|n| marques sur le segment $[AB]$. L'espace entre les marques est contrôlé par le paramètre \verb|sep_marque_s|.
\end{rpobjet}
\begin{exemple}
@@ -2172,6 +2169,26 @@ nomme(C,B,A,"$\alpha$");
fin;
\end{exemple}
+\begin{rplabel}{nomme.pos(<A>,<O>,<B>,<texte>,<n>)}
+Même chose que précédemment avec en plus le tracé de \verb|n| arcs de cercle pour marquer l'angle.
+\end{rplabel}
+
+
+\begin{rplabel}{nomme(<A>,<O>,<B>,<texte>,<n>)}
+Même chose que précédemment mais la position est calculée automatiquement en fonction de l'angle.
+\end{rplabel}
+
+\begin{exemple}
+repere();
+pair A,B,C;
+A=(0,0);B=(4,0);C=(3,2.5);
+draw A--B--C--cycle;
+nomme.llft(A);nomme.lrt(B);nomme.top(C);
+nomme[15](B,A,C,"\ang{45}",1);
+nomme(C,B,A,"$\alpha$",2);
+fin;
+\end{exemple}
+
\subsection{Cotes}
@@ -2630,6 +2647,149 @@ draw TriangleLAA(G,H,I)(4,60,40,10)
fin;
\end{exemple}
+\subsection{Transformations}
+Un certain nombre de transformations sont prédéfinies dans \MP{}. Elles sont ici reprises et, parfois, légèrement modifiées, notamment en ce qui concerne la syntaxe.
+
+
+\begin{rpobjet}{translation(<vect>)(<obj>)}{pair, path ou picture}
+Image de \verb|obj| par la translation de vecteur \verb|vect|.
+\end{rpobjet}
+
+
+\begin{exemple}
+repere();
+pair A,B,C,C',u;
+path c;
+u=(1,-2);
+A=(1,1);B=(2,2);C=(4,2);
+nomme.ulft(B);
+c=cercle(B,A);draw c;
+draw translation(u)(c);
+C'=translation(u)(C);
+nomme.urt(C);nomme.urt(C');
+drawvecteur(B,u) withcolor red;
+fin;
+\end{exemple}
+
+
+\begin{rpobjet}{rotation(<pt>,<ang>)(<obj>)}{pair, path ou picture}
+Image de \verb|obj| par la rotation de centre \verb|pt| et d'angle \verb|ang|.
+\end{rpobjet}
+
+
+\begin{exemple}
+repere();
+pair A,B,C,B';
+A=(2,1);B=(3,3);C=(5,2);
+nomme.lrt(A);nomme.ulft(B);
+nomme.urt(C);
+B'=rotation(A,110)(B);
+nomme.llft(B');
+draw B--A--B';
+nomme(B,A,B',"\ang{110}",1);
+draw marquesegment(B,A,A,B');
+path seg; seg:=B--C;
+draw seg withcolor blue;
+draw rotation(A,110)(seg) withcolor blue;
+fin;
+\end{exemple}
+
+\begin{rpobjet}{symetrie(<pt>)(<obj>)}{pair, path ou picture}
+Image de \verb|obj| par la symétrie de centre \verb|pt|.
+\end{rpobjet}
+
+\begin{exemple}
+repere();
+ pair C,D,O;
+ path s,c;
+ C=(3,3);D=(1,4);
+ O=(0,2.5);
+ s=C--D;
+ c=cercle(D,1);
+ draw s;draw c;
+ nomme.bot(O) withcolor blue;
+ draw symetrie(O)(s);
+ draw symetrie(O)(c);
+fin;
+\end{exemple}
+
+
+\begin{rpobjet}{symetrie(<A>,<B>)(<obj>)}{pair, path ou picture}
+Image de \verb|obj| par la symétrie d'axe \verb|(AB)|.
+\end{rpobjet}
+
+
+\begin{exemple}
+repere(-4,4,1cm,0,5,1cm);
+ pair C,D,O,I;
+ path s,c;
+ C=(3,3);D=(1,4);
+ O=(1,0);I=(-1,4);
+ s=C--D;
+ c=cercle(D,1);
+ draw s;draw c;
+ draw droite(O,I) withcolor blue;
+ draw symetrie(O,I)(s);
+ draw symetrie(O,I)(c);
+fin;
+\end{exemple}
+
+\begin{rpobjet}{homothetie(<pt>,<rap>)(<obj>)}{pair, path ou picture}
+Image de \verb|obj| par l'homothétie de centre \verb|pt| et de rapport \verb|rap|.
+\end{rpobjet}
+
+\begin{exemple}
+repere();
+ pair O,A,B,C,D;
+ O=(1,1);
+ A=(2,1);B=(3,2);C=(3,3);D=(1,3);
+ path p;p:= polygone(A,B,C,D);
+ nomme.llft(O);
+ draw p;
+ draw homothetie(O,2)(p);
+fin
+\end{exemple}
+
+\begin{rpobjet}{similitude(<pt>,<rap>,<ang>)(<obj>)}{pair, path ou picture}
+Image de \verb|obj| par la similitude de centre \verb|pt|, de rapport \verb|rap| et d’angle \verb|ang|.
+\end{rpobjet}
+
+\bigskip
+
+À titre expérimental, on dispose du paramètre suivant qui permet de définir les points créés par l'image d'une figure par transformation.
+
+\begin{rpparam}
+extratransf & string & "" & Chaine qui désigne les caractères à ajouter au nom des points lors du dessin de l'image de certaines figures (notamment \verb|Triangle|, \verb|Segment|) par transformation. La valeur peut être \verb|"'", "''",...| ou un nombre. Les nouveaux points sont créés.
+\end{rpparam}
+
+\begin{exemple}[lefthand ratio=0.55]
+repere();
+extratransf:="'";
+pair A,B,C,u;
+u=(1,-2);
+A=(1,1);B=(2,2);C=(4,2);
+draw Triangle(A,B,C)()()();
+draw translation(u)(Triangle(A,B,C)()()());
+draw B'--C withcolor blue;
+drawvecteur(A,u) withcolor red;
+fin;
+\end{exemple}
+
+\begin{exemple}[lefthand ratio=0.55]
+repere();
+extratransf:="1";
+pair A,B,C,D,u,O;
+A=(2,1);B=(3,3);C=(5,2);
+O=(0,1);
+nomme.llft(O);
+draw Triangle(A,B,C)()()() withcolor blue;
+draw rotation(O,60)(Triangle(A,B,C)()()())
+ withcolor blue;
+draw B--O--B1 dashed evenly;
+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.
@@ -2905,6 +3065,22 @@ draw c1;draw c2;
fin;
\end{exemple}
+\subsection{Couleur de fond}
+
+Il est possible de modifier la couleur de fond en modifiant la couleur \verb|fond_coul|.
+\begin{rpparam}
+fond_coul & color & white & Couleur du fond de la figure
+\end{rpparam}
+
+\begin{exemple}
+repere(-3.5,3.5,1cm,-3.5,3.5,1cm);
+ fond_coul:=(0.9,0.9,1);
+ setquad(-3,3,-3,3);
+ draw quadrillage(1,1);
+ draw axes(1,1);
+fin;
+\end{exemple}
+
\subsection{Francisation}
@@ -3173,7 +3349,72 @@ tableau(5,5,0.8cm);
fin;
\end{exemple}
+\section{Pixel art}
+Il est possible d'utiliser les tableaux pour dessiner des figures en pixel art.
+
+\begin{rpobjet}{pixart(<liste d'entiers> ou <liste de couleurs>)}{picture}
+Figure composée de carrés remplis d'une couleur qui est soit la couleur indiquée explicitement soit une couleur qui dépend de l'entier indiqué (celles-ci sont définies au départ mais peuvent être modifiées). On peut remplacer un entier par \verb|_| pour que la case ne soit pas remplie. Les pixels doivent être donnés de gauche à droite et de haut en bas.
+\end{rpobjet}
+
+
+\begin{exemple}
+tableau(3,3,1cm);
+draw pixart(0,1,2,
+ 3,4,5,
+ 6,7,_);
+fin;
+\end{exemple}
+
+\begin{exemple}
+tableau(3,3,1cm);
+fond_coul:=grisclair;
+draw pixart(0,1,2,
+ 3,4,5,
+ 6,7,_);
+fin;
+\end{exemple}
+
+
+\begin{exemple}
+tableau(3,3,1cm);
+draw pixart(blanc,noir,rouge,
+ vert,bleu,cyan,
+ magenta,jaune,_);
+fin;
+\end{exemple}
+
+\begin{rpdeclaration}{pixcoul(<liste de couleurs>)}
+Macro qui permet de définir les couleurs qui seront utilisées. La première correspond à 0, la deuxième à 1...
+
+Au départ la macro est appelée de la façon suivante :
+
+\qquad \verb|pixcoul(blanc,noir,rouge,vert,bleu,cyan,magenta,jaune);|
+\end{rpdeclaration}
+
+\begin{exemple}
+tableau(3,3,1cm);
+pixcoul(marron,lime,orange,rose,
+ pourpre,olive,violet,beige);
+draw pixart(0,1,2,
+ 3,4,5,
+ 6,7,_);
+fin;
+\end{exemple}
+
+
+\begin{rpparam}
+pixart_ep & numeric & 0.3 & Écart laissé vide entre les cases.
+\end{rpparam}
+
+\begin{exemple}
+tableau(3,3,1cm);
+pixart_ep:=2;
+draw pixart(0,1,2,
+ 3,4,5,
+ 6,7,_);
+fin;
+\end{exemple}
\section{Quelques dessins}
@@ -3491,6 +3732,47 @@ tableau(13,5,1cm);
fin;
\end{exemple}
+\subsection{Pixel art}
+
+\begin{exemple}
+tableau(11,8,0.4cm);
+pixart_ep:=0;
+draw pixart(0,0,1,0,0,0,0,0,1,0,0,
+ 0,0,0,1,0,0,0,1,0,0,0,
+ 0,0,1,1,1,1,1,1,1,0,0,
+ 0,1,1,0,1,1,1,0,1,1,0,
+ 1,1,1,1,1,1,1,1,1,1,1,
+ 1,0,1,1,1,1,1,1,1,0,1,
+ 1,0,1,0,0,0,0,0,1,0,1,
+ 0,0,0,1,1,0,1,1,0,0,0);
+fin;
+\end{exemple}
+
+\begin{exemple}
+tableau(14,15,0.3cm);
+pixart_ep:=0;
+color b,n,v,r,c;
+b:=blanc;n:=noir;v:=0.6vert;
+r:=0.7rouge;c:=(1,0.2,0.2);
+draw pixart(_,_,_,_,_,_,_,_,_,_,_,n,n,_,
+ _,_,_,_,_,_,_,_,_,_,n,v,v,n,
+ _,_,_,_,_,_,_,n,n,n,n,v,v,n,
+ _,_,_,_,_,_,n,v,v,v,v,v,n,_,
+ _,_,_,_,_,n,v,n,n,n,v,n,_,_,
+ _,_,n,n,n,v,n,_,_,n,v,n,_,_,
+ _,n,c,c,v,c,n,_,n,v,n,_,_,_,
+ n,c,c,c,c,c,c,n,v,n,n,_,_,_,
+ n,c,c,c,c,c,n,c,v,c,c,n,_,_,
+ n,c,b,c,c,n,c,c,v,c,c,c,n,_,
+ n,c,c,b,r,n,c,c,c,c,c,c,n,_,
+ _,n,r,r,r,n,c,c,c,c,c,r,n,_,
+ _,_,n,n,n,n,c,c,c,b,r,r,n,_,
+ _,_,_,_,_,_,n,r,r,r,r,n,_,_,
+ _,_,_,_,_,_,_,n,n,n,n,_,_,_
+ );
+fin;
+\end{exemple}
+
\end{document}
diff --git a/graphics/metapost/contrib/macros/repere/repere.mp b/graphics/metapost/contrib/macros/repere/repere.mp
index c3f5a1496a..292d415a9b 100644
--- a/graphics/metapost/contrib/macros/repere/repere.mp
+++ b/graphics/metapost/contrib/macros/repere/repere.mp
@@ -2,7 +2,7 @@
%% repere.mp %%
%% Macros pour la construction de figures dans un repère %%
%% o.peault@posteo.net %%
-%% Version 23.02 (Février 2023) %%
+%% Version 23.05 (Mai 2023) %%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% This work may be distributed and/or modified under the conditions of
@@ -21,6 +21,7 @@
% segments, vecteurs, polygones complets
% Octobre-Décembre 2022 : doc
% Février 2023 : Main levée
+% Mai 2023 : Transformations, couleur de fond, pixart
input format;
if not known mplib: input latexmp fi;
@@ -140,7 +141,7 @@ vardef definitionrepere@#(text t) =
Ux:=_def3;Uy:=_def6;
_T:=identity xscaled Ux yscaled Uy slanted cosd(theta) yscaled sind(theta);
_defcadre;
- setrepere(Xmin,Xmax,Ymin,Ymax);
+ settout(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);
@@ -167,13 +168,14 @@ def init_traces =
fi
_op_
enddef;
- def draw expr p=
+ def Draw expr p=
if (path p) and (type_trace="mainlevee"):
ddraw mainleveepath(p)
else:
ddraw p
fi
enddef;
+ def draw expr p= Draw p enddef;
%% fill
def fill expr c =
if path c:
@@ -182,6 +184,10 @@ def init_traces =
olddraw c
fi
enddef;
+ %% fill
+ def filldraw expr c =
+ addto currentpicture contour (c transformed _T) withpen currentpen
+ _op_ enddef;
%% thelabel
vardef thelabel@#(expr s,z) = % Position s near z
save p; picture p;
@@ -214,7 +220,7 @@ def init_traces =
if type_trace="mainlevee":
ddrawarrow mainleveepath(p)
else:
- ddrawarrow p
+ ddrawarrow p
fi
enddef;
def ddrawdblarrow expr p = _apth:=p transformed _T; _findarr enddef;
@@ -222,7 +228,7 @@ def init_traces =
if type_trace="mainlevee":
ddrawdblarrow mainleveepath(p)
else:
- ddrawdblarrow p
+ ddrawdblarrow p
fi
enddef;
%% bbox
@@ -244,6 +250,9 @@ def traces_orig =
fi
_op_
enddef;
+ def filldraw expr c =
+ addto currentpicture contour c withpen currentpen
+ _op_ enddef;
vardef thelabel@#(expr s,z) = % Position s near z
save p; picture p;
if picture s: p=s
@@ -266,13 +275,13 @@ enddef;
def _finarr text t =
olddraw _apth t;
- filldraw arrowhead _apth t
+ oldfilldraw arrowhead _apth t
enddef;
def _findarr text t =
olddraw _apth t;
- filldraw arrowhead _apth withpen currentpen t;
- filldraw arrowhead reverse _apth withpen currentpen t
+ oldfilldraw arrowhead _apth withpen currentpen t;
+ oldfilldraw arrowhead reverse _apth withpen currentpen t
enddef;
vardef arrowhead expr p = %redéfinition flèches
@@ -355,8 +364,7 @@ def setaxes(expr a,b,c,d)=
enddef;
def setgrad(expr a,b,c,d)=
- GradXmin:=a;GradXmax:=b;GradYmin:=c;GradYmax:=d;
- setval(a,b,c,d);
+ GradXmin:=a;GradXmax:=b;GradYmin:=c;GradYmax:=d
enddef;
def setval(expr a,b,c,d)=
@@ -377,9 +385,25 @@ enddef;
let setall=setrepere;
let settout=setrepere;
+color fond_coul;
+
+
def fin =
if _nbaxes=1: olddraw _axorlab fi;
if coupe: clip currentpicture to (cadre transformed _T) fi;
+% Gestion du fond
+ if known fond_coul:
+ background:=fond_coul;
+ save tmpfig;
+ picture tmpfig;
+ tmpfig:=currentpicture;
+ currentpicture:=nullpicture;
+ newinternal bboxmargin;
+ bboxmargin:=0bp;
+ fill bbox tmpfig withcolor background;
+ draw tmpfig;
+ fi;
+% Fin gestion du fond
if bf: oldendfig; bf:=false;_nfig:=_nfig+1 fi;
rep_tab:=false; % Ajout octobre 2021
traces_orig;
@@ -475,9 +499,9 @@ vardef etiquettey@#(expr y)=
enddef;
-%vardef cheminaxex=_cart(AxeXmin,yO)--_cart(AxeXmax,yO) enddef;
+%vardef dessinaxex=_cart(AxeXmin,yO)--_cart(AxeXmax,yO) enddef;
-%vardef cheminaxey=_cart(xO,AxeYmin)--_cart(xO,AxeYmax) enddef;
+%vardef dessinaxey=_cart(xO,AxeYmin)--_cart(xO,AxeYmax) enddef;
vardef cheminaxex=
(AxeXmin,yO)--
@@ -504,7 +528,9 @@ vardef graduationsaxex(expr grad)= %%%% ensemble des graduations abscisses
olddraw graduationx(arrondimil(i*grad)+xO) withpen pencircle scaled 0.5bp;
endfor
% dernière graduation
- if AxeXmax*Ux-(imax*grad+xO)*Ux>ahlength: olddraw graduationx(arrondimil(imax*grad)+xO) withpen pencircle scaled 0.5bp fi);
+ if AxeXmax*Ux-(imax*grad+xO)*Ux>ahlength:
+ olddraw graduationx(arrondimil(imax*grad)+xO) withpen pencircle scaled 0.5bp
+ fi);
$
enddef;
@@ -526,27 +552,27 @@ vardef etiquettesaxex@#(expr val)= %%% ensemble des étiquettes abscisses
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;
@@ -556,27 +582,27 @@ vardef etiquettesaxey@#(expr val)= %%% ensemble des étiquettes ordonnées
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;
@@ -597,35 +623,35 @@ vardef _axex_@#(expr grad,val,nn)=
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
);
$
@@ -647,35 +673,35 @@ vardef _axey_@#(expr grad,val,nn)=
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
);
$
@@ -759,15 +785,15 @@ vardef fracmulttext(expr n,d,tt)= %%%% construction de la fraction n*tt/d
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:="-"
@@ -800,27 +826,27 @@ vardef etiquettesaxexpi@#(expr n,d)= %%% ensemble des étiquettes multiple
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;
@@ -831,27 +857,27 @@ vardef etiquettesaxeypi@#(expr n,d)= %%% ensemble des étiquettes multiple
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;
@@ -875,31 +901,31 @@ vardef _axexpi_@#(expr num,den,nn)=
% é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
);
@@ -925,32 +951,32 @@ vardef _axeypi_@#(expr num,den,nn)=
% é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
);
@@ -1032,19 +1058,19 @@ vardef axexpart@#(text t)=
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;
@@ -1056,20 +1082,20 @@ vardef axeypart@#(text t)=
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;
@@ -1187,7 +1213,6 @@ enddef;
def labelang = draw thelabelang enddef;
-
vardef nommepoint@#(text t)=
save $,ch,dess,latch;
pair $;
@@ -1200,13 +1225,18 @@ vardef nommepoint@#(text t)=
fi;
if long_texte(t)=1:
dess:=image(draw marquepointFig(t);
- ch:=_chaine(t);
- mylabel@#("$" & ch & "$",t) withcolor coullabel)
+ ch:="$" & _chaine(t) & "$";
+ if _ext_tr_<>"": ch:=aj_extr_trsf(t,ch) fi;
+ mylabel@#(ch,t) withcolor coullabel)
else:
dess:=image(%
for PP=t:
- if pair PP: marquepoint(PP); $:=PP
- else: if string PP: mylabel@#(PP,$) else: mylabel@#(PP scaled defaultscale,$) fi withcolor coullabel
+ if pair PP:
+ marquepoint(PP); $:=PP
+ elseif string PP:
+ mylabel@#(PP,$) withcolor coullabel;
+ else:
+ mylabel@#(PP scaled defaultscale,$) withcolor coullabel
fi;
endfor)
fi;
@@ -1262,8 +1292,9 @@ vardef nommepointrot@#(text t)(expr an)=
fi;
if long_texte(t)=1:
dess:=image(draw marquepointFig(t);
- ch:=_chaine(t);
- mylabel@#("$" & ch & "$",t,an) withcolor coullabel)
+ ch:="$" & _chaine(t) & "$";
+ if _ext_tr_<>"": ch:=aj_extr_trsf(t,ch) fi;
+ mylabel@#(ch,t,an) withcolor coullabel)
else:
dess:=image(%
for PP=t:
@@ -1301,10 +1332,12 @@ enddef;
vardef nommeFig@#(text t)=
save $;
picture $;
- if long_texte(t)=4: $:=nommeangle@#(t)
+ if long_texte(t)=4: $:=nommeangle@#(t,0)
+ elseif long_texte(t)=5: $:=nommeangle@#(t)
else:
for i=t:
- if pair i: $:=nommepoint@#(t)
+ if pair i:
+ $:=nommepoint@#(t)
elseif str @#="": $:=nommeautoobj(t)
else: $:=nommecourbe@#(t)
fi;
@@ -2068,9 +2101,9 @@ senstan.gauche=(1,0);senstan.droite=(0,1);senstan.double=(1,1);
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+ )
@@ -2346,7 +2379,7 @@ numeric _suiterecdeb_, _suiterecfin_, _suiterecinit_;
vardef suiterec(suffix f)(expr deb,fin,init)= %escalier un+1=f(un), u_deb=init
vardef _suiterecfonc_(expr x)=f(x) enddef;
- _suiterecdeb_:=deb;_suiterecfin_:=fin;_suiterecinit_:=init; %stocke les valeurs pour réutilisation
+ _suiterecdeb_:=deb;_suiterecfin_:=fin;_suiterecinit_:=init; %stocke les valeurs pour réutilisation
save $,un;
path $;
numeric un;
@@ -2359,20 +2392,20 @@ vardef suiterec(suffix f)(expr deb,fin,init)= %escalier un+1=f(un), u_deb=init
$
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;
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;
@@ -2410,20 +2443,20 @@ vardef suiterecprojx@#(text t)= %projections et étiquettes sur axe x, utili
$
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;
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;
@@ -2970,10 +3003,11 @@ vardef marqueangle(text t)=
fi
enddef;
-vardef nommeangle@#(expr A,O,B,p)=
+vardef nommeangle@#(expr A,O,B,p,n)=
save P,a;pair P;path a;
save marque_p; string marque_p;
marque_p:="";
+ if n>0: draw marqueangle(A,O,B,n) fi;
a:=arc_marqueangle(A,O,B,taille_marque_a);
P:= point (arctime 0.5*arclength a of a) of a;
if str @# = "":
@@ -3139,20 +3173,29 @@ enddef;
% "\ang[round-mode=places,round-pad = false,drop-zero-decimal,round-precision=" & decimal(arr) & "]{" & decimal(nb) & "}"
%enddef;
+numeric _tmp_puiss_dix_;
vardef AffichageAngle(expr nb,arr)=
- "\ang{" & decimal(arrondi(10**(arr),nb)) & "}"
+ _tmp_puiss_dix_:=round(10**arr);
+ "\ang{" & decimal(arrondi(_tmp_puiss_dix_,nb)) & "}"
+% "\ang{" & decimal(arrondi(10**arr,nb)) & "}"
enddef;
%
%%%%%%%%%%%%%%%% Segments %%%%%%%%%%%%%%%
vardef Segment(suffix AA,BB)(text t)(text s)=
- save ll_seg,posAA,anghh,count_tmp,chAA,chBB,chcote;
+ save ll_seg,posAA,anghh,count_tmp,chAA,chBB,chcote,pA,pB;
numeric ll_seg,anghh,count_tmp;
string chAA,chBB,chcote;
+ pair pA,pB;
+ pA:=AA;pB:=BB;
count_tmp:=0;
if AffCotes:
- chcote:=decimal(abs(BB-AA));
+ if _tr_rapp_<>1:
+ chcote:=decimal(_tr_rapp_*abs(BB-AA))
+ else:
+ chcote:=decimal(abs(BB-AA))
+ fi;
if UnitCotes<>"":
chcote:="\SI[round-pad = false,round-mode=places,round-precision=" & decimal(ArrondiCotes) & "]{" & chcote & "}{" & UnitCotes & "}"
else:
@@ -3173,31 +3216,44 @@ vardef Segment(suffix AA,BB)(text t)(text s)=
elseif count_tmp=2: chBB:=i
fi;
endfor
+ % On modifie les noms si on est dans une transformation et on définit les points
+ if _ext_tr_<>"":
+ chAA:=aj_extr_trsf(AA,chAA);
+ chBB:=aj_extr_trsf(BB,chBB);
+ fi
+ % On modifie les points si on est dans une transformation
+ if _tr_bool_:
+ def _transform_fig_= enddef;
+ pA:=_transform_pt_(AA);
+ pB:=_transform_pt_(BB);
+ fi
for i=s:
chcote:=i;
endfor
- SegmentComplet(AA,BB)(chAA,chBB,chcote)
+ SegmentComplet(pA,pB)(chAA,chBB,chcote)
enddef;
-vardef SegmentComplet(expr AA,BB)(expr chAA,chBB,cotei) text t=
+vardef SegmentComplet(expr AA,BB)(expr chAA,chBB,cotei)=
%% 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;
+ save tmp,anghh,tmpana,tmpanb,chA,chB;
picture tmp;
+ string chA,chB;
+ chA:=chAA;chB:=chBB;
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;
+ draw AA--BB;
+ nomme[tmpana](AA,chA) withpen currentpen;
+ nomme[tmpanb](BB,chB) withpen currentpen;
if xpart AA <= xpart BB:
- cote(AA,BB,cotei) t
+ cote(AA,BB,cotei)
else:
- cote(BB,AA,cotei) t
+ cote(BB,AA,cotei)
fi;
);
tmp
@@ -3357,25 +3413,38 @@ numeric rep_tri_la,rep_tri_lb,rep_tri_lc,
boolean rep_ad_A,rep_ad_B,rep_ad_C;
-def cotepolyplacee(suffix ptA,ptB)(expr chcote,sensdirect) text t=
+def cotepolyplacee(suffix ptA,ptB)(expr chcote,sensdirect)=
if xpart ptA<= xpart ptB:
if sensdirect:
- cote(ptA,ptB,chcote) t
+ cote(ptA,ptB,chcote)
else:
- cote.top(ptA,ptB,chcote) t
+ cote.top(ptA,ptB,chcote)
fi
else:
if sensdirect:
- cote.top(ptB,ptA,chcote) t
+ cote.top(ptB,ptA,chcote)
else:
- cote(ptB,ptA,chcote) t
+ cote(ptB,ptA,chcote)
fi
fi
enddef;
-vardef TriangleComplet(suffix AA,BB,CC)(expr chAA,chBB,chCC,coteAB,coteBC,coteCA,angAA,angBB,angCC) =
+def nommeangleaigu(expr B,A,C,chang,sensdirect)=
+ if sensdirect:
+ nomme(B,A,C,chang,1)
+ else:
+ nomme(C,A,B,chang,1)
+ fi
+enddef;
+
+
+vardef TriangleComplet(expr pAA,pBB,pCC)(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;
+ save tmpang,tmpfig,tmpscale,sensdir,chA,chB,chC,AA,BB,CC;
+ pair AA,BB,CC;
+ AA:=pAA;BB:=pBB;CC:=pCC;
+ string chA,chB,chC;
+ chA:=chAA;chB:=chBB;chC:=chCC;
numeric tmpang,tmpscale;
boolean sensdir;
if angle(CC rotatedaround(AA,-angle(BB-AA)) - AA)>0:
@@ -3411,16 +3480,14 @@ vardef TriangleComplet(suffix AA,BB,CC)(expr chAA,chBB,chCC,coteAB,coteBC,coteCA
if rep_ad_A and AutoAngleDroit:
draw marqueangledroit(BB,AA,CC) withpen currentpen
else:
- draw marqueangle(BB,AA,CC) withpen currentpen;
- nomme(BB,AA,CC,angAA);
+ nommeangleaigu(BB,AA,CC,angAA,sensdir);
fi;
fi;
if rep_type_triangle=2:
if rep_ad_B and AutoAngleDroit:
draw marqueangledroit(CC,BB,AA) withpen currentpen
else:
- draw marqueangle(CC,BB,AA) withpen currentpen;
- nomme(CC,BB,AA,angBB);
+ nommeangleaigu(CC,BB,AA,angBB,sensdir);
fi;
fi;
else:
@@ -3428,24 +3495,21 @@ vardef TriangleComplet(suffix AA,BB,CC)(expr chAA,chBB,chCC,coteAB,coteBC,coteCA
if rep_ad_A and AutoAngleDroit:
draw marqueangledroit(BB,AA,CC) withpen currentpen
else:
- draw marqueangle(BB,AA,CC);
- nomme(BB,AA,CC,angAA);
+ nommeangleaigu(BB,AA,CC,angAA,sensdir);
fi;
fi
if (nang>=2):
if rep_ad_B and AutoAngleDroit:
draw marqueangledroit(CC,BB,AA) withpen currentpen
else:
- draw marqueangle(CC,BB,AA) withpen currentpen;
- nomme(CC,BB,AA,angBB);
+ nommeangleaigu(CC,BB,AA,angBB,sensdir);
fi;
fi
if (nang=3):
if rep_ad_C and AutoAngleDroit:
draw marqueangledroit(AA,CC,BB) withpen currentpen
else:
- draw marqueangle(AA,CC,BB) withpen currentpen;
- nomme(AA,CC,BB,angCC);
+ nommeangleaigu(AA,CC,BB,angCC,sensdir);
fi;
fi
fi
@@ -3730,9 +3794,9 @@ vardef defTriangle(text q)=
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;
+ rep_tri_angA:=abs(angle(rep_tri_CC-rep_tri_AA) -angle(rep_tri_BB-rep_tri_AA) );
+ rep_tri_angB:=abs(angle(rep_tri_AA-rep_tri_BB)-angle(rep_tri_CC-rep_tri_BB));
+ 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
@@ -3797,26 +3861,21 @@ enddef;
-vardef ProcessAffTriangles(text q)(text p)(text c)(text a)=
+vardef ProcessAffTriangles(suffix A,B,C)(text p)(text c)(text a)=
%% Gestion de l'affichage
- save chAA,chBB,chCC,cha,chb,chc,changA,changB,changC,count_tmp,ch,nang;
+ save chAA,chBB,chCC,cha,chb,chc,changA,changB,changC,count_tmp,ch,nang,AA,BB,CC;
string chAA,chBB,chCC,cha,chb,chc,changA,changB,changC,ch;
chAA=chBB=chCC=cha=chb=chc=changA=changB=changC="";
+ pair AA,BB,CC;
+ AA:=A;BB:=B;CC:=C;
numeric count_tmp,nang;
boolean tmpaffcotes,tmpaffangles;
tmpaffcotes:=AffCotes;tmpaffangles:=AffAngles;
if AffDonnees: AffCotes:=true;AffAngles:=true fi;
% 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
+ chAA:="$" & _chaine(A) & "$";
+ chBB:="$" & _chaine(B) & "$";
+ chCC:="$" & _chaine(C) & "$";
% On modifie le nom des points si des valeurs sont passées dans p
count_tmp:=0;
for i=p:
@@ -3827,8 +3886,26 @@ vardef ProcessAffTriangles(text q)(text p)(text c)(text a)=
fi
i;
endfor
+ % On modifie les noms si on est dans une transformation et on définit les points
+ if _ext_tr_<>"":
+ chAA:=aj_extr_trsf(A,chAA);
+ chBB:=aj_extr_trsf(B,chBB);
+ chCC:=aj_extr_trsf(C,chCC);
+ fi
+ % On modifie les points si on est dans une transformation
+ if _tr_bool_:
+ def _transform_fig_= enddef;
+ AA:=_transform_pt_(A);
+ BB:=_transform_pt_(B);
+ CC:=_transform_pt_(C);
+ fi
% Cotes données par les longueurs
if AffCotes:
+ if _tr_rapp_<>1:
+ rep_tri_la:=rep_tri_la*_tr_rapp_;
+ rep_tri_lb:=rep_tri_lb*_tr_rapp_;
+ rep_tri_lc:=rep_tri_lc*_tr_rapp_;
+ fi;
if UnitCotes<>"":
cha:=AffichageCoteAvecUnite(rep_tri_la,ArrondiCotes,UnitCotes);
chb:=AffichageCoteAvecUnite(rep_tri_lb,ArrondiCotes,UnitCotes);
@@ -3866,11 +3943,193 @@ vardef ProcessAffTriangles(text q)(text p)(text c)(text a)=
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)
+ TriangleComplet(AA,BB,CC)(chAA,chBB,chCC,chc,cha,chb,changA,changB,changC)
+enddef;
+
+
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%% TRANSFORMATIONS %%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+string extratransf; % Chaine à ajouter aux nom des points
+boolean _tr_bool_; % Indique qu'il faudra traiter la chaine précédente
+extratransf:="";
+ _tr_bool_:=false;
+
+numeric _tr_ang_rot_; % Angle à gérer pour l'affichage des points
+_tr_ang_rot_:=0;
+numeric _tr_rapp_; %Rapport d'agrandissement-réduction
+_tr_rapp_:=1;
+
+
+%% Translation
+
+vardef translationpoint(expr u)(expr A)=
+ A+u
+enddef;
+
+vardef translation(expr u)(text t)=
+ type_tr:=1;
+ if path t:
+ t shifted u
+ elseif pair t:
+ t+u
+ else:
+ def _transform_pt_= translationpoint(u) enddef;
+ def _transform_fig_= shifted u enddef;
+ _ext_tr_:=extratransf;
+ _tr_bool_ := true;
+ t
+ hide(_ext_tr_:=""; _tr_bool_:=false;
+ def _transform_pt_= enddef;
+ def _transform_fig_= enddef;)
+ fi
+enddef;
+
+
+%% Rotation
+
+vardef rotationpoint(expr O,a)(expr A)=
+ A rotatedaround(O,a)
+enddef;
+
+vardef rotation(expr O,a)(text t)=
+ type_tr:=1;
+ if path t:
+ t rotatedaround(O,a)
+ elseif pair t:
+ t rotatedaround(O,a)
+ else:
+ def _transform_pt_= rotationpoint(O,a) enddef;
+ def _transform_fig_= rotatedaround(_cart(O),a) enddef;
+ _tr_ang_rot_:=a;
+ _ext_tr_:=extratransf;
+ _tr_bool_ := true;
+ t _transform_fig_
+ hide(_ext_tr_:="";_tr_bool_:=false;
+ def _transform_pt_= enddef;
+ def _transform_fig_= enddef;
+ _tr_ang_rot_:=0;)
+ fi
+enddef;
+
+%% Symétrie centrale
+
+vardef symetriecentralepoint(expr O)(expr A)=
+ A rotatedaround(O,180)
+enddef;
+
+vardef symetriecentrale(expr O)(text t)=
+ type_tr:=1;
+ if path t:
+ t rotatedaround(O,180)
+ elseif pair t:
+ t rotatedaround(O,180)
+ else:
+ def _transform_pt_= symetriecentralepoint(O) enddef;
+ def _transform_fig_= rotatedaround(_cart(O),180) enddef;
+ _tr_ang_rot_:=180;
+ _ext_tr_:=extratransf;
+ _tr_bool_ := true;
+ t _transform_fig_
+ hide(_ext_tr_:="";_tr_bool_:=false;
+ def _transform_pt_= enddef;
+ def _transform_fig_= enddef;
+ _tr_ang_rot_:=0;)
+ fi
+enddef;
+
+%% Symétrie axiale
+
+vardef symetrieaxialepoint(expr B,C)(expr A)=
+ A reflectedabout(B,C)
+enddef;
+
+vardef symetrieaxiale(expr B,C)(text t)=
+ type_tr:=1;
+ if path t:
+ t reflectedabout(B,C)
+ elseif pair t:
+ t reflectedabout(B,C)
+ else:
+ def _transform_pt_= symetrieaxialepoint(O) enddef;
+ def _transform_fig_= reflectedabout(_cart(B),_cart(C)) enddef;
+% _tr_ang_rot_:=180;
+ _ext_tr_:=extratransf;
+ _tr_bool_ := true;
+ t _transform_fig_
+ hide(_ext_tr_:="";_tr_bool_:=false;
+ def _transform_pt_= enddef;
+ def _transform_fig_= enddef;
+ _tr_ang_rot_:=0;)
+ fi
enddef;
+%% Symétrie
+vardef symetrie(text r)(text t)=
+ if long_texte(r)=1:
+ symetriecentrale(r)(t)
+ else:
+ symetrieaxiale(r)(t)
+ fi
+enddef;
+
+
+
+%% Homothétie
+
+vardef homothetiepoint(expr O,k)(expr A)=
+ k[O,A]
+enddef;
+
+vardef homothetie(expr O,k)(text t)=
+ type_tr:=1;
+ if path t:
+ t shifted -O scaled k shifted O
+ elseif pair t:
+ k[O,t]
+ else:
+ def _transform_pt_= homothetiepoint(O,k) enddef;
+ def _transform_fig_= shifted -O scaled k shifted O enddef;
+ _ext_tr_:=extratransf;
+ _tr_bool_ := true;
+ _tr_rapp_:=abs(k);
+ t _transform_fig_
+ hide(_ext_tr_:=""; _tr_bool_:=false;
+ def _transform_pt_= enddef;
+ def _transform_fig_= enddef;
+ _tr_rapp_:=1;)
+ fi
+enddef;
+
+%% Similitude
+
+vardef similitudepoint(expr O,k,a)(expr A)=
+ k[O,A] rotatedaround(O,a)
+enddef;
+vardef similitude(expr O,k,a)(text t)=
+ type_tr:=1;
+ if path t:
+ t rotatedaround(O,a) shifted -O scaled k shifted O
+ elseif pair t:
+ k[O,t] rotatedaround(O,a)
+ else:
+ def _transform_pt_= similitudepoint(O,k,a) enddef;
+ def _transform_fig_=rotatedaround(_cart(O),a) shifted -O scaled k shifted O enddef;
+ _ext_tr_:=extratransf;
+ _tr_bool_ := true;
+ _tr_rapp_:=abs(k);
+ t _transform_fig_
+ hide(_ext_tr_:=""; _tr_bool_:=false;
+ def _transform_pt_= enddef;
+ def _transform_fig_= enddef;
+ _tr_rapp_:=1;)
+ fi
+enddef;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%% FONCTIONS USUELLES %%%%%%%%%
@@ -4148,11 +4407,54 @@ vardef _chaine(suffix s)= %met les termes en indice si le 2e est un chiffre
c
enddef;
+string _ext_tr_; % Chaine à rajouter aux étiquette lors d'une transformation
+_ext_tr_:="";
+
+vardef ajout_extra_trsf(expr ch)= % ajoute _ext_tr_ en dernière ou avant dernière pos
+ save n;
+ numeric n;
+ n:=length(ch);
+ if n>1:
+ if substring (n-1,n) of ch = "$":
+ substring (0,n-1) of ch & _ext_tr_ & substring (n-1,n) of ch
+ else:
+ ch & _ext_tr_
+ fi
+ else:
+ ch
+ fi
+enddef;
+
+vardef aj_extr_trsf(expr A,ch)=
+ save tmpch,tmpchi,n;
+ numeric n;
+ string tmpch,tmpchi;
+ n:=length(ch);
+ if substring (n-1,n) of ch = "$":
+ tmpchi:=substring (1,n-1) of ch; % Sans les $
+ if (ASCII _ext_tr_ > 47) and (ASCII _ext_tr_ < 58):
+ tmpch:="$" & tmpchi & "_" & _ext_tr_ & "$";
+ tmpchi:= tmpchi & "[]";
+ scantokens("pair " & tmpchi & ";");
+ tmpchi:= substring(0,n-1) of tmpchi & _ext_tr_ & "]";
+ else:
+ tmpchi:= tmpchi & _ext_tr_;
+ tmpch:="$" & tmpchi & "$";
+ scantokens("pair " & tmpchi & ";");
+ fi
+ scantokens(tmpchi) := _transform_pt_(A);
+ else:
+ tmpch:=ch;
+ fi
+ tmpch
+enddef;
+
%%%%%%%%%%%%%%% MATHS %%%%%%%%%%%%%%%%%
vardef arrondi(expr p,x)= %arrondi de x au p-ième
- round((x-floor(x))*p)/p+floor(x)
+% round((x-floor(x))*p)/p+floor(x)
+ round(p*x)/p
enddef;
vardef arrondimil(expr x)=
@@ -4635,6 +4937,65 @@ vardef tablabels(expr s)(text t) text cc=
endfor
enddef;
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%% PIXEL ART %%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+color pixart_coul[],pixart_grille_coul;
+numeric pixart_ep;
+pixart_ep:=0.3;
+pixart_grille_coul:=background;
+
+
+def pixcoul(text t)=
+ save cnt;
+ numeric cnt;
+ cnt:=0;
+ for i=t:
+ pixart_coul[cnt]:=i;
+ cnt := cnt +1;
+ endfor
+enddef;
+
+pixcoul(white,black,red,green,blue,cyan,magenta,jaune);
+
+vardef contour_case_pix(expr n,m)=
+ save tmpne,tmpse;
+ pair tmpne,tmpse;
+ tmpne:=0.5*(pixart_ep,pixart_ep) transformed inverse _T;
+ tmpse:=0.5*(pixart_ep,-pixart_ep) transformed inverse _T;
+ (((0,0)+tmpne)--((1,0)-tmpse)--((1,1)-tmpne)--((0,1)+tmpse)--cycle)
+ shifted (_tab(n,m)-(0.5,0.5))
+enddef;
+
+
+vardef pixart(text t)=
+ save _;
+ numeric _;
+ _:=-1;
+ grille_ep:=pixart_ep;
+ save cnt,lig,col;
+ numeric cnt,lig,col;
+ cnt:=0;
+ lig:=rep_tab_p;col:=1;
+ image(%
+ for i=t:
+ if numeric i:
+ if i>-1: filldraw contour_case_pix(col,lig) withcolor pixart_coul[i] fi
+ elseif color i:
+ filldraw contour_case_pix(col,lig) withcolor i
+ fi;
+ if col=rep_tab_n:
+ lig:=lig-1;col:=1;
+ else:
+ col:=col+1;
+ fi
+ endfor
+ )
+enddef;
+
+
+
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%% DESSINS %%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
diff --git a/graphics/pgf/contrib/playcards/README.md b/graphics/pgf/contrib/playcards/README.md
index 958a6ea032..0452118cae 100644
--- a/graphics/pgf/contrib/playcards/README.md
+++ b/graphics/pgf/contrib/playcards/README.md
@@ -1,11 +1,10 @@
# Playcards package
Tiny LaTeX package to draw playcards.
## Version
-0.1, 2023/04/29
+0.2, 2023/05/02
## Licence
GNU LGPL v3.0 https://www.gnu.org/licenses/lgpl-3.0.html
-
-
-Author : Clément PAGÈS
-Maintainer: Clément PAGÈS
-E-mail : contact -- arobase -- clementpages point fr
+## Contact
+- Author : Clément PAGÈS
+- Maintainer: Clément PAGÈS
+- E-mail : contact -- arobase -- clementpages point fr
diff --git a/graphics/pgf/contrib/playcards/playcards-en.pdf b/graphics/pgf/contrib/playcards/playcards-en.pdf
index 9c95df3a27..81bbfeef9f 100644
--- a/graphics/pgf/contrib/playcards/playcards-en.pdf
+++ b/graphics/pgf/contrib/playcards/playcards-en.pdf
Binary files differ
diff --git a/graphics/pgf/contrib/playcards/playcards-en.tex b/graphics/pgf/contrib/playcards/playcards-en.tex
index 60ab32903b..00ffe905d6 100644
--- a/graphics/pgf/contrib/playcards/playcards-en.tex
+++ b/graphics/pgf/contrib/playcards/playcards-en.tex
@@ -27,51 +27,59 @@
\begin{document}
\maketitle
-This small package provides commands to draw playcards, with witdh 59 mm and height 89 mm, which are typicall cards dimensions.
+This small package provides commands to draw playcards, with width 59 mm and height 89 mm, which are typicall cards dimensions.
\tableofcontents
\section*{Thanks}
-Thanks to Christophe Poulain for his amazing \href{https://ctan.org/pkg/profcollege}{ProfCollege} package, which source code was useful to design syntax commands we use here. And more generally, thank you you for this amazing package!
+Thanks to Christophe Poulain for his amazing \href{https://ctan.org/pkg/profcollege}{ProfCollege} package, which source code was useful to design syntax commands we use here. And more generally, thank you for this amazing package!
-Also thanks to \href{https://tex.stackexchange.com/users/1948/didest}{didest} who asked a question on \href{https://tex.stackexchange.com/questions/47924/creating-playing-cards-using-tikz}{StackExchange}. I used it to built this package.
+Also thanks to \href{https://tex.stackexchange.com/users/1948/didest}{didest} who asked a question on \href{https://tex.stackexchange.com/questions/47924/creating-playing-cards-using-tikz}{StackExchange}. I used it to build this package.
\section{Download, installation, requirements}
+ \subsection{Automatically loaded packages}
+Package available on CTAN : \href{https://ctan.org/pkg/playcards}{https://ctan.org/pkg/playcards}. It contains one single file: \texttt{playcards.sty}.
-Package available on CTAN. It contains one single file : \texttt{playcards.sty}.
-
-Some package are automatically loaded. They are installed by default on most configurations :
+Some packages are automatically loaded. They are installed by default on most configurations:
\begin{description}
\item[\package{tikz}] and some libraries.
- \item[\package{simplekv}] dot manage optional parameters whit a \kv{key}{value} system.
+ \item[\package{simplekv}] to manage optional parameters with a \kv{key}{value} system.
\item[\package{graphicx}] for pictures.
\item[\package{contour}] for text shadows and borders.
- \item[\package{geometry}] configured to draw 9 cards on an A4 paper.
\end{description}
+
+ \subsection{Recommended packages, not automatically loaded}
+To draw cards one by one, there are nos constraints on margins an paper format.
+
+To get a full page of identical cards, paper has to be A4 format and command \commande{usepackage[scale=0.95]\{geometry\}} is required in preamble.
+
\section{Generalities}
-Commands are based on a key/value system, with model \texttt{\textbackslash command[\kv{key1}{value1}, \kv{key2}{value2}, …,]\{param1\}\{param2\}}.
+Commands are based on a key/value system, with model \texttt{\textbackslash command[\kv{key1}{value1}, \kv{key2}{value2}, …]\{param1\}\{param2\}}.
-All the keys are optional and if one does not fill them, they get a default value.
+All keys are optional and if one does not fill them, they get a default value.
All length are given in millimeters.
\section{Provided commands}
+ \subsection{Package options}
+By default, font for text on cards is the same as document's. You can pass in option the parameter \texttt{anttor} so that cards font will be \href{https://tug.org/FontCatalogue/antykwatorunska/}{Antykwa Toruńska}.
+
\subsection{\commande{drawcardsrecto} command}
This command has one required parameter : text written in the center of the card. It fills an A4 paper with 9 identical cards. This command only draws front side of the card. There is an example figure \ref{fig:recto}.
\begin{figure}[h]\begin{center}
\caption{\commande{drawcardsrecto[trame=false]\{5\}}}
- \includegraphics{screen01.png}\label{fig:recto}
+ \includegraphics{fig01.pdf}\label{fig:recto}
\end{center}\end{figure}
Optional parameters:
\begin{itemize}
\item \key{borders}{true}{Removes borders.}
- \item \key{trame}{true}{If \texttt{true}, fills an A4 paper with cards.. Si \texttt{false}, draws one only card.}
- \item \key{corners}{true}{If \texttt{true}, card contends is reproduced in corners. If \texttt{false}, it is not.}
- \item \key{backgroundImg}{true}{Si \texttt{true}, prints background. If \texttt{false}, no background.}
- \item \key{backgroundColor}{red}{Specifies background color. Ignored if \texttt{backgroundImg=false}. Uses colored defined in the \href{https://www.ctan.org/pkg/xcolor}{xcolor} package.}
- \item \key{contentsFontSize}{120}{Font size (int pt) of text in card center.}
- \item \key{cicleRay}{20}{Ray of the white circle the center of the card. Value \texttt 0 means no circle.}
+ \item \key{trame}{true}{If \texttt{true}, fills an A4 paper with cards. If \texttt{false}, draws one only card. To work properly, \texttt{trame=true} requires A4 paper and \commande{usepackage[scale=0.95]\{geometry\}} in preamble.}
+ \item \key{corners}{true}{If \texttt{true}, card's contents is reproduced in corners. If \texttt{false}, it is not.}
+ \item \key{backgroundImg}{true}{If \texttt{true}, prints background. If \texttt{false}, no background.}
+ \item \key{backgroundColor}{red}{Specifies background color. Ignored if \texttt{backgroundImg=false}. Uses colors defined in the \href{https://www.ctan.org/pkg/xcolor}{xcolor} package.}
+ \item \key{contentsFontSize}{120}{Font size (in pt) of text in card center.}
+ \item \key{circleRay}{20}{Ray of the white circle the center of the card. Value \texttt 0 means no circle.}
\end{itemize}
@@ -81,13 +89,13 @@ It is possible, but not required, to draw card back side. Front sides must be on
To get a correct alignment, place commands in a \verb!\begin{center}...\end{center}! environment.
\begin{figure}[h]\begin{center}
\caption{\commande{drawcardsverso[trame=false,contentsFontSize=40]\{Exemple\}}}
- \includegraphics{screen02.png}\label{fig:verso}
+ \includegraphics{fig02.pdf}\label{fig:verso}
\end{center}\end{figure}
Optional parameters:
\begin{itemize}
- \item \key{backgroundImg}{true}{Si \texttt{true}, prints background. If \texttt{false}, no background.}
- \item \key{trame}{true}{If \texttt{true}, fills an A4 paper with cards.. Si \texttt{false}, draws one only card.}
+ \item \key{backgroundImg}{true}{If \texttt{true}, prints background. If \texttt{false}, no background.}
+ \item \key{trame}{true}{If \texttt{true}, fills an A4 paper with cards. If \texttt{false}, draws one only card. To work properly, \texttt{trame=true} requires A4 paper and \commande{usepackage[scale=0.95]\{geometry\}} in preamble.}
\item \key{contentsFontSize}{120}{Font size (int pt) of text in card center.}
\end{itemize}
diff --git a/graphics/pgf/contrib/playcards/playcards-fr.pdf b/graphics/pgf/contrib/playcards/playcards-fr.pdf
index a06a7cc09b..5f358c557d 100644
--- a/graphics/pgf/contrib/playcards/playcards-fr.pdf
+++ b/graphics/pgf/contrib/playcards/playcards-fr.pdf
Binary files differ
diff --git a/graphics/pgf/contrib/playcards/playcards-fr.tex b/graphics/pgf/contrib/playcards/playcards-fr.tex
index 7860a9b1e5..c807577b6e 100644
--- a/graphics/pgf/contrib/playcards/playcards-fr.tex
+++ b/graphics/pgf/contrib/playcards/playcards-fr.tex
@@ -37,56 +37,64 @@ Je remercie Christophe \bsc{Poulain} pour son génial package \href{https://ctan
Merci également à \href{https://tex.stackexchange.com/users/1948/didest}{didest}, dont la question posée sur \href{https://tex.stackexchange.com/questions/47924/creating-playing-cards-using-tikz}{StackExchange} m'a servi de base.
\section{Téléchargement, installation, prérequis}
-Le package est disponible sur CTAN : <lien à venir>. Il contient un unique fichier : \texttt{playcards.sty}
+Le package est disponible sur CTAN : \href{https://ctan.org/pkg/playcards}{https://ctan.org/pkg/playcards}. Il contient un unique fichier : \texttt{playcards.sty}.
-Certains packages sont chargés automatiquement. Ils sont installés par défaut sur la majorités des installations classiques :
+ \subsection{Packages chargés automatiquement}
+Certains packages sont chargés automatiquement. Ils sont installés par défaut sur la majorités des configurations classiques :
\begin{description}
\item[\package{tikz}] et certaines de ses librairies.
\item[\package{simplekv}] pour gérer les paramètres facultatifs des commandes par système \kv{clé}{valeur}.
\item[\package{graphicx}] pour les images.
\item[\package{contour}] pour les ombres et contours de textes.
- \item[\package{geometry}] configuré pour optimiser l'occupation d'une feuille A4 en la remplissant de cartes convenablement alignées.
\end{description}
+ \subsection{Packages recommandés non chargés automatiquement}
+Pour dessiner les cartes individuellement, il n'y a pas de contraintes sur les marges ou le format de papier.
+
+Pour obtenir des planches de cartes identiques, le format doit être A4 et le package \commande{usepackage[scale=0.95]\{geometry\}} doit être chargé en préambule.
+
\section{Principe général}
-Les principales commandes sont construites sur un système de clés/valeurs, sur le modèle \texttt{\textbackslash commande[\kv{cle1}{valeur1}, \kv{cle2}{valeur2}, …,]\{param1\}\{param2\}}.
+Les principales commandes sont construites sur un système de clés/valeurs, sur le modèle \texttt{\textbackslash commande[\kv{cle1}{valeur1}, \kv{cle2}{valeur2}, …]\{param1\}\{param2\}}.
Toutes les clés sont facultatives et si elles ne sont pas renseignées, il leur est attribué une valeur par défaut.
Sauf précision contraire, les longueurs sont mentionnées en millimètres.
\section{Commandes fournies}
+ \subsection{Options du package}
+Par défaut, la police d'écriture utilisée pour le texte des cartes est la même que celle du document. Il est possible de passer en option le paramètre \texttt{anttor} pour que la police des cartes soit \href{https://tug.org/FontCatalogue/antykwatorunska/}{Antykwa Toruńska}.
+
\subsection{Commande \commande{drawcardsrecto}}
-Cette commande prend un paramètre obligatoire : le texte qui apparaîtra au centre de la carte et remplit une feuille A4 avec 9 cartes identiques. Cette commande trace le recto des cartes. Un exemple est donné figure \ref{fig:recto}.
+Cette commande prend un paramètre obligatoire : le texte qui apparaîtra au centre de la carte. Elle remplit une feuille A4 avec 9 cartes identiques. Cette commande trace le recto des cartes. Un exemple est donné figure \ref{fig:recto}.
\begin{figure}[h]\begin{center}
\caption{\commande{drawcardsrecto[trame=false]\{5\}}}
- \includegraphics{screen01.png}\label{fig:recto}
+ \includegraphics{fig01.pdf}\label{fig:recto}
\end{center}\end{figure}
Paramètres optionnels :
\begin{itemize}
- \item \key{borders}{true}{Retire les bordures.}
- \item \key{trame}{true}{Si \texttt{true}, remplit une feuille A4 avec les cartes. Si \texttt{false}, dessine une seule carte.}
+ \item \key{borders}{true}{Trace les bordures. Si \texttt{false}, les bordures sont retirées.}
+ \item \key{trame}{true}{Si \texttt{true}, remplit une feuille A4 avec les cartes. Si \texttt{false}, dessine une seule carte. Pour fonctionner correctement, la clé \texttt{trame=true} nécessite que le document soit au format A4 et que soit chargé en préambule \commande{usepackage[scale=0.95]\{geometry\}}}.
\item \key{corners}{true}{Si \texttt{true}, le texte de la carte est reporté à l'endroit à et à l'envers dans les coins. Si \texttt{false}, les coins ne sont pas affichés.}
\item \key{backgroundImg}{true}{Si \texttt{true}, affiche l'arrière-plan. Si \texttt{false}, pas d'arrière-plan.}
\item \key{backgroundColor}{red}{Spécifie la couleur de l'arrière-plan. Sera ignoré si \texttt{backgroundImg=false}. Utilise les couleurs du package \href{https://www.ctan.org/pkg/xcolor}{xcolor}.}
\item \key{contentsFontSize}{120}{Taille (en pt) du texte au centre de la carte.}
- \item \key{cicleRay}{20}{Rayon du cercle blanc au centre de la carte. La valeur \texttt 0 équivaut à ne pas tracer le cercle.}
+ \item \key{circleRay}{20}{Rayon du cercle blanc au centre de la carte. La valeur \texttt 0 équivaut à ne pas tracer le cercle.}
\end{itemize}
\subsection{Commande \commande{drawcardsverso}}
-Il est possible, mais ce n'est pas obligatoire, de dessiner le verso des cartes. Les rectos devront être sur une page et les versos sur une autre et d'avoir autant de rectos que de versos. Un exemple est donné figure \ref{fig:verso}.
+Il est possible, mais ce n'est pas obligatoire, de dessiner le verso des cartes. Les rectos devront être sur une page et les versos sur une autre. Il est recommandé d'avoir autant de rectos que de versos pour préserver l'alignement. Un exemple est donné figure \ref{fig:verso}.
Pour avoir le bon alignement, il est recommandé de placer les commandes dans un environnement \verb!\begin{center}...\end{center}!.
\begin{figure}[h]\begin{center}
\caption{\commande{drawcardsverso[trame=false,contentsFontSize=40]\{Exemple\}}}
- \includegraphics{screen02.png}\label{fig:verso}
+ \includegraphics{fig02.pdf}\label{fig:verso}
\end{center}\end{figure}
Paramètres optionnels :
\begin{itemize}
\item \key{backgroundImg}{true}{Si \texttt{true}, affiche l'arrière-plan. Si \texttt{false}, pas d'arrière-plan.}
- \item \key{trame}{true}{Si \texttt{true}, remplit une feuille A4 avec les cartes. Si \texttt{false}, dessine une seule carte.}
+ \item \key{trame}{true}{Si \texttt{true}, remplit une feuille A4 avec les cartes. Si \texttt{false}, dessine une seule carte. Pour fonctionner correctement, la clé \texttt{trame=true} nécessite que le document soit au format A4 et que soit chargé en préambule \commande{usepackage[scale=0.95]\{geometry\}}}.
\item \key{contentsFontSize}{50}{Taille (en pt) du texte au centre de la carte.}
\end{itemize}
diff --git a/graphics/pgf/contrib/playcards/playcards.sty b/graphics/pgf/contrib/playcards/playcards.sty
index aa5218f241..4b5d8fb85b 100644
--- a/graphics/pgf/contrib/playcards/playcards.sty
+++ b/graphics/pgf/contrib/playcards/playcards.sty
@@ -1,6 +1,6 @@
% Clément PAGÈS <contact@clementpages.fr>
%
-% Version 0.1
+% Version 0.2
%
% Draws basic playcards with Tikz. Inspired by https://tex.stackexchange.com/questions/47924/creating-playing-cards-using-tikz
%
@@ -11,13 +11,9 @@
\NeedsTeXFormat{LaTeX2e}
-\ProvidesPackage{playcards}[2023/04/29, Personal commands]
-
-
-\RequirePackage[scale=0.950]{geometry}
+\ProvidesPackage{playcards}[2023/05/02, Personal commands]
\RequirePackage{simplekv}
-\RequirePackage{anttor}
\RequirePackage{graphicx}
\RequirePackage{tikz}
\usetikzlibrary{patterns}
@@ -30,6 +26,12 @@
},
}
+% Check if attor is given a optional parameter
+\newif\if@loadanttorfont\@loadanttorfontfalse
+\DeclareOption{anttor}{\@loadanttorfonttrue}
+\ProcessOptions\relax
+
+
\RequirePackage[outline]{contour}
\pgfmathsetmacro{\cardwidth}{59}
@@ -149,6 +151,9 @@
\newcommand{\drawcardsverso}[2][]{
+ \if@loadanttorfont % Change card font to anttor if parameter antor given
+ \fontfamily{antt}
+ \fi
\useKVdefault[VersoKeys]%
\setKV[VersoKeys]{#1}%
\ifboolKV[VersoKeys]{trame}{%
@@ -163,6 +168,9 @@
}
\newcommand{\drawcardsrecto}[2][] {
+ \if@loadanttorfont % Change card font to anttor if parameter antor given
+ \fontfamily{antt}
+ \fi
\useKVdefault[RectoKeys]%
\setKV[RectoKeys]{#1}%
\ifboolKV[RectoKeys]{trame}{
diff --git a/graphics/pgf/contrib/tikz3d-fr/README.md b/graphics/pgf/contrib/tikz3d-fr/README.md
new file mode 100644
index 0000000000..ec6bbebd6f
--- /dev/null
+++ b/graphics/pgf/contrib/tikz3d-fr/README.md
@@ -0,0 +1,7 @@
+tikz3d-fr is a package to work with some 3D figures.
+----------------------------------------------------------
+tikz3d-fr est un package pour travailler un peu en tikz3d.
+----------------------------------------------------------
+Author : Cédric Pierquet
+email : cpierquet@outlook.fr
+Licence : Released under the LaTeX Project Public License v1.3c or later, see http://www.latex-project.org/lppl.txt \ No newline at end of file
diff --git a/graphics/pgf/contrib/tikz3d-fr/doc/tikz3d-fr-doc.pdf b/graphics/pgf/contrib/tikz3d-fr/doc/tikz3d-fr-doc.pdf
new file mode 100644
index 0000000000..9566efab5b
--- /dev/null
+++ b/graphics/pgf/contrib/tikz3d-fr/doc/tikz3d-fr-doc.pdf
Binary files differ
diff --git a/graphics/pgf/contrib/tikz3d-fr/doc/tikz3d-fr-doc.tex b/graphics/pgf/contrib/tikz3d-fr/doc/tikz3d-fr-doc.tex
new file mode 100644
index 0000000000..548d68c219
--- /dev/null
+++ b/graphics/pgf/contrib/tikz3d-fr/doc/tikz3d-fr-doc.tex
@@ -0,0 +1,752 @@
+% !TeX TXS-program:compile = txs:///arara
+% arara: pdflatex: {shell: yes, synctex: no, interaction: batchmode}
+% arara: pdflatex: {shell: yes, synctex: no, interaction: batchmode} if found('log', '(undefined references|Please rerun|Rerun to get)')
+
+\documentclass[french,a4paper,11pt]{article}
+\usepackage[margin=2cm,includefoot]{geometry}
+\def\TPversion{0.1.0}
+\def\TPdate{02 Mai 2023}
+\usepackage[utf8]{inputenc}
+\usepackage[T1]{fontenc}
+\usepackage{amsmath,amssymb}
+\usepackage{tikz3d-fr}
+\usepackage{awesomebox}
+\usepackage{fontawesome5}
+\usepackage{footnote}
+\makesavenoteenv{tabular}
+\usepackage{enumitem}
+\usepackage{tabularray}
+\usepackage{fancyvrb}
+\usepackage{fancyhdr}
+\fancyhf{}
+\renewcommand{\headrulewidth}{0pt}
+\lfoot{\sffamily\small [tikz3d-fr]}
+\cfoot{\sffamily\small - \thepage{} -}
+\rfoot{\hyperlink{matoc}{\small\faArrowAltCircleUp[regular]}}
+
+%\usepackage{hvlogos}
+\usepackage{hologo}
+\providecommand\tikzlogo{Ti\textit{k}Z}
+\providecommand\TeXLive{\TeX{}Live\xspace}
+\providecommand\PSTricks{\textsf{PSTricks}\xspace}
+\let\pstricks\PSTricks
+\let\TikZ\tikzlogo
+\newcommand\TableauDocumentation{%
+ \begin{tblr}{width=\linewidth,colspec={X[c]X[c]X[c]X[c]X[c]X[c]},cells={font=\sffamily}}
+ {\LARGE \LaTeX} & & & & &\\
+ & {\LARGE \hologo{pdfLaTeX}} & & & & \\
+ & & {\LARGE \hologo{LuaLaTeX}} & & & \\
+ & & & {\LARGE \TikZ} & & \\
+ & & & & {\LARGE \TeXLive} & \\
+ & & & & & {\LARGE \hologo{MiKTeX}} \\
+ \end{tblr}
+}
+
+\usepackage{hyperref}
+\urlstyle{same}
+\hypersetup{pdfborder=0 0 0}
+\setlength{\parindent}{0pt}
+\definecolor{LightGray}{gray}{0.9}
+
+\usepackage{babel}
+\AddThinSpaceBeforeFootnotes
+\FrenchFootnotes
+
+\usepackage[most]{tcolorbox}
+\usetikzlibrary{calc}
+\tcbuselibrary{minted}
+\NewTCBListing{PresCodeTex}{ O{cyan} m }{%
+ enhanced,width=0.93\linewidth,flush right,boxrule=0.75pt,colframe=#1!85!black,%
+ sharp corners,top=0mm,bottom=0mm,left=0.4em,right=5mm,%
+ before skip=\baselineskip,after skip=\baselineskip,%
+ colback=white,
+ fontupper=\footnotesize,fontlower=\footnotesize,%
+ watermark text={\faCode},watermark opacity=0.25,watermark zoom=0.50,%
+ title={{\scriptsize\faCode} Code \LaTeX},
+ lefttitle=0.4em,
+ fonttitle=\bfseries\footnotesize\sffamily,colbacktitle=darkgray!50!#1,%
+ listing engine=minted,minted style=colorful,minted language=tex,
+ minted options={tabsize=4,fontsize=\footnotesize,autogobble,breaklines=true},
+ #2,%
+ overlay={\draw[#1!85!black] ($(frame.north west)+(-0.035\linewidth,-0.025\linewidth)$) node[scale=1.66] {\faCode} ;}
+}
+
+\NewTCBListing{PresCode}{ O{cyan} m }{%
+ enhanced,width=0.93\linewidth,flush right,boxrule=0.75pt,colframe=#1!85!black,%
+ sharp corners,top=0mm,bottom=0mm,left=0.4em,right=5mm,%
+ before skip=\baselineskip,after skip=\baselineskip,%
+ colback=white,
+ fontupper=\footnotesize,fontlower=\footnotesize,%
+ watermark text={\faCogs},watermark opacity=0.25,watermark zoom=0.50,%
+ title={{\scriptsize\faCogs} Code \LaTeX{} et sortie \LaTeX},
+ lefttitle=0.4em,
+ fonttitle=\bfseries\footnotesize\sffamily,colbacktitle=darkgray!50!#1,%
+ listing engine=minted,minted style=colorful,minted language=tex,
+ minted options={tabsize=4,fontsize=\footnotesize,autogobble,breaklines=true},
+ #2,%
+ overlay={%
+ \draw[#1!85!black] ($(frame.north west)+(-0.035\linewidth,-0.025\linewidth)$) node[scale=1.66] {\faCode} ;
+ \draw[#1!85!black] ($(segmentation.west)+(-0.035\linewidth,-0.025\linewidth)$) node[scale=1.66] {\faFilePdf} ;
+
+ }
+}
+
+\NewTCBListing{PresCodeSortie}{ O{cyan} m }{%
+ enhanced,width=0.93\linewidth,flush right,boxrule=0.75pt,colframe=#1!85!black,%
+ sharp corners,top=0mm,bottom=0mm,left=0.4em,right=5mm,%
+ before skip=\baselineskip,after skip=\baselineskip,%
+ colback=white,
+ fontupper=\footnotesize,fontlower=\footnotesize,%
+ watermark text={\faFilePdf},watermark opacity=0.25,watermark zoom=0.50,%
+ title={{\scriptsize\faFilePdf} Sortie \LaTeX},
+ lefttitle=0.4em,
+ fonttitle=\bfseries\footnotesize\sffamily,colbacktitle=darkgray!50!#1,%
+ listing engine=minted,minted style=colorful,minted language=tex,
+ minted options={tabsize=4,fontsize=\footnotesize,autogobble,breaklines=true},
+ #2,%
+ overlay={\draw[#1!85!black] ($(frame.north west)+(-0.035\linewidth,-0.025\linewidth)$) node[scale=1.66] {\faFilePdf} ;}
+}
+
+\NewTCBListing{PresentationCode}{ O{blue} m }{%
+ sharp corners=downhill,enhanced,arc=12pt,skin=bicolor,%
+ colback=#1!1!white,colframe=#1!75!black,colbacklower=white,%
+ attach boxed title to top right={yshift=-\tcboxedtitleheight},title=Code \LaTeX,%
+ boxed title style={%
+ colframe=#1!75!black,colback=#1!15!white,%
+ ,sharp corners=downhill,arc=12pt,%
+ },%
+ top=\baselineskip,%
+ fonttitle=\color{#1!90!black}\itshape\ttfamily\footnotesize,%
+ listing engine=minted,minted style=colorful,
+ minted language=tex,minted options={tabsize=4,fontsize=\small,autogobble},
+ #2
+}
+
+\tcbset{vignettes/.style={%
+ nobeforeafter,box align=base,boxsep=0pt,enhanced,sharp corners=all,rounded corners=southeast,%
+ boxrule=0.75pt,left=7pt,right=1pt,top=0pt,bottom=0.25pt,%
+ }
+}
+
+\tcbset{vignetteMaJ/.style={%
+ fontupper={\vphantom{pf}\footnotesize\ttfamily},
+ vignettes,colframe=ForestGreen!50!black,coltitle=white,colback=purple!25,%
+ overlay={\begin{tcbclipinterior}%
+ \fill[fill=purple!75]($(interior.south west)$) rectangle node[rotate=90]{\tiny \sffamily{\textcolor{Black}{\scalebox{0.85}[0.75]{\textbf{MàJ}}}}} ($(interior.north west)+(5pt,0pt)$);%
+ \end{tcbclipinterior}}
+ }
+}
+
+\newcommand\Cle[1]{{\bfseries\sffamily\textlangle #1\textrangle}}
+\newcommand\cmaj[1]{\tcbox[vignetteMaJ]{#1}\xspace}
+
+\begin{document}
+
+\setlength{\aweboxleftmargin}{0.07\linewidth}
+\setlength{\aweboxcontentwidth}{0.93\linewidth}
+\setlength{\aweboxvskip}{8pt}
+
+\pagestyle{fancy}
+
+\thispagestyle{empty}
+
+\vspace{2cm}
+
+\begin{center}
+ \begin{minipage}{0.75\linewidth}
+ \begin{tcolorbox}[colframe=yellow,colback=yellow!15]
+ \begin{center}
+ \begin{tabular}{c}
+ {\Huge \texttt{tikz3d-fr}}\\
+ \\
+ {\LARGE Quelques commandes (fr) pour} \\
+ \\
+ {\LARGE un peu de 3D avec \TikZ.} \\
+ \end{tabular}
+
+ \bigskip
+
+ {\small \texttt{Version \TPversion{} -- \TPdate}}
+ \end{center}
+ \end{tcolorbox}
+\end{minipage}
+\end{center}
+
+\begin{center}
+ \begin{tabular}{c}
+ \texttt{Cédric Pierquet}\\
+ {\ttfamily c pierquet -- at -- outlook . fr}\\
+ \texttt{\url{https://github.com/cpierquet/tikz3dfr}}
+\end{tabular}
+\end{center}
+
+\vspace{0.25cm}
+
+{$\blacktriangleright$~~Un environnement avec déclaration des unités.}
+
+\smallskip
+
+{$\blacktriangleright$~~Une commande pour afficher un pavé, avec personnalisations.}
+
+\smallskip
+
+{$\blacktriangleright$~~Deux commandes pour afficher des empilements de \og petits cubes \fg.}
+
+\vspace{1cm}
+
+\begin{center}
+ \begin{tcolorbox}[enhanced,colframe=cyan,colback=cyan!2,center,width=0.95\linewidth,drop fuzzy shadow=lightgray]
+ \begin{EnvTikzEspace}
+ \PaveTikzTriDim[Cube,Largeur=2.5,AffLabel,Couleur=blue!50!black,CouleurSommets=red]
+ \end{EnvTikzEspace}
+
+ \vspace*{-2cm}
+
+ \hfill\BlocPetitsCubes[violet]{1,2,3,4,5 / 0,2,1,1,3 / 0,2,1,1,2 / 1,1,1,1,1}\hfill~
+
+ \vspace*{-2cm}
+
+ \hfill
+ \begin{EmpilementCubes}
+ \PlaquePetitsCubes[cyan/red/green/yellow]{ 3111-1-4 / 233123 / 2-1112 }
+ \PlaquePetitsCubes[cyan/red]{ 111 / -21 }
+ \PlaquePetitsCubes[cyan/red/green]{ 3-2 }
+ \end{EmpilementCubes}
+ \end{tcolorbox}
+\end{center}
+
+\vspace{0.5cm}
+
+%\hfill{}\textit{Merci à Denis Bitouzé et à Gilles Le Bourhis pour leurs retours et idées !}
+
+\smallskip
+
+\vfill
+
+\hrule
+
+\medskip
+
+\TableauDocumentation
+
+\medskip
+
+\hrule
+
+\medskip
+
+\newpage
+
+\phantomsection
+\hypertarget{matoc}{}
+
+\tableofcontents
+
+\vfill
+
+\part{Historique}
+
+\verb|v0.1.0|~:~~~~Version initiale.
+
+\newpage
+
+\part{Introduction}
+
+\section{Le package tikz3d-fr}
+
+\subsection{Introduction}
+
+\begin{noteblock}
+Le package propose des commandes basiques -- francisées -- pour travailler sur des figures simples en 3D, à l'aide de \TikZ{} en utilisant des coordonnées tridimensionnelles :
+
+\begin{itemize}
+ \item un environnement avec gestion des unités $x/y/z$ ;
+ \item une commande pour tracer et personnaliser un cube ;
+ \item des commandes pour créer/afficher/nommer des points de l'espace ;
+ \item des commandes pour tracer un ou plusieurs segments ;
+ \item des commandes et un environnement pour travailler sur des \textit{empilements} de cubes.
+\end{itemize}
+\vspace*{-\baselineskip}\leavevmode
+\end{noteblock}
+
+\begin{importantblock}
+Il existe d'autres solutions pour travailler avec de la 3D en \LaTeX, comme par exemple les packages \textsf{ProfCollege}\footnotemark\footnotetext{\url{https://www.ctan.org/pkg/profcollege}} (de Christophe Poulain, qui utilise \hologo{MetaPost}, et qui est certainement beaucoup plus performant) ou \textsf{pst-ob3d}\footnotemark\footnotetext{\url{https://www.ctan.org/pkg/pst-ob3d}} (de Herbert Voß et Denis Girou, qui utilise \pstricks).
+
+\smallskip
+
+L'idée est de proposer une utilisation des capacités (natives) 3D de \TikZ, en proposant des commandes \textit{simplifiées} et \textit{francisées} pour des figures simples (tétraèdres, cubes, pyramides, pavés) utilisées fréquemment dans des exercices de géométrie dans l'espace dans l'enseignement secondaires en France.
+\end{importantblock}
+
+\subsection{Chargement du package, packages utilisés}
+
+\begin{importantblock}
+Le package se charge, de manière classique, dans le préambule.
+
+Il n'existe pas d'option pour le package, et \texttt{xcolor} n'est pas chargé avec des options spécifiques.
+\end{importantblock}
+
+\begin{PresCodeTex}{listing only}
+\usepackage{tikz3d-fr}
+\end{PresCodeTex}
+
+\begin{noteblock}
+\textsf{tikz3d-fr} charge les packages suivantes :
+
+\begin{itemize}
+ \item \texttt{tikz}, \texttt{xstring}, \texttt{xintexpr}, \texttt{simplekv} et \texttt{xinttools} et \texttt{listofitems} ;
+ \item les librairies \texttt{\textit{tikz}.calc} et \texttt{\textit{tikz}.babel}.
+\end{itemize}
+
+Il est compatible avec les compilations usuelles en \textsf{latex}, \textsf{pdflatex}, \textsf{lualatex} ou \textsf{xelatex}.
+\end{noteblock}
+
+\vfill~
+
+\pagebreak
+
+\part{Environnement 3D et commandes de base}
+
+\section{Création de l'environnement}
+
+\subsection{Commande}
+
+\begin{cautionblock}
+L'environnement dédié à la création de figures en 3D avec \TikZ{} est \texttt{EnvTikzEspace}.
+
+Il permet de définir les unités et \textit{angles} des différents axes.
+\end{cautionblock}
+
+\begin{PresCodeTex}{listing only}
+\begin{EnvTikzEspace}[Clés]<options tikz>
+ %commandes
+\end{EnvTikzEspace}
+\end{PresCodeTex}
+
+\subsection{Clés et options}
+
+\begin{tipblock}
+Le premier argument, optionnel et entre \texttt{[...]} propose les \Cle{clés} suivantes :
+
+\begin{itemize}
+ \item \Cle{UniteX}, à donner sous la forme \Cle{\{angle\string:longueur\}} pour le vecteur de base $\vec{\imath}$ ;
+
+ \hfill{}défaut : \Cle{\{-15\string:1cm\}},%
+ \item \Cle{UniteY}, à donner sous la forme \Cle{\{angle\string:longueur\}} pour le vecteur de base $\vec{\jmath}$ ;
+
+ \hfill{}défaut : \Cle{\{20\string:0.65cm\}}
+ \item \Cle{UniteZ}, à donner sous la forme \Cle{\{angle\string:longueur\}} pour le vecteur de base $\vec{k}$ ;
+
+ \hfill{}défaut : \Cle{\{90\string:1cm\}}
+ \item Le booléen \Cle{VueClassique} pour un affichage en perspective habituelle.\hfill~défaut : \Cle{false}
+\end{itemize}
+\vspace*{-\baselineskip}\leavevmode
+\end{tipblock}
+
+\begin{tipblock}
+Le second argument, optionnel et entre \texttt{<...>} est quant à lui relatif à des arguments à passer à l'environnement \TikZ{} créé, comme par exemple un alignement vertical, etc
+\end{tipblock}
+
+\begin{PresCode}{}
+\begin{EnvTikzEspace}
+ \draw[->,>=latex] (0,0,0)--(1,0,0) node[right] {$\vec{\imath}$} ;
+ \draw[->,>=latex] (0,0,0)--(0,1,0) node[right] {$\vec{\jmath}$} ;
+ \draw[->,>=latex] (0,0,0)--(0,0,1) node[above] {$\vec{k}$} ;
+\end{EnvTikzEspace}
+\end{PresCode}
+
+\begin{PresCode}{}
+\begin{EnvTikzEspace}[UniteX={-145:1.25cm},UniteY={0:1.75cm},UniteZ={90:1.75cm}]
+ \draw[->,>=latex] (0,0,0)--(1,0,0) node[right] {$\vec{\imath}$} ;
+ \draw[->,>=latex] (0,0,0)--(0,1,0) node[right] {$\vec{\jmath}$} ;
+ \draw[->,>=latex] (0,0,0)--(0,0,1) node[above] {$\vec{k}$} ;
+\end{EnvTikzEspace}
+\end{PresCode}
+
+\begin{PresCode}{}
+\begin{EnvTikzEspace}[VueClassique]
+ \draw[->,>=latex] (0,0,0)--(1,0,0) node[right] {$\vec{\imath}$} ;
+ \draw[->,>=latex] (0,0,0)--(0,1,0) node[right] {$\vec{\jmath}$} ;
+ \draw[->,>=latex] (0,0,0)--(0,0,1) node[above] {$\vec{k}$} ;
+\end{EnvTikzEspace}
+\end{PresCode}
+
+\begin{noteblock}
+Une fois l'environnement, via son \textit{repère}, est créé, toute commande en \TikZ{} est utilisable avec les coordonnées \texttt{(x,y,z)} ou bien les \texttt{scope} avec les \texttt{canva}.
+\end{noteblock}
+
+\begin{PresCode}{}
+\begin{EnvTikzEspace}[UniteX={-145:0.575cm},UniteY={0:0.7cm},UniteZ={90:0.7cm}]
+ \filldraw[red] (2,4,3) circle[radius=1pt] ; \draw[red] (0,0,0) -- (2,4,3) ;
+ \draw[thin,->,>=latex] (0,0,0)--(3,0,0) ;
+ \draw[thin,->,>=latex] (0,0,0)--(0,5,0) ;
+ \draw[thin,->,>=latex] (0,0,0)--(0,0,4) ;
+ \draw[->,>=latex] (0,0,0)--(1,0,0) ;
+ \draw[->,>=latex] (0,0,0)--(0,1,0) ;
+ \draw[->,>=latex] (0,0,0)--(0,0,1) ;
+ \draw[dashed] (0,0,3)--(2,4,3)--(2,4,0)--(0,0,0) (2,4,0)--(2,0,0) (2,4,0)--(0,4,0) ;
+\end{EnvTikzEspace}
+\end{PresCode}
+
+\pagebreak
+
+\section{Points et segments}
+
+\subsection{Commandes}
+
+\begin{cautionblock}
+Les commandes \textit{simplifiées} et \textit{francisées} disponible sont :
+
+\begin{itemize}
+ \item \texttt{\textbackslash PlacePointEspace} pour placer un point dans l'espace ;
+ \item \texttt{\textbackslash PlacePointsEspace} pour placer des points dans l'espace ;
+ \item \texttt{\textbackslash MarquePointEspace} pour marquer (matérialiser) un point dans l'espace ;
+ \item \texttt{\textbackslash MarquePointsEspace} pour marquer (matérialiser) un point dans l'espace ;
+ \item \texttt{\textbackslash TraceSegmentEspace} pour tracer un segment dans l'espace ;
+ \item \texttt{\textbackslash TraceSegmentsEspace} pour tracer des segments dans l'espace.
+\end{itemize}
+\vspace*{-\baselineskip}\leavevmode
+\end{cautionblock}
+
+\begin{PresCodeTex}{listing only}
+\begin{EnvTikzEspace}[Clés]<options tikz>
+ %créer/placer/nommer un point
+ \PlacePointEspace(*)[clés]{nœud}{coordonnées}<label>
+ %créer/placer/nommer plusieurs points
+ \PlacePointsEspace(*)[clés]{liste}
+ %marquer un point
+ \MarquePointEspace[clés]{point}
+ %marquer plusieurs points
+ \MarquePointsEspace[clés]{liste}
+ %tracer un segment
+ \TraceSegmentEspace[clés](point)(point)
+ %tracer plusieurs segments
+ \TraceSegmentsEspace[clés]{liste}
+\end{EnvTikzEspace}
+\end{PresCodeTex}
+
+\subsection{Clés, options et arguments}
+
+\begin{tipblock}
+Les versions étoilées désactivent l'affichage des labels des points.
+
+\smallskip
+
+L'argument optionnel et entre \texttt{[...]} propose les \Cle{clés} suivantes (communes ou spécifiques) :
+
+\begin{itemize}
+ \item \Cle{PosLabel} pour préciser la position (francisée) du label pour les points ; \hfill{}défaut : \Cle{b}
+ \item \Cle{StyleMarque} parmi \Cle{x/o} pour spécifier le style de la marque des points ;
+
+ \hfill{}défaut : \Cle{o}
+ \item \Cle{TailleMarque} pour spécifier la taille de la marque des points (disque ou croix) ;
+
+ \hfill{}défaut : \Cle{2pt}
+ \item \Cle{Couleur} pour paramétrer la couleur.\hfill{}défaut : \Cle{black}
+\end{itemize}
+\vspace*{-\baselineskip}\leavevmode
+\end{tipblock}
+
+\begin{tipblock}
+Les positions pour les labels des points sont \textit{francisées} :
+
+\begin{itemize}
+ \item \Cle{b} : \texttt{bas}
+ \item \Cle{h} : \texttt{haut}
+ \item \Cle{g} : \texttt{gauche}
+ \item \Cle{d} : \texttt{droite}
+ \item \Cle{hg} : \texttt{haut gauche}
+ \item \ldots
+\end{itemize}
+\vspace*{-\baselineskip}\leavevmode
+\end{tipblock}
+
+\begin{tipblock}
+De manière un peu plus spécifique :
+
+\begin{itemize}
+ \item le \texttt{<label>} pour la commande \texttt{\textbackslash PlacePointEspace} est optionnel, et est identique à \texttt{\{nœud\}} ;
+ \item la \texttt{\{liste\}} pour la commande \texttt{\textbackslash PlacePointsEspace} est à donner -- par exemple -- sous la forme \texttt{A/0,0,0/bg B/5,2,1/hd} ;
+ \item la \texttt{\{liste\}} pour la commande \texttt{\textbackslash TraceSegmentsEspace} est à donner -- par exemple -- sous la forme \texttt{A/B A/C A/D B/D} ;
+ \item les \texttt{[clés]} pour les segments correspondent aux options en langage \TikZ.
+\end{itemize}
+\vspace*{-\baselineskip}\leavevmode
+\end{tipblock}
+
+\begin{PresCode}{}
+\begin{EnvTikzEspace}[VueClassique]
+ %placement des points avec labels
+ \PlacePointsEspace[Couleur=red]{A/0,0,0/bg B/4,0,0/bd C/4,4,0/hd D/0,4,0/hg E/0,0,4/bg F/4,0,4/bd G/4,4,4/hd H/0,4,4/hg}
+ %segments pointillés
+ \TraceSegmentsEspace[thick,dashed,purple]{A/D D/C D/H}
+ %segments pleins
+ \TraceSegmentsEspace[thick,blue]{A/B B/C C/G G/H H/E E/A E/F B/F F/G}
+ %Marques points
+ \MarquePointsEspace[Couleur=orange]{A,B,C,D,E,F,G,H}
+\end{EnvTikzEspace}
+\end{PresCode}
+
+\pagebreak
+
+\section{Pavés}
+
+\subsection{Commandes}
+
+\begin{cautionblock}
+Les commandes \textit{simplifiée} et \textit{francisé} pour afficher un pavé (ou un cube !) est la commande \texttt{\textbackslash PaveTikzTriDim}.
+\end{cautionblock}
+
+\begin{PresCodeTex}{listing only}
+\begin{EnvTikzEspace}[Clés]<options tikz>
+ \PaveTikzTriDim[clés]
+\end{EnvTikzEspace}
+\end{PresCodeTex}
+
+\begin{PresCode}{}
+\begin{EnvTikzEspace}[VueClassique]
+ \PaveTikzTriDim
+\end{EnvTikzEspace}
+\hspace{1cm}
+\begin{EnvTikzEspace}
+ \PaveTikzTriDim
+\end{EnvTikzEspace}
+\end{PresCode}
+
+\subsection{Clés et options}
+
+\begin{tipblock}
+Quelques \Cle{clés} sont disponibles pour cette commande :
+
+\begin{itemize}
+ \item \Cle{Largeur} : largeur du pavé ;\hfill{}défaut \Cle{2}
+ \item \Cle{Profondeur} : profondeur du pavé ;\hfill{}défaut \Cle{1}
+ \item \Cle{Hauteur} : hauteur du pavé ;\hfill{}défaut \Cle{1.25}
+ \item \Cle{Sommets} : liste des sommets (avec délimiteur § !) ;\hfill{}défaut \Cle{A§B§C§D§E§F§G§H}
+ \item \Cle{Math} : booléen pour forcer le mode math des sommets ;\hfill{}défaut \Cle{false}
+ \item \Cle{Epaisseur} : épaisseur des arêtes (en \textit{langage simplifié} \TikZ) ;\hfill{}défaut \Cle{thick}
+ \item \Cle{AffLabel} : booléen pour afficher les noms des sommets ;\hfill{}défaut \Cle{false}
+ \item \Cle{Plein} : booléen pour ne pas afficher les arêtes \textit{invisibles} ;\hfill{}défaut \Cle{false}
+ \item \Cle{Cube} : booléen pour préciser qu'il s'agit d'un cube (seule \Cle{Largeur} est util(isé)e) ;
+
+ \hfill{}défaut \Cle{false}
+ \item \Cle{Couleur} : couleur des arêtes ; \hfill{}défaut \Cle{black}
+
+ \item \Cle{CouleurSommets} : couleur des sommets.\hfill{}défaut \Cle{black}
+\end{itemize}
+\vspace*{-\baselineskip}\leavevmode
+\end{tipblock}
+
+\pagebreak
+
+\begin{PresCode}{}
+\begin{EnvTikzEspace}
+ \PaveTikzTriDim[Cube,Largeur=3,Couleur=red,CouleurSommets=blue,AffLabel]
+\end{EnvTikzEspace}
+\end{PresCode}
+
+\begin{PresCode}{}
+\begin{EnvTikzEspace}[VueClassique]<scale=2>
+ \PaveTikzTriDim[Largeur=3,Profondeur=4,Hauteur=2,Plein,Couleur=gray,AffLabel, CouleurSommets=gray]
+\end{EnvTikzEspace}
+\end{PresCode}
+
+\newpage
+
+\part{Empilements de cubes}
+
+\section{Environnement dédié}
+
+\begin{cautionblock}
+L'environnement dédié à la création de figures type \textit{empilement de cubes} est\ldots{} \texttt{EmpilementCubes}.
+
+Il existe deux manières de définir les empilements :
+
+\begin{itemize}
+ \item en travaillant par \textit{plaques} verticales de l'arrière vers l'avant ;
+ \item en travaillant par les \textit{hauteurs} des colonnes, de l'arrière vers l'avant \textbf{et} de gauche à droite.
+\end{itemize}
+
+L'unité de base des cubes est fixée au départ à $0{,}5$\,cm.
+\end{cautionblock}
+
+\begin{importantblock}
+Les axes (et de ce fait la vue proposée !) sont fixés, non modifiables, donc cette partie est beaucoup moins performante que ce propose le package \textsf{ProfCollege} avec sa commande \texttt{\textbackslash VueCubes} !
+\end{importantblock}
+
+\begin{PresCodeTex}{listing only}
+\begin{EmpilementCubes}[échelle]<options tikz>
+ %commandes
+\end{EmpilementCubes}
+\end{PresCodeTex}
+
+\section{Création par \textit{plaques}}
+
+\subsection{Commandes}
+
+\begin{cautionblock}
+La commande pour créer une plaque \textit{verticale} est \texttt{\textbackslash PlaquePetitsCubes}, avec la contrainte de créer la \textit{figure} de l'arrière vers l'avant.
+
+Il existe également la commande \texttt{\textbackslash PlaqueVide} pour \textit{passer} une ligne.
+\end{cautionblock}
+
+\begin{PresCodeTex}{listing only}
+\begin{EmpilementCubes}[échelle]<options tikz>
+ \PlaquePetitsCubes[couleur(s)]{empilement}
+ \PlaqueVide[nb]
+\end{EmpilementCubes}
+\end{PresCodeTex}
+
+\begin{importantblock}
+Les plaques créées sont affichées l'une \textit{devant} l'autre, et elles sont -- par défaut -- collées les unes aux autres.
+\end{importantblock}
+
+\subsection{Options et arguments}
+
+\begin{tipblock}
+Le premier argument, optionnel et entre \texttt{[...]} permet de spécifier une couleur (\texttt{cyan} par défaut) ou une liste de couleurs qui seront utilisées pour la création des plaques :
+
+\begin{itemize}
+ \item soit une couleur unique, qui sera \textit{codée} par \texttt{1} pour la création des cubes ;
+ \item soit plusieurs couleurs, sous la forme \texttt{couleur1/couleur2/couleur3/...} qui seront codées par \texttt{1}, \texttt{2}, \ldots{} pour la création des cubes.
+\end{itemize}
+
+Le second argument, obligatoire et entre \texttt{\{...\}} est quant à lui la liste, des lignes à construire, avec comme ordres :
+
+\begin{itemize}
+ \item du bas vers le haut (caractère de séparation \texttt{/}) ;
+ \item de la gauche vers la droite (caractère de séparation \texttt{,}) ;
+ \item un \texttt{-} code un \textit{trou}, et un numéro code une couleur (comme définie(s) précédemment).
+\end{itemize}
+
+Cette manière permet de créer des plaques avec couleurs \textit{individuelles} et des \textit{trous} éventuels.
+\end{tipblock}
+
+\begin{PresCode}{}
+\begin{EmpilementCubes}
+ %plaque
+ %de bas en haut : couleurs VBRB-B-J / RVVBRV / J-BBBR
+ \PlaquePetitsCubes[cyan/red/green/yellow]{ 3121-1-4 / 233123 / 4-1112 }
+\end{EmpilementCubes}
+\end{PresCode}
+
+\begin{PresCode}{}
+\begin{EmpilementCubes}
+ %plaque n°1 (fond)
+ \PlaquePetitsCubes{ 1111 / 1111 }
+ \PlaqueVide[2]
+ %plaque n°2
+ \PlaquePetitsCubes[cyan/red]{ 111- / -211 }
+ \PlaqueVide[2]
+ %plaque n°3 (devant)
+ \PlaquePetitsCubes{ 1111 / ---1 }
+\end{EmpilementCubes}
+\end{PresCode}
+
+\begin{PresCode}{}
+\begin{EmpilementCubes}
+ %plaque n°1 (fond)
+ \PlaquePetitsCubes{ 1111 / 1111 }
+ %plaque n°2
+ \PlaquePetitsCubes[cyan/red]{ 111- / -211 }
+ %plaque n°3 (devant)
+ \PlaquePetitsCubes{ 1111 / ---1 }
+\end{EmpilementCubes}
+\end{PresCode}
+
+
+\begin{PresCode}{}
+\begin{EmpilementCubes}[1.75]
+ \PlaquePetitsCubes[cyan/red/green/yellow]{ 3111-1-4 / 233123 / 2-1112 }
+ \PlaquePetitsCubes[cyan/red]{ 111 / -21 }
+ \PlaquePetitsCubes[cyan/red/green]{ 3-2 }
+\end{EmpilementCubes}
+\end{PresCode}
+
+\pagebreak
+
+\section{Création par \textit{hauteurs}}
+
+\subsection{Commande}
+
+\begin{tipblock}
+L'idée, reprise du package \textsf{ProfCollege}\footnotemark\footnotetext{\url{https://www.ctan.org/pkg/profcollege}} permet d'afficher une empilement de cubes (monochromes, et sans trou) en précisant -- grâce à un système de \textit{grille} -- les hauteurs des colonnes.
+
+La commande qui permet de réaliser cet empilement est \texttt{\textbackslash BlocPetitsCubes}.
+\end{tipblock}
+
+\begin{PresCodeTex}{listing only}
+%création dans un environnement dédié
+\begin{EmpilementCubes}[échelle]<options tikz>
+ \BlocPetitsCubes*[couleur]{grille des hauteurs}
+\end{EmpilementCubes}
+\end{PresCodeTex}
+
+\begin{PresCodeTex}{listing only}
+%création autonome
+\BlocPetitsCubes[couleur]{grille des hauteurs}
+\end{PresCodeTex}
+
+\begin{cautionblock}
+Le support de la grille des hauteurs est donc à donner sous forme \textit{rectangulaire}, en respectant un nombre \textit{homogène} de colonnes par ligne !
+\end{cautionblock}
+
+\begin{importantblock}
+Voici une grille permettant d’anticiper la création d'un assemblage (en spécifiant les hauteurs) :
+
+\begin{center}
+ \begin{EnvTikzEspace}[UniteX={-22:1cm},UniteY={22:1cm}]
+ \foreach \x in {0,...,4} {\draw[semithick] (\x,-0.2,0)--++(0,5.4,0) ;}
+ \foreach \y in {0,...,5} {\draw[semithick] (-0.2,\y,0)--++(4.4,0,0) ;}
+ \foreach \y/\n in {0.5/1,1.5/2,2.5/3,3.5/4,4.5/5}
+ {\draw (0.5,\y,0) node[font=\small\sffamily] {\n} ;}
+ \foreach \y/\n in {0.5/0,1.5/2,2.5/1,3.5/1,4.5/3}
+ {\draw (1.5,\y,0) node[font=\small\sffamily] {\n} ;}
+ \foreach \y/\n in {0.5/0,1.5/2,2.5/1,3.5/1,4.5/2}
+ {\draw (2.5,\y,0) node[font=\small\sffamily] {\n} ;}
+ \foreach \y/\n in {0.5/1,1.5/1,2.5/1,3.5/1,4.5/1}
+ {\draw (3.5,\y,0) node[font=\small\sffamily] {\n} ;}
+ \end{EnvTikzEspace}
+\end{center}
+\end{importantblock}
+
+\subsection{Options et arguments}
+
+\begin{tipblock}
+Le premier argument, optionnel et entre \texttt{[...]} permet de spécifier une couleur (\texttt{cyan} par défaut).
+
+Le second argument, obligatoire et entre \texttt{\{...\}} est quant à lui la liste des hauteurs, comme présentée précédemment :
+
+\begin{itemize}
+ \item le caractère de séparation des \textit{plaques} est le \texttt{/} ;
+ \item pour chaque plaque, le caractère de séparation des colonnes est le \texttt{,}.
+\end{itemize}
+\vspace*{-\baselineskip}\leavevmode
+\end{tipblock}
+
+\begin{importantblock}
+Par exemple, la \textit{grille} associée à l'empilement précédent est :
+
+\smallskip
+
+\hfill\texttt{1,2,3,4,5 / 0,2,1,1,3 / 0,2,1,1,2 / 1,1,1,1,1}\hfill~
+\end{importantblock}
+
+\vfill~
+
+\begin{PresCode}{}
+\begin{EmpilementCubes}
+ \BlocPetitsCubes*{1,2,3,4,5}
+\end{EmpilementCubes}
+\end{PresCode}
+
+\begin{PresCode}{}
+%commande autonome, taille par défaut
+\BlocPetitsCubes{1,2,3,4,5 / 0,2,1,1,3 / 0,2,1,1,2 / 1,1,1,1,1}
+\end{PresCode}
+
+\begin{PresCode}{}
+\begin{EmpilementCubes}[2]
+ \BlocPetitsCubes*[violet]{1,2,3,4,5 / 0,2,1,1,3 / 0,2,1,1,2 / 1,1,1,1,1}
+\end{EmpilementCubes}
+\end{PresCode}
+
+\end{document} \ No newline at end of file
diff --git a/graphics/pgf/contrib/tikz3d-fr/tex/tikz3d-fr.sty b/graphics/pgf/contrib/tikz3d-fr/tex/tikz3d-fr.sty
new file mode 100644
index 0000000000..b1c028fc15
--- /dev/null
+++ b/graphics/pgf/contrib/tikz3d-fr/tex/tikz3d-fr.sty
@@ -0,0 +1,314 @@
+% Author : C. Pierquet
+% licence : Released under the LaTeX Project Public License v1.3c
+% or later, see http://www.latex-project.org/lppl.txtf
+
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{tikz3d-fr}[2023/05/02 0.1.0 Aide pour l'utilisation de TikZ 3D]
+%0.1.0 Version initiale
+
+%------Packages utiles
+\RequirePackage{tikz}
+\RequirePackage{xstring}
+\RequirePackage{simplekv}
+\RequirePackage{xinttools}
+\RequirePackage{xintexpr}
+\RequirePackage{listofitems}
+%------Librairies tikz
+\usetikzlibrary{calc}
+\usetikzlibrary{babel}
+
+%%------Param3D pour l'environnement
+\defKV[paramstridim]{%
+ UniteX=\xdef\PLTriDimUx{#1},%
+ UniteY=\xdef\PLTriDimUy{#1},%
+ UniteZ=\xdef\PLTriDimUz{#1}
+}
+\setKVdefault[paramstridim]{%
+ UniteX={-15:1cm},%
+ UniteY={20:0.65cm},%
+ UniteZ={90:1cm},%
+ VueClassique=false
+}
+
+\NewDocumentEnvironment{EnvTikzEspace}{ O{} D<>{} }%1=clés,2=paramtikz(comme line join... scale...)
+{
+ \useKVdefault[paramstridim]%
+ \setKV[paramstridim]{#1}%
+ \ifboolKV[paramstridim]{VueClassique}
+ {%
+ \xdef\PLTriDimUx{0:1cm}%
+ \xdef\PLTriDimUy{30:0.5cm}%
+ \xdef\PLTriDimUz{90:1cm}%
+ }{}%
+ \begin{tikzpicture}[x={(\PLTriDimUx)},y={(\PLTriDimUy)},z={(\PLTriDimUz)},#2]
+}
+{
+ \end{tikzpicture}
+}
+
+%%------PaveDroitTikZ
+\defKV[paramspavetridim]{%
+ Largeur=\xdef\PFPaveLgDDD{#1},%
+ Profondeur=\xdef\PFPavePfDDD{#1},%
+ Hauteur=\xdef\PFPaveHtDDD{#1},%
+ Sommets=\def\PFPaveSommetsDDD{#1},%
+ Epaisseur=\xdef\PFPaveThickDDD{#1},%
+ Couleur=\xdef\PFPaveCouleurDDD{#1},%
+ CouleurSommets=\xdef\PFPaveCouleurSommDDD{#1}
+}
+\setKVdefault[paramspavetridim]{%
+ AffLabel=false,%
+ Plein=false,%
+ Largeur=2,%
+ Profondeur=1,%
+ Hauteur=1.25,%
+ Epaisseur=thick,%
+ Sommets=A§B§C§D§E§F§G§H,%
+ Cube=false,%
+ Math=false,%
+ Couleur=black,%
+ CouleurSommets=black
+}
+
+
+\newcommand\PaveTikzTriDim[1][]{%
+ \useKVdefault[paramspavetridim]%
+ \setKV[paramspavetridim]{#1}%
+ \ifboolKV[paramspavetridim]{Cube}
+ {%
+ \xdef\PFPavePfDDD{\PFPaveLgDDD}%
+ \xdef\PFPaveHtDDD{\PFPaveLgDDD}%
+ }{}
+ \setsepchar{§}%
+ \readlist*\PFListeSommets\PFPaveSommetsDDD
+ \itemtomacro\PFListeSommets[1]\PaveA
+ \itemtomacro\PFListeSommets[2]\PaveB
+ \itemtomacro\PFListeSommets[3]\PaveC
+ \itemtomacro\PFListeSommets[4]\PaveD
+ \itemtomacro\PFListeSommets[5]\PaveE
+ \itemtomacro\PFListeSommets[6]\PaveF
+ \itemtomacro\PFListeSommets[7]\PaveG
+ \itemtomacro\PFListeSommets[8]\PaveH
+ %les nœuds du pave
+ \coordinate (\PaveA) at (0,0,0) ;
+ \coordinate (\PaveB) at ({\PFPaveLgDDD},0,0) ;
+ \coordinate (\PaveC) at ({\PFPaveLgDDD},{\PFPavePfDDD},0) ;
+ \coordinate (\PaveD) at (0,{\PFPavePfDDD},0) ;
+ \coordinate (\PaveE) at (0,0,{\PFPaveHtDDD}) ;
+ \coordinate (\PaveF) at ({\PFPaveLgDDD},0,{\PFPaveHtDDD}) ;
+ \coordinate (\PaveG) at ({\PFPaveLgDDD},{\PFPavePfDDD},{\PFPaveHtDDD}) ;
+ \coordinate (\PaveH) at (0,{\PFPavePfDDD},{\PFPaveHtDDD}) ;
+ \ifboolKV[paramspavetridim]{AffLabel}
+ {%
+ \draw (\PaveA) node[below left,\PFPaveCouleurSommDDD] {\ifboolKV[paramspavetridim]{Math}{$\PaveA$}{\PaveA}} ;
+ \draw (\PaveB) node[below right,\PFPaveCouleurSommDDD] {\ifboolKV[paramspavetridim]{Math}{$\PaveB$}{\PaveB}} ;
+ \draw (\PaveC) node[above right,\PFPaveCouleurSommDDD] {\ifboolKV[paramspavetridim]{Math}{$\PaveC$}{\PaveC}} ;
+ \ifboolKV[paramspavetridim]{Plein}
+ {}
+ {%
+ \draw (\PaveD) node[above left,\PFPaveCouleurSommDDD] {\ifboolKV[paramspavetridim]{Math}{$\PaveD$}{\PaveD}} ;
+ }%
+ \draw (\PaveE) node[below left,\PFPaveCouleurSommDDD] {\ifboolKV[paramspavetridim]{Math}{$\PaveE$}{\PaveE}} ;
+ \draw (\PaveF) node[below right,\PFPaveCouleurSommDDD] {\ifboolKV[paramspavetridim]{Math}{$\PaveF$}{\PaveF}} ;
+ \draw (\PaveG) node[above right,\PFPaveCouleurSommDDD] {\ifboolKV[paramspavetridim]{Math}{$\PaveG$}{\PaveG}} ;
+ \draw (\PaveH) node[above left,\PFPaveCouleurSommDDD] {\ifboolKV[paramspavetridim]{Math}{$\PaveH$}{\PaveH}} ;%
+ }%
+ {}%on affiche rien
+ \ifboolKV[paramspavetridim]{Plein}
+ {}
+ {%
+ \draw[\PFPaveCouleurDDD,dashed,\PFPaveThickDDD,line join=bevel] (\PaveA)--(\PaveD)--(\PaveC) (\PaveD)--(\PaveH) ;%
+ }%
+ \draw[\PFPaveCouleurDDD,\PFPaveThickDDD,line join=bevel] (\PaveE)--(\PaveF)--(\PaveG)--(\PaveH)--cycle ;
+ \draw[\PFPaveCouleurDDD,\PFPaveThickDDD,line join=bevel] (\PaveE)--(\PaveA)--(\PaveB)--(\PaveF)--cycle ;
+ \draw[\PFPaveCouleurDDD,\PFPaveThickDDD,line join=bevel] (\PaveC)--(\PaveG)--(\PaveF)--(\PaveB)--cycle ;
+}
+
+%%------Commandes internes pour les nœuds et points
+\NewDocumentCommand\TransfPosTikz{ m }{%défaut below
+ \def\PosTmpLabel{below}
+ \IfEq{#1}{b}{\def\PosTmpLabel{below}}{}
+ \IfEq{#1}{d}{\def\PosTmpLabel{right}}{}
+ \IfEq{#1}{h}{\def\PosTmpLabel{above}}{}
+ \IfEq{#1}{g}{\def\PosTmpLabel{left}}{}
+ \IfEq{#1}{bg}{\def\PosTmpLabel{below left}}{}
+ \IfEq{#1}{bd}{\def\PosTmpLabel{below right}}{}
+ \IfEq{#1}{hg}{\def\PosTmpLabel{above left}}{}
+ \IfEq{#1}{hd}{\def\PosTmpLabel{above right}}{}
+}
+\tikzset{pics/croix/.style args={#1/#2}{
+ code={
+ \draw[line width={0.5*#1},rotate=#2] (-#1,0) -- (#1,0);
+ \draw[line width={0.5*#1},rotate=#2] (0,-#1) -- (0, #1);
+ }
+ },
+ pics/croix/.default={2pt/0}
+}
+
+%%------Créer/Placer/Nommer Point(s) 3d
+\defKV[TkzTriDimPoint]{%
+ PosLabel=\xdef\TrimDimLabel{#1},%
+ DecalLabel=\xdef\TrimDimDecalLabel{#1},%
+ StyleMarque=\xdef\TrimDimStylePt{#1},%
+ TailleMarque=\xdef\TrimDimtaillePt{#1},%
+ Couleur=\xdef\TrimDimCoul{#1}
+}
+
+\setKVdefault[TkzTriDimPoint]{%
+ PosLabel={b},%
+ DecalLabel=1pt,%
+ StyleMarque=o,%
+ TailleMarque=2pt,%
+ Couleur=black
+}
+
+\NewDocumentCommand\PlacePointEspace{ s O{} m m D<>{#3} }{%
+ %*=label
+ %2=clés
+ %3=nom nœud
+ %4=coordonnées x,y,z
+ %5=label si différent
+ \useKVdefault[TkzTriDimPoint]%
+ \setKV[TkzTriDimPoint]{#2}%
+ \TransfPosTikz{\TrimDimLabel}
+ \coordinate (#3) at (#4) ;
+ \IfBooleanTF{#1}%on désactive le label avec (*)
+ {}%
+ {\draw (#3) node[\TrimDimCoul,\PosTmpLabel=\TrimDimDecalLabel] {#5} ;}%
+}
+
+\NewDocumentCommand\PlacePointsEspace{ s O{} m }{%
+ %*=labels off
+ %2=clés
+ %3=liste nom/coordonnées/pos
+ \useKVdefault[TkzTriDimPoint]%
+ \setKV[TkzTriDimPoint]{#2}%
+ \setsepchar[.]{ ./}%
+ \readlist*\ListePtsEspace{#3}
+ \foreach \i in {1,2,...,\ListePtsEspacelen}
+ {%
+ \IfBooleanTF{#1}%on désactive le label avec (*)
+ {%
+ \PlacePointEspace*[#2]{\ListePtsEspace[\i,1]}{\ListePtsEspace[\i,2]}
+ }%
+ {%
+ \PlacePointEspace[#2,PosLabel={\ListePtsEspace[\i,3]}]{\ListePtsEspace[\i,1]}{\ListePtsEspace[\i,2]}
+ }%
+ }%
+}
+
+\NewDocumentCommand\MarquePointEspace{ O{} m }{%
+ %1=clés
+ %2=nom nœud
+ \useKVdefault[TkzTriDimPoint]%
+ \setKV[TkzTriDimPoint]{#1}%
+ \IfStrEq{\TrimDimStylePt}{o}%
+ {\filldraw[\TrimDimCoul] (#2) circle[radius=\TrimDimtaillePt] ;}{}%
+ \IfStrEq{\TrimDimStylePt}{x}%
+ {\draw[\TrimDimCoul] (#2) pic{croix=\TrimDimtaillePt/45} ;}{}%
+}
+
+\NewDocumentCommand\MarquePointsEspace{ O{} m }{%
+ %1=clés
+ %2=liste nom/coordonnées/pos
+ \useKVdefault[TkzTriDimPoint]%
+ \setKV[TkzTriDimPoint]{#1}%
+ \foreach \i in {#2}
+ {%
+ \MarquePointEspace[#1]{\i}
+ }%
+}
+
+%%------Créer Segment(s) 3d
+\NewDocumentCommand\TraceSegmentEspace{ O{} r() r() }{%1=optionstikz,2=A,3=B
+ \draw[#1] (#2)--(#3) ;
+}
+
+\NewDocumentCommand\TraceSegmentsEspace{ O{} m }{%1=optionstikz,2=liste A/B C/D
+ \setsepchar[.]{ ./}%
+ \readlist*\ListePtsEspace{#2}
+ \foreach \i in {1,2,...,\ListePtsEspacelen}
+ {\draw[#1] (\ListePtsEspace[\i,1])--(\ListePtsEspace[\i,2]) ;}
+}
+
+%--Petits Cubes
+%%------EmpilementCubes
+\NewDocumentEnvironment{EmpilementCubes}{ O{1} D<>{} }%
+{
+ \begin{tikzpicture}[x={(-160:0.5cm)},y={(-25:0.45cm)},z={(90:0.5cm)},scale=#1,#2]
+}
+{
+ \end{tikzpicture}
+}
+
+\NewDocumentCommand\PetitCube{ O{cyan} m }{%
+ \StrBefore[1]{#2}{,}[\xtmp]%
+ \StrBetween[1,2]{#2}{,}{,}[\ytmp]%
+ \StrBehind[2]{#2}{,}[\ztmp]%
+ \draw[fill=#1!70,very thin,line join=bevel] ({\xtmp+1},\ytmp,\ztmp)--++(0,1,0)--++(0,0,-1)--++(0,-1,0)--cycle;
+ \draw[fill=#1!80,very thin,line join=bevel] (\xtmp,{\ytmp+1},\ztmp)--++(1,0,0)--++(0,0,-1)--++(-1,0,0)--cycle;
+ \draw[fill=#1!35!white,very thin,line join=bevel] (\xtmp,\ytmp,\ztmp)--++(1,0,0)--++(0,1,0)--++(-1,0,0)--cycle;
+}
+
+\newcounter{lgblocs}%compteur des lignes, qui sera incrémenté
+\NewDocumentCommand\PlaqueVide{ O{1} }{\addtocounter{lgblocs}{#1}}%passer une plaque
+\NewDocumentCommand\PlaquePetitsCubes{ O{cyan} m }{%poser un cube (attention à l'ordre)
+ \setsepchar[.]{/}
+ %lecture des couleurs
+ \readlist*\ListeCouleurs{#1}
+ %code
+ \readlist*\ListeTraitee{#2}
+ \def\hauteur{\ListeTraiteelen}
+ \addtocounter{lgblocs}{1}
+ \def\y{\thelgblocs}
+ \foreach \i in {1,...,\ListeTraiteelen}%
+ {%
+ %on stocke la ligne à afficher en hauteur
+ \itemtomacro\ListeTraitee[\i]{\lignetmp}
+ %on stocke le nombre de colonnes à afficher
+ \StrLen{\lignetmp}[\colonnetmp]
+ \foreach \j in {\colonnetmp,...,1}%
+ {%
+ \StrChar{\lignetmp}{\j}[\elementtmp]
+ \IfStrEq{\elementtmp}{-}%
+ {}%
+ {%
+ \itemtomacro\ListeCouleurs[\elementtmp]{\elementcouleur}
+ \PetitCube[\elementcouleur]{-\j,\y,\i}
+ }%
+ }%
+ }%
+}
+
+\NewDocumentCommand\BlocPetitsCubes{ s O{cyan} m }{%
+ %*pour autonome
+ %2=couleur unique
+ %3=liste des hauteurs (attention à l'ordre)
+ \setsepchar[.]{/.,}
+ \readlist*\ListeTraitee{#3}
+ \def\Largeur{\ListeTraiteelen}
+ %on lit la Profondeur
+ \itemtomacro\ListeTraitee[1]{\ListeTMP}
+ \setsepchar{,}
+ \readlist*\ListeTraiteeB{\ListeTMP}
+ \def\Profondeur{\ListeTraiteeBlen}
+ \IfBooleanTF{#1}
+ {}
+ {\begin{EnvTikzEspace}[UniteX={-160:0.5cm},UniteY={-25:0.45cm},UniteZ={90:0.5cm}]}
+ %Placement des cubes
+ \foreach \y in {1,...,\Largeur}%
+ {%
+ \foreach \x in {\Profondeur,...,1}
+ {%
+ \itemtomacro\ListeTraitee[\y,\x]{\Hauteur}
+ \xintifboolexpr{\Hauteur == 0}%
+ {}%
+ {%
+ \foreach \z in {1,...,\Hauteur}{\PetitCube[#2]{-\x,\y,\z}}
+ }%
+ }%
+ }%
+ \IfBooleanTF{#1}
+ {}
+ {\end{EnvTikzEspace}}
+} \ No newline at end of file