Convertir un fichier .tex pour le rendre disponible sur internet via MathML
État de l'art
Convertir un fichier .tex pour le rendre accessible sur internet a longtemps été un saint graal avec des réussites plus ou moins nombreuses. Certains programmes se sont fait une place sur le marché comme latex2html ou hevea où encore tex4ht.
Cependant, ces trois acteurs majeurs du domaine datent d'une dizaine d'année et n'intègrent pas les dernières avancées en terme de conversion. En effet, un nouveau langage est né et présente des fonctionnalités presque capables de faire rougir notre cher Tex, il s'agit de MathML. L'écriture de ce langage est complètement impossible sans une aide logicielle, mais ici, il ne s'agit plus que de convertir du Tex en MathML, on peut donc supposer que le plus dur (écrire le document en Tex) a été fait.
Pourquoi abandonner les convertisseurs "classiques" ? La plupart sont basés sur le rendu graphique des formules via des images et peuvent parfois mal accepter les macros pourtant couramment utilisées. Ceci rend plus difficile l'édition à partir du document web : l'image est statique et ne pourra pas être retouchée alors que MathML ne change pas la formule, il change uniquement son expression, la manière de la décrire.
Hevea représentait une belle avancée mais la gestion des environnements et la lourdeur du code généré (utilisation de tableaux à outrance en contradiction avec les règles élémentaires du web) m'ont semblé être des handicap suffisamment importants pour chercher un autre solution, plus moderne et naturellement apte à décrire des formules mathématique. On s'éloigne ainsi du "bidouillage" pour aller vers une solution réellement pérenne.
Trouver LE script qui va bien
Le plus dur est donc de trouver un script suffisamment performant pour convertir efficacement un document d'au moins une dizaine de pages. Pour ça, j'ai trouvé l'excellent TTM.
Les plus :
- Gratuit sous linux : une petite installation et ça tourne.
- Supporte les macros.
- Sortie en MathML.
- Supporte les parenthèses de grande taille.
- Sortie acceptable sans avoir à toucher au document Tex.
- Documentation complète
Les moins :
- Nécessite un peu de retouche pour que tout soit parfait. (quelques caractères ne sont pas bien traduits)
- Exige une certaine rigueur dans l'écriture du fichier Tex. (environnements, parenthèses, variables etc..)
- Code non libre, dommage, on pourrait améliorer encore un peu les choses en changeant le script.
- Payant sous windows.
Quelques exemples
Je suis parti d'un fichier assez long : 15 pages avec figures et beaucoup de formules, mais sans tableau ni sections. J'utilise différents package et des macros.
- Rendu hevea "brut" (aucune option configurée)(117Ko) : Le fichier hevea
- Rendu ttM "brut" (aucune option configurée)(118Ko) : Le fichier ttm
- Rendu ttM "propre" non nettoyé par Tidy(113Ko) : Le fichier ttm propre
- Rendu ttM "propre" nettoyé par Tidy (364Ko) : Le fichier ttm après passage par tidy
- Le PDF produit par pdftex(220Ko): Le fichier PDF
Bilan, sans aucune balise spécifique dans le fichier tex et avec un petit script d'une trentaine de ligne, le rendu est quasiment conforme au document produit par pdftex. La différence majeure étant la commande \boxed{} qui n'est pas comprise. De même, on note un rendu incorrect dans Firefox d'une racine carrée qui n'est pas assez longue lorsqu'elle est appliquée à une fraction. Le tout dans un fichier assez léger : 110Ko environ pour 3500 lignes.
Corriger le rendu
TtM annonce quasiment intégralement toutes les commandes qu'il n'a pas su traduire, il suffit donc de corriger les erreurs annoncées.
Caractères non compris
**** Unknown command \leqslant in equation, Line 316
Les caractères non compris sont indiqués, il faut trouver leur équivalent MathML. Pour cela, j'ai trouvé cette page qui indique la majeur partie des caractères mathématiques accessibles : Liste de caractères, il suffit de faire une recherche sur "leqslant" pour trouver le code correspondant.
Il faut donc une petite série de remplacements, voilà un morceau de script bash qui corrige tout celà :
#!/bin/bash for file in 2005B.xml do echo "Correction des caractères non convertis par ttmL" #Caractères qui ne passent pas pour ttml sed 's|\\cancel||g' "$file" > "$file".tmp mv -f "$file".tmp "$file" sed 's|\\bcancel||g' "$file" > "$file".tmp mv -f "$file".tmp "$file" sed 's|\\lessapprox|\⪅|g' "$file" > "$file".tmp mv -f "$file".tmp "$file" sed 's|\\leqslant|\⩽|g' "$file" > "$file".tmp mv -f "$file".tmp "$file" sed 's|\\protect||g' "$file" > "$file".tmp mv -f "$file".tmp "$file" sed 's|\\boxed||g' "$file" > "$file".tmp mv -f "$file".tmp "$file" sed 's|\\geqslant|\⩾|g' "$file" > "$file".tmp mv -f "$file".tmp "$file" sed 's|\\mathbb<mi>Z</mi>|\ℤ|g' "$file" > "$file".tmp mv -f "$file".tmp "$file" done
Dans mon cas, j'ai quelques commandes spéciales pour latex que j'ai pu enlever sans changer l'essence du fichier. Il vous suffit d'adapter ce script aux problèmes que vous rencontrez.
Enlever les balises center
Les balises center sont mal générées, on les enlève :
##balises center virées echo "Correction des balises center" sed 's|<center>||g' "$file" > "$file".tmp mv -f "$file".tmp "$file" sed 's|<\/center>||g' "$file" > "$file".tmp mv -f "$file".tmp "$file"
Les images
Mon fichier d'origine intègre des pdf pour les figures. Le tout étant généré à partir de fichiers .eps. J'ai donc un script annexe pour convertir mes .eps en .png (taille maximale de 700 pixels):
#!/bin/bash for file in *.eps do convert -resize '700>' $file "${file%.eps}".png done
Puis je corrige le texte correspondant pour pointer vers les fichiers png plutôt que les pdf :
#Correction pour images echo "Fichiers png et légendes" sed 's|<a href="\(.*\)\.pdf">Figure</a>|<center><img src="\1\.png" alt="Figure"/></center>|g' "$file" > "$file".tmp mv -f "$file".tmp "$file"
Les parenthèse
Pour avoir des parenthèses adaptées à vos équations, il suffit d'utiliser "\left(" et "\right)" (ou tout autre délimiteur). Les parenthèses sont automatiquement ajustées en taille.
Améliorer la sémantique
Le script convertit les environnement large en h3 Large en h2. Par contre certaines lignes sont en trop à cause des sauts de ligne dans le fichier d'origine et les espaces dans les formules sont pris en compte. On le corrige en ajoutant ces lignes au script bash :
## sémantique echo "Amélioration de la sémantique" sed 's|<div class="p"><!----></div>||g' "$file" > "$file".tmp mv -f "$file".tmp "$file" sed 's|<mo> </mo>||g' "$file" > "$file".tmp mv -f "$file".tmp "$file"
Enlever les lignes inutiles
#On enlève les lignes blanches : echo "Lignes blanches enlevées" sed '/^\s*$/d' "$file" > "$file".tmp mv -f "$file".tmp "$file"