% 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{FenetreCas}[2023/11/05 0.1.4 Simuler une fenetre CAS type Geogebra ou Xcas]
% 0.1.4	Passage \tikzstyle vers \tikzset
% 0.1.3	Clé [PosRes] pour positionner la réponse (gauche/centre/droite) + Correction de bugs mineurs.
% 0.1.2	Clés [Select] pour les numéros avec des ronds.
% 0.1.1	Clés [FondCouleur] pour le fond des cases.
% 0.1.0	Version initiale.

%------Option(s)

%------Packages utiles
\RequirePackage{tikz}
\RequirePackage{xstring}
\RequirePackage{xintexpr}
\RequirePackage{simplekv}
\RequirePackage{settobox}
%librairies tikz
\usetikzlibrary{calc,positioning}

%%------FENÊTRE CALCUL FORMEL GEOGEBRA
%compteurs pour les n° de lignes
\newcounter{geogebracfnum}

%--création de l'environnement, en TikZ
\newsavebox{\maboiteggbtitre}
\newlength{\hauteurboiteggbtitre}

%def des clés
\defKV[paramfengeogebracf]{%
	Largeur=\def\GEOCFlarg{#1},%
	CouleurEntete=\def\GEOCFcoulentete{#1},%
	LargeurNumero=\def\GEOCFlargnum{#1},%
	CouleurNumero=\def\GEOCFcoulnum{#1},%
	PoliceEntete=\def\GEOCFfontenete{#1},%
	PoliceNumero=\def\GEOCFpolnum{#1},%
	Titre=\def\GEOCFtitre{#1}
}
\setKVdefault[paramfengeogebracf]{%
	Largeur=10,%
	CouleurEntete=lightgray!25,%
	LargeurNumero=1,%
	CouleurNumero=cyan!5,%
	PoliceEntete=\bfseries\large\sffamily,%
	PoliceNumero=\large\sffamily,%
	Titre={$\triangleright$ Calcul formel},%
	Entete=true
}

\NewDocumentEnvironment{CalculFormelGeogebra}{ O{} D<>{} }
{%
	\useKVdefault[paramfengeogebracf]%
	\setKV[paramfengeogebracf]{#1}% on paramètres les nouvelles clés et on les simplifie
	\setcounter{geogebracfnum}{0}%on repart avec le compteur à 0
	\sbox{\maboiteggbtitre}{\GEOCFfontenete\GEOCFtitre}\settoboxtotalheight{\hauteurboiteggbtitre}{\maboiteggbtitre}
	\begin{tikzpicture}[#2]
		%ENTETE
		\ifboolKV[paramfengeogebracf]{Entete}
			{
				\def\HCroix{\the\hauteurboiteggbtitre}%
				\draw[semithick,fill=\GEOCFcoulentete] (0,0) rectangle (\GEOCFlarg,{2.25*\the\hauteurboiteggbtitre}) ;%
				\draw (0,{2.25*0.5*\the\hauteurboiteggbtitre}) node[right=4pt,font=\GEOCFfontenete] {\GEOCFtitre} ;%
				%crois fermeture
				\coordinate (CROIXGEO) at ($({\GEOCFlarg},{2.25*0.5*\the\hauteurboiteggbtitre})+({-\the\hauteurboiteggbtitre},0)$) ;
				\draw[semithick] ($(CROIXGEO)+({-0.35*\the\hauteurboiteggbtitre},{0.35*\the\hauteurboiteggbtitre})$)--++({0.7*\HCroix},{-0.7*\HCroix}) ;
				\draw[semithick] ($(CROIXGEO)+({-0.35*\the\hauteurboiteggbtitre},{-0.35*\the\hauteurboiteggbtitre})$)--++({0.7*\HCroix},{0.7*\HCroix}) ;
				\draw[semithick] ($(CROIXGEO)+({-0.5*\the\hauteurboiteggbtitre},{0.5*\the\hauteurboiteggbtitre})$)rectangle++({\HCroix},{-\HCroix}) ;
			}
			{}
}%
{%
	\end{tikzpicture}%
}

%--création des lignes, une par une
%commande externe pour les hauteurs
\newsavebox{\maboiteggbcmd}
\newsavebox{\maboiteggbres}
\newlength{\hauteurboiteggbcmd}
\newlength{\hauteurboiteggbres}
\newlength{\offsetcfgeogebra}

%def des clés
\defKV[paramlgeogebra]{%
	HauteurLigne=\def\GEOCFhauteur{#1},%
	TailleCommande=\def\GEOCFtaillecmd{#1},%
	TailleResultat=\def\GEOCFtailleres{#1},%
	ElargirAuto=\def\GEOCFelargirauto{#1},%
	MargeV=\def\GEOCFoffset{#1},%
	MargeH=\def\GEOCFoffseth{#1},%
	CouleurFond=\def\GEOCFcolfond{#1},%
	CouleurSelect=\def\GEOCFcolselect{#1},%
	PosRes=\def\GEOCFposrep{#1}
}
\setKVdefault[paramlgeogebra]{%
	HauteurLigne=2,%
	TailleCommande=\normalsize,%
	TailleResultat=\large,%
	ElargirAuto=1,%
	HauteurAuto=true,%
	MargeV=6pt,%
	MargeH=0.2,%
	Fond=false,%
	CouleurFond=white,%
	Select=true,%
	CouleurSelect=white,%
	PosRes=gauche
}

\NewDocumentCommand\LigneCalculsGeogebra{ O{} m m }{%
	%clés
	\useKVdefault[paramlgeogebra]%
	\setKV[paramlgeogebra]{#1}% on paramètres les nouvelles clés et on les simplifie
	%récupération des tailles des lignes cmd et res poour ajustement
	\setlength{\offsetcfgeogebra}{\GEOCFoffset}
	\ifboolKV[paramlgeogebra]{HauteurAuto}
		{%
			\sbox{\maboiteggbcmd}{\pgfinterruptpicture \GEOCFtaillecmd#2\endpgfinterruptpicture}\settoboxtotalheight{\hauteurboiteggbcmd}{\maboiteggbcmd}
			\sbox{\maboiteggbres}{\pgfinterruptpicture \GEOCFtailleres#3\endpgfinterruptpicture}\settoboxtotalheight{\hauteurboiteggbres}{\maboiteggbres}
			\def\GEOCFhauteur{\GEOCFelargirauto*(\the\hauteurboiteggbcmd+\the\hauteurboiteggbres+4*\the\offsetcfgeogebra)}
		}
		{}
	%compteur et raccourcis
	\addtocounter{geogebracfnum}{1}%
	\def\GGBL{\thegeogebracfnum}%
	\def\GGBLA{\inteval{\GGBL-1}}%
	%déclaration des nœuds (les "4" coins des blocs numéros)
	\xintifboolexpr{\GGBL == 1}%si c'est la première ligne
		{\coordinate (A0\GGBL) at (0,0);}
		{\coordinate (A0\GGBL) at (A1\GGBLA) ;}
	\coordinate (A1\GGBL) at ($(A0\GGBL) + (0,{-\GEOCFhauteur})$);
	\coordinate (A2\GGBL) at ($(A0\GGBL) + ({\GEOCFlargnum},0)$);
	\coordinate (A3\GGBL) at ($(A1\GGBL) + ({\GEOCFlargnum},0)$);
	\coordinate (AH\GGBL) at ($(A0\GGBL) + ({0.5*\GEOCFlargnum},{-0.33*\GEOCFhauteur})$);
	\coordinate (AM\GGBL) at ($(A0\GGBL) + ({0.5*\GEOCFlargnum},{-0.5*\GEOCFhauteur})$);
	\coordinate (AB\GGBL) at ($(A0\GGBL) + ({0.5*\GEOCFlargnum},{-0.66*\GEOCFhauteur})$);
	%les tracés
	\ifboolKV[paramlgeogebra]{Select}%si on choisit les petits ronds par défaut ^^
		{%
			\draw[semithick,fill=\GEOCFcoulnum] (A0\GGBL) rectangle (A3\GGBL) ; %
			\draw[semithick,draw=black,fill=\GEOCFcolselect] ($(AM\GGBL) + (0,-0.375)$) circle[radius=4pt] ;%
			\draw[black] ($(AM\GGBL) + (0,0.375)$) node[font=\GEOCFpolnum] {\GGBL} ;%
			
		}%
		{%
			\draw[semithick,fill=\GEOCFcoulnum] (A0\GGBL) rectangle (A3\GGBL) node[midway,font=\GEOCFpolnum] {\GGBL} ;%
		}%
	\ifboolKV[paramlgeogebra]{Fond}
		{\draw[semithick,fill=\GEOCFcolfond] (A2\GGBL) rectangle++({\GEOCFlarg-\GEOCFlargnum},{-\GEOCFhauteur}) ;}
		{\draw[semithick] (A2\GGBL) rectangle++({\GEOCFlarg-\GEOCFlargnum},{-\GEOCFhauteur}) ;}
	%les commande/résultat
	\ifboolKV[paramlgeogebra]{HauteurAuto}
		{%
			%commande
			\draw ($(A2\GGBL) + ({\GEOCFoffseth},{-\the\offsetcfgeogebra-0.5*\GEOCFelargirauto*\the\hauteurboiteggbcmd})$) node[font=\GEOCFtaillecmd,right] {#2} ;
			%résultat
			\IfStrEq{\GEOCFposrep}{gauche}
				{%
					\draw ($(A3\GGBL) + ({\GEOCFoffseth},{\the\offsetcfgeogebra+0.5*\GEOCFelargirauto*\the\hauteurboiteggbres})$) node[font=\GEOCFtailleres,right] {#3} ;
				}{}%
			\IfStrEq{\GEOCFposrep}{droite}
				{%
					\draw ($(A3\GGBL) + ({\GEOCFlarg-\GEOCFlargnum},0) + ({-\GEOCFoffseth},{\the\offsetcfgeogebra+0.5*\GEOCFelargirauto*\the\hauteurboiteggbres})$) node[font=\GEOCFtailleres,left] {#3} ;
					%\draw ($(A3\GGBL) + ({\GEOCFlarg-\GEOCFlargnum},0) + ({-\GEOCFoffseth},{\the\offsetcfgeogebra+0.5*\GEOCFelargirauto*\the\hauteurboiteggbres})$) node[font=\GEOCFtailleres,left] {#3} ;
				}{}%
			\IfStrEq{\GEOCFposrep}{centre}
				{%
					\draw ($(A3\GGBL) + ({0.5*(\GEOCFlarg-\GEOCFlargnum)},{\the\offsetcfgeogebra+0.5*\GEOCFelargirauto*\the\hauteurboiteggbres})$) node[font=\GEOCFtailleres] {#3} ;
				}{}%
		}%
		{%
			%commande
			\draw ($(A2\GGBL) + ({\GEOCFoffseth},{-0.25*\GEOCFhauteur})$) node[font=\GEOCFtaillecmd,right] {#2} ;
			%résultat
			\IfStrEq{\GEOCFposrep}{gauche}
				{%
					\draw ($(A2\GGBL) + ({\GEOCFoffseth},{-0.66*\GEOCFhauteur})$) node[font=\GEOCFtailleres,right] {#3} ;
				}{}%
			\IfStrEq{\GEOCFposrep}{droite}
				{%
					\draw ($(A2\GGBL) + ({\GEOCFlarg-\GEOCFlargnum},0) + ({-\GEOCFoffseth},{-0.66*\GEOCFhauteur})$) node[font=\GEOCFtailleres,left] {#3} ;
				}{}%
			\IfStrEq{\GEOCFposrep}{centre}
				{%
					\draw ($(A2\GGBL) + ({0.5*(\GEOCFlarg-\GEOCFlargnum)},0) + (0,{-0.66*\GEOCFhauteur})$) node[font=\GEOCFtailleres] {#3} ;
				}%
				{}%
		}
}

%%------FENÊTRE CALCUL FORMEL XCAS
\newcounter{xcascfnum}
%def des clés
\defKV[paramfenxcascf]{%
	Largeur=\def\XCCFlarg{#1},%
	EspaceLg=\def\XCCFesplg{#1},%
	Couleur=\def\XCCFcouleur{#1},%
	PoliceEntete=\def\XCCFfontenete{#1},%
	TexteOptions=\def\XCCFtxtopts{#1}
}
\setKVdefault[paramfenxcascf]{%
	Largeur=14,%
	EspaceLg=2pt,%
	Couleur=darkgray,%
	Menu=true,%
	Entete=true,%
	NoirBlanc=false,%
	PoliceEntete=\scriptsize,%
	Sep=true,%
	TexteOptions={Config : exact real RAD 12 xcas}
}

\NewDocumentEnvironment{CalculFormelXcas}{ O{} D<>{} }
{%
	\useKVdefault[paramfenxcascf]%
	\setKV[paramfenxcascf]{#1}% on paramètres les nouvelles clés et on les simplifie
	\setcounter{xcascfnum}{0}%on repart avec le compteur à 0
	%couleurs
	\ifboolKV[paramfenxcascf]{NoirBlanc}%si NB=true
		{
			\def\CoulXCASPt{lightgray!20}\def\CoulXCASSave{lightgray!20}\def\CoulXCASMid{lightgray!20}\def\CoulXCASStop{black}
		}
		{
			\def\CoulXCASPt{cyan!20}\def\CoulXCASSave{green!20}\def\CoulXCASMid{violet!20}\def\CoulXCASStop{red}
		}
	\begin{tikzpicture}[#2]
		\tikzset{xcastitre/.style={font=\XCCFfontenete\ttfamily,inner sep=1pt,outer sep=0pt}}%
		%\tikzstyle{xcastitre}=[font=\XCCFfontenete\ttfamily,inner sep=1pt,outer sep=0pt]
		%LE BLOC "TITRE"
		\ifboolKV[paramfenxcascf]{Entete}%si titre=true
			{%
				\node[semithick,draw=\XCCFcouleur,fill=\CoulXCASPt,above right,xcastitre] (PTIN) at ($(0,0)+(0,2pt)$) {\strut {\,?\,}} ;
				\node[semithick,draw=\XCCFcouleur,fill=\CoulXCASSave,xcastitre,right=2pt] (SAUV) at (PTIN.east) {\strut \,Sauver\,} ;
				\node[semithick,draw=\XCCFcouleur,fill=lightgray!20,xcastitre,above left] (CLOSE) at ($({\XCCFlarg},0)+(0,2pt)$) {\strut \,$\mathtt{\times}$\,} ;
				\node[semithick,draw=\XCCFcouleur,fill=lightgray!20,xcastitre,left=6pt] (KBD) at (CLOSE.west) {\strut \:\:Kbd\:\:} ;
				\node[semithick,draw=\XCCFcouleur,fill=lightgray!20,xcastitre,left=2pt] (STOP) at (KBD.west) {\strut \,\textcolor{\CoulXCASStop}{STOP}\,} ;
				\draw[semithick,\XCCFcouleur,fill=\CoulXCASMid] ($(SAUV.north east)+({2pt},0)$) rectangle ($(STOP.south west)+({-2pt},0)$) node[midway,xcastitre,black] {\strut \XCCFtxtopts} ;
			}
			{}
}%
{%
	\end{tikzpicture}%
}

\newsavebox{\maboitecmdxcas}
\newsavebox{\maboiteresxcas}
\newlength{\hauteurboitecmdxcas}
\newlength{\hauteurboiteresxcas}
\newlength{\offsetcfxcas}

\defKV[paramlgxcas]{%
	TailleCommande=\def\XCCFtaillecmd{#1},%
	TailleResultat=\def\XCCFtailleres{#1},%
	ElargirAuto=\def\XCCFelargirauto{#1},%
	MargeV=\def\XCCFoffset{#1},%
	MargeH=\def\XCCFoffseth{#1},%
	CouleurCmd=\def\XCCFcoulcmd{#1},%
	CouleurRes=\def\XCCFcoulres{#1},%
	PosRes=\def\XCCFposres{#1},%
	CouleurFond=\def\XCCFcolfond{#1}
}

\setKVdefault[paramlgxcas]{%
	TailleCommande=\normalsize,%
	TailleResultat=\large,%
	ElargirAuto=1,%
	MargeV=6pt,%
	MargeH=0.15,%
	CouleurCmd=red,%
	CouleurRes=blue,%
	PosRes=centre,%
	Fond=false,%
	CouleurFond=white
}

\NewDocumentCommand\LigneCalculsXcas{ O{} m m }{%
	%clés
	\useKVdefault[paramlgxcas]%
	\setKV[paramlgxcas]{#1}% on paramètres les nouvelles clés et on les simplifie
	%récupération des tailles des lignes cmd et res poour ajustement
	\setlength{\offsetcfxcas}{\XCCFoffset}
	\sbox{\maboitecmdxcas}{\pgfinterruptpicture \XCCFtaillecmd #2\endpgfinterruptpicture}\settoboxtotalheight{\hauteurboitecmdxcas}{\maboitecmdxcas}
	\sbox{\maboiteresxcas}{\pgfinterruptpicture \XCCFtailleres #3\endpgfinterruptpicture}\settoboxtotalheight{\hauteurboiteresxcas}{\maboiteresxcas}
	\def\XCCFhauteur{\XCCFelargirauto*(\the\hauteurboitecmdxcas+\the\hauteurboiteresxcas+4*\the\offsetcfxcas)}
	%couleurs forcées
	\ifboolKV[paramfenxcascf]{NoirBlanc}%si NB=true
		{\def\XCCFcoulcmd{black}\def\XCCFcoulres{black}}{}
	%compteur et raccourcis
	\addtocounter{xcascfnum}{1}%
	\def\XCL{\thexcascfnum}%
	\def\XCLA{\inteval{\XCL-1}}%
	%déclaration des nœuds (les "4" coins des blocs numéros)
	\xintifboolexpr{\XCL == 1}%si c'est la première ligne
		{\coordinate (A0\XCL) at (0,0);}
		{\coordinate (A0\XCL) at ($(A1\XCLA)+(0,{-\XCCFesplg})$) ;}
	\coordinate (A1\XCL) at ($(A0\XCL) + (0,{-\XCCFhauteur})$);
	\coordinate (A2\XCL) at ($(A0\XCL) + ({\XCCFlarg},0)$);
	\coordinate (A3\XCL) at ($(A1\XCL) + ({\XCCFlarg},0)$);
	%les tracés
	\ifboolKV[paramlgxcas]{Fond}%si on met une couleur de fond
		{%
			\IfSubStr{\XCCFcolfond}{/}%
				{\StrCut{\XCCFcolfond}{/}{\XCCFcolfondC}{\XCCFcolfondR}}%
				{\def\XCCFcolfondC{\XCCFcolfond}\def\XCCFcolfondR{\XCCFcolfond}}%
			\draw[semithick,\XCCFcouleur,fill=\XCCFcolfondC] (A0\XCL) rectangle++ ($(0,{-2*\the\offsetcfxcas-\XCCFelargirauto*\the\hauteurboitecmdxcas})+({\XCCFlarg},0)$) ;%
			\draw[semithick,\XCCFcouleur,fill=\XCCFcolfondR] ($(A0\XCL)+(0,{-2*\the\offsetcfxcas-\XCCFelargirauto*\the\hauteurboitecmdxcas})$) rectangle (A3\XCL) ;%
		}
		{\draw[semithick,\XCCFcouleur] (A0\XCL) rectangle (A3\XCL) ;}
	%LA COMMANDE À GAUCHE
	\draw ($(A0\XCL) + ({\XCCFoffseth},{-\the\offsetcfxcas-0.5*\XCCFelargirauto*\the\hauteurboitecmdxcas})$) node[\XCCFcoulcmd,font=\XCCFtaillecmd,right] {#2} ;
	%LE RÉSULTAT
	\IfStrEq{\XCCFposres}{centre}%si posrep=center
		{%
			\draw ($(A1\XCL) + ({0.5*\XCCFlarg},{\the\offsetcfxcas+0.5*\XCCFelargirauto*\the\hauteurboiteresxcas})$) node[\XCCFcoulres,font=\XCCFtailleres] {#3} ;
		}{}
	\IfStrEq{\XCCFposres}{gauche}%si posrep=left
		{%
			\draw ($(A1\XCL) + ({{\XCCFoffseth}},{\the\offsetcfxcas+0.5*\XCCFelargirauto*\the\hauteurboiteresxcas})$) node[\XCCFcoulres,font=\XCCFtailleres,right] {#3} ;
		}{}
	\IfStrEq{\XCCFposres}{droite}%si posrep=right
		{%
			\ifboolKV[paramfenxcascf]{Menu}%si menu=true
				{%
					\draw ($(A1\XCL) + ({\XCCFlarg-1},0) + ({-\XCCFoffseth},{\the\offsetcfxcas+0.5*\XCCFelargirauto*\the\hauteurboiteresxcas})$) node[\XCCFcoulres,font=\XCCFtailleres,left] {#3} ;
				}%
				{%
					\draw ($(A1\XCL) + ({\XCCFlarg},0) + ({-\XCCFoffseth},{\the\offsetcfxcas+0.5*\XCCFelargirauto*\the\hauteurboiteresxcas})$) node[\XCCFcoulres,font=\XCCFtailleres,left] {#3} ;
				}%
		}{}
	%LA LIGNE DE SÉPARATION
	\ifboolKV[paramfenxcascf]{Sep}%si sep=true
		{\draw[semithick,\XCCFcouleur] ($(A0\XCL)+(0,{-2*\the\offsetcfxcas-\XCCFelargirauto*\the\hauteurboitecmdxcas})$)--++({\XCCFlarg},0);}
		{}
	%LE BOUTON MENU
	\ifboolKV[paramfenxcascf]{Menu}%si menu=true
		{
			\draw[semithick] (A3\XCL) node[draw=\XCCFcouleur,black,fill=lightgray!25,outer sep=0pt,inner sep=2pt,draw,above left,font=\tiny\sffamily\bfseries] {MENU} ;
		}{}
	%LE PETIT NUMÉRO
	\draw[semithick] (A0\XCL) node[draw=\XCCFcouleur,fill=\CoulXCASMid,outer sep=0pt,inner sep=2pt,draw,below left,font=\footnotesize\sffamily] {\XCL} ;
}

\endinput