summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/profcollege/latex/PfCModeleBarre.tex
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2023-03-24 03:01:34 +0000
committerNorbert Preining <norbert@preining.info>2023-03-24 03:01:34 +0000
commit85fda71ebb01e4a5b0ce50edf3dda43f45ebb55a (patch)
tree8f1fa267e50afbbab02f04483ac3577a698c7916 /macros/latex/contrib/profcollege/latex/PfCModeleBarre.tex
parent46b6c321a2ff14698b756600bffb54d5d5fc3772 (diff)
CTAN sync 202303240301
Diffstat (limited to 'macros/latex/contrib/profcollege/latex/PfCModeleBarre.tex')
-rw-r--r--macros/latex/contrib/profcollege/latex/PfCModeleBarre.tex386
1 files changed, 386 insertions, 0 deletions
diff --git a/macros/latex/contrib/profcollege/latex/PfCModeleBarre.tex b/macros/latex/contrib/profcollege/latex/PfCModeleBarre.tex
new file mode 100644
index 0000000000..fea78f1102
--- /dev/null
+++ b/macros/latex/contrib/profcollege/latex/PfCModeleBarre.tex
@@ -0,0 +1,386 @@
+%%%
+% Modele en barre
+%%%
+\setKVdefault[ClesModeleBarre]{Hauteur=0.5cm,Largeur=1cm,Separation=0,Homogene=false}%Separation pour conserver le lien avec les équations.
+\defKV[ClesModeleBarre]{Longueur=\setKV[ClesModeleBarre]{Homogene}}%
+
+\newtoks\toklistemodelbarresup%
+\toklistemodelbarresup{}%
+\def\UpdateListeModelBarreSup#1\nil{\addtotok\toklistemodelbarresup{#1,}}%
+\newtoks\toklistemodelbarreinf%
+\toklistemodelbarreinf{}%
+\def\UpdateListeModelBarreInf#1\nil{\addtotok\toklistemodelbarreinf{#1,}}%
+
+\newcommand\ModeleBarre[3][]{%
+ % #1 options
+ % #2 éléments de la barre supérieure C1 2 $x$ 1 3/C2 1 1x/
+ % #3 éléments de la barre inférieure (même lecture)
+ \useKVdefault[ClesModeleBarre]%
+ \setKV[ClesModeleBarre]{#1}%
+ \setsepchar{\\/ }%
+ \readlist\ListeModelBarreSup{#2}%
+ \readlist\ListeModelBarreInf{#3}%
+ \toklistemodelbarresup{}%
+ \foreachitem\compteur\in\ListeModelBarreSup{%
+ \foreachitem\valeur\in\ListeModelBarreSup[\compteurcnt]{%
+ \expandafter\UpdateListeModelBarreSup\valeur\nil%
+ }%
+ }%
+ \toklistemodelbarreinf{}%
+ \foreachitem\compteur\in\ListeModelBarreInf{%
+ \foreachitem\valeur\in\ListeModelBarreInf[\compteurcnt]{%
+ \expandafter\UpdateListeModelBarreInf\valeur\nil%
+ }%
+ }%
+ \ifboolKV[ClesModeleBarre]{Homogene}{%
+ \PfCMPDessineModelBarre{\the\toklistemodelbarresup}{\the\toklistemodelbarreinf}%
+ }{%
+ \PfCMPDessineModelBarreNonHomogene{\the\toklistemodelbarresup}{\the\toklistemodelbarreinf}%
+ }%
+}%
+
+\newcommand\PfCMPDessineModelBarre[2]{%
+ \begin{mplibcode}%
+ Longueur:=\useKV[ClesModeleBarre]{Longueur};
+ Hauteur:=\useKV[ClesModeleBarre]{Hauteur};
+
+ vardef Briquesup(expr col)(text t)=
+ save $;
+ picture $;
+ $=image(
+ u:=Longueur/MBnbcasessuptotal;
+ remplis polygone((0,0),(u,0),(u,Hauteur),(0,Hauteur)) withcolor col;
+ draw polygone((0,0),(u,0),(u,Hauteur),(0,Hauteur));
+ label(TEX(t),iso((0,0),(u,Hauteur)));
+ u:=1cm;
+ );
+ $
+ enddef;
+
+ vardef Briqueinf(expr col)(text t)=
+ save $;
+ picture $;
+ $=image(
+ u:=Longueur/MBnbcasesinftotal;
+ remplis polygone((0,0),(u,0),(u,Hauteur),(0,Hauteur)) withcolor col;
+ draw polygone((0,0),(u,0),(u,Hauteur),(0,Hauteur));
+ label(TEX(t),iso((0,0),(u,Hauteur)));
+ u:=1cm;
+ );
+ $
+ enddef;
+
+ numeric MBnbcolsup;%compte combien de couleurs
+ MBnbcolsup=0;
+ color MBColSup[];%Sauvegarde les couleurs de la barre sup
+ numeric MBnbinfosup[];%compte combien d'infos par couleurs.
+ numeric MBnbcasessup[][];
+ numeric MBnbcasessuptotal;
+ MBnbcasessuptotal=0;
+ string MBTextcasessup[][];
+ vardef toto(text t)=
+ for p_=t:
+ if color p_:
+ MBnbcolsup:=MBnbcolsup+1;% on incrémente le nombre de couleurs
+ MBColSup[MBnbcolsup]:=p_;% on définit la couleur de la série de cases
+ MBnbinfosup[MBnbcolsup]:=0;
+ else:
+ if numeric p_:
+ MBnbinfosup[MBnbcolsup]:=MBnbinfosup[MBnbcolsup]+1;
+ MBnbcasessuptotal:=MBnbcasessuptotal+p_;
+ MBnbcasessup[MBnbcolsup][MBnbinfosup[MBnbcolsup]]:=p_;
+ else:
+ MBTextcasessup[MBnbcolsup][MBnbinfosup[MBnbcolsup]]:=p_;
+ fi;
+ fi;
+ endfor;
+ enddef;
+
+ toto(#1);
+
+ numeric MBnbcolinf;%compte combien de couleurs
+ MBnbcolinf=0;
+ color MBColInf[];%Sauvegarde les couleurs de la barre inf
+ numeric MBnbinfoinf[];%compte combien d'infos par couleurs.
+ numeric MBnbcasesinf[][];
+ numeric MBnbcasesinftotal;
+ MBnbcasesinftotal=0;
+ string MBTextcasesinf[][];
+ vardef tata(text t)=
+ for p_=t:
+ if color p_:
+ MBnbcolinf:=MBnbcolinf+1;% on incrémente le nombre de couleurs
+ MBColInf[MBnbcolinf]:=p_;% on définit la couleur de la série de cases
+ MBnbinfoinf[MBnbcolinf]:=0;
+ else:
+ if numeric p_:
+ MBnbinfoinf[MBnbcolinf]:=MBnbinfoinf[MBnbcolinf]+1;
+ MBnbcasesinftotal:=MBnbcasesinftotal+p_;
+ MBnbcasesinf[MBnbcolinf][MBnbinfoinf[MBnbcolinf]]:=p_;
+ else:
+ MBTextcasesinf[MBnbcolinf][MBnbinfoinf[MBnbcolinf]]:=p_;
+ fi;
+ fi;
+ endfor;
+ enddef;
+
+ tata(#2);
+
+ pair VecteurDeplasup;
+ VecteurDeplasup=(Longueur/MBnbcasessuptotal,0);
+
+ numeric MBnbdepla;
+ MBnbdepla=0;
+ for k=1 upto MBnbcolsup:
+ for l=1 upto MBnbinfosup[k]:
+ for j=1 upto MBnbcasessup[k][l]:
+ trace Briquesup(MBColSup[k])(MBTextcasessup[k][l]) shifted(MBnbdepla*VecteurDeplasup);
+ MBnbdepla:=MBnbdepla+1;
+ endfor;
+ endfor;
+ endfor;
+
+ pair VecteurDeplainf;
+ VecteurDeplainf=(Longueur/MBnbcasesinftotal,0);
+
+ numeric MBnbdepla;
+ MBnbdepla=0;
+ for k=1 upto MBnbcolinf:
+ for l=1 upto MBnbinfoinf[k]:
+ for j=1 upto MBnbcasesinf[k][l]:
+ trace Briqueinf(MBColInf[k])(MBTextcasesinf[k][l]) shifted(MBnbdepla*VecteurDeplainf+(0,-Hauteur));
+ MBnbdepla:=MBnbdepla+1;
+ endfor;
+ endfor;
+ endfor;
+ \end{mplibcode}
+}%
+
+\newcommand\PfCMPDessineModelBarreNonHomogene[2]{%
+ \ifluatex%
+ \mplibforcehmode%
+ \begin{mplibcode}
+ Longueur:=\useKV[ClesModeleBarre]{Largeur};
+ Hauteur:=\useKV[ClesModeleBarre]{Hauteur};
+ Separation:=\useKV[ClesModeleBarre]{Separation};
+
+ vardef Brique(expr col,nbfois)(text t)=
+ save $;
+ picture $;
+ $=image(
+ u:=Longueur;
+ if t="?":
+ draw polygone((0,0),(u*abs(nbfois),0),(u*abs(nbfois),Hauteur),(0,Hauteur)) dashed evenly;
+ else:
+ remplis polygone((0,0),(u*abs(nbfois),0),(u*abs(nbfois),Hauteur),(0,Hauteur)) withcolor col;
+ draw polygone((0,0),(u*abs(nbfois),0),(u*abs(nbfois),Hauteur),(0,Hauteur));
+ fi;
+ if nbfois>0:
+ label(TEX(t),iso((0,0),(u*abs(nbfois),Hauteur)));
+ else:
+ label.bot(TEX(t),iso((0,0),(u*abs(nbfois),-Hauteur)));
+ drawdblarrow (0,-0.5*Hauteur)--(u*abs(nbfois),-0.5*Hauteur);
+ fi;
+ u:=1cm;
+ );
+ $
+ enddef;
+
+ numeric MBnbcolsup;%compte combien de couleurs
+ MBnbcolsup=0;
+ color MBColSup[];%Sauvegarde les couleurs de la barre sup
+ numeric MBnbinfosup[];%compte combien d'infos par couleurs.
+ numeric MBnbcasessup[][];
+ numeric MBnbcasessuptotal;
+ MBnbcasessuptotal=0;
+ string MBTextcasessup[][];
+ vardef toto(text t)=
+ for p_=t:
+ if color p_:
+ MBnbcolsup:=MBnbcolsup+1;% on incrémente le nombre de couleurs
+ MBColSup[MBnbcolsup]:=p_;% on définit la couleur de la série de cases
+ MBnbinfosup[MBnbcolsup]:=0;
+ else:
+ if numeric p_:
+ MBnbinfosup[MBnbcolsup]:=MBnbinfosup[MBnbcolsup]+1;
+ MBnbcasessuptotal:=MBnbcasessuptotal+p_;
+ MBnbcasessup[MBnbcolsup][MBnbinfosup[MBnbcolsup]]:=p_;
+ else:
+ MBTextcasessup[MBnbcolsup][MBnbinfosup[MBnbcolsup]]:=p_;
+ fi;
+ fi;
+ endfor;
+ enddef;
+
+ toto(#1);
+
+ numeric MBnbcolinf;%compte combien de couleurs
+ MBnbcolinf=0;
+ color MBColInf[];%Sauvegarde les couleurs de la barre inf
+ numeric MBnbinfoinf[];%compte combien d'infos par couleurs.
+ numeric MBnbcasesinf[][];
+ numeric MBnbcasesinftotal;
+ MBnbcasesinftotal=0;
+ string MBTextcasesinf[][];
+ vardef tata(text t)=
+ for p_=t:
+ if color p_:
+ MBnbcolinf:=MBnbcolinf+1;% on incrémente le nombre de couleurs
+ MBColInf[MBnbcolinf]:=p_;% on définit la couleur de la série de cases
+ MBnbinfoinf[MBnbcolinf]:=0;
+ else:
+ if numeric p_:
+ MBnbinfoinf[MBnbcolinf]:=MBnbinfoinf[MBnbcolinf]+1;
+ MBnbcasesinftotal:=MBnbcasesinftotal+p_;
+ MBnbcasesinf[MBnbcolinf][MBnbinfoinf[MBnbcolinf]]:=p_;
+ else:
+ MBTextcasesinf[MBnbcolinf][MBnbinfoinf[MBnbcolinf]]:=p_;
+ fi;
+ fi;
+ endfor;
+ enddef;
+
+ tata(#2);
+
+ pair VecteurDepla;
+ VecteurDepla=(Longueur,0);
+
+ numeric MBnbdepla;
+ MBnbdepla=0;
+ for k=1 upto MBnbcolsup:
+ for l=1 upto MBnbinfosup[k]:
+ trace Brique(MBColSup[k],MBnbcasessup[k][l])(MBTextcasessup[k][l]) shifted(MBnbdepla*VecteurDepla);
+ MBnbdepla:=MBnbdepla+MBnbcasessup[k][l];
+ endfor;
+ endfor;
+
+ MBnbdepla:=0;
+ for k=1 upto MBnbcolinf:
+ for l=1 upto MBnbinfoinf[k]:
+ trace Brique(MBColInf[k],MBnbcasesinf[k][l])(MBTextcasesinf[k][l]) shifted(MBnbdepla*VecteurDepla+(0,-Hauteur));
+ if MBnbcasesinf[k][l]<0:
+ for j=1 upto (abs(MBnbcasesinf[k][l])-1):
+ trace ((0,0)--(0,Hauteur)) shifted((MBnbdepla+j)*VecteurDepla+(0,-Hauteur)) withcolor black;
+ endfor;
+ fi;
+ MBnbdepla:=MBnbdepla+abs(MBnbcasesinf[k][l]);
+ endfor;
+ endfor;
+
+ if Separation>0:
+ draw (u*Separation,-1.5Hauteur)--(u*Separation,1.5Hauteur) withpen pencircle scaled 1.5 dashed evenly withcolor red;
+ fi;
+
+ \end{mplibcode}%
+ \else
+ \begin{mpost}[mpsettings={Longueur:=\useKV[ClesModeleBarre]{Largeur};Hauteur:=\useKV[ClesModeleBarre]{Hauteur};Separation:=\useKV[ClesModeleBarre]{Separation};}]
+ vardef Brique(expr col,nbfois)(text t)=
+ save $;
+ picture $;
+ $=image(
+ u:=Longueur;
+ if t="?":
+ draw polygone((0,0),(u*abs(nbfois),0),(u*abs(nbfois),Hauteur),(0,Hauteur)) dashed evenly;
+ else:
+ remplis polygone((0,0),(u*abs(nbfois),0),(u*abs(nbfois),Hauteur),(0,Hauteur)) withcolor col;
+ draw polygone((0,0),(u*abs(nbfois),0),(u*abs(nbfois),Hauteur),(0,Hauteur));
+ fi;
+ if nbfois>0:
+ label(LATEXProf(t),iso((0,0),(u*abs(nbfois),Hauteur)));
+ else:
+ label.bot(LATEXProf(t),iso((0,0),(u*abs(nbfois),-Hauteur)));
+ drawdblarrow (0,-0.5*Hauteur)--(u*abs(nbfois),-0.5*Hauteur);
+ fi;
+ u:=1cm;
+ );
+ $
+ enddef;
+
+ numeric MBnbcolsup;%compte combien de couleurs
+ MBnbcolsup=0;
+ color MBColSup[];%Sauvegarde les couleurs de la barre sup
+ numeric MBnbinfosup[];%compte combien d'infos par couleurs.
+ numeric MBnbcasessup[][];
+ numeric MBnbcasessuptotal;
+ MBnbcasessuptotal=0;
+ string MBTextcasessup[][];
+ vardef toto(text t)=
+ for p_=t:
+ if color p_:
+ MBnbcolsup:=MBnbcolsup+1;% on incrémente le nombre de couleurs
+ MBColSup[MBnbcolsup]:=p_;% on définit la couleur de la série de cases
+ MBnbinfosup[MBnbcolsup]:=0;
+ else:
+ if numeric p_:
+ MBnbinfosup[MBnbcolsup]:=MBnbinfosup[MBnbcolsup]+1;
+ MBnbcasessuptotal:=MBnbcasessuptotal+p_;
+ MBnbcasessup[MBnbcolsup][MBnbinfosup[MBnbcolsup]]:=p_;
+ else:
+ MBTextcasessup[MBnbcolsup][MBnbinfosup[MBnbcolsup]]:=p_;
+ fi;
+ fi;
+ endfor;
+ enddef;
+
+ toto(#1);
+
+ numeric MBnbcolinf;%compte combien de couleurs
+ MBnbcolinf=0;
+ color MBColInf[];%Sauvegarde les couleurs de la barre inf
+ numeric MBnbinfoinf[];%compte combien d'infos par couleurs.
+ numeric MBnbcasesinf[][];
+ numeric MBnbcasesinftotal;
+ MBnbcasesinftotal=0;
+ string MBTextcasesinf[][];
+ vardef tata(text t)=
+ for p_=t:
+ if color p_:
+ MBnbcolinf:=MBnbcolinf+1;% on incrémente le nombre de couleurs
+ MBColInf[MBnbcolinf]:=p_;% on définit la couleur de la série de cases
+ MBnbinfoinf[MBnbcolinf]:=0;
+ else:
+ if numeric p_:
+ MBnbinfoinf[MBnbcolinf]:=MBnbinfoinf[MBnbcolinf]+1;
+ MBnbcasesinftotal:=MBnbcasesinftotal+p_;
+ MBnbcasesinf[MBnbcolinf][MBnbinfoinf[MBnbcolinf]]:=p_;
+ else:
+ MBTextcasesinf[MBnbcolinf][MBnbinfoinf[MBnbcolinf]]:=p_;
+ fi;
+ fi;
+ endfor;
+ enddef;
+
+ tata(#2);
+
+ pair VecteurDepla;
+ VecteurDepla=(Longueur,0);
+
+ numeric MBnbdepla;
+ MBnbdepla=0;
+ for k=1 upto MBnbcolsup:
+ for l=1 upto MBnbinfosup[k]:
+ trace Brique(MBColSup[k],MBnbcasessup[k][l])(MBTextcasessup[k][l]) shifted(MBnbdepla*VecteurDepla);
+ MBnbdepla:=MBnbdepla+MBnbcasessup[k][l];
+ endfor;
+ endfor;
+
+ MBnbdepla:=0;
+ for k=1 upto MBnbcolinf:
+ for l=1 upto MBnbinfoinf[k]:
+ trace Brique(MBColInf[k],MBnbcasesinf[k][l])(MBTextcasesinf[k][l]) shifted(MBnbdepla*VecteurDepla+u*(0,-0.5));
+ if MBnbcasesinf[k][l]<0:
+ for j=1 upto (abs(MBnbcasesinf[k][l])-1):
+ trace ((0,0)--(0,Hauteur)) shifted((MBnbdepla+j)*VecteurDepla+u*(0,-0.5)) withcolor black;
+ endfor;
+ fi;
+ MBnbdepla:=MBnbdepla+abs(MBnbcasesinf[k][l]);
+ endfor;
+ endfor;
+
+ if Separation>0:
+ draw u*(Separation,-0.75)--u*(Separation,0.75) withpen pencircle scaled 1.5 dashed evenly withcolor red;
+ fi;
+
+ \end{mpost}
+ \fi
+}% \ No newline at end of file