%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % Package fast-diagram.sty % % Version 1.1 (27/02/13) % Ce package est destiné à réaliser facilement des diagrammes FAST % (voir http://fr.wikipedia.org/wiki/Function_Analysis_System_Technique ). % % Réalisé par Raphaël ALLAIS (Lycée G.Eiffel de Dijon), % avec l'importante contribution de Yannick Le Bras (Lycée Montesquieu du Mans) % et les conseils de Robert Papanicola (Lycée Jacques Amyot d'Auxerre) % et de Xavier Pessoles (Lycée Rouvière de Toulon). % % Ce package est proposé en licence LPPL (LaTeX Project Public License), version 1.3c 2008-05-04. % Cela implique que vous pouvez UTILISER ce package autant que vous le voulez, % mais que vous ne pouvez le MODIFIER que SOUS UN AUTRE NOM (créer un dérivé). % Toutefois, je suis totalement ouvert à toute contribution. % Je souhaite juste être prévenu si vous souhaitez apporter votre pierre à l'édifice. % % Pour toute question/conseil/commentaire/reproche/menace de mort ou autre : % allais.raphael -arobase- free.fr % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % Mise à jour : % V1.0 (25/02/13) : % Uplaod du package "FAST.sty" % V1.1 (27/02/13) : % Renommage du package en "fast-diagram.sty" % ainsi que pour l'appel du package (\usepackage{fast-diagram}) % Changement des noms des commandes (ex : \FASTFT --> \fastFT). % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %Entête %----------------------------------------- %% Informations générales %----------------------------------------- \NeedsTeXFormat{LaTeX2e}[1999/01/01] \ProvidesPackage{fast-diagram}[2013/02/27] %% Chargement des extensions %-------------------------------------- \RequirePackage{tikz} \RequirePackage{ifthen} \usetikzlibrary{calc,fit,shapes} \RequirePackage{relsize} \RequirePackage{xargs} \newif\if@fastRaccourcis \@fastRaccourcisfalse \DeclareOption{raccourcis} {\@fastRaccourcistrue} \ProcessOptions %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %Paramètres divers %-------------------------- %Dimentsions %........................ \newcommand*{\fastInterligne} {} %Longueur d'interligne \newcommand*{\fastEspaceColonne} {} %Espace entre colonne (de coin supérieur droit à coin supérieur droit) \newcommand*{\fastLargeurBoite} {} %Largeur des boites \newcommand*{\fastHauteurBoite} {} %Largeur des boites \newcommand*{\fastDecalageTrait} {} %Décalage des connecteur vers le bas, par rapport au sommet de la boite \newcommand*{\fastDecalageOuVertical} {} %Décalage vertical du connecteur ``OU'' \newcommand*{\fastDecalageOuHorizontal} {} %Décalage horizontal du connecteur ``OU'' %Styles %......................... \newcommand*{\fastFSarrondi} {} %Rayon des arrondis des angles de la boite ``fonction de service'' (la 1ere boite) \newcommand*{\fastFTarrondi} {} %Rayon des arrondis des angles de la boite ``fonction de technique'' \newcommand*{\fastSTarrondi} {} %Rayon des arrondis des angles de la boite ``solution technique'' \newcommand*{\fastFSStyle} {} \newcommand*{\fastFTStyle} {} \newcommand*{\fastSTStyle} {} \newcommand*{\fastFVStyle} {} \newcommand*{\fastFStexteStyle} {} %Style du texte de la boite ``fonction de service'' (la 1ere boite) \newcommand*{\fastFTtexteStyle} {} %Style du texte de la boite ``fonction de technique'' \newcommand*{\fastSTtexteStyle} {} %Style du texte de la boite ``solution technique'' \newcommand*{\fastFVtexteStyle} {} %Style du texte de la boite ``vide'' \newcommand*{\fastEpaisseurTraits} {} %Epaisseur des traits %Couleurs %....................................... \definecolor{fastCouleurTexteFS}{rgb}{0,0,0} %Couleur du texte de la boite ``fonction de service'' (la 1ere boite) \definecolor{fastCouleurBorduresFS}{rgb}{0,0,0} %Couleur de bordures de la boite ``fonction de service'' (la 1ere boite) \definecolor{fastCouleurFondFS}{rgb}{1,1,1} %Couleur de fond de la boite ``fonction de service'' (la 1ere boite) \definecolor{fastCouleurTexteFT}{rgb}{0,0,0} %Couleur du texte de la boite ``fonction de technique'' \definecolor{fastCouleurBorduresFT}{rgb}{0,0,0} %Couleur de bordures de la boite ``fonction de technique'' \definecolor{fastCouleurFondFT}{rgb}{1,1,1} %Couleur de fond de la boite ``fonction de technique'' \definecolor{fastCouleurTexteST}{rgb}{0,0,0} %Couleur du texte de la boite ``fonction de service'' \definecolor{fastCouleurBorduresST}{rgb}{0,0,0} %Couleur de bordures de la boite ``fonction de service'' \definecolor{fastCouleurFondST}{rgb}{1,1,1} %Couleur de fond de la boite ``fonction de service'' \definecolor{fastCouleurConnecteurs}{rgb}{0,0,0}%Couleur des connecteurs \definecolor{fastCouleurTexteFV}{rgb}{0,0,0} %Couleur du texte de la boite ``vide'' %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \newcommand*{\fastSetCouleurBordures}[2][named] %Commande qui change les couleurs de toutes les bordures {\definecolor{fastCouleurBorduresFS}{#1}{#2} \definecolor{fastCouleurBorduresFT}{#1}{#2} \definecolor{fastCouleurBorduresST}{#1}{#2}} \newcommand*{\fastSetCouleurTexte}[2][named] %Commande qui change la couleur du texte {\definecolor{fastCouleurTexteFS}{#1}{#2} \definecolor{fastCouleurTexteFT}{#1}{#2} \definecolor{fastCouleurTexteST}{#1}{#2} \definecolor{fastCouleurTexteFV}{#1}{#2}} \newcommand*{\fastSetCouleurFond}[2][named] %Commande qui change la couleur de tous les fonds de boite {\definecolor{fastCouleurFondFS}{#1}{#2} \definecolor{fastCouleurFondFT}{#1}{#2} \definecolor{fastCouleurFondST}{#1}{#2}} \newcommand*{\fastSetCouleurConnecteurs}[2][named] %Commande qui change la couleur du texte {\definecolor{fastCouleurConnecteurs}{rgb}{#1}} \newcommand*{\fastSetCouleurTraits}[2][named] %Commande qui change la couleur à la fois des bordures et des connecteurs {\fastSetCouleurConnecteurs[#1]{#2} \fastSetCouleurBordures[#1]{#2}} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %Commandes internes %----------------------------- \newcommand*{\fastReset} %Remet tous les paramètres à zéro (utilisé une fois au début pour initialisé) { \renewcommand*{\fastInterligne} {0.5em} \renewcommand*{\fastEspaceColonne} {10em} \renewcommand*{\fastLargeurBoite} {7em} \renewcommand*{\fastHauteurBoite} {0} \renewcommand*{\fastDecalageTrait} {-0.6em} \renewcommand*{\fastDecalageOuVertical} {0.4em} \renewcommand*{\fastDecalageOuHorizontal} {-0.4em} \renewcommand*{\fastFSarrondi} {0em} \renewcommand*{\fastFTarrondi} {0em} \renewcommand*{\fastSTarrondi} {0.5em} \renewcommand*{\fastEpaisseurTraits} {0.05em} \renewcommand*{\fastFStexteStyle} {\scalefont{1}\selectfont\bfseries} \renewcommand*{\fastFTtexteStyle} {\smaller} \renewcommand*{\fastSTtexteStyle} {\smaller\itshape} \renewcommand*{\fastFVtexteStyle} {} \renewcommand*{\fastFSStyle} {} \renewcommand*{\fastFTStyle} {} \renewcommand*{\fastSTStyle} {} \renewcommand*{\fastFVStyle} {} \definecolor{fastCouleurTexteFS}{rgb}{0,0,0} %Couleur du texte de la boite ``fonction de service'' (la 1ere boite) \definecolor{fastCouleurBorduresFS}{rgb}{0,0,0} %Couleur de bordures de la boite ``fonction de service'' (la 1ere boite) \definecolor{fastCouleurFondFS}{rgb}{1,1,1} %Couleur de fond de la boite ``fonction de service'' (la 1ere boite) \definecolor{fastCouleurTexteFT}{rgb}{0,0,0} %Couleur du texte de la boite ``fonction de technique'' \definecolor{fastCouleurBorduresFT}{rgb}{0,0,0} %Couleur de bordures de la boite ``fonction de technique'' \definecolor{fastCouleurFondFT}{rgb}{1,1,1} %Couleur de fond de la boite ``fonction de technique'' \definecolor{fastCouleurTexteST}{rgb}{0,0,0} %Couleur du texte de la boite ``fonction de service'' \definecolor{fastCouleurBorduresST}{rgb}{0,0,0} %Couleur de bordures de la boite ``fonction de service'' \definecolor{fastCouleurFondST}{rgb}{1,1,1} %Couleur de fond de la boite ``fonction de service'' \definecolor{fastCouleurConnecteurs}{rgb}{0,0,0}%Couleur des connecteurs \definecolor{fastCouleurTexteFV}{rgb}{0,0,0} %Couleur du texte de la boite ``vide'' } \fastReset %On lance le reset une fois au chargement du package pour initialiser toutes les variables. \newcounter{cptAbscisse} %Compteur d'abscisse (a quelle colonne sommes-nous ?) - Sert notamment à nommer les noeuds \newcounter{cptAbscisseParent} %abscisse parent \newcounter{cptBoite} %Compteur de boite (pour leur donner un nom different) \newlength\posX \posX=0em %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \newcommand{\ttt}{\newcommand[1][ddd]{\lolo}{Hello !!!}} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %Environnement fast %----------------------------- \newenvironment{fast}[1] { \newcommand*{\fastAvanceColonne} %Avance à la colonne suivant { \setcounter{cptAbscisseParent}{\thecptAbscisse} %On enregistre le compteur actuel (qui correspond encore au parent) \addtocounter{cptAbscisse}{1} %puis on décale le compteur d'une colonne %\advance \posX by \fastEspaceColonne %On se décale l'abscisse géométrique d'une colonne %\setlength{\posX}{\posX + \fastEspaceColonne} \addtolength{\posX}{\fastEspaceColonne} } \newcommand*{\fastEnregistreMinimum} % Enregistre la position minimum de la ligne en cours (pour aligner la ligne suivante) { %Attention, c'est compliqué : le but est de chercher le minimum absolu des nodes de la ligne en cours, qui nous servira d'ordonnee pour la ligne suivante \coordinate (SudBoite) at ($(noeud \thecptAbscisse.south)+(0,-\fastInterligne)$);%Sud de la boite + interligne \node[inner sep=0,fit=(SudBoite) (BoiteMinimums)] (BoiteMinimumsAnnexe) {}; %On cree une boite qui contient le point minimum du node courant ainsi que le dernier minimum enregistré \path let \p1=(BoiteMinimumsAnnexe.south) in coordinate (BoiteMinimums) at (0,\y1) ; %On enregistre ce minimum dans BoiteMinimums } \newcommand*{\fastReculeColonne} { %\advance \posX by -\fastEspaceColonne %On recule l'abscisse géométrique d'une colonne \addtolength{\posX}{-\fastEspaceColonne} \addtocounter{cptAbscisse}{-1} %On recule le compteur d'une colonne } \newcommand*{\fastTraceConnecteurs}[1][] { \ifthenelse{\equal{##1}{tempo}} %Option ``tempo'' {\draw [color=fastCouleurConnecteurs,line width=\fastEpaisseurTraits] (noeud \thecptAbscisse.north) -- ($(noeud \thecptAbscisse.north)+(0,\fastInterligne)$); }{} \ifthenelse{\equal{##1}{ou}} { \path ($(noeud \thecptAbscisse.north west)+(\fastDecalageOuHorizontal,\fastDecalageTrait)$) -- ($(noeud \thecptAbscisseParent.north east)+(0,\fastDecalageTrait)+(\fastDecalageOuHorizontal,-\fastDecalageOuVertical)$) coordinate[pos=.5] (milieu); %On cherche le point milieu du connecteur \draw [color=fastCouleurConnecteurs,line width=\fastEpaisseurTraits] ($(noeud \thecptAbscisse.north west)+(0,\fastDecalageTrait)$) -| (milieu) |- ($(noeud \thecptAbscisseParent.north east)+(0,\fastDecalageTrait)+(0,-\fastDecalageOuVertical)$); %On trace le connecteur en faisant un zig } { \path ($(noeud \thecptAbscisse.north west)+(0,\fastDecalageTrait)$) -- ($(noeud \thecptAbscisseParent.north east)+(0,\fastDecalageTrait)$) coordinate[pos=.5] (milieu); %On cherche le point milieu du connecteur \draw [color=fastCouleurConnecteurs,line width=\fastEpaisseurTraits]($(noeud \thecptAbscisse.north west)+(0,\fastDecalageTrait)$) -| (milieu) |- ($(noeud \thecptAbscisseParent.north east)+(0,\fastDecalageTrait)$); %On trace le connecteur en faisant un zig-zag par le milieu } } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %Fonction technique %--------------------------------------------- \newcommand*\fastFT[3][]{%Argument 1=option, Argument 2 = contenu de la fonction, Argument 3 = descendance) \fastAvanceColonne \addtocounter{cptBoite}{1} %//On incremente le numero de la boite \ifthenelse{\equal{##2}{}}%Si la fonction est vide { \node[text width=\fastLargeurBoite,anchor=north west] (noeud \thecptAbscisse) at ($(\posX,0)+(BoiteMinimums)$) {}; %Un node vide (parce que les enfants vont en avoir besoin) \draw [color=fastCouleurConnecteurs,line width=\fastEpaisseurTraits]($(noeud \thecptAbscisse.north east)+(0,\fastDecalageTrait)$)--($(noeud \thecptAbscisse.north west)+(0,\fastDecalageTrait)$); \fastTraceConnecteurs }%Si la fonction n'est pas vide { \node[draw,rounded corners=\fastFTarrondi,text width=\fastLargeurBoite,minimum size=\fastHauteurBoite,text centered,anchor=north west,fastCouleurBorduresFT,fill=fastCouleurFondFT,text=fastCouleurTexteFT,line width=\fastEpaisseurTraits,\fastFTStyle] (noeud \thecptAbscisse) at ($(\posX,0)+(BoiteMinimums)$) {\fastFTtexteStyle ##2}; %On écrit le contenu de la fonction} \fastTraceConnecteurs[##1] \node[inner sep=0,fit=(noeud \thecptAbscisse.north west) (noeud \thecptAbscisse.south east)] (fastBoite\thecptBoite) {};%On créer une boite vide par dessus, aux bonne dimension, afin de lui donner un nom } ##3 %Il s'agit de la descendance passée en argument, et affichée ici. \fastEnregistreMinimum \fastReculeColonne } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %Solution technique %--------------------------- \newcommandx*\fastST[3][1=,3=]{%Argument 1 = option,Argument 2 = contenu de la solution technique) \fastAvanceColonne %On avance d'une colonne \addtocounter{cptBoite}{1} %//On incremente le numero de la boite \node[dashed,rounded corners=\fastSTarrondi,draw,text width=\fastLargeurBoite,minimum size=\fastHauteurBoite,line width=\fastEpaisseurTraits,text centered,anchor=north west,fastCouleurBorduresST,fill=fastCouleurFondST,text=fastCouleurTexteST,\fastSTStyle] (noeud \thecptAbscisse) at ($(\posX,0)+(BoiteMinimums)$) {\fastSTtexteStyle ##2}; %On écrit le contenu de la fonction \node[inner sep=0,fit=(noeud \thecptAbscisse.north west) (noeud \thecptAbscisse.south east)] (fastBoite\thecptBoite) {};%On créer une boite vide par dessus, aux bonne dimension, afin de lui donner un nom \fastTraceConnecteurs[##1] ##3 \fastEnregistreMinimum \fastReculeColonne } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %Boite vide %--------------------------- \newcommandx*\fastVide[3][1=,3=]{%Argument 1 = option,Argument 2 = contenu de la solution technique) \fastAvanceColonne %On avance d'une colonne \addtocounter{cptBoite}{1} %//On incremente le numero de la boite \node[text width=\fastLargeurBoite,minimum size=\fastHauteurBoite,text centered,anchor=north west,text=fastCouleurTexteFV,\fastFVStyle] (noeud \thecptAbscisse) at ($(\posX,0)+(BoiteMinimums)$) {\fastFVtexteStyle ##2}; %On écrit le contenu de la fonction \node[inner sep=0,fit=(noeud \thecptAbscisse.north west) (noeud \thecptAbscisse.south east)] (fastBoite\thecptBoite) {};%On créer une boite vide par dessus, aux bonne dimension, afin de lui donner un nom ##3 \fastEnregistreMinimum \fastReculeColonne } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %Ligne droite simple %--------------------------- \newcommand*\fastTrait[1]{% \fastAvanceColonne \node[text width=\fastLargeurBoite,anchor=north west] (noeud \thecptAbscisse) at ($(\posX,0)+(BoiteMinimums)$) {}; %Un node vide (parce que les enfants vont en avoir besoin) \draw [color=fastCouleurConnecteurs,line width=\fastEpaisseurTraits] ($(noeud \thecptAbscisse.north east)+(0,\fastDecalageTrait)$)--($(noeud \thecptAbscisse.north west)+(0,\fastDecalageTrait)$); \fastTraceConnecteurs ##1 %Il s'agit de la descendance passée en argument, et affichée ici. \fastEnregistreMinimum \fastReculeColonne } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \if@fastRaccourcis \newcommand*{\FT}[3][] {\fastFT[##1]{##2}{##3}} \newcommandx*{\ST}[3][1=,3=] {\fastST[##1]{##2}[##3]} \newcommandx*{\FV}[3][1=,3=] {\fastVide[##1]{##2}[##3]} \newcommand*{\trait}[1] {\fastTrait{##1}} \fi \begin{tikzpicture} %On commence le dessin \setcounter{cptAbscisse}{0} \setcounter{cptAbscisseParent}{0} \setcounter{cptBoite}{0} \posX=0em %Abscisse des boites (0 au début) \coordinate (BoiteMinimums) at (0,0); %noeud ou coordonnees, dont le south correspond au minimum de la ligne en cours (utile pour positionner la ligne suivante) \node[draw,rounded corners=\fastFSarrondi,minimum size=\fastHauteurBoite,line width=\fastEpaisseurTraits,text width=\fastLargeurBoite,text centered,anchor=north west,fastCouleurBorduresFS,fill=fastCouleurFondFS,text=fastCouleurTexteFS,\fastFSStyle] (noeud \thecptAbscisse) at ($(\posX,0)+(BoiteMinimums)$) {\fastFStexteStyle #1}; %Fonction de service que l'on va développer dans ce FAST \node[inner sep=0,fit=(noeud \thecptAbscisse.north west) (noeud \thecptAbscisse.south east)] (fastBoite\thecptBoite) {};%On créer une boite vide par dessus, aux bonne dimension, afin de lui donner un nom } { \end{tikzpicture} %Fin du dessin } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %Fin du package \endinput