% Author.........................: C. Pierquet
% licence........................: Released under the LaTeX Project Public License v1.3c or later, see http://www.latex-project.org/lppl.txt
% Poker v1 cards Image's Licence.: LGPL-2.1 license https://github.com/htdebeer/SVG-cards
% Poker v2 cards Image's Licence.: Public Domain https://tekeye.uk/playing_cards/svg-playing-cards
% Poker v3 cards Image's Licence.: Public Domain https://www.me.uk/cards/
% Poker v4 cards Image's Licence.: CC BY-SA 4.0 https://commons.wikimedia.org/wiki/File:Computer_screen_playing_cards_deck.svg
% Poker v5 cards Image's Licence.: Public Domain https://www.me.uk/cards/
% Poker v6 cards Image's Licence.: Public Domain https://code.google.com/archive/p/vector-playing-cards
% Poker v7 cards Image's Licence.: Public Domain https://www.me.uk/cards/
% Poker fr cards Image's Licence.: LGPL-2.1 license https://svg-cards.sourceforge.net/
% Poker bi cards Image's Licence.: LGPL-3 license https://github.com/tfbkny/blackjack
% Tarot v1 cards Image's Licence.: Public Domain https://freesvg.org/deck-of-french-tarot-playing-cards
% Uno   v1 cards Image's Licence.: MIT License https://eperezcosano.github.io/uno-part1/

\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{JeuxCartes}[2026/10/12 v0.40a Jeux de cartes]
% 0.40a  Factorisation du code
% 0.3.5  Nouveau design v7
% 0.3.4  Nouveau design v6
% 0.3.3  Correction d'une carte (VP.fr, merci à quark67)
% 0.3.2  Ajout d'un mode 'null' pour ne pas afficher une carte
% 0.3.1  Ajout d'une clé EspH pour les cartes côte à côte + macros jeux complets avec Jokers
% 0.3.0  Macro pour des jeux complets (fixés)
% 0.2.8  Correction de bugs mineurs
% 0.2.7  Retour en arrière design v2 tarot (pb de licence)
% 0.2.5  Correction d'un dysfonctionnement avec le J qui peut désormais être utilisé en MiniCarte avec le Joker [en] + MiniMains [en]
% 0.2.4  Style <fr> avec cartes françaises + <bicycl> + modification des clés avec l'ajout de <StyleJeu> + Suppression xcolor
% 0.2.3  Ajout d'une option pour présenter une main "inversée" + style <v5>
% 0.2.2  Correction de 2 cartes de pokerv4
% 0.2.2  Ajout d'un style <v4> pour le poker
% 0.2.1  Correction d'un bug avec une carte de poker...
% 0.2.0  Modification des images (en mode pdf !) + <v3> Poker + réduction taille Tarot
% 0.1.7  Correction d'un bug avec les noms de Uno
% 0.1.5  Ajout <v2> pour le Poker
% 0.1.4  Réduction de la taille des images
% 0.1.3  Ajout de cartes Uno (CC1.0 par AlexDer) + modification des commandes + rami
%        Amélioration de la qualité des cartes de Tarot (sans augmenter la taille)
% 0.1.2  Modification du nom (et de la source) des images de Tarot (CC0)
% 0.1.1  Ajout de commandes pour des mini-cartes
% 0.1    Version initiale

%------Packages utiles
\RequirePackage{graphicx}
\RequirePackage{tikz}
\RequirePackage{pgffor}
\RequirePackage{listofitems}
\RequirePackage{xstring}
\RequirePackage{simplekv}
\RequirePackage{xinttools}
\RequirePackage{randomlist}
\RequirePackage{pifont}
%librairies tikz
\usetikzlibrary{calc,scopes}
 
%------Moteur interne
\expandafter\def\csname pijc@prefixe@v1\endcsname{CaJ-PokeRv1-}
\expandafter\def\csname pijc@prefixe@v2\endcsname{CaJ-PokeRv2-}
\expandafter\def\csname pijc@prefixe@v3\endcsname{CaJ-PokeRv3-}
\expandafter\def\csname pijc@prefixe@v4\endcsname{CaJ-PokeRv4-}
\expandafter\def\csname pijc@prefixe@v5\endcsname{CaJ-PokeRv5-}
\expandafter\def\csname pijc@prefixe@v6\endcsname{CaJ-PokeRv6-}
\expandafter\def\csname pijc@prefixe@v7\endcsname{CaJ-PokeRv7-}
\def\pijc@prefixe@fr{CaJ-PokeRfr-}
\def\pijc@prefixe@bicycl{CaJ-PokeRbic-}
\newcommand\pijcresolveprefixe[3]{%
  % #1=TypeJeu #2=StyleJeu #3=cs résultat (reçoit le préfixe d'image)
  \IfStrEq{#1}{Tarot}%
    {\def#3{CaJ-TaroTv1-}}%
    {%
      \IfStrEq{#1}{Uno}%
        {\def#3{CaJ-UnOv1-}}%
        {%
          \edef\pijc@csn{pijc@prefixe@#2}%
          \ifcsname\pijc@csn\endcsname
            \expandafter\let\expandafter#3\csname\pijc@csn\endcsname
          \else
            \PackageWarning{JeuxCartes}{StyleJeu '#2' inconnu pour TypeJeu '#1' ; préfixe vide}%
            \def#3{}%
          \fi
        }%
    }%
}
%------Table TypeJeu
\def\pijc@hgen@Poker{8.5}    \def\pijc@famille@Poker{Poker}    \def\pijc@taille@Poker{52}
\def\pijc@hgen@Bataille{8.5} \def\pijc@famille@Bataille{Poker} \def\pijc@taille@Bataille{54}
\def\pijc@hgen@Belote{8.5}   \def\pijc@famille@Belote{Poker}   \def\pijc@taille@Belote{32}
\def\pijc@hgen@Rami{8.5}     \def\pijc@famille@Rami{Poker}     \def\pijc@taille@Rami{108}
\def\pijc@hgen@Uno{8.5}      \def\pijc@famille@Uno{Uno}        \def\pijc@taille@Uno{108}
\def\pijc@hgen@Tarot{6.375}  \def\pijc@famille@Tarot{Tarot}    \def\pijc@taille@Tarot{78}

\newcommand\pijcresolvealea[2]{% #1=TypeJeu #2=nbcartes -> \HauteurGenerique,\CarteMainType,\CarteDebutRand
  \edef\pijc@csnh{pijc@hgen@#1}%
  \edef\pijc@csnf{pijc@famille@#1}%
  \edef\pijc@csnt{pijc@taille@#1}%
  \ifcsname\pijc@csnh\endcsname
    \expandafter\let\expandafter\HauteurGenerique\csname\pijc@csnh\endcsname
    \expandafter\let\expandafter\CarteMainType\csname\pijc@csnf\endcsname
    \edef\pijc@taillejeu{\csname\pijc@csnt\endcsname}%
    \xdef\CarteDebutRand{\fpeval{randint(0,\pijc@taillejeu-#2)}}%
  \else
    \PackageWarning{JeuxCartes}{TypeJeu '#1' inconnu pour un tirage aléatoire}%
  \fi
}

\newcommand\pijcdeckname[1]{\edef\NewDeck{\csname CartesJeu#1\endcsname}}%cartes->\NewDeck

\newcommand\pijcminideckname[1]{\edef\NewDeck{\csname MiniCartesJeu#1\endcsname}}%mini-cartes->\NewDeck

%------Bascule current bounding box selon l'alignement vertical (centre/bas/haut)
\newcommand\pijcsetoptiontikzcbb[1]{% #1=AlignementV
  \def\OptionTikzCBB{current bounding box.center}%
  \IfStrEq{#1}{0}{\def\OptionTikzCBB{current bounding box.south}}{}%
  \IfStrEq{#1}{1}{\def\OptionTikzCBB{current bounding box.north}}{}%
}

%------Bornes de \foreach pour une main normale/inversée
\newcommand\pijcforward[1]{1,...,#1}
\newcommand\pijcbackward[1]{#1,\inteval{#1-1},...,1}

%------Normalisation de la clé Hauteur
\newdimen\pijc@tmpdim
\newcommand\pijcnormalisecm[2]{% #1=cs valeur saisie #2=cs résultat (peuvent être identiques)
  \IfDecimal{#1}%
    {\edef#2{#1}}%
    {\pijc@tmpdim=#1\relax
     \edef#2{\fpeval{\pijc@tmpdim/1cm}}}%
}
 
%------Jeux complets
\def\JeuCompletBeloteTriHaut{7P§7C§7T§7K § 8P§8C§8T§8K § 9P§9C§9T§9K § 10P§10C§10T§10K § VP§VC§VT§VK § DP§DC§DT§DK § RP§RC§RT§RK § AP§AC§AT§AK}
\def\JeuCompletBeloteTriCoul{7P§8P§9P§10P§VP§DP§RP§AP § 7C§8C§9C§10C§VC§DC§RC§AC § 7T§8T§9T§10T§VT§DT§RT§AT § 7K§8K§9K§10K§VK§DK§RK§AK }
\def\JeuCompletPokerTriHaut{2P§2C§2T§2K § 3P§3C§3T§3K § 4P§4C§4T§4K § 5P§5C§5T§5K § 6P§6C§6T§6K § 7P§7C§7T§7K § 8P§8C§8T§8K § 9P§9C§9T§9K § 10P§10C§10T§10K § VP§VC§VT§VK § DP§DC§DT§DK § RP§RC§RT§RK § AP§AC§AT§AK}
\def\JeuCompletPokerTriHautJok{2P§2C§2T§2K § 3P§3C§3T§3K § 4P§4C§4T§4K § 5P§5C§5T§5K § 6P§6C§6T§6K § 7P§7C§7T§7K § 8P§8C§8T§8K § 9P§9C§9T§9K § 10P§10C§10T§10K § VP§VC§VT§VK § DP§DC§DT§DK § RP§RC§RT§RK § AP§AC§AT§AK § JN§JR}
\def\JeuCompletPokerTriCoul{2P§3P§4P§5P§6P§7P§8P§9P§10P§VP§DP§RP§AP § 2C§3C§4C§5C§6C§7C§8C§9C§10C§VC§DC§RC§AC § 2T§3T§4T§5T§6T§7T§8T§9T§10T§VT§DT§RT§AT § 2K§3K§4K§5K§6K§7K§8K§9K§10K§VK§DK§RK§AK }
\def\JeuCompletPokerTriCoulJok{2P§3P§4P§5P§6P§7P§8P§9P§10P§VP§DP§RP§AP § 2C§3C§4C§5C§6C§7C§8C§9C§10C§VC§DC§RC§AC § 2T§3T§4T§5T§6T§7T§8T§9T§10T§VT§DT§RT§AT § 2K§3K§4K§5K§6K§7K§8K§9K§10K§VK§DK§RK§AK § JN§JR}
\def\JeuCompletTarotTriHaut{2P§2C§2T§2K § 3P§3C§3T§3K § 4P§4C§4T§4K § 5P§5C§5T§5K § 6P§6C§6T§6K § 7P§7C§7T§7K § 8P§8C§8T§8K § 9P§9C§9T§9K § 10P§10C§10T§10K § VP§VC§VT§VK § CP§CC§CT§CK DP§DC§DT§DK § RP§RC§RT§RK § AP§AC§AT§AK § Exc§1AT§2AT§2AT§3AT§4AT§5AT§6AT§7AT§8AT§9AT§10AT§11AT§12AT§13AT§14AT§15AT§16AT§17AT§18AT§19AT§20AT§21AT}
\def\JeuCompletTarotTriCoul{2P§3P§4P§5P§6P§7P§8P§9P§10P§VP§CP§DP§RP§AP § 2C§3C§4C§5C§6C§7C§8C§9C§10C§VC§CC§DC§RC§AC § 2T§3T§4T§5T§6T§7T§8T§9T§10T§VT§CT§DT§RT§AT § 2K§3K§4K§5K§6K§7K§8K§9K§10K§VK§CK§DK§RK§AK § Exc§1AT§2AT§2AT§3AT§4AT§5AT§6AT§7AT§8AT§9AT§10AT§11AT§12AT§13AT§14AT§15AT§16AT§17AT§18AT§19AT§20AT§21AT}
 
%------Commande en ligne (includegraphics) via raisebox/rotatebox ou tikz
\defKV[AffCarteJeu]{%
  Hauteur=\def\AffCarteJeuHauteur{#1},%
  DecalageX=\def\AffCarteJeuDecalageX{#1},%
  DecalageY=\def\AffCarteJeuDecalageY{#1},%
  Rotation=\def\AffCarteJeuRotation{#1},%
  AlignementV=\def\AffCarteJeuAlignementV{#1},%
  TypeJeu=\def\AffCarteJeuType{#1},%
  StyleJeu=\def\AffCarteJeuStyle{#1}
}
\setKVdefault[AffCarteJeu]{%
  Hauteur=4.25,%
  Tikz=false,%pour placer la commande dans un environnement tikz ou en raisebox,
  TikzAutonome=true,%pour déjà mettre l'image dans du tikz
  DecalageX=0,%
  DecalageY=0,%
  Rotation=0,%
  AlignementV=0.5,%
  TypeJeu=Poker,%
  StyleJeu=v1
}
 
\NewDocumentCommand\AffCarteJeu{ O{} m }{%1=options,2=cartenommée (OK)
  \useKVdefault[AffCarteJeu]%
  \setKV[AffCarteJeu]{#1}%
  %normalisation de Hauteur (nombre nu = cm, ou conversion si unité donnée)
  \pijcnormalisecm\AffCarteJeuHauteur\AffCarteJeuHauteur
  %résolution TypeJeu/StyleJeu -> préfixe d'image
  \pijcresolveprefixe{\AffCarteJeuType}{\AffCarteJeuStyle}\CartePrefixe
  %transformation valign en tikz
  \pijcsetoptiontikzcbb{\AffCarteJeuAlignementV}%
  %affichage
  \ifboolKV[AffCarteJeu]{Tikz}%
    {%
      \ifboolKV[AffCarteJeu]{TikzAutonome}%
        {%
          \IfStrEq{#2}{null}%
            {%
              \IfStrEq{\AffCarteJeuType}{Uno}{\def\jcsuffix{0V}}{\def\jcsuffix{DT}}%
              \phantom{\tikz[baseline=(\OptionTikzCBB)] \draw (\AffCarteJeuDecalageX,\AffCarteJeuDecalageY) node[above right=0pt,inner sep=0pt,outer sep=0pt,rotate=\AffCarteJeuRotation] {\includegraphics[height=\AffCarteJeuHauteur cm]{\CartePrefixe\jcsuffix}} ;}%
            }%
            {%
              {\tikz[baseline=(\OptionTikzCBB)] \draw (\AffCarteJeuDecalageX,\AffCarteJeuDecalageY) node[above right=0pt,inner sep=0pt,outer sep=0pt,rotate=\AffCarteJeuRotation] {\includegraphics[height=\AffCarteJeuHauteur cm]{\CartePrefixe#2}} ;}%
            }%
          %{\tikz[baseline=(\OptionTikzCBB)] \draw (\AffCarteJeuDecalageX,\AffCarteJeuDecalageY) node[above right=0pt,inner sep=0pt,outer sep=0pt,rotate=\AffCarteJeuRotation] {\includegraphics[height=\AffCarteJeuHauteur cm]{\CartePrefixe#2}} ;}%
        }%
        {%
          \IfStrEq{#2}{null}%
            {%
              \IfStrEq{\AffCarteJeuType}{Uno}{\def\jcsuffix{0V}}{\def\jcsuffix{DT}}%
              \begin{scope}[shift={(\AffCarteJeuDecalageX,\AffCarteJeuDecalageY)}]%
                \draw (0,0) node[above right=0pt,inner sep=0pt,outer sep=0pt,rotate=\AffCarteJeuRotation] {\phantom{\includegraphics[height=\AffCarteJeuHauteur cm]{\CartePrefixe\jcsuffix}}} ;%
              \end{scope}%
            }%
            {%
              \begin{scope}[shift={(\AffCarteJeuDecalageX,\AffCarteJeuDecalageY)}]%
                \draw (0,0) node[above right=0pt,inner sep=0pt,outer sep=0pt,rotate=\AffCarteJeuRotation] {\includegraphics[height=\AffCarteJeuHauteur cm]{\CartePrefixe#2}} ;%
              \end{scope}%
            }%
          %\begin{scope}[shift={(\AffCarteJeuDecalageX,\AffCarteJeuDecalageY)}]%
          %  \draw (0,0) node[above right=0pt,inner sep=0pt,outer sep=0pt,rotate=\AffCarteJeuRotation] {\includegraphics[height=\AffCarteJeuHauteur cm]{\CartePrefixe#2}} ;%
          %\end{scope}%
        }%
    }%
    {%
      \IfStrEq{#2}{null}%
        {%
          \IfStrEq{\AffCarteJeuType}{Uno}{\def\jcsuffix{0V}}{\def\jcsuffix{DT}}%
          \phantom{\rotatebox[origin=c]{\AffCarteJeuRotation}{\raisebox{-\AffCarteJeuAlignementV\height}{\includegraphics[height=\AffCarteJeuHauteur cm]{\CartePrefixe\jcsuffix}}}}%
        }%
        {%
          \rotatebox[origin=c]{\AffCarteJeuRotation}{\raisebox{-\AffCarteJeuAlignementV\height}{\includegraphics[height=\AffCarteJeuHauteur cm]{\CartePrefixe#2}}}%
        }%
      %\rotatebox[origin=c]{\AffCarteJeuRotation}{\raisebox{-\AffCarteJeuAlignementV\height}{\includegraphics[height=\AffCarteJeuHauteur cm]{\CartePrefixe#2}}}%
    }%
}
 
%------Commande main simple (cartes côte à côte)
\newlength\jeuxcartesjeuhoffset
\defKV[AffMainSimpleCartes]{%
  Hauteur=\def\MainSimpleHauteur{#1},%
  TypeJeu=\def\MainSimpleJeuType{#1},%
  StyleJeu=\def\MainSimpleJeuStyle{#1},%
  EspH=\setlength{\jeuxcartesjeuhoffset}{#1}
}
\setKVdefault[AffMainSimpleCartes]{%
  Hauteur=4.25,%
  TypeJeu=Poker,%
  StyleJeu=v1,%
  EspH=0pt
}
 
\NewDocumentCommand\AffCartesJeu{ O{} m }{%1=options,2=listecartes (OK)
  \useKVdefault[AffMainSimpleCartes]%
  \setKV[AffMainSimpleCartes]{#1}%
  %calculs et traitement des variables
  \setsepchar{§}%
  \readlist*\ListeCartesMain{#2}%
  \def\NbCartesMain{\ListeCartesMainlen}%nbcartes
  %main côte à côte
  \foreach \i in {1,...,\ListeCartesMainlen}{%
    \itemtomacro\ListeCartesMain[\i]\CarteMain%
    \AffCarteJeu[TypeJeu=\MainSimpleJeuType,StyleJeu=\MainSimpleJeuStyle,Hauteur=\MainSimpleHauteur]{\CarteMain}\ifnum\i<\ListeCartesMainlen\relax\kern\jeuxcartesjeuhoffset\fi%
  }%
}
 
%------Commande main cartes
\defKV[AffMainCartes]{%
  Hauteur=\def\MainHauteur{#1},%
  EspH=\def\MainDecalH{#1},%
  EspV=\def\MainDecalV{#1},%
  Rotation=\def\MainRotation{#1},%
  TypeJeu=\def\MainJeuType{#1},%
  StyleJeu=\def\MainJeuStyle{#1},%
  AlignementV=\def\MainAlignementV{#1}
}
 
\setKVdefault[AffMainCartes]{%
  Hauteur=4.25,%
  EspH=1,%
  EspV=0,%
  Rotation=10,%
  Eventail=false,%
  TypeJeu=Poker,%
  StyleJeu=v1,%
  AlignementV=0.5,%
  Inverse=false
}
 
\NewDocumentCommand\MainCartesJeu{ O{} m }{%1=options,2=listecartes (OK)
  \useKVdefault[AffMainCartes]%
  \setKV[AffMainCartes]{#1}%
  %normalisation de Hauteur/EspH/EspV (nombre nu = cm, ou conversion si unité donnée)
  \pijcnormalisecm\MainHauteur\MainHauteur
  \pijcnormalisecm\MainDecalH\MainDecalH
  \pijcnormalisecm\MainDecalV\MainDecalV
  %calculs et traitement des variables
  \ignoreemptyitems%
  \setsepchar{§}%
  \readlist*\ListeCartesMain{#2}%
  \def\NbCartesMain{\ListeCartesMainlen}%nbcartes
  %hauteur générique selon le type de jeu
  \IfStrEq{\MainJeuType}{Poker}{\def\HauteurGenerique{8.5}}{}%
  \IfStrEq{\MainJeuType}{Tarot}{\def\HauteurGenerique{6.375}}{}%
  \IfStrEq{\MainJeuType}{Uno}{\def\HauteurGenerique{8.5}}{}%
  %echelle globale
  \def\EchelleCarteDecalage{\fpeval{\MainHauteur/\HauteurGenerique}}%
  %transformation valign en tikz
  \pijcsetoptiontikzcbb{\MainAlignementV}%
  %environnement tikzpicture
  \ifboolKV[AffMainCartes]{Inverse}%
    {\edef\pijc@range{\pijcbackward{\ListeCartesMainlen}}}%
    {\edef\pijc@range{\pijcforward{\ListeCartesMainlen}}}%
  \begin{tikzpicture}[baseline=(\OptionTikzCBB)]%
    \foreach \i in \pijc@range
    {%
    \itemtomacro\ListeCartesMain[\i]\CarteMain%
    \ifboolKV[AffMainCartes]{Eventail}%
      {%
        \def\MainOffset{\fpeval{\EchelleCarteDecalage*\MainDecalV*(\i-1)}}%
        \def\SecondOffset{\fpeval{\EchelleCarteDecalage*\MainDecalH*(\i-1)}}%
        \def\DecAngleMain{\fpeval{0.5*\NbCartesMain*\MainRotation}}%
        \AffCarteJeu[TypeJeu=\MainJeuType,StyleJeu=\MainJeuStyle,Tikz,TikzAutonome=false,Hauteur=\MainHauteur,DecalageY=\MainOffset,DecalageX=\SecondOffset,Rotation={\DecAngleMain-(\i-1)*\MainRotation}]{\CarteMain}%
      }%
      {%
        \def\MainOffset{\fpeval{\EchelleCarteDecalage*\MainDecalH*(\i-1)}}%
        \def\SecondOffset{\fpeval{\EchelleCarteDecalage*\MainDecalV*(\i-1)}}%
        \AffCarteJeu[TypeJeu=\MainJeuType,StyleJeu=\MainJeuStyle,Tikz,TikzAutonome=false,Hauteur=\MainHauteur,DecalageX=\MainOffset,DecalageY=\SecondOffset]{\CarteMain}%
      }%
    }%finpour
  \end{tikzpicture}%
}
 
%------Commande main aléatoire
\defKV[AffMainAleaCartes]{%
  Hauteur=\def\MainAleaHauteur{#1},%
  EspH=\def\MainAleaDecalH{#1},%
  EspV=\def\MainAleaDecalV{#1},%
  Rotation=\def\MainAleaRotation{#1},%
  TypeJeu=\def\MainAleaJeuType{#1},%
  StyleJeu=\def\MainAleaJeuStyle{#1},%
  AlignementV=\def\MainAleaAlignementV{#1}
}
\setKVdefault[AffMainAleaCartes]{%
  Hauteur=4.25,%
  EspH=1,%
  EspV=0,%
  Rotation=10,%
  Eventail=false,%
  TypeJeu=Poker,%
  StyleJeu=v1,%
  AlignementV=0.5,%
  Inverse=false
}
 
\xdef\CartesJeuPoker{2P,3P,4P,5P,6P,7P,8P,9P,10P,VP,DP,RP,AP,2T,3T,4T,5T,6T,7T,8T,9T,10T,VT,DT,RT,AT,2C,3C,4C,5C,6C,7C,8C,9C,10C,VC,DC,RC,AC,2K,3K,4K,5K,6K,7K,8K,9K,10K,VK,DK,RK,AK}%
\xdef\CartesJeuBelote{7P,8P,9P,10P,VP,DP,RP,AP,7T,8T,9T,10T,VT,DT,RT,AT,7C,8C,9C,10C,VC,DC,RC,AC,7K,8K,9K,10K,VK,DK,RK,AK}%
\xdef\CartesJeuBataille{2P,3P,4P,5P,6P,7P,8P,9P,10P,VP,DP,RP,AP,2T,3T,4T,5T,6T,7T,8T,9T,10T,VT,DT,RT,AT,2C,3C,4C,5C,6C,7C,8C,9C,10C,VC,DC,RC,AC,2K,3K,4K,5K,6K,7K,8K,9K,10K,VK,DK,RK,AK,JN,JR}%
\xdef\CartesJeuRami{2P,3P,4P,5P,6P,7P,8P,9P,10P,VP,DP,RP,AP,2T,3T,4T,5T,6T,7T,8T,9T,10T,VT,DT,RT,AT,2C,3C,4C,5C,6C,7C,8C,9C,10C,VC,DC,RC,AC,2K,3K,4K,5K,6K,7K,8K,9K,10K,VK,DK,RK,AK,JN,JR,2P,3P,4P,5P,6P,7P,8P,9P,10P,VP,DP,RP,AP,2T,3T,4T,5T,6T,7T,8T,9T,10T,VT,DT,RT,AT,2C,3C,4C,5C,6C,7C,8C,9C,10C,VC,DC,RC,AC,2K,3K,4K,5K,6K,7K,8K,9K,10K,VK,DK,RK,AK,JN,JR}%
\xdef\CartesJeuTarot{2P,3P,4P,5P,6P,7P,8P,9P,10P,VP,CP,DP,RP,AP,2T,3T,4T,5T,6T,7T,8T,9T,10T,VT,CT,DT,RT,AT,2C,3C,4C,5C,6C,7C,8C,9C,10C,VC,CC,DC,RC,AC,2K,3K,4K,5K,6K,7K,8K,9K,10K,VK,CK,DK,RK,AK,1AT,2AT,3AT,4AT,5AT,6AT,7AT,8AT,9AT,10AT,11AT,12AT,13AT,14AT,15AT,16AT,17AT,18AT,19AT,20AT,21AT,Exc}%
\xdef\CartesJeuUno{0B,1B,1B,2B,2B,3B,3B,4B,4B,5B,5B,6B,6B,7B,7B,8B,8B,9B,9B,PTB,PTB,CSB,CSB,P2B,P2B,0V,1V,1V,2V,2V,3V,3V,4V,4V,5V,5V,6V,6V,7V,7V,8V,8V,9V,9V,PTV,PTV,CSV,CSV,P2V,P2V,0J,1J,1J,2J,2J,3J,3J,4J,4J,5J,5J,6J,6J,7J,7J,8J,8J,9J,9J,PTJ,PTJ,CSJ,CSJ,P2J,P2J,0R,1R,1R,2R,2R,3R,3R,4R,4R,5R,5R,6R,6R,7R,7R,8R,8R,9R,9R,PTR,PTR,CSR,CSR,P2R,P2R,P4,P4,P4,P4,Coul,Coul,Coul,Coul}%
\NewList{CartesJeuMelange}
 
\NewDocumentCommand\MainCartesJeuAleatoire{ O{} m }{%1=options,2=nbcartes (OK)
  \useKVdefault[AffMainAleaCartes]%
  \setKV[AffMainAleaCartes]{#1}%
  %normalisation de Hauteur/EspH/EspV (nombre nu = cm, ou conversion si unité donnée)
  \pijcnormalisecm\MainAleaHauteur\MainAleaHauteur
  \pijcnormalisecm\MainAleaDecalH\MainAleaDecalH
  \pijcnormalisecm\MainAleaDecalV\MainAleaDecalV
  %calculs et traitement des variables (table TypeJeu -> hauteur/famille/taille)
  \pijcresolvealea{\MainAleaJeuType}{#2}%
  %échelle relative des cartes
  \def\EchelleCarteDecalage{\fpeval{\MainAleaHauteur/\HauteurGenerique}}%
  %transformation valign en tikz
  \pijcsetoptiontikzcbb{\MainAleaAlignementV}%
  %melange du jeu
  \ClearList{CartesJeuMelange}%
  \pijcdeckname{\MainAleaJeuType}%
  \xintFor* ##1 in {\xintCSVtoList{\NewDeck}}%
  \do{\InsertRandomItem{CartesJeuMelange}{##1}}%
  %environnement tikzpicture (liste pré-développée, cf. note dans \MainCartesJeu)
  \ifboolKV[AffMainAleaCartes]{Inverse}%
    {\edef\pijc@range{\pijcbackward{#2}}}%
    {\edef\pijc@range{\pijcforward{#2}}}%
  \begin{tikzpicture}[baseline=(\OptionTikzCBB)]%
    \foreach \i in \pijc@range
    {%début du foreach
      \GetItem{CartesJeuMelange}{\inteval{\CarteDebutRand+\i-1}}{CarteMainChoisie}%
      \ifboolKV[AffMainAleaCartes]{Eventail}%
      {%
        \def\MainOffset{\fpeval{\EchelleCarteDecalage*\MainAleaDecalV*(\i-1)}}%
        \def\SecondOffset{\fpeval{\EchelleCarteDecalage*\MainAleaDecalH*(\i-1)}}%
        \def\DecAngleMain{\fpeval{0.5*#2*\MainAleaRotation}}%
        \AffCarteJeu[TypeJeu=\CarteMainType,StyleJeu=\MainAleaJeuStyle,Tikz,TikzAutonome=false,Hauteur=\MainAleaHauteur,DecalageY=\MainOffset,DecalageX=\SecondOffset,Rotation={\DecAngleMain-(\i-1)*\MainAleaRotation}]{\CarteMainChoisie}%
      }%
      {%
        \def\MainOffset{\fpeval{\EchelleCarteDecalage*\MainAleaDecalH*(\i-1)}}%
        \def\SecondOffset{\fpeval{\EchelleCarteDecalage*\MainAleaDecalV*(\i-1)}}%
        \AffCarteJeu[TypeJeu=\CarteMainType,StyleJeu=\MainAleaJeuStyle,Tikz,TikzAutonome=false,Hauteur=\MainAleaHauteur,DecalageX=\MainOffset,DecalageY=\SecondOffset]{\CarteMainChoisie}%
      }%
    }%finforeach
  \end{tikzpicture}%
}
 
%------Commande pour remonter le Q ttfamily
\DeclareRobustCommand*{\RaiseBoxByDepth}{%
  \raisebox{\depth}%
}
%------Commande mini-cartes
\defKV[AffMiniCartes]{%
  Largeur=\def\MiniCarteLargeur{#1},%
  FondAtout=\def\MiniCarteFondAtout{#1}
}
\setKVdefault[AffMiniCartes]{%
  Largeur=0.55cm,%
  FondAtout=yellow
}
 
\NewDocumentCommand\AffMiniCarteJeu{ O{} m }{%1=options,2=nbcartes
  \useKVdefault[AffMiniCartes]%
  \setKV[AffMiniCartes]{#1}%
  %découpage de l'argument
  \StrCut{#2}{.}\csVal\csCplt%
  %couleur de fond
  \def\csFond{white}%
  \def\csCoul{black}%
  %le cas du 10.11...21
  \IfInteger{\csVal}{%
    \ifnum\csVal>9
      \edef\pijc@csvaltmp{\csVal}%
      \def\csVal{\scalebox{0.5}[1]{\pijc@csvaltmp}}%
    \fi
  }{}%
  %le cas de Excuse
  \IfStrEq{#2}{Exc}%
    {\def\csSymb{\ding{168}}\def\csCoul{blue}\def\csVal{\scalebox{0.33}[1]{EXC}}}{}%
  %le cas du Joker
  \IfStrEq{\csVal}{JO}%
    {\def\csSymb{\ding{166}}\def\csVal{\scalebox{0.5}[1]{JO}}}{}%
  %le cas de la dame [en] Q
  \IfStrEq{\csVal}{Q}%
    {\def\csVal{\RaiseBoxByDepth{\scalebox{1}[0.8]{Q}}}}{}%
  %si c'est un coeur
  \IfStrEq{\csCplt}{C}%
    {\def\csSymb{\ding{170}}\def\csCoul{red}}{}%
  %si c'est un carreau
  \IfStrEq{\csCplt}{K}%
    {\def\csSymb{\ding{169}}\def\csCoul{red}}{}%
  %si c'est un coeur
  \IfStrEq{\csCplt}{P}%
    {\def\csSymb{\ding{171}}}{}%
  %si c'est un trèfle
  \IfStrEq{\csCplt}{T}%
    {\def\csSymb{\ding{168}}}{}%
  %si c'est un atout 68 
  \IfStrEq{\csCplt}{AT}%
    {\def\csFond{\MiniCarteFondAtout}\def\csSymb{\ding{88}}}{}%
  %si c'est un rouge
  \IfStrEq{\csCplt}{R}%
    {\def\csCoul{red}}{}%
  %minicarte
  \tikz[baseline=(char.base)]\node[anchor=north west,line width=0.7pt,draw=gray,rectangle,rounded corners=3pt,inner sep=1.5pt,fill=\csFond,text=\csCoul,font=\ttfamily,minimum width=\MiniCarteLargeur](char){\vphantom{A}\csVal\scalebox{0.75}[0.75]{\csSymb}};%
}
 
%------Commande mini-main-cartes
\defKV[AffMiniMainCartes]{%
  Largeur=\def\MiniMainLargeur{#1},%
  FondAtout=\def\MiniMainFondAtout{#1}
}
\setKVdefault[AffMiniMainCartes]{%
  Largeur=0.55cm,%
  FondAtout=yellow
}
 
\NewDocumentCommand\MainMiniCartesJeu{ O{} m }{%1=options,2=liste
  \useKVdefault[AffMiniMainCartes]%
  \setKV[AffMiniMainCartes]{#1}%
  \ignoreemptyitems%
  \setsepchar{§}%
  \readlist*\MiniCartesMain{#2}%
  \foreachitem\MiniCarteAffich\in\MiniCartesMain{%
    \AffMiniCarteJeu[FondAtout=\MiniMainFondAtout,Largeur=\MiniMainLargeur]{\MiniCarteAffich}%
  }%
}
 
%------Commande mini-main aléatoire
\defKV[MiniMainAleaCartes]{%
  Largeur=\def\MiniMainAleaLargeur{#1},%
  TypeJeu=\def\MiniMainAleaType{#1},%
  FondAtout=\def\MiniMainAleaFondAtout{#1}
}
\setKVdefault[MiniMainAleaCartes]{%
  Largeur=0.55cm,%
  TypeJeu=Poker,%
  FondAtout=yellow
}
 
\xdef\MiniCartesJeuPoker{2.P,3.P,4.P,5.P,6.P,7.P,8.P,9.P,10.P,V.P,D.P,R.P,A.P,2.T,3.T,4.T,5.T,6.T,7.T,8.T,9.T,10.T,V.T,D.T,R.T,A.T,2.C,3.C,4.C,5.C,6.C,7.C,8.C,9.C,10.C,V.C,D.C,R.C,A.C,2.K,3.K,4.K,5.K,6.K,7.K,8.K,9.K,10.K,V.K,D.K,R.K,A.K}%
\xdef\MiniCartesJeuPokerEN{2.P,3.P,4.P,5.P,6.P,7.P,8.P,9.P,10.P,J.P,Q.P,K.P,A.P,2.T,3.T,4.T,5.T,6.T,7.T,8.T,9.T,10.T,J.T,Q.T,K.T,A.T,2.C,3.C,4.C,5.C,6.C,7.C,8.C,9.C,10.C,J.C,Q.C,K.C,A.C,2.K,3.K,4.K,5.K,6.K,7.K,8.K,9.K,10.K,J.K,Q.K,K.K,A.K}%
\xdef\MiniCartesJeuBelote{7.P,8.P,9.P,10.P,V.P,D.P,R.P,A.P,7.T,8.T,9.T,10.T,V.T,D.T,R.T,A.T,7.C,8.C,9.C,10.C,V.C,D.C,R.C,A.C,7.K,8.K,9.K,10.K,V.K,D.K,R.K,A.K}%
\xdef\MiniCartesJeuBeloteEN{7.P,8.P,9.P,10.P,J.P,Q.P,K.P,A.P,7.T,8.T,9.T,10.T,J.T,Q.T,K.T,A.T,7.C,8.C,9.C,10.C,J.C,Q.C,K.C,A.C,7.K,8.K,9.K,10.K,J.K,Q.K,K.K,A.K}%
\xdef\MiniCartesJeuBataille{2.P,3.P,4.P,5.P,6.P,7.P,8.P,9.P,10.P,V.P,D.P,R.P,A.P,2.T,3.T,4.T,5.T,6.T,7.T,8.T,9.T,10.T,V.T,D.T,R.T,A.T,2.C,3.C,4.C,5.C,6.C,7.C,8.C,9.C,10.C,V.C,D.C,R.C,A.C,2.K,3.K,4.K,5.K,6.K,7.K,8.K,9.K,10.K,V.K,D.K,R.K,A.K,JO.N,JO.R}%
\xdef\MiniCartesJeuBatailleEN{2.P,3.P,4.P,5.P,6.P,7.P,8.P,9.P,10.P,J.P,Q.P,K.P,A.P,2.T,3.T,4.T,5.T,6.T,7.T,8.T,9.T,10.T,J.T,Q.T,K.T,A.T,2.C,3.C,4.C,5.C,6.C,7.C,8.C,9.C,10.C,J.C,Q.C,K.C,A.C,2.K,3.K,4.K,5.K,6.K,7.K,8.K,9.K,10.K,J.K,Q.K,K.K,A.K,JO.N,JO.R}%
\xdef\MiniCartesJeuTarot{2.P,3.P,4.P,5.P,6.P,7.P,8.P,9.P,10.P,V.P,C.P,D.P,R.P,A.P,2.T,3.T,4.T,5.T,6.T,7.T,8.T,9.T,10.T,V.T,C.T,D.T,R.T,A.T,2.C,3.C,4.C,5.C,6.C,7.C,8.C,9.C,10.C,V.C,C.C,D.C,R.C,A.C,2.K,3.K,4.K,5.K,6.K,7.K,8.K,9.K,10.K,V.K,C.K,D.K,R.K,A.K,1.AT,2.AT,3.AT,4.AT,5.AT,6.AT,7.AT,8.AT,9.AT,10.AT,11.AT,12.AT,13.AT,14.AT,15.AT,16.AT,17.AT,18.AT,19.AT,20.AT,21.AT,Exc}%
\xdef\MiniCartesJeuRami{2.P,3.P,4.P,5.P,6.P,7.P,8.P,9.P,10.P,V.P,D.P,R.P,A.P,2.T,3.T,4.T,5.T,6.T,7.T,8.T,9.T,10.T,V.T,D.T,R.T,A.T,2.C,3.C,4.C,5.C,6.C,7.C,8.C,9.C,10.C,V.C,D.C,R.C,A.C,2.K,3.K,4.K,5.K,6.K,7.K,8.K,9.K,10.K,V.K,D.K,R.K,A.K,JO.N,JO.R,2.P,3.P,4.P,5.P,6.P,7.P,8.P,9.P,10.P,V.P,D.P,R.P,A.P,2.T,3.T,4.T,5.T,6.T,7.T,8.T,9.T,10.T,V.T,D.T,R.T,A.T,2.C,3.C,4.C,5.C,6.C,7.C,8.C,9.C,10.C,V.C,D.C,R.C,A.C,2.K,3.K,4.K,5.K,6.K,7.K,8.K,9.K,10.K,V.K,D.K,R.K,A.K,JO.N,JO.R}%
\xdef\MiniCartesJeuRamiEN{2.P,3.P,4.P,5.P,6.P,7.P,8.P,9.P,10.P,J.P,Q.P,K.P,A.P,2.T,3.T,4.T,5.T,6.T,7.T,8.T,9.T,10.T,J.T,Q.T,K.T,A.T,2.C,3.C,4.C,5.C,6.C,7.C,8.C,9.C,10.C,J.C,Q.C,K.C,A.C,2.K,3.K,4.K,5.K,6.K,7.K,8.K,9.K,10.K,J.K,Q.K,K.K,A.K,JO.N,JO.R,2.P,3.P,4.P,5.P,6.P,7.P,8.P,9.P,10.P,J.P,Q.P,K.P,A.P,2.T,3.T,4.T,5.T,6.T,7.T,8.T,9.T,10.T,J.T,Q.T,K.T,A.T,2.C,3.C,4.C,5.C,6.C,7.C,8.C,9.C,10.C,J.C,Q.C,K.C,A.C,2.K,3.K,4.K,5.K,6.K,7.K,8.K,9.K,10.K,J.K,Q.K,K.K,A.K,JO.N,JO.R}%
\NewList{MiniCartesJeuMelange}
 
\NewDocumentCommand\MainMiniCartesJeuAleatoire{ O{} m }{%1=options,2=nbcartes
  \useKVdefault[MiniMainAleaCartes]%
  \setKV[MiniMainAleaCartes]{#1}%
  %melange du jeu (table TypeJeu -> \MiniCartesJeu<TypeJeu>, cf. \pijcminideckname)
  \ClearList{MiniCartesJeuMelange}%
  \pijcminideckname{\MiniMainAleaType}%
  \xintFor* ##1 in {\xintCSVtoList{\NewDeck}}%
  \do{\InsertRandomItem{MiniCartesJeuMelange}{##1}}%
  %création de la main
  \foreach \i in {1,...,#2}{%
    \GetItem{MiniCartesJeuMelange}{\inteval{\i-1}}{MiniCarteMainChoisie}%
    \AffMiniCarteJeu[FondAtout=\MiniMainAleaFondAtout,Largeur=\MiniMainAleaLargeur]{\MiniCarteMainChoisie}%
    }%finpour
}
 
\endinput