... tag). $size is the size of the police used for the formulas. $pathtoimg is the relative path between the html pages and the images directory. With a simple "echo mathfilter($text,$size,$pathtoimg);", you can display text with mathematical formulas. The mathfilter function will replace all the math tags (formula) in $text by . Example : mathfilter("A math formula : f(x)=sqrt{x},12,"img/") will return : "A math formula : \"f(x)=sqrt{x}\"" The image corresponding to a formula is created only once. Then the image is stocked into the image directories. The first time that mathfilter is called, the images corresponding to the formulas are created, but the next times mathfilter will only return the html code. NOTE : if the free latex fonts furnished with this script don't work well (very tiny formulas - that's could happened with some GD configurations), you should try to use the bakoma versions of these fonts (downloadable here : http://www.ctan.org/tex-archive/fonts/cm/ps-type1/bakoma/ttf/ ) *******************************************************************/ //********* PARAMETERS TO MODIFY ********************************* // The four global variables. Uncomment the line if you need it. global $dirfonts,$dirimg,$symboles,$fontesmath; // choose the type of the declaration according to your server settings (some servers don't accept the dirname(__FILE__) command for security reasons). // NEW in 0.3 version : no more / at the end of $dirfonts and $dirimg // absolute path to the fonts directory if (!isset($dirfonts)) $dirfonts=$_SERVER["DOCUMENT_ROOT"]."/phpmathpublisher/fonts"; // or $dirfonts=dirname(__FILE__)."/phpmathpublisher/fonts"; // absolute path to the images directory if (!isset($dirimg)) $dirimg=$_SERVER["DOCUMENT_ROOT"]."/phpmathpublisher/img"; // or $dirfonts=dirname(__FILE__)."/phpmathpublisher/img"; //****************************************************************** $symboles = array( '~'=>' ', 'alpha'=>'®', 'beta'=>'¯', 'gamma'=>'°', 'delta'=>'±', 'epsilon'=>'²', 'varepsilon'=>'"', 'zeta'=>'³', 'eta'=>'´', 'theta'=>'µ', 'vartheta'=>'#', 'iota'=>'¶', 'kappa'=>'·', 'lambda'=>'¸', 'mu'=>'¹', 'nu'=>'º', 'xi'=>'»', 'pi'=>'¼', 'varpi'=>'$', 'rho'=>'½', 'varrho'=>'%', 'sigma'=>'¾', 'varsigma'=>'&', 'tau'=>'¿', 'upsilon'=>'À', 'phi'=>'Á', 'varphi'=>''', 'chi'=>'Â', 'psi'=>'Ã', 'omega'=>'!', 'Gamma'=>'¡', 'Lambda'=>'¤', 'Sigma'=>'§', 'Psi'=>'ª', 'Delta'=>'¢', 'Xi'=>'¥', 'Upsilon'=>'¨', 'Omega'=>'­', 'Theta'=>'£', 'Pi'=>'¦', 'Phi'=>'©', 'infty'=>'∞', 'ne'=>'≠', '*'=>'×', 'in'=>'∈', 'notin'=>'∉', 'forall'=>'∀', 'exists'=>'∃', 'notexists'=>'∄', 'partial'=>'∂', 'approx'=>'≈', 'left'=>'←', 'right'=>'→', 'leftright'=>'↔', 'doubleleft'=>'⇐', 'doubleright'=>'⇒', 'doubleleftright'=>'⇔', 'nearrow'=>'↗', 'searrow'=>'↙', 'pm'=>'±', 'bbR'=>'ℝ', 'bbN'=>'ℕ', 'bbZ'=>'ℤ', 'bbC'=>'ℂ', 'inter'=>'⋂', 'union'=>'⋃', 'ortho'=>'⊥', 'parallel'=>'∥', 'backslash'=>'\', 'prime'=>''', 'wedge'=>'⋀', 'vert'=>'∥', 'subset'=>'⊂', 'notsubset'=>'⊄', 'circ'=>'∘', 'varnothing'=>'ø', 'cdots'=>'⋯', 'vdots'=>'⋮', 'ddots'=>'⋱', //operateurs 'le'=>'6', 'ge'=>'>', '<'=>'<', '>'=>'>', //parentheses '('=>'³', ')'=>'´', '['=>'h', ']'=>'i', 'lbrace'=>'(', 'rbrace'=>')', //autres '_hat'=>'c', '_racine'=>'q', '_integrale'=>'R', '_dintegrale'=>'∬', '_tintegrale'=>'∭', '_ointegrale'=>'H', '_produit'=>'Q', '_somme'=>'P', '_intersection'=>'T', '_reunion'=>'S', '_lim'=>'lim', //fonctions 'arccos'=>'arccos', 'ker'=>'ker', 'arcsin'=>'arcsin', 'lg'=>'lg', 'arctan'=>'arctan', 'arg'=>'arg', 'cos'=>'cos', 'cosh'=>'cosh', 'ln'=>'ln', 'cot'=>'cot', 'log'=>'log', 'coth'=>'coth', 'max'=>'max', 'csc'=>'csc', 'min'=>'min', 'deg'=>'deg', 'det'=>'det', 'sec'=>'sec', 'dim'=>'dim', 'sin'=>'sin', 'exp'=>'exp', 'sinh'=>'sinh', 'gcd'=>'gcd', 'sup'=>'sup', 'hom'=>'hom', 'tan'=>'tan', 'inf'=>'inf', 'tanh'=>'tanh' ); $fontesmath = array( '~'=>'FreeSerif', 'alpha'=>'cmmi10', 'beta'=>'cmmi10', 'gamma'=>'cmmi10', 'delta'=>'cmmi10', 'epsilon'=>'cmmi10', 'varepsilon'=>'cmmi10', 'zeta'=>'cmmi10', 'eta'=>'cmmi10', 'theta'=>'cmmi10', 'vartheta'=>'cmmi10', 'iota'=>'cmmi10', 'kappa'=>'cmmi10', 'lambda'=>'cmmi10', 'mu'=>'cmmi10', 'nu'=>'cmmi10', 'xi'=>'cmmi10', 'pi'=>'cmmi10', 'varpi'=>'cmmi10', 'rho'=>'cmmi10', 'varrho'=>'cmmi10', 'sigma'=>'cmmi10', 'varsigma'=>'cmmi10', 'tau'=>'cmmi10', 'upsilon'=>'cmmi10', 'phi'=>'cmmi10', 'varphi'=>'cmmi10', 'chi'=>'cmmi10', 'psi'=>'cmmi10', 'omega'=>'cmmi10', 'Gamma'=>'cmr10', 'Lambda'=>'cmr10', 'Sigma'=>'cmr10', 'Psi'=>'cmr10', 'Delta'=>'cmr10', 'Xi'=>'cmr10', 'Upsilon'=>'cmr10', 'Omega'=>'cmr10', 'Theta'=>'cmr10', 'Pi'=>'cmr10', 'Phi'=>'cmr10', 'infty'=>'FreeSerif', 'ne'=>'FreeSerif', '*'=>'FreeSerif', 'in'=>'FreeSerif', 'notin'=>'FreeSerif', 'forall'=>'FreeSerif', 'exists'=>'FreeSerif', 'notexists'=>'FreeSerif', 'partial'=>'FreeSerif', 'approx'=>'FreeSerif', 'left'=>'FreeSerif', 'right'=>'FreeSerif', 'leftright'=>'FreeSerif', 'doubleleft'=>'FreeSerif', 'doubleright'=>'FreeSerif', 'doubleleftright'=>'FreeSerif', 'nearrow'=>'FreeSerif', 'searrow'=>'FreeSerif', 'pm'=>'FreeSerif', 'bbR'=>'FreeSerif', 'bbN'=>'FreeSerif', 'bbZ'=>'FreeSerif', 'bbC'=>'FreeSerif', 'inter'=>'FreeSerif', 'union'=>'FreeSerif', 'ortho'=>'FreeSerif', 'parallel'=>'FreeSerif', 'backslash'=>'FreeSerif', 'prime'=>'FreeSerif', 'wedge'=>'FreeSerif', 'vert'=>'FreeSerif', 'subset'=>'FreeSerif', 'notsubset'=>'FreeSerif', 'circ'=>'FreeSerif', 'varnothing'=>'FreeSerif', 'cdots'=>'FreeSerif', 'vdots'=>'FreeSerif', 'ddots'=>'FreeSerif', //operateurs 'le'=>'msam10', 'ge'=>'msam10', '<'=>'cmmi10', '>'=>'cmmi10', //parentheses '('=>'cmex10', ')'=>'cmex10', '['=>'cmex10', ']'=>'cmex10', 'lbrace'=>'cmex10', 'rbrace'=>'cmex10', //autres '_hat'=>'cmex10', '_racine'=>'cmex10', '_integrale'=>'cmex10', '_dintegrale'=>'FreeSerif', '_tintegrale'=>'FreeSerif', '_ointegrale'=>'cmex10', '_produit'=>'cmex10', '_somme'=>'cmex10', '_intersection'=>'cmex10', '_reunion'=>'cmex10', '_lim'=>'cmr10', //fonctions 'arccos'=>'cmr10', 'ker'=>'cmr10', 'arcsin'=>'cmr10', 'lg'=>'cmr10', 'arctan'=>'cmr10', 'arg'=>'cmr10', 'cos'=>'cmr10', 'cosh'=>'cmr10', 'ln'=>'cmr10', 'cot'=>'cmr10', 'log'=>'cmr10', 'coth'=>'cmr10', 'max'=>'cmr10', 'csc'=>'cmr10', 'min'=>'cmr10', 'deg'=>'cmr10', 'det'=>'cmr10', 'sec'=>'cmr10', 'dim'=>'cmr10', 'sin'=>'cmr10', 'exp'=>'cmr10', 'sinh'=>'cmr10', 'gcd'=>'cmr10', 'sup'=>'cmr10', 'hom'=>'cmr10', 'tan'=>'cmr10', 'inf'=>'cmr10', 'tanh'=>'cmr10' ); function est_nombre($str) { return ereg("^[0-9]", $str); } function tableau_expression($expression) { $e = str_replace('_', ' _ ', $expression); $e = str_replace('{(}', '{ }', $e); $e = str_replace('{)}', '{ }', $e); $t = token_get_all("<"."?php \$formula=$e ?".">"); $extraits = array(); $result=array(); //stupid code but token_get_all bug in some php versions $d=0; for($i = 0; $i < count($t); $i++) { if(is_array($t[$i])) $t[$i] = $t[$i][1]; if (ereg("formula", $t[$i])) { $d=$i+2; break; } } for($i = $d; $i < count($t) - 1; $i++) { if(is_array($t[$i])) $t[$i] = $t[$i][1]; if($t[$i] == '<=') $t[$i] = 'le'; elseif($t[$i] == '!=') $t[$i] = 'ne'; elseif($t[$i] == '<>') $t[$i] = 'ne'; elseif($t[$i] == '>=') $t[$i] = 'ge'; elseif($t[$i] == '--') { $t[$i] = '-'; $t[$i+1] = '-' . $t[$i+1]; } elseif($t[$i] == '++') $t[$i] = '+'; elseif($t[$i] == '-') { if($t[$i - 1] == '^' || $t[$i - 1] == '_' || $t[$i - 1] == '*' || $t[$i - 1] == '/' || $t[$i - 1] == '+' || $t[$i - 1] == '(') { $t[$i] = ''; if(is_array($t[$i+1])) $t[$i+1][1] = '-' . $t[$i+1][1]; else $t[$i+1] = '-' . $t[$i+1]; } } if(trim($t[$i]) != '') $extraits[] = $t[$i]; } for($i = 0; $i < count($extraits); $i++) { $result[]=new expression_texte($extraits[$i]); } return $result; } // ugly hack, but GD is not very good with truetype fonts (especially with latex fonts) function affiche_symbol($texte,$haut) { global $symboles, $fontesmath, $dirfonts; $texte=trim(stripslashes($texte)); switch($texte) { case '': $img = ImageCreate(1, max($haut,1)); $blanc=ImageColorAllocate($img,255,255,255); $blanc=imagecolortransparent($img,$blanc); ImageFilledRectangle($img,0,0,1,$haut,$blanc); break; case '~': $img = ImageCreate(1, max($haut,1)); $blanc=ImageColorAllocate($img,255,255,255); $blanc=imagecolortransparent($img,$blanc); ImageFilledRectangle($img,0,0,1,$haut,$blanc); break; case 'vert': $img = ImageCreate(6, max($haut,1)); $blanc=ImageColorAllocate($img,255,255,255); $blanc=imagecolortransparent($img,$blanc); $noir=ImageColorAllocate($img,0,0,0); ImageFilledRectangle($img,0,0,6,$haut,$blanc); ImageFilledRectangle($img,2,0,2,$haut,$noir); ImageFilledRectangle($img,4,0,4,$haut,$noir); break; case '|': $img = ImageCreate(5, max($haut,1)); $blanc=ImageColorAllocate($img,255,255,255); $blanc=imagecolortransparent($img,$blanc); $noir=ImageColorAllocate($img,0,0,0); ImageFilledRectangle($img,0,0,5,$haut,$blanc); ImageFilledRectangle($img,2,0,2,$haut,$noir); break; case 'right': $font =$dirfonts."/".$fontesmath[$texte].".ttf"; $t=16; $texte = $symboles[$texte]; $tmp_dim = ImageTTFBBox($t, 0, $font , $texte); $tmp_largeur = abs($tmp_dim[2] - $tmp_dim[0])+2; $tmp_hauteur = abs($tmp_dim[3] - $tmp_dim[5])+2; $tmp_img = ImageCreate(max($tmp_largeur,1), max($tmp_hauteur,1)); $tmp_noir=ImageColorAllocate($tmp_img,0,0,0); $tmp_blanc=ImageColorAllocate($tmp_img,255,255,255); $tmp_blanc=imagecolortransparent($tmp_img,$tmp_blanc); ImageFilledRectangle($tmp_img,0,0,$tmp_largeur,$tmp_hauteur,$tmp_blanc); ImageTTFText($tmp_img, $t, 0,0,$tmp_hauteur,$tmp_noir, $font,$texte); $toutblanc=true; $sx = $sy = $ex = $ey = -1; for ($y = 0; $y < $tmp_hauteur; $y++) { for ($x = 0; $x < $tmp_largeur; $x++) { $rgb = ImageColorAt($tmp_img, $x, $y); if ($rgb !=$tmp_blanc) { $toutblanc=false; if ($sy == -1) $sy = $y; else $ey = $y; if ($sx == -1) $sx = $x; else { if ($x < $sx) $sx = $x; else if ($x > $ex) $ex = $x; } } } } $nx = abs($ex - $sx); $ny = abs($ey - $sy); $img = ImageCreate(max($nx+4,1),max($ny+4,1)); $blanc=ImageColorAllocate($img,255,255,255); $blanc=imagecolortransparent($img,$blanc); ImageFilledRectangle($img,0,0,$nx+4,$ny+4,$blanc); ImageCopy($img,$tmp_img,2,2,$sx,$sy,min($nx+2,$tmp_largeur-$sx),min($ny+2,$tmp_hauteur-$sy)); break; case '_hat': $font =$dirfonts."/".$fontesmath[$texte].".ttf"; $t=$haut; $texte = $symboles[$texte]; $tmp_dim = ImageTTFBBox($t, 0, $font , $texte); $tmp_largeur = abs($tmp_dim[2] - $tmp_dim[0]); $tmp_hauteur = abs($tmp_dim[3] - $tmp_dim[5])*4; $tmp_img = ImageCreate(max($tmp_largeur,1), max($tmp_hauteur,1)); $tmp_noir=ImageColorAllocate($tmp_img,0,0,0); $tmp_blanc=ImageColorAllocate($tmp_img,255,255,255); $tmp_blanc=imagecolortransparent($tmp_img,$tmp_blanc); ImageFilledRectangle($tmp_img,0,0,$tmp_largeur,$tmp_hauteur,$tmp_blanc); ImageTTFText($tmp_img, $t, 0,0,$tmp_hauteur,$tmp_noir, $font,$texte); $toutblanc=true; $img=$tmp_img; $sx = $sy = $ex = $ey = -1; for ($y = 0; $y < $tmp_hauteur; $y++) { for ($x = 0; $x < $tmp_largeur; $x++) { $rgb = ImageColorAt($tmp_img, $x, $y); if ($rgb !=$tmp_blanc) { $toutblanc=false; if ($sy == -1) $sy = $y; else $ey = $y; if ($sx == -1) $sx = $x; else { if ($x < $sx) $sx = $x; else if ($x > $ex) $ex = $x; } } } } $nx = abs($ex - $sx); $ny = abs($ey - $sy); $img = ImageCreate(max($nx+4,1),max($ny+4,1)); $blanc=ImageColorAllocate($img,255,255,255); $blanc=imagecolortransparent($img,$blanc); ImageFilledRectangle($img,0,0,$nx+4,$ny+4,$blanc); ImageCopy($img,$tmp_img,2,2,$sx,$sy,min($nx+2,$tmp_largeur-$sx),min($ny+2,$tmp_hauteur-$sy)); break; case '_dintegrale': case '_tintegrale': if(isset($fontesmath[$texte])) $font = $dirfonts."/".$fontesmath[$texte].".ttf"; elseif (est_nombre($texte)) $font = $dirfonts."/cmr10.ttf"; else $font = $dirfonts."/cmmi10.ttf"; $t=6; if(isset($symboles[$texte])) $texte = $symboles[$texte]; do { $tmp_dim = ImageTTFBBox($t, 0, $font , $texte); $t+=1; } while ((abs($tmp_dim[3] - $tmp_dim[5])<1.2*$haut)); $tmp_largeur = abs($tmp_dim[2] - $tmp_dim[0])*2; $tmp_hauteur = abs($tmp_dim[3] - $tmp_dim[5])*2; $tmp_img = ImageCreate(max($tmp_largeur,1), max($tmp_hauteur,1)); $tmp_noir=ImageColorAllocate($tmp_img,0,0,0); $tmp_blanc=ImageColorAllocate($tmp_img,255,255,255); $tmp_blanc=imagecolortransparent($tmp_img,$tmp_blanc); ImageFilledRectangle($tmp_img,0,0,$tmp_largeur,$tmp_hauteur,$tmp_blanc); ImageTTFText($tmp_img, $t,0,5,$tmp_hauteur/2,$tmp_noir, $font,$texte); $img=$tmp_img; $toutblanc=true; $sx = $sy = $ex = $ey = -1; for ($y = 0; $y < $tmp_hauteur; $y++) { for ($x = 0; $x < $tmp_largeur; $x++) { $rgb = ImageColorAt($tmp_img, $x, $y); if ($rgb !=$tmp_blanc) { $toutblanc=false; if ($sy == -1) $sy = $y; else $ey = $y; if ($sx == -1) $sx = $x; else { if ($x < $sx) $sx = $x; else if ($x > $ex) $ex = $x; } } } } $nx = abs($ex - $sx); $ny = abs($ey - $sy); if ($toutblanc) { $img = ImageCreate(1, max($haut,1)); $blanc=ImageColorAllocate($img,255,255,255); $blanc=imagecolortransparent($img,$blanc); ImageFilledRectangle($img,0,0,1,$haut,$blanc); } else { $img = ImageCreate(max($nx+4,1),max($ny+4,1)); $blanc=ImageColorAllocate($img,255,255,255); $blanc=imagecolortransparent($img,$blanc); ImageFilledRectangle($img,0,0,$nx+4,$ny+4,$blanc); ImageCopy($img,$tmp_img,2,2,$sx,$sy,min($nx+2,$tmp_largeur-$sx),min($ny+2,$tmp_hauteur-$sy)); } break; default: if(isset($fontesmath[$texte])) $font = $dirfonts."/".$fontesmath[$texte].".ttf"; elseif (est_nombre($texte)) $font = $dirfonts."/cmr10.ttf"; else $font = $dirfonts."/cmmi10.ttf"; $t=6; if(isset($symboles[$texte])) $texte = $symboles[$texte]; do { $tmp_dim = ImageTTFBBox($t, 0, $font , $texte); $t+=1; } while ((abs($tmp_dim[3] - $tmp_dim[5])<$haut)); $tmp_largeur = abs($tmp_dim[2] - $tmp_dim[0])*2; $tmp_hauteur = abs($tmp_dim[3] - $tmp_dim[5])*2; $tmp_img = ImageCreate(max($tmp_largeur,1), max($tmp_hauteur,1)); $tmp_noir=ImageColorAllocate($tmp_img,0,0,0); $tmp_blanc=ImageColorAllocate($tmp_img,255,255,255); $tmp_blanc=imagecolortransparent($tmp_img,$tmp_blanc); ImageFilledRectangle($tmp_img,0,0,$tmp_largeur,$tmp_hauteur,$tmp_blanc); ImageTTFText($tmp_img, $t, 0,0,$tmp_hauteur/4,$tmp_noir, $font,$texte); // ImageTTFText($tmp_img, $t, 0,5,5,$tmp_noir, $font,$texte); // $img=$tmp_img; $toutblanc=true; $sx = $sy = $ex = $ey = -1; for ($y = 0; $y < $tmp_hauteur; $y++) { for ($x = 0; $x < $tmp_largeur; $x++) { $rgb = ImageColorAt($tmp_img, $x, $y); if ($rgb !=$tmp_blanc) { $toutblanc=false; if ($sy == -1) $sy = $y; else $ey = $y; if ($sx == -1) $sx = $x; else { if ($x < $sx) $sx = $x; else if ($x > $ex) $ex = $x; } } } } $nx = abs($ex - $sx); $ny = abs($ey - $sy); if ($toutblanc) { $img = ImageCreate(1, max($haut,1)); $blanc=ImageColorAllocate($img,255,255,255); $blanc=imagecolortransparent($img,$blanc); ImageFilledRectangle($img,0,0,1,$haut,$blanc); } else { $img = ImageCreate(max($nx+4,1),max($ny+4,1)); $blanc=ImageColorAllocate($img,255,255,255); $blanc=imagecolortransparent($img,$blanc); ImageFilledRectangle($img,0,0,$nx+4,$ny+4,$blanc); ImageCopy($img,$tmp_img,2,2,$sx,$sy,min($nx+2,$tmp_largeur-$sx),min($ny+2,$tmp_hauteur-$sy)); } break; } //$rouge=ImageColorAllocate($img,255,0,0); //ImageRectangle($img,0,0,ImageSX($img)-1,ImageSY($img)-1,$rouge); return $img; } function affiche_texte($texte, $taille) { global $dirfonts; $taille=max($taille,6); $texte=stripslashes($texte); $font = $dirfonts."/cmr10.ttf"; $htexte = 'dg'.$texte; $hdim = ImageTTFBBox($taille, 0, $font, $htexte); $wdim = ImageTTFBBox($taille, 0, $font, $texte); $dx = max($wdim[2], $wdim[4]) - min($wdim[0], $wdim[6])+ceil($taille /8); $dy = max($hdim[1], $hdim[3]) - min($hdim[5], $hdim[7])+ ceil($taille /8); $img = ImageCreate(max($dx,1), max($dy,1)); $noir=ImageColorAllocate($img,0,0,0); $blanc=ImageColorAllocate($img,255,255,255); $blanc=imagecolortransparent($img,$blanc); ImageFilledRectangle($img,0,0,$dx,$dy,$blanc); //ImageRectangle($img,0,0,$dx-1,$dy-1,$noir); ImageTTFText($img, $taille, $angle, 0, -min($hdim[5], $hdim[7]), $noir, $font, $texte); return $img; } function affiche_math($texte, $taille) { global $dirfonts; $taille=max($taille,6); global $symboles, $fontesmath; $texte=stripslashes($texte); if(isset($fontesmath[$texte])) $font = $dirfonts."/".$fontesmath[$texte].".ttf"; elseif (ereg("[a-zA-Z]", $texte)) $font = $dirfonts."/FreeSerifItalic.ttf"; else $font = $dirfonts."/FreeSerif.ttf"; if(isset($symboles[$texte])) $texte = $symboles[$texte]; $htexte = 'dg'.$texte; $hdim = ImageTTFBBox($taille, 0, $font, $htexte); $wdim = ImageTTFBBox($taille, 0, $font, $texte); $dx = max($wdim[2], $wdim[4]) - min($wdim[0], $wdim[6])+ceil($taille /8); $dy = max($hdim[1], $hdim[3]) - min($hdim[5], $hdim[7])+ ceil($taille /8); $img = ImageCreate(max($dx,1), max($dy,1)); $noir=ImageColorAllocate($img,0,0,0); $blanc=ImageColorAllocate($img,255,255,255); $blanc=imagecolortransparent($img,$blanc); ImageFilledRectangle($img,0,0,$dx,$dy,$blanc); //ImageRectangle($img,0,0,$dx-1,$dy-1,$noir); ImageTTFText($img, $taille, 0, 0, -min($hdim[5], $hdim[7]), $noir, $font, $texte); return $img; } function parenthese($hauteur, $style) { $image=affiche_symbol($style,$hauteur); return $image; } function alignement2($image1,$base1,$image2,$base2) { $largeur1=imagesx($image1); $hauteur1=imagesy($image1); $largeur2=imagesx($image2); $hauteur2=imagesy($image2); $dessus=max($base1,$base2); $dessous=max($hauteur1-$base1,$hauteur2-$base2); $largeur=$largeur1+$largeur2; $hauteur=$dessus+$dessous; $result = ImageCreate(max($largeur,1), max($hauteur,1)); $noir=ImageColorAllocate($result,0,0,0); $blanc=ImageColorAllocate($result,255,255,255); $blanc=imagecolortransparent($result,$blanc); ImageFilledRectangle($result,0,0,$largeur-1,$hauteur-1,$blanc); ImageCopy($result, $image1,0,$dessus - $base1, 0, 0,$largeur1,$hauteur1); ImageCopy($result, $image2,$largeur1,$dessus - $base2, 0, 0,$largeur2,$hauteur2); //ImageRectangle($result,0,0,$largeur-1,$hauteur-1,$noir); return $result; } function alignement3($image1,$base1,$image2,$base2,$image3,$base3) { $largeur1=imagesx($image1); $hauteur1=imagesy($image1); $largeur2=imagesx($image2); $hauteur2=imagesy($image2); $largeur3=imagesx($image3); $hauteur3=imagesy($image3); $dessus=max($base1,$base2,$base3); $dessous=max($hauteur1-$base1,$hauteur2-$base2,$hauteur3-$base3); $largeur=$largeur1+$largeur2+$largeur3; $hauteur=$dessus+$dessous; $result = ImageCreate(max($largeur,1), max($hauteur,1)); $noir=ImageColorAllocate($result,0,0,0); $blanc=ImageColorAllocate($result,255,255,255); $blanc=imagecolortransparent($result,$blanc); ImageFilledRectangle($result,0,0,$largeur-1,$hauteur-1,$blanc); ImageCopy($result, $image1,0,$dessus - $base1, 0, 0,$largeur1,$hauteur1); ImageCopy($result, $image2,$largeur1,$dessus - $base2, 0, 0,$largeur2,$hauteur2); ImageCopy($result, $image3,$largeur1+$largeur2,$dessus - $base3, 0, 0,$largeur3,$hauteur3); //ImageRectangle($result,0,0,$largeur-1,$hauteur-1,$noir); return $result; } //***************************************************************** class expression { var $texte; var $image; var $base_verticale; } //***************************************************************** class expression_texte extends expression { function expression_texte($exp) { $this->texte = $exp; } function dessine($taille) { $this->image = affiche_math($this->texte,$taille); $this->base_verticale = imagesy($this->image) / 2; } } //***************************************************************** class expression_math extends expression { var $noeuds; function expression_math($exp) { $this->texte = "&$"; $this->noeuds = $exp; $this->noeuds = $this->parse(); } function parse() { if(count($this->noeuds) <= 3) return $this->noeuds; $ret = array(); $parentheses = array(); for($i = 0; $i < count($this->noeuds); $i++) { if($this->noeuds[$i]->texte == '(' || $this->noeuds[$i]->texte == '{') array_push($parentheses, $i); elseif($this->noeuds[$i]->texte == ')' || $this->noeuds[$i]->texte == '}') { $pos = array_pop($parentheses); if(count($parentheses) == 0) { $sub = array_slice($this->noeuds, $pos + 1, $i - $pos - 1); if($this->noeuds[$i]->texte == ')') { $ret[] = new expression_math(array(new expression_texte("("), new expression_math($sub), new expression_texte(")"))); } else $ret[] = new expression_math($sub); } } elseif(count($parentheses) == 0) $ret[] = $this->noeuds[$i]; } $ret = $this->traite_fonction($ret, 'sqrt', 1); $ret = $this->traite_fonction($ret, 'vec', 1); $ret = $this->traite_fonction($ret, 'overline', 1); $ret = $this->traite_fonction($ret, 'underline', 1); $ret = $this->traite_fonction($ret, 'hat', 1); $ret = $this->traite_fonction($ret, 'int', 3); $ret = $this->traite_fonction($ret, 'doubleint', 3); $ret = $this->traite_fonction($ret, 'tripleint', 3); $ret = $this->traite_fonction($ret, 'oint', 3); $ret = $this->traite_fonction($ret, 'prod', 3); $ret = $this->traite_fonction($ret, 'sum', 3); $ret = $this->traite_fonction($ret, 'bigcup', 3); $ret = $this->traite_fonction($ret, 'bigcap', 3); $ret = $this->traite_fonction($ret, 'delim', 3); $ret = $this->traite_fonction($ret, 'lim', 2); $ret = $this->traite_fonction($ret, 'root', 2); $ret = $this->traite_fonction($ret, 'matrix', 3); $ret = $this->traite_fonction($ret, 'tabular', 3); $ret = $this->traite_operation($ret, '^'); $ret = $this->traite_operation($ret, 'over'); $ret = $this->traite_operation($ret, '_'); $ret = $this->traite_operation($ret, 'under'); $ret = $this->traite_operation($ret, '*'); $ret = $this->traite_operation($ret, '/'); $ret = $this->traite_operation($ret, '+'); $ret = $this->traite_operation($ret, '-'); return $ret; } function traite_operation($noeuds, $operation) { do { $change = false; if(count($noeuds) <= 3) return $noeuds; $ret = array(); for($i = 0; $i < count($noeuds); $i++) { if(!$change && $i < count($noeuds) - 2 && $noeuds[$i+1]->texte == $operation) { $ret[] = new expression_math(array($noeuds[$i], $noeuds[$i+1], $noeuds[$i+2])); $i += 2; $change = true; } else $ret[] = $noeuds[$i]; } $noeuds = $ret; } while($change); return $ret; } function traite_fonction($noeuds, $fonction, $nbarg) { if(count($noeuds) <= $nbarg + 1) return $noeuds; $ret = array(); for($i = 0; $i < count($noeuds); $i++) { if($i < count($noeuds) - $nbarg && $noeuds[$i]->texte == $fonction) { $a = array(); for($j = $i; $j <= $i + $nbarg; $j++) $a[] = $noeuds[$j]; $ret[] = new expression_math($a); $i += $nbarg; } else $ret[] = $noeuds[$i]; } return $ret; } function dessine($taille) { switch(count($this->noeuds)) { case 1: $this->noeuds[0]->dessine($taille); $this->image = $this->noeuds[0]->image; $this->base_verticale = $this->noeuds[0]->base_verticale; break; case 2: switch($this->noeuds[0]->texte) { case 'sqrt': $this->dessine_racine($taille); break; case 'vec': $this->dessine_vecteur($taille); break; case 'overline': $this->dessine_overline($taille); break; case 'underline': $this->dessine_underline($taille); break; case 'hat': $this->dessine_chapeau($taille); break; default: $this->dessine_expression($taille); break; } break; case 3: if ($this->noeuds[0]->texte=="lim") { $this->dessine_limite($taille); } elseif ($this->noeuds[0]->texte=="root") { $this->dessine_root($taille); } else { switch($this->noeuds[1]->texte) { case '/': $this->dessine_fraction($taille); break; case '^': $this->dessine_exposant($taille); break; case 'over': $this->dessine_dessus($taille); break; case '_': $this->dessine_indice($taille); break; case 'under': $this->dessine_dessous($taille); break; default: $this->dessine_expression($taille); break; } } break; case 4: switch($this->noeuds[0]->texte) { case 'int': $this->dessine_grandoperateur($taille,'_integrale'); break; case 'doubleint': $this->dessine_grandoperateur($taille,'_dintegrale'); break; case 'tripleint': $this->dessine_grandoperateur($taille,'_tintegrale'); break; case 'oint': $this->dessine_grandoperateur($taille,'_ointegrale'); break; case 'sum': $this->dessine_grandoperateur($taille,'_somme'); break; case 'prod': $this->dessine_grandoperateur($taille,'_produit'); break; case 'bigcap': $this->dessine_grandoperateur($taille,'_intersection'); break; case 'bigcup': $this->dessine_grandoperateur($taille,'_reunion'); break; case 'delim': $this->dessine_delimiteur($taille); break; case 'matrix': $this->dessine_matrice($taille); break; case 'tabular': $this->dessine_tableau($taille); break; default: $this->dessine_expression($taille); break; } break; default: $this->dessine_expression($taille); break; } } function dessine_expression($taille) { $largeur=1; $hauteur=1; $dessus=1; $dessous=1; for($i = 0; $i < count($this->noeuds); $i++) { if ($this->noeuds[$i]->texte != '(' && $this->noeuds[$i]->texte != ')') { $this->noeuds[$i]->dessine($taille); $img[$i] = $this->noeuds[$i]->image; $base[$i] = $this->noeuds[$i]->base_verticale; $dessus = max($base[$i], $dessus); $dessous = max(imagesy($img[$i]) - $base[$i], $dessous); } } $hauteur=$dessus+$dessous; $paro=parenthese(max($dessus,$dessous)*2,"("); $parf=parenthese(max($dessus,$dessous)*2,")"); for($i = 0; $i < count($this->noeuds); $i++) { if(!isset($img[$i])) { if ($this->noeuds[$i]->texte == "(") $img[$i] = $paro; else $img[$i] = $parf; $dessus=max(imagesy($img[$i])/2,$dessus); $base[$i]=imagesy($img[$i])/2; $dessous = max(imagesy($img[$i]) - $base[$i], $dessous); $hauteur=max(imagesy($img[$i]),$hauteur); } $largeur+=imagesx($img[$i]); } $this->base_verticale = $dessus; $result = ImageCreate(max($largeur,1), max($hauteur,1)); $noir=ImageColorAllocate($result,0,0,0); $blanc=ImageColorAllocate($result,255,255,255); $blanc=imagecolortransparent($result,$blanc); ImageFilledRectangle($result,0,0,$largeur-1,$hauteur-1,$blanc); $pos = 0; for($i = 0; $i < count($img); $i++) { if(isset($img[$i])) { ImageCopy($result, $img[$i],$pos,$dessus-$base[$i], 0, 0,imagesx($img[$i]),imagesy($img[$i])); $pos += imagesx($img[$i]); } } $this->image=$result; } function dessine_fraction($taille) { $this->noeuds[0]->dessine($taille*0.9); $img1=$this->noeuds[0]->image; $base1=$this->noeuds[0]->base_verticale; $this->noeuds[2]->dessine($taille*0.9); $img2=$this->noeuds[2]->image; $base2=$this->noeuds[2]->base_verticale; $hauteur1=imagesy($img1); $hauteur2=imagesy($img2); $largeur1=imagesx($img1); $largeur2=imagesx($img2); $largeur = max($largeur1,$largeur2); $hauteur = $hauteur1+$hauteur2+4; $result = ImageCreate(max($largeur+5,1), max($hauteur,1)); $noir=ImageColorAllocate($result,0,0,0); $blanc=ImageColorAllocate($result,255,255,255); $blanc=imagecolortransparent($result,$blanc); $this->base_verticale=$hauteur1+2; ImageFilledRectangle($result,0,0,$largeur+4,$hauteur-1,$blanc); ImageCopy($result, $img1, ($largeur - $largeur1)/2, 0, 0, 0,$largeur1,$hauteur1); imageline($result, 0,$this->base_verticale, $largeur,$this->base_verticale, $noir); ImageCopy($result, $img2, ($largeur - $largeur2)/2,$hauteur1+4, 0, 0,$largeur2,$hauteur2); $this->image=$result; } function dessine_exposant($taille) { $this->noeuds[0]->dessine($taille); $img1=$this->noeuds[0]->image; $base1=$this->noeuds[0]->base_verticale; $this->noeuds[2]->dessine($taille*0.8); $img2=$this->noeuds[2]->image; $base2=$this->noeuds[2]->base_verticale; $hauteur1=imagesy($img1); $hauteur2=imagesy($img2); $largeur1=imagesx($img1); $largeur2=imagesx($img2); $largeur =$largeur1 + $largeur2; if ($hauteur1 >= $hauteur2) { $hauteur = ceil($hauteur2/2+$hauteur1); $this->base_verticale=$hauteur2/2+ $base1; $result = ImageCreate(max($largeur,1), max($hauteur,1)); $noir=ImageColorAllocate($result,0,0,0); $blanc=ImageColorAllocate($result,255,255,255); $blanc=imagecolortransparent($result,$blanc); ImageFilledRectangle($result,0,0,$largeur-1,$hauteur-1,$blanc); ImageCopy($result, $img1, 0, ceil($hauteur2/2), 0, 0, $largeur1, $hauteur1); ImageCopy($result, $img2, $largeur1, 0, 0, 0, $largeur2,$hauteur2); } else { $hauteur = ceil($hauteur1/2+$hauteur2); $this->base_verticale=$hauteur2-$base1+$hauteur1/2; $result = ImageCreate(max($largeur,1), max($hauteur,1)); $noir=ImageColorAllocate($result,0,0,0); $blanc=ImageColorAllocate($result,255,255,255); $blanc=imagecolortransparent($result,$blanc); ImageFilledRectangle($result,0,0,$largeur-1,$hauteur-1,$blanc); ImageCopy($result, $img1, 0, ceil($hauteur2-$hauteur1/2), 0, 0, $largeur1, $hauteur1); ImageCopy($result, $img2, $largeur1, 0, 0, 0, $largeur2,$hauteur2); } $this->image=$result; } function dessine_indice($taille) { $this->noeuds[0]->dessine($taille); $img1=$this->noeuds[0]->image; $base1=$this->noeuds[0]->base_verticale; $this->noeuds[2]->dessine($taille*0.8); $img2=$this->noeuds[2]->image; $base2=$this->noeuds[2]->base_verticale; $hauteur1=imagesy($img1); $hauteur2=imagesy($img2); $largeur1=imagesx($img1); $largeur2=imagesx($img2); $largeur =$largeur1 + $largeur2; if ($hauteur1 >= $hauteur2) { $hauteur = ceil($hauteur2/2+$hauteur1); $this->base_verticale=$base1; $result = ImageCreate(max($largeur,1), max($hauteur,1)); $noir=ImageColorAllocate($result,0,0,0); $blanc=ImageColorAllocate($result,255,255,255); $blanc=imagecolortransparent($result,$blanc); ImageFilledRectangle($result,0,0,$largeur-1,$hauteur-1,$blanc); ImageCopy($result, $img1, 0, 0, 0, 0, $largeur1, $hauteur1); ImageCopy($result, $img2, $largeur1,ceil($hauteur1-$hauteur2/2) , 0, 0, $largeur2,$hauteur2); } else { $hauteur = ceil($hauteur1/2+$hauteur2); $this->base_verticale=$base1; $result = ImageCreate(max($largeur,1), max($hauteur,1)); $noir=ImageColorAllocate($result,0,0,0); $blanc=ImageColorAllocate($result,255,255,255); $blanc=imagecolortransparent($result,$blanc); ImageFilledRectangle($result,0,0,$largeur-1,$hauteur-1,$blanc); ImageCopy($result, $img1, 0, 0, 0, 0, $largeur1, $hauteur1); ImageCopy($result, $img2, $largeur1,ceil($hauteur1/2), 0, 0, $largeur2,$hauteur2); } $this->image=$result; } function dessine_racine($taille) { $this->noeuds[1]->dessine($taille); $imgexp=$this->noeuds[1]->image; $baseexp=$this->noeuds[1]->base_verticale; $largeurexp=imagesx($imgexp); $hauteurexp=imagesy($imgexp); $imgrac=affiche_symbol("_racine",$hauteurexp+2); $largeurrac=imagesx($imgrac); $hauteurrac=imagesy($imgrac); $baserac=$hauteurrac/2; $largeur=$largeurrac+$largeurexp; $hauteur=max($hauteurexp,$hauteurrac); $result = ImageCreate(max($largeur,1), max($hauteur,1)); $noir=ImageColorAllocate($result,0,0,0); $blanc=ImageColorAllocate($result,255,255,255); $blanc=imagecolortransparent($result,$blanc); ImageFilledRectangle($result,0,0,$largeur-1,$hauteur-1,$blanc); ImageCopy($result, $imgrac,0,0, 0, 0,$largeurrac,$hauteurrac); ImageCopy($result, $imgexp,$largeurrac,$hauteur-$hauteurexp, 0, 0,$largeurexp,$hauteurexp); imagesetthickness($result,1); imageline($result, $largeurrac-2,2, $largeurrac+$largeurexp+2,2, $noir); $this->base_verticale=$hauteur-$hauteurexp+$baseexp; $this->image=$result; } function dessine_root($taille) { $this->noeuds[1]->dessine($taille*0.6); $imgroot=$this->noeuds[1]->image; $baseroot=$this->noeuds[1]->base_verticale; $largeurroot=imagesx($imgroot); $hauteurroot=imagesy($imgroot); $this->noeuds[2]->dessine($taille); $imgexp=$this->noeuds[2]->image; $baseexp=$this->noeuds[2]->base_verticale; $largeurexp=imagesx($imgexp); $hauteurexp=imagesy($imgexp); $imgrac=affiche_symbol("_racine",$hauteurexp+2); $largeurrac=imagesx($imgrac); $hauteurrac=imagesy($imgrac); $baserac=$hauteurrac/2; //$largeur=$largeurrac+$largeurexp; $netwidthroot = max($largeurroot-0.3*$hauteurrac,0); $largeur=$largeurrac+$largeurexp+$netwidthroot; $hauteur=max($hauteurexp,$hauteurrac); $result = ImageCreate(max($largeur,1), max($hauteur,1)); $noir=ImageColorAllocate($result,0,0,0); $blanc=ImageColorAllocate($result,255,255,255); $blanc=imagecolortransparent($result,$blanc); ImageFilledRectangle($result,0,0,$largeur-1,$hauteur-1,$blanc); ImageCopy($result, $imgrac,$netwidthroot,0, 0, 0,$largeurrac,$hauteurrac); ImageCopy($result, $imgexp,$largeurrac+$netwidthroot,$hauteur-$hauteurexp, 0, 0,$largeurexp,$hauteurexp); imagesetthickness($result,1); imageline($result, $largeurrac+$netwidthroot-2,2, $largeurrac+$netwidthroot+$largeurexp+2,2, $noir); ImageCopy($result, $imgroot,0,0, 0, 0,$largeurroot,$hauteurroot); $this->base_verticale=$hauteur-$hauteurexp+$baseexp; $this->image=$result; } function dessine_grandoperateur($taille,$caractere) { $this->noeuds[1]->dessine($taille*0.8); $img1=$this->noeuds[1]->image; $base1=$this->noeuds[1]->base_verticale; $this->noeuds[2]->dessine($taille*0.8); $img2=$this->noeuds[2]->image; $base2=$this->noeuds[2]->base_verticale; $this->noeuds[3]->dessine($taille); $imgexp=$this->noeuds[3]->image; $baseexp=$this->noeuds[3]->base_verticale; //borneinf $largeur1=imagesx($img1); $hauteur1=imagesy($img1); //bornesup $largeur2=imagesx($img2); $hauteur2=imagesy($img2); //expression $hauteurexp=imagesy($imgexp); $largeurexp=imagesx($imgexp); //caractere $imgsymbole=affiche_symbol($caractere,$baseexp*1.8);//max($baseexp,$hauteurexp-$baseexp)*2); $largeursymbole=imagesx($imgsymbole); $hauteursymbole=imagesy($imgsymbole); $basesymbole=$hauteursymbole/2; $hauteurgauche=$hauteursymbole+$hauteur1+$hauteur2; $largeurgauche=max($largeursymbole,$largeur1,$largeur2); $imggauche=ImageCreate(max($largeurgauche,1), max($hauteurgauche,1)); $noir=ImageColorAllocate($imggauche,0,0,0); $blanc=ImageColorAllocate($imggauche,255,255,255); $blanc=imagecolortransparent($imggauche,$blanc); ImageFilledRectangle($imggauche,0,0,$largeurgauche-1,$hauteurgauche-1,$blanc); ImageCopy($imggauche, $imgsymbole,($largeurgauche-$largeursymbole)/2, $hauteur2, 0, 0,$largeursymbole,$hauteursymbole); ImageCopy($imggauche, $img2,($largeurgauche-$largeur2)/2,0, 0, 0,$largeur2,$hauteur2); ImageCopy($imggauche, $img1,($largeurgauche-$largeur1)/2, $hauteur2+$hauteursymbole, 0, 0,$largeur1,$hauteur1); $imgfin=alignement2($imggauche,$basesymbole+$hauteur2,$imgexp,$baseexp); $this->image=$imgfin; $this->base_verticale=max($basesymbole+$hauteur2,$baseexp+$hauteur2); } function dessine_dessus($taille) { $this->noeuds[2]->dessine($taille*0.8); $imgsup=$this->noeuds[2]->image; $basesup=$this->noeuds[2]->base_verticale; $this->noeuds[0]->dessine($taille); $imgexp=$this->noeuds[0]->image; $baseexp=$this->noeuds[0]->base_verticale; //expression $largeurexp=imagesx($imgexp); $hauteurexp=imagesy($imgexp); //bornesup $largeursup=imagesx($imgsup); $hauteursup=imagesy($imgsup); //fin $hauteur=$hauteurexp+$hauteursup; $largeur=max($largeursup,$largeurexp)+ceil($taille/8); $imgfin = ImageCreate(max($largeur,1), max($hauteur,1)); $noir=ImageColorAllocate($imgfin,0,0,0); $blanc=ImageColorAllocate($imgfin,255,255,255); $blanc=imagecolortransparent($imgfin,$blanc); ImageFilledRectangle($imgfin,0,0,$largeur-1,$hauteur-1,$blanc); ImageCopy($imgfin, $imgsup,($largeur-$largeursup)/2, 0, 0, 0,$largeursup,$hauteursup); ImageCopy($imgfin, $imgexp,($largeur-$largeurexp)/2, $hauteursup, 0, 0,$largeurexp,$hauteurexp); $this->image=$imgfin; $this->base_verticale=$baseexp+$hauteursup; } function dessine_dessous($taille) { $this->noeuds[2]->dessine($taille*0.8); $imginf=$this->noeuds[2]->image; $baseinf=$this->noeuds[2]->base_verticale; $this->noeuds[0]->dessine($taille); $imgexp=$this->noeuds[0]->image; $baseexp=$this->noeuds[0]->base_verticale; //expression $largeurexp=imagesx($imgexp); $hauteurexp=imagesy($imgexp); //borneinf $largeurinf=imagesx($imginf); $hauteurinf=imagesy($imginf); //fin $hauteur=$hauteurexp+$hauteurinf; $largeur=max($largeurinf,$largeurexp)+ceil($taille/8); $imgfin = ImageCreate(max($largeur,1), max($hauteur,1)); $noir=ImageColorAllocate($imgfin,0,0,0); $blanc=ImageColorAllocate($imgfin,255,255,255); $blanc=imagecolortransparent($imgfin,$blanc); ImageFilledRectangle($imgfin,0,0,$largeur-1,$hauteur-1,$blanc); ImageCopy($imgfin, $imgexp,($largeur-$largeurexp)/2, 0, 0, 0,$largeurexp,$hauteurexp); ImageCopy($imgfin, $imginf,($largeur-$largeurinf)/2, $hauteurexp, 0, 0,$largeurinf,$hauteurinf); $this->image=$imgfin; $this->base_verticale=$baseexp; } function dessine_matrice($taille) { $padding=8; $nbligne=$this->noeuds[1]->noeuds[0]->texte; $nbcolonne=$this->noeuds[2]->noeuds[0]->texte; $largeur_case=0; $hauteur_case=0; for($ligne = 0; $ligne <$nbligne; $ligne++) { $hauteur_ligne[$ligne]=0; $dessus_ligne[$ligne]=0; } for($col = 0; $col <$nbcolonne; $col++) { $largeur_colonne[$col]=0; } $i=0; for($ligne = 0; $ligne <$nbligne; $ligne++) { for($col = 0; $col <$nbcolonne; $col++) { if ($i< count($this->noeuds[3]->noeuds)) { $this->noeuds[3]->noeuds[$i]->dessine($taille*0.9); $img[$i]=$this->noeuds[3]->noeuds[$i]->image; $base[$i]=$this->noeuds[3]->noeuds[$i]->base_verticale; $dessus_ligne[$ligne] = max($base[$i],$dessus_ligne[$ligne]); $largeur[$i]=imagesx($img[$i]); $hauteur[$i]=imagesy($img[$i]); $hauteur_ligne[$ligne]=max($hauteur_ligne[$ligne],$hauteur[$i]); $largeur_colonne[$col]=max($largeur_colonne[$col],$largeur[$i]); } $i++; } } $hauteurfin=0; $largeurfin=0; for($ligne = 0; $ligne <$nbligne; $ligne++) { $hauteurfin+=$hauteur_ligne[$ligne]+$padding; } for($col = 0; $col <$nbcolonne; $col++) { $largeurfin+=$largeur_colonne[$col]+$padding; } $hauteurfin-=$padding; $largeurfin-=$padding; $imgfin = ImageCreate(max($largeurfin,1), max($hauteurfin,1)); $noir=ImageColorAllocate($imgfin,0,0,0); $blanc=ImageColorAllocate($imgfin,255,255,255); $blanc=imagecolortransparent($imgfin,$blanc); ImageFilledRectangle($imgfin,0,0,$largeurfin-1,$hauteurfin-1,$blanc); $i=0; $h=$padding/2-1; for($ligne = 0; $ligne <$nbligne; $ligne++) { $l=$padding/2-1; for($col = 0; $col <$nbcolonne; $col++) { if ($i< count($this->noeuds[3]->noeuds)) { ImageCopy($imgfin,$img[$i],$l+ceil($largeur_colonne[$col]-$largeur[$i])/2,$h+$dessus_ligne[$ligne]-$base[$i], 0, 0,$largeur[$i],$hauteur[$i]); //ImageRectangle($imgfin,$l,$h,$l+$largeur_colonne[$col],$h+$hauteur_ligne[$ligne],$noir); } $l+=$largeur_colonne[$col]+$padding; $i++; } $h+=$hauteur_ligne[$ligne]+$padding; } //ImageRectangle($imgfin,0,0,$largeurfin-1,$hauteurfin-1,$noir); $this->image=$imgfin; $this->base_verticale=imagesy($imgfin)/2; } function dessine_tableau($taille) { $padding=8; $typeligne=$this->noeuds[1]->noeuds[0]->texte; $typecolonne=$this->noeuds[2]->noeuds[0]->texte; $nbligne=strlen($typeligne)-1; $nbcolonne=strlen($typecolonne)-1; $largeur_case=0; $hauteur_case=0; for($ligne = 0; $ligne <$nbligne; $ligne++) { $hauteur_ligne[$ligne]=0; $dessus_ligne[$ligne]=0; } for($col = 0; $col <$nbcolonne; $col++) { $largeur_colonne[$col]=0; } $i=0; for($ligne = 0; $ligne <$nbligne; $ligne++) { for($col = 0; $col <$nbcolonne; $col++) { if ($i< count($this->noeuds[3]->noeuds)) { $this->noeuds[3]->noeuds[$i]->dessine($taille*0.9); $img[$i]=$this->noeuds[3]->noeuds[$i]->image; $base[$i]=$this->noeuds[3]->noeuds[$i]->base_verticale; $dessus_ligne[$ligne] = max($base[$i],$dessus_ligne[$ligne]); $largeur[$i]=imagesx($img[$i]); $hauteur[$i]=imagesy($img[$i]); $hauteur_ligne[$ligne]=max($hauteur_ligne[$ligne],$hauteur[$i]); $largeur_colonne[$col]=max($largeur_colonne[$col],$largeur[$i]); } $i++; } } $hauteurfin=0; $largeurfin=0; for($ligne = 0; $ligne <$nbligne; $ligne++) { $hauteurfin+=$hauteur_ligne[$ligne]+$padding; } for($col = 0; $col <$nbcolonne; $col++) { $largeurfin+=$largeur_colonne[$col]+$padding; } $imgfin = ImageCreate(max($largeurfin,1), max($hauteurfin,1)); $noir=ImageColorAllocate($imgfin,0,0,0); $blanc=ImageColorAllocate($imgfin,255,255,255); $blanc=imagecolortransparent($imgfin,$blanc); ImageFilledRectangle($imgfin,0,0,$largeurfin-1,$hauteurfin-1,$blanc); $i=0; $h=$padding/2-1; if (substr($typeligne,0,1)=="1") ImageLine($imgfin,0,0,$largeurfin-1,0,$noir); for($ligne = 0; $ligne <$nbligne; $ligne++) { $l=$padding/2-1; if (substr($typecolonne,0,1)=="1") ImageLine($imgfin,0,$h-$padding/2,0,$h+$hauteur_ligne[$ligne]+$padding/2,$noir); for($col = 0; $col <$nbcolonne; $col++) { if ($i< count($this->noeuds[3]->noeuds)) { ImageCopy($imgfin,$img[$i],$l+ceil($largeur_colonne[$col]-$largeur[$i])/2,$h+$dessus_ligne[$ligne]-$base[$i], 0, 0,$largeur[$i],$hauteur[$i]); if (substr($typecolonne,$col+1,1)=="1") ImageLine($imgfin,$l+$largeur_colonne[$col]+$padding/2,$h-$padding/2,$l+$largeur_colonne[$col]+$padding/2,$h+$hauteur_ligne[$ligne]+$padding/2,$noir); } $l+=$largeur_colonne[$col]+$padding; $i++; } if (substr($typeligne,$ligne+1,1)=="1") ImageLine($imgfin,0,$h+$hauteur_ligne[$ligne]+$padding/2,$largeurfin-1,$h+$hauteur_ligne[$ligne]+$padding/2,$noir); $h+=$hauteur_ligne[$ligne]+$padding; } $this->image=$imgfin; $this->base_verticale=imagesy($imgfin)/2; } function dessine_vecteur($taille) { //expression $this->noeuds[1]->dessine($taille); $imgexp=$this->noeuds[1]->image; $baseexp=$this->noeuds[1]->base_verticale; $largeurexp=imagesx($imgexp); $hauteurexp=imagesy($imgexp); //fleche $imgsup=affiche_symbol("right",16); $largeursup=imagesx($imgsup); $hauteursup=imagesy($imgsup); //fin $hauteur=$hauteurexp+$hauteursup; $largeur=$largeurexp; $imgfin = ImageCreate(max($largeur,1), max($hauteur,1)); $noir=ImageColorAllocate($imgfin,0,0,0); $blanc=ImageColorAllocate($imgfin,255,255,255); $blanc=imagecolortransparent($imgfin,$blanc); ImageFilledRectangle($imgfin,0,0,$largeur-1,$hauteur-1,$blanc); ImageCopy($imgfin, $imgsup,$largeur-6, 0,$largeursup-6, 0,$largeursup,$hauteursup); imagesetthickness($imgfin,1); imageline($imgfin,0,6, $largeur-4,6, $noir); ImageCopy($imgfin, $imgexp,($largeur-$largeurexp)/2, $hauteursup, 0, 0,$largeurexp,$hauteurexp); $this->image=$imgfin; $this->base_verticale=$baseexp+$hauteursup; } function dessine_overline($taille) { //expression $this->noeuds[1]->dessine($taille); $imgexp=$this->noeuds[1]->image; $baseexp=$this->noeuds[1]->base_verticale; $largeurexp=imagesx($imgexp); $hauteurexp=imagesy($imgexp); $hauteur=$hauteurexp+2; $largeur=$largeurexp; $imgfin = ImageCreate(max($largeur,1), max($hauteur,1)); $noir=ImageColorAllocate($imgfin,0,0,0); $blanc=ImageColorAllocate($imgfin,255,255,255); $blanc=imagecolortransparent($imgfin,$blanc); ImageFilledRectangle($imgfin,0,0,$largeur-1,$hauteur-1,$blanc); imagesetthickness($imgfin,1); imageline($imgfin,0,1, $largeur,1, $noir); ImageCopy($imgfin, $imgexp,0,2, 0, 0,$largeurexp,$hauteurexp); $this->image=$imgfin; $this->base_verticale=$baseexp+2; } function dessine_underline($taille) { //expression $this->noeuds[1]->dessine($taille); $imgexp=$this->noeuds[1]->image; $baseexp=$this->noeuds[1]->base_verticale; $largeurexp=imagesx($imgexp); $hauteurexp=imagesy($imgexp); $hauteur=$hauteurexp+2; $largeur=$largeurexp; $imgfin = ImageCreate(max($largeur,1), max($hauteur,1)); $noir=ImageColorAllocate($imgfin,0,0,0); $blanc=ImageColorAllocate($imgfin,255,255,255); $blanc=imagecolortransparent($imgfin,$blanc); ImageFilledRectangle($imgfin,0,0,$largeur-1,$hauteur-1,$blanc); imagesetthickness($imgfin,1); imageline($imgfin,0,$hauteurexp+1, $largeur,$hauteurexp+1, $noir); ImageCopy($imgfin, $imgexp,0,0, 0, 0,$largeurexp,$hauteurexp); $this->image=$imgfin; $this->base_verticale=$baseexp; } function dessine_chapeau($taille) { $imgsup=affiche_symbol("_hat",$taille); $this->noeuds[1]->dessine($taille); $imgexp=$this->noeuds[1]->image; $baseexp=$this->noeuds[1]->base_verticale; //expression $largeurexp=imagesx($imgexp); $hauteurexp=imagesy($imgexp); //bornesup $largeursup=imagesx($imgsup); $hauteursup=imagesy($imgsup); //fin $hauteur=$hauteurexp+$hauteursup; $largeur=max($largeursup,$largeurexp)+ceil($taille/8); $imgfin = ImageCreate(max($largeur,1), max($hauteur,1)); $noir=ImageColorAllocate($imgfin,0,0,0); $blanc=ImageColorAllocate($imgfin,255,255,255); $blanc=imagecolortransparent($imgfin,$blanc); ImageFilledRectangle($imgfin,0,0,$largeur-1,$hauteur-1,$blanc); ImageCopy($imgfin, $imgsup,($largeur-$largeursup)/2, 0, 0, 0,$largeursup,$hauteursup); ImageCopy($imgfin, $imgexp,($largeur-$largeurexp)/2, $hauteursup, 0, 0,$largeurexp,$hauteurexp); $this->image=$imgfin; $this->base_verticale=$baseexp+$hauteursup; } function dessine_limite($taille) { $imglim=affiche_math("_lim",$taille); $largeurlim=imagesx($imglim); $hauteurlim=imagesy($imglim); $baselim=$hauteurlim/2; $this->noeuds[1]->dessine($taille*0.8); $imginf=$this->noeuds[1]->image; $baseinf=$this->noeuds[1]->base_verticale; $largeurinf=imagesx($imginf); $hauteurinf=imagesy($imginf); $this->noeuds[2]->dessine($taille); $imgexp=$this->noeuds[2]->image; $baseexp=$this->noeuds[2]->base_verticale; $largeurexp=imagesx($imgexp); $hauteurexp=imagesy($imgexp); $hauteur=$hauteurlim+$hauteurinf; $largeur=max($largeurinf,$largeurlim)+ceil($taille/8); $imgfin = ImageCreate(max($largeur,1), max($hauteur,1)); $noir=ImageColorAllocate($imgfin,0,0,0); $blanc=ImageColorAllocate($imgfin,255,255,255); $blanc=imagecolortransparent($imgfin,$blanc); ImageFilledRectangle($imgfin,0,0,$largeur-1,$hauteur-1,$blanc); ImageCopy($imgfin, $imglim,($largeur-$largeurlim)/2, 0, 0, 0,$largeurlim,$hauteurlim); ImageCopy($imgfin, $imginf,($largeur-$largeurinf)/2, $hauteurlim, 0, 0,$largeurinf,$hauteurinf); $this->image=alignement2($imgfin,$baselim,$imgexp,$baseexp); $this->base_verticale=max($baselim,$baseexp); } function dessine_delimiteur($taille) { $this->noeuds[2]->dessine($taille); $imgexp=$this->noeuds[2]->image; $baseexp=$this->noeuds[2]->base_verticale; $hauteurexp=imagesy($imgexp); if ($this->noeuds[1]->texte=="&$") $imggauche=parenthese($hauteurexp,$this->noeuds[1]->noeuds[0]->texte); else $imggauche=parenthese($hauteurexp,$this->noeuds[1]->texte); $basegauche=imagesy($imggauche)/2; if ($this->noeuds[3]->texte=="&$") $imgdroit=parenthese($hauteurexp,$this->noeuds[3]->noeuds[0]->texte); else $imgdroit=parenthese($hauteurexp,$this->noeuds[3]->texte); $basedroit=imagesy($imgdroit)/2; $this->image=alignement3($imggauche,$basegauche,$imgexp,$baseexp,$imgdroit,$basedroit); $this->base_verticale=max($basegauche,$baseexp,$basedroit); } } //****************************************************************************************** function detectimg($n) { /* Detects if the formula image already exists in the $dirimg cache directory. In that case, the function returns a parameter (recorded in the name of the image file) which allows to align correctly the image with the text. */ global $dirimg; $ret=0; $handle=opendir($dirimg); while ($fi = readdir($handle)) { $info=pathinfo($fi); if ($fi!="." && $fi!=".." && $info["extension"]=="png" && ereg("^math",$fi)) { list($math,$v,$name)=explode("_",$fi); if ($name==$n) { $ret=$v; break; } } } closedir($handle); return $ret; } function mathimage($text,$size,$pathtoimg) { /* Creates the formula image (if the image is not in the cache) and returns the html code. */ global $dirimg; $nameimg = md5(trim($text).$size).'.png'; $v=detectimg($nameimg); if ($v==0) { //the image doesn't exist in the cache directory. we create it. $formula=new expression_math(tableau_expression(trim($text))); $formula->dessine($size); $v=1000-imagesy($formula->image)+$formula->base_verticale+3; //1000+baseline ($v) is recorded in the name of the image ImagePNG($formula->image,$dirimg."/math_".$v."_".$nameimg); } $valign=$v-1000; return ''.$text.''; } function mathfilter($text,$size,$pathtoimg) { /* THE MAIN FUNCTION 1) the content of the math tags () are extracted in the $t variable (you can replace by your own tag). 2) the "mathimage" function replaces the $t code by according to this method : - if the image corresponding to the formula doesn't exist in the $dirimg cache directory (detectimg($nameimg)=0), the script creates the image and returns the "" code. - otherwise, the script returns only the " code. To align correctly the formula image with the text, the "valign" parameter of the image is required. That's why a parameter (1000+valign) is recorded in the name of the image file (the "detectimg" function returns this parameter if the image exists in the cache directory) To be sure that the name of the image file is unique and to allow the script to retrieve the valign parameter without re-creating the image, the syntax of the image filename is : math_(1000+valign)_md5(formulatext.size).png. (1000+valign is used instead of valign directly to avoid a negative number) */ $text=stripslashes($text); $size=max($size,10); $size=min($size,24); preg_match_all("|(.*?)|", $text, $regs, PREG_SET_ORDER); foreach ($regs as $math) { $t=str_replace('','',$math[0]); $t=str_replace('','',$t); $code=mathimage(trim($t),$size,$pathtoimg); $text = str_replace($math[0], $code, $text); } return $text; } ?>