% Author : C. Pierquet % licence : Released under the LaTeX Project Public License v1.3c or later, see http://www.latex-project.org/lppl.txtf \NeedsTeXFormat{LaTeX2e} \ProvidesPackage{tkz-bernoulli}[2023/11/05 0.1.3 Draw Bernoulli tree with tikz] %====HISTORIQUE % v 0.1.3 Retour en arrière pour la clé, qui n'est pas utile en fait... % v 0.1.2 Ajout d'une clé pour forcer l'affichage d'un indice pour les succès/échecs (prudence quand même... epérimental) % v 0.1.1 Correction de bugs + ajout d'une commande pour une épreuve de Bernoulli % v 0.1.0 Version initiale [fr] et [en] %====BASE \RequirePackage{tikz,pgffor} \RequirePackage{xstring} \RequirePackage{simplekv} \RequirePackage{xintexpr,xintbinhex} \usetikzlibrary{calc} %====SCHÉMA DE BERNOULLI [FR] %styles par défaut \tikzstyle{BernBranche} = [semithick] \tikzstyle{BernRacine} = [inner sep=2pt] \tikzstyle{BernNoeudS} = [inner sep=2pt] \tikzstyle{BernNoeudE} = [inner sep=2pt] \tikzstyle{BernProbaS} = [fill=white,midway,font=\footnotesize,inner sep=2pt] \tikzstyle{BernProbaE} = [fill=white,midway,font=\footnotesize,inner sep=2pt] \tikzstyle{BernNotice} = [inner sep=2pt,text=teal,right=1em] \NewDocumentCommand\tkzSchemBernStyleDefaut{ }{% \tikzstyle{BernBranche} = [semithick] \tikzstyle{BernRacine} = [inner sep=2pt] \tikzstyle{BernNoeudS} = [inner sep=2pt] \tikzstyle{BernNoeudE} = [inner sep=2pt] \tikzstyle{BernProbaS} = [fill=white,midway,font=\footnotesize,inner sep=2pt] \tikzstyle{BernProbaE} = [fill=white,midway,font=\footnotesize,inner sep=2pt] \tikzstyle{BernNotice} = [inner sep=2pt,text=teal,right=1em] } %clés \defKV[ArbreBernoulli]{% EspNiv=\def\ArBinIN{#1},% EspFeuil=\def\ArBinIF{#1},% Evts=\def\ArBinEvts{#1},% Probas=\def\ArBinProbas{#1},% Racine=\def\ArBinRacine{#1},% Var=\def\ArBinVar{#1},% N=\def\ArBinN{#1} } \setKVdefault[ArbreBernoulli]{% EspNiv=2.25,% EspFeuil=1,% Evts={$S$/$E$},% Probas={$p$/$1-p$},% Grille=false,% AffProbas=true,% Racine=$\Omega$,% Aide=false,% Notice=false,% Var=X,% N=3 } \NewDocumentCommand\tkzEpreuvBernoulli{ s O{} D<>{} }{% \useKVdefault[ArbreBernoulli]% \setKV[ArbreBernoulli]{#2}% \saveexpandmode\expandarg \StrCut{\ArBinEvts}{/}{\ArBinSucces}{\ArBinEchec}% \StrCut{\ArBinProbas}{/}{\ArBinProbSucces}{\ArBinProbEchec}% \restoreexpandmode \IfBooleanT{#1}% {% \begin{tikzpicture}[#3] }% \IfStrEq{\ArBinRacine}{false}% {% \coordinate (A0-1) at (0,0) ;% \coordinate (B0-1) at (0,0) ;% }% {% \coordinate (A0-1) at (0,0) ;% \node[BernRacine] (B0-1) at (A0-1) {\ArBinRacine} ;% }% \coordinate (A1-1) at ($(A0-1)+({\ArBinIN},{0.5*\ArBinIF})$) ; \coordinate (A1-2) at ($(A0-1)+({\ArBinIN},{-0.5*\ArBinIF})$) ; \node[BernNoeudS] (B1-1) at (A1-1) {\ArBinSucces} ;%succès \node[BernNoeudE] (B1-2) at (A1-2) {\ArBinEchec} ;%échec \ifboolKV[ArbreBernoulli]{AffProbas}% {% \draw[BernBranche] (B0-1) -- (B1-1) node[BernProbaS] {\ArBinProbSucces} ; \draw[BernBranche] (B0-1) -- (B1-2) node[BernProbaE] {\ArBinProbEchec} ; }% {% \draw[BernBranche] (B0-1) -- (B1-1) ; \draw[BernBranche] (B0-1) -- (B1-2) ; }% \IfBooleanT{#1}% {% \end{tikzpicture}% }% } \NewDocumentCommand\tkzSchemBernoulli{ s O{} D<>{} }{% \useKVdefault[ArbreBernoulli]% \setKV[ArbreBernoulli]{#2}% \saveexpandmode\expandarg \StrCut{\ArBinEvts}{/}{\ArBinSucces}{\ArBinEchec}% \StrCut{\ArBinProbas}{/}{\ArBinProbSucces}{\ArBinProbEchec}% \restoreexpandmode \IfBooleanT{#1}% {% \begin{tikzpicture}[#3] }% %grille \ifboolKV[ArbreBernoulli]{Grille}% {% \filldraw[red!25] (0,0) circle[radius=2pt] ; \draw[very thin,lightgray] (0,{-0.5*\ArBinIF*2^(\ArBinN)}) grid ({\ArBinN*\ArBinIN},{0.5*\ArBinIF*2^(\ArBinN)}) ;% }% {}% %Racine \IfStrEq{\ArBinRacine}{false}% {% \coordinate (A0-1) at (0,0) ;% \coordinate (B0-1) at (0,0) ;% }% {% \coordinate (A0-1) at (0,0) ;% \node[BernRacine] (B0-1) at (A0-1) {\ArBinRacine} ;% }% %Aide Racine \ifboolKV[ArbreBernoulli]{Aide}% {\draw[teal] (B0-1) node[below=4pt,font=\tiny\ttfamily] {B0-1} ;}% {}% %générations des nœuds du premier chemin \foreach \i in {1,...,\ArBinN}{% \def\j{\inteval{\i-1}}% \def\ArBinTmpNiv{\fpeval{2**(\ArBinN-\i)}}% \def\ArBinTmpNds{\fpeval{2**(\i)}}% \coordinate (A\i-1) at ($(A\j-1)+({\ArBinIN},{0.5*\ArBinIF*\ArBinTmpNiv})$) ; \foreach \k in {2,...,\ArBinTmpNds}{% \def\l{\inteval{\k-1}}% \coordinate (A\i-\k) at ($(A\i-\l)+(0,{-\ArBinIF*\ArBinTmpNiv})$) ; }% }% %test des nœuds OK ^^ \foreach \i in {1,...,\ArBinN}{% \def\ArBinTmpNds{\fpeval{2**(\i)}}% \foreach \j in {1,...,\ArBinTmpNds}{% \xintifboolexpr{\xintiiRem{\j}{2} != 0 }% {\node[BernNoeudS] (B\i-\j) at (A\i-\j) {\ArBinSucces} ;}%succès {\node[BernNoeudE] (B\i-\j) at (A\i-\j) {\ArBinEchec} ;}%échec \ifboolKV[ArbreBernoulli]{Aide}% {\draw[teal] (B\i-\j) node[below=4pt,font=\tiny\ttfamily] {B\i-\j} ;}% {}% }% }% %test des flèches... \foreach \i in {0,...,\inteval{\ArBinN-1}}{% \def\ipu{\inteval{\i+1}}% \def\ArBinTmpNds{\fpeval{2**(\i)}}% \foreach \j in {1,...,\ArBinTmpNds}{% \def\ArBinTmpA{\inteval{2*\j-1}}% \def\ArBinTmpB{\inteval{2*\j}}% \ifboolKV[ArbreBernoulli]{AffProbas}% {% \draw[BernBranche] (B\i-\j) -- (B\ipu-\ArBinTmpA) node[BernProbaS] {\ArBinProbSucces} ; \draw[BernBranche] (B\i-\j) -- (B\ipu-\ArBinTmpB) node[BernProbaE] {\ArBinProbEchec} ; }% {% \draw[BernBranche] (B\i-\j) -- (B\ipu-\ArBinTmpA) ; \draw[BernBranche] (B\i-\j) -- (B\ipu-\ArBinTmpB) ; }% }% }% \ifboolKV[ArbreBernoulli]{Notice}% {% \foreach \i in {1,...,\fpeval{2**\ArBinN}}{% \def\itmp{\fpeval{2**\ArBinN-\i}}% \def\ArBenTmpBin{\xintDecToBin{\itmp}}% \draw (B\ArBinN-\i) node[BernNotice] {$\longrightarrow \ArBinVar=\StrCount{\ArBenTmpBin}{1}$} ; }% }% {}% \IfBooleanT{#1}% {% \end{tikzpicture}% }% } %====SCHÉMA DE BERNOULLI [EN] %styles par défaut [en] \tikzstyle{BernEdge} = [semithick] \tikzstyle{BernRoot} = [inner sep=2pt] \tikzstyle{BernNodeS} = [inner sep=2pt] \tikzstyle{BernNodeF} = [inner sep=2pt] \tikzstyle{BernProbS} = [fill=white,midway,font=\footnotesize,inner sep=2pt] \tikzstyle{BernProbF} = [fill=white,midway,font=\footnotesize,inner sep=2pt] \tikzstyle{BernGuide} = [inner sep=2pt,text=teal,right=1em] \NewDocumentCommand\tkzBernTreeStyleDefault{ }{%1=type,2=tikzstyle \tikzstyle{BernEdge} = [semithick] \tikzstyle{BernRoot} = [inner sep=2pt] \tikzstyle{BernNodeS} = [inner sep=2pt] \tikzstyle{BernNodeF} = [inner sep=2pt] \tikzstyle{BernProbS} = [fill=white,midway,font=\footnotesize,inner sep=2pt] \tikzstyle{BernProbF} = [fill=white,midway,font=\footnotesize,inner sep=2pt] \tikzstyle{BernGuide} = [inner sep=2pt,text=teal,right=1em] } \defKV[BernoulliTree]{% LevelSep=\def\ArBinIN{#1},% NodeSep=\def\ArBinIF{#1},% Events=\def\ArBinEvts{#1},% Probs=\def\ArBinProbas{#1},% Root=\def\ArBinRacine{#1},% Var=\def\ArBinVar{#1},% N=\def\ArBinN{#1} } \setKVdefault[BernoulliTree]{% LevelSep=2.25,% NodeSep=1,% Events={$S$/$F$},% Probs={$p$/$1-p$},% Grid=false,% ShowProbs=true,% Root=$\Omega$,% Help=false,% Guide=false,% Var=X,% N=3 } \NewDocumentCommand\tkzBernoulliTrial{ s O{} D<>{} }{% \useKVdefault[BernoulliTree]% \setKV[BernoulliTree]{#2}% \saveexpandmode\expandarg \StrCut{\ArBinEvts}{/}{\ArBinSucces}{\ArBinEchec}% \StrCut{\ArBinProbas}{/}{\ArBinProbSucces}{\ArBinProbEchec}% \restoreexpandmode \IfBooleanT{#1}% {% \begin{tikzpicture}[#3] }% \IfStrEq{\ArBinRacine}{false}% {% \coordinate (A0-1) at (0,0) ;% \coordinate (B0-1) at (0,0) ;% }% {% \coordinate (A0-1) at (0,0) ;% \node[BernRoot] (B0-1) at (A0-1) {\ArBinRacine} ;% }% \coordinate (A1-1) at ($(A0-1)+({\ArBinIN},{0.5*\ArBinIF})$) ; \coordinate (A1-2) at ($(A0-1)+({\ArBinIN},{-0.5*\ArBinIF})$) ; \node[BernNodeS] (B1-1) at (A1-1) {\ArBinSucces} ;%succès \node[BernNodeF] (B1-2) at (A1-2) {\ArBinEchec} ;%échec \ifboolKV[BernoulliTree]{ShowProbs}% {% \draw[BernEdge] (B0-1) -- (B1-1) node[BernProbS] {\ArBinProbSucces} ; \draw[BernEdge] (B0-1) -- (B1-2) node[BernProbF] {\ArBinProbEchec} ; }% {% \draw[BernEdge] (B0-1) -- (B1-1) ; \draw[BernEdge] (B0-1) -- (B1-2) ; }% \IfBooleanT{#1}% {% \end{tikzpicture}% }% } \NewDocumentCommand\tkzBernoulliTree{ s O{} D<>{} }{% \useKVdefault[BernoulliTree]% \setKV[BernoulliTree]{#2}% \saveexpandmode\expandarg \StrCut{\ArBinEvts}{/}{\ArBinSucces}{\ArBinEchec}% \StrCut{\ArBinProbas}{/}{\ArBinProbSucces}{\ArBinProbEchec}% \restoreexpandmode \IfBooleanT{#1}% {% \begin{tikzpicture}[#3] }% %grille \ifboolKV[BernoulliTree]{Grid}% {% \filldraw[red!25] (0,0) circle[radius=2pt] ; \draw[very thin,lightgray] (0,{-0.5*\ArBinIF*2^(\ArBinN)}) grid ({\ArBinN*\ArBinIN},{0.5*\ArBinIF*2^(\ArBinN)}) ;% }% {}% %Racine \IfStrEq{\ArBinRacine}{false}% {% \coordinate (A0-1) at (0,0) ;% \coordinate (B0-1) at (0,0) ;% }% {% \coordinate (A0-1) at (0,0) ;% \node[BernRoot] (B0-1) at (A0-1) {\ArBinRacine} ;% }% %Aide Racine \ifboolKV[BernoulliTree]{Help}% {\draw[teal] (B0-1) node[below=4pt,font=\tiny\ttfamily] {B0-1} ;}% {}% %générations des nœuds du premier chemin \foreach \i in {1,...,\ArBinN}{% \def\j{\inteval{\i-1}}% \def\ArBinTmpNiv{\fpeval{2**(\ArBinN-\i)}}% \def\ArBinTmpNds{\fpeval{2**(\i)}}% \coordinate (A\i-1) at ($(A\j-1)+({\ArBinIN},{0.5*\ArBinIF*\ArBinTmpNiv})$) ; \foreach \k in {2,...,\ArBinTmpNds}{% \def\l{\inteval{\k-1}}% \coordinate (A\i-\k) at ($(A\i-\l)+(0,{-\ArBinIF*\ArBinTmpNiv})$) ; }% }% %test des nœuds OK ^^ \foreach \i in {1,...,\ArBinN}{% \def\ArBinTmpNds{\fpeval{2**(\i)}}% \foreach \j in {1,...,\ArBinTmpNds}{% \xintifboolexpr{\xintiiRem{\j}{2} != 0 }% {\node[BernNodeS] (B\i-\j) at (A\i-\j) {\ArBinSucces} ;}%succès {\node[BernNodeF] (B\i-\j) at (A\i-\j) {\ArBinEchec} ;}%échec \ifboolKV[BernoulliTree]{Help}% {\draw[teal] (B\i-\j) node[below=4pt,font=\tiny\ttfamily] {B\i-\j} ;}% {}% }% }% %test des flèches... \foreach \i in {0,...,\inteval{\ArBinN-1}}{% \def\ipu{\inteval{\i+1}}% \def\ArBinTmpNds{\fpeval{2**(\i)}}% \foreach \j in {1,...,\ArBinTmpNds}{% \def\ArBinTmpA{\inteval{2*\j-1}}% \def\ArBinTmpB{\inteval{2*\j}}% \ifboolKV[BernoulliTree]{ShowProbs}% {% \draw[BernEdge] (B\i-\j) -- (B\ipu-\ArBinTmpA) node[BernProbS] {\ArBinProbSucces} ; \draw[BernEdge] (B\i-\j) -- (B\ipu-\ArBinTmpB) node[BernProbF] {\ArBinProbEchec} ; }% {% \draw[BernEdge] (B\i-\j) -- (B\ipu-\ArBinTmpA) ; \draw[BernEdge] (B\i-\j) -- (B\ipu-\ArBinTmpB) ; }% }% }% \ifboolKV[BernoulliTree]{Guide}% {% \foreach \i in {1,...,\fpeval{2**\ArBinN}}{% \def\itmp{\fpeval{2**\ArBinN-\i}}% \def\ArBenTmpBin{\xintDecToBin{\itmp}}% \draw (B\ArBinN-\i) node[BernGuide] {$\longrightarrow \ArBinVar=\StrCount{\ArBenTmpBin}{1}$} ; }% }% {}% \IfBooleanT{#1}% {% \end{tikzpicture}% }% } \endinput