(defun latex ()
  (interactive)
  (save-buffer)
  (kill-latex-buffer)
  (let ((file (buffer-file-name)))
    (switch-to-buffer-other-window "*LaTeX*")
    (make-local-variable 'latex-filename)
    (setq latex-filename file)
    (local-set-key " " 'latex-remove-window)
    (local-set-key "k" 'kill-latex-buffer)
    (set-process-sentinel 
     (start-process "latex"
		    (current-buffer)
		    "/afs/athena/contrib/sipb/@sys/latex"
		    file)
     'latex-sentinel)
    (message "Press SPACE to remove this window, or `k' to stop LaTeX process.")))

(defun latex-sentinel (process status)
  (beep)
  (princ "\nFinished processing LaTeX file.\n" (get-buffer "*LaTeX*"))
  (cond ((eq (window-buffer) (process-buffer process))
	 (message "Press SPACE to get rid of this window, or `p' to preview the .dvi file.")
	 (local-set-key "p" 'latex-preview-file))
	(t (message "(Process LaTeX finished.)"))))

(defun latex-preview-file ()
  (interactive)
  (cond ((not (string-equal "*LaTeX*" (buffer-name)))
	 (switch-to-buffer-other-window "*LaTeX*")))
  (princ "\nPreviewing dvi file ...\n" (current-buffer))
  (start-process "xdvi" (current-buffer) "xdvi" 
		 (concat (substring latex-filename 0 -4) ".dvi")))

(defun latex-remove-window ()
  (interactive)
  (bury-buffer)
  (other-window 1)
  (delete-other-windows)
  (recenter))

(defun kill-latex-buffer ()
  (interactive)
  (let ((latex-buffer (get-buffer "*LaTeX*")))
    (cond (latex-buffer
	   (cond ((get-buffer-process latex-buffer)
		  (delete-process "latex")))
	   (cond ((eq latex-buffer (current-buffer))
		  (latex-remove-window)))
	   (kill-buffer latex-buffer)))))
