summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/customenvs/tex/customenvs.sty
diff options
context:
space:
mode:
Diffstat (limited to 'macros/latex/contrib/customenvs/tex/customenvs.sty')
-rw-r--r--macros/latex/contrib/customenvs/tex/customenvs.sty1015
1 files changed, 1014 insertions, 1 deletions
diff --git a/macros/latex/contrib/customenvs/tex/customenvs.sty b/macros/latex/contrib/customenvs/tex/customenvs.sty
index 34b3c30803..e63ea57f84 100644
--- a/macros/latex/contrib/customenvs/tex/customenvs.sty
+++ b/macros/latex/contrib/customenvs/tex/customenvs.sty
@@ -3,9 +3,14 @@
% source pencil...: CC-BY-SA 4.0 https://tex.stackexchange.com/questions/504092/replicating-a-fancy-bordered-text-style-in-latex/504145#504145
\NeedsTeXFormat{LaTeX2e}
-\ProvidesPackage{customenvs}[2024/03/17 0.1.2 Custom classic environments]
+\ProvidesPackage{customenvs}[2024/06/03 0.1.7 Custom classic environments]
%====HISTORIQUE
+% v 0.1.7 Style perso pour les vignettes
+% v 0.1.6 DisplaySkip patch + Patchs pas-tableur
+% v 0.1.5 Boxes for exam title + circled numbers + Vignettes + Small simple boxes creation
+% v 0.1.4 Commande (en/fr) pour du texte dans une boîte arrondie, de hauteur 'figée' + 'Chat' SMS
+% v 0.1.3 Environnement/Commande pour présentation d'un exercice
% v 0.1.2 Crayon de compétences
% v 0.1.1 Ajout de tableaux de compétences
% v 0.1.0 Version initiale
@@ -26,6 +31,8 @@
\newif\if@fa\@fatrue%
\DeclareOption{nonfa}{\@fafalse}%
\DeclareOption{nofa}{\@fafalse}%
+\newif\if@pastableur\@pastableurfalse%
+\DeclareOption{pastableur}{\@pastableurtrue}%
\DeclareOption*{}
\ProcessOptions\relax
@@ -50,8 +57,13 @@
\RequirePackage{simplekv}
\RequirePackage{xstring}
\RequirePackage{listofitems}
+\RequirePackage{calc}
\RequirePackage{tikz}
\usetikzlibrary{decorations.pathmorphing,positioning,shapes.misc,calc}
+\usetikzlibrary{babel}
+\RequirePackage{tcolorbox}
+\RequirePackage{varwidth}
+\tcbuselibrary{skins}
%%----COMMANDES FR
@@ -663,6 +675,427 @@
\end{tikzpicture}%
}
+%====EXERCICE PERSO
+
+\newcounter{numeroexo}
+\setcounter{numeroexo}{0}
+\newlength{\eptraitexo}
+\setlength{\eptraitexo}{1.1pt}
+\newlength{\eptraitexospace}
+\setlength{\eptraitexospace}{1.5\eptraitexo}
+\newlength{\tmp@image@hauteur@totale}
+\newlength{\tmp@image@profondeur}
+
+\colorlet{macouleurexo}{blue!50!black}
+
+\newcommand\tmpstyleexo{\bfseries\LARGE\sffamily}%
+\newcommand\tmplabelexo{Exercice~}%
+
+\defKV[globalstyleexo]{%
+ Libelle=\renewcommand\tmplabelexo{#1},%
+ Couleur=\colorlet{macouleurexo}{#1},%
+ Police=\renewcommand\tmpstyleexo{#1},%
+ EpTrait=\setlength{\eptraitexo}{#1}
+}
+
+\setKVdefault[globalstyleexo]{%
+ Libelle={Exercice~},%
+ Couleur={blue!50!black},%
+ Police={\bfseries\LARGE\sffamily},%
+ EpTrait={1.1pt}
+}
+
+\NewDocumentCommand\StyleEnvtExo{ O{} }{%
+ \restoreKV[globalstyleexo]%
+ \setKV[globalstyleexo]{#1}%
+}
+\NewDocumentCommand\StyleEnvtExoDefaut{ }{%
+ \restoreKV[globalstyleexo]%
+}
+
+\defKV[EnvtExercice]{%
+ Type=\def\EnvtExoType{#1},%
+ ComplementTitre=\def\EnvtExoCpltTitre{#1},%
+ CodeDebut=\def\EnvtExoCodeAvant{#1},%
+ %Couleur=\def\EnvtExoCouleur{#1},%
+ EchelleImage=\def\EnvtExoScaleImg{#1},%
+ Decoration=\def\EnvtExoDeco{#1},%
+ Trait=\def\EnvtExoTrait{#1}
+}
+\setKVdefault[EnvtExercice]{
+ Type=Classique,%
+ ComplementTitre={},%
+ CodeDebut={},%
+ %Couleur=macouleurexo,%
+ EchelleImage=1.15,%
+ Compteur=true,%
+ Decoration={},%
+ Trait=plein
+}
+
+\NewDocumentEnvironment{EnvtExo}{ !O{} }%
+{%
+ \useKVdefault[EnvtExercice]%
+ \setKV[EnvtExercice]{#1}%
+ \addtocounter{numeroexo}{1}%
+ \ifboolKV[EnvtExercice]{Compteur}{}{\addtocounter{numeroexo}{-1}}%
+ \def\hrulefill{\leavevmode\leaders\hrule height \eptraitexo\hfill\kern\z@}%épaisseur
+ \noindent\begingroup\color{macouleurexo}%
+ \IfStrEq{\EnvtExoType}{Classique}%OK exo°____vide
+ {%
+ %label avec numéro et complément
+ \tmpstyleexo\tmplabelexo\ifboolKV[EnvtExercice]{Compteur}{\thenumeroexo}{}\EnvtExoCpltTitre%
+ %trait éventuel
+ \IfStrEqCase{\EnvtExoTrait}{%
+ {plein}{\,\hrulefill}%
+ {pointilles}{\,\dotfill}%
+ {dashilles}{\,\hdashrule{\fill}{\eptraitexo}{\eptraitexospace}}%
+ {non}{\hfill}%
+ }%
+ %décoration éventuelle
+ \IfSubStr{\EnvtExoDeco}{Icone}%
+ {%
+ \StrBehind{\EnvtExoDeco}{/}[\EnvtExoIcon]%
+ \,\scalebox{0.85}[0.85]{\EnvtExoIcon}%
+ }{}%
+ \IfSubStr{\EnvtExoDeco}{Ceinture}%
+ {%
+ \StrBehind{\EnvtExoDeco}{/}[\EnvtExoCouleur]%
+ \,\CeintureCouleur{\EnvtExoCouleur}%
+ }{}%
+ \IfSubStr{\EnvtExoDeco}{Chrono}%
+ {%
+ \StrBehind{\EnvtExoDeco}{/}[\EnvtExoChrono]%
+ \,\pictochrono[ColTime=macouleurexo!50]{\EnvtExoChrono}%
+ }{}%
+ \IfSubStr{\EnvtExoDeco}{Points}%
+ {%
+ \StrBehind{\EnvtExoDeco}{/}[\EnvtExoPts]%
+ \IfStrEq{\EnvtExoPts}{1}{\def\pts{point}}{\def\pts{points}}%
+ \,(\EnvtExoPts\ \pts)%
+ }{}%
+ \IfSubStr{\EnvtExoDeco}{Image}%
+ {%
+ \StrBehind{\EnvtExoDeco}{/}[\EnvtExoImg]%
+ \settototalheight{\tmp@image@hauteur@totale}{\hbox{\tmpstyleexo qB}}%
+ \,$\vcenter{\hbox{\includegraphics[height=\EnvtExoScaleImg\tmp@image@hauteur@totale]{\EnvtExoImg}}}$%
+ }{}%
+ }{}%
+ \IfSubStr{\EnvtExoType}{Perso}%OK perso____déco
+ {%
+ \StrBehind{\EnvtExoType}{/}[\EnvtExoLabel]%
+ %label avec numéro et complément
+ \tmpstyleexo\EnvtExoLabel\ifboolKV[EnvtExercice]{Compteur}{\thenumeroexo}{}\EnvtExoCpltTitre%
+ %trait éventuel
+ \IfStrEqCase{\EnvtExoTrait}{%
+ {plein}{\,\hrulefill}%
+ {pointilles}{\,\dotfill}%
+ {dashilles}{\,\hdashrule{\fill}{\eptraitexo}{\eptraitexospace}}%
+ {non}{\hfill}%
+ }%
+ %décoration éventuelle
+ \IfSubStr{\EnvtExoDeco}{Icone}%
+ {%
+ \StrBehind{\EnvtExoDeco}{/}[\EnvtExoIcon]%
+ \,\scalebox{0.85}[0.85]{\EnvtExoIcon}%
+ }{}%
+ \IfSubStr{\EnvtExoDeco}{Ceinture}%
+ {%
+ \StrBehind{\EnvtExoDeco}{/}[\EnvtExoCouleur]%
+ \,\CeintureCouleur{\EnvtExoCouleur}%
+ }{}%
+ \IfSubStr{\EnvtExoDeco}{Chrono}%
+ {%
+ \StrBehind{\EnvtExoDeco}{/}[\EnvtExoChrono]%
+ \,\pictochrono[ColTime=macouleurexo!50]{\EnvtExoChrono}%
+ }{}%
+ \IfSubStr{\EnvtExoDeco}{Points}%
+ {%
+ \StrBehind{\EnvtExoDeco}{/}[\EnvtExoPts]%
+ \IfStrEq{\EnvtExoPts}{1}{\def\pts{point}}{\def\pts{points}}%
+ \,(\EnvtExoPts\ \pts)%
+ }{}%
+ \IfSubStr{\EnvtExoDeco}{Image}%
+ {%
+ \StrBehind{\EnvtExoDeco}{/}[\EnvtExoImg]%
+ \settototalheight{\tmp@image@hauteur@totale}{\hbox{\tmpstyleexo qB}}%
+ \,$\vcenter{\hbox{\includegraphics[height=\EnvtExoScaleImg\tmp@image@hauteur@totale]{\EnvtExoImg}}}$%
+ }{}%
+ }{}%
+ \endgroup%
+ \def\hrulefill{\leavevmode\leaders\hrule height 0.4pt\hfill\kern\z@}%
+ \par%
+ \EnvtExoCodeAvant%
+}%
+{}%
+
+\NewDocumentCommand\TitreExo{ !O{} }{%
+ \useKVdefault[EnvtExercice]%
+ \setKV[EnvtExercice]{#1}%
+ \addtocounter{numeroexo}{1}%
+ \ifboolKV[EnvtExercice]{Compteur}{}{\addtocounter{numeroexo}{-1}}%
+ \def\hrulefill{\leavevmode\leaders\hrule height \eptraitexo\hfill\kern\z@}%épaisseur
+ \noindent\begingroup\color{macouleurexo}%
+ \IfStrEq{\EnvtExoType}{Classique}%OK exo°____vide
+ {%
+ %label avec numéro et complément
+ \tmpstyleexo\tmplabelexo\ifboolKV[EnvtExercice]{Compteur}{\thenumeroexo}{}\EnvtExoCpltTitre%
+ %trait éventuel
+ \IfStrEqCase{\EnvtExoTrait}{%
+ {plein}{\,\hrulefill}%
+ {pointilles}{\,\dotfill}%
+ {dashilles}{\,\hdashrule{\fill}{\eptraitexo}{\eptraitexospace}}%
+ {non}{\hfill}%
+ }%
+ %décoration éventuelle
+ \IfSubStr{\EnvtExoDeco}{Icone}%
+ {%
+ \StrBehind{\EnvtExoDeco}{/}[\EnvtExoIcon]%
+ \,\scalebox{0.85}[0.85]{\EnvtExoIcon}%
+ }{}%
+ \IfSubStr{\EnvtExoDeco}{Ceinture}%
+ {%
+ \StrBehind{\EnvtExoDeco}{/}[\EnvtExoCouleur]%
+ \,\CeintureCouleur{\EnvtExoCouleur}%
+ }{}%
+ \IfSubStr{\EnvtExoDeco}{Chrono}%
+ {%
+ \StrBehind{\EnvtExoDeco}{/}[\EnvtExoChrono]%
+ \,\pictochrono[ColTime=macouleurexo!50]{\EnvtExoChrono}%
+ }{}%
+ \IfSubStr{\EnvtExoDeco}{Points}%
+ {%
+ \StrBehind{\EnvtExoDeco}{/}[\EnvtExoPts]%
+ \IfStrEq{\EnvtExoPts}{1}{\def\pts{point}}{\def\pts{points}}%
+ \,(\EnvtExoPts\ \pts)%
+ }{}%
+ \IfSubStr{\EnvtExoDeco}{Image}%
+ {%
+ \StrBehind{\EnvtExoDeco}{/}[\EnvtExoImg]%
+ \settototalheight{\tmp@image@hauteur@totale}{\hbox{\tmpstyleexo qB}}%
+ \,$\vcenter{\hbox{\includegraphics[height=\EnvtExoScaleImg\tmp@image@hauteur@totale]{\EnvtExoImg}}}$%
+ }{}%
+ }{}%
+ \IfSubStr{\EnvtExoType}{Perso}%OK perso____déco
+ {%
+ \StrBehind{\EnvtExoType}{/}[\EnvtExoLabel]%
+ %label avec numéro et complément
+ \tmpstyleexo\EnvtExoLabel\ifboolKV[EnvtExercice]{Compteur}{\thenumeroexo}{}\EnvtExoCpltTitre%
+ %trait éventuel
+ \IfStrEqCase{\EnvtExoTrait}{%
+ {plein}{\,\hrulefill}%
+ {pointilles}{\,\dotfill}%
+ {dashilles}{\,\hdashrule{\fill}{\eptraitexo}{\eptraitexospace}}%
+ {non}{\hfill}%
+ }%
+ %décoration éventuelle
+ \IfSubStr{\EnvtExoDeco}{Icone}%
+ {%
+ \StrBehind{\EnvtExoDeco}{/}[\EnvtExoIcon]%
+ \,\scalebox{0.85}[0.85]{\EnvtExoIcon}%
+ }{}%
+ \IfSubStr{\EnvtExoDeco}{Ceinture}%
+ {%
+ \StrBehind{\EnvtExoDeco}{/}[\EnvtExoCouleur]%
+ \,\CeintureCouleur{\EnvtExoCouleur}%
+ }{}%
+ \IfSubStr{\EnvtExoDeco}{Chrono}%
+ {%
+ \StrBehind{\EnvtExoDeco}{/}[\EnvtExoChrono]%
+ \,\pictochrono[ColTime=macouleurexo!50]{\EnvtExoChrono}%
+ }{}%
+ \IfSubStr{\EnvtExoDeco}{Points}%
+ {%
+ \StrBehind{\EnvtExoDeco}{/}[\EnvtExoPts]%
+ \IfStrEq{\EnvtExoPts}{1}{\def\pts{point}}{\def\pts{points}}%
+ \,(\EnvtExoPts\ \pts)%
+ }{}%
+ \IfSubStr{\EnvtExoDeco}{Image}%
+ {%
+ \StrBehind{\EnvtExoDeco}{/}[\EnvtExoImg]%
+ \settototalheight{\tmp@image@hauteur@totale}{\hbox{\tmpstyleexo qB}}%
+ \,$\vcenter{\hbox{\includegraphics[height=\EnvtExoScaleImg\tmp@image@hauteur@totale]{\EnvtExoImg}}}$%
+ }{}%
+ }{}%
+ \endgroup%
+ \def\hrulefill{\leavevmode\leaders\hrule height 0.4pt\hfill\kern\z@}%
+ \par%
+ \EnvtExoCodeAvant%
+}
+
+%====BOITE ARRONDIE
+\newlength{\tmpheightbox}
+\defKV[BoiteArrondie]{EspH=\def\RoundedBoxDelta{#1},Style=\def\RoundedBoxStyle{#1}}
+\setKVdefault[BoiteArrondie]{%
+ Fond=red,%
+ Texte=white,%
+ EspH=0.125em,%
+ Style=rect
+}
+\NewDocumentCommand\BoiteArrondie{ O{} m O{char} }{%
+ \restoreKV[BoiteArrondie]%
+ \setKV[BoiteArrondie]{#1}%
+ \settototalheight{\tmpheightbox}{\hbox{(EazertyuiopqsdfghjklmwxcvbnAZERTYUIOPQSDFGHJKLMWXCVBN)#2}}%hauteur globale
+ \IfStrEqCase{\RoundedBoxStyle}{%
+ {rect}{\tikz[remember picture,baseline=(#3.base)]{\node[minimum height=\tmpheightbox,shape=rectangle,rounded corners=0.25em,fill={\useKV[BoiteArrondie]{Fond}},inner sep=0.75pt,outer sep=0pt,text={\useKV[BoiteArrondie]{Texte}}] (#3) {\vphantom{(qE)}\kern\RoundedBoxDelta#2\kern\RoundedBoxDelta};}}%
+ {cercle}{\tikz[remember picture,baseline=(#3.base)]{\node[shape=circle,minimum height=\tmpheightbox,fill={\useKV[BoiteArrondie]{Fond}},inner sep=0.75pt,outer sep=0pt,text={\useKV[BoiteArrondie]{Texte}}] (#3) {\vphantom{(qE)}#2};}}%
+ }\relax
+}
+
+%%====Chat SMS
+
+%===Données utiles
+\newlength{\WidthofSMS}
+\newlength{\HeightofSMS}
+\newlength{\OffsetofSMS}
+\newlength{\WidthofSMSavatar}
+\newlength{\MarginofSMSavatar}
+\colorlet{smscolp}{teal!75!cyan!75!white}
+\colorlet{smscoltitle}{white}
+
+%===Styles [FR/EN]
+\tcbset{SMSglobal/.style={
+ enhanced,arc=0pt,outer arc=0pt,colback=\ProjectSmsColback,toptitle=0.3cm,bottomtitle=0.3cm,title={\null},
+ overlay={
+ %la barre de titre
+ \node[anchor=east,smscoltitle,font=\large] at ([xshift=-1mm]title.east) {\faVideo~~\faPhone*~~\faEllipsisV};
+ \node[draw=none,anchor=west,inner sep=1pt,text=smscoltitle,font=\large] at ([xshift=1mm]title.west) (picture) {\ProjectSmsAvat};
+ \node[draw=none,anchor=west,text=smscoltitle,font=\large,text depth=0pt,inner sep=1pt] at (picture.east) {\sffamily\bfseries\vphantom{pB}\NameofSMS} ;
+ %le bas
+ \draw[line width=0.85pt,darkgray] ([yshift=1cm]frame.south west) -- ([yshift=1cm]frame.south east);
+ \node[draw=smscolp!75!black,top color=lightgray!40,bottom color=lightgray!40,middle color=white,line width=1pt,rounded corners=2pt,text width={{\WidthofSMS-2.5cm}},minimum height=0.75cm,font=\large\ProjectSmsFonte,text=darkgray,inner xsep=6pt] at ([shift={(0,0.5cm)}]frame.south) {\textcolor{gray}{\rule[-0.1cm]{1pt}{0.5cm}}\,\ProjectSmsWrite};
+ \node[draw=none,font=\LARGE,text=darkgray!50,anchor=east,align=center] at ([shift={(-1mm,0.5cm)}]frame.south east) (send) {\faPaperPlane};
+ \node[draw=none,font=\LARGE,text=darkgray!50,anchor=west,align=center] at ([shift={(1mm,0.5cm)}]frame.south west) (add) {\faPlusCircle};
+ },
+ boxrule=0.85pt,colframe=darkgray,
+ title style={top color=smscolp!90!black,bottom color=smscolp!90!black,middle color=smscolp!75},
+ bottom=1.15cm,top=0mm,left=1mm,right=1mm
+ }
+}
+
+%===Keys [FR]
+\defKV[ProjetSMS]{%
+ Hauteur=\def\ProjectSmsHeight{#1},%
+ Largeur=\setlength{\WidthofSMS}{#1},%
+ Marge=\setlength{\OffsetofSMS}{#1},%
+ Couleur=\colorlet{smscolp}{#1},%
+ CouleurFond=\def\ProjectSmsColback{#1},%
+ CouleurR=\def\ProjectSmsColIn{#1},%
+ CouleurE=\def\ProjectSmsColOut{#1},%
+ CouleurTitre=\colorlet{smscoltitle}{#1},%
+ PoliceTxt=\def\ProjectSmsFonte{#1},%
+ Avatar=\def\ProjectSmsAvatar{#1},%
+ TxtEcrire=\def\ProjectSmsWrite{#1}
+}
+\setKVdefault[ProjetSMS]{%
+ Hauteur=auto,%
+ Largeur=7cm,%
+ Marge=1.5cm,%
+ CouleurFond={lightgray!5},%
+ CouleurR=lime!25,%
+ CouleurE=teal!25,%
+ TxtEcrire={Écrire\ldots},%
+ PoliceTxt=\normalfont,%
+ Avatar=\faAddressCard,%
+ AffAvatar=false,%
+ NoirBlanc=false
+}
+
+%===Envt [FR]
+\NewDocumentEnvironment{EnvSMS}{ O{} m }
+{
+ \restoreKV[ProjetSMS]%
+ \setKV[ProjetSMS]{#1}%
+ \def\NameofSMS{#2}%
+ \IfSubStr{\ProjectSmsAvatar}{Image}%
+ {%
+ \StrBehind{\ProjectSmsAvatar}{/}[\tmpimgavatar]%
+ \def\ProjectSmsAvat{\includegraphics[height=0.5cm]{\tmpimgavatar}}%
+ \ifboolKV[ProjetSMS]{AffAvatar}%
+ {%
+ \setlength{\WidthofSMSavatar}{\widthof{\includegraphics[height=0.5\baselineskip]{\tmpimgavatar}}}%
+ \setlength{\MarginofSMSavatar}{\WidthofSMSavatar+2pt}%
+ }%
+ {%
+ \setlength{\MarginofSMSavatar}{0pt}%
+ }%
+ }%
+ {%
+ \def\ProjectSmsAvat{\ProjectSmsAvatar}%
+ \ifboolKV[ProjetSMS]{AffAvatar}%
+ {%
+ \setlength{\WidthofSMSavatar}{\widthof{\tiny\ProjectSmsAvatar}}%
+ \setlength{\MarginofSMSavatar}{\WidthofSMSavatar+2pt}%
+ }%
+ {%
+ \setlength{\MarginofSMSavatar}{0pt}%
+ }%
+ }%
+ \IfStrEq{\ProjectSmsHeight}{auto}%
+ {%
+ \tcbset{SMSsize/.style={width=\WidthofSMS}}%
+ }%
+ {%
+ \setlength{\HeightofSMS}{\ProjectSmsHeight}%
+ \tcbset{SMSsize/.style={width=\WidthofSMS,height=\HeightofSMS,valign=bottom}}%
+ }%
+ \ifboolKV[ProjetSMS]{NoirBlanc}%
+ {%
+ \colorlet{smscolp}{lightgray!25}%
+ \def\ProjectSmsColback{lightgray!5}%
+ \def\ProjectSmsColIn{lightgray!10}%
+ \def\ProjectSmsColOut{lightgray!10}%
+ \colorlet{smscoltitle}{gray}%
+ }%
+ {}%
+ \tcolorbox[SMSsize,SMSglobal]%
+}
+{
+ \endtcolorbox%
+}
+
+%===Macros [FR]
+\NewDocumentCommand\SMSrec{ s m m }{%
+ \ifboolKV[ProjetSMS]{AffAvatar}%
+ {%
+ \IfSubStr{\ProjectSmsAvatar}{Image}%
+ {%
+ \tcbset{SMSAffLogo/.style={left skip=\MarginofSMSavatar,overlay={\node[anchor=north east] at ([yshift={1mm+1pt}]interior.north west) {\includegraphics[height=0.5\baselineskip]{\tmpimgavatar}};}}}%
+ }%
+ {%
+ \tcbset{SMSAffLogo/.style={left skip=\MarginofSMSavatar,overlay={\node[anchor=north east,font=\tiny,text=gray] at ([yshift={1mm+1pt}]interior.north west) {\ProjectSmsAvatar};}}}%
+ }%
+ }%
+ {%
+ \tcbset{SMSAffLogo/.style={}}%
+ }%
+ \tcbox[enhanced,interior code={},before skip=0.5mm,after skip=0.5mm,halign=left,left=1.5mm,right=1.5mm,
+ frame code={
+ \filldraw[\ProjectSmsColIn,draw=black,rounded corners=4pt]
+ (frame.south east) rectangle (frame.north west) ;
+ },
+ width={\WidthofSMS-\OffsetofSMS},top=1mm,bottom=1mm,
+ capture=minipage,fontupper=\small\ProjectSmsFonte,
+ attach boxed title to top left,
+ coltitle=black,fonttitle=\scriptsize\sffamily,
+ boxed title style={size=fbox,bottom=0pt,boxsep=2pt,frame empty,interior empty},
+ title={\@ifpackageloaded{babel}{\NoAutoSpacing#2}{#2}\IfBooleanTF{#1}{$\cdot$\scalebox{0.6}[0.6]{\faCheckCircle[regular]\!\faCheckCircle[regular]}~}{}},left=1mm,right=1mm,boxsep=0mm,SMSAffLogo]{#3}%
+}
+\NewDocumentCommand\SMSenv{ s m m }{%
+ \tcbox[enhanced,interior code={},before skip=0.5mm,after skip=0.5mm,halign=left,left=1.5mm,right=1.5mm,
+ frame code={
+ \filldraw[\ProjectSmsColOut,draw=black,rounded corners=4pt]
+ (frame.south east) rectangle (frame.north west) ;
+ },
+ width={\WidthofSMS-\OffsetofSMS},top=1mm,bottom=1mm,flush right,
+ capture=minipage,fontupper=\small\ProjectSmsFonte,
+ attach boxed title to top right,
+ coltitle=black,fonttitle=\scriptsize\sffamily,
+ boxed title style={size=fbox,bottom=0pt,boxsep=2pt,frame empty,interior empty},
+ title={\@ifpackageloaded{babel}{\NoAutoSpacing#2}{#2}\IfBooleanTF{#1}{}{$\cdot$\scalebox{0.6}[0.6]{\faCheckCircle[regular]\!\faCheckCircle[regular]}~}},left=1mm,right=1mm,boxsep=0mm]{#3}%
+}
+
+
%%----COMMANDES EN
%====QCMs
@@ -919,4 +1352,584 @@
\end{tikzpicture}%
}
+%====ROUNDED BOX
+% \defKV[RoundedBox]{hmargin=\def\RoundedBoxDelta{#1},style=\def\RoundedBoxStyle{#1}}
+% \setKVdefault[RoundedBox]{%
+ % bg=red,%
+ % txt=white,%
+ % hmargin=0.25em,%
+ % style=rect
+% }
+
+% \NewDocumentCommand\RoundedBox{ O{} m O{char} }{%
+ % \restoreKV[RoundedBox]%
+ % \setKV[RoundedBox]{#1}%
+ % \settototalheight{\tmpheightbox}{\hbox{(EazertyuiopqsdfghjklmwxcvbnAZERTYUIOPQSDFGHJKLMWXCVBN)#2}}%hauteur globale
+ % \IfStrEqCase{\RoundedBoxStyle}{%
+ % {rect}{\tikz[remember picture,baseline=(#3.base)]{\node[minimum height=\tmpheightbox,shape=rectangle,rounded corners=0.25em,fill={\useKV[RoundedBox]{bg}},inner sep=0.75pt,outer sep=0pt,text={\useKV[RoundedBox]{txt}}] (#3) {\vphantom{(qE)}\kern\RoundedBoxDelta#2\kern\RoundedBoxDelta};}}%
+ % {circle}{\tikz[remember picture,baseline=(#3.base)]{\node[minimum height=\tmpheightbox,shape=circle,fill={\useKV[RoundedBox]{bg}},inner sep=0.75pt,outer sep=0pt,text={\useKV[RoundedBox]{txt}}] (#3) {\vphantom{(qE)}#2};}}%
+ % }\relax
+% }
+
+%====Chat SMS
+%===Keys [EN]
+\defKV[ProjectSMS]{%
+ height=\def\ProjectSmsHeight{#1},%
+ width=\setlength{\WidthofSMS}{#1},%
+ margin=\setlength{\OffsetofSMS}{#1},%
+ color=\colorlet{smscolp}{#1},%
+ colback=\def\ProjectSmsColback{#1},%
+ colorin=\def\ProjectSmsColIn{#1},%
+ colorout=\def\ProjectSmsColOut{#1},%
+ coltitle=\colorlet{smscoltitle}{#1},%
+ fonttxt=\def\ProjectSmsFonte{#1},%
+ avatar=\def\ProjectSmsAvatar{#1},%
+ writetxt=\def\ProjectSmsWrite{#1}
+}
+\setKVdefault[ProjectSMS]{%
+ height=auto,%
+ width=7cm,%
+ margin=1.5cm,%
+ colback=lightgray!5,%
+ colorin=lime!25,%
+ colorout=teal!25,%
+ writetxt={Write\ldots},%
+ fonttxt=\normalfont,%
+ avatar=\faAddressCard,%
+ dispavatar=false,%
+ blackwhite=false
+}
+
+%===Envt [EN]
+\NewDocumentEnvironment{ChatSMS}{ O{} m }
+{
+ \restoreKV[ProjectSMS]%
+ \setKV[ProjectSMS]{#1}%
+ \def\NameofSMS{#2}%
+ \IfSubStr{\ProjectSmsAvatar}{img}%
+ {%
+ \StrBehind{\ProjectSmsAvatar}{/}[\tmpimgavatar]%
+ \def\ProjectSmsAvat{\includegraphics[height=0.5cm]{\tmpimgavatar}}%
+ \ifboolKV[ProjectSMS]{dispavatar}%
+ {%
+ \setlength{\WidthofSMSavatar}{\widthof{\includegraphics[height=0.5\baselineskip]{\tmpimgavatar}}}%
+ \setlength{\MarginofSMSavatar}{\WidthofSMSavatar+2pt}%
+ }%
+ {%
+ \setlength{\MarginofSMSavatar}{0pt}%
+ }%
+ }%
+ {%
+ \def\ProjectSmsAvat{\ProjectSmsAvatar}%
+ \ifboolKV[ProjectSMS]{dispavatar}%
+ {%
+ \setlength{\WidthofSMSavatar}{\widthof{\tiny\ProjectSmsAvatar}}%
+ \setlength{\MarginofSMSavatar}{\WidthofSMSavatar+2pt}%
+ }%
+ {%
+ \setlength{\MarginofSMSavatar}{0pt}%
+ }%
+ }%
+ \IfStrEq{\ProjectSmsHeight}{auto}%
+ {%
+ \tcbset{SMSsize/.style={width=\WidthofSMS}}%
+ }%
+ {%
+ \setlength{\HeightofSMS}{\ProjectSmsHeight}%
+ \tcbset{SMSsize/.style={width=\WidthofSMS,height=\HeightofSMS,valign=bottom}}%
+ }%
+ \ifboolKV[ProjectSMS]{blackwhite}%
+ {%
+ \colorlet{smscolp}{lightgray!25}%
+ \def\ProjectSmsColback{lightgray!5}%
+ \def\ProjectSmsColIn{lightgray!10}%
+ \def\ProjectSmsColOut{lightgray!10}%
+ \colorlet{smscoltitle}{gray}%
+ }%
+ {}%
+ \tcolorbox[SMSsize,SMSglobal]%
+}
+{
+ \endtcolorbox%
+}
+
+%===Macros [EN]
+\NewDocumentCommand\InSMS{ s m m }{%
+ \ifboolKV[ProjectSMS]{dispavatar}%
+ {%
+ \IfSubStr{\ProjectSmsAvatar}{img}%
+ {%
+ \tcbset{SMSAffLogo/.style={left skip=\MarginofSMSavatar,overlay={\node[anchor=north east] at ([yshift={1mm+1pt}]interior.north west) {\includegraphics[height=0.5\baselineskip]{\tmpimgavatar}};}}}%
+ }%
+ {%
+ \tcbset{SMSAffLogo/.style={left skip=\MarginofSMSavatar,overlay={\node[anchor=north east,font=\tiny,text=gray] at ([yshift={1mm+1pt}]interior.north west) {\ProjectSmsAvatar};}}}%
+ }%
+ }%
+ {%
+ \tcbset{SMSAffLogo/.style={}}%
+ }%
+ \tcbox[enhanced,interior code={},before skip=0.5mm,after skip=0.5mm,halign=left,left=1.5mm,right=1.5mm,
+ frame code={
+ \filldraw[\ProjectSmsColIn,draw=black,rounded corners=4pt]
+ (frame.south east) rectangle (frame.north west) ;
+ },
+ width={\WidthofSMS-\OffsetofSMS},top=1mm,bottom=1mm,
+ capture=minipage,fontupper=\small\ProjectSmsFonte,
+ attach boxed title to top left,
+ coltitle=black,fonttitle=\scriptsize\sffamily,
+ boxed title style={size=fbox,bottom=0pt,boxsep=2pt,frame empty,interior empty},
+ title={#2\IfBooleanTF{#1}{$\cdot$\scalebox{0.6}[0.6]{\faCheckCircle[regular]\!\faCheckCircle[regular]}~}{}},left=1mm,right=1mm,boxsep=0mm,SMSAffLogo]{#3}%
+}
+\NewDocumentCommand\OutSMS{ s m m }{%
+ \tcbox[enhanced,interior code={},before skip=0.5mm,after skip=0.5mm,halign=left,left=1.5mm,right=1.5mm,
+ frame code={
+ \filldraw[\ProjectSmsColOut,draw=black,rounded corners=4pt]
+ (frame.south east) rectangle (frame.north west) ;
+ },
+ width={\WidthofSMS-\OffsetofSMS},top=1mm,bottom=1mm,flush right,
+ capture=minipage,fontupper=\small\ProjectSmsFonte,
+ attach boxed title to top right,
+ coltitle=black,fonttitle=\scriptsize\sffamily,
+ boxed title style={size=fbox,bottom=0pt,boxsep=2pt,frame empty,interior empty},
+ title={#2\IfBooleanTF{#1}{}{$\cdot$\scalebox{0.6}[0.6]{\faCheckCircle[regular]\!\faCheckCircle[regular]}~}},left=1mm,right=1mm,boxsep=0mm]{#3}%
+}
+
+%====SMALL BOXES CREATION
+\tikzset{simpleboxrulearrow/.style={line width=0.8pt,|->,>=latex}}
+
+% \NewTColorBox{SimpleBox}{ O{blue} D<>{} m }{
+ % enhanced,nobeforeafter,blanker,size=small,bottom=1mm,before=\par\noindent,%top=0mm,left=1mm,right=1mm,
+ % title={#3},fonttitle=\sffamily\bfseries\color{#1},lefttitle=1em,
+ % finish={\draw[#1,simpleboxrulearrow] ([xshift=1em]title.west) --++ (-1em,0) |- (frame.south east) -- ($(frame.south east)!0.5!(frame.north east)$) ;},%
+ % #2
+% }
+
+\NewTColorBox{BoiteSimple}{ O{blue} D<>{} m }{
+ enhanced,nobeforeafter,blanker,size=small,bottom=1mm,before=\par\noindent,%top=0mm,left=1mm,right=1mm,
+ title={#3},fonttitle=\sffamily\bfseries\color{#1},lefttitle=1em,
+ finish={\draw[#1,simpleboxrulearrow] ([xshift=1em]title.west) --++ (-1em,0) |- (frame.south east) -- ($(frame.south east)!0.5!(frame.north east)$) ;},%
+ #2
+}
+
+% \NewDocumentCommand\GenSimpleBox{ O{blue} m }{%
+ % 1 = couleur
+ % 2 = nom
+ % \NewTColorBox{#2}{ O{} m }{
+ % enhanced,nobeforeafter,blanker,size=small,bottom=1mm,before=\par\noindent,%top=0mm,left=1mm,right=1mm,
+ % title={##2},fonttitle=\sffamily\bfseries\color{#1},lefttitle=1em,
+ % finish={\draw[#1,simpleboxrulearrow] ([xshift=1em]title.west) --++ (-1em,0) |- (frame.south east) -- ($(frame.south east)!0.5!(frame.north east)$) ;},%
+ % ##1
+ % }
+% }
+
+\NewDocumentCommand\GenereBoiteSimple{ O{blue} m }{%
+ %1 = couleur
+ %2 = nom
+ \NewTColorBox{#2}{ O{} m }{
+ enhanced,nobeforeafter,blanker,size=small,bottom=1mm,before=\par\noindent,%top=0mm,left=1mm,right=1mm,
+ title={##2},fonttitle=\sffamily\bfseries\color{#1},lefttitle=1em,
+ finish={\draw[#1,simpleboxrulearrow] ([xshift=1em]title.west) --++ (-1em,0) |- (frame.south east) -- ($(frame.south east)!0.5!(frame.north east)$) ;},%
+ ##1
+ }
+}
+
+%====CIRCLEDNUMBERSSIMPLE
+\defKV[CircledBoxNumber]{bg=\def\tmpbordernbcircbox{#1}}
+\setKVdefault[CircledBoxNumber]{bg={},txt=black,bthick=0.5pt,bcol=black,raise=true}
+
+\newlength{\tmpheightnbcircbox}
+\newlength{\tmpdepthnbcircbox}
+\NewDocumentCommand\CircledNumber{ O{} m O{circnb} }{%
+ \restoreKV[CircledBoxNumber]%
+ \setKV[CircledBoxNumber]{#1}%
+ \settototalheight{\tmpheightnbcircbox}{(1234567890)}%hauteur globale
+ \settodepth{\tmpdepthnbcircbox}{(1234567890)}%
+ \ifboolKV[CircledBoxNumber]{raise}%
+ {%
+ \IfEq{\tmpbordernbcircbox}{}%
+ {%
+ {\tikz[baseline={([yshift=\tmpdepthnbcircbox]current bounding box.south)}]\node[outer sep=0pt,inner sep=0.5pt,minimum height={\tmpheightnbcircbox-\useKV[CircledBoxNumber]{bthick}},draw,{\useKV[CircledBoxNumber]{bcol}},line width={\useKV[CircledBoxNumber]{bthick}},circle,text={\useKV[CircledBoxNumber]{txt}}] (#3) {\ifnum#2<10 #2\else\scalebox{0.5}[1]{#2}\fi} ;}%
+ }%
+ {%
+ {\tikz[baseline={([yshift=\tmpdepthnbcircbox]current bounding box.south)}]\node[outer sep=0pt,inner sep=0.5pt,minimum height={\tmpheightnbcircbox-\useKV[CircledBoxNumber]{bthick}},draw,{\useKV[CircledBoxNumber]{bcol}},line width={\useKV[CircledBoxNumber]{bthick}},circle,fill={\useKV[CircledBoxNumber]{bg}},text={\useKV[CircledBoxNumber]{txt}}] (#3) {\ifnum#2<10 #2\else\scalebox{0.5}[1]{#2}\fi} ;}%
+ }%
+ }%
+ {%
+ \IfEq{\tmpbordernbcircbox}{}%
+ {%
+ {\tikz[baseline=(#3.base)] \node[outer sep=0pt,inner sep=0.5pt,minimum height={\tmpheightnbcircbox-\useKV[CircledBoxNumber]{bthick}},draw,{\useKV[CircledBoxNumber]{bcol}},line width={\useKV[CircledBoxNumber]{bthick}},circle,text={\useKV[CircledBoxNumber]{txt}}] (#3) {\ifnum#2<10 #2\else\scalebox{0.5}[1]{#2}\fi} ;}%
+ }%
+ {%
+ {\tikz[baseline=(#3.base)] \node[outer sep=0pt,inner sep=0.5pt,minimum height={\tmpheightnbcircbox-\useKV[CircledBoxNumber]{bthick}},draw,{\useKV[CircledBoxNumber]{bcol}},line width={\useKV[CircledBoxNumber]{bthick}},circle,fill={\useKV[CircledBoxNumber]{bg}},text={\useKV[CircledBoxNumber]{txt}}] (#3) {\ifnum#2<10 #2\else\scalebox{0.5}[1]{#2}\fi} ;}%
+ }%
+ }%
+}
+
+%====EXAM BOX TITLE(s)
+\NewDocumentCommand\LetPhantomBox{}{%
+ \vphantom{(ÉAZERTYUIOPQSDFGHJKLMWXCVBN,éàço)}%
+}
+
+\tcbset{StyleTitreSujet/.style={%
+ enhanced,size=small,
+ colback=white!5,boxrule=1.25pt,
+ attach boxed title to top left={xshift=0.5cm,yshift=1mm-\tcboxedtitleheight},
+ varwidth boxed title*=-3cm,
+ boxed title style={frame code={
+ \path[fill=tcbcolframe!50!black]
+ ([yshift=-1mm,xshift=-1mm]frame.north west)
+ arc[start angle=0,end angle=180,radius=1mm]
+ ([yshift=-1mm,xshift=1mm]frame.north east)
+ arc[start angle=180,end angle=0,radius=1mm];
+ \path[fill=tcbcolframe] ([xshift=-2mm]frame.north west) -- ([xshift=2mm]frame.north east) [rounded corners=1mm]-- ([xshift=1mm,yshift=-1mm]frame.north east) -- (frame.south east) -- (frame.south west) -- ([xshift=-1mm,yshift=-1mm]frame.north west) [sharp corners]-- cycle;
+ },interior engine=empty,size=fbox,
+ },
+ fonttitle=\bfseries\sffamily,
+ fontupper=\huge\bfseries\sffamily,
+ }
+}
+
+\defKV[tcbtitresujet]{%
+ AlignH=\def\tcbtitresujethalign{#1}
+}
+
+\setKVdefault[tcbtitresujet]{%
+ Couleur=black,
+ AlignH=center
+}
+
+\NewDocumentEnvironment{TitreSujet}{ O{} D<>{} m }%
+{%
+ \restoreKV[tcbtitresujet]%
+ \setKV[tcbtitresujet]{#1}%
+ \IfStrEqCase{\tcbtitresujethalign}{%
+ {right}{\tcbset{StyleTitreSujetAlign/.style={halign=flush right}}}%
+ {left}{\tcbset{StyleTitreSujetAlign/.style={halign=flush left}}}%
+ }[\tcbset{StyleTitreSujetAlign/.style={halign=flush center}}]%
+ \tcolorbox[colupper={\useKV[tcbtitresujet]{Couleur}},colframe={\useKV[tcbtitresujet]{Couleur}},StyleTitreSujet,StyleTitreSujetAlign,title={\vphantom{QJ}#3},before upper=\LetPhantomBox,after upper=\LetPhantomBox,#2]%
+}%
+{%
+ \endtcolorbox%
+}
+
+\tcbset{StyleTitreSujetSousEpreuve/.style={%
+ center,after skip=1pt,size=small,boxsep=3pt,boxrule=1pt,colback=white,left=2pt,right=2pt,%
+ sharp corners,rounded corners=downhill,arc=8pt,
+ fontupper={\sffamily\bfseries\large}
+ }
+}
+
+\NewDocumentCommand\SousTitreSujetEpreuve{ O{black} m }{%
+ \tcbset{StyleTitreSujetSousEpreuveCouleur/.style={colframe=#1,colupper=#1}}
+ \IfStrEqCase{#2}{%
+ {}{\tcbox[StyleTitreSujetSousEpreuve,StyleTitreSujetSousEpreuveCouleur]{#2}}%
+ {U21}{\tcbox[StyleTitreSujetSousEpreuve,StyleTitreSujetSousEpreuveCouleur,before upper=\faSortNumericDown\:\:,after upper=\:\:\faProjectDiagram]{Épreuve U2 - Mathématiques pour l'Informatique}}%
+ {U2}{\tcbox[StyleTitreSujetSousEpreuve,StyleTitreSujetSousEpreuveCouleur,before upper=\faSortNumericDown\:\:,after upper=\:\:\faProjectDiagram]{Épreuve U2 - Mathématiques pour l'Informatique}}%
+ {U2CG}{\tcbox[StyleTitreSujetSousEpreuve,StyleTitreSujetSousEpreuveCouleur,before upper=\faSortNumericDown\:\:,after upper=\:\:\faProjectDiagram]{Épreuve U2 - Mathématiques appliquées}}%
+ {UF2}{\tcbox[StyleTitreSujetSousEpreuve,StyleTitreSujetSousEpreuveCouleur,before upper=\faDice\:\:,after upper=\:\:\faChartLine]{Épreuve UF2 - Mathématiques Approfondies}}%
+ {U41OL}{\tcbox[StyleTitreSujetSousEpreuve,StyleTitreSujetSousEpreuveCouleur,before upper=\faDice\:\:,after upper=\:\:\faBezierCurve]{Épreuve U41 - Mathématiques}}
+ }%
+}
+
+\NewDocumentCommand\SujetTitreExo{ O{black} m }{%
+ \tcolorbox[enhanced,width=\linewidth,size=small,colback=white,colframe=#1,boxrule=0.75pt,fontupper=\color{#1}\Large\sffamily\bfseries,sharp corners,rounded corners=south,arc=4pt,before upper=\LetPhantomBox]
+ #2
+ \endtcolorbox%
+}
+
+%====vignettes
+\NewDocumentCommand\LetPhantomVignette{}{%
+ \vphantom{(AZERTYUIOPQSDFGHJKLMWXCVBN,éàço)}%
+}
+
+\tcbset{cevignettes/.style={%
+ nobeforeafter,box align=base,boxsep=0pt,enhanced,sharp corners=all,rounded corners=southeast,arc=2pt,boxrule=0.65pt,left=1.75pt,right=1.25pt,top=1.25pt,bottom=0.5pt,colback=white,before upper=\LetPhantomVignette
+ }
+}
+
+\tcbset{cevignettepy/.style={%
+ cevignettes,left=6pt,coltitle=tcbcolframe,
+ underlay={\begin{tcbclipinterior}\fill[fill=tcbcolframe!33]($(interior.south west)$) rectangle node[rotate=90,font=\tiny\sffamily,tcbcolframe!75!black]{\scalebox{0.55}[0.75]{\textbf{PY}}} ($(interior.north west)+(5pt,0pt)$);\end{tcbclipinterior}}
+ }
+}
+
+\tcbset{cevignettealgo/.style={%
+ cevignettes,left=6pt,coltitle=tcbcolframe,
+ underlay={\begin{tcbclipinterior}\fill[fill=tcbcolframe!33]($(interior.south west)$) rectangle node[rotate=90,font=\tiny\sffamily,tcbcolframe!75!black]{\scalebox{0.55}[0.75]{\textbf{ALGO}}} ($(interior.north west)+(5pt,0pt)$);\end{tcbclipinterior}}
+ }
+}
+
+\tcbset{cevignettetableur/.style={%
+ cevignettes,left=6pt,coltitle=tcbcolframe,
+ underlay={\begin{tcbclipinterior}\fill[fill=tcbcolframe!33]($(interior.south west)$) rectangle node[rotate=90,font=\tiny\sffamily,tcbcolframe!75!black]{\scalebox{0.5}[0.75]{\textbf{EXCEL}}} ($(interior.north west)+(5pt,0pt)$);\end{tcbclipinterior}}
+ }
+}
+
+\tcbset{cevignetteMPM/.style={%
+ cevignettes,left=6pt,coltitle=white,
+ underlay={\begin{tcbclipinterior}\fill[fill=tcbcolframe!33]($(interior.south west)$) rectangle node[rotate=90,font=\tiny\sffamily,tcbcolframe!75!black]{\scalebox{0.55}[0.75]{\textbf{MPM}}} ($(interior.north west)+(5pt,0pt)$);\end{tcbclipinterior}}
+ }
+}
+
+\tcbset{cevignettegraph/.style={%
+ cevignettes,left=6pt,coltitle=white,
+ underlay={\begin{tcbclipinterior}\fill[fill=tcbcolframe!33]($(interior.south west)$) rectangle node[rotate=90,font=\tiny\sffamily,tcbcolframe!75!black]{\scalebox{0.55}[0.75]{\textbf{GRPH}}} ($(interior.north west)+(5pt,0pt)$);\end{tcbclipinterior}}
+ }
+}
+
+\tcbset{cevignetteshell/.style={%
+ cevignettes,left=6pt,coltitle=white,
+ underlay={\begin{tcbclipinterior}\fill[fill=tcbcolframe!33]($(interior.south west)$) rectangle node[rotate=90,font=\tiny\sffamily,tcbcolframe!75!black] {\scalebox{0.5}[0.75]{\textbf{SHELL}}} ($(interior.north west)+(5pt,0pt)$);\end{tcbclipinterior}}
+ }
+}
+
+\tcbset{cevignettelatex/.style={%
+ cevignettes,left=6pt,coltitle=white,
+ underlay={\begin{tcbclipinterior}\fill[fill=tcbcolframe!33]($(interior.south west)$) rectangle node[rotate=90,font=\tiny\sffamily,tcbcolframe!75!black]{\scalebox{0.55}[0.75]{\textbf{\LaTeX}}} ($(interior.north west)+(5pt,0pt)$);\end{tcbclipinterior}}
+ }
+}
+
+\tcbset{cevignettexcas/.style={%
+ cevignettes,left=6pt,coltitle=white,colback=white,%
+ underlay={\begin{tcbclipinterior}\fill[fill=tcbcolframe!33]($(interior.south west)$) rectangle node[rotate=90,font=\tiny\sffamily,tcbcolframe!75!black]{\scalebox{0.55}[0.75]{\textbf{XCAS}}} ($(interior.north west)+(5pt,0pt)$);\end{tcbclipinterior}}
+ }
+}
+
+\defKV[cevignette]{Type=\def\cevignettetype{#1},Couleur=\def\cevignettecolor{#1},Police=\def\cevignettefont{#1},Echelle=\def\cevignettescaleperso{#1}}
+\setKVdefault[cevignette]{Type={},Couleur={darkgray},Police=\footnotesize,Echelle=0.55}
+
+\NewDocumentCommand\AffVignette{ s O{} m }{%
+ \restoreKV[cevignette]%
+ \setKV[cevignette]{#2}%
+ \IfStrEqCase{\cevignettetype}{%
+ {}{\tcbox[colframe=\cevignettecolor,fontupper={\cevignettefont},cevignettes]{\IfBooleanTF{#1}{\NoAutoSpacing}{}#3}}%
+ {algo}{\tcbox[colframe=\cevignettecolor,fontupper={\cevignettefont\ttfamily},cevignettealgo]{\IfBooleanTF{#1}{\NoAutoSpacing}{}#3}}%
+ {py}{\tcbox[colframe=\cevignettecolor,fontupper={\cevignettefont\ttfamily},cevignettepy]{\IfBooleanTF{#1}{\NoAutoSpacing}{}#3}}%
+ {pypit}{\tcbox[colframe=\cevignettecolor,fontupper={\cevignettefont\ttfamily},cevignettepy]{\piton{#3}}}%
+ {pyl}{\tcbox[colframe=\cevignettecolor,fontupper={\cevignettefont\ttfamily},cevignettepy]{\piton{\py{#3}}}}%
+ {mpm}{\tcbox[colframe=\cevignettecolor,fontupper={\cevignettefont},cevignetteMPM]{\IfBooleanTF{#1}{\NoAutoSpacing}{}#3}}%
+ {grph}{\tcbox[colframe=\cevignettecolor,fontupper={\cevignettefont},cevignettegraph]{\IfBooleanTF{#1}{\NoAutoSpacing}{}#3}}%
+ {xcas}{\tcbox[colframe=\cevignettecolor,fontupper={\cevignettefont},cevignettexcas]{\IfBooleanTF{#1}{\NoAutoSpacing}{}#3}}%
+ {shell}{\tcbox[colframe=\cevignettecolor,fontupper={\cevignettefont\ttfamily},cevignetteshell]{\IfBooleanTF{#1}{\NoAutoSpacing}{}#3}}%
+ {tex}{\tcbox[colframe=\cevignettecolor,fontupper={\cevignettefont\ttfamily},cevignettelatex]{\IfBooleanTF{#1}{\NoAutoSpacing}{}#3}}%
+ {sheet}{\tcbox[colframe=\cevignettecolor,fontupper={\cevignettefont},cevignettetableur]{\IfBooleanTF{#1}{\NoAutoSpacing}{}#3}}%
+ }%
+ \IfSubStr{\cevignettetype}{perso}%
+ {%
+ \StrBehind{\cevignettetype}{/}[\cevignettelabelperso]%
+ \tcbox[colframe=\cevignettecolor,fontupper={\cevignettefont},cevignettes,left=6pt,coltitle=white,colback=white,underlay={\begin{tcbclipinterior}\fill[fill=tcbcolframe!33]($(interior.south west)$) rectangle node[rotate=90,font=\tiny\sffamily,tcbcolframe!75!black]{\scalebox{\cevignettescaleperso}[0.75]{\textbf{\cevignettelabelperso}}} ($(interior.north west)+(5pt,0pt)$);\end{tcbclipinterior}}]{\IfBooleanTF{#1}{\NoAutoSpacing}{}#3}%
+ }%
+ {}%
+ \relax%
+}
+
+%====DisplaySkip [en]
+\defKV[DisplaySkip]{%
+ aboveds=\def\ceabovedisplayskip{#1},%
+ abovedsshort=\def\ceabovedisplayskipshort{#1},%
+ belowdds=\def\cebelowdisplayskip{#1},%
+ belowdsshort=\def\cebelowdisplayskipshort{#1},%
+ global=\def\globaldisplayskip{#1}
+}
+
+\setKVdefault[DisplaySkip]{%
+ aboveds={12pt plus 3pt minus 9pt},%
+ abovedsshort={0pt plus 3pt},%
+ belowdds={12pt plus 3pt minus 9pt},%
+ belowdsshort={7pt plus 3pt minus 4pt},%
+ global={},%
+ shrink=false
+}
+\NewDocumentCommand\ChangeSpacingDisplaySkip{ O{} }{%
+ \restoreKV[DisplaySkip]%
+ \setKV[DisplaySkip]{#1}%
+ \ifboolKV[DisplaySkip]{shrink}%
+ {%
+ \AtBeginDocument{%
+ \abovedisplayskip=0.33\baselineskip
+ \abovedisplayshortskip=0.33\baselineskip
+ \belowdisplayskip=0.33\baselineskip
+ \belowdisplayshortskip=0.33\baselineskip
+ }
+ }%
+ {%
+ \IfStrEq{\globaldisplayskip}{}%
+ {%
+ \AtBeginDocument{%
+ \abovedisplayskip=\ceabovedisplayskip
+ \abovedisplayshortskip=\ceabovedisplayskipshort
+ \belowdisplayskip=\cebelowdisplayskip
+ \belowdisplayshortskip=\cebelowdisplayskipshort
+ }
+ }%
+ {%
+ \AtBeginDocument{%
+ \abovedisplayskip=\globaldisplayskip
+ \abovedisplayshortskip=\globaldisplayskip
+ \belowdisplayskip=\globaldisplayskip
+ \belowdisplayshortskip=\globaldisplayskip
+ }
+ }%
+ }%
+}
+
+%====DisplaySkip [fr]
+\defKV[DisplaySkipFr]{%
+ Avant=\def\ceabovedisplayskip{#1},%
+ AvantS=\def\ceabovedisplayskipshort{#1},%
+ Apres=\def\cebelowdisplayskip{#1},%
+ ApresS=\def\cebelowdisplayskipshort{#1},%
+ Global=\def\globaldisplayskip{#1}
+}
+
+\setKVdefault[DisplaySkipFr]{%
+ Avant={12pt plus 3pt minus 9pt},%
+ AvantS={0pt plus 3pt},%
+ Apres={12pt plus 3pt minus 9pt},%
+ ApresS={7pt plus 3pt minus 4pt},%
+ Global={},%
+ Dense=false
+}
+\NewDocumentCommand\ChangerDisplaySkip{ O{} }{%
+ \restoreKV[DisplaySkipFr]%
+ \setKV[DisplaySkipFr]{#1}%
+ \ifboolKV[DisplaySkipFr]{Dense}%
+ {%
+ \AtBeginDocument{%
+ \abovedisplayskip=0.33\baselineskip
+ \abovedisplayshortskip=0.33\baselineskip
+ \belowdisplayskip=0.33\baselineskip
+ \belowdisplayshortskip=0.33\baselineskip
+ }
+ }%
+ {%
+ \IfStrEq{\globaldisplayskip}{}%
+ {%
+ \AtBeginDocument{%
+ \abovedisplayskip=\ceabovedisplayskip
+ \abovedisplayshortskip=\ceabovedisplayskipshort
+ \belowdisplayskip=\cebelowdisplayskip
+ \belowdisplayshortskip=\cebelowdisplayskipshort
+ }
+ }%
+ {%
+ \AtBeginDocument{%
+ \abovedisplayskip=\globaldisplayskip
+ \abovedisplayshortskip=\globaldisplayskip
+ \belowdisplayskip=\globaldisplayskip
+ \belowdisplayshortskip=\globaldisplayskip
+ }
+ }%
+ }%
+}
+
+%====Patchs pas-tableur
+\if@pastableur
+
+\RequirePackage{pas-tableur}
+
+\renewcommand{\pastableur@grid}[4] % #1 : width, #2 : name, #3 : numline, #4 : coord.
+{%
+ \node[celempty,below,minimum height=\line@height,minimum width=#1] (cell#2-#3) at (#4) {};%
+ \draw[graySepCell] ($(cell#2-#3.south west)+(0.2pt,0)$) -- (cell#2-#3.south east) -- ($(cell#2-#3.north east)+(0,-0.2pt)$);%
+}
+
+\renewcommand{\pastab@draw@cell}[5]
+% #1 : \first@width, #2 : \first@name, #3 : 0=colonne1 / 1=autres colonnes /
+% 2 = ligne 1, #4 : coord., #5 : contenu
+{%
+ \ifnum#3=0%
+ \tikzstyle{cellstyle} = [celhead,minimum width={#1},minimum height=\line@height]%
+ \def\pastableur@coord{(0,0)}%
+ \else%
+ \ifnum#3=1%
+ \tikzstyle{cellstyle} = [celhead,right,minimum width={#1},minimum height=\line@height]%
+ \else
+ \ifnum#3=2%
+ \tikzstyle{cellstyle} = [below left,celhead,minimum width={#1},minimum height=\line@height]
+ \else%
+ \tikzstyle{cellstryle} = [below,celhead,minimum width={#1},minimum height=\line@height]
+ \fi%
+ \fi%
+ \def\pastableur@coord{(#4)}%
+ \fi%
+ \node[cellstyle] (#2) at \pastableur@coord {\helvbx#5};%
+ \fill[grayBottomCell] (#2.south west) rectangle (#2.north east) ;%
+ \fill[grayTopCell] (#2.north west) rectangle ($0.5*(#2.south east)+0.5*(#2.north east)$) ;%
+ \node[minimum width={#1},minimum height=\line@height,cellstyle] at \pastableur@coord {\helvbx#5};%
+}
+
+\NewDocumentCommand\celcouleur{ O{graySepCell!50} m }{%OK
+ \draw[draw=none,fill=#1] ($(cell#2.south west)+(0.2pt,0.2pt)$) rectangle ($(cell#2.north east) + (-0.2pt,-0.2pt)$) ;%
+}
+
+\defKV[celparam]{align=\def\pastableurfusalign{#1},width=\def\pastableurfuswidth{#1}}
+\setKVdefault[celparam]{align=left,width={\col@width}}
+
+\NewDocumentCommand\celfusion{ O{} m m m }{%OK
+ \restoreKV[celparam]%
+ \setKV[celparam]{#1}%
+ \IfStrEq{#4}{}%
+ {%
+ \draw[draw=none,fill=white] ($(cell#2.south west)+(0.2pt,0.2pt)$) rectangle ($(cell#3.north east) + (-0.2pt,-0.2pt)$);
+ }%
+ {%
+ \draw[draw=none,fill=white] ($(cell#2.south west)+(0.2pt,0.2pt)$) rectangle ($(cell#3.north east) + (-0.2pt,-0.2pt)$) node[midway,text width=\dimexpr\pastableurfuswidth-4pt,align=\pastableurfusalign] {#4};
+ }%
+}
+
+\NewDocumentCommand\celnumbreak{ m m m }{%
+ \def\numpointilles{#1}
+ \xdef\numavant{\inteval{\numpointilles-1}}%
+ \def\numdebut{#2}\def\numfin{#3}
+ \foreach \num@line [remember=\num@line as \lastnum (initially \numavant)] in {\numpointilles}
+ {%
+ \pastab@draw@cell{\numline@width}{numline\num@line}{3}{numline\lastnum.south east}{\dots}%
+ }%
+ \foreach \num@line [remember=\num@line as \lastnum (initially \numpointilles)] in {\numdebut,\numfin}
+ {%
+ \pastab@draw@cell{\numline@width}{numline\num@line}{3}{numline\lastnum.south east}{\num@line}%
+ }%
+}
+
+\NewDocumentCommand\lignetxt{ s O{} m D<>{1} m }{%3=num ligne,%5=liste
+ \IfBooleanTF{#1}%
+ {
+ \foreach \x [count=\i] in {#5}
+ {%
+ \xdef\j{\inteval{\i+(#4-1)}}%
+ \StrChar{ABCDEFGHIJKLMNOPQRSTUVWXYZ}{\j}[\iltr]%
+ \IfEq{\x}{}{}{\celtxt*[#2]{\iltr}{#3}{\x}}%
+ }%
+ }%
+ {%
+ \foreach \x [count=\i] in {#5}
+ {%
+ \xdef\j{\inteval{\i+(#4-1)}}%
+ \StrChar{ABCDEFGHIJKLMNOPQRSTUVWXYZ}{\j}[\iltr]%
+ \IfEq{\x}{}{}{\celtxt[#2]{\iltr}{#3}{\x}}%
+ }%
+ }%
+}
+
+\NewDocumentCommand\colonnetxt{ s O{} m D<>{1} m }{%3=lettre colonne,%5=liste
+ \IfBooleanTF{#1}%
+ {%
+ \foreach \x [count=\i] in {#5}
+ {%
+ \xdef\j{\inteval{\i+(#4-1)}}
+ \IfStrEq{\x}{}{}{\celtxt*[#2]{#3}{\j}{\x}}%
+ }%
+ }%
+ {%
+ \foreach \x [count=\i] in {#5}
+ {%
+ \xdef\j{\inteval{\i+(#4-1)}}
+ \IfStrEq{\x}{}{}{\celtxt[#2]{#3}{\j}{\x}}%
+ }%
+ }%
+}
+
+\fi
+
\endinput \ No newline at end of file