% proflycee-tools-listings.tex
% Copyright 2023  Cédric Pierquet
% This work may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either version 1.3
% of this license or (at your option) any later version.
% The latest version of this license is in
%   http://www.latex-project.org/lppl.txt
% and version 1.3 or later is part of all distributions of LaTeX
% version 2005/12/01 or later.

%2.5.8	Styles alternatifs + Modification marges

\RequirePackage{iftex}

%%------STYLE PYTHON LST
\ifluatex
\tcbuselibrary{listings}
\lstdefinelanguage{langnat}{%
	keywords={},
	inputencoding=utf8,
	comment=[l]{}}
\lstdefinestyle{PLpython}{%
	language          = python,
	inputencoding     = utf8,
	basicstyle        = \ttfamily\footnotesize,
	keywordstyle      = \color{CouleurVertForet},
	keywordstyle      = [2]\color{magenta},
	commentstyle      = \color{gray}\itshape,
	stringstyle       = \color{red!75},
	numberstyle       = \scriptsize\ttfamily\color{darkgray},
	aboveskip         = 0pt,
	belowskip         = 0pt,
	tabsize           = 4,
	showstringspaces  = false,
	columns           = fullflexible,
	keepspaces        = true,
	breaklines        = true,
	breakatwhitespace = true
}
\else
\tcbuselibrary{listingsutf8}
\lstdefinelanguage{langnat}{%
	keywords={},
	inputencoding=utf8/latin1,
	comment=[l]{}}
\lstdefinestyle{PLpython}{%
	language          = python,
	inputencoding     = utf8/latin1,
	basicstyle        = \ttfamily\footnotesize,
	keywordstyle      = \color{CouleurVertForet},
	keywordstyle      = [2]\color{magenta},
	commentstyle      = \color{gray}\itshape,
	stringstyle       = \color{red!75},
	numberstyle       = \scriptsize\ttfamily\color{darkgray},
	aboveskip         = 0pt,
	belowskip         = 0pt,
	tabsize           = 4,
	showstringspaces  = false,
	columns           = fullflexible,
	keepspaces        = true,
	breaklines        = true,
	breakatwhitespace = true
}
\fi

%%------PYTHONLISTINGS
%v1
\tcbset{stylepythonlst/.style={%
	enhanced,boxrule=1.25pt,%
	left=0.6em,
	sharp corners=downhill,arc=12pt,
	before skip=0.5\baselineskip,after skip=0.5\baselineskip,%
	top=\baselineskip,bottom=1mm,right=5mm,
	attach boxed title to top right={yshift=-\tcboxedtitleheight},
	boxed title style={
		size=small,colback=CouleurVertForet!25,boxrule=1.25pt,
		colframe=green,boxsep=1.25pt,
		sharp corners=downhill,
		arc=12pt,
		top=2pt,bottom=1pt,left=6pt,right=6pt
	},
	colframe=green,colback=CouleurVertForet!5,%
	fonttitle=\color{CouleurVertForet}\itshape\ttfamily\footnotesize,
	title={\scriptsize\faPython}\:Code Python\vphantom{p},
	watermark text={\faPython},watermark opacity=0.175,watermark zoom=0.50,
	listing only,listing engine=listings,%
	}
}

\tcbset{stylepythonlstnolineos/.style={%
	stylepythonlst,
	listing options={style=PLpython,xleftmargin=0pt,numbers=none}
	}
}

\tcbset{stylepythonlstlineos/.style={%
	stylepythonlst,
	listing options={style=PLpython,xleftmargin=16pt,numbers=left}
	}
}

\NewTCBListing{CodePythonLst}{ s O{\linewidth} m }{% * off pour numéros de lignes + {largeur} + <options tcbox>
	\IfBooleanTF{#1}{stylepythonlstnolineos}{stylepythonlstlineos},
	width=#2,#3
}

\NewTCBInputListing{\CodePythonLstFichier}{ s O{\linewidth} m m }{
	\IfBooleanTF{#1}{stylepythonlstnolineos}{stylepythonlstlineos},
	width=#2,#3,
	listing file={#4}
}

%v2
\tcbset{StylPythonB/.style={%
	enhanced,boxrule=0.75pt,colframe=darkgray!50!black,%
	sharp corners,top=0mm,bottom=0mm,left=0.2em,right=5mm,%
	before skip=0.5\baselineskip,after skip=0.5\baselineskip,%
	colback=white,
	fontupper=\footnotesize,fontlower=\footnotesize,%
	listing only,listing engine=listings,%
	watermark text={\faPython},watermark opacity=0.25,watermark zoom=0.50,%
	title={{\scriptsize\faCode} Code Python},
	lefttitle=0.4em,
	fonttitle=\bfseries\footnotesize\sffamily,colbacktitle=darkgray!50!black
	}
}

\tcbset{StylPythonBno/.style={%
	StylPythonB,
	listing options={style=PLpython,xleftmargin=0pt,numbers=none}
	}
}

\tcbset{StylPythonByes/.style={%
	StylPythonB,
	listing options={style=PLpython,xleftmargin=16pt,numbers=left},%
	underlay={%
		\begin{tcbclipinterior}
			\draw[draw=none,fill=lightgray!25] (interior.south west) rectangle ([xshift=1.3em]interior.north west) ;
		\end{tcbclipinterior}%
		}
	}
}

\NewTCBListing{CodePythonLstAlt}{ s O{\linewidth} m }{% * off pour numéros de lignes + {options keys} + <options tcbox>
	\IfBooleanTF{#1}{StylPythonBno}{StylPythonByes},width=#2,#3
}

\NewTCBInputListing{\CodePythonLstFichierAlt}{ s O{\linewidth} m m }{
	\IfBooleanTF{#1}{StylPythonBno}{StylPythonByes},
	width=#2,#3,
	listing file={#4}
}

%%------PSEUDOCODE
%language pseudocode listings
\lstdefinestyle{pseudocodePL}{%
	language         = langnat,
	basicstyle       = \footnotesize\ttfamily,
	numberstyle      = \scriptsize\ttfamily\color{gray},
	keywordstyle     = \bfseries,
	stringstyle      = \color{red!75},
	keepspaces       = true,
	tabsize          = 4,
	numbersep        = 10pt,
	xleftmargin      = 14pt,
	numbers          = left,
	morestring       = [b]",
	showstringspaces = false,
	escapeinside     = {(*}{*)}
}

\lstdefinestyle{pseudocodenoPL}{%
	language         = langnat,
	basicstyle       = \footnotesize\ttfamily,
	numberstyle      = \scriptsize\ttfamily\color{gray},
	keywordstyle     = \bfseries,
	stringstyle      = \color{red!75},
	keepspaces       = true,
	tabsize          = 4,
	numbersep        = 10pt,
	numbers          = none,
	showstringspaces = false,
	morestring       = [b]",
	escapeinside     = {(*}{*)}
}

%style tcbox pseudocode avec bannière hautdroite
\tcbset{stylepseudocodePL/.style={%
	enhanced,boxrule=1.25pt,sharp corners=downhill,arc=12pt,
	before skip=0.5\baselineskip,after skip=0.5\baselineskip,leftupper=10pt,top=\baselineskip,bottom=1mm,rightupper=5mm,%
	attach boxed title to top right={yshift=-\tcboxedtitleheight},
	boxed title style={
		size=small,colback=gray!25,boxrule=1.25pt,
		colframe=darkgray,boxsep=1.25pt,
		sharp corners=downhill,
		arc=12pt,
		top=2pt,bottom=1pt,left=6pt,right=6pt
	},
	fonttitle=\color{darkgray}\ttfamily\footnotesize,
	title={\scriptsize\faFileCode}\:\textit{Pseudo-Code}\vphantom{p},
	watermark text={\faCode},watermark opacity=0.175,watermark zoom=0.50,
	}
}

\ifluatex
	\newcommand\algomathttPL[1]{\symtt{#1}}
\else
	\newcommand\algomathttPL[1]{\mathtt{#1}}
\fi

\DeclareTCBListing{PseudoCode}{ s O{12cm} m }{% étoilée sans numéro, <taille> puis option...
	width=#2,#3,
	stylepseudocodePL,
	listing only,listing engine=listings,
	listing options={
		style=\IfBooleanTF{#1}{pseudocodenoPL}{pseudocodePL},%version étoilée sans numéro de lignes
		aboveskip=0pt,belowskip=0pt,
		columns=fullflexible,
		literate={é}{{\'e}}1 {í}{{\'i}}1 {ó}{{\'o}}1% 
		{ú}{{\'u}}1 {Á}{{\'A}}1 {É}{{\'E}}1 {Í}{{\'I}}1 {Ó}{{\'O}}1 {Ú}{{\'U}}1%
		{è}{{\`e}}1 {ì}{{\`i}}1 {ò}{{\`o}}1 {ù}{{\`u}}1%
		{À}{{\`A}}1 {È}{{\'E}}1 {Ì}{{\`I}}1 {Ò}{{\`O}}1 {Ù}{{\`U}}1%
		{ä}{{\"a}}1 {ë}{{\"e}}1 {ï}{{\"i}}1 {ö}{{\"o}}1 {ü}{{\"u}}1%
		{Ä}{{\"A}}1 {Ë}{{\"E}}1 {Ï}{{\"I}}1 {Ö}{{\"O}}1 {Ü}{{\"U}}1%
		{â}{{\^a}}1 {ê}{{\^e}}1 {î}{{\^i}}1 {ô}{{\^o}}1 {û}{{\^u}}1%
		{Â}{{\^A}}1 {Ê}{{\^E}}1 {Î}{{\^I}}1 {Ô}{{\^O}}1 {Û}{{\^U}}1%
		{œ}{{\oe}}1 {Œ}{{\OE}}1 {æ}{{\ae}}1 {Æ}{{\AE}}1 {ß}{{\ss}}1%
		{ű}{{\H{u}}}1 {Ű}{{\H{U}}}1 {ő}{{\H{o}}}1 {Ő}{{\H{O}}}1%
		{ç}{{\c c}}1 {Ç}{{\c C}}1 {ø}{{\o}}1 {å}{{\r a}}1 {Å}{{\r A}}1%
		{€}{{\texteuro}}1 {£}{{\pounds}}1%
		{=}{\textleftarrow}1 {==}{=}1%
		{*}{$\algomathttPL{\times}$}{1}%
	}
}

%style tcbox pseudocode v2
\lstdefinestyle{pseudocodePLalt}{%
	language         = langnat,
	basicstyle       = \footnotesize\ttfamily,
	numberstyle      = \scriptsize\ttfamily\color{gray},
	keywordstyle     = \bfseries,
	stringstyle      = \color{red!75},
	keepspaces       = true,
	tabsize          = 4,
	xleftmargin      = 1.5em,
	numbers          = left,
	morestring       = [b]",
	showstringspaces = false,
	escapeinside     = {(*}{*)}
}

\lstdefinestyle{pseudocodenoPLalt}{%
	language         = langnat,
	basicstyle       = \footnotesize\ttfamily,
	numberstyle      = \scriptsize\ttfamily\color{gray},
	keywordstyle     = \bfseries,
	stringstyle      = \color{red!75},
	keepspaces       = true,
	tabsize          = 4,
	numbers          = none,
	showstringspaces = false,
	morestring       = [b]",
	escapeinside     = {(*}{*)}
}

\tcbset{stylepseudocodePLalt/.style={%
	enhanced,boxrule=0.75pt,colframe=darkgray!50!black,%
	sharp corners,top=0mm,bottom=0mm,left=0.4em,right=5mm,%
	before skip=0.5\baselineskip,after skip=0.5\baselineskip,%
	colback=white,
	fontupper=\footnotesize,fontlower=\footnotesize,%
	listing only,listing engine=listings,%
	watermark text={\faCode},watermark opacity=0.25,watermark zoom=0.50,%
	title={{\scriptsize\faCode} PseudoCode},
	lefttitle=0.4em,
	fonttitle=\bfseries\footnotesize\sffamily,colbacktitle=darkgray!50!black
	}
}

\tcbset{stylepseudocodePLaltlines/.style={%
	underlay={%
		\begin{tcbclipinterior}
			\filldraw[lightgray!25] (interior.south west) rectangle ([xshift=1.3em]interior.north west) ;
		\end{tcbclipinterior}%
		}
	}
}

\DeclareTCBListing{PseudoCodeAlt}{ s O{12cm} m }{% étoilée sans numéro, <taille> puis option...
	width=#2,#3,
	stylepseudocodePLalt,
	listing only,listing engine=listings,
	\IfBooleanTF{#1}{}{stylepseudocodePLaltlines},
	listing options={
		style=\IfBooleanTF{#1}{pseudocodenoPLalt}{pseudocodePLalt},%version étoilée sans numéro de lignes
		aboveskip=2pt,belowskip=2pt,
		columns=fullflexible,
		literate={é}{{\'e}}1 {í}{{\'i}}1 {ó}{{\'o}}1% 
		{ú}{{\'u}}1 {Á}{{\'A}}1 {É}{{\'E}}1 {Í}{{\'I}}1 {Ó}{{\'O}}1 {Ú}{{\'U}}1%
		{è}{{\`e}}1 {ì}{{\`i}}1 {ò}{{\`o}}1 {ù}{{\`u}}1%
		{À}{{\`A}}1 {È}{{\'E}}1 {Ì}{{\`I}}1 {Ò}{{\`O}}1 {Ù}{{\`U}}1%
		{ä}{{\"a}}1 {ë}{{\"e}}1 {ï}{{\"i}}1 {ö}{{\"o}}1 {ü}{{\"u}}1%
		{Ä}{{\"A}}1 {Ë}{{\"E}}1 {Ï}{{\"I}}1 {Ö}{{\"O}}1 {Ü}{{\"U}}1%
		{â}{{\^a}}1 {ê}{{\^e}}1 {î}{{\^i}}1 {ô}{{\^o}}1 {û}{{\^u}}1%
		{Â}{{\^A}}1 {Ê}{{\^E}}1 {Î}{{\^I}}1 {Ô}{{\^O}}1 {Û}{{\^U}}1%
		{œ}{{\oe}}1 {Œ}{{\OE}}1 {æ}{{\ae}}1 {Æ}{{\AE}}1 {ß}{{\ss}}1%
		{ű}{{\H{u}}}1 {Ű}{{\H{U}}}1 {ő}{{\H{o}}}1 {Ő}{{\H{O}}}1%
		{ç}{{\c c}}1 {Ç}{{\c C}}1 {ø}{{\o}}1 {å}{{\r a}}1 {Å}{{\r A}}1%
		{€}{{\texteuro}}1 {£}{{\pounds}}1%
		{=}{\textleftarrow}1 {==}{=}1%
		{*}{$\algomathttPL{\times}$}{1}%
	}
}

%%------PRESENTATIONDECODES CLASSIQUES
\NewTCBListing{PresentationCode}{ O{CouleurVertForet} m }{%
	sharp corners=downhill,enhanced,arc=12pt,skin=bicolor,%
	colback=#1!5!white,colframe=#1!75!black,colbacklower=white,%
	attach boxed title to top right={yshift=-\tcboxedtitleheight},title=Code \LaTeX,%
	boxed title style={%
		colframe=#1!75!black,colback=#1!15!white,%
		,sharp corners=downhill,arc=12pt,%
	},%
	fonttitle=\color{#1!90!black}\itshape\ttfamily\footnotesize,%
	listing options={%
		style=tcblatex,basicstyle=\footnotesize\ttfamily,%
		keywordstyle=\bfseries\color{blue},tabsize=2,%
	},%
	#2
}

%%------FakeTerm
%couleurs (inspirées par termsim !)
\definecolor{PLmpurple}{RGB}{48,10,36}
\definecolor{PLmgray}{RGB}{70,72,67}
\definecolor{PLogray}{RGB}{148,147,141}
\definecolor{PLoorange}{RGB}{233,101,56}
\definecolor{PLterminal}{RGB}{80,78,70}
\definecolor{PLlinux}{RGB}{0,39,51}
\definecolor{PLwinblue}{HTML}{1883D7}
\definecolor{PLosxgray}{HTML}{D8D6D9}

%WINDOWS
\tcbset{PLfaketermwin/.style={%
		enhanced,boxrule=1pt,sharp corners,before skip=12pt,after skip=12pt,%
		colframe=PLwinblue,colback=black,colbacktitle=white,colupper=white,coltitle=black,%
		titlerule=0.4pt,left=2pt,top=2pt,bottom=2pt,right=2pt,middle=2pt,%
		fonttitle=\bfseries\small\sffamily
	}
}

\setKVdefault[fakeTERMwin]{Titre={Terminal Windows}}

\newcommand\PLcommandeswin{%
	\begin{tikzpicture}[thick,scale=0.66]
		\draw (0,0)--(1em,0) ; \draw (2em,0) rectangle (3em,1em) ; \draw (4em,1em)--(5em,0) (4em,0)--(5em,1em) ;
	\end{tikzpicture}%
}

\newcommand\termwintitre[1][]{%
	\restoreKV[fakeTERMwin]
	\setKV[fakeTERMwin]{#1}
	\begin{tblr}{colsep=0pt,rowsep=0pt,width=\linewidth,colspec={X[l]r}}
		{\footnotesize\faTerminal}~~\useKV[fakeTERMwin]{Titre} & \PLcommandeswin \\ %
	\end{tblr}
}

\DeclareTCBListing{TerminalWin}{ O{\linewidth} m !O{} }{%<taille> puis {Titre=...} puis [option]
	PLfaketermwin,title={\termwintitre[#2]},%
	listing only,listing engine=listings,%
	listing options={style=tcblatex,language={},basicstyle=\footnotesize\ttfamily},%
	width=#1,#3
}

%LINUX
\newcommand{\PLUbuntuWhite}{%
	\begin{tikzpicture}[thick,anchor=base,baseline]
		\filldraw[PLmgray] (0,0.25em) circle[radius=0.5em] ;
	\end{tikzpicture}%
}
\newcommand{\PLUbuntuMin}{%
	\begin{tikzpicture}[thick,anchor=base,baseline]
		\filldraw[color=PLogray!50!white] (0,0.25em) circle[radius=0.5em];
		\draw[PLterminal](-0.35em,0.25em)--(0.35em,0.25em);
	\end{tikzpicture}%
}
\newcommand{\PLUbuntuClose}{%
	\begin{tikzpicture}[thick,anchor=base,baseline]
		\filldraw[color=PLoorange!70!white] (0,0.25em) circle[radius=0.5em];
		\draw[PLterminal] (-0.32em,-0.07em)--(0.32em,0.57em);
		\draw[PLterminal] (-0.32em,0.57em)--(0.32em,-0.07em);
	\end{tikzpicture}%
}
\newcommand{\PLUbuntuMax}{%
	\begin{tikzpicture}[thick,anchor=base,baseline]
		\filldraw[color=PLogray!50!white] (0,0.25em) circle[radius=0.5em];
		\draw[PLterminal] (-0.32em,0.5em) rectangle (0.32em,0);
	\end{tikzpicture}%
}

\tcbset{PLtermlinux/.style={%
		enhanced,boxrule=1pt,arc=4pt,before skip=12pt,after skip=12pt,%
		colframe=PLmgray,colback=PLmpurple,colbacktitle=PLmgray,colupper=white,coltitle=white,%
		titlerule=0.4pt,left=2pt,top=2pt,bottom=2pt,right=2pt,middle=2pt,%
		fonttitle=\bfseries\small\sffamily
	}
}

\setKVdefault[fakeTERMnux]{Titre={Terminal UNiX}}

\newcommand\termnuxtitre[1][]{%
	\restoreKV[fakeTERMnux]
	\setKV[fakeTERMnux]{#1}
	\begin{tblr}{colsep=0pt,rowsep=0pt,width=\linewidth,colspec={lX[c]r}}
		\PLUbuntuWhite~~\PLUbuntuWhite~~\PLUbuntuWhite & \vphantom{p}\useKV[fakeTERMnux]{Titre} & \PLUbuntuMin~~\PLUbuntuMax~~\PLUbuntuClose \\
	\end{tblr}
}

\DeclareTCBListing{TerminalUnix}{ O{\linewidth} m !O{} }{%<taille> puis {Titre=...} puis [option]
	PLtermlinux,title={\termnuxtitre[#2]},%
	listing only,listing engine=listings,%
	listing options={style=tcblatex,language={},basicstyle=\footnotesize\ttfamily},%
	width=#1,#3
}

%OSX
\tcbset{PLfaketermosx/.style={%
	enhanced,boxrule=1pt,arc=6pt,before skip=12pt,after skip=12pt,%
	colframe=PLosxgray,colback=lightgray!15,colbacktitle=PLosxgray,colupper=black,coltitle=black,%
	titlerule=0.4pt,left=2pt,top=2pt,bottom=2pt,right=2pt,middle=2pt,%
	fonttitle=\bfseries\small\sffamily
	}
}

\newcommand{\PLOSXRed}{%
	\begin{tikzpicture}[thick,anchor=base,baseline]
		\filldraw[red] (0,0.25em) circle[radius=0.45em] ;
	\end{tikzpicture}%
}

\newcommand{\PLOSXOrange}{%
	\begin{tikzpicture}[thick,anchor=base,baseline]
		\filldraw[orange] (0,0.25em) circle[radius=0.45em] ;
	\end{tikzpicture}%
}

\newcommand{\PLOSXgreen}{%
	\begin{tikzpicture}[thick,anchor=base,baseline]
		\filldraw[CouleurVertForet] (0,0.25em) circle[radius=0.45em] ;
	\end{tikzpicture}%
}

\newcommand{\PLOSXLG}{%
	\begin{tikzpicture}[thick,anchor=base,baseline]
		\filldraw[PLosxgray] (0,0.25em) circle[radius=0.45em] ;
	\end{tikzpicture}%
}

\setKVdefault[fakeTERMosx]{titre={Terminal OSX}}

\newcommand\termosxtitre[1][]{%
	\restoreKV[fakeTERMosx]
	\setKV[fakeTERMosx]{#1}
	\begin{tblr}{colsep=0pt,rowsep=0pt,width=\linewidth,colspec={lX[c]r}}
		\PLOSXRed~\PLOSXOrange~\PLOSXgreen & \vphantom{p}\useKV[fakeTERMosx]{Titre} & \PLOSXLG~\PLOSXLG~\PLOSXLG \\
	\end{tblr}
}

\DeclareTCBListing{TerminalOSX}{ O{\linewidth} m !O{} }{%<taille> puis {Titre=...} puis [option]
	PLfaketermosx,title={\termosxtitre[#2]},%
	listing only,listing engine=listings,%
	listing options={style=tcblatex,language={},basicstyle=\footnotesize\ttfamily},%
	width=#1,#3
}

\endinput