This year, I started writing a historical novel about a branch of my family. I quickly realized I needed some tooling to organize my data: what I know about the characters, the places, a general timeline, etc.

Manuskript

I looked for software to do that and found that the reference is Scrivener. However interesting it looked, I’d rather use Open Source software whenever possible, so I started using Manuskript, an Open Source software for writers similar to Scrivener.

Manuskript on Ubuntu

I laid out some chapters, characters, plots… then I realized the saving format was binary. It’s actually a Zip archive which contains all the information in flat files:

        1  2020-05-09 08:05   MANUSKRIPT
      137  2020-05-09 08:05   infos.txt
        0  2020-05-09 08:05   summary.txt
       46  2020-05-09 08:05   status.txt
      147  2020-05-09 08:05   labels.txt
      284  2020-05-09 08:05   characters/0-Samuel_L-on.txt
      281  2020-05-09 08:05   characters/1-L-on_Grunberg.txt
      261  2020-05-09 08:05   characters/2-Adolphe_Grunberg.txt
      309  2020-05-09 08:05   characters/3-Elisabeth_Rau.txt
      112  2020-05-09 08:05   characters/4-Victor_Grunberg.txt
      109  2020-05-09 08:05   characters/5-Maria_Schorr.txt
      224  2020-05-09 08:05   characters/6-Fred_Grunberg.txt
      125  2020-05-09 08:05   characters/7-Colonel_de_Villebois-Mareuil.txt
      107  2020-05-09 08:05   characters/8-Said_Pacha.txt
      109  2020-05-09 08:05   characters/9-Isaac_Aghion.txt
       92  2020-05-09 08:05   outline/00-Setup.md
      322  2020-05-09 08:05   outline/01-Les_joyaux_-gyptiens/folder.txt
     3753  2020-05-09 08:05   outline/01-Les_joyaux_-gyptiens/0-Une_rencontre_inattendue.md
     1706  2020-05-09 08:05   outline/01-Les_joyaux_-gyptiens/1-Office_de_chabbat.md
      715  2020-05-09 08:05   outline/01-Les_joyaux_-gyptiens/2-Un_d-ner_chez_Isaac.md
      482  2020-05-09 08:05   outline/01-Les_joyaux_-gyptiens/3-Proc-s_1.md
      166  2020-05-09 08:05   outline/01-Les_joyaux_-gyptiens/4-Sc-ne_5.md
       83  2020-05-09 08:05   outline/02-Paris/folder.txt
      102  2020-05-09 08:05   outline/02-Paris/0-Sc-ne_1.md
       97  2020-05-09 08:05   outline/03-Etudes_des_enfants/folder.txt
      103  2020-05-09 08:05   outline/03-Etudes_des_enfants/0-Sc-ne_1.md
      103  2020-05-09 08:05   outline/03-Etudes_des_enfants/1-Sc-ne_2.md
       95  2020-05-09 08:05   outline/04-Premiers_emplois/folder.txt
      103  2020-05-09 08:05   outline/04-Premiers_emplois/0-Sc-ne_1.md
       96  2020-05-09 08:05   outline/05-Vers_le_Transvaal/folder.txt
      103  2020-05-09 08:05   outline/05-Vers_le_Transvaal/0-Sc-ne_1.md
      334  2020-05-09 08:05   outline/21-Epilogue.md
    40074  2020-05-09 08:05   revisions.xml
      275  2020-05-09 08:05   world.opml
     1669  2020-05-09 08:05   plots.xml
     2499  2020-05-09 08:05   settings.txt

This is rather good news, and there’s ways to automate PDF creation from this within the software, good news again!

However, some things were problematic to me:

  • I like to tune my pandoc/LaTeX rendering, and the options in Manuskript were pretty limited for that
  • I’d rather not commit a single Zip file in Git, so I would have preferred to have all the files in the current directory
  • Manuskript cannot be automated to compile the PDF, you need to go through the GUI and click on buttons. That’s a blocker for me.

Going the full-git way

So I decided I would do everything in Git + Markdown, without the help of a third-party application.

Chapters

I’m currently storing the chapters in their own directories, with numbered Markdown files:

chapitres/
β”œβ”€β”€ 01_les_joyaux_egyptiens
β”‚Β Β  β”œβ”€β”€ 00_titre.md
β”‚Β Β  β”œβ”€β”€ 01_une_rencontre_innatendue.md
β”‚Β Β  β”œβ”€β”€ 02_office_de_chabbat.md
β”‚Β Β  β”œβ”€β”€ 03_brody.md
β”‚Β Β  β”œβ”€β”€ 04_chabbat_2.md
β”‚Β Β  β”œβ”€β”€ 05_diner_chez_isaac.md
β”‚Β Β  └── 06_audience.md
β”œβ”€β”€ 02_les_enfants_grunberg
β”‚Β Β  β”œβ”€β”€ 00_titre.md
β”‚Β Β  β”œβ”€β”€ 01_leon.md
β”‚Β Β  β”œβ”€β”€ 02_retour.md
β”‚Β Β  β”œβ”€β”€ 03_coffre.md
β”‚Β Β  β”œβ”€β”€ 04_burtaux.md
β”‚Β Β  β”œβ”€β”€ 05_article.md
β”‚Β Β  └── 06_article2.md
β”œβ”€β”€ 03_annees_noires
β”‚Β Β  └── 00_titre.md
β”œβ”€β”€ 04_etudes
β”‚Β Β  └── 00_titre.md
β”œβ”€β”€ 05_premier_travail
β”‚Β Β  └── 00_titre.md
β”œβ”€β”€ 06_le_creusot
β”‚Β Β  └── 00_titre.md
└── 21_epilogue.md

Characters & Places

The characters documentation is stored in Markdown files as well, and links can be made between them when necessary:

personnages/
β”œβ”€β”€ Adolphe_Grunberg.md
β”œβ”€β”€ Charlotte_Grunberg.md
β”œβ”€β”€ Elisabeth_Rau.md
β”œβ”€β”€ Emilie_Grunberg.md
β”œβ”€β”€ Felix_Zottier.md
β”œβ”€β”€ Frederic_Grunberg.md
β”œβ”€β”€ Isaac_Aghion.md
β”œβ”€β”€ Jacques_Grunberg.md
β”œβ”€β”€ Leon_Grunberg.md
β”œβ”€β”€ Lucie_Leon.md
β”œβ”€β”€ Marc_Leon.md
β”œβ”€β”€ Mirel_Schorr.md
β”œβ”€β”€ Paul_Grunberg.md
└── Samuel_Leon.md

Same goes for places:

lieux/
β”œβ”€β”€ Alexandrie.md
β”œβ”€β”€ Brody.md
β”œβ”€β”€ Dubno.md
β”œβ”€β”€ Grunberg_Boulogne.md
β”œβ”€β”€ Paris.md
β”œβ”€β”€ Petite_Jonchere.md
└── Vienne.md

Links can easily be made between these documentation files:

# Mirel Schorr


## Γ‰tat civil

* PrΓ©noms : Mirel, dite Maria
* Nom : GrΓΌnberg
* Nom de naissance : Schorr


## Portrait

Inconnu


## Description physique

Inconnu



## EvΓ©nements


* ca 1800 : Β° Γ  [Dubno](../lieux/Dubno.md) (Russie)
* Enfance Γ  [Brody](../lieux/Brody.md) (Autriche)
  avec ses parents [Schachne](Schachne_Schorr.md)
  et [Sarah](Sarah_Bick.md)
  et ses frères [Naphtali](Naphtali_Mendel_Schorr.md)
  et [Osias](Osias_Heschel_Schorr.md)

* 1821: Mariage Γ  [Brody](../lieux/Brody.md)

* 1870 : habite Γ  [Vienne](../lieux/Vienne.md) (testament [Adolphe](Adolphe_Grunberg.md))

* 1877 : habite Γ  [Paris](../lieux/Paris.md) (+)
* 1877 : + Γ  [Vienne](../lieux/Vienne.md)


## Habillement

Voir sa garde-robe en 1853 dans l'inventaire de [Victor](Victor_Grunberg.md)

Section stats

Manuskript provides stats about the number of words in a section. I’ve added a Make target for that:

stats:
	find chapitres/ -name "*.md" -not -name '00_titre.md' -print0 | sort -z | xargs -0 wc -w

Caveat: it also lists the words in the comments…

Building the project

I’m using Pandoc to build the project with my own LaTeX template.

%.md:
	cat meta.md > $@
	find chapitres/ -name "*.md"  -print0 | sort -z | xargs -0 cat >> $@

%.tex: %.md
	pandoc --pdf-engine lualatex  --template extended.tex \
		   --variable numbersections --toc --variable toc-depth=2 \
		   --variable documentclass=memoir --variable fontsize=12pt \
		   --filter pandoc-citeproc \
		   --verbose \
		   $< -o $@

%.pdf: %.tex
	OSFONTDIR=$(FONTSDIR) lualatex $<
	makeindex $*.idx
	OSFONTDIR=$(FONTSDIR) lualatex $<

The novel project can be found in this GitHub repository:

GitHub β€” raphink/genearoman