Mercurial > hg > xemacs-beta
diff lisp/packages/texnfo-tex.el @ 0:376386a54a3c r19-14
Import from CVS: tag r19-14
author | cvs |
---|---|
date | Mon, 13 Aug 2007 08:45:50 +0200 |
parents | |
children | 0293115a14e9 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lisp/packages/texnfo-tex.el Mon Aug 13 08:45:50 2007 +0200 @@ -0,0 +1,350 @@ +;;;; texnfo-tex.el + +;;; Texinfo mode TeX and hardcopy printing commands. + +;; These commands are for running TeX on a region of a Texinfo file in +;; GNU Emacs, or on the whole buffer, and for printing the resulting +;; DVI file. + +;;; Version 2.07 22 October 1991 +;;; Robert J. Chassell +;;; Please send bug reports to: bug-texinfo@prep.ai.mit.edu + +;;; Copyright (C) 1989, 1990, 1991 Free Software Foundation, Inc. + + +;; This file is part of XEmacs. + +;; XEmacs is free software; you can redistribute it and/or modify it +;; under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 2, or (at your option) +;; any later version. + +;; XEmacs is distributed in the hope that it will be useful, but +;; WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +;; General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with XEmacs; see the file COPYING. If not, write to the Free +;; Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. + +;;; Synched up with: Not in FSF. + + +;;; The Texinfo mode TeX related commands are: + +; texinfo-tex-region to run tex on the current region. +; texinfo-tex-buffer to run tex on the current buffer. +; texinfo-texindex to sort unsorted index files. +; texinfo-tex-print to print the .dvi file made by tex. +; texinfo-kill-tex-job to kill the currently running tex job. +; texinfo-recenter-tex-output-buffer to redisplay tex output buffer. +; texinfo-show-tex-print-queue to show the print queue. + + +;;; Keys common both to Texinfo mode and to TeX shell. + +;; Defined in `texinfo.el' +; (defun texinfo-define-common-keys (keymap) +; "Define the keys both in Texinfo mode and in the texinfo-tex-shell." +; (define-key keymap "\C-c\C-t\C-k" 'texinfo-kill-tex-job) +; (define-key keymap "\C-c\C-t\C-x" 'texinfo-quit-tex-job) +; (define-key keymap "\C-c\C-t\C-l" 'texinfo-recenter-tex-output-buffer) +; (define-key keymap "\C-c\C-t\C-d" 'texinfo-delete-from-tex-print-queue) +; (define-key keymap "\C-c\C-t\C-q" 'texinfo-show-tex-print-queue) +; (define-key keymap "\C-c\C-t\C-p" 'texinfo-tex-print) +; (define-key keymap "\C-c\C-t\C-i" 'texinfo-texindex) +; (define-key keymap "\C-c\C-t\C-r" 'texinfo-tex-region) +; (define-key keymap "\C-c\C-t\C-b" 'texinfo-tex-buffer)) + +;; See also texinfo-tex-start-shell. +;; The following is executed in the `texinfo.el' file +;(texinfo-define-common-keys texinfo-mode-map) + + +;;; Variable definitions: + +(require 'shell) + +(defvar texinfo-tex-shell-cd-command "cd" + "Command to give to shell running TeX to change directory.") + +(defvar texinfo-tex-command "tex" + "*Command used by texinfo-tex-region to run tex on a region.") + +(defvar texinfo-texindex-command "texindex" + "*Command used by texinfo-texindex to sort unsorted index files.") + +(defvar texinfo-tex-dvi-print-command "lpr -d" + "*Command string used by \\[tex-print] to print a .dvi file.") + +(defvar texinfo-show-tex-queue-command "lpq" + "*Command string used to show the Texinfo TeX print queue. +Command is used by \\[texinfo-show-tex-print-queue] and it +should show the queue that \\[texinfo-tex-print] puts jobs on.") + +(defvar texinfo-delete-from-print-queue-command "lprm" + "*Command string used to delete a job from the line printer queue. +Command is used by \\[texinfo-delete-from-tex-print-queue] based on +number provided by a previous \\[texinfo-show-tex-print-queue] +command.") + +(defvar texinfo-tex-trailer "@bye" + "String appended after a region sent to TeX by texinfo-tex-region.") + +(defvar texinfo-tex-original-file "" + "Original name of file on which to run TeX.") + +(defvar texinfo-tex-temp-file nil + "Temporary file name used for text being sent as input to TeX.") + +(defvar texinfo-tex-root-temp-file nil + "Temporary file name used for text being sent as input to TeX.") + + +;;; Texinfo TeX main functions + +(defun texinfo-tex-region (beginning end) + "Run tex on the current region. + +A temporary file is written in the default directory, and tex is run +in that directory. The first line of the file is copied to the +temporary file; and if the buffer has a header, it is written to the +temporary file before the region itself. The buffer's header is all +lines between the strings defined by texinfo-start-of-header and +texinfo-end-of-header inclusive. The header must start in the first 100 +lines. The value of texinfo-tex-trailer is appended to the temporary file +after the region." + + (interactive "r") + (if (get-buffer "*texinfo-tex-shell*") + (quit-process (get-process "texinfo-tex-shell") t) + (texinfo-tex-start-shell)) + + (setq texinfo-tex-root-temp-file + (expand-file-name + (make-temp-name + (prin1-to-string (read (buffer-name)))))) + + (let ((texinfo-tex-temp-file (concat texinfo-tex-root-temp-file ".tex"))) + (save-excursion + (save-restriction + (widen) + (goto-char (point-min)) + (forward-line 100) + (let ((search-end (point)) + (header-beginning (point-min)) (header-end (point-min))) + (goto-char (point-min)) + ;; Copy first line, the `\input texinfo' line, to temp file + (write-region (point) + (save-excursion (forward-line 1) (point)) + texinfo-tex-temp-file nil nil) + ;; Don't copy first line twice if region includes it. + (forward-line 1) + (if (< beginning (point)) (setq beginning (point))) + ;; Initialize the temp file with either the header or nothing + (if (search-forward texinfo-start-of-header search-end t) + (progn + (beginning-of-line) + (setq header-beginning (point)) ; Mark beginning of header. + (if (search-forward texinfo-end-of-header nil t) + (progn (beginning-of-line) + (setq header-end (point))) ; Mark end of header. + (setq header-beginning (point-min))))) ; Else no header. + ;; Copy header to temp file. + (write-region + (min header-beginning beginning ) + header-end + texinfo-tex-temp-file t nil) + ;; Copy region to temp file. + (write-region + (max beginning header-end) + end + texinfo-tex-temp-file t nil) + ;; This is a kludge to insert the texinfo-tex-trailer into the + ;; texinfo-tex-temp-file. We have to create a special buffer + ;; in which to insert the texinfo-tex-trailer first because there is + ;; no function with which to append a literal string directly + ;; to a file. + (let ((local-tex-trailer texinfo-tex-trailer) + (temp-buffer (get-buffer-create " texinfo-trailer-buffer"))) + (set-buffer temp-buffer) + (erase-buffer) + ;; make sure trailer isn't hidden by a comment + (insert-string "\n") + (if local-tex-trailer (insert local-tex-trailer)) + (write-region (point-min) (point-max) + texinfo-tex-temp-file t nil))) + (set-process-sentinel (get-process "texinfo-tex-shell") + 'texinfo-tex-shell-sentinel) + (send-string "texinfo-tex-shell" + (concat texinfo-tex-shell-cd-command " " + default-directory "\n")) + (send-string "texinfo-tex-shell" + (concat texinfo-tex-command " " + texinfo-tex-temp-file "\n ")) + (texinfo-recenter-tex-output-buffer 0))))) + +(defun texinfo-tex-buffer (buffer) + "Run TeX on current buffer. +After running TeX the first time, you may have to run \\[texinfo-texindex] +and then \\[texinfo-tex-buffer] again." + (interactive + (list + ;; Sometimes you put point into *texinfo-tex-shell*; this prompts + ;; you for the correct file regardless. + (if (and + (string= (buffer-name (current-buffer)) "*texinfo-tex-shell*") + texinfo-tex-root-temp-file) + (read-string (format "Run TeX on: ") + texinfo-tex-original-file) + (read-string (format "Run TeX on: ") (buffer-name (current-buffer)))))) + + ;; Set to original buffer if in *texinfo-tex-shell*; otherwise, + ;; record name of current buffer. + (if (string= (buffer-name (current-buffer)) "*texinfo-tex-shell*") + (set-buffer buffer) + (setq texinfo-tex-original-file + (buffer-name (current-buffer)))) + + (if (get-buffer "*texinfo-tex-shell*") + (quit-process (get-process "texinfo-tex-shell") t) + (texinfo-tex-start-shell)) + (cond ((null buffer-file-name) + (error "Buffer not visiting any file!")) + ((buffer-modified-p) + (error "Buffer has been modified since last saved!")) + (t (set-process-sentinel (get-process "texinfo-tex-shell") + 'texinfo-tex-shell-sentinel) + (send-string "texinfo-tex-shell" + (concat texinfo-tex-shell-cd-command + " " + (file-name-directory + (buffer-file-name + (get-buffer buffer))) + "\n")) + (send-string "texinfo-tex-shell" + (concat texinfo-tex-command " " buffer "\n ")) + + ;; so the texinfo-tex-print command works + (setq texinfo-tex-root-temp-file + (substring buffer 0 + (or (string-match "\\.tex" buffer) + (length buffer)))) + + (texinfo-recenter-tex-output-buffer 0)))) + +(defun texinfo-texindex () + "Run texindex on unsorted index files. +The index files are made by \\[texinfo-tex-region] or \\[texinfo-tex-buffer]. +Runs the shell command defined by texinfo-texindex-command." + (interactive) + (send-string "texinfo-tex-shell" + (concat texinfo-texindex-command + " " texinfo-tex-root-temp-file ".??" "\n")) + (texinfo-recenter-tex-output-buffer nil)) + +(defun texinfo-tex-print () + "Print .dvi file made by \\[texinfo-tex-region] or \\[texinfo-tex-buffer]. +Runs the shell command defined by texinfo-tex-dvi-print-command." + (interactive) + (send-string "texinfo-tex-shell" + (concat texinfo-tex-dvi-print-command + " " texinfo-tex-root-temp-file ".dvi" "\n")) + (texinfo-recenter-tex-output-buffer nil)) + + +;;; Texinfo TeX utility functions + +(defun texinfo-tex-start-shell () + (save-excursion + (require 'texinfo) + (set-buffer (if (fboundp 'make-shell) + (make-shell "texinfo-tex-shell" "/bin/sh" nil "-v") + (make-comint "texinfo-tex-shell" "/bin/sh" nil "-v"))) + (setq texinfo-tex-shell-map (copy-keymap shell-mode-map)) + (texinfo-define-common-keys texinfo-tex-shell-map) + (use-local-map texinfo-tex-shell-map) + (run-hooks 'texinfo-tex-shell-hook) + (if (zerop (buffer-size)) + (sleep-for 1)))) + +(defun texinfo-quit-tex-job () + "Quit currently running TeX job, by sending an `x' to it." + (interactive) + (if (not (get-process "texinfo-tex-shell")) + (error "No TeX shell running.")) + (save-excursion + (set-buffer (get-buffer "*texinfo-tex-shell*")) + (goto-char (point-max)) + (insert "x") + (shell-send-input))) + +(defun texinfo-kill-tex-job () + "Kill the currently running TeX job." + (interactive) + (if (get-process "texinfo-tex-shell") + ;; Use `texinfo-tex-shell-sentinel' to restart + ;; texinfo-tex-shell after it is killed. + (kill-process (get-process "texinfo-tex-shell")))) + +(defun texinfo-tex-shell-sentinel (process event) + "Restart texinfo-tex-shell after it is killed." + (if (equal event "killed\n") + (save-excursion + (set-buffer "*texinfo-tex-shell*") + (insert "\n") + (texinfo-tex-start-shell)))) + +(defun texinfo-recenter-tex-output-buffer (linenum) + "Redisplay buffer of TeX job output so that most recent output can be seen. +The last line of the buffer is displayed on +line LINE of the window, or centered if LINE is nil." + (interactive "P") + (let ((texinfo-tex-shell (get-buffer "*texinfo-tex-shell*")) + (old-buffer (current-buffer))) + (if (null texinfo-tex-shell) + (message "No TeX output buffer") + (pop-to-buffer texinfo-tex-shell) + (bury-buffer texinfo-tex-shell) + (goto-char (point-max)) + (recenter (if linenum + (prefix-numeric-value linenum) + (/ (window-height) 2))) + (pop-to-buffer old-buffer) + ))) + +(defun texinfo-show-tex-print-queue () + "Show the print queue that \\[texinfo-tex-print] put your job on. +Runs the shell command defined by texinfo-show-tex-queue-command." + (interactive) + (if (not (texinfo-tex-shell-running-p)) + (texinfo-tex-start-shell)) + (send-string "texinfo-tex-shell" + (concat texinfo-show-tex-queue-command "\n")) + (texinfo-recenter-tex-output-buffer nil)) + +(defun texinfo-delete-from-tex-print-queue (job-number) + "Delete job from the line printer spooling queue. +You are prompted for the job number (shown by a previous +\\[texinfo-show-tex-print-queue] command." + (interactive "nPrinter job number for deletion: ") + (if (texinfo-tex-shell-running-p) + (texinfo-kill-tex-job) + (texinfo-tex-start-shell)) + (send-string "texinfo-tex-shell" + (concat + texinfo-delete-from-print-queue-command + " " + job-number"\n")) + (texinfo-recenter-tex-output-buffer nil)) + +(defun texinfo-tex-shell-running-p () + (and (get-process "texinfo-tex-shell") + (eq (process-status (get-process "texinfo-tex-shell")) 'run))) + + +;;; Place `provide' at end of file. +(provide 'texnfo-tex) +;;;;;;;;;;;;;;;; end texnfo-tex.el ;;;;;;;;;;;;;;;;