Go to content

AgrégationChimie

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.

Go to top

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.
Go to top

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.

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.

Go to top

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>|\&integers;|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.

Go to top

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"
Go to top

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"
Go to top

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"
Go to top

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"
Go to top
Go up