Version: 1.0
Type: Function
Category: Graphics
License: GNU General Public License
Description: Latex Renderer Class for linux without any other install, no cgi needed, only /usr/bin/latex /usr/bin/dvips and /usr/bin/convert
<?php
/*
Latex Render Class
Based on http://www.linuxjournal.com/article/7870
Copyright 2005 Carlos Segura
cseguramail@gmail.com
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Configuration:
create a temporal directory and set $TMP_DIR
create a cache directory and set $CACHE_DIR
set the path to: latex, dvips, convert
set the relative path $URL_PATH to $CACHE_DIR from your webpage
PmWiki configuration:
copy this file in pmwiki_relative_path/local/
edit pmwiki_relative_path/local/config.php
add:
Markup('{%', 'block',
'/\\{\\%(.*?)\\%\\}/e',
"Keep(toLatex('$1'))");
function toLatex($text){
require_once('render.class.php');
$text = "[tex]" . $text . "[/tex]";
$render = new render();
return $render->transform($text);
}
All text written with markup {$ latex formula $} will be rendered with latex
*/
class render {
var $LATEX_PATH = "/usr/bin/latex";
var $DVIPS_PATH = "/usr/bin/dvips";
var $CONVERT_PATH = "/usr/bin/convert";
var $TMP_DIR = "/srv/www/htdocs/pmwiki/local/tmp";
var $CACHE_DIR = "/srv/www/htdocs/pmwiki/local/cache";
var $URL_PATH = "/local/cache";
function wrap($thunk) {
return <<<EOS
\documentclass[12pt]{article}
% add additional packages here
\usepackage{amsmath}
\usepackage{amsfonts}
\usepackage{amssymb}
\usepackage{pst-plot}
\usepackage{color}
\pagestyle{empty}
\begin{document}
$thunk
\end{document}
EOS;
}
function transform($text) {
// echo $text;
$base_url = 'http' . (isset($_SERVER['HTTPS']) ? $_SERVER['HTTPS'] == 'on' ? 's' : '' : '');
$base_url .= '://' .$_SERVER['HTTP_HOST'];
if ($dir = trim(dirname($_SERVER['SCRIPT_NAME']), '\,/')) {
$base_url .= "/$dir";
}
preg_match_all("/\[tex\](.*?)\[\/tex\]/si", $text, $matches);
for ($i = 0; $i < count($matches[0]); $i++) {
$position = strpos($text, $matches[0][$i]);
$thunk = $matches[1][$i];
$hash = md5($thunk);
$full_name = $this->CACHE_DIR . "/" .
$hash . ".png";
$url = $base_url . $this->URL_PATH . "/" .
$hash . ".png";
if (!is_file($full_name)) {
$this->render_latex($thunk, $hash);
$this->cleanup($hash);
}
$text = substr_replace($text,
"<img src=\"$url\" alt=\"Formula: $i\" />",
$position, strlen($matches[0][$i]));
}
return $text;
}
function render_latex($thunk, $hash) {
$thunk = $this->wrap($thunk);
$current_dir = getcwd();
chdir($this->TMP_DIR);
// create temporary LaTeX file
$fp = fopen($this->TMP_DIR . "/$hash.tex", "w+");
fputs($fp, $thunk);
fclose($fp);
// run LaTeX to create temporary DVI file
$command = $this->LATEX_PATH .
" --interaction=nonstopmode " .
$hash . ".tex";
exec($command);
// run dvips to create temporary PS file
$command = $this->DVIPS_PATH .
" -E $hash" .
".dvi -o " . "$hash.ps";
exec($command);
// run PS file through ImageMagick to
// create PNG file
$command = $this->CONVERT_PATH .
" -density 120 $hash.ps $hash.png";
exec($command);
// copy the file to the cache directory
copy("$hash.png", $this->CACHE_DIR .
"/$hash.png");
chdir($current_dir);
}
function cleanup($hash) {
$current_dir = getcwd();
chdir($this->TMP_DIR);
unlink($this->TMP_DIR . "/$hash.tex");
unlink($this->TMP_DIR . "/$hash.aux");
unlink($this->TMP_DIR . "/$hash.log");
unlink($this->TMP_DIR . "/$hash.dvi");
unlink($this->TMP_DIR . "/$hash.ps");
unlink($this->TMP_DIR . "/$hash.png");
chdir($current_dir);
}
}
?>