From 85fda71ebb01e4a5b0ce50edf3dda43f45ebb55a Mon Sep 17 00:00:00 2001
From: Norbert Preining <norbert@preining.info>
Date: Fri, 24 Mar 2023 03:01:34 +0000
Subject: CTAN sync 202303240301

---
 .../contrib/profcollege/latex/PfCModeleBarre.tex   | 386 +++++++++++++++++++++
 1 file changed, 386 insertions(+)
 create mode 100644 macros/latex/contrib/profcollege/latex/PfCModeleBarre.tex

(limited to 'macros/latex/contrib/profcollege/latex/PfCModeleBarre.tex')

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
-- 
cgit v1.2.3

