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\\#3&\ifx\undefined#4\else#4$#$\fi | |
% \end{tabular} | |
%} | |
\newcommand{\per}[4]{ | |
\begin{tabular}{l@{ }r} | |
#1\\\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} |
Lastest version of the package is avaliable here.