olsen@ll-xn.ARPA (Jim Olsen) (11/17/86)
GNU Emacs version 17.64 has a bug in its handling of `math' (i.e., TeX
$) characters. It appears that the bug still exists in version 18.26.
This bug manifests itself when the tex-mode commands validate-
TeX-buffer or TeX-terminate-paragraph are invoked. The TeX syntax
check fails (i.e., indicates an error when the syntax is actually
correct) in two situations:
1. Whenever a paragraph contains two or more math statements, e.g.,
``Add $x$ and $y$ together.''
2. When single-$ and double-$ signs are nested, as in this example
from the TeXbook:
``$$|x|=\cases{x,&if $x\ge0$;\cr -x,&otherwise.\cr}$$.''
The bug is in the function scan_lists in the syntax.c source file. I have
fixed the bug, and added code to distinguish between single and double math
characters. The modified code works in both cases outlined above. Here
is a context diff from the version 17.64 syntax.c file (N.B., this code has
been tried only on a VAX-4.3BSD system):
*** syntax.c Fri Nov 14 11:08:22 1986
--- syntax.c.old Fri Nov 14 11:08:22 1986
***************
*** 428,435 ****
--- 428,434 ----
register int c;
char stringterm;
int quoted;
!< int singlemath = 0;
!< int doublemath = 0;
register enum syntaxcode code;
int min_depth = depth; /* Err out if depth gets less than this. */
---------------
register int c;
char stringterm;
int quoted;
!> int mathexit = 0;
register enum syntaxcode code;
int min_depth = depth; /* Err out if depth gets less than this. */
***************
*** 507,522 ****
--- 506,514 ----
if (!sexpflag)
break;
if (from != stop && c == CharAt (from))
!< {
!< from++;
!< if (doublemath) { doublemath = 0; goto close1;}
!< doublemath=1;
!< }
!< else
!< {
!< if (singlemath) { singlemath = 0; goto close1;}
!< singlemath = 1;
!< }
case Sopen:
if (!++depth) goto done;
---------------
if (!sexpflag)
break;
if (from != stop && c == CharAt (from))
!> from++;
!> if (mathexit) goto close1;
!> mathexit = 1;
case Sopen:
if (!++depth) goto done;
***************
*** 605,620 ****
--- 597,605 ----
if (!sexpflag)
break;
if (from != stop && c == CharAt (from - 1))
!< {
!< from--;
!< if (doublemath) { doublemath = 0; goto open2;}
!< doublemath = 1;
!< }
!< else
!< {
!< if (singlemath) { singlemath = 0; goto open2;}
!< singlemath = 1;
!< }
case Sclose:
if (!++depth) goto done2;
---------------
if (!sexpflag)
break;
if (from != stop && c == CharAt (from - 1))
!> from--;
!> if (mathexit) goto open2;
!> mathexit = 1;
case Sclose:
if (!++depth) goto done2;
--
Jim Olsen olsen@ll-xn.ARPA or olsen@xn.ll.mit.edu or
...!{caip,decvax,lll-crg,mit-eddie,seismo}!ll-xn!olsen