#!/usr/bin/perl -w use strict; use vars qw($delim $source_file); BEGIN { $/ = ''; } if (!$ARGV[0] || ($ARGV[0] eq '-d' && $#ARGV < 2)) { print STDERR "Usage: over2frac [-d 'delimiter'] sourcefile [>outputfile]\n"; print STDERR "Note: delimiter must be a string *not* found in the source file\n"; print STDERR " \'#&@\' is the default delimiter\n"; exit(1); } elsif ($ARGV[0] eq '-d') { $delim = $ARGV[1]; $source_file = $ARGV[2]; } else { $delim = '#&@'; $source_file = $ARGV[0]; } open(SOURCE, "$source_file") or die "Can't open $source_file: $!\n"; while () { # check for \over syntax in line while ($_ =~ /(.+)\\over(.+)/s) { # declare base variables my $numerator = $1; my $denominator = $2; if (substr($denominator, 0, 4) eq "line") { last; } chomp($numerator); $denominator =~ s/\n/$delim/g; # preserve line breaks my $begin = ''; my $end = ''; my $braces = 0; my $count = 0; # pick apart numerator my @numerator = split '', $numerator; for ($count = $#numerator; $count >= 0; $count--) { if ($numerator[$count] eq '{') { $braces-- } elsif ($numerator[$count] eq '}') { $braces++ }; if ($braces < 0 || $numerator[$count] eq '$') { $begin = substr($numerator, 0, ($count + 1)); $numerator = substr($numerator, ($count + 1), ($#numerator - $count)); $numerator =~ s/^\s*{(.+)}\s*$/$1/; # check to see if left delimiter for fraction is \left if ($numerator =~ /(.+)\\left(.+)/s) { $begin .= $1 . '{'; $numerator = $2; } $numerator =~ s/^\s*(.+?)\s*$/$1/; $count = 0; last; } } $braces = 0; # re-set braces count # pick apart denominator my @denominator = split '', $denominator; for ($count = 0; $count < ($#denominator + 1); $count++) { if ($denominator[$count] eq '{') { $braces++ } elsif ($denominator[$count] eq '}') { $braces-- }; if ($braces < 0 || $denominator[$count] eq '$') { $end = substr($denominator, $count); $denominator = substr($denominator, 0, $count); $denominator =~ s/^\s*{(.+)}\s*$/$1/; # check to see if right delimiter for fraction is \right if ($denominator =~ /(.+)\\right(.+)/s) { $end = $2 . '}' . $end; $denominator = $1; } $denominator =~ s/^\s*(.+?)\s*$/$1/; $count = 0; last; } } $_ = "$begin\\frac{$numerator}{$denominator}$end"; # re-assemble the parts } $_ =~ s/$delim{2,}/\n\n/; # restore line breaks $_ =~ s/$delim/\n/g; print; } close(SOURCE);