Files
BookIA/compiler-livre.sh
Vincent Laperrousaz fb0d6145f8 Partie 1 : reconstruction dialectique et réécriture Gemini (intro, ch1-4)
- Nouvelle règle de tension dialectique (section 2), avec encadré du
  03/08 rappelant que les seuils sont des instruments de diagnostic,
  pas des lois.
- Reconstruction dialectique de l'introduction et des chapitres 1 à 3
  (arcs argumentatifs, coutures, invariants restaurés).
- Réécriture stylistique par l'API Gemini (bloc par bloc) des
  chapitres 1 à 3, suivie des contrôles de littéralité et de rythme.
- Motif du tuyau installé une seconde fois au chapitre 4 ; six
  arbitrages du plan narratif tranchés et consignés.
- Suppression de la préface (jamais rédigée) ; le fichier devient
  table-des-matieres.md, seul porteur du sommaire.
- Archivage des quatre ouvertures de partie en prose, non compilées
  et redondantes avec l'annonce du plan dans l'introduction.
- Essai de comparaison Gemini/Qwen consigné dans 00_REECRITURE_GEMINI.md
  section 10 (sorties jetables supprimées, outil conservé).
- Audit de cohérence complet de la Partie 1 : invariants, renvois,
  appareil de notes, registre des sources, motifs, contrôles
  automatisés.

Fichiers de méthode versionnés pour la première fois :
00_PLAN_NARRATIF.md, 00_PROMPTS_RECHERCHE.md, 00_REECRITURE_GEMINI.md.
2026-08-03 18:00:14 +02:00

229 lines
11 KiB
Bash
Executable File

#!/bin/bash
# Compile tous les chapitres du livre en PDF (papier KDP 6x9") et en EPUB.
# (table des matières, chapitres numérotés, notes de bas de page).
#
# Prérequis : pandoc + un moteur LaTeX (pdflatex/xelatex).
# brew install pandoc
# brew install --cask basictex # puis redémarrer le terminal
#
# Usage : ./compiler-livre.sh
# Sorties : livre.pdf (format papier 6x9" pour KDP) et livre.epub (eBook) à la racine du projet.
set -e
cd "$(dirname "$0")"
if ! command -v pandoc &> /dev/null; then
echo "Erreur : pandoc n'est pas installé. Lancer : brew install pandoc"
exit 1
fi
if ! command -v pdflatex &> /dev/null && ! command -v xelatex &> /dev/null; then
echo "Erreur : aucun moteur LaTeX trouvé (pdflatex/xelatex)."
echo "Lancer : brew install --cask basictex"
echo "Puis redémarrer le terminal ou lancer : eval \"\$(/usr/libexec/path_helper)\""
exit 1
fi
# La mise en page personnalisée (préambule.tex) nécessite les packages LaTeX
# titlesec et tocloft, qui ne font pas partie de BasicTeX par défaut.
if ! kpsewhich titlesec.sty &> /dev/null || ! kpsewhich tocloft.sty &> /dev/null; then
echo "Erreur : packages LaTeX manquants (titlesec et/ou tocloft)."
echo "Lancer : sudo tlmgr install titlesec tocloft"
echo "(nécessite une confirmation de mot de passe macOS, à saisir manuellement)"
exit 1
fi
# Police du corps de texte (Cochineal, voir preambule.tex section A).
# Avertissement non bloquant : le préambule sait se replier sur Latin
# Modern, le livre compile dans tous les cas. Mais le rendu voulu — la
# garalde, ses vraies petites capitales, ses italiques — suppose ces
# trois paquets. Installation en mode utilisateur, donc SANS sudo.
if ! kpsewhich cochineal.sty &> /dev/null; then
echo "Avertissement : police Cochineal absente, le PDF sera composé en"
echo "Latin Modern (rendu par défaut de LaTeX, pas celui prévu)."
echo "Pour l'installer, sans mot de passe administrateur :"
echo " tlmgr init-usertree"
echo " tlmgr --usermode install cochineal xstring fontaxes"
echo ""
fi
# Ordre de montage du livre. Les fichiers "partieN-*.md" ne contiennent aucun
# texte : ils insèrent uniquement une page de titre de partie (\part en LaTeX,
# titre équivalent en EPUB) afin que les quatre grandes divisions du plan
# apparaissent physiquement dans le livre et dans la table des matières.
# Tous les fichiers du manuscrit vivent dans Manuscrit/ (voir 00-COORDINATION.md,
# section 11) : ce dossier ne contient QUE des fichiers destinés à l'impression
# ou à l'EPUB, jamais de notes de recherche, de registre ou de rapport d'audit.
MANUSCRIT_DIR="Manuscrit"
CHAPITRES=(
"$MANUSCRIT_DIR/mentions-legales.md"
"$MANUSCRIT_DIR/table-des-matieres.md"
"$MANUSCRIT_DIR/00-introduction.md"
"$MANUSCRIT_DIR/partie1-erosion-du-reel.md"
"$MANUSCRIT_DIR/01-chap01-mort-de-la-verite.md"
"$MANUSCRIT_DIR/02-chap02-neuvieme-nom.md"
"$MANUSCRIT_DIR/03-chap03-anesthesie-cognitive.md"
"$MANUSCRIT_DIR/partie2-grand-bouleversement.md"
"$MANUSCRIT_DIR/04-chap04-plan-social-invisible.md"
"$MANUSCRIT_DIR/05-chap05-holdup-sur-la-creation.md"
"$MANUSCRIT_DIR/06-chap06-nouveaux-maitres-du-monde.md"
"$MANUSCRIT_DIR/partie3-boite-de-pandore.md"
"$MANUSCRIT_DIR/07-chap07-guerre-automatisee.md"
"$MANUSCRIT_DIR/08-chap08-mur-de-lagi.md"
"$MANUSCRIT_DIR/09-chap09-probleme-de-lalignement.md"
"$MANUSCRIT_DIR/partie4-reprendre-le-controle.md"
"$MANUSCRIT_DIR/10-chap10-loi-contre-la-machine.md"
"$MANUSCRIT_DIR/11-chap11-filtre-ethique.md"
"$MANUSCRIT_DIR/12-chap12-cultiver-lirremplacable.md"
"$MANUSCRIT_DIR/13-conclusion.md"
)
# Vérifie que tous les fichiers existent avant de lancer la compilation
MANQUANTS=()
for f in "${CHAPITRES[@]}"; do
if [ ! -f "$f" ]; then
MANQUANTS+=("$f")
fi
done
if [ ${#MANQUANTS[@]} -gt 0 ]; then
echo "Attention : ${#MANQUANTS[@]} fichier(s) manquant(s) ou pas encore créé(s) :"
for f in "${MANQUANTS[@]}"; do echo " - $f"; done
echo "La compilation continuera avec les fichiers présents."
echo ""
fi
PRESENTS=()
for f in "${CHAPITRES[@]}"; do
if [ -f "$f" ]; then
PRESENTS+=("$f")
fi
done
echo "Compilation de ${#PRESENTS[@]}/${#CHAPITRES[@]} sections..."
# --- PDF papier, format KDP 6x9 pouces (15.24 x 22.86 cm), SANS fond perdu ---
# Ce livre est composé uniquement de texte (pas d'image pleine page), donc pas
# de fond perdu ("bleed") nécessaire selon les specs KDP : la taille de page
# PDF est exactement la taille de coupe (6x9"), sans marge de rognage ajoutée.
#
# Marges (specs KDP officielles, minimums selon le nombre de pages) :
# - Marge intérieure (reliure/gouttière) : 0.375" (24-150p) / 0.5" (151-300p)
# / 0.625" (301-500p) / 0.75" (501-700p) / 0.875" (701-828p)
# - Marges extérieures (haut/bas/extérieur), sans fond perdu : 0.25" minimum
# Ce livre visant 250 à 320+ pages, on retient 0.625" en marge intérieure
# (couvre à la fois la tranche 151-300p et 301-500p, jamais en-dessous du
# minimum requis quel que soit le résultat final). À AJUSTER après compilation
# si le nombre de pages final dépasse 500 (passer à 0.75") ou reste sous 150
# (0.375" suffirait, mais garder 0.625" n'est jamais une violation KDP, juste
# un choix plus généreux).
# NOTE : --toc n'est plus utilisé ici. Pandoc placerait automatiquement
# \tableofcontents juste après \maketitle, ce qui empêcherait d'intercaler
# les mentions légales avant la table des matières (ordre imposé par --toc,
# indépendant de l'ordre des fichiers). La table des matières est donc
# générée manuellement, en LaTeX brut, dans table-des-matieres.md (voir ce
# fichier) — c'est ce qui permet l'ordre voulu :
# titre -> mentions légales -> table des matières -> Introduction.
# Ce fichier s'appelait preface.md jusqu'au 03/08/2026 ; la préface a été
# supprimée par arbitrage (motif en section 7 de 00-COORDINATION.md) et le
# fichier renommé, parce qu'il ne sert plus qu'à porter le sommaire.
echo "-> livre.pdf (format papier 6x9\" KDP, sans fond perdu)"
# --lua-filter=typographie-francaise.lua : espaces insécables avant les
# ponctuations doubles, dans les guillemets, avant % et dans les
# groupes de milliers. Pandoc charge babel avec « shorthands=off »
# codé en dur dans son gabarit, ce qui neutralise définitivement les
# raccourcis de babel-french chargés de ce travail ; le filtre le fait
# donc en amont, une seule fois pour le PDF et pour l'EPUB.
# -V indent=true : empêche Pandoc de charger le paquet parskip, qui
# supprime l'alinéa et sépare les paragraphes par un blanc (rendu
# « page web »). Le retrait de première ligne est fixé dans
# preambule.tex, section C.
# -V geometry:includeheadfoot : CORRECTIF DE CONFORMITÉ KDP ajouté le
# 27/07/2026, après mesure directe du PDF compilé. Par défaut, le
# paquet geometry place l'en-tête et le pied de page AU-DESSUS et
# EN DESSOUS des marges top/bottom demandées, en les repoussant vers
# le bord physique de la page plutôt que de les compter dans la
# marge — l'en-tête ressortait ainsi à 12,4pt (0,17") du bord réel
# et le pied de page à 13,9pt (0,19"), tous deux SOUS le minimum
# KDP absolu de 0,25" (18pt) « pour les livres sans fond perdu »,
# qui s'applique à tout contenu imprimé, en-têtes et folios inclus,
# pas seulement au texte courant (page d'aide KDP « Définir la
# taille de coupe, le fond perdu et les marges »).
# includeheadfoot fait rentrer l'en-tête et le pied de page DANS la
# marge top/bottom déclarée : le contenu le plus proche du bord
# physique est alors l'en-tête/pied lui-même, à la distance exacte
# de la marge demandée, jamais moins.
#
# Marges haut/bas ajustées le 27/07/2026. Un premier passage les avait
# portées au minimum KDP exact (0,25"), à la demande de l'auteur ; sur
# relecture, l'auteur a demandé de reprendre un peu de marge sans
# revenir à la valeur généreuse de départ (0,6"). Réglées à 0,4" :
# un cran confortable au-dessus du plancher KDP (0,25"), largement
# sous l'ancienne valeur. Avec includeheadfoot actif, ce 0,4" reste la
# distance réelle entre le bord physique de la page et l'en-tête/le
# pied de page. La marge intérieure (gouttière, 0,625") et la marge
# extérieure (0,5", déjà au-dessus du minimum de 0,25") ne sont pas
# concernées par cette demande et restent inchangées.
pandoc metadata.yaml "${PRESENTS[@]}" \
-o livre.pdf \
--include-in-header=preambule.tex \
--lua-filter=typographie-francaise.lua \
-V indent=true \
-V documentclass=book \
-V classoption=twoside \
-V lang=fr \
-V geometry:includeheadfoot \
-V geometry:paperwidth=6in \
-V geometry:paperheight=9in \
-V geometry:inner=0.625in \
-V geometry:outer=0.5in \
-V geometry:top=0.4in \
-V geometry:bottom=0.4in \
-V fontsize=11pt \
-V linkcolor=black
# Vérification du nombre de pages généré, pour confirmer que la marge
# intérieure choisie est bien conforme au tableau KDP (voir section 11 de
# 00-COORDINATION.md pour la marche à suivre en cas de dépassement).
if command -v pdfinfo &> /dev/null && [ -f livre.pdf ]; then
PAGES=$(pdfinfo livre.pdf 2>/dev/null | awk '/^Pages:/ {print $2}')
if [ -n "$PAGES" ]; then
echo " Nombre de pages généré : $PAGES"
if [ "$PAGES" -gt 500 ]; then
echo " ATTENTION : au-delà de 500 pages, la marge intérieure KDP minimale"
echo " passe à 0.75\". Relancer la compilation en ajustant geometry:inner=0.75in."
elif [ "$PAGES" -le 150 ]; then
echo " Info : sous 150 pages, la marge intérieure minimale KDP est 0.375\"."
echo " 0.625\" reste conforme (marge plus généreuse que le minimum requis)."
fi
fi
fi
# --- EPUB, texte fluide pour liseuse ---
# --css=epub.css : feuille de style maison (alinéas, justification,
# césure, titres, citations, notes). Elle REMPLACE la feuille par
# défaut de Pandoc, qui composait le texte au fer à gauche, sans
# alinéa et avec un blanc entre chaque paragraphe. Unités relatives
# uniquement, et aucune police imposée : le réglage du lecteur sur sa
# liseuse doit primer.
# Le filtre typographique est le même que pour le PDF, pour que les
# deux sorties ponctuent à l'identique.
echo "-> livre.epub (eBook)"
# --lua-filter=structure-epub.lua : reconstruit, pour l'EPUB seul, les
# titres écrits en LaTeX brut dans le manuscrit (Introduction,
# Conclusion, pages de partie). Sans lui, le convertisseur EPUB
# ignorait ces blocs : l'Introduction n'avait aucun titre, était
# collée au fichier précédent et manquait au sommaire de la liseuse.
pandoc metadata.yaml "${PRESENTS[@]}" \
-o livre.epub \
--lua-filter=structure-epub.lua \
--lua-filter=typographie-francaise.lua \
--css=epub.css \
--toc \
--toc-depth=1 \
--epub-title-page=true \
-V lang=fr
echo "Terminé : livre.pdf et livre.epub générés."