%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%                                                               %
%    	pas-tableur.sty  v2.00     encodage : UTF8      	       %
%                                                               %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%                                                               %
%           	Créé par Stéphane PASQUET 		          			 %
%                                                               %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 
\def\fileversion{2.00}
\def\filedate{2014/08/16}
\NeedsTeXFormat{LaTeX2e}[1999/12/01]
\ProvidesClass{pas-tableur}[%
  \filedate\space v\fileversion\space
  LaTeX package by Stephane PASQUET]
\@ifpackageloaded{tikz}{}{\RequirePackage{tikz}}
\usetikzlibrary{calc}
\@ifpackageloaded{xstring}{}{\RequirePackage{xstring}}
\@ifpackageloaded{xkeyval}{}{\RequirePackage{xkeyval}}


% Définition des couleurs

\definecolor{grayTopCell}{cmyk}{0.08,0.05,0.06,0}
\definecolor{grayBottomCell}{cmyk}{0.1,0.07,0.08,0}
\definecolor{graySepCell}{cmyk}{0.29,0.21,0.21,0}
\definecolor{blueSelecCellTop}{cmyk}{0.52,0.17,0,0}
\definecolor{blueSelecCellBottom}{cmyk}{0.75,0.34,0,0}
\definecolor{blueSelec}{cmyk}{0.23,0.06,0,0}

% Définition des dimensions par défaut

\def\col@width{7em}
\def\numline@width{3em} % largeur de la colonne indiquant le numéros des lignes
\def\line@height{1.57em}

	%==> Changer les valeurs par défaut
	\newcommand*{\tabcolwidth}[1]{\def\col@width{#1}}
	\newcommand*{\tabnumlinewidth}[1]{\def\numline@width{#1}}
	\newcommand*{\tablineheight}[1]{\def\line@height{#1}}
	
% Définition des polices de caractères

\newcommand{\helvbx}{\usefont{T1}{phv}{m}{n}}

% Construction du tableur

	%==> Style des cellules
	\tikzstyle{celempty} = [outer sep=0pt]
	\tikzstyle{celhead} = [draw=black,rectangle,outer sep=0pt]
	
	%==> Macro de redirection : étoilée ou pas étoilée ?
	\newcommand{\tableur}{\@ifstar{\tableur@star}{\tableur@nostar}}

	%==> Macro étoilée : \tableur*{A/<l1>,B/<l2>,...}. Tableur avec colonnes de largeurs différentes
	\newcommand{\tableur@star}[2][1] 
	{%
		\xdef\list@of@col{#2}
		% Placement de la première cellule en-tête
		\StrChar{#2}{1}[\first@name]
		\StrBetween{#2}{/}{,}[\first@width]
		\node[minimum width={\first@width},minimum height=\line@height,celhead] (\first@name) {\helvbx\first@name};
		\fill[grayBottomCell] 
					(\first@name.south west) -- 
					(\first@name.south east) -- 
					($0.5*(\first@name.south east)+0.5*(\first@name.north east)$) -- 
					($0.5*(\first@name.south west)+0.5*(\first@name.north west)$) --
					cycle;
				\fill[grayTopCell] 
					(\first@name.north west) -- 
					(\first@name.north east) -- 
					($0.5*(\first@name.south east)+0.5*(\first@name.north east)$) -- 
					($0.5*(\first@name.south west)+0.5*(\first@name.north west)$) --
					cycle;
		\node[minimum width={\first@width},minimum height=\line@height,celhead] at (\first@name) {\helvbx\first@name};
		
		% Placement des autres en-têtes de colonnes
		
		\foreach \name/\w [remember=\name as \lastname,count=\colnumber] in {#2}
		{
			\ifx\name\first@name
			\else
				\node[minimum width={\w},minimum height=\line@height,celhead,right] (\name) at (\lastname.east) {\helvbx\name};
				\fill[grayBottomCell] 
					(\name.south west) -- 
					(\name.south east) -- 
					($0.5*(\name.south east)+0.5*(\name.north east)$) -- 
					($0.5*(\name.south west)+0.5*(\name.north west)$) --
					cycle;
				\fill[grayTopCell] 
					(\name.north west) -- 
					(\name.north east) -- 
					($0.5*(\name.south east)+0.5*(\name.north east)$) -- 
					($0.5*(\name.south west)+0.5*(\name.north west)$) --
					cycle;
				\node[minimum width={\w},minimum height=\line@height,celhead,right] at (\lastname.east) {\helvbx\name};
			\fi
		}
		
		% Placement des en-têtes de lignes
		
		\node[below left,celhead,minimum width=\numline@width,minimum height=\line@height] (numline1) at (\first@name.south west) {\helvbx 1};
		\fill[grayBottomCell] 
					(numline1.south west) -- 
					(numline1.south east) -- 
					($0.5*(numline1.south east)+0.5*(numline1.north east)$) -- 
					($0.5*(numline1.south west)+0.5*(numline1.north west)$) --
					cycle;
		\fill[grayTopCell] 
					(numline1.north west) -- 
					(numline1.north east) -- 
					($0.5*(numline1.south east)+0.5*(numline1.north east)$) -- 
					($0.5*(numline1.south west)+0.5*(numline1.north west)$) --
					cycle;
		\node[below left,celhead,minimum width=\numline@width,minimum height=\line@height] (numline1) at (\first@name.south west) {\helvbx1};
		\ifnum#1>1
			\foreach \num@line [remember=\num@line as \lastnum (initially 1)] in {2,...,#1}
			{
				\node[below,celhead,minimum width=\numline@width,minimum height=\line@height] (numline\num@line) at (numline\lastnum.south) {\helvbx\num@line};
				\fill[grayBottomCell] 
					(numline\num@line.south west) -- 
					(numline\num@line.south east) -- 
					($0.5*(numline\num@line.south east)+0.5*(numline\num@line.north east)$) -- 
					($0.5*(numline\num@line.south west)+0.5*(numline\num@line.north west)$) --
					cycle;
				\fill[grayTopCell] 
					(numline\num@line.north west) -- 
					(numline\num@line.north east) -- 
					($0.5*(numline\num@line.south east)+0.5*(numline\num@line.north east)$) -- 
					($0.5*(numline\num@line.south west)+0.5*(numline\num@line.north west)$) --
					cycle;
				\node[below,celhead,minimum width=\numline@width,minimum height=\line@height] (numline\num@line) at (numline\lastnum.south) {\helvbx\num@line};
			}
		\fi
		
		% Tracé de la grille
		
		\foreach \name/\w in {#2}
		{
			\node[celempty,below,minimum height=\line@height,minimum width=\w] (cell\name-1) at (\name.south) {};
			\draw[graySepCell] ($(cell\name-1.south west)+(0.25pt,0)$) -- (cell\name-1.south east) -- ($(cell\name-1.north east)+(0,-0.25pt)$);
		}
		\ifnum#1>1
			\foreach\numline [remember=\numline as \lastnumline (initially 1)] in {2,...,#1}
			{
				\foreach \name/\w in {#2}
				{
					\node[celempty,below,minimum height=\line@height,minimum width=\w] (cell\name-\numline) at (cell\name-\lastnumline.south) {};
					\draw[graySepCell] ($(cell\name-\numline.south west)+(0.25pt,0)$) -- (cell\name-\numline.south east) -- ($(cell\name-\numline.north east)+(0,-0.25pt)$);
				}
			}
		\fi
	} % --> Fin de \tableur*
	
	%==> Macro non étoilée : \tableur{A,B,C,...} ou \tableur{A-C}
	
	%----------> Liste des noms de colonnes <----------
	\xdef\col@names{ABCDEFGHIJKLMNOPQRSTUVWXYZ}
	
	\newcommand{\tableur@nostar}[2][1] % [#1] -> nombre de lignes (par défaut, "1"), #2 -> A,B,...,Z
	{%
		\IfSubStr{#2}{-}
		{%
			\StrBefore{#2}{-}[\str@start] % 1ère lettre, par ex. "G"
			\StrBehind{#2}{-}[\str@end]	  % 2ème lettre, par ex. "L"
			\StrBetween{\col@names}{\str@start}{\str@end}[\str@col] %  retourne par exemple "HIJK"
			\edef\str@col{\str@start\str@col\str@end} % retourne alors "GHIJKL"
			\StrLen{\str@col}[\nb@columns] % nombre de colonnes
			% --> On place la première cellule en-tête
			\node[minimum width={\col@width},minimum height=\line@height,celhead] (\str@start) {\helvbx\str@start};
			\fill[grayBottomCell] 
					(\str@start.south west) -- 
					(\str@start.south east) -- 
					($0.5*(\str@start.south east)+0.5*(\str@start.north east)$) -- 
					($0.5*(\str@start.south west)+0.5*(\str@start.north west)$) --
					cycle;
			\fill[grayTopCell] 
					(\str@start.north west) -- 
					(\str@start.north east) -- 
					($0.5*(\str@start.south east)+0.5*(\str@start.north east)$) -- 
					($0.5*(\str@start.south west)+0.5*(\str@start.north west)$) --
					cycle;
			\node[minimum width={\col@width},minimum height=\line@height,celhead] at (\str@start) {\helvbx\str@start};
			% --> On place les autres en-têtes
			\foreach \i [remember=\i as \lasti (initially 1)] in {2,...,\nb@columns}
			{
				\StrChar{\str@col}{\i}[\name]
				\StrChar{\str@col}{\lasti}[\lastname]
				\node[minimum width={\col@width},minimum height=\line@height,celhead,right] (\name) at (\lastname.east) {\helvbx\name};
				\fill[grayBottomCell] 
					(\name.south west) -- 
					(\name.south east) -- 
					($0.5*(\name.south east)+0.5*(\name.north east)$) -- 
					($0.5*(\name.south west)+0.5*(\name.north west)$) --
					cycle;
				\fill[grayTopCell] 
					(\name.north west) -- 
					(\name.north east) -- 
					($0.5*(\name.south east)+0.5*(\name.north east)$) -- 
					($0.5*(\name.south west)+0.5*(\name.north west)$) --
					cycle;
				\node[minimum width={\col@width},minimum height=\line@height,celhead] at (\name) {\helvbx\name};
			}
		}
		{
			\StrChar{#2}{1}[\str@start]
			\node[minimum width={\col@width},minimum height=\line@height,celhead] (\str@start) {\helvbx\str@start};
			\fill[grayBottomCell] 
					(\str@start.south west) -- 
					(\str@start.south east) -- 
					($0.5*(\str@start.south east)+0.5*(\str@start.north east)$) -- 
					($0.5*(\str@start.south west)+0.5*(\str@start.north west)$) --
					cycle;
			\fill[grayTopCell] 
					(\str@start.north west) -- 
					(\str@start.north east) -- 
					($0.5*(\str@start.south east)+0.5*(\str@start.north east)$) -- 
					($0.5*(\str@start.south west)+0.5*(\str@start.north west)$) --
					cycle;
			\node[minimum width={\col@width},minimum height=\line@height,celhead] at (\str@start) {\helvbx\str@start};
			
			\foreach \name [remember=\name as \lastname] in {#2}
			{
				\ifx\name\str@start
				\else
					\node[minimum width={\col@width},minimum height=\line@height,celhead,right] (\name) at (\lastname.east)  {\helvbx\name};
					\fill[grayBottomCell] 
						(\name.south west) -- 
						(\name.south east) -- 
						($0.5*(\name.south east)+0.5*(\name.north east)$) -- 
						($0.5*(\name.south west)+0.5*(\name.north west)$) --
						cycle;
					\fill[grayTopCell] 
						(\name.north west) -- 
						(\name.north east) -- 
						($0.5*(\name.south east)+0.5*(\name.north east)$) -- 
						($0.5*(\name.south west)+0.5*(\name.north west)$) --
						cycle;
					\node[minimum width={\col@width},minimum height=\line@height,celhead] at (\name) {\helvbx\name};
				\fi
			}
		}
		
		
		% Placement des en-têtes de lignes
		
		\StrChar{#2}{1}[\first@name]
		\node[below left,celhead,minimum width=\numline@width,minimum height=\line@height] (numline1) at (\first@name.south west) {\helvbx 1};
		\fill[grayBottomCell] 
					(numline1.south west) -- 
					(numline1.south east) -- 
					($0.5*(numline1.south east)+0.5*(numline1.north east)$) -- 
					($0.5*(numline1.south west)+0.5*(numline1.north west)$) --
					cycle;
		\fill[grayTopCell] 
					(numline1.north west) -- 
					(numline1.north east) -- 
					($0.5*(numline1.south east)+0.5*(numline1.north east)$) -- 
					($0.5*(numline1.south west)+0.5*(numline1.north west)$) --
					cycle;
		\node[below left,celhead,minimum width=\numline@width,minimum height=\line@height] (numline1) at (\first@name.south west) {\helvbx1};
		\ifnum#1>1
			\foreach \num@line [remember=\num@line as \lastnum (initially 1)] in {2,...,#1}
			{
				\node[below,celhead,minimum width=\numline@width,minimum height=\line@height] (numline\num@line) at (numline\lastnum.south) {\helvbx\num@line};
				\fill[grayBottomCell] 
					(numline\num@line.south west) -- 
					(numline\num@line.south east) -- 
					($0.5*(numline\num@line.south east)+0.5*(numline\num@line.north east)$) -- 
					($0.5*(numline\num@line.south west)+0.5*(numline\num@line.north west)$) --
					cycle;
				\fill[grayTopCell] 
					(numline\num@line.north west) -- 
					(numline\num@line.north east) -- 
					($0.5*(numline\num@line.south east)+0.5*(numline\num@line.north east)$) -- 
					($0.5*(numline\num@line.south west)+0.5*(numline\num@line.north west)$) --
					cycle;
				\node[below,celhead,minimum width=\numline@width,minimum height=\line@height] (numline\num@line) at (numline\lastnum.south) {\helvbx\num@line};
			}
		\fi
		
		% Tracé de la grille
		
		\IfSubStr{#2}{-}
		{%
			\foreach \i in {1,...,\nb@columns}
			{
				\StrChar{\str@col}{\i}[\name]
				\node[celempty,below,minimum height=\line@height,minimum width=\col@width] (cell\name-1) at (\name.south) {};
				\draw[graySepCell] ($(cell\name-1.south west)+(0.25pt,0)$) -- (cell\name-1.south east) -- ($(cell\name-1.north east)+(0,-0.25pt)$);
			}
			\ifnum#1>1
				\foreach\numline [remember=\numline as \lastnumline (initially 1)] in {2,...,#1}
				{
					\foreach \i in {1,...,\nb@columns}
					{
						\StrChar{\str@col}{\i}[\name]
						\node[celempty,below,minimum height=\line@height,minimum width=\col@width] (cell\name-\numline) at (cell\name-\lastnumline.south) {};
						\draw[graySepCell] ($(cell\name-\numline.south west)+(0.25pt,0)$) -- (cell\name-\numline.south east) -- ($(cell\name-\numline.north east)+(0,-0.25pt)$);
					}
				}
			\fi	
		}
		{%
			\foreach \name in {#2}
			{
				\node[celempty,below,minimum height=\line@height,minimum width=\col@width] (cell\name-1) at (\name.south) {};
				\draw[graySepCell] ($(cell\name-1.south west)+(0.25pt,0)$) -- (cell\name-1.south east) -- ($(cell\name-1.north east)+(0,-0.25pt)$);
			}
			\ifnum#1>1
				\foreach\numline [remember=\numline as \lastnumline (initially 1)] in {2,...,#1}
				{
					\foreach \name in {#2}
					{
						\node[celempty,below,minimum height=\line@height,minimum width=\col@width] (cell\name-\numline) at (cell\name-\lastnumline.south) {};
						\draw[graySepCell] ($(cell\name-\numline.south west)+(0.25pt,0)$) -- (cell\name-\numline.south east) -- ($(cell\name-\numline.north east)+(0,-0.25pt)$);
					}
				}
			\fi
		}
}
	
% Insérer quelque chose dans une cellule

\define@cmdkey [PAS] {celtxt} {width}{}
\define@cmdkey [PAS] {celtxt} {color}{}
\define@boolkey [PAS] {celtxt} {l}[true]{}
\define@boolkey [PAS] {celtxt} {r}[true]{}
\define@boolkey [PAS] {celtxt} {c}[true]{} 
\presetkeys    [PAS] {celtxt} {width = \col@width, color=black}{}

\newcommand*{\celtxt}[1][]{\cel@txt[#1]}

\newcommand\cel@txt[3][]{%
	\setkeys[PAS]{celtxt}{#1}
   \begingroup
   \@makeother\^%
   \@makeother\$%
   \@celtxt@[#1]{#2}{#3}%
}
\newcommand\@celtxt@[4][]{%
   \endgroup
   \setkeys[PAS]{celtxt}{#1}
   \StrPosition{#4}{=}[\@equalPos]
   \ifnum\@equalPos=1
      %\def\@scale{1}%
      \let\@style\texttt
   \else
      %\def\@scale{0.9}%
      \let\@style\@empty
   \fi
   \ifPAS@celtxt@c
   	\def\pos@align{c}
   \else
   	\ifPAS@celtxt@r
   		\def\pos@align{r}
   	\else
   		\def\pos@align{l}
   	\fi
   \fi
   \node at (cell#2-#3) {\makebox[\dimexpr\cmdPAS@celtxt@width-2pt][\pos@align]{\@style{\textcolor{\cmdPAS@celtxt@color}{#4}}}};
}

% Cellule sélectionnée : \selecCell

\newcommand*\selecCell[2]
{%
	%==> En-tête ligne
	
	\fill[blueSelecCellBottom] 
					(numline#2.south west) -- 
					(numline#2.south east) -- 
					($0.5*(numline#2.south east)+0.5*(numline#2.north east)$) -- 
					($0.5*(numline#2.south west)+0.5*(numline#2.north west)$) --
					cycle;
	\fill[blueSelecCellTop] 
					(numline#2.north west) -- 
					(numline#2.north east) -- 
					($0.5*(numline#2.south east)+0.5*(numline#2.north east)$) -- 
					($0.5*(numline#2.south west)+0.5*(numline#2.north west)$) --
					cycle;
	\node[celhead,minimum width=\numline@width,minimum height=\line@height] at (numline#2) {\helvbx#2};
	
	%==> En-tête colonne
	
	\fill[blueSelecCellBottom] 
					($(#1.south west)+(0.25pt,0.25pt)$) -- 
					($(#1.south east)+(-0.25pt,0.25pt)$) -- 
					($0.5*(#1.south east)+0.5*(#1.north east)+(-0.25pt,0)$) -- 
					($0.5*(#1.south west)+0.5*(#1.north west)+(0.25pt,0)$) --
					cycle;
	\fill[blueSelecCellTop] 
					($(#1.north west)+(0.25pt,-0.25pt)$) -- 
					($(#1.north east)+(-0.25pt,-0.25pt)$) -- 
					($0.5*(#1.south east)+0.5*(#1.north east)+(-0.25pt,0)$) -- 
					($0.5*(#1.south west)+0.5*(#1.north west)+(0.25pt,0)$) --
					cycle;
	\node at (#1) {\helvbx#1};

	%==> Cellule cell#1-#1
	
	\draw[very thick] (cell#1-#2.south west) rectangle (cell#1-#2.north east);
	\fill[black] ($(cell#1-#2.south east)+(-1pt,1pt)$) rectangle +(3pt,-3pt);
}

% Sélection de plusieurs cellules : \multiSelec{A-1}{B-2} _/!\_ Nouvelle syntaxe 2014

\newcommand*\multiSelec[2]
{%
	\fill[blueSelec,opacity=0.5] ($(cell#1.north west)+(0.25pt,-0.25pt)$) rectangle ($(cell#2.south east)+(-0.25pt,0.25pt)$);
	\draw[very thick] (cell#1.south west) rectangle (cell#1.north east);
	\fill[black] ($(cell#2.south east)+(-0.5pt,0.5pt)$) rectangle +(3pt,-3pt);

	%==> On colorie les en-têtes "colonnes"
	
	\StrChar{#1}{1}[\str@start] % par exemple, "G"
	\StrChar{#2}{1}[\str@end]   % par exemple, "L"
	\StrBetween{\col@names}{\str@start}{\str@end}[\str@col] %  retourne par exemple "HIJK"
	\edef\str@col{\str@start\str@col\str@end} % retourne alors "GHIJKL"
	\StrLen{\str@col}[\nb@columns] % nombre d'en-têtes "colonnes" à colorier
	\foreach \i in {1,...,\nb@columns}
	{
		\StrChar{\str@col}{\i}[\name]
		\fill[blueSelecCellBottom] 
					($(\name.south west)+(0.25pt,0.25pt)$) -- 
					($(\name.south east)+(-0.25pt,0.25pt)$) -- 
					($0.5*(\name.south east)+0.5*(\name.north east)+(-0.25pt,0)$) -- 
					($0.5*(\name.south west)+0.5*(\name.north west)+(0.25pt,0)$) --
					cycle;
		\fill[blueSelecCellTop] 
					($(\name.north west)+(0.25pt,-0.25pt)$) -- 
					($(\name.north east)+(-0.25pt,-0.25pt)$) -- 
					($0.5*(\name.south east)+0.5*(\name.north east)+(-0.25pt,0)$) -- 
					($0.5*(\name.south west)+0.5*(\name.north west)+(0.25pt,0)$) --
					cycle;
		\node at (\name) {\helvbx\name};
	}
	
	%==> On colorie les en-têtes "lignes"
	
	\StrGobbleLeft{#1}{2}[\first@num]
	\StrGobbleLeft{#2}{2}[\second@num]
	\foreach \i in {\first@num,...,\second@num}
	{
		\fill[blueSelecCellBottom] 
					(numline\i.south west) -- 
					(numline\i.south east) -- 
					($0.5*(numline\i.south east)+0.5*(numline\i.north east)$) -- 
					($0.5*(numline\i.south west)+0.5*(numline\i.north west)$) --
					cycle;
		\fill[blueSelecCellTop] 
					(numline\i.north west) -- 
					(numline\i.north east) -- 
					($0.5*(numline\i.south east)+0.5*(numline\i.north east)$) -- 
					($0.5*(numline\i.south west)+0.5*(numline\i.north west)$) --
					cycle;
		\node[celhead,minimum width=\numline@width,minimum height=\line@height] at (numline\i) {\helvbx\i};
	}
}
\endinput
