%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % 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/,B/,...}. 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