%%%
% ThMilieu
%%%
\def\filedateThMilieu{2025/12/21}%
\def\fileversionThMilieu{0.1}%
\message{-- \filedateThMilieu\space v\fileversionThMilieu}%
%
\setKVdefault[ClesThMilieu]{Figure=false,FigureSeule=false,AngleRotation=0,Echelle=1}

\makeatletter
\NewDocumentCommand\PfC@ThMilieuExtraireInfo{m}{%
  \edef\PfC@LectureInfo{#1}%
  \setsepchar{,}\ignoreemptyitems%
  \readlist\PfC@ListeInfo{\PfC@LectureInfo}%
  \reademptyitems%
  \edef\PfC@LongueurDonnee{0}%
  \ifnum\PfC@ListeInfolen=2\relax% juste parallèle ou milieu
    \StrCount{\PfC@ListeInfo[1]}{-}[\PfC@PremierTiret]%
    \StrCount{\PfC@ListeInfo[2]}{-}[\PfC@DeuxiemeTiret]%
    \ifnum\fpeval{\PfC@PremierTiret*\PfC@DeuxiemeTiret}=1\relax%On est dans le cas des deux milieux
      \edef\PfC@TypeInfo{1}%
      \StrBefore{\PfC@ListeInfo[1]}{-}[\PfC@PremierMilieu]%
      \StrBehind{\PfC@ListeInfo[1]}{-}[\PfC@PremierCote]%
      \StrBefore{\PfC@ListeInfo[2]}{-}[\PfC@DeuxiemeMilieu]%
      \StrBehind{\PfC@ListeInfo[2]}{-}[\PfC@DeuxiemeCote]%
    \else%On est dans le cas d'une parallèle et d'un milieu
      \edef\PfC@TypeInfo{2}%
      \ifnum\PfC@PremierTiret=1\relax%Le milieu est dans la première info
        \StrBefore{\PfC@ListeInfo[1]}{-}[\PfC@PremierMilieu]%
        \StrBehind{\PfC@ListeInfo[1]}{-}[\PfC@PremierCote]%
        \StrBefore{\PfC@ListeInfo[2]}{/}[\PfC@DeuxiemeMilieu]%
        \StrBehind{\PfC@ListeInfo[2]}{/}[\PfC@DeuxiemeCote]%
      \else%Le milieu est dans la deuxième info
        \edef\PfC@TypeInfo{3}%
        \StrBefore{\PfC@ListeInfo[1]}{/}[\PfC@DeuxiemeMilieu]%
        \StrBehind{\PfC@ListeInfo[1]}{/}[\PfC@DeuxiemeCote]%
        \StrBefore{\PfC@ListeInfo[2]}{-}[\PfC@PremierMilieu]%
        \StrBehind{\PfC@ListeInfo[2]}{-}[\PfC@PremierCote]%
      \fi%
    \fi%
  \else%On cherche à calculer une longueur
    \StrCount{\PfC@ListeInfo[1]}{-}[\PfC@PremierTiret]%
    \StrCount{\PfC@ListeInfo[2]}{-}[\PfC@DeuxiemeTiret]%
    \StrCount{\PfC@ListeInfo[3]}{-}[\PfC@TroisiemeTiret]%
    %On place l'info longueur à la fin.
    \setsepchar{,}\ignoreemptyitems%
    \IfStrEqCase{0}{%
      {\PfC@PremierTiret}{\readlist*\PfC@NewListeInfo{\PfC@ListeInfo[2],\PfC@ListeInfo[3],\PfC@ListeInfo[1]}}%
      {\PfC@DeuxiemeTiret}{\readlist*\PfC@NewListeInfo{\PfC@ListeInfo[1],\PfC@ListeInfo[3],\PfC@ListeInfo[2]}}%
      {\PfC@TroisiemeTiret}{\readlist*\PfC@NewListeInfo{\PfC@ListeInfo[1],\PfC@ListeInfo[2],\PfC@ListeInfo[3]}}%
    }%
    \reademptyitems%
    \StrBefore{\PfC@NewListeInfo[1]}{-}[\PfC@PremierMilieu]%
    \StrBehind{\PfC@NewListeInfo[1]}{-}[\PfC@PremierCote]%
    \StrBefore{\PfC@NewListeInfo[2]}{-}[\PfC@DeuxiemeMilieu]%
    \StrBehind{\PfC@NewListeInfo[2]}{-}[\PfC@DeuxiemeCote]%
    \StrBefore{\PfC@NewListeInfo[3]}{=}[\PfC@SegmentDonne]%
    \StrBehind{\PfC@NewListeInfo[3]}{=}[\PfC@LongueurDonnee]%
    \StrCount{\PfC@SegmentDonne}{\PfC@PremierMilieu}[\PfC@PresenceMilieu]
    \ifnum\PfC@PresenceMilieu=1\relax%On connait la longueur "milieu"
      \edef\PfC@TypeInfo{4}%
    \else%
      \edef\PfC@TypeInfo{5}%
    \fi%   
  \fi%
  %On récupère les sommets.
  \StrMid{\PfC@PremierCote}{1}{1}[\PfC@SommetA]%
  \StrMid{\PfC@PremierCote}{2}{2}[\PfC@SommetB]%
  \StrCount{\PfC@DeuxiemeCote}{\PfC@SommetA}[\PfC@CibleSommetA]%
  \ifnum\PfC@CibleSommetA=1\relax%
    \StrDel{\PfC@DeuxiemeCote}{\PfC@SommetA}[\PfC@SommetC]%
    \edef\PfC@TroisiemeCote{\PfC@SommetB\PfC@SommetC}%
  \else%
    \StrDel{\PfC@DeuxiemeCote}{\PfC@SommetB}[\PfC@SommetC]%
    \edef\PfC@TroisiemeCote{\PfC@SommetA\PfC@SommetC}%
  \fi%
}%

\NewDocumentCommand\PfC@RedactionThMilieu{}{%
  \IfStrEqCase{\PfC@TypeInfo}{%
    {1}{Dans le triangle $\PfC@SommetA\PfC@SommetB\PfC@SommetC$, $\PfC@PremierMilieu$ est le milieu du côté $[\PfC@PremierCote]$ et $\PfC@DeuxiemeMilieu$ est le milieu du côté $[\PfC@DeuxiemeCote]$. Donc les droites $(\PfC@PremierMilieu\PfC@DeuxiemeMilieu)$ et $(\PfC@TroisiemeCote)$ sont parallèles d'après le théorème des milieux.}%
    {2}{Dans le triangle $\PfC@SommetA\PfC@SommetB\PfC@SommetC$, la droite $(\PfC@PremierMilieu\PfC@DeuxiemeMilieu)$, parallèle à la droite $(\PfC@TroisiemeCote)$, passe par le milieu $\PfC@PremierMilieu$ du côté $[\PfC@PremierCote]$ et par $\PfC@DeuxiemeMilieu$, point du côté $[\PfC@DeuxiemeCote]$. Donc le point $\PfC@DeuxiemeMilieu$ est le milieu du côté $[\PfC@DeuxiemeCote]$.}%
    {3}{Dans le triangle $\PfC@SommetA\PfC@SommetB\PfC@SommetC$, la droite $(\PfC@PremierMilieu\PfC@DeuxiemeMilieu)$, parallèle à la droite $(\PfC@TroisiemeCote)$, passe par le milieu $\PfC@PremierMilieu$ du côté $[\PfC@PremierCote]$ et par $\PfC@DeuxiemeMilieu$, point du côté $[\PfC@DeuxiemeCote]$. Donc le point $\PfC@DeuxiemeMilieu$ est le milieu du côté $[\PfC@DeuxiemeCote]$.}%
    {4}{Dans le triangle $\PfC@SommetA\PfC@SommetB\PfC@SommetC$, $\PfC@PremierMilieu$ est le milieu du côté $[\PfC@PremierCote]$ et $\PfC@DeuxiemeMilieu$ est le milieu du côté $[\PfC@DeuxiemeCote]$. Comme $\PfC@PremierMilieu\PfC@DeuxiemeMilieu=\Lg{\PfC@LongueurDonnee}$ alors
      \[\PfC@TroisiemeCote=2\times\Lg{\PfC@LongueurDonnee}=\Lg{\fpeval{2*\PfC@LongueurDonnee}}.\]}%
    {5}{Dans le triangle $\PfC@SommetA\PfC@SommetB\PfC@SommetC$, $\PfC@PremierMilieu$ est le milieu du côté $[\PfC@PremierCote]$ et $\PfC@DeuxiemeMilieu$ est le milieu du côté $[\PfC@DeuxiemeCote]$. Comme $\PfC@TroisiemeCote=\Lg{\PfC@LongueurDonnee}$ alors
      \[\PfC@PremierMilieu\PfC@DeuxiemeMilieu=\Lg{\PfC@LongueurDonnee}\div2=\Lg{\fpeval{\PfC@LongueurDonnee/2}}.\]}%
  }%
}%

\NewDocumentCommand\PfC@MPFigTheoMilieu{mmmmmmm}{%
  \edef\PfCTypeInfoRetenue{#1}%
  \edef\PfCNomSommetA{#2}%
  \edef\PfCNomSommetB{#3}%
  \edef\PfCNomSommetC{#4}%
  \edef\PfCNomMilieuI{#5}%
  \edef\PfCNomMilieuJ{#6}%
  \edef\PfCValeurLongueurDonnee{#7}%
  \begin{Geometrie}[Cadre="aucun",TypeTrace="MainLevee"]
    u:=\useKV[ClesThMilieu]{Echelle}*0.5cm;
    pair O,A,B,C,I,J,K;
    path cc;
    O=(0,0);
    cc=cercles(O,3u);
    A=pointarc(cc,0);
    B=pointarc(cc,150);
    C=pointarc(cc,240);
    AngleRotation=\useKV[ClesThMilieu]{AngleRotation};
    if AngleRotation<>0:
      A:=rotation(A,O,AngleRotation);
      B:=rotation(B,O,AngleRotation);
      C:=rotation(C,O,AngleRotation);
    fi;
    I=1/2[A,B];
    J=1/2[A,C];
    K=1/2[B,C];
    trace polygone(A,B,C);
    Labelcp(B)(TEX("\PfCNomSommetA"),A);
    Labelcp(A)(TEX("\PfCNomSommetB"),B);
    Labelcp(A)(TEX("\PfCNomSommetC"),C);
    Labelcp(K)(TEX("\PfCNomMilieuI"),I);
    Labelcp(K)(TEX("\PfCNomMilieuJ"),J);
    trace chemin(2[I,J],2[J,I]);
    marque_s:=marque_s/3;
    if (\PfCTypeInfoRetenue=2) or (\PfCTypeInfoRetenue=3):
      trace Codelongueur(A,I,I,B,1);
      trace chemin(1.5[C,B],B) dashed evenly;
      trace chemin(1.5[B,C],C) dashed evenly;
      trace marque_para(1.5[C,B]--1.5[B,C],2[I,J]--2[J,I],0.775);
    else:
      trace Codelongueur(A,I,I,B,1);
      trace Codelongueur(A,J,J,C,2);
    fi;
  \end{Geometrie}
}%

\NewDocumentCommand\TheoremeMilieu{om}{%
  \useKVdefault[ClesThMilieu]%
  \setKV[ClesThMilieu]{#1}%
  \setKV[ClesThMilieu]{AngleRotation=\fpeval{randint(180)}}%
  \PfC@ThMilieuExtraireInfo{#2}%
  \ifboolKV[ClesThMilieu]{FigureSeule}{\PfC@MPFigTheoMilieu{\PfC@TypeInfo}{\PfC@SommetA}{\PfC@SommetB}{\PfC@SommetC}{\PfC@PremierMilieu}{\PfC@DeuxiemeMilieu}{\PfC@LongueurDonnee}}{%
    \ifboolKV[ClesThMilieu]{Figure}{%
      \begin{multicols}{2}{\em La figure est donnée à titre indicatif.}%
        \begin{center}
          \PfC@MPFigTheoMilieu{\PfC@TypeInfo}{\PfC@SommetA}{\PfC@SommetB}{\PfC@SommetC}{\PfC@PremierMilieu}{\PfC@DeuxiemeMilieu}{\PfC@LongueurDonnee}%
        \end{center}
      }{}%
    \PfC@RedactionThMilieu%
    \ifboolKV[ClesThMilieu]{Figure}{%
      \end{multicols}
    }{}%
  }%
}%
\makeatother