#! /usr/bin/perl
#
# T E X T O G I F
#
# by John Walker
# http://www.fourmilab.ch/
#
$version = '1.1 (2003-11-07) plus -tex, -page, -trans options';
#
#
# 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:
#
#
#
# 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.
#
$use_transparent = 0;
$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';
#
# Document processing options
#
$latex = 'latex';
$pageNo = 1;
#
# 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/^-pa/) { # -page nnn
$pageNo = shift(@ARGV);
} elsif (m/^-pn/) { # -png
$imageCmd = $cmdPNG;
$imageCmdD = $cmdPNGdecode;
$imageExt = 'png';
} elsif (m/^-r/) { # -res nnn
$res = shift(@ARGV);
} elsif (m/^-tr/) { # -trans
$use_transparent = 1;
} elsif (m/^-te/) { # -tex
$latex = 'tex';
} 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 -p =${pageNo} -l =${pageNo} -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=pbmraw _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 | pnmdepth 255 | $background pnmscale " .
$res . " | " .
# Finally, convert the image to the desired output format and write
# the output file.
"$imageCmd -interlace " .
($use_transparent? "-transparent rgb:$transparent ": "") .
">$f.$imageExt";
&syscmd($cmd);
# Sweep up debris left around by the various intermediate steps
$cmd = "rm $f.dvi $f.log _temp_$$.ps";
if ($latex eq 'latex') { $cmd .= " $f.aux"; }
&syscmd($cmd);
# 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 "\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
-page n Render page n of the document (default 1)
-png Generate PNG image
-tex Use plain TeX instead of LaTeX
-trans Produce transparent GIF or PNG
-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
;
}