Les webmasters de site Web le savent bien : dès que l'on souhaite dépasser le cap des équations mathématiques de base du type 12 x + 5, HTML montre rapidement ses limites.
Pourquoi ? Parce que HTML n'a pas été crée pour mettre en forme des articles mathématiques, mais pour présenter du contenu. Implicitement, il était considéré que les thèses mathématiques resteraient cantonnées aux fichiers PDF générés avec LaTeX. Mais avec la démocratisation des pages Web, ceci devint rapidement un manque ; le W3C tenta de réagir en proposant MathML en 2001, mais la formule ne convainquit pas : peu de support de la part des navigateurs, et impossible d'écrire « à la main » une formule : il faut très rapidement un logiciel spécialisé pour gérer la verbosité du langage.
Alors que faire ? Abandonner les mathématiques ? Attendre le support global de MathML ? Il y a une solution plus simple…
Ce tutoriel part du principe que vous maitrisez déjà PHP.
LaTeX
LaTeX est un système de composition de documents extrêmement utilisé dans le milieu scientifique, car il intègre des outils poussés de mise en page et une gestion des formules mathématiques.
Quel rapport avec les sites Web ? De nombreux débrouillards ont eu l'idée d'utiliser LaTeX pour générer des formules, puis d'enregistrer en image le résultat. C'est ce que nous allons utiliser pour la suite de cette partie.
Comment ça marche ?
L'internaute fait une requête vers un script CGI qui se charge de compiler la formule et de la rendre sous forme d'image. Le problème ? De nombreuses personnes n'ont pas la possibilité d'installer des applications CGI sur leurs serveurs – nous verrons plus tard comment y remédier. Une fois l'image générée, il suffit de l'envoyer au client avec la balise img habituelle.
Pour le webmaster, deux solutions :
écrire directement son code HTML avec un lien vers les images ;
développer un « mini langage » qui intègre les mathématiques : par exemple, les intégrer dans une balise virtuelle <math>, et avant d'envoyer la page au client, remplacer toutes ces balises par des images. Cette seconde solution est plus propre et plus agréable, d'autant plus qu'elle permet d'améliorer la sémantique de votre code.
Syntaxe
La syntaxe LaTeX n'est pas extrêmement compliquée, et vous pourrez l'apprendre en quelques lignes. Nous n'en parlerons pas sur cette page, jettez un coup d'œil sur cette page pour en savoir plus ; mais sachez que le peu que nous aborderons ici devrait suffire pour vos besoins. Et pour en voir plus, regardez cette aide mémoire Maple avec un bon assortiment de formules.
Que choisir ?
Deux parsers sont particulièrement connus.
Mimetex. cgi : la solution la plus répandue. Elle a l'avantage de gérer complétement le LaTeX (y compris les symboles spéciaux et les matrices). En contrepartie, elle est relativement lente… et son rendu n'est pas particulièrement agréable (voir le comparatif).
Mathtran : moins connue, cette solution ne gère que le TeX. Il est donc impossible (à moins de ruser – cf. Pour aller plus loin) d'avoir des « blackboard letter » (les lettres utilisées pour représenter les ensembles : ℝ par exemple), des matrices, ou des intégrales fermées. En revanche, cette solution a l'avantage de fournir des images beaucoup plus propres qui s'intégreront mieux dans vos pages.
Comparatif
Mimetex
Plus complet, moins beau.
Mathtran
Plus beau, moins complet.
Installation
Vous avez fait votre choix entre les deux parsers ? Parfait !
Si vous avez un serveur dédié, il ne vous reste plus qu'à installer le script. Je ne détaille pas ici ; partant du principe que si vous avez un serveur dédié vous savez l'utiliser !
Sinon, deux choix :
Mettre les liens de vos images vers un site externe que vous exploiterez pour générer vos images. D'accord, c'est faisable… mais ce n'est pas très sympa pour le site que vous « exploitez », surtout si vous avez plusieurs images par page et un site fréquemment visité ! Imaginez le pauvre webmaster qui voit ses ressources serveur disparaitre pour générer des images sur votre site…
Mettre les mains à la pâte.
La base
Dans l'exemple qui suit, j'ai choisi d'utiliser mathtran. Si cela ne vous plait pas, vous n'avez qu'à changer l'URL à la ligne CURLOPT_URL !
Vous l'imaginez bien, il n'y a pas de solutions miracle, et il va falloir exploiter au moins une fois quelqu'un.
Nous allons donc demander au serveur « exploité » de nous générer l'image. Puis nous la mettrons en cache « local », et à la prochaine demande nous pourrons la ressortir sans avoir à repasser par le site externe !
NOTA : nous utilisons CURL qui est la méthode la plus souple et qui a le plus de chances d'être autorisée chez votre hébergeur. Vous pouvez aussi passer par fopen, file_get_contents, … si le gestionnaire d'URL est activé.
À chaque fois que vous voudrez afficher une image, vous devrez donc faire appel à votre script1 :
Et le résultat :
Parfait ? Pas tellement…
L'image est un peu rachitique, vous ne trouvez pas ? On va donc rajouter un \displaystyle{} autour de la formule : tex=\displaystyle{' . rawurlencode(\$_GET['m']) . '}. Le displaystyle indique à LaTeX que l'on veut récupérer l'image « en bloc », et pas en style « inline ». Ce dernier style est pratique pour les présentations, puisqu'il s'intègre bien à la ligne sans la déformer ; mais il s'avère quand même moins lisible. Cette fois, l'image est mieux : .
On n'a pas de transparence… regardez la première image : elle a un fond blanc. Cela risque de gêner si vous avez une image d'arrière plan… voyons comment améliorer cela.
Transparence
Il va falloir utiliser la libraire GD (incluse par défaut avec PHP) pour corriger ce problème et rendre les pixels blancs transparents. Voilà la nouvelle version de votre parser :
Et le rendu : . Cette fois, c'est bien ce que l'on souhaitait !
En fait, cela rend bien sur ce site… mais si vous le faites sur votre site, vous allez avoir un problème de positionnement : le bas de l'image sera alignée avec le bas de votre texte, ce qui aura pour effet de décaler les barres de fraction vers le haut. Heureusement, il suffit de peu de choses pour améliorer ça…
Avant de continuer, quelques exemples de réalisation :
Formule : \lim_{x \rightarrow \infty} \frac1x\;=0
Rendu :
Formule : \sum_{n=0}^{\infty} \frac{1}{n!}\;=e^1
Rendu :
Formule : f(a)+\frac{f'(a)}{1!}(x-a)+\frac{f''(a)}{2!}(x-a)^2+\frac{f^{(3)}(a)}{3!}(x-a)^3+\cdots
Rendu :
Nous avons donc fini la première partie de ce tutorial : un outil pour afficher les maths. Mais ce n'est pas encore parfait !
Un peu de sémantique
Ça y est, nous avons un script fonctionnel… mais peut être un peu compliqué. En effet, nous aurons rarement besoin d'image : une grande partie des équations peut être affichée directement, sans utiliser d'images ! Quelques exemples ? Un+1=Un + Un-1, ou α x2 + β x + γ = 0 (testez en sélectionnant, il ne s'agit pas d'images)… mais comment reconnaitre les équations qui peuvent être affichées sous forme de texte ?
Est-ce vraiment utile ?
Avant de nous avancer, peut être faut-il expliquer en quoi il est intéressant de passer par du texte :
D'abord, c'est moins lourd à charger pour vos visiteurs. Les images ont leur poids, et ralentissent le chargement complet de la page ;
Ensuite, c'est plus accessible. Je ne rentrerais pas dans les détails de l'accessibiltié et de la sémantique dans cet article car il y aurait des pages à rédiger, mais comprenez que pour un aveugle (ou plus prosaïquement pour Google) du texte est plus clair qu'une image, aussi jolie soit-elle.
Enfin, le texte peut être zoomé dézoomé, renvoyé à la ligne… contrairement à une image.
Comment faire ?
Nous allons maintenant supposer que vos textes sont rédigés dans un format proche du HTML, et que vous avez sélectionné la balise <math> pour entourer vos formules (c'est le cas sur Wikipedia). Voici un texte d'exemple :
… associé à une fonction de conversion math/image :
Notre rendu sera alors :
Soit un entier naturel non nul, est un -nombre de Kaprekar dans la base si et seulement s'il existe deux entiers naturels quelconque et tels que et .
Que d'images inutiles !
Nous allons donc passer en textuel toutes les formules qui n'utilisent pas de balises (signalées par un anti-slash). Rajoutons aussi un support des puissances et des exposants, et quelques formules basiques qui peuvent facilement être rendues en HTML (attention, le niveau du code augmente) :
Et cette fois il n'y a plus aucune image :
Soit n un entier naturel non nul, k est un n-nombre de Kaprekar dans la base a si et seulement s'il existe deux entiers naturels u quelconque et 0 ≤ v ≤ an tels que k2 = u.an + v et k = u + v.
Pensez à rajouter des règles dans votre CSS :
Pour aller plus loin
Comme je l'ai dit plus haut, par défaut mathtran ne gère pas les matrices et les lettres « blackboard » (bref, les ajouts LaTeX) : nous allons voir comment les ajouter.
Nous verrons aussi comment régler certains problèmes qui peuvent apparaitre une fois le module sémantique installé.
Blackboard
Il n'y a malheureusement pas de miracles : si la formule est trop complexe, on ne la récupérera pas. Mais si elle est simple, on peut l'utiliser en texte – voir le code plus haut qui donne les caractères unicode des lettres communes. Et on peut donc écrire « ℕ est l'ensemble des naturels, ℝ celui des réels. ».
Matrice
En LaTeX, il est commun d'utiliser \left(\begin{array}{cc} 0&0&0\\0&0&0\\0&0&4\end{array}\right) pour définir une matrice. Mathtran le permet, mais pas avec cette syntaxe : il faut donc marquer \left[\matrix{0 & 0 & 0 \cr 0 & 0 & 0 \cr 0 & 0 & 4}\right] pour obtenir un résultat proche.
Éléments chimiques
Vous aurez peut être noté une condition bizarre dans le code précédent : $TryHTML{strlen($TryHTML)-1}!='~').
En fait, c'est pour permettre le forcage du rendu en image, qui est nécessaire pour pallier à certaines déficiences du HTML.
Imaginons par exemple l'écriture d'un symbole chimique – au hasard, l'hélium : 21He. Eh oui, HTML ne met pas les sup et sub les uns en dessous des autres… il faut donc forcer l'image. Pour cela, j'ai choisi (comme Wikipedia) de mettre un tilde à la fin de la formule : il n'est pas affiché, mais force la génération de l'image même si le contenu pourrait en théorie être un texte : .
Conclusion
Voilà qui clôt ce rapide tutoriel. Vos questions sont les bienvenues, vous pouvez me contacter.