- 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.
229 lines
11 KiB
Bash
Executable File
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."
|