Carnet Wiki

Serveur TeX

Voir aussi la page LaTeX

Cette contribution vous explique comment permettre à vos utilisateurs de rentrer des formules en \LaTeX simplement en tapant les formules en TeX (ou LaTeX) entre des balises $...$.

x^2_a

Pour cela, il faut que les formules soient compilées quelque part. Celà requiert a priori un serveur où latex est installé et où vous avez un accès "shell", c’est-à-dire où vous pouvez exécuter des commandes. Mais une autre solution est de faire faire le travail de compilation par un serveur quelque part sur internet, à qui vous soumettez des requêtes de formules à compiler et qui vous sert les images correspondantes. Ici nous laissons le choix, il y a un serveur hébergé par spip.org : http://math.spip.org/ et vous pouvez également (si vous avez la possibilité c’est préférable), compiler chez vous.

Puisqu’un ou plusieurs groupes de personnes sont d’accord pour mettre à disposition de la communauté SPIP un serveur générant ces images, ce raccourci pourra devenir standard à terme. La charge ne sera pas excessive, car le client SPIP comme le serveur de TeX disposent d’un cache.

Essais avec \TeX ; ce résultat est obtenu à partir du script tex2im (www.nought.de/tex2im.html), à installer dans /usr/local/bin/ ou ailleurs sur votre (notre) serveur, et du filtre avant_typo() ci-dessous, à installer dans ecrire/mes_options.php3.

Voici une formule sympa : $\sum_{i=0}^5 x_i^2$ ; elle s’affichera ainsi : \sum_{i=0}^5 x_i^2

La même avec mimeTeX : (attention il faut mettre \Bigsum au lieu de \sum).

Voir aussi http://c2.com/cgi/wiki?MathWiki et http://en.wikipedia.org/wiki/Wikipe....

Cette astuce est utilisée ici : http://ens.math.univ-montp2.fr/SPIP...

Afin de conserver un fonctionnement normal aux sites voulant afficher des $ ces raccourcis ne sont disponibles que si vous mettez <math> quelque part avant dans le texte ; il est aussi possible de mettre <math>$...$</math> pour refermer le mode math et afficher des $ normalement, comme ici.

En voici une autre encore plus sympa : \left[ \begin{array}{rrrr}  S_{11} & S_{21} & S_{31} \\ S_{12} & S_{22} & S_{32} \\ S_{13} & S_{23} & T_{33} \end{array} \right]

Et encore : \psi_{tot}(x,-t_0,r) = \frac{1}{(2\pi)^2} \int~!~!~!\int \tilde\Psi_{tot}\left(k_x,\frac{c}{2}\sqrt{k_x^2 + k_r^2},r=0\right)

Et plus complet encore :

[C_3] = {\color{red} \langle \vec k_{3L} \vec k_{3L}^{~:\adj} \rangle }= \left[ \begin{array}{rrrr} S_{11} & S_{21} & S_{31} \\ S_{12} & S_{22} & S_{32} \\ S_{13} & S_{23} & S_{33} \end{array} \right]

Un dernier pour la route :

H_0d_M = \frac{1}{\left|\Omega_k\right|^{1/2}}\ \mathrm{sinn}\left\{ \left|\Omega_k\right|^{1/2} \int_0^{z_1} (1+z)^2(1+\Omega_\mathrm{M}z)-z(2+z)\Omega_\Lambda]^{-1/2}dz\right\}

\alpha + \Omega

Voici ce qui se passe si vous essayez d’envoyer une commande dangereuse : $\input fichier.txt$ donne \input fichier.txt


Ancien code :

Le code client TeX est intégré en standard dans SPIP (à partir de la version 1.8alpha2). Voir ci-dessous le code du serveur.

mes_options.php3 ; pour passer en mode client/serveur il faut renseigner l’adresse du serveur (par exemple http://math.spip.org/tex.php?) :

// Supprimer les codes dangereux pour  [->551]  ;
// extrait de http://www.mayer.dial.pipex.com/tex.htm
function math_ignore_dangerous($texte) {
	$danger = "include|def|command|loop|repeat|open|toks|".
	"output|input|catcode|name|\^\^|every|errhelp|".
	"errorstopmode|scrollmode|nonstopmode|batchmode|read|".
	"write|csname|newhelp|uppercase|lowercase|relax|".
	"aftergroup|afterassignment|expandafter|noexpand|".
	"special";

	if (ereg("($danger)",$texte,$regs))
		return "\\textrm{\color{red}Don't ``$regs[1]'' me.}";

	return $texte;
}

function math_image($texte) {

	// aller chercher sur un serveur "spitex"
	// (si vide, creer l'image en local via tex2im)
	$spitex = 'http://math.spip.org/tex.php?';

	// options du tex2im local
	$options = "-r 90x90";

	// repertoire local des images  [->551]  (creees ou importees)
	$dir = ($GLOBALS['flag_ecrire'] ? '../' : '').'IMG/ [->551] ';
	if (!is_dir($dir))
		mkdir ($dir);

	$fichier = "$dir/".md5(trim($texte)).'.png';

	// (Re)Creer l'image, en local ou en client-serveur
	if (!file_exists($fichier)) {

		if ($spitex == '') // en local
		{
			$texte = math_ignore_dangerous($texte);
			$texte = escapeshellarg($texte);
			spip_log($cmd = "/usr/local/bin/tex2im $options -o $fichier $texte");
			exec($cmd);
		}
		else // en client/serveur
		{
			spip_log($url = $spitex.urlencode($texte));
                     include_ecrire('inc_sites.php3');
                     if ($image = recuperer_page($url)) {
                            if ($f = fopen($fichier, 'w')) {
                                    fwrite($f, $image);           
                                    fclose($f);
				}
			}
		}
	}

	// retour fichier local
	return $fichier;
}

// echapper les caracteres que typo() veut marabouter
function caracteres_alt($texte) {
	foreach (array(';', '{', '}', ':',"?", '!', '"', '\'', '<', '>') as $bug)
		$texte = str_replace($bug, "&#".ord($bug).";", $texte);
	return $texte;
}

function math_filter($texte) {
	preg_match_all("|<math>(.*?)</math>|s", $texte, $regs, PREG_SET_ORDER);

	foreach ($regs as $math) {
		$fichier = math_image($math[1]);
		list(,,,$size) = @getimagesize($fichier);
		$alt = caracteres_alt($math[1]);
		if ($alt) $alt = "alt=\"$alt\" title=\"$alt\""; 
		$img = "<img src=\"$fichier\" align=\"middle\" $size $alt />";
		$texte = str_replace($math[0], $img, $texte);
	}	

	return $texte;
}

function avant_typo($texte) {
	$texte = math_filter($texte);
	return $texte;
}

Si vous avez un accès shell et un serveur en ligne 24h/24, et que vous voulez héberger un serveur compilateur, contactez nous, il vous faudra installer, en plus de tex2im (www.nought.de/tex2im.html) , de LaTex (apt-get install tetex-bin tetex-extra latex-ucs pour debian) le script suivant :

Code du serveur tex.php :

<?php

//
// Serveur d'images TeX developpe pour SPIP par
// Philippe Riviere <fil@rezo.net>
// et Benjamin Sonntag <benjamin@sonntag.fr>
// Distribue sous licence GNU/GPL
// © 2004 - v0.2
//  [->ChangeLog]  : ajout d'une box
//


// Necessite l'installation de TeX,  [->ImageMagick] , et du script
// qui fait la glue entre les deux : tex2im, lui-meme etant
// disponible a http://www.nought.de/tex2im.php sous GNU/GPL


// Cache du serveur
$cache_dir = "CACHE/spiTeX";
if (!is_dir($cache_dir))
	mkdir ($cache_dir);


// Supprimer les codes dangereux pour  [->551]  ;
// extrait de http://www.mayer.dial.pipex.com/tex.htm
function math_ignore_dangerous($texte) {
	$danger = "include|def|command|loop|repeat|open|toks|".
	"output|input|catcode|name|\^\^|every|errhelp|".	
	"errorstopmode|scrollmode|nonstopmode|batchmode|read|".
	"write|csname|newhelp|uppercase|lowercase|relax|".
	"aftergroup|afterassignment|expandafter|noexpand|".
	"special";

	if (ereg("($danger)",$texte,$regs))
	return "\\textrm{\color{red}Don't ``$regs[1]'' me.}";

	return $texte;
}

function math_enhance($tex) {
	// Correction pour forcer la ligne de base
	$tex = "\\setbox1=\\hbox{\$\\displaystyle ".$tex."\$}\n"
		."\\newdimen\\haut\n\\newdimen\prof\n"
		."\\haut=\\ht1\n\\prof=\\dp1\n"
		."\\ifdim\\haut>\\prof\\prof=\\haut\\else\\haut=\\prof\\fi\n"
		."\\advance\haut by .5em\n"
		."\\color{white}\\vrule height \\haut depth \\prof width 0.1pt\\color{black}\\box1";
	return $tex;
}

function math_($texte) {
	// Options de tex2im
	// -z = fond transparent ; -r = resolution
	$options = "-r 90x90";

	global $cache_dir;

	$fichier = "$cache_dir/".md5(trim($texte)).'.png';

	if (!file_exists($fichier) OR (filemtime($fichier)<filemtime("spitex.php"))) {
		$texte = math_ignore_dangerous($texte);
		$texte = escapeshellarg(math_enhance($texte));
		$cmd = "/usr/local/bin/tex2im $options -o $fichier $texte";
		exec($cmd);
	}

	return $fichier;
}

// Retourner l'image demandee
header("Content-Type: image/png");
readfile(math_(urldecode($_SERVER['QUERY_STRING'])));

?>

(ARNO*) Il manque le support de symboles mathématiques usuels, notamment pouvoir écrire « x\in\mathbb(R) » (pour « x est un réel »).

Ce qui demande des choses en plus :
-  installer les fontes mathématiques de l’AMS sur la machine ;
-  installer les styles AMS (amsfont.sty et amssymb.sty) pour LaTeX ;
-  créer un fichier d’entête, par exemple « tex_header.tex », qui contient la ligne suivante :

\usepackage{amssymb}


-  installer ce fichier d’entête au même niveau que tex.php (par exemple) ;
-  ajouter dans « tex.php » un complément aux options :

// Options de tex2im
	// -z = fond transparent ; -r = resolution
	$options = "-r 90x90";
	//
	$options .= " -x tex_header.tex";


-  pas encore testé, mais c’est le principe.

(Kri) Je suis d’accord, il faut inclure les paquetages standards, amstex en particulier. J’ai résolu le problème en patchant un peu tex2im pour lui mettre un "format" contenant ces paquetages, c’est un fichier binaire produit par initex et /dump qui accélère notablement la compilation. En nommant header.tex le fichier suivant :

\documentclass[12pt]{article}
\usepackage[latin1]{inputenc}  % accents 8 bits dans le source
\usepackage[french]{babel}
\usepackage{amsmath,amssymb}
\usepackage{color}
\usepackage[dvips]{graphicx}
\pagestyle{empty}
\DeclareMathSymbol{\Z}{\mathalpha}{AMSb}{"5A}
\DeclareMathSymbol{\PP}{\mathalpha}{AMSb}{"50} % the letter Bbb P for projective space
\DeclareMathSymbol{\Q}{\mathalpha}{AMSb}{"51}
\DeclareMathSymbol{\N}{\mathalpha}{AMSb}{"4E}
\DeclareMathSymbol{\R}{\mathalpha}{AMSb}{"52}
\newcommand{\F}{\mathbb{F}}
\newcommand{\G}{\mathbb{G}}

\newcommand{\K}{\mathbb{K}}

\newcommand{\U}{\mathbb{U}}
\newcommand{\C}{\mathbb{C}}
\dump

Alors,
initex \&latex header.tex fabrique header.fmt qu’on peut demander à LaTeX de charger à l’intérieur de tex2im patché (en gros j’enlève la portion autour de documentclass et je rajoute le format à charger) :

---
>
133a134,137
> \documentclass[12pt]{article}
> \usepackage{color}
> \usepackage[dvips]{graphicx}
> \pagestyle{empty}
191c195
< latex -interaction=batchmode \&/var/www/html/SPIP/header  out.tex > /dev/null
---
> latex -interaction=batchmode out.tex > /dev/null

Cela n’empêche pas de mettre encore une en-tête ailleurs que tex2im ira chercher.

Remarquez que cette solution de remplacement d’une formule par le résultat d’un traitement n’est pas propre à latex, s’il existe une manière de coder quelquechose au clavier, représentant un certain objet (par exemple de la musique), et que vous connaissez un logiciel traducteur qui produit un format qu’on peut inclure dans une page html, rien n’empêche d’utiliser la même méthode pour faire tourner le logiciel sur les parties incluses.

Fil - Mise à jour :10 septembre 2014 à 12h23min