Diagramme de parenté avec LaTeX

Mon collègue et ami Guillaume Jacques m’a demandé conseil sur la manière de réaliser un diagramme de parenté avec LaTeX. Les diagrammes de parenté sont un outil courant en anthropologie pour représenter les systèmes de parenté. En effet selon les cultures et les langues, les relations de parenté ne sont pas conceptualisées et nommées de la même manière. Par exemple, dans les langues ryukyu, les frères et sœurs cadets son désignés par le même terme, sans distinction de sexe. Et il existe des systèmes de parenté très différents, dont certains peuvent nous sembler «bizarres». À l’inverse, le fait qu’en français on ne distingue pas les grands-parents, oncles et tantes paternels de ceux du côté maternel paraitrait terriblement étrange à certaines cultures.

Pour réaliser un diagramme de parenté avec LaTeX, il ne semble pas exister de solution «clé en main». Ce qui s’en rapprocherait le plus est genealogytree, mais celui-ci ne prend pas en compte les spécificités des diagrammes de parenté. Par ailleurs, avec 292 pages de manuel, on peut supposer qu’il est difficile de personnaliser les commandes. En attendant que quelqu’un se dévoue pour créer une extension spécifique pour les diagrammes de parenté, il faut donc recourir aux outils de dessin généraux de LaTeX.

L’une des meilleurs outils de dessin et l’un des plus utilisé est PGF/TikZ. Il s’agit d’un outil très complet et très bien documenté (1161 pages pour la version 3.0.1a), qui permet de réaliser des diagrammes très complexes (voir les exemples sur http://www.texample.net/tikz/examples/all/).

Pour réaliser un diagramme de parenté, on peut utiliser la librairie Tikz trees, qui permet de réaliser des arbres. On peut ensuite ajouter des commandes pour créer des mariages et rajouter des frères et sœurs ainsi que des réglages pour créer les symboles masculin et féminin. On peut bien sûr utiliser les commandes standard de Tikz pour rajouter des décorations.

Voici le résultat, illustrant le système de parenté japhug selon Guillaume Jacques (version préliminaire avec des ajouts de quelques annotations de ma part pour illustrer les différentes commandes):

kinchart

Et voici le code complet, avec des commentaires expliquant les différentes commandes. Il est néanmoins nécessaire d’avoir déjà une connaissance de base de TikZ:

\documentclass[11pt,border=2pt]{standalone}
\usepackage{polyglossia} 
\setmainfont[StylisticSet=20]{Brill}
\usepackage{tikz}
\usetikzlibrary{trees,calc,shapes.geometric,arrows.meta}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Premier noeud de l'arbre: \treeroot[#1]{#2}{#3}
% #1 option du symbole de sexe
% #2 nom du noeud
% #3 texte du noeud
\newcommand{\treeroot}[3][]{
  \node (#2) {#3} ;
  \draw[#1] ($(#2.north) +(0,.5em)$) -- (#2.north);
}

% Rajout d'un frère ou d'une soeur: \sibling[#1]{#2}{#3}{#4}{#5}
% #1 option du symbole de sexe
% #2 nom du noeud
% #3 position du noeud
% #4 nom du noeud frère ou soeur
% #5 texte du noeud
\newcommand{\sibling}[5][]{
  \node (#2) #3 {#5};
  \draw[#1] ($(#4.north) +(0,.5em)$) -- +(0pt,.4\tikzleveldistance -.5em)  -| (#2.north);
}

% Rajout d'un époux ou épouse à gauche d'un noeud existant: \spouseleft[#1]{#2}{#3}{#4}
% #1 option du symbole de sexe
% #2 nom du noeud
% #3 nom du noeud de l'époux ou épouse prédéfini
% #4 texte du noeud
\newcommand{\spouseleft}[4][]{\node[anchor=base east,xshift=-.5em] (#2) at(#3.base west) {#4} ;
  \draw[#1] ($(#2.north) +(0,.5em)$) -- (#2.north);
  \draw[] ([yshift=.2ex]#2.mid east) -- ([yshift=.2ex]#3.mid west) ;
  \draw[] ([yshift=-.2ex]#2.mid east) -- ([yshift=-.2ex]#3.mid west) ;
}

% Rajout d'un époux ou épouse à droite d'un noeud existant: \spouseright[#1]{#2}{#3}{#4}
% #1 option du symbole de sexe
% #2 nom du noeud
% #3 nom du noeud de l'époux ou épouse prédéfini
% #4 texte du noeud
\newcommand{\spouseright}[4][]{\node[anchor=base west,xshift=.5em] (#2) at(#3.base east) {#4} ;
  \draw[#1] ($(#2.north) +(0,.5em)$) -- (#2.north);
  \draw[] ([yshift=.2ex]#3.mid east) -- ([yshift=.2ex]#2.mid west) ;
  \draw[] ([yshift=-.2ex]#3.mid east) -- ([yshift=-.2ex]#2.mid west) ;
}

% Rajout d'un enfant d'une union existante: \unionchild[#1]{#2}{#3}
% #1 parent à gauche dans le diagramme
% #2 parent à droite dans le diagramme
% #3 contenu normal du noeud: child {node {NOM}}, etc
\newcommand{\unionchild}[3]{\node at($(#1.base east)!0.5!(#2.base west)$) {} #3 ;}

% Définition du style de branche normal
\tikzstyle{edge from parent fork down}= [edge from parent path={(\tikzparentnode\tikzparentanchor) -- +(0pt,-.4\tikzleveldistance)  -| (\tikzchildnode\tikzchildanchor)}]

\tikzset{
% Style par défaut
  edge from parent fork down, sibling distance=3em, level distance=10ex,
  every node/.style={anchor=base,inner sep=2pt,outer sep=0pt,minimum width=1em,text height=2ex,text depth=.5ex,font=\strut},
% Style du symbole féminin «fem»
  set fem/.code={\pgfqkeys{/tikz/fem}{#1}},  set fem={fill/.initial=white, color/.initial=black},
  fem/.style={set fem={#1},-{Circle[open,length=.5em,color=\pgfkeysvalueof{/tikz/fem/color},fill=\pgfkeysvalueof{/tikz/fem/fill}]}},
% Style du symbole masculin «masc»
  set masc/.code={\pgfqkeys{/tikz/masc}{#1}},  set masc={fill/.initial=white, color/.initial=black},
  masc/.style={set masc={#1},-{Triangle[open,reversed,width=.75em,length=.5em,color=\pgfkeysvalueof{/tikz/masc/color},fill=\pgfkeysvalueof{/tikz/masc/fill}]}},
% Style du symbole de sexe indéterminé «fm»
  set fm/.code={\pgfqkeys{/tikz/fm}{#1}},  set fm={fill/.initial=white, color/.initial=black},
  fm/.style={set fm={#1},-{Square[open,length=.5em,color=\pgfkeysvalueof{/tikz/fm/color},fill=\pgfkeysvalueof{/tikz/fm/fill}]}},
% Rajout des symboles «+» et «-» pour l'âge
  older/.style={label={[label distance=-.5ex]85:+}},
  younger/.style={label={[label distance=-.5ex]85:-}}
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\begin{document}
\begin{tikzpicture}

\treeroot[masc]{wa}{tɤ-wa}
\spouseright[fem]{mu}{wa}{tɤ-mu}
\unionchild{wa}{mu}{
  child[fem] {node (snom) {tɤ-snom}} 
  child[masc] {node[older] (ego) {\textsc{ego}}} 
  child[masc,sibling distance=7em] {node[younger] (xtg) {tɤ-xtɤɣ}} 
}

\spouseright[fem]{rzab}{ego}{tɤ-rʑaβ}
\unionchild{ego}{rzab}{child[masc] {node{tɤ-tɕɯ}} child[fem] {node {tɯ-me}} }

\spouseleft[masc]{piri}{snom}{tɤ-pi⁺ ta-ʁi⁻}
\unionchild{piri}{snom}{child[fm] {node(ftsa) {tɤ-ftsa}} }

\spouseright[fem]{piri2}{xtg}{tɤ-pi⁺ ta-ʁi⁻}
\unionchild{xtg}{piri2}{child[fm] {node {tɤ-mdɯ}} }

\sibling[masc]{rpu}{at([xshift=3.5em]mu.base west -| piri2.base east)}{mu}{tɤ-rpɯ}
\spouseright[fem]{lar}{rpu}{tɤ-ɬaʁ}
\unionchild{rpu}{lar}{
  child[masc={fill=black}] {node (rpu2) {tɤ-rpɯ} 
    child[masc={fill=black}] {node (rpu3) {tɤ-rpɯ}} 
    child[fem={fill=black}] {node {tɤ-ɬaʁ}}
    }
  child[fem={fill=black}] {node {tɤ-ɬaʁ}}
}

\sibling[fem]{nyi}{at([xshift=-1em]wa.base east -| piri.base west)}{wa}{tɤ-ɲi}
\spouseleft[masc]{bgo}{nyi}{tɤ-βɣo}
\unionchild{bgo}{nyi}{
  child[fm={fill=orange}] {node(ftsa2) {tɤ-ftsa} 
    child[fm={fill=orange}] {node{tɤ-ɣe}}
    }
  }
  
\draw (ftsa.mid west) to[bend left] (ftsa2.base east);
\draw (rpu.mid west) to[bend right] (rpu2.mid west) ;
\draw (rpu.mid west) to[bend right] (rpu3.mid west) ;
\end{tikzpicture}
\end{document}

Je n’ai pas cherché à prendre en charge toutes les possibilités, mais l’exemple est amplement fonctionnel et peut se servir de base à des développements supplémentaires. N’hésitez pas à laisser un commentaire si vous apportez des améliorations ou des fonctionnalités supplémentaires.

Ce billet peut être cité de la façon suivante: Thomas Pellard, « Diagramme de parenté avec LaTeX », Cipanglossia, 6 novembre 2016, http://cipanglo.hypotheses.org/309.

2 réflexions au sujet de « Diagramme de parenté avec LaTeX »

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *