diff --git a/Fltk/Opengl.cpp b/Fltk/Opengl.cpp
index 9e0448b789992cbf1e333aa845a743e8c5f0b379..d0c9911b3e0fd4633ee2555be95b0e6cc8a3bdb2 100644
--- a/Fltk/Opengl.cpp
+++ b/Fltk/Opengl.cpp
@@ -1,4 +1,4 @@
-// $Id: Opengl.cpp,v 1.47 2004-12-29 17:48:47 geuzaine Exp $
+// $Id: Opengl.cpp,v 1.48 2004-12-31 22:02:26 geuzaine Exp $
 //
 // Copyright (C) 1997-2004 C. Geuzaine, J.-F. Remacle
 //
@@ -66,6 +66,28 @@ void Draw(void)
   WID->redraw_opengl();
 }
 
+void SanitizeTexString(char *in, char *out)
+{
+  // if there is a '$' or a '\' in the string, assume the author knows
+  // what he's doing:
+  if(strstr(in, "$") || strstr(in, "\\")){
+    strcpy(out, in);
+    return;
+  }
+  // otherwise, escape the following special characters:
+  char bad[8] = { '%', '^', '#', '%', '&', '_', '{', '}' };
+  while(*in){
+    for(unsigned int i = 0; i < sizeof(bad); i++){
+      if(*in == bad[i]){
+	*out++ = '\\';
+	break;
+      }
+    }
+    *out++ = *in++;
+  }
+  *out = '\0';
+}
+
 void Draw_String(char *s, char *font_name, int font_enum, int font_size, int align)
 {
   if(align > 0){
@@ -94,11 +116,14 @@ void Draw_String(char *s, char *font_name, int font_enum, int font_size, int ali
     if(CTX.print.format == FORMAT_JPEGTEX ||
        CTX.print.format == FORMAT_PNGTEX)
       return;
-    if(CTX.print.format == FORMAT_TEX)
-      gl2psTextOpt(s, font_name, font_size, 
+    if(CTX.print.format == FORMAT_TEX){
+      char tmp[1024];
+      SanitizeTexString(s, tmp);
+      gl2psTextOpt(tmp, font_name, font_size, 
 		   (align == 0) ? GL2PS_TEXT_BL :
 		   (align == 1) ? GL2PS_TEXT_B :
 		   GL2PS_TEXT_BR, 0.);
+    }
     else
       gl2psText(s, font_name, font_size);
   }