This siteAll blogsLe 17ClémentCCBCuisineLe 3ContactSe connecterS'inscrire
  • All blogs
  • Le 17
  • Clément
  • CCB
  • Cuisine
  • Le 3
  • Contact

  • S'inscrire

Recettes informatiques

  • Page de garde
  • Contact
  • Se connecter
  • « Install Mercurial (hg) on Android
  • Disabling hyperthreading »

Create genealogy tree with LaTeX/TikZ

Posted by mazet on Sep 19 2014 in Programmation, LaTeX

This is a LaTeX class to easily create genealogy trees

  • \male to create a male leaf
  • \female to create a female leaf
  • \married to create a link for marriage
  • \divorced to create a link for divorce
  • \childofunion to create links between parents and child
  • \resetoffset to start a new generation line
  • \shiftoffset to create space between leaves
  • and environment subtree to easy large tree design

Following code presents macros definitions:

Code

% Copyright 2014 by Laurent Mazet
%
% This file may be distributed and/or modified
%
% 1. under the LaTeX Project Public License and/or
% 2. under the GNU Public License.
%
\def\Genealogy@Version{2014/09/27, v. 0.3}
\NeedsTeXFormat{LaTeX2e}[1995/12/01]
\ProvidesClass{genealogy}[\Genealogy@Version]
%
\LoadClass{article}
%
\RequirePackage{tikz}
\usetikzlibrary{trees}
\usetikzlibrary{calc}
%
\RequirePackage[paperwidth=\maxdimen,paperheight=\maxdimen]{geometry}
%
\RequirePackage[active,tightpage]{preview}
\PreviewEnvironment{tikzpicture}
%
\setlength\PreviewBorder{5pt}
%
\newlength\xstep
\setlength\xstep{24mm}
\newlength\ystep
\setlength\ystep{10mm}
%
\newcommand{\childof}[3]{
  \draw [child] (#1) |- ($ (#2) + (#3) $) -| (#2);
}
\newcommand{\childofunion}[3]{\childof{#1}{#3}{0,1.0}\childof{#2}{#3}{0,1.0}}
\newcommand{\childofsecondunion}[3]{\childof{#1}{#3}{0,1.2}\childof{#2}{#3}{0,1.2}}
\newcommand{\childofthridunion}[3]{\childof{#1}{#3}{0,0.8}\childof{#2}{#3}{0,0.8}}
\newcommand{\married}[2]{
  \draw [link] (#1) -- node[above] {\textmarried} (#2);
}
\newcommand{\divorced}[2]{
  \draw [link] (#1) -- node[above] {\textdivorced} (#2);
}
\newcommand{\link}[2]{
  \draw [link] (#1) -- (#2);
}
\newcommand{\person}[6]{
  \pgfmathparse{mod(#5 + #6, 2)}
  \edef\g{\pgfmathresult}
  \node [#3] (#1) at ($ 2 *(#4, 0) - 2 *(0, #5) + (\g, 0) $) {#2};
}
%
\newcommand{\resetoffset}{
  \xdef\offset{0}
  \pgfmathparse{\level + \inclevel}
  \xdef\level{\pgfmathresult}
  \xdef\inclevel{1}
}
\newcommand{\shiftoffset}[1]{
  \pgfmathparse{\offset + #1}
  \xdef\offset{\pgfmathresult}
  \ifdim\offset pt>\maxoffset pt\xdef\maxoffset{\offset}\fi
}
%
\newcommand{\addperson}[3]{
  \person{#1}{#2}{#3}{\offset}{\level}{\gapoddeven}
  \shiftoffset{1}
}
\newcommand{\male}[2]{\addperson{#1}{#2}{male}}
\newcommand{\female}[2]{\addperson{#1}{#2}{female}}
%
\newenvironment{subtree}{
  \pgfmathparse{2 * (mod(\level, 2) + \offset) * \xstep}
  \edef\x{\pgfmathresult}
  \pgfmathparse{-2 * (\level) * \ystep}
  \edef\y{\pgfmathresult}
 
  \pgfmathparse{mod(\level, 2)}
  \xdef\gapoddeven{\pgfmathresult}
 
  \xdef\maxoffset{0}
  \edef\savedoffset{\offset}
  \xdef\offset{0}
 
  \edef\savedlevel{\level}
  \xdef\level{0}
 
  \edef\savedinclevel{\inclevel}
  \xdef\inclevel{1}
 
  \begin{scope}[shift=\x,yshift=\y]
}{
  \end{scope}
 
  \xdef\gapoddeven{0}
 
  \pgfmathparse{\savedoffset + \maxoffset}
  \xdef\offset{\pgfmathresult}
 
  \pgfmathparse{\level + 1}
  \xdef\inclevel{\pgfmathresult}
  \ifdim\savedinclevel pt>\inclevel pt\xdef\inclevel{\savedinclevel}\fi
 
  \xdef\level{\savedlevel}
}
%
\AtBeginDocument{
%
  \footnotesize
%
  \tikzstyle{person} = [rectangle,draw,minimum width=10em]
  \tikzstyle{female} = [person,fill=red!20,rounded corners]
  \tikzstyle{male} = [person,fill=blue!20]
  \tikzstyle{child} = [->,>=stealth,thick]
  \tikzstyle{link} = [-,thick]
%
  \begin{tikzpicture}[=\xstep,y=\ystep]
    \xdef\offset{0}
    \xdef\maxoffset{0}
    \xdef\level{0}
    \xdef\inclevel{1}
    \xdef\gapoddeven{0}
}
%
\AtEndDocument{
  \end{tikzpicture}
}

And a representative example:

Code

\documentclass{genealogy}
 
\usepackage{textcomp}
 
\usepackage{verbatim}
\begin{comment}
:Title: Famille Bordenave de Lalonquette
:Tags: Styles; Trees; Charts
:Author: Laurent Mazet
:Slug: family-tree
 
Arbre généalogique de la famille Bordenave de Lalonquette
\end{comment}
 
%\newcommand{\per}[4]{
%  \begin{tabular}{l@{ }r}
%    #1&#2\\#3&\ifx\undefined#4\else#4$#$\fi
%  \end{tabular}
%}
\newcommand{\per}[4]{
  \begin{tabular}{l@{ }r}
    #1&#2\\\textborn#3&\ifx\undefined#4\else\textdied#4\fi
  \end{tabular}
}
 
\begin{document}
 
  % line 1
  %\resetoffset
  \male{PB1}{\per{Pierre}{Bordenave}{-}{1815}}
 
  \male{MB1}{\per{Mathieu}{Bordenave}{1743}{1816}}
 
  \female{AL1}{\per{Anne}{Lamothe}{-}{1819}}
  \married{MB1}{AL1}
 
  \shiftoffset{1}
 
  \male{xL1}{\per{?}{Laranson}{-}{-}}
 
  \female{JD1}{\per{Jeanne}{Dufau (Labarrère)}{-}{-}}
  \married{xL1}{JD1}
 
  % line 2
  \resetoffset
 
  \male{JC1}{\per{Jean}{Casouret}{-}{1839}}
 
  \female{JB1}{\per{Jeanne}{Bordenave}{1778}{1840}}
  \childofunion{MB1}{AL1}{JB1}
  \married{JB1}{JC1}
 
  \shiftoffset{2}
 
  \male{JB2}{\per{Jean}{Bordenave}{1775}{1840}}
  \childofunion{MB1}{AL1}{JB2}
 
  \female{ML1}{\per{Marie}{Laranson}{1786}{1827}}
  \childofunion{xL1}{JD1}{ML1}
  \married{JB2}{ML1}
 
  % line 3
  \resetoffset
 
  \male{xT1}{\per{}{Touyarot}{-}{1848}}
 
  \female{AB1}{\per{Anne}{Bordenave}{1814}{1849}}
  \childofunion{ML1}{JB2}{AB1}
  \married{xT1}{AB1}
 
  \male{JB3}{\per{Jean}{Bordenave}{1810}{1810}}
  \childofunion{ML1}{JB2}{JB3}
 
  \male{JB4}{\per{Jean}{Bordenave}{1815}{1815}}
  \childofunion{ML1}{JB2}{JB4}
 
  \male{PB1}{\per{Pierre}{Bordenave}{1812}{1812}}
  \childofunion{ML1}{JB2}{PB1}
 
  \male{MB2}{\per{Magdalène}{Bordenave}{1814}{1814}}
  \childofunion{ML1}{JB2}{MB2}
 
  \male{PB2}{\per{Pierre}{Bordenave}{1807}{1892}}
  \childofunion{ML1}{JB2}{PB2}
 
\end{document}
Genealogy Tree

Lastest version of the package is avaliable here.

This entry was posted by mazet and filed under Programmation, LaTeX.

No feedback yet

Catégories

  • Toutes
  • Non catégorisé
  • Programmation
    • Awk
    • Bash
    • C
    • C++
    • Javascript
    • LaTeX
    • Perl
    • Tcl/Tk
  • Systeme
    • Android
    • Debian
    • Ubuntu

Contenu

  • Linux Router
  • Creating a network between 2 virtual machines on Windows with Qemu
  • Build a Debian package for pdmenu
  • Extract informations from epub file
  • Connexion PostgreSql / Java par Socket Unix
  • Example of fork and respawn
  • Start SSH daemon on Git portable distribution
  • Create a git mirror
  • Color diff
  • Create on Debian a Minecraft server
  • GIT/HG/SVN on multiple repos simultaneously
  • Convert Comics into CBZ format
  • Random password generator function
  • Convert to camelCase
  • DKIM and SPF
  • Migration from BackupPC 3 (Debian package) to BackupPC 4 (Standalone Installation)
  • Minimal BC for Mingw
  • Diskless Debian cluster
  • Colorize log file
  • Generate certificates with (or without) a certificate authority
Août 2025
Lun Mar Mer Jeu Ven Sam Dim
        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
 << <   > >>
  • Accueil
  • Récemment
  • Archives
  • Catégories
  • Derniers commentaires

Rechercher

Flux XML

  • RSS 2.0: Posts
  • Atom: Posts
What is RSS?

©2025 by Laurent Mazet • Contact • Aide • Multi-blog engine

Forums software

Cookies are required to enable core site functionality.