#!/usr/bin/perl -w my $programname = 'naturalmath.cgi'; # Last modified May 26, 2003 # # Copyright 1999 Stephen J Montgomery-Smith. All rights reserved. # # This package is free software; you can redistribute it and/or modify # it under the terms of either: # # a) the GNU General Public License as published by the Free # Software Foundation; either version 2, or (at your option) any # later version, or # # b) "Stephen's Artistic License" which comes with this Kit. # # This package 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 either # the GNU General Public License or Stephen's Artistic License for more # details. # # You should have received a copy of Stephen's Artistic License with this # package, in the file named "Stephens-Artistic.txt". If not, I'll be glad # to provide one. # # You should also have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. # ####################################################################### # # To use this script, you will also need the following installed: # # latex, dvips (part of the teTeX package) # ghostscript (version 6.5 or greater works) # ppmtopng (part of the netpbm package http://netpbm.sourceforge.net/ ) # # Directory structure: this script presumes that there is a directory, # also accessible to your web server, which is ../tex-stuff. This # directory has to be given write access to the user of the web server # (which for example in my case I do by making ../tex-stuff owned by # the user "nobody"). # This script also assumes that the program naturalmath is installed # in the path space given below. # # Obviously you can customize these to suite your environment. use CGI qw(:standard); $CGI::POST_MAX=1000; $ENV{PATH} = '/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin:/usr/local/sbin:/usr/X11R6/bin'; $TEX_STUFF = "../tex-stuff"; sub center { return "
@_
"; } my $nmtext = param("nmtext"); my $scale = param("scale"); my $ident = `date '+%Y-%m-%d-%H-%M-%S'`; chomp($ident); $ident .= "-$$"; $ident =~ /^(\d+-\d+-\d+)/; my $date = $1; print header; print start_html(-title=>"Try Natural Math", -author=>"Stephen Montgomery-Smith", -BGCOLOR=>'pink'), center(h1("Try Natural Math")), # "Sorry - it is not working right now.",p, "Here you can try out ", "Natural Math\n", "(click here for the tutorial)\n", # "This web page is a bit slow. (This is mostly\n", # "time taken to make the \`png\' file.)\n", p, "Enter lines of Natural Math in the box below, and click\n", "on the Submit button. Then the result will be displayed ", "below the Submit button.",p, "If you have any suggestions to improve this site, or the natural ", "math language, please email me at ", "stephen\@math.missouri.edu.",p, center( start_form, textarea("nmtext", "sum from n=1 to infinity of 1 over n^2 = pi^2 over 6" . "\n\n" . "integral from -infinity to infinity of xi^(2n) e^(-xi^2/2) dxi\n= sqrt(2 pi) (2n)! over (2^n n!)" . "\n\n" . "(1 + sqrt 5) over 2\n" . "= 1 + 1 over (1 + 1 over (1 + 1 over (1 + 1 over (1 + dots))))" . "\n\n" . "\"sech\"(x) = 2 over (e^x+e^-x)" , "\n" . 10,80),p, "Scale: ", popup_menu('scale',[1,1.5,2,3,4],2),p, submit("Submit"), end_form); if (param()) { if (length($nmtext) > 500) { print "You are limited to 500 characters. If you want to try longer\n", "examples, I suggest you download the program and install it."; exit; } open(TEXFILE,"> $TEX_STUFF/afile$ident.nat"); print TEXFILE "# remote host: " . remote_host() . "\n" if (defined(remote_host())); print TEXFILE "# user name: " . user_name() . "\n" if (defined(user_name())); print TEXFILE "# referer: " . referer() . "\n\n" if (defined(referer())); print TEXFILE $nmtext; close(TEXFILE); chdir "$TEX_STUFF"; system "naturalmath -sn afile$ident > /dev/null 2>&1;" . "chmod a-r afile$ident.nat;" . "latex afile$ident > /dev/null 2>&1;" . "dvips -E afile$ident.dvi -o afile$ident.ps > /dev/null 2>&1;"; $bounding = `grep BoundingBox afile$ident.ps`; $bounding =~ /\%\%BoundingBox:\s+(\-?\d+)\s+(\-?\d+)\s+(\-?\d+)\s+(\-?\d+)/; $bbx=-$1; $bby=-$2; $scale = 1 if ($scale<=1); $scale = 4 if ($scale>=4); $scale*=72; $bbw=int($scale/72*($3-$1)+.999999); $bbh=int($scale/72*($4-$2)+.999999); open(GS,"| gs -q -dSAFER -dNOPAUSE -sDEVICE=ppmraw -r$scale -g${bbw}x${bbh} -sOutputFile=afile$ident.ppm > /dev/null"); print GS "$bbx $bby translate\n"; print GS "(afile$ident.ps) run\n"; print GS "quit\n"; close(GS); system "pnmtopng -transparent white afile$ident.ppm > afile$ident.png 2>/dev/null;" . "rm -f *.aux *.cpm *.ppm *.dvi *.log *.ppm *.ps *.tex;"; print "
Here is what it looks like.
",p, "\n
\n", p,"You can use this image for yourself: download the image", " and use HTML something like:",br, "<img src=\"image.png\" width=$bbw height=$bbh align=abscenter alt=\"The picture.\">"; print end_html; }