ram-ashwin@YALE.ARPA (Ashwin Ram) (02/23/88)
Does anyone have code that recognizes "\begin{foo} ... \end{foo}" pairs in a
LaTeX file as a "balanced pair"? In particular, I'm looking for something
that would validate a buffer, indicate a mismatch (just as for different
kinds of parens), and insert the correct \end{...} expression upon hitting a
key, depending on the current \begin{...} expression that you're in? I have
code that just searches back to the previous \begin{...} expression, which is
nicer than the default TeX-close-LaTeX-block function but still a long way
from knowing about \begin{...}'s that have already been \end'ed.
Ideally, "\begin{foo}" and "\end{foo}" should behave like a parenthesis pair.
If you have code that does this, could you please e-mail it to me or post it
to comp.emacs?
Thanks.
-- Ashwin.
ARPA: Ram-Ashwin@cs.yale.edu
UUCP: {decvax,ucbvax,harvard,cmcl2,...}!yale!Ram-Ashwin
BITNET: Ram@yalecsmetz@iam.unibe.ch (Igor Metz) (02/23/88)
A set of macros that could solve your problem can be found in the VorTeX
distribution. Here is the original message I got from the VorTeX project:
From: The VorTeX Distribution <vortex@ucbarpa.berkeley.edu>
To: <metz@iam.unibe.ch>
Subject: Re: Vortex
Thank you for your interest in VorTeX. The following is a list of the
utilities included in the distribution, with a short description of each:
dvitool - A previewer for DVI files which runs on the SUN workstation.
dvi2x - A previewer for DVI files which uses an X display server.
fonts - A set of fonts used for TeX and LaTeX in the sizes
needed for using the previewer.
pxltool - SUN-based font editor for PXL files
emacs - A large LISP library for use with emacs which facilitates
editing of TeX, LaTeX, and BIBTex files.
dvitoip - A DVI to INTERPRESS filter. It allows the printing of DVI files
on an Xerox Dandelion printer.
texdvi - A program which runs TeX, LaTeX, or SliTeX and previews
the results using DVItool.
gr2ps - A program which converts grelim files to POSTSCRIPT.
makeindex - A general purpose index generator for use with LaTeX files.
May also be used with other dialects of TeX.
Includes patches to work under VMS.
We have sent a licensing package to the postal address you provided. This
package contains further information about VorTeX, information about
licensing procedures, and the appropriate forms for licensing VorTeX.
Sincerely,
Peter Vukovich
VorTeX group, Univerity of California, Berkeley
Please address any correspondence to:
Professor Michael A. Harrison
Att. Vortex Dist.
Computer Science Division
University of California
Berkeley, CA 94720
UUCP: ...!ucbvax!dist-vortex
ARPA: dist-vortex@ucbvax.berkeley.edu
Regards,
Igor Metz X400: metz@iam.unibe.ch or metz@iam.unibe.chunet
Institut fuer Informatik ARPA: metz%iam.unibe.ch@relay.cs.net
und angewandte Mathematik UUCP: ..!uunet!mcvax!iam.unibe.ch!metz
Universitaet Bern
Switzerland Phone: (+31) 65 49 02Ram-Ashwin@YALE.ARPA (Ashwin Ram) (03/04/88)
In article <8802230342.AA12720@ATHENA.CS.YALE.EDU>, ram-ashwin@YALE (Ashwin Ram) writes: > Does anyone have code that recognizes "\begin{foo} ... \end{foo}" pairs in a > LaTeX file as a "balanced pair"? In particular, I'm looking for something > that would validate a buffer, indicate a mismatch (just as for different > kinds of parens), and insert the correct \end{...} expression upon hitting a > key, depending on the current \begin{...} expression that you're in? I got several useful replies to this (thanks, guys!), including a couple of fairly elaborate latex-modes. I also got some requests to forward my final solution, so here goes. (I should add that I got a couple of nicer solutions than this in response to my request. This is just the simplest and least elaborate fix that works, which you can install in a couple of minutes, so I decided to share it with the net.) The easiest solution is to redefine TeX-close-LaTeX-block (in the file lisp/tex-mode.el). Just replace it with the following function (which is already bound to C-c C-f by default). [I suggest that this be replaced in the GNU Emacs distribution since it's a lot nicer than the old function.] ---------------------------------------------------------------------------- ;; Replacement for TeX-close-LaTeX-block in lisp/tex-mode.el. ;; Ashwin Ram, 2/22/88. (defun TeX-close-LaTeX-block (&optional validate) "Inserts an \\end{...} to match corresponding \\begin{...}. If optional argument VALIDATE is t, doesn't insert anything, only validates." (interactive "*") (let ((fail-point (point)) (nesting '()) (done nil)) (end-of-line) (while (not done) (if (re-search-backward "\\\\\\(begin\\|end\\){\\([^}\n]*\\)}" (point-min) t) (let ((which (buffer-substring (match-beginning 1) (match-end 1))) (text (buffer-substring (match-beginning 2) (match-end 2)))) (if (equal which "end") (setq nesting (cons text nesting)) (if (null nesting) (let ((indentation (current-column))) (goto-char fail-point) (if validate (error "\\begin{%s} is never ended" text) (progn (beginning-of-line) (if (not (looking-at "^[ \t]*\n")) (progn (end-of-line) (insert "\n"))) (indent-to indentation) (insert "\\end{" text "}\n"))) (setq done t)) (if (equal text (car nesting)) (setq nesting (cdr nesting)) (error "\\begin{%s} ended by \\end{%s}" text (car nesting)))))) (progn (goto-char fail-point) (if (not validate) (message "No unmatched \\begin{...} to end here")) (setq done t)))))) ---------------------------------------------------------------------------- To do begin-end checking in addition to {} checking, I changed the following function by adding a couple of lines to call the above. This is less than ideal, I suppose, but it works. The lines are initialled. ---------------------------------------------------------------------------- (defun TeX-validate-paragraph (start end) (condition-case () (save-excursion (save-restriction (narrow-to-region start end) (goto-char end) ;; Added, AR 2/22/88. (TeX-close-LaTeX-block t) ;; Added, AR 2/22/88. (goto-char start) (forward-sexp (- end start)) t)) (error nil))) ---------------------------------------------------------------------------- -- Ashwin Ram -- ARPA: Ram-Ashwin@cs.yale.edu UUCP: {decvax,ucbvax,harvard,cmcl2,...}!yale!Ram-Ashwin BITNET: Ram@yalecs