summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/profcollege/latex/PfCDessinGradue.tex
diff options
context:
space:
mode:
Diffstat (limited to 'macros/latex/contrib/profcollege/latex/PfCDessinGradue.tex')
-rw-r--r--macros/latex/contrib/profcollege/latex/PfCDessinGradue.tex316
1 files changed, 316 insertions, 0 deletions
diff --git a/macros/latex/contrib/profcollege/latex/PfCDessinGradue.tex b/macros/latex/contrib/profcollege/latex/PfCDessinGradue.tex
new file mode 100644
index 0000000000..682572bfc1
--- /dev/null
+++ b/macros/latex/contrib/profcollege/latex/PfCDessinGradue.tex
@@ -0,0 +1,316 @@
+%%%
+% Dessin Gradue
+%%%
+\setKVdefault[DessinGradue]{Lignes=10,Debut=-5,Fin=5,Pas=10,Solution=false,EcartVertical=1.5,LignesIdentiques,Longueur=10,Echelle=1,Droites=false,DemiDroites=false,OrigineVariable=false,Code=false}
+\defKV[DessinGradue]{Traces=\setKV[DessinGradue]{Code}}%
+
+\def\TraceDessinGradueComplet#1#2#3{%
+ \ifluatex
+ \mplibforcehmode
+ \begin{mplibcode}
+ % Paramètres
+ LongueurLigne=\useKV[DessinGradue]{Longueur};
+ EcartVertical=\useKV[DessinGradue]{EcartVertical};
+ Pas:=\useKV[DessinGradue]{Pas};
+ NbLignes=\useKV[DessinGradue]{Lignes};
+ Echelle=\useKV[DessinGradue]{Echelle};
+ Debut:=\useKV[DessinGradue]{Debut};
+ Fin:=\useKV[DessinGradue]{Fin};
+
+ boolean Solution,Droites,DemiDroites,LignesIdentiques,OrigineVariable,Code;
+ Solution=\useKV[DessinGradue]{Solution};
+ LignesIdentiques:=\useKV[DessinGradue]{LignesIdentiques};
+ OrigineVariable:=\useKV[DessinGradue]{OrigineVariable};
+ Droites=\useKV[DessinGradue]{Droites};
+ DemiDroites=\useKV[DessinGradue]{DemiDroites};
+ Code=\useKV[DessinGradue]{Code};
+
+ pair La,Lb,Lab[];
+ pair A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A',B',C',D',E',F',G',H',I',J',K',L',M',N',O',P',Q',R',S',T',U',V',W',X',Y',Z',A'',B'',C'',D'',E'',F'',G'',H'',I'',J'',K'',L'',M'',N'',O'',P'',Q'',R'',S'',T'',U'',V'',W'',X'',Y'',Z'';
+
+ La=(0,0);
+ Lb-La=u*(\useKV[DessinGradue]{Longueur},0);
+
+ % On définit une fonction pour tracer les lignes en fonction du pas "Partage"
+ vardef TraceLignes(expr Partage)=
+ save RecupLigne;
+ picture RecupLigne;
+ RecupLigne=image(
+ if \useKV[DessinGradue]{Droites}:
+ drawarrow 1.05[Lb,La]--1.05[La,Lb];
+ elseif \useKV[DessinGradue]{DemiDroites}:
+ drawarrow La--1.05[La,Lb];
+ else:
+ trace segment(La,Lb);
+ fi;
+ for kl=0 upto Partage:
+ Lab[kl]:=(kl/Partage)[La,Lb];
+ trace (Lab[kl]+u*(0,-0.1))--(Lab[kl]+u*(0,0.1));
+ endfor;
+ );
+ RecupLigne
+ enddef;
+
+ % On définit une fonction pour nommer les points nécessaires.
+ vardef DefinirPoints(text t)=
+ numeric nblignes,nbpas;
+ n:=0;
+ for p_=t:
+ n:=n+1;
+ if (n mod 3)=1:
+ nblignes:=p_;
+ elseif (n mod 3)=2:
+ nbpas:=p_;
+ elseif (n mod 3)=0:
+ p_=(nbpas/TotalPas[nblignes])[La,Lb] shifted(u*(0,(nblignes-1)*(-EcartVertical)));
+ fi;
+ endfor;
+ enddef;
+
+ % On détermine le nombre de lignes et les origines particulières
+ pair OrigA[],OrigB[];
+ if LignesIdentiques:
+ for k=1 upto NbLignes:
+ TotalPas[k]:=Pas;
+ OrigA[k]=(Debut,0);
+ OrigB[k]=(Fin,TotalPas[k]);
+ endfor;
+ else:
+ if OrigineVariable:
+ n:=0;
+ for p_=#1:
+ n:=n+1;
+ OrigA[n]:=p_;
+ TotalPas[n]:=Pas;
+ endfor;
+ NbLignes:=n/2;
+ else:
+ n:=0;
+ for p_=#1:
+ n:=n+1;
+ TotalPas[n]=bluepart(p_);
+ OrigA[n]=(redpart(p_),0);
+ OrigB[n]=(greenpart(p_),TotalPas[n]);
+ endfor;
+ NbLignes:=n;
+ fi;
+ fi;
+
+ picture EnsembleLignes;
+
+ DefinirPoints(#2);
+
+ EnsembleLignes=image(
+ if Solution:
+ drawoptions(withcolor 0.5white);
+ fi;
+ % On trace les lignes et on labelise le numéro de la ligne.
+ for k=0 upto NbLignes-1:
+ trace TraceLignes(TotalPas[k+1]) shifted(k*u*(0,-EcartVertical));
+ if Droites:
+ label.lft(TEX("(\num{"&decimal(k+1)&"})"),1.05[Lb,La] shifted(k*u*(0,-EcartVertical)));
+ else:
+ label.lft(TEX("(\num{"&decimal(k+1)&"})"),La shifted(k*u*(0,-EcartVertical)));
+ fi;
+ endfor;
+ % On labelise les origines
+ labeloffset:=labeloffset*1.5;
+ for k=0 upto NbLignes-1:
+ if OrigineVariable:
+ label.top(TEX("\num{"&decimal(xpart(OrigA[2*k+1]))&"}"),(ypart(OrigA[2*k+1])/Pas)[La,Lb]+u*(0,-k*EcartVertical));
+ label.top(TEX("\num{"&decimal(xpart(OrigA[2*(k+1)]))&"}"),(ypart(OrigA[2*(k+1)])/Pas)[La,Lb]+u*(0,-k*EcartVertical));
+ else:
+ label.top(TEX("\num{"&decimal(xpart(OrigA[k+1]))&"}"),La+u*(0,-k*EcartVertical));
+ label.top(TEX("\num{"&decimal(xpart(OrigB[k+1]))&"}"),Lb+u*(0,-k*EcartVertical));
+ fi;
+ endfor;
+ drawoptions();
+ labeloffset:=labeloffset/1.5;
+
+ % On trace la solution
+ if Solution:
+ for p_=#3:
+ trace p_ withpen pencircle scaled 1.5;
+ endfor;
+ fi;
+ % On ajoute des tracés si nécessaire
+ if Code:
+ \useKV[DessinGradue]{Traces};
+ fi;
+ );
+ trace EnsembleLignes scaled \useKV[DessinGradue]{Echelle};
+ \end{mplibcode}
+ \else
+ \begin{mpost}[mpsettings={%
+ LongueurLigne=\useKV[DessinGradue]{Longueur};
+ EcartVertical=\useKV[DessinGradue]{EcartVertical};
+ Pas:=\useKV[DessinGradue]{Pas};
+ NbLignes=\useKV[DessinGradue]{Lignes};
+ Echelle=\useKV[DessinGradue]{Echelle};
+ Debut:=\useKV[DessinGradue]{Debut};
+ Fin:=\useKV[DessinGradue]{Fin};
+ boolean Solution,Droites,DemiDroites,LignesIdentiques,OrigineVariable,Code;
+ Solution=\useKV[DessinGradue]{Solution};
+ LignesIdentiques:=\useKV[DessinGradue]{LignesIdentiques};
+ OrigineVariable:=\useKV[DessinGradue]{OrigineVariable};
+ Droites=\useKV[DessinGradue]{Droites};
+ DemiDroites=\useKV[DessinGradue]{DemiDroites};
+ Code=\useKV[DessinGradue]{Code};
+ vardef EffectuerLesTraces=
+ if Code:
+ \useKV[DessinGradue]{Traces};
+ fi;
+ enddef;
+ }]
+ pair La,Lb,Lab[];
+ pair A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A',B',C',D',E',F',G',H',I',J',K',L',M',N',O',P',Q',R',S',T',U',V',W',X',Y',Z',A'',B'',C'',D'',E'',F'',G'',H'',I'',J'',K'',L'',M'',N'',O'',P'',Q'',R'',S'',T'',U'',V'',W'',X'',Y'',Z'';
+
+ La=(0,0);
+ Lb-La=u*(\useKV[DessinGradue]{Longueur},0);
+
+ % On définit une fonction pour tracer les lignes en fonction du pas "Partage"
+ vardef TraceLignes(expr Partage)=
+ save RecupLigne;
+ picture RecupLigne;
+ RecupLigne=image(
+ if \useKV[DessinGradue]{Droites}:
+ drawarrow 1.05[Lb,La]--1.05[La,Lb];
+ elseif \useKV[DessinGradue]{DemiDroites}:
+ drawarrow La--1.05[La,Lb];
+ else:
+ trace segment(La,Lb);
+ fi;
+ for kl=0 upto Partage:
+ Lab[kl]:=(kl/Partage)[La,Lb];
+ trace (Lab[kl]+u*(0,-0.1))--(Lab[kl]+u*(0,0.1));
+ endfor;
+ );
+ RecupLigne
+ enddef;
+
+ % On définit une fonction pour nommer les points nécessaires.
+ vardef DefinirPoints(text t)=
+ numeric nblignes,nbpas;
+ n:=0;
+ for p_=t:
+ n:=n+1;
+ if (n mod 3)=1:
+ nblignes:=p_;
+ elseif (n mod 3)=2:
+ nbpas:=p_;
+ elseif (n mod 3)=0:
+ p_=(nbpas/TotalPas[nblignes])[La,Lb] shifted(u*(0,(nblignes-1)*(-EcartVertical)));
+ fi;
+ endfor;
+ enddef;
+
+ % On détermine le nombre de lignes et les origines particulières
+ pair OrigA[],OrigB[];
+ if LignesIdentiques:
+ for k=1 upto NbLignes:
+ TotalPas[k]:=Pas;
+ OrigA[k]=(Debut,0);
+ OrigB[k]=(Fin,TotalPas[k]);
+ endfor;
+ else:
+ if OrigineVariable:
+ n:=0;
+ for p_=#1:
+ n:=n+1;
+ OrigA[n]:=p_;
+ TotalPas[n]:=Pas;
+ endfor;
+ NbLignes:=n/2;
+ else:
+ n:=0;
+ for p_=#1:
+ n:=n+1;
+ TotalPas[n]=bluepart(p_);
+ OrigA[n]=(redpart(p_),0);
+ OrigB[n]=(greenpart(p_),TotalPas[n]);
+ endfor;
+ NbLignes:=n;
+ fi;
+ fi;
+
+ picture EnsembleLignes;
+
+ DefinirPoints(#2);
+
+ EnsembleLignes=image(
+ if Solution:
+ drawoptions(withcolor 0.5white);
+ fi;
+ % On trace les lignes et on labelise le numéro de la ligne.
+ for k=0 upto NbLignes-1:
+ trace TraceLignes(TotalPas[k+1]) shifted(k*u*(0,-EcartVertical));
+ if Droites:
+ label.lft(LATEX("(\num{"&decimal(k+1)&"})"),1.05[Lb,La] shifted(k*u*(0,-EcartVertical)));
+ else:
+ label.lft(LATEX("(\num{"&decimal(k+1)&"})"),La shifted(k*u*(0,-EcartVertical)));
+ fi;
+ endfor;
+ % On labelise les origines
+ labeloffset:=labeloffset*1.5;
+ for k=0 upto NbLignes-1:
+ if OrigineVariable:
+ label.top(LATEX("\num{"&decimal(xpart(OrigA[2*k+1]))&"}"),(ypart(OrigA[2*k+1])/Pas)[La,Lb]+u*(0,-k*EcartVertical));
+ label.top(LATEX("\num{"&decimal(xpart(OrigA[2*(k+1)]))&"}"),(ypart(OrigA[2*(k+1)])/Pas)[La,Lb]+u*(0,-k*EcartVertical));
+ else:
+ label.top(LATEX("\num{"&decimal(xpart(OrigA[k+1]))&"}"),La+u*(0,-k*EcartVertical));
+ label.top(LATEX("\num{"&decimal(xpart(OrigB[k+1]))&"}"),Lb+u*(0,-k*EcartVertical));
+ fi;
+ endfor;
+ drawoptions();
+ labeloffset:=labeloffset/1.5;
+
+ % On trace la solution
+ if Solution:
+ for p_=#3:
+ trace p_ withpen pencircle scaled 1.5;
+ endfor;
+ fi;
+ % On ajoute des tracés si nécessaire
+ if Code:
+ EffectuerLesTraces;
+ fi;
+ );
+ trace EnsembleLignes scaled \useKV[DessinGradue]{Echelle};
+ \end{mpost}
+ \fi
+}%
+
+\def\UpdateLignes#1/#2/#3\nil{\addtotok\toklisteptsgrad{#1,#3,#2,}}%
+\def\UpdateTraces#1\nil{\addtotok\toklistetracesgrad{#1,}}%
+\def\UpdateDefLignes#1/#2/#3\nil{\addtotok\toklistedefligne{(#1,#2,#3),}}%
+
+\newcommand\DessinGradue[4][]{%
+ \useKVdefault[DessinGradue]%
+ \setKV[DessinGradue]{#1}%
+ \newtoks\toklisteptsgrad%
+ \newtoks\toklistetracesgrad%
+ % On retiens les données pour la solution
+ \setsepchar[*]{,*/}%
+ \readlist\ListePG{#3}%
+ \setsepchar[*]{§*/}%
+ \readlist\ListeTraces{#4}%
+ \foreachitem\compteur\in\ListePG{\expandafter\UpdateLignes\compteur\nil}%
+ \foreachitem\compteur\in\ListeTraces{\expandafter\UpdateTraces\compteur\nil}%
+ \ifboolKV[DessinGradue]{LignesIdentiques}{%
+ \TraceDessinGradueComplet{}{\the\toklisteptsgrad}{\the\toklistetracesgrad}%
+ }{%
+ \setsepchar[*]{,*/}%
+ \readlist\ListeDefLigne{#2}%
+ \xdef\toklistedefligne{}%
+ \ifboolKV[DessinGradue]{OrigineVariable}{%
+ \foreachitem\compteur\in\ListeDefLigne{%
+ \xdef\toklistedefligne{\toklistedefligne (\ListeDefLigne[\compteurcnt,1],\ListeDefLigne[\compteurcnt,2]),(\ListeDefLigne[\compteurcnt,3],\ListeDefLigne[\compteurcnt,4]),}%
+ }%
+ }{%
+ \foreachitem\compteur\in\ListeDefLigne{%
+ \xdef\toklistedefligne{\toklistedefligne (\ListeDefLigne[\compteurcnt,1],\ListeDefLigne[\compteurcnt,2],\ListeDefLigne[\compteurcnt,3]),}%
+ }%
+ }%
+ \TraceDessinGradueComplet{\toklistedefligne}{\the\toklisteptsgrad}{\the\toklistetracesgrad}%
+ }%
+}% \ No newline at end of file