(defvar tex-compile-keymap (make-sparse-keymap))
(defvar *TeX-Printer* nil)

(progn
    (define-key tex-compile-keymap " " 'tex-remove-window)
    (define-key tex-compile-keymap "k" 'kill-tex-buffer)
    (define-key tex-compile-keymap "p" 'tex-preview-file)
    (define-key tex-compile-keymap "l" 'tex-lpr-file))


(defun tex (&optional progname)
  (interactive)
  (save-buffer)
  (kill-tex-buffer)
  (let ((file (buffer-file-name)))
    (switch-to-buffer-other-window "*TeX*")
    (use-local-map tex-compile-keymap)
    (make-local-variable 'tex-filename)
    (setq tex-filename file)
    (set-process-sentinel 
     (start-process "TeX"
		    (current-buffer)
		    (or progname "/usr/athena/tex")
		    file)
     'tex-sentinel)
    (message "Press SPACE to remove this window, or `k' to stop TeX process.")))

(defun latex ()
  (interactive)
  (tex "/usr/athena/latex"))

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

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

(defun tex-lpr-file (printer)
  (interactive "sPrinter: lpr -h -P")
  (setq *TeX-Printer* printer)
  (set-process-sentinel
   (start-process "lpr" "*TeX*" "sh" "-c" 
		  (concat "dvi2ps -r " (substring tex-filename 0 -4) 
			  ".dvi | lpr -h -P" *TeX-Printer*))
   'lpr-sentinel))

(defun lpr-sentinel (process status)
  (princ "\nlpr finished." (get-buffer "*TeX"))
  (start-process "lpq" "*TeX*" "lpq" (concat "-P" *TeX-Printer*)))

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

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