Gestion de projet

Créer un diagramme de Gantt avec \(\LaTeX\)

Introduction

Diagramme bien connu des personnes qui font régulièrement de la gestion de projet, le Gantt permet de visualiser dans le temps le déroulement et l’avancement de différentes tâches d’un projet. On peut voir à quel moment une tâche doit débuter et à quel moment elle doit se terminer. On peut noter aussi dessus les dépendances entre différentes tâches ainsi que des dates clefs. Par exemple, une tâche C ne peut commencer seulement si la tâche A est terminée et elle doit être terminée avant la grande réunion très importante du 36 du mois.

Je vais ici vous parler d’un des packages \(\LaTeX\) qui permet de les écrire facilement tout en obtenant un résultat assez joli : pgfgantt.

Comme d’habitude celui-ci se charge dans votre document via la commande suivante :

\usepackage{pgfgantt}

Si vous utilisez le compilateur pdfLaTeX, vous devrez probablement rajouter cette ligne à votre préambule sans quoi la compilation de vos diagrammes risque de planter (source) :

\usepackage[babel=true, kerning=true]{microtype}

Je vais dans un premier temps vous présenter les bases du package, ce qui vous permettra de comprendre comment il fonctionne pour des cas simples puis, dans un second temps et si vous êtes motivés, je vois présenterai quelques fonctionnalités plus avancées du package.

Votre premier Gantt

L’ensemble des lignes de code pour créer le diagramme va se trouver dans un environnement appelé ganttchart, comme ci-dessous :

\begin{ganttchart}[<options>]{<date début>}{<date fin>}
    <code>
\end{ganttchart}

Pour pouvoir expliquer simplement comment on écrit son premier diagramme à partir des macros de base, le plus simple je pense est d’étudier un morceau de code pour ensuite le décortiquer ligne par ligne, le voilà :

\begin{ganttchart}{1}{12}
	\gantttitle{2020}{12} \\
	\gantttitlelist{1,...,12}{1} \\

	\ganttgroup{Groupe 1}{1}{7} \\ % elem0
	\ganttbar{Sujet 1a}{1}{4} \\ % elem1
	\ganttbar{Sujet 1b}{2}{7} \\ % elem2
	\ganttmilestone{Fin 1}{7} \\ % elem3
	\ganttlink{elem1}{elem3}
	\ganttlink{elem2}{elem3}

	\ganttgroup{Groupe 2}{8}{11} \\ % elem4
	\ganttbar{Sujet 2a}{8}{9} \\ % elem5
	\ganttbar{Sujet 2b}{10}{11} \\ % elem6
	\ganttmilestone{Fin 2}{11} \\ % elem7
	\ganttlink{elem5}{elem6}
	\ganttlink{elem6}{elem7}

	\ganttmilestone{Fin}{12} % elem8
	\ganttlink{elem3}{elem8}
	\ganttlink{elem7}{elem8}
\end{ganttchart}

Le résultat obtenu après compilation est le suivant. Pas mal non pour une vingtaine de ligne de code, non ?

Dans le code montré plus haut, on retrouve 6 macros principales qui sont le cœur du package :

  • \gantttitle{2020}{12} : cette macro permet de donner un titre sur une largeur définie, ici une année sur les 12 incrémentations pour les 12 mois ;
  • \gantttitlelist{1,…,12}{1} : cette macro permet de donner un nom aux incrémentations de votre Gantt, ici une numérotation entre 1 et 12 à partir de 1 ;
  • \ganttgroup{Groupe 1}{1}{7} : cette macro permet de créer un groupe de lignes entre deux valeurs de la ligne de temps, ici entre 1 et 7. Ça peut être utile pour séparer des tâches très différentes, par exemple dans une thèse on peut créer trois groupes : bibliographie, travaux, rédaction ;
  • \ganttbar{Sujet 1b}{2}{7} : cette macro permet de créer une barre normale dans le Gantt, une tâche par exemple faisant partie d’un groupe. Ici elle commence à partir de 2 pour se terminer 7. Note, il est possible d’avoir plusieurs barres sur une même ligne en retirant les \\ ;
  • \ganttmilestone{Fin 1}{7} : cette macro permet d’intégrer au diagramme une deadline, elle n’a dont qu’une seule date disponible, ici à 7 ;
  • \ganttlink{elem1}{elem3} : enfin, cette macro permet de faire le lien entre différentes tâches, groupes ou points dans le Gantt, elle est définie par un label nommé elem et numéroté dans l’ordre d’apparition dans le code à partir de 0. Pour une meilleure compréhension, j’ai commenté chaque ligne par son label.

Si jusque là vous avez compris l’idée, vous avez fait 90 % du travail.

Maintenant, il est possible de situer le moment présent sur le diagramme pour visualiser les tâches normalement terminées et celles à venir, utile pour voir où on en est à un instant t. Pour cela, il faut rajouter dans les options de l’environnement l’option today=<date>. Par défaut, et vu que le package est codé en anglais et ne semble pas communiquer avec babel, l’option écrit TODAY sur le diagramme. Il est cependant possible de modifier le texte avec l’option today label=<nouveau nom>.

Les premières lignes du code correspondent alors à cela :

\begin{ganttchart}[
	today=5,
	today label=Maintenant
	]{1}{12}

Enfin, pour mieux visualiser la progression des différentes tâches, il est possible de différencier les barres terminées et celles à venir avec l’option progress=today.

Avec quelques ajustements des options pour une version francisée du diagramme, on obtient le résultat suivant :

\begin{ganttchart}[
	today=5,
	today label=Maintenant,
	progress=today,
	progress label text={\pgfmathprintnumber[precision=0, verbatim]{#1} \ % complété},
	bar progress label anchor=north east,
	group progress label anchor=north east,
	milestone progress label anchor =north east,
	]{1}{12}

Les options progress label anchor appliquéees à bar, group et milestone permettent de déplacer le label de chaque barre pour éviter qu’elles se superposent aux liens.

Avec ces quelques macros présentées jusque là, vous avez déjà la possibilité de réaliser à peu près n’importe quel diagramme basique en quelques lignes de code.

Si vous êtes motivés pour passer sur les fonctionnalités avancées du package, je vous propose maintenant, et si je ne vous ai pas encore noyé jusqu’ici, de passer à la section suivante, mais avant cela, je vous conseille d’essayer d’abord de votre côté ces quelques lignes de code pour vous faire la main et vous habituer au package.

Aller plus loin

Lignes de temps avancées

Pour le moment, je n’ai présenté que des titres de ligne de temps assez simples, c’est-à-dire une graduation basique avec des chiffres.

Le package permet cependant de réaliser des diagrammes beaucoup plus précis avec des vraies dates et de distinguer les années, mois, semaines et jours.

Comme on l’a vu précédemment, le diagramme le plus simple réalisable est celui-ci, avec seulement des nombres en guise de titre.

Note : l’option expand chart= permet d’ajuster la largeur du Gantt pour une meilleure visibilité dans certains cas, ici 15cm et plus loin dans l’article \textwidth.

\begin{ganttchart}[
	expand chart=15cm
	]{1}{12}
	\gantttitlelist{1,...,12}{1} \\
	\ganttbar{Sujet 1a}{1}{4} 
	\ganttbar{}{7}{11} 
\end{ganttchart}

En rajoutant avant la macro \gantttitle{2020}{12} on obtient cela :

Il est cependant possible d’utiliser une nouvelle macro permettant de gérer des dates beaucoup plus simplement pour un rendu bien plus complexe qui est la suivante :

\gantttitlecalendar[<options>]{<calendrier>}

Pour mieux comprendre son fonctionnement, regardons le code suivant :

\begin{ganttchart}[
	expand chart=\textwidth,
	time slot unit=day,
	time slot format=isodate
	]{2020-01-15}{2020-03-02}
	\gantttitlecalendar{year, month, week, day} \\
	\ganttbar{Sujet 1a}{2020-01-17}{2020-02-08} 
	\ganttbar{}{2020-02-18}{2020-03-01} 
\end{ganttchart}

Ainsi que le rendu :

L’option time slot format=isodate permet ici de pouvoir travailler directement sur des dates spécifiques (à écrire sous le format yyyy-mm-dd), ce qui peut-être intéressant dans le cadre d’un projet. L’option time slot unit=day quant à elle définit le jour comme unité de base de l’échelle.

Ensuite, l’environnement ganttchart est comme toujours défini par deux dates (début et fin) et les titres de la ligne de temps est formée automatiquement par la macro \gantttitlecalendar{} où il lui est demandé d’afficher l’année, les mois et les jours. On retrouve enfin les macros \ganttbar vues dans la première partie de cet article.

D’autres options à cet environnement permet aussi de montrer les décennies. Dans le cas présent le détail du gant se fait jours par jours, mais il est aussi possible d’avoir un pas mensuel ou annuel, voilà quelques exemples :

Avec les codes correspondants que je vous laisse comparer à tête reposée  :

\begin{ganttchart}[
	expand chart=\textwidth,
	time slot unit=day,
	time slot format=isodate
	]{2019-12-24}{2020-02-04}
	\gantttitlecalendar{year, month, week, day} \\
	\ganttbar{Sujet 1a}{2019-12-26}{2020-01-20} 
	\ganttbar{}{2020-01-30}{2020-02-03} 
\end{ganttchart} \vspace{1cm}

\begin{ganttchart}[
	expand chart=\textwidth,
	time slot unit=month,
	time slot format=isodate-yearmonth,
	]{2019-10}{2021-02}
	\gantttitlecalendar{year, month} \\
	\ganttbar{Sujet 1a}{2019-11}{2020-01} 
	\ganttbar{}{2020-03}{2020-05}
	\ganttbar{}{2020-09}{2021-01} 
\end{ganttchart}\vspace{1cm}

\begin{ganttchart}[
	expand chart=\textwidth,
	time slot unit=year,
	time slot format=isodate-year,
	]{1997}{2025}
	\gantttitlecalendar{decade, year} \\
	\ganttbar{Sujet 1a}{1999}{2011} 
	\ganttbar{}{2015}{2023}
\end{ganttchart}\vspace{1cm}

Maintenant qu’on utilise le format date dans le diagramme, il devient possible d’utiliser la macro \today de \(\LaTeX\) pour mettre à jour la date automatiquement après chaque nouvelle compilation sans avoir à changer manuellement l’option.

Par défaut, la macro \today est formatée comme ceci : 12 avril 2020 (avec babel et l’option french). Il est cependant possible de changer ce formatage en utilisant le package datetime2 qui par défaut va modifier le texte au format ISO, comme ceci : 2020-04-12. Il devient alors possible d’utiliser l’option today={\today}, dans ganttchart. Il en va de même pour l’option today label qui peut alors aussi afficher la date du jour.

Personnaliser son Gantt

Comme dans beaucoup de package \(\LaTeX\), il est très souvent possible de personnaliser son code pour avoir un rendu plus personnel. Le rendu par défaut est parfaitement convenable, mais on peut lui trouver un aspect un peu austère.

On va voir ici quelques fonctionnalités pour ajouter de la couleur ou modifier les barres pour un rendu plus sympa.

La grille

Jusqu’à maintenant, les grilles des Gantt que je vous ai montré étaient vides, mais il est bien évidemment possible de rajouter des lignes pour bien distinguer les dates et les barres. Les options à rajouter dans l’environnement ganttchart vgrid et hgrid permettent respectivement de rajouter des lignes verticales et horizontales sur le Gantt.

Il est bien entendu possible de personnaliser la couleur des lignes si voulu.

Les barres

Chacun des éléments du diagramme est modifiable au niveau de la couleur comme le montre l’exemple ci-dessous :

\begin{ganttchart}[
	vgrid,
	hgrid,
	today=8,
	today label=Maintenant,
	progress=today,
	progress label text={\pgfmathprintnumber[precision=0, verbatim]{#1} \ % complété},
	bar progress label anchor=north east,
	group progress label anchor=north east,
	milestone progress label anchor =north east,
	bar/.append style={draw=none, fill=Green3},
	group/.append style={draw=none, fill=Green4},
	milestone/.append style={draw=none, fill=Blue3},
	bar incomplete/.append style={fill=Red3},
	group incomplete/.append style={fill=Red4},
	milestone incomplete/.append style={draw=none, fill=Blue4},
	]{1}{12}

Note : le package xcolor est à intégrer à votre préambule avec l’option x11names pour les couleurs du le code ci-dessus : \usepackage[x11names]{xcolor}

Ici, les macros /.append style et et incomplete/.append style permettent de personnaliser les environnements bar, group et milestone avec couleur que l’on souhaite selon si elles sont placées avant ou après la macro today. Le résultat est le suivant :

Il est aussi possible de modifier la formes même des barres pour les rendre plus personnelles, mais pour rester concis j’ai préféré ne pas les présenter ici, je vous renvoie à la documentation en fin d’articles si vous souhaitez voir comment cela se fait.

Les noms des barres

Pour terminer, il est aussi possible de personnaliser les noms des barres pour changer la couleur, la taille ou la police, comme sur l’exemple ci-dessous :

\begin{ganttchart}[
	vgrid,
	hgrid,
	expand chart=15cm,
	today=8,
	today label=Maintenant,
	progress=today,
	progress label text={\pgfmathprintnumber[precision=0, verbatim]{#1} \ % complété},
	bar progress label anchor=north east,
	group progress label anchor=north east,
	milestone progress label anchor =north east,
	bar/.append style={draw=none, fill=Green3},
	group/.append style={draw=none, fill=Green4},
	milestone/.append style={draw=none, fill=Blue3},
	bar incomplete/.append style={fill=Red3},
	group incomplete/.append style={fill=Red4},
	milestone incomplete/.append style={draw=none, fill=Blue4},
	bar label text={\textit{#1}~$\rightarrow$},
	group label text={\uppercase{#1}},
	group label font=\color{Red4},
	milestone label font=\color{Green4},
	milestone label text={#1 \ding{52}},
	]{1}{12}

Note : le package pifont est à ajouter à votre préambule pour compiler le code ci-dessus.

Et le rendu :

Enfin, l’option inline permet d’écrire les noms des barres à l’intérieur du Gantt et non sur la gauche comme sur les exemples précédents, bien que dans le cas présent le résultat fait assez chargé. À vous de choisir selon votre besoin.

Conclusion

Après ce long article, je pense avoir présenté l’essentiel que peut proposer le package pgfgantt pour réaliser des diagrammes relativement facilement pour un rendu, comme toujours avec \(\LaTeX\), très bon.

Bien entendu, la documentation du package (lien dans les sources) permet de compléter mon article pour découvrir l’intégralité des fonctionnalités disponibles si vous souhaitez aller plus loin. Je n’ai en effet pas mentionner les possibilités de personnaliser les titres (couleur, fond, contours, etc.), les liens entre barres ou encore la formes des barres (il est possible de les changer en ellipse, arrondir les bords, etc.), mais cet article est déjà bien assez dense comme cela sans en rajouter.

En tous cas j’espère que cet article vous aura permis de découvrir l’existence de ce package ou d’améliorer votre compréhension de celui-ci pour vos propres besoins.

N’hésitez pas à rajouter un commentaire si vous avez des questions ou des remarques, je tâcherai d’y répondre dans les meilleurs délais.

Source

Vous trouverez la documentation du package sur ce lien. Le code de l’image d’en-tête se trouve à la fin du document.

One Comment