Corrige le texte qui débordait des boîtes dans les schémas, et l'en-tête des PDF

toile() laissait les marges par défaut de matplotlib : une unité valait ~0,78 cm au lieu de 1 cm, les boîtes étaient donc trop petites pour leur texte. Les axes occupent désormais toute la figure, et boite() réduit la police si le texte dépasse encore (ajuster_texte). En-tête et pied de page : grille et align() à la place de #h(1fr), neutralisé par le préambule de Quarto (titre renvoyé à la ligne, numéro de page à gauche).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Artemia
2026-10-18 16:25:29 +02:00
co-authored by Claude Opus 5.5
parent 379cd03bc5
commit 170588dc2c
34 changed files with 2133 additions and 2120 deletions
+18 -3
View File
@@ -12,7 +12,8 @@ CLAIR = { # fonds pâles associés aux couleurs de la charte
def toile(largeur_cm, hauteur_cm, xmax=None, ymax=None):
"""Figure sans axes, en coordonnées « cm » (1 unité = 1 cm à l'échelle d'origine)."""
fig, ax = plt.subplots(figsize=(largeur_cm * CM, hauteur_cm * CM))
fig = plt.figure(figsize=(largeur_cm * CM, hauteur_cm * CM))
ax = fig.add_axes((0, 0, 1, 1)) # pas de marges : 1 unité = 1 cm, police et boîtes à la même échelle
ax.set_xlim(0, xmax or largeur_cm)
ax.set_ylim(0, ymax or hauteur_cm)
ax.set_aspect("equal")
@@ -27,12 +28,26 @@ def boite(ax, x, y, l, h, texte="", couleur=BLEU, taille=9, gras=False, fond=Non
boxstyle=f"{style},pad=0,rounding_size=0.15" if style == "round" else style,
facecolor=fond, edgecolor=couleur, linewidth=1.4, alpha=alpha))
if texte:
ax.text(x, y, texte, ha="center", va="center", fontsize=taille, color=ENCRE,
fontweight="bold" if gras else "normal", linespacing=1.3)
t = ax.text(x, y, texte, ha="center", va="center", fontsize=taille, color=ENCRE,
fontweight="bold" if gras else "normal", linespacing=1.3)
ajuster_texte(ax, t, l, h)
return {"c": (x, y), "g": (x - l / 2, y), "d": (x + l / 2, y),
"h": (x, y + h / 2), "b": (x, y - h / 2)}
def ajuster_texte(ax, t, l, h, marge=0.86, taille_min=5.5):
"""Réduit la police du texte t jusqu'à ce qu'il tienne dans une boîte l × h (unités de données)."""
rendu = ax.figure.canvas.get_renderer()
ax.apply_aspect() # sinon la mise à l'échelle « equal » n'est appliquée qu'au rendu final
(x0, y0), (x1, y1) = ax.transData.transform([(0, 0), (l, h)])
largeur_max, hauteur_max = abs(x1 - x0) * marge, abs(y1 - y0) * marge
while t.get_fontsize() > taille_min:
ext = t.get_window_extent(rendu)
if ext.width <= largeur_max and ext.height <= hauteur_max:
break
t.set_fontsize(t.get_fontsize() * 0.95)
def fleche(ax, depart, arrivee, texte="", couleur=ENCRE, taille=8, double=False, pointille=False,
cote="haut", decalage=0.18, courbe=0, fond=False):
"""Flèche entre deux points, avec étiquette optionnelle au milieu.