This one has been in my tree for a while. It does not fix the
'$ blah$$ foo $
problem, but it doesn't break anything either.
It works by setting a switch, $inside_math, so that reLyX knows whether to
enter or leave math mode when it receives a '$' or '$$' token.
Ok to apply? And to 1.3.x?
--
Angus
Index: lib/reLyX//BasicLyX.pm
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/lib/reLyX/BasicLyX.pm,v
retrieving revision 1.5
diff -u -p -r1.5 BasicLyX.pm
--- lib/reLyX//BasicLyX.pm 7 Jan 2003 14:30:52 -0000 1.5
+++ lib/reLyX//BasicLyX.pm 5 Feb 2003 12:14:45 -0000
@@ -290,6 +290,42 @@ sub call_parser {
return;
} # end subroutine call_parser
+# This is used as a toggle so that we know what to do when basic_lyx is
+# passed a '$' or '$$' token.
+my $inside_math=0;
+
+sub starting_math {
+ my $name = shift;
+
+ if ($name eq '\(' || $name eq '\[' ||
+ # These tokens bound both ends of a math environment so we must check
+ # $inside_math to know what action to take.
+ ($name eq '$' || $name eq '$$') && !$inside_math) {
+
+ $inside_math = 1;
+ return 1;
+ }
+
+ # All other tokens
+ return 0;
+}
+
+sub ending_math {
+ my $name = shift;
+
+ if ($name eq '\)' || $name eq '\]' ||
+ # These tokens bound both ends of a math environment so we must check
+ # $inside_math to know what action to take.
+ ($name eq '$' || $name eq '$$') && $inside_math) {
+
+ $inside_math = 0;
+ return 1;
+ }
+
+ # All other tokens
+ return 0;
+}
+
########################## MAIN TRANSLATOR SUBROUTINE #####################
sub basic_lyx {
# This subroutine is called by Text::TeX::process each time subroutine
@@ -388,7 +424,7 @@ sub basic_lyx {
"\n\n\\end_inset \n\n";
# Math -- copy verbatim until you're done
- } elsif ($name eq '\(' || $name eq '\[') {
+ } elsif (starting_math($name)) {
print "\nCopying math beginning with '$name'\n" if $debug_on;
# copy everything until end text
$dummy = &Verbatim::copy_verbatim($fileobject, $eaten);
@@ -399,7 +435,7 @@ sub basic_lyx {
print $dummy if $debug_on;
print OUTFILE $dummy;
- } elsif ($name eq '\)' || $name eq '\]') {
+ } elsif (ending_math($name)) {
# end math
print OUTFILE "$name\n\\end_inset \n\n";
print "\nDone copying math ending with '$name'" if $debug_on;
Index: lib/reLyX//CleanTeX.pm
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/lib/reLyX/CleanTeX.pm,v
retrieving revision 1.2
diff -u -p -r1.2 CleanTeX.pm
--- lib/reLyX//CleanTeX.pm 29 Mar 2000 23:02:36 -0000 1.2
+++ lib/reLyX//CleanTeX.pm 5 Feb 2003 12:14:46 -0000
@@ -81,20 +81,6 @@ sub clean_tex {
my($eaten,$txt) = (shift,shift);
my ($outstr, $type);
- # Sub translate is given a string and one of the translation tables below.
- # It returns the translation, or just the string if there's no translation
- # Translation table for TT::Begin::Group tokens
- my %begtranstbl = (
- '$' => '\(', # LyX math mode doesn't
- '$$' => '\[', # understand \$ or $$
- );
-
- # Translation table for TT::End::Group tokens
- my %endtranstbl = (
- '$' => '\)',
- '$$' => '\]',
- );
-
# Translation table for TT::Token tokens whose translations should
# NOT have whitespace after them! See sub translate...
# Note that tokens of type TT::EndLocal are always translated to '}'. So,
@@ -135,8 +121,7 @@ sub clean_tex {
# Handle the end of a local font command - insert a '}'
if (/EndLocal/) {
- # we could just say $printstr='}'
- $printstr = &translate('}', \%endtranstbl);
+ $printstr = '}';
last SWITCH;
}
@@ -242,13 +227,13 @@ sub clean_tex {
# Handle opening groups, like '{' and '$'.
if (/Begin::Group$/) {
- $printstr = &translate($outstr,\%begtranstbl);
+ $printstr = $outstr;
last SWITCH;
}
# Handle closing groups, like '}' and '$'.
if (/End::Group$/) {
- $printstr = &translate($outstr, \%endtranstbl);
+ $printstr = $outstr;
last SWITCH;
}
Index: lib/reLyX//Verbatim.pm
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/lib/reLyX/Verbatim.pm,v
retrieving revision 1.1.1.1
diff -u -p -r1.1.1.1 Verbatim.pm
--- lib/reLyX//Verbatim.pm 27 Sep 1999 18:44:34 -0000 1.1.1.1
+++ lib/reLyX//Verbatim.pm 5 Feb 2003 12:14:47 -0000
@@ -12,6 +12,8 @@
package Verbatim;
use strict;
+my $debug_on; # package-wide variable set if -d option is given
+
sub copy_verb {
# This subroutine handles a \verb token. Text is guaranteed to be on one line.
# \verb must be followed by a non-letter, then copy anything until the next
@@ -27,6 +29,9 @@ sub copy_verb {
}
sub copy_verbatim {
+ # Was -d option given?
+ $debug_on = (defined($main::opt_d) && $main::opt_d);
+
# This subroutine eats text verbatim until a certain text is reached
# The end text itself is not eaten; this is necessary so that
# environments are properly nested (otherwise, TeX.pm complains)
@@ -35,7 +40,10 @@ sub copy_verbatim {
# Arg 0 is the Text::TeX::OpenFile file object, arg 1 is the beginning token
my $fileobject = shift;
my $begin_token = shift;
- my %endtokentbl = ( '\(' => '\)' , '\[' => '\]' );
+ my %endtokentbl = ( '\(' => '\)',
+ '\[' => '\]',
+ '$' => '$',
+ '$$' => '$$' );
my $type = ref($begin_token);
$type =~ s/^Text::TeX:://o or die "unknown token type $type?!";