Oui, je pense que le résumé de Sam est exact : si nous voulons que les e-mails / la vue d’impression affichent les maths rendues, nous avons besoin d’un rendu des maths côté serveur (ou au moins d’un « pré-rendu » côté serveur), car les clients de messagerie n’exécuteront pas MathJax.
Une approche réaliste serait :
- Pendant la cuisson (ou dans un travail d’arrière-plan après la cuisson), trouver les spans mathématiques (en ligne + affichage).
- Rendre chaque expression en SVG (ou MathML en secours) en utilisant MathJax dans un environnement Node.
- Remplacer les maths dans le HTML cuit utilisé pour les e-mails/l’impression par :
\u003csvg ...\u003een ligne (meilleure fidélité, pas de récupération externe), ou\u003cimg src=\"data:image/svg+xml;base64,...\"\u003e(plus compatible pour certains clients, mais peut devenir volumineux).
- Mettre en cache avec une clé stable (par exemple,
sha256(latex + display_mode + macros + font_config)), afin de ne rendre qu’une seule fois par formule unique.
Les points délicats (mais gérables s’ils sont délimités avec soin) :
- Simulation de DOM : La sortie « navigateur » de MathJax veut un DOM ; nous aurions donc probablement besoin de
mathjax-full+jsdom(ou d’utiliser la voie de l’adaptateur pur). - Performance / délais d’attente : le faire de manière asynchrone dans une file d’attente de tâches et dégrader gracieusement (laisser le LaTeX tel quel si le rendu échoue).
- Particularités des clients de messagerie : certains clients suppriment les SVG ; avoir un plan de secours est donc important (par exemple, texte brut/LaTeX, ou MathML là où il est pris en charge).
Si quelqu’un souhaite faire un essai rapide, la première expérience que je ferais serait :
- Un tout petit script Node utilisant
mathjax-fullpour rendre$begin:math:text$E\\=mc\\^2$end:math:text$en SVG, - Voir quelles hypothèses il fait (DOM vs adaptateur),
- Décider ensuite si MiniRacer est une impasse et si nous devons traiter cela comme « nécessite Node disponible » (ou un petit service).
Si cet essai fonctionne, nous pourrons discuter de l’endroit où il s’intègre (pipeline d’e-mail vs cuisson vs vue d’impression), et de ce que nous mettons en cache/stockons.