Aller au menu - Aller au contenu
Inscris-toi au e-camp "Héberge ton jeu Facebook sur Azure" de Microsoft vendredi 25 mai à 13h30 !

[LaTeX] Commande pour faire un diagramme FAST ?

Une piste pour créer cette fonction ?

Pour accéder à cette section
Connectez-vous !
connexion_rpx
Page 1 
Auteur Message
1 visiteur sur ce sujet (1 Anonyme)
Page 1 
Hors ligne Rafafouille # Posté le 16/01/2012 à 20:55:54
Avatar

Ville : Saint apollinaire
Pays : France métropolitaine

Bonjour,

Je cherche à créer une commande ou un environnement pour créer un diagramme FAST automatiquement.

Qu'est ce qu'un digramme FAST déjà ?


C'est un diagramme, qui ressemble vaguement à un tableau, qui permet de décomposer une fonction (représentées par une boite) en sous fonctions, à la manière d'une arborescence.
cf. un exemple ici

Je voudrais donc créer un environnement (ou une commande) pour faire ça.

J'avais pensé le faire sous un forme récurcive (en reprenant l'exemple de Wikipedia) :
Code : TeX
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
\begin{fast} [Fonction de service 1]
     \item \begin{fast}[Fonction technique 1]
                \item fonction technique 11
                \item fonction technique 12
                \item fonction technique 13
           \end{fast}
     \item \begin{fast}[Fonction technique 2]
                \item fonction technique 21
                \item fonction technique 22
           \end{fast}
\end{fast}


...mais je ne vois pas du tout comment faire ça. Ce n'est peut-être pas la meilleur méthode.

Est-ce quelqu'un aurais une idée ? Une piste ? Une stratégie ?

Merci d'avance pour vos conseils !
Publicité # Posté le 16/01/2012 à 20:55:54

Hors ligne @dri1 # Posté le 16/01/2012 à 23:47:14
Bob et Gauss
Avatar

Études : Université de Lyon

Cette réponse a aidé l'auteur du sujet Cette réponse a aidé l'auteur du sujet
Salut,
il doit y avoir moyen avec tikz. Ce lien te donnera plein d'exemples, tu trouveras surement ton bonheur !

Un génie sommeille en chacun de nous... ou pas. :D
Bob nous le prouve avec sa formule géniale. Seulement voilà, un petit malin nommé Gauss l'avait déjà trouvée. C'est toujours pareil :colere:
 
Hors ligne Rafafouille # Posté le 17/01/2012 à 19:47:23
Avatar

Ville : Saint apollinaire
Pays : France métropolitaine

Merci.
J'ai eu d'autres échos qui m'ont conseillé la même chose.
Je ne mets pas le sujet en "résolu". Je le ferai si quelqu'un trouve autre chose, ou quand moi-même je crée cette fonction (je la copierai...)
Merci encore !
Édité le 17/01/2012 à 19:48:12 par Rafafouille
Hors ligne pepere250 # Posté le 17/01/2012 à 20:25:08
Britannicus
Avatar

Pour mettre au point la commande, je pense que ce serait certainement plus simple de faire un peu comme pour les tableaux, taper le diagramme ligne par ligne plutôt que par récursivité.
J'édite si j'arrive à mettre au point une solution.
 
Hors ligne Rafafouille # Posté le 17/01/2012 à 21:24:24
Avatar

Ville : Saint apollinaire
Pays : France métropolitaine

Oui, je comprends ce que tu veux dire.
Mais disons que la structure même du FAST est de forme récurcive (des fonctions incluses dans d'autres fonctions, etc...).
C'est pour ça que l'idée me plaisait. Aprés, on fait avec ce qu'on a...
En tout cas merci de t'y pencher. Mais si tu ne veux pas te prendre la tête avec ça, donne moi juste des pistes si tu en as, et je regarderai moi-même plus tard. (Tu vas pas faire mon boulot quand même ! ;) )

Remarque : plusieurs profs de SI (sciences de l'ingénieur) seraient intéressés par cette fonction... On la mettrait en ligne sur des sites collaboratifs. C'est pour ça que ça serait bien de réussir à la faire !
Hors ligne Rafafouille # Posté le 28/01/2012 à 13:54:27
Avatar

Ville : Saint apollinaire
Pays : France métropolitaine

Re-bonjour tout le monde !

Je suis en train de tenter d'écrire la fonction décrite précédemment.
Étant débutant avec Tizk, je suis confronté à quelques problèmes.

Je cherche notamment à faire une commande récursive.
Or, j'ai un problème sur la "portée" des objets.

En effet, si les macro/commandes ont une portée locale (i.e. : toute commande redéclarée dans un environnement retrouve sa valeur originale en sortant de cet environnement), j'ai l'impression que ce n'est pas le cas des "nodes".
Je vais donc avoir besoin de "sauvegarder" les coordonnées de mes nodes (avec des \newcommand ou \renewcommand).
Mais pour ça, j'ai besoin de connaitre/d'afficher chacune de mes coordonnées.

Problème : comment affiche-t-on les coordonnées d'un noeud ?


Ps : sitôt que j'aurai réussi ma commande, je vous la ferai partager.
Hors ligne pepere250 # Posté le 07/02/2012 à 23:02:27
Britannicus
Avatar

Je me doute que j'ai un peu de retard, mais je me permet de upper le sujet pour proposer une solution (qui utilise MetaPost).
Il y a donc un fichier auxiliaire metapost de créé, et dont le nom est par défaut celui du fichier tex en cours de compilation.

il faudra donc penser à compiler le fichier auxiliaire.

Il y a deux environnements, fast qui englobe tout et qui prend comme argument obligatoire le nombre maximal d'éléments sur une ligne et un argument optionnel qui force la largeur des éléments. Si elle n'est pas donnée, elle est calculée grâce au nombre maximal d'éléments sur une ligne indiqués.
Ensuite il y a l'environnement fastnext, pour les appels récursifs.

La commande \fastitem s'utilise de la façon \fastitem blablabla \\

Un petit exemple :
Code : TeX
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
\documentclass[]{article}
\usepackage{lmodern}


\catcode`\@=11
\def\:{\let\stoken= } \:
\def\:{\futurelet\ctoken\relax} \:%
\long\def\unexpandedimmediatewrite#1#2{\def\writ@{\immediate\write#1}% repris du TeXbook 
{\aftergroup\writ@\aftergroup{\s@nitize#2\ends@nity}}}
\def\s@nitize{\futurelet\next\s@nswitch}
\def\s@nswitch{\ifx\next\ends@nity
\else \ifcat\noexpand\next\stoken\aftergroup\space\let\next\e@t
\else \ifcat\noexpand\next\bgroup\aftergroup{\let\next\e@t
\else\ifcat\noexpand\next\egroup\aftergroup}\let\next\e@t
\else\let\next\copyt@ken \fi\fi\fi\fi \next}

\def\e@t{\afterassignment\s@nitize \let\next= }
\long\def\copyt@ken#1{\ifcat\noexpand#1\relax\aftergroup\noexpand\else\ifcat\noexpand#1\noexpand~\aftergroup\noexpand\fi\fi\aftergroup#1\s@nitize}
\def\ends@nity\ends@nity{}

\long\def\semifirstunexpandedimmediatewrite#1#2#3{\def\writ@{\immediate\write#1}%
\def\toexp@nd{#2}%
{\aftergroup\writ@\aftergroup{\aftergroup\toexp@nd\s@nitize#3\ends@nity}}}


\ifdefined\XeTeXpicfile \def\MPauxfileoutputextension{eps} \else\def\MPauxfileoutputextension{mps}\fi
\catcode`\%=11
\newwrite\MPauxfile
\edef\MPauxfilename{\jobname.mp}
\def\openMPauxfile{\immediate\openout\MPauxfile=\MPauxfilename 
\unexpandedimmediatewrite{\MPauxfile}{verbatimtex^^J
%&latex^^J
\documentclass[]{article}^^J
\usepackage[utf8]{inputenc}^^J
\begin{document}^^J
\makeatletter^^J
\fontsize{7pt}{8pt}\selectfont^^J
\newdimen\fastitemwidth^^J
etex^^J
bboxmargin:=3pt;^^J
pair accrochePoints[], reliePoints[], itemsPosition[];^^J
picture items[];^^J
vardef makeAccroche(expr n)=^^J
(urcorner bbox items[n]+ lrcorner bbox items[n])/2^^J
enddef;^^J
}}
\newcount\fastnumber  \fastnumber\@ne
\newcount\fastitemnumber \fastitemnumber\z@
\newcount\fastitemaccroche \fastitemaccroche\@ne
\newdimen\fastwidth   \fastwidth\z@
\newdimen \fastdepth  \fastdepth\z@ 
\newdimen\fastitemwidth

\newif\iffastoption
\def\fast{\@ifnextchar[{\getFastWidth}{\fastoptionfalse\fastaux}}
\def\fastaux#1{\immediate\write\MPauxfile{
outputtemplate:="\jobname-fast%c.\MPauxfileoutputextension";^^J
beginfig(\number\fastnumber)}
\immediate\write\MPauxfile{numberOfItems:=0;}
\global\fastdepth\z@ \global\fastwidth\z@
\global\fastitemnumber\z@
\unless\iffastoption
\fastitemwidth\dimexpr\hsize-1cm*(#1-1)-6pt*#1\relax
\fastitemwidth\dimexpr\fastitemwidth/#1\relax
\fi
\immediate\write\MPauxfile{fastitemwidth:=\the\fastitemwidth;}
\unexpandedimmediatewrite{\MPauxfile}{verbatimtex^^J\fastitemwidth=}
\immediate\write\MPauxfile{\the\fastitemwidth ^^J etex}}
\catcode`\%=14

\def\getFastWidth[#1]{\fastitemwidth#1\fastoptiontrue\fastaux}

\long\def\fastitem#1\\{%
\global\advance\fastitemnumber\@ne
\immediate\write\MPauxfile{numberOfItems:=numberOfItems+1;^^Jitems[\the\fastitemnumber]:=nullpicture;
^^JitemsPosition[\the\fastitemnumber]:=(\the\fastwidth,-\the\fastdepth); }
\semifirstunexpandedimmediatewrite{\MPauxfile}{%
addto items[\the\fastitemnumber]}{ also thelabel(btex \vbox{\hsize=\fastitemwidth\noindent#1} etex,}%
\immediate\write\MPauxfile{ itemsPosition[\the\fastitemnumber]);
^^JaccrochePoints[\the\fastitemnumber]:=makeAccroche(\the\fastitemaccroche);}%
\setbox\z@\vbox{\hsize\fastitemwidth \fontsize{8pt}{9pt}\selectfont\noindent#1} \global\advance\fastdepth\dimexpr\ht\z@+\dp\z@+6pt+0.5cm\relax
}

\def\fastnext{%
\advance\fastdepth-\dimexpr\ht\z@+\dp\z@+6pt+0.5cm\relax
\fastitemaccroche\fastitemnumber
\advance\fastwidth\dimexpr\fastitemwidth+1cm\relax}

\def\endfastnext{}

\def\endfast{\unexpandedimmediatewrite\MPauxfile{
for i:=0 upto numberOfItems  :^^J
if known items[i]:^^J
draw items[i];^^J
draw bbox items[i];^^J
fi;^^J
^^J
endfor^^J
^^J
}
\unexpandedimmediatewrite{\MPauxfile}{ 
for i:=2 upto numberOfItems:^^J
 if known items[i]:^^J
 reliePoints[i]:=(ulcorner bbox items[i] + llcorner bbox items[i])/2;^^J
 pair milieu;^^J
 milieu:= (accrochePoints[i] + reliePoints[i])/2 ;^^J
 drawarrow accrochePoints[i]-- (xpart milieu, ypart accrochePoints[i]) -- (xpart milieu, ypart reliePoints[i]) -- reliePoints[i];^^J
^^J
 fi; endfor;^^J^^J
endfig;^^J}%
\IfFileExists{\jobname-fast\the\fastnumber.\MPauxfileoutputextension}{\includegraphics{\jobname-fast\the\fastnumber.\MPauxfileoutputextension}}{}%
\advance\fastnumber\@ne}

\AtBeginDocument{\openMPauxfile}
\AtEndDocument{\unexpandedimmediatewrite{\MPauxfile}{end.}}

\usepackage{graphicx}
\begin{document}

\begin{fast}[2cm]{3}
	\fastitem Fonction de service 1\\
	\begin{fastnext}
	\fastitem Fonction technique 1\\
	\begin{fastnext}
		\fastitem Fonction technique 11\\
		\fastitem Fonction technique 12\\
		\fastitem Fonction technique 13\\
	\end{fastnext}
	\fastitem Fonction technique 2\\
	\begin{fastnext}
		\fastitem Fonction technique 21\\
		\fastitem Fonction technique 22\\
	\end{fastnext}
	\end{fastnext}
\end{fast}
\end{document}


EDIT : correction du code pour fonctionner aussi bien sous XeTeX que sous PdfTeX
Édité le 08/02/2012 à 16:17:14 par pepere250
 
Hors ligne Rafafouille # Posté le 16/03/2012 à 11:35:20
Avatar

Ville : Saint apollinaire
Pays : France métropolitaine

Bonjour,

Tout d'abord, merci Pepere250, même si j'avoue (honteusement) ne pas avoir réussi à compiler le metaPost... (je ne connais pas trop ces choses là...).
Je viens de voir que tu as fait un "edit", donc peut être qu'en réessayant avec PDFTex...

En attendant, j'y ai réfléchi de mon coté, en essayant de "dompter" TikZ (et en demandant conseil à un ami proche - Merci Yaya !), et on a réussi à faire un petit package qui marche pas trop mal simplement avec Tikz.
Je peaufine quelques détails et je vous le mets en ligne prochainement ! (vous pourrez me donner vos avis/conseils/reproches, etc.)

D'ailleurs, je me pose une question concernant la création de package (oui je sais : c'est pas vraiment le sujet du poste, mais bon...)
L'ayant rédigé en Latex, j'ai mis, dans l'entête du .sty, la commande :
Code : TeX
1
\NeedsTeXFormat{LaTeX2e}[1999/01/01]

Cela veut-il dire que les gens qui font simplement du Tex ne pourront pas l'utiliser ? Ou peu importe ?
Ensuite, si je veux faire une petite documentation (car j'y ai rajouté plein de petites commandes internes pour qu'il soit paramétrable...). Avez-vous une mise en forme toute faite (le genre de mise en forme qu'on retrouve dans toutes les documentations de Latex).

Merci beaucoup et à bientôt (promis !)
Édité le 16/03/2012 à 11:35:57 par Rafafouille
Hors ligne pepere250 # Posté le 16/03/2012 à 18:55:48
Britannicus
Avatar

Le code que j'ai donné crée un fichier auxiliaire qui porte le même nom que le document TeX, avec l'extension .mp . Pour compiler du code metapost, il faut utiliser la commande mpost fichier.mp.

Pour la commande \NeedsTeXFormat{LaTeX2e}[1999/01/01], ce n'est pas ça qui va poser trop de problème. Il existe un fichier miniltx.tex qui, une fois chargé lorsqu'on fait du plain TeX ou autre, va définir quelques macros plus ou moins reprises de LaTeX pour assurer un début de compatibilité (exemple : les packages color et graphicx sont utilisables en plain TeX).

Ce qui compte, c'est que le package n'utilise pas des macros purement LaTeXiennes impossibles à définir en dehors de LaTeX(le seul exmple qui me vienne à l'esprit c'est la manipulation des fontes par exemple qui risque de ne pas trop fonctionner).
Édité le 16/03/2012 à 19:04:59 par pepere250
 

Retour au forum "Autres langages, outils et approches" ou à la liste des forums

Pour accéder à cette section
Connectez-vous !
connexion_rpx


Lire aussi