--- /dev/null
+#! /usr/bin/perl
+#
+# T E X T O G I F
+#
+# by John Walker
+# http://www.fourmilab.ch/
+#
+ $version = '1.1 (2003-11-07)';
+#
+#
+# Converts a LaTeX file containing equations(s) into a GIF file for
+# embedding into an HTML document. The black and white image of the
+# equation is created at high resolution and then resampled to the
+# target resolution to antialias what would otherwise be jagged
+# edges.
+#
+# Online documentation with sample output is available on the Web
+# at http://www.fourmilab.ch/webtools/textogif/
+#
+# Write your equation (or anything else you can typeset with LaTeX)
+# in a file like:
+#
+# \documentclass[12pt]{article}
+# \pagestyle{empty}
+# \begin{document}
+#
+# \begin{displaymath}
+# \bf % Compiled formulae often look better in boldface
+# \int H(x,x')\psi(x')dx' = -\frac{\hbar2}{2m}\frac{d2}{dx2}
+# \psi(x)+V(x)\psi(x)
+# \end{displaymath}
+#
+# \end{document}
+#
+# The "\pagestyle{empty}" is required to avoid generating a huge
+# image with a page number at the bottom.
+#
+# Then (assuming you have all the software described below installed
+# properly), you can simply say:
+#
+# textogif [options] filename ...
+#
+# to compile filename.tex to filename.gif, an interlaced,
+# transparent background GIF file ready to use an an inline image.
+# You can specify the base name, for example, "schrod", rather than
+# the full name of the TeX file ("schrod.tex"). TeX requires the
+# input file to have an extension of ".tex". The command line
+# options are described in the help text at the end of this program
+# and in the "Default Configuration" section below.
+#
+# A sample IMG tag, including the image width and height is printed
+# on standard error, for example:
+#
+# <img src="schrod.gif" width=508 height=56>
+#
+# Required Software
+#
+# This script requires the following software to be installed
+# in the standard manner. Version numbers are those used in the
+# development and testing of the script.
+#
+# Perl 5.8.0 (anything later than 4.036 should work)
+# TeX 3.14159 (Web2C 7.3.1)
+# LaTeX2e <2000/06/01>
+# dvips dvipsk 5.86
+# Ghostscript 6.52 (2001-10-20)
+# Netpbm 9.24
+#
+#
+# Default Configuration
+#
+# The following settings are the defaults used if the -dpi and
+# -res options are not specified on the command line.
+#
+# The parameter $dpi controls how large the equation will appear
+# with respect to other inline images and the surrounding text.
+# The parameter is expressed in "dots per inch" in the PostScript
+# sense. Unfortunately, since there's no standard text size in
+# Web browsers (and most allow the user to change fonts and
+# point sizes), there's no "right" value for this setting. The
+# default of 150 seems about right for most documents. A setting
+# of 75 generates equations at half the normal size, while 300
+# doubles the size of equations. The setting of $dpi can always be
+# overridden by specifying the "-dpi" command line option.
+#
+ $dpi = 150;
+#
+# The parameter $res specifies the oversampling as the ratio
+# of the final image size to the initial black and white image.
+# Smaller values produce smoothing with more levels of grey but
+# require (much) more memory and intermediate file space to create
+# the image. If you run out of memory or disc space with the
+# default value of 0.5, try changing it to 0.75. A $res setting of
+# 1.0 disables antialiasing entirely. The setting of $res can
+# always be overridden by specifying the "res" command line option.
+#
+ $res = 0.5;
+#
+# The $background parameter supplies a command, which may be
+# void, to be inserted in the image processing pipeline to
+# adjust the original black-on-white image so that its background
+# agrees with that of the document in which it is to be inserted.
+# For a document with the default grey background used by Mosaic
+# and old versions of Netscape, use:
+#
+# $background = "ppmdim 0.7 |"; $transparent = "b2/b2/b2";
+#
+# If your document uses a white background, the void specification:
+#
+# $background = ""; $transparent = "ff/ff/ff";
+#
+# should be used. For colour or pattern backgrounds, you'll have
+# to hack the code. The reason for adjusting the background is to
+# ensure that when the image is resampled and then output with a
+# transparent background the edges of the characters will fade
+# smoothly into the page background. Otherwise you'll get a
+# distracting "halo" around each character. You can override this
+# default specification with the -grey command line option.
+#
+ $background = ""; $transparent = "ff/ff/ff";
+#
+# Image generation and decoding commands for GIF and PNG output.
+#
+ $cmdGIF = 'ppmtogif';
+ $cmdGIFdecode = 'giftopnm';
+ $cmdPNG = 'pnmtopng';
+ $cmdPNGdecode = 'pngtopnm';
+#
+# Default image creation modes
+#
+ $imageCmd = $cmdGIF;
+ $imageCmdD = $cmdGIFdecode;
+ $imageExt = 'gif';
+
+ #
+ # Command line option processing
+ #
+ while ($ARGV[0] =~ m/^-/) {
+ $_ = shift(@ARGV);
+ s/^--/-/; # Allow GNU-style -- options
+ if (m/^-d/) { # -dpi nnn
+ $dpi = shift(@ARGV);
+ } elsif (m/^-gi/) { # -gif
+ $imageCmd = $cmdGIF;
+ $imageCmdD = $cmdGIFdecode;
+ $imageExt = 'gif';
+ } elsif (m/^-gr/) { # -grey n
+ $grey = shift(@ARGV);
+ $background = "ppmdim $grey | ";
+ $greylev = int(255 * $grey);
+ $transparent = sprintf("%02x/%02x/%02x", $greylev, $greylev, $greylev);
+ } elsif (m/^-h/) { # -help
+ &help();
+ exit(0);
+ } elsif (m/^-p/) { # -png
+ $imageCmd = $cmdPNG;
+ $imageCmdD = $cmdPNGdecode;
+ $imageExt = 'png';
+ } elsif (m/^-r/) { # -res nnn
+ $res = shift(@ARGV);
+ } elsif (m/^-v/) { # -version
+ print("Version $version\n");
+ exit(0);
+ }
+ }
+ #
+ # Main file processing loop
+ #
+ foreach $f (@ARGV) {
+ $f =~ s/(.*)\.tex$/$1/;
+ &syscmd("echo x | latex $f \n");
+ &syscmd("dvips -f $f >_temp_$$.ps\n");
+
+ # Assemble and execute the command pipeline which generates the image.
+
+ # Start by invoking Ghostscript with the pbmraw output device and
+ # output file set to standard output ("-") and the requested resolution.
+ # The -q (Quiet) option is required; otherwise Ghostscript will send
+ # processing information to standard output and corrupt transmission
+ # of the bitmap to the next component in the pipeline.
+ $cmd = "echo quit | gs -q -dNOPAUSE -r" . int($dpi / $res). "x". int($dpi / $res) .
+ " -sOutputFile=- -sDEVICE=ppmraw _temp_$$.ps | " .
+
+ # Next we crop white space surrounding the generated text, promote
+ # the monochrome bitmap to a grey scale image with 8 bits per pixel,
+ # apply whatever background adjustment transform is requested, and
+ # scale the image to the desired size.
+ "pnmcrop -white | pnmpad -white -left " . int(10/$res) .
+ " -right " . int(10/$res) . " -top " . int(10/$res) .
+ " -bottom " . int(10/$res) . " | " .
+ " $background pnmscale " . $res . " | " .
+
+ # Finally, convert the image to the desired output format and write
+ # the output file.
+ "$imageCmd -interlace -transparent rgb:$transparent >$f.$imageExt";
+ &syscmd($cmd);
+
+ # Sweep up debris left around by the various intermediate steps
+ &syscmd("rm $f.dvi $f.aux $f.log _temp_$$.ps");
+
+ # Print the reference to include this figure, including width and height,
+ # to standard error.
+ $r = `$imageCmdD $f.$imageExt | pnmfile`;
+ $r =~ m/(\d+) by (\d+)/;
+ print(STDERR "<img src=\"$f.$imageExt\" width=\"$1\" height=\"$2\">\n");
+ }
+
+ # Echo and execute a system command
+
+ sub syscmd {
+ local ($cmd) = @_;
+
+ print(STDERR "$cmd\n");
+ system($cmd) == 0 || die("Error processing command:\n\t$cmd\n\t");
+ }
+
+ # Print help text
+
+ sub help {
+ print <<"EOD"
+usage: textogif [ options ] texfile...
+ Options:
+ -dpi n Set rendering dots per inch to n (default 150)
+ -gif Generate GIF image (default)
+ -grey Grey scale background level: 0 = black, 1 = white (default)
+ -help Print this message
+ -png Generate PNG image
+ -res n Set oversampling ratio, smaller = finer (default 0.5)
+ -version Print version number
+For documentation and the latest version of this program
+please visit the Web page:
+ http://www.fourmilab.ch/webtools/textogif/
+EOD
+;
+ }