%%%
% R\'eponses \`a relier
%%%
\def\filedateQRelier{2026/10/28}%
\def\fileversionQRelier{0.1b}%
\message{-- \filedateQRelier\space v\fileversionQRelier}%
%
\setKVdefault[ClesRelie]{Solution=false,LargeurG=5cm,LargeurD=2cm,Stretch=1.5,Ecart=2cm,Couleur=black,Graine={},DeuxColonnes=false}%

\newcounter{NbRelie}%
\newcounter{NbRelieD}%

\makeatletter
\NewDocumentCommand\Relie{som}{%
  \useKVdefault[ClesRelie]%
  \ifPfCDeuxColonnes\relax\setKV[ClesRelie]{DeuxColonnes}\fi%
  \setKV[ClesRelie]{#2}%
  \colorlet{PfCRelieCouleurTrace}{\useKV[ClesRelie]{Couleur}}%
  \setsepchar[*]{,*/}\reademptyitems%
  \readlist*\PfM@ListeRelie{#3}%
  \ignoreemptyitems%
  \ifboolKV[ClesRelie]{DeuxColonnes}{%
    \IfBooleanTF{#1}{%
      \ifemptyKV[ClesRelie]{Graine}{}{\edef\PfCRetiensGraine{\PfCGraineAAfficher}\PfCGraineAlea{\useKV[ClesRelie]{Graine}}}%
      \ifboolKV[ClesRelie]{Solution}{%
        \PfC@buildtabrelieautodeuxcsol%
      }{%
        \PfC@buildtabrelieautodeuxc%
      }%
      \ifemptyKV[ClesRelie]{Graine}{}{\PfCGraineAlea{\PfCRetiensGraine}}%
    }{%
      \ifboolKV[ClesRelie]{Solution}{%
        \PfC@buildtabreliedeuxcsol%
      }{%
        \PfC@buildtabreliedeuxc%
      }%
    }%
  }{%
    \IfBooleanTF{#1}{%
      \ifemptyKV[ClesRelie]{Graine}{}{\edef\PfCRetiensGraine{\PfCGraineAAfficher}\PfCGraineAlea{\useKV[ClesRelie]{Graine}}}%
      \PfC@buildtabrelieauto%
      \par%
      \ifboolKV[ClesRelie]{Solution}{%
        \xintFor* ##1 in {\xintSeq {1}{\PfM@ListeRelielen}}\do{%
          \itemtomacro\PfCListeReponsesMelangees[##1]\PfCNumReponses%
          \itemtomacro\PfM@ListeRelie[\PfCNumReponses,1]\untest%
          % Le test est \untest\\
          \ifx\bla\untest\bla%
          \else%
            \tikz[remember picture,overlay]{\draw[PfCRelieCouleurTrace] (RelieG-\PfCNumReponses) -- (RelieD-##1);}%
          \fi%
        }%
      }{%
      }%
      \ifemptyKV[ClesRelie]{Graine}{}{\PfCGraineAlea{\PfCRetiensGraine}}%
    }{%
      \PfC@buildtabrelie%
      \ifboolKV[ClesRelie]{Solution}{%
        \xintFor* ##1 in {\xintSeq {1}{\PfM@ListeRelielen}}\do{%
          \itemtomacro\PfM@ListeRelie[##1,1]\untest%
          \ifx\bla\untest\bla%
          \else%
            \itemtomacro\PfM@ListeRelie[##1,3]\Foo%
            \setsepchar{-}\ignoreemptyitems%
            \readlist*\PfM@ListeRelieReponses{\Foo}%
            \reademptyitems%
            \foreachitem\compteur\in\PfM@ListeRelieReponses{%
              \tikz[remember picture,overlay]{\draw[PfCRelieCouleurTrace] (RelieG-##1) to (RelieD-\PfM@ListeRelieReponses[\compteurcnt]);}%
            }%
          \fi%
        }%
      }{%
      }%
    }%
  }%
}%

\def\PfC@buildtabreliedeuxc{%
  \edef\PfC@RetourQuestionsG{}%
  \xintFor* ##1 in {\xintSeq{1}{\PfM@ListeRelielen}}\do{%
    \itemtomacro\PfM@ListeRelie[##1,1]\untest%
    \ifx\bla\untest\bla%
    \else%
      \edef\PfC@RetourQuestionsG{\PfC@RetourQuestionsG,\untest}%
    \fi%
  }%
  \setsepchar{,}\ignoreemptyitems%
  \readlist*\PfC@ListeRelieG{\PfC@RetourQuestionsG}%
  \reademptyitems%
  \begin{enumerate}[leftmargin=*,label=\bfseries\Alph{*} :]%
    \xintFor* ##1 in {\xintSeq{1}{\PfC@ListeRelieGlen}}\do{%
    \item\PfC@ListeRelieG[##1]%
    }%
  \end{enumerate}
  \edef\PfC@RetourQuestionsD{}%
  \xintFor* ##1 in {\xintSeq{1}{\PfM@ListeRelielen}}\do{%
    \itemtomacro\PfM@ListeRelie[##1,2]\untest%
    \ifx\bla\untest\bla%
    \else%
      \edef\PfC@RetourQuestionsD{\PfC@RetourQuestionsD,\untest}%
    \fi%
  }%
  \setsepchar{,}\ignoreemptyitems%
  \readlist*\PfC@ListeRelieD{\PfC@RetourQuestionsD}%
  \reademptyitems%
  \par\bigskip\par
  \begin{enumerate}[leftmargin=*,label=\bfseries\arabic{*} :]%
    \xintFor* ##1 in {\xintSeq{1}{\PfC@ListeRelieDlen}}\do{%
    \item\PfC@ListeRelieD[##1]%
    }%
  \end{enumerate}
}%

\def\PfC@buildtabreliedeuxcsol{%
  \edef\PfC@RetourQuestionsG{}%
  \xintFor* ##1 in {\xintSeq{1}{\PfM@ListeRelielen}}\do{%
    \itemtomacro\PfM@ListeRelie[##1,1]\untest%
    \ifx\bla\untest\bla%
    \else%
      \edef\PfC@RetourQuestionsG{\PfC@RetourQuestionsG,\untest}%
    \fi%
  }%
  \edef\PfC@RetourSolutions{}%
  \xintFor* ##1 in {\xintSeq{1}{\PfM@ListeRelielen}}\do{%
    \itemtomacro\PfM@ListeRelie[##1,3]\untest%
    \ifx\bla\untest\bla%
    \else%
      \edef\PfC@RetourSolutions{\PfC@RetourSolutions,\untest}%
    \fi%
  }%
  \setsepchar{,}\ignoreemptyitems%
  \readlist*\PfC@ListeRelieG{\PfC@RetourQuestionsG}%
  \readlist*\PfC@ListeSolutions{\PfC@RetourSolutions}%
  \reademptyitems%
  Les bonnes associations sont 
  \xintFor* ##1 in {\xintSeq{1}{\PfC@ListeRelieGlen}}\do{%
    \setcounter{PfCTrash}{##1}%
    \setcounter{PfCTrasha}{\PfC@ListeSolutions[##1]}%
    \textbf{\Alph{PfCTrash}--\arabic{PfCTrasha}}\xintifForLast{.}{ ; }%
  }%
}%

%
\def\PfC@buildtabrelie{%
  \setcounter{NbRelie}{0}%
  \setcounter{NbRelieD}{0}%
  \renewcommand{\arraystretch}{\useKV[ClesRelie]{Stretch}}%
  \begin{tabular}{p{\useKV[ClesRelie]{LargeurG}}cp{\useKV[ClesRelie]{Ecart}}cp{\useKV[ClesRelie]{LargeurD}}}%
    \xintFor* ##1 in {\xintSeq {1}{\PfM@ListeRelielen}}\do{%
    \PfM@ListeRelie[##1,1]\itemtomacro\PfM@ListeRelie[##1,1]\untest%
    \ifx\bla\untest\bla%
    \uppercase{&}\stepcounter{NbRelie}%
      \else%
      \uppercase{&}\stepcounter{NbRelie}\tikz[remember
                   picture,overlay]{\node[name=RelieG-\theNbRelie,inner
                   sep=0pt]{};\fill[]
                   (RelieG-\theNbRelie) circle[radius=1.5pt];}
                   \fi&&
                         \itemtomacro\PfM@ListeRelie[##1,2]\untest
                         \ifx\bla\untest\bla\else\stepcounter{NbRelieD}\tikz[remember
                         picture,transform canvas={yshift=-0pt}]{\node[draw, rectangle, name=RelieD-\theNbRelieD,inner
                         sep=0pt] at (0,0) {};\fill[] (RelieD-\theNbRelieD) circle[radius=1.5pt]}%
                         \fi%
    &\itemtomacro\PfM@ListeRelie[##1,2]\untest%
                          \ifx\bla\untest\bla
                          \else
                          \PfM@ListeRelie[##1,2]
                          \fi\\}%
  \end{tabular}%
}%

\NewDocumentCommand\PfC@buildtabrelieauto{}{%
  \setcounter{NbRelie}{0}%
  \setcounter{NbRelieD}{0}%
  \edef\PfCFooListeNbQ{1}%
  \xintFor* ##1 in{\xintSeq{2}{\PfM@ListeRelielen}}\do{%
    \edef\PfCFooListeNbQ{\PfCFooListeNbQ,##1}%
  }%
  \setsepchar{,}\ignoreemptyitems%
  \MelangeListe{\PfCFooListeNbQ}{\PfM@ListeRelielen}%
  \setsepchar{,}\ignoreemptyitems%
  \readlist*\PfCListeReponsesMelangees{\faa}%
  \renewcommand{\arraystretch}{\useKV[ClesRelie]{Stretch}}%
  \begin{tabular}{p{\useKV[ClesRelie]{LargeurG}}cp{\useKV[ClesRelie]{Ecart}}>{\tikz[remember
          picture,transform canvas={yshift=0pt}]{\node[name=RelieD-\theNbRelie,inner sep=0pt] at (0,0) {};\fill[] (RelieD-\theNbRelie) circle[radius=1.5pt]}}cp{\useKV[ClesRelie]{LargeurD}}}%
    \xintFor* ##1 in {\xintSeq {1}{\PfM@ListeRelielen}}\do{%
      {\PfM@ListeRelie[##1,1]}\itemtomacro\PfM@ListeRelie[##1,1]\untest%
      \ifx\bla\untest\bla%                                     
      \uppercase{&}\stepcounter{NbRelie}\tikz[remember
        picture,overlay]{\node[name=RelieG-\theNbRelie,inner
          sep=0pt]{};}%
      \else%
      \uppercase{&}\stepcounter{NbRelie}\tikz[remember
        picture,overlay]{\node[name=RelieG-\theNbRelie,inner
          sep=0pt]{};\fill[]
        (RelieG-\theNbRelie) circle[radius=1.5pt];}%
                   \fi&&&\itemtomacro\PfCListeReponsesMelangees[##1]\PfCNumReponses{\PfM@ListeRelie[\PfCNumReponses,2]}\\%
    }%
  \end{tabular}%
  \setcounter{NbRelie}{0}%
}%

\def\PfC@buildtabrelieautodeuxc{%
  \edef\PfCFooListeNbQ{1}%
  \xintFor* ##1 in{\xintSeq{2}{\PfM@ListeRelielen}}\do{%
    \edef\PfCFooListeNbQ{\PfCFooListeNbQ,##1}%
  }%
  \setsepchar{,}\ignoreemptyitems%
  \MelangeListe{\PfCFooListeNbQ}{\PfM@ListeRelielen}%
  \setsepchar{,}\ignoreemptyitems%
  \readlist*\PfCListeReponsesMelangees{\faa}%
  \reademptyitems%
%  \showitems\PfCListeReponsesMelangees[]\par
  \edef\PfC@RetourQuestionsG{}%
  \xintFor* ##1 in {\xintSeq {1}{\PfM@ListeRelielen}}\do{%
    \itemtomacro\PfM@ListeRelie[##1,1]\untest%
    \ifx\bla\untest\bla%
    \else%
      \edef\PfC@RetourQuestionsG{\PfC@RetourQuestionsG,\untest}%
    \fi%
  }%
  \setsepchar{,}\ignoreemptyitems%
  \readlist*\PfC@ListeRelieG{\PfC@RetourQuestionsG}%
  \reademptyitems%
  \begin{enumerate}[leftmargin=*,label=\bfseries\Alph{*} :]%
    \xintFor* ##1 in {\xintSeq {1}{\PfC@ListeRelieGlen}}\do{%
    \item\PfC@ListeRelieG[##1]%
    }%
  \end{enumerate}
  \edef\PfC@RetourQuestionsD{}%
  \xintFor* ##1 in {\xintSeq {1}{\PfM@ListeRelielen}}\do{%
    \itemtomacro\PfM@ListeRelie[##1,2]\untest%
    \ifx\bla\untest\bla%
    \else%
      \edef\PfC@RetourQuestionsD{\PfC@RetourQuestionsD,\untest}%
    \fi%
  }%
  \setsepchar{,}\ignoreemptyitems%
  \readlist*\PfC@ListeRelieD{\PfC@RetourQuestionsD}%
  \reademptyitems%
  \par\bigskip\par
  \begin{enumerate}[leftmargin=*,label=\bfseries\arabic{*} :]%
    \xintFor* ##1 in {\xintSeq {1}{\PfC@ListeRelieDlen}}\do{%
    \item\itemtomacro\PfCListeReponsesMelangees[##1]\PfCNumMelange\PfC@ListeRelieD[\PfCNumMelange]%
    }%
  \end{enumerate}
}%

\def\PfC@buildtabrelieautodeuxcsol{%
  \edef\PfC@RetourQuestionsG{}%
  \xintFor* ##1 in {\xintSeq{1}{\PfM@ListeRelielen}}\do{%
    \itemtomacro\PfM@ListeRelie[##1,1]\untest%
    \ifx\bla\untest\bla%
    \else%
      \edef\PfC@RetourQuestionsG{\PfC@RetourQuestionsG,\untest}%
    \fi%
  }%
  \edef\PfCFooListeNbQ{1}%
  \xintFor* ##1 in{\xintSeq{2}{\PfM@ListeRelielen}}\do{%
    \edef\PfCFooListeNbQ{\PfCFooListeNbQ,##1}%
  }%
  \setsepchar{,}\ignoreemptyitems%
  \MelangeListe{\PfCFooListeNbQ}{\PfM@ListeRelielen}%
  \setsepchar{,}\ignoreemptyitems%
  \readlist*\PfCListeReponsesMelangees{\faa}%
  \reademptyitems%
  % \showitems\PfCListeReponsesMelangees[]\par
  \setsepchar{,}\ignoreemptyitems%
  \readlist*\PfC@ListeRelieG{\PfC@RetourQuestionsG}%
  \reademptyitems%
  Les bonnes associations sont 
  \xintFor* ##1 in {\xintSeq{1}{\PfC@ListeRelieGlen}}\do{%
    \setcounter{PfCTrash}{##1}%
    \foreachitem\compteursol\in\PfCListeReponsesMelangees{%
      \ifnum\compteursol=##1\relax\setcounter{PfCTrasha}{\compteursolcnt}\fi%
    }%
    \textbf{\Alph{PfCTrash}--\arabic{PfCTrasha}}\xintifForLast{.}{ ; }%
  }%
}%
\makeatother

