A LaTeX/Python toolkit that builds beautifully typeset PDF Bibles in the visual
tradition of the Geneva Bible of 1564, set in EB Garamond
with LuaLaTeX and the scripture package.
This is a fork of raphink/geneve_1564, whose original goal was a faithful facsimile of the 17th-century French Geneva Bible. It has been extended into a general pipeline that fetches modern English translations (ESV and NET) from their APIs and renders them as several distinct, print-ready editions — while preserving the Geneva aesthetic: centered chapter headings, decorative drop-cap initials, running heads, and marginal/footnote apparatus.
The direct inspiration for this project was David Purton's
scripture LaTeX package
(CTAN). Discovering a package purpose-built
for typesetting scripture — chapter/verse markup, poetry, running-head marks,
footnotes — is what prompted building these editions around it; scripture
does all of the biblical text layout here.
Each edition is a top-level <name>.tex document that \inputs generated
per-book files. All are two-column KOMA scrbook on a 179 × 239 mm page unless
noted. Every book opens with a period woodcut headpiece assigned by
canonical division (Law/History/Wisdom/Prophets/Gospels/Epistles/Revelation);
see images/headings/SOURCES.md.
| Edition | Build target | Text | Distinctive layout | Pages |
|---|---|---|---|---|
| ESV | make esv → esv_bible.tex |
ESV | Red-letter (Words of Christ), drop-cap lettrines, footnotes in the outer margin | ~1350 |
| KJV | make kjv → kjv_bible.tex |
KJV (public domain) | Same reading layout as ESV; LORD in small caps; no red-letter (KJV has no quotation marks). A rendered example is committed: output/kjv_bible.pdf |
~1280 |
| NET reading | make net-reading → net_reading.tex |
NET | Clean two-column reading layout | ~1375 |
| NET notes | make net-notes → net_notes.tex |
NET | Single column with a wide (55 mm) right gutter ruled for handwritten/digital notes | ~2265 |
| Geneva | make geneva → geneva_bible.tex |
NET | NET text + the 1599 Geneva Study Bible marginal annotations (~15.5k notes; overflow rendered as lettered footnotes), 13 pt | ~2436 |
| Geneva 1564 | make geneve-1564 → geneve_1564.tex |
French (original) | The upstream French facsimile reproduction | — |
geneve_1564_modern.tex is a compact A6 modern-French variant carried over from
upstream. Compiled PDFs are written to output/ (the KJV example is the only
one committed; build the rest with make <edition>).
Text is fetched from external APIs, cached locally as JSON, converted to
scripture-package LaTeX, then compiled with LuaLaTeX.
- Fetchers —
esv_fetcher.py(api.esv.org, token auth),bible_fetcher.py(labs.bible.org, for NET),kjv_fetcher.py(aruljohn/Bible-kjv, public-domain KJV),annotation_fetcher.py(Geneva Study Bible notes from StudyLight),build_red_letter_data.py(Words-of-Christ spans derived from WEB USFM\wjmarkup, since NET has none). - Generators —
esv_latex_generator.pyandlatex_generator.pyturn cached HTML/JSON into per-book.tex.build_annotated.pyinjects Geneva annotations and runsoverlap_detector.py, an anchor-based pass that demotes margin notes to footnotes when the margin can't hold them (the Geneva density needs it — seedocs/plans/). - Unified entry point —
scripts/generate.py --edition esv|net|geneva|kjv|allregenerates an edition's book files from the existing caches (offline).
Shared assets: hand-crafted per-edition editions/<name>/cover.tex and
color_index.tex; fonts in fonts/; a locally vendored scripture.sty.
The NET editions (NET reading, NET notes, and Geneva) embed a
2-year, weekday-paced reading plan, parsed from
2-Year-Bible-Reading-Plan_LisaNotes.com_.pdf
(LisaNotes.com) by scripts/reading_plan_parser.py.
Each reading is assigned to a calendar date, automatically skipping weekends
and US federal holidays (including the day after Thanksgiving).
It surfaces in two places:
- A dated schedule table (
reading_plan.tex, generated per edition), reachable from the 📖 icon in the page footer. - In the reading/notes editions, inline day markers — each day's reading
ends at an
rp-<date>anchor in the text, so you can jump from the schedule to exactly where a day's reading stops.
Two things are meant to be personalized before you generate:
-
Start date — day 1 of the plan. Default
2026-03-02. Set it with the standalone NET generator:python3 scripts/generate_bible.py --start-date 2026-09-01 --output-dir livres_net
(The unified
scripts/generate.pyuses the default start date; change therun_net(...)call there, or usegenerate_bible.pydirectly, to override it.) -
Personal skip dates — recurring days to leave unscheduled (birthdays, anniversaries, travel). Edit the
_PERSONAL_SKIPSset inscripts/reading_plan_parser.py; entries are(month, day)tuples applied every year:_PERSONAL_SKIPS = {(2, 24), (2, 27), (3, 6), (6, 23)}
After changing either, regenerate the edition and recompile (make net-reading,
etc.) so the new dates flow into both the schedule table and the inline markers.
Requirements:
- LuaLaTeX (TeX Live / TinyTeX) — LuaLaTeX specifically; XeLaTeX's macOS AAT renderer breaks the EB Garamond Initials font.
- Python 3 with
scripts/requirements.txt(requests,python-dotenv,pdfplumber). - For ESV: an ESV API key in a
.envfile at the project root asESV_API_KEY=.... (NET via labs.bible.org needs no key.)
pip install -r scripts/requirements.txt
# regenerate book files for an edition (offline, from cache)
python3 scripts/generate.py --edition esv # or net / geneva / all
# compile a single edition (two LuaLaTeX passes)
make esv # esv / net-reading / net-notes / geneva / geneve-1564
make all-editions # build every editionCompiled PDFs land at <name>.pdf in the project root. make clean removes
build artifacts.
The ESV and NET translations are copyrighted; this repository contains
tooling, not the licensed text (generated livres_*/ book files and the API
caches carry their respective publishers' terms). Respect the
ESV API and labs.bible.org
terms of use, and the Crossway / NET Bible copyright and quotation limits, for
any PDFs you produce or distribute — which is why only the KJV example PDF is
committed here.
The KJV (Authorized Version, 1611) is public domain in the United States and
most of the world; in the United Kingdom rights are vested in the Crown
(administered by Cambridge University Press). Its example render is committed as
output/kjv_bible.pdf. The headpiece artwork is public domain (see
images/headings/SOURCES.md); EB Garamond is under
the SIL Open Font License.
- David Purton's
scriptureLaTeX package (CTAN) — the inspiration for this project and the engine behind all scripture typesetting (chapters, verses, poetry, running-head marks, footnotes). - Raphaël Pinson — the original geneve_1564 project and the French Geneva 1564 reproduction this repository forks.
- Georg Duffner's EB Garamond — the typeface (SIL Open Font License).