Mercurial > hg > xemacs-beta
diff lisp/auctex/tex-buf.el @ 24:4103f0995bd7 r19-15b95
Import from CVS: tag r19-15b95
author | cvs |
---|---|
date | Mon, 13 Aug 2007 08:51:03 +0200 |
parents | |
children | 441bb1e64a06 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lisp/auctex/tex-buf.el Mon Aug 13 08:51:03 2007 +0200 @@ -0,0 +1,1610 @@ +;;; tex-buf.el - External commands for AUC TeX. +;; +;; Maintainer: Per Abrahamsen <auc-tex@sunsite.auc.dk> +;; Version: 9.7i + +;; Copyright (C) 1991 Kresten Krab Thorup +;; Copyright (C) 1993, 1996 Per Abrahamsen +;; +;; This program 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 1, or (at your option) +;; any later version. +;; +;; This program 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 this program; if not, write to the Free Software +;; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +;;; Code: + +(defvar no-doc + "This function is part of AUC TeX, but has not yet been loaded. +Full documentation will be available after autoloading the function." + "Documentation for autoload functions.") + +;;; Customization: + +(defvar TeX-process-asynchronous (not (eq system-type 'ms-dos)) + "*Use asynchronous processes.") + +(defvar TeX-shell + (if (memq system-type '(ms-dos emx windows-nt)) + shell-file-name + "/bin/sh") + "Name of shell used to parse TeX commands.") + +(defvar TeX-shell-command-option + (cond ((memq system-type '(ms-dos emx windows-nt) ) + (cond ((boundp 'shell-command-option) + shell-command-option) + ((boundp 'shell-command-switch) + shell-command-switch) + (t + "/c"))) + (t ;Unix & EMX (Emacs 19 port to OS/2) + "-c")) + "Shell argument indicating that next argument is the command.") + +;;; Interactive Commands +;; +;; The general idea is, that there is one process and process buffer +;; associated with each master file, and one process and process buffer +;; for running TeX on a region. Thus, if you have N master files, you +;; can run N + 1 processes simultaneously. +;; +;; Some user commands operates on ``the'' process. The following +;; algorithm determine what ``the'' process is. +;; +;; IF last process started was on a region +;; THEN ``the'' process is the region process +;; ELSE ``the'' process is the master file (of the current buffer) process + +(defun TeX-save-document (name) + "Save all files belonging to the current document. +Return non-nil if document need to be re-TeX'ed." + (interactive (list (TeX-master-file))) + (if (string-equal name "") + (setq name (TeX-master-file))) + + (TeX-check-files (concat name ".dvi") + (cons name (TeX-style-list)) + TeX-file-extensions)) + +(defun TeX-command-master () + "Run command on the current document." + (interactive) + (TeX-command (TeX-command-query (TeX-master-file)) 'TeX-master-file)) + +(defvar TeX-command-region-begin nil) +(defvar TeX-command-region-end nil) +;; Used for marking the last region. + +(make-variable-buffer-local 'TeX-command-region-begin) +(make-variable-buffer-local 'TeX-command-region-end) + +(defun TeX-command-region (&optional old) + "Run TeX on the current region. + +Query the user for a command to run on the temporary file specified by +the variable TeX-region. If the chosen command is so marked in +TeX-command-list, and no argument (or nil) is given to the command, +the region file file be recreated with the current region. If mark is +not active, the new text in the previous used region will be used. + +If the master file for the document has a header, it is written to the +temporary file before the region itself. The document's header is all +text before TeX-header-end. + +If the master file for the document has a trailer, it is written to +the temporary file before the region itself. The document's trailer is +all text after TeX-trailer-start." + (interactive "P") + (if (and (TeX-mark-active) (not old)) + (let ((begin (min (point) (mark))) + (end (max (point) (mark)))) + (if TeX-command-region-begin + () + (setq TeX-command-region-begin (make-marker) + TeX-command-region-end (make-marker))) + (set-marker TeX-command-region-begin begin) + (set-marker TeX-command-region-end end))) + (if (null TeX-command-region-begin) + (error "Mark not set")) + (let ((begin (marker-position TeX-command-region-begin)) + (end (marker-position TeX-command-region-end))) + (TeX-region-create (TeX-region-file TeX-default-extension) + (buffer-substring begin end) + (file-name-nondirectory (buffer-file-name)) + (count-lines (save-restriction (widen) (point-min)) + begin))) + (TeX-command (TeX-command-query (TeX-region-file)) 'TeX-region-file)) + +(defun TeX-command-buffer () + "Run TeX on the current buffer. + +Query the user for a command to run on the temporary file specified by +the variable TeX-region. The region file file be recreated from the +visible part of the buffer." + (interactive) + (let ((TeX-command-region-begin (point-min-marker)) + (TeX-command-region-end (point-max-marker))) + (TeX-command-region t))) + +(defun TeX-recenter-output-buffer (line) + "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 +at bottom if LINE is nil." + (interactive "P") + (let ((buffer (TeX-active-buffer))) + (if buffer + (let ((old-buffer (current-buffer))) + (pop-to-buffer buffer t) + (bury-buffer buffer) + (goto-char (point-max)) + (recenter (if line + (prefix-numeric-value line) + (/ (window-height) 2))) + (pop-to-buffer old-buffer)) + (message "No process for this document.")))) + +(defun TeX-kill-job () + "Kill the currently running TeX job." + (interactive) + (let ((process (TeX-active-process))) + (if process + (kill-process process) + ;; Should test for TeX background process here. + (error "No TeX process to kill")))) + +(defun TeX-home-buffer () + "Go to the buffer where you last issued a TeX command. +If there is no such buffer, or you already are in that buffer, find +the master file." + (interactive) + (if (or (null TeX-command-buffer) + (eq TeX-command-buffer (current-buffer))) + (find-file (TeX-master-file TeX-default-extension)) + (switch-to-buffer TeX-command-buffer))) + +(defun TeX-next-error (reparse) + "Find the next error in the TeX output buffer. +Prefix by C-u to start from the beginning of the errors." + (interactive "P") + (if (null (TeX-active-buffer)) + (error "No TeX output buffer") + (funcall (TeX-process-get-variable (TeX-active-master) 'TeX-parse-function) + reparse))) + +(defun TeX-toggle-debug-boxes () + "Toggle if the debugger should display \"bad boxes\" too." + (interactive) + (cond (TeX-debug-bad-boxes + (setq TeX-debug-bad-boxes nil)) + (t + (setq TeX-debug-bad-boxes t))) + (message (concat "TeX-debug-bad-boxes: " (cond (TeX-debug-bad-boxes "on") + (t "off"))))) + +;;; Command Query + +(defun TeX-command (name file) + "Run command NAME on the file you get by calling FILE. + +FILE is a function return a file name. It has one optional argument, +the extension to use on the file. + +Use the information in TeX-command-list to determine how to run the +command." + (setq TeX-current-process-region-p (eq file 'TeX-region-file)) + (let ((command (TeX-command-expand (nth 1 (assoc name TeX-command-list)) + file)) + (hook (nth 2 (assoc name TeX-command-list))) + (confirm (nth 3 (assoc name TeX-command-list)))) + + ;; Verify the expanded command + (if confirm + (setq command + (read-from-minibuffer (concat name " command: ") command))) + + ;; Now start the process + (TeX-process-set-variable name 'TeX-command-next TeX-command-Show) + (apply hook name command (apply file nil) nil))) + +(defun TeX-command-expand (command file &optional list) + "Expand COMMAND for FILE as described in LIST. +LIST default to TeX-expand-list." + (if (null list) + (setq list TeX-expand-list)) + (while list + (let ((case-fold-search nil) ; Do not ignore case. + (string (car (car list))) ;First element + (expansion (car (cdr (car list)))) ;Second element + (arguments (cdr (cdr (car list))))) ;Remaining elements + (while (string-match string command) + (let ((prefix (substring command 0 (match-beginning 0))) + (postfix (substring command (match-end 0)))) + (setq command (concat prefix + (cond ((TeX-function-p expansion) + (apply expansion arguments)) + ((boundp expansion) + (apply (eval expansion) arguments)) + (t + (error "Nonexpansion %s" expansion))) + postfix))))) + (setq list (cdr list))) + command) + +(defun TeX-check-files (derived originals extensions) + "Check that DERIVED is newer than any of the ORIGINALS. +Try each original with each member of EXTENSIONS, in all directories +in TeX-check-path." + (let ((found nil) + (regexp (concat "\\`\\(" + (mapconcat (function (lambda (dir) + (regexp-quote (expand-file-name dir)))) + TeX-check-path "\\|") + "\\).*\\(" + (mapconcat 'regexp-quote originals "\\|") + "\\)\\.\\(" + (mapconcat 'regexp-quote extensions "\\|") + "\\)\\'")) + (buffers (buffer-list))) + (while buffers + (let* ((buffer (car buffers)) + (name (buffer-file-name buffer))) + (setq buffers (cdr buffers)) + (if (and name (string-match regexp name)) + (progn + (and (buffer-modified-p buffer) + (or (not TeX-save-query) + (y-or-n-p (concat "Save file " + (buffer-file-name buffer) + "? "))) + (save-excursion (set-buffer buffer) (save-buffer))) + (if (file-newer-than-file-p name derived) + (setq found t)))))) + found)) + +(defvar TeX-save-query t + "*If non-nil, ask user for permission to save files before starting TeX.") + +(defun TeX-command-query (name) + "Query the user for a what TeX command to use." + (let* ((default (cond ((if (string-equal name TeX-region) + (TeX-check-files (concat name ".dvi") + (list name) + TeX-file-extensions) + (TeX-save-document (TeX-master-file))) + TeX-command-default) + ((and (eq major-mode 'latex-mode) + (TeX-check-files (concat name ".bbl") + (mapcar 'car + (LaTeX-bibliography-list)) + BibTeX-file-extensions)) + ;; We should check for bst files here as well. + TeX-command-BibTeX) + ((TeX-process-get-variable name + 'TeX-command-next + TeX-command-Show)) + (TeX-command-Show))) + (completion-ignore-case t) + (answer (or TeX-command-force + (completing-read + (concat "Command: (default " default ") ") + TeX-command-list nil t)))) + ;; If the answer "latex" it will not be expanded to "LaTeX" + (setq answer (car-safe (TeX-assoc answer TeX-command-list))) + (if (and answer + (not (string-equal answer ""))) + answer + default))) + +(defvar TeX-command-next nil + "The default command next time TeX-command is invoked.") + + (make-variable-buffer-local 'TeX-command-next) + +(defun TeX-printer-query (&optional command element) + "Query the user for a printer name. +COMMAND is the default command to use if the entry for the printer in +TeX-printer-list does not itself have it specified in the ELEMENT'th +entry." + (or command (setq command TeX-print-command)) + (or element (setq element 1)) + (let ((printer (if TeX-printer-list + (let ((completion-ignore-case t)) + (completing-read (concat "Printer: (default " + TeX-printer-default ") ") + TeX-printer-list)) + ""))) + + (setq printer (or (car-safe (TeX-assoc printer TeX-printer-list)) + printer)) + (if (or (null printer) (string-equal "" printer)) + (setq printer TeX-printer-default) + (setq TeX-printer-default printer)) + + (let ((expansion (let ((entry (assoc printer TeX-printer-list))) + (if (and entry (nth element entry)) + (nth element entry) + command)))) + (if (string-match "%p" printer) + (error "Don't use %s in printer names" "%p")) + (while (string-match "%p" expansion) + (setq expansion (concat (substring expansion 0 (match-beginning 0)) + printer + (substring expansion (match-end 0))))) + expansion))) + +(defun TeX-style-check (styles) + "Check STYLES compared to the current style options." + + (let ((files (TeX-style-list))) + (while (and styles + (not (TeX-member (car (car styles)) files 'string-match))) + (setq styles (cdr styles)))) + (if styles + (nth 1 (car styles)) + "")) + +;;; Command Hooks + +(defvar TeX-after-start-process-function nil + "Hooks to run after starting an asynchronous process. +Used by Japanese TeX to set the coding system.") + +(defvar TeX-show-compilation nil + "*If non-nil, show output of TeX compilation in other window.") + +(defun TeX-run-command (name command file) + "Create a process for NAME using COMMAND to process FILE. +Return the new process." + (let ((default TeX-command-default) + (buffer (TeX-process-buffer-name file)) + (dir (TeX-master-directory))) + (TeX-process-check file) ; Check that no process is running + (setq TeX-command-buffer (current-buffer)) + (get-buffer-create buffer) + (set-buffer buffer) + (erase-buffer) + (if dir (cd dir)) + (insert "Running `" name "' on `" file "' with ``" command "''\n") + (setq mode-name name) + (if TeX-show-compilation + (display-buffer buffer) + (message "Type `C-c C-l' to display results of compilation.")) + (setq TeX-parse-function 'TeX-parse-command) + (setq TeX-command-default default) + (setq TeX-sentinel-function + (function (lambda (process name) + (message (concat name ": done."))))) + (if TeX-process-asynchronous + (let ((process (start-process name buffer TeX-shell + TeX-shell-command-option command))) + (if TeX-after-start-process-function + (funcall TeX-after-start-process-function process)) + (TeX-command-mode-line process) + (set-process-filter process 'TeX-command-filter) + (set-process-sentinel process 'TeX-command-sentinel) + (set-marker (process-mark process) (point-max)) + (setq compilation-in-progress (cons process compilation-in-progress)) + process) + (setq mode-line-process ": run") + (set-buffer-modified-p (buffer-modified-p)) + (sit-for 0) ; redisplay + (call-process TeX-shell nil buffer nil + TeX-shell-command-option command)))) + +(defun TeX-run-format (name command file) + "Create a process for NAME using COMMAND to format FILE with TeX." + (let ((buffer (TeX-process-buffer-name file)) + (process (TeX-run-command name command file))) + ;; Hook to TeX debuger. + (save-excursion + (set-buffer buffer) + (TeX-parse-reset) + (setq TeX-parse-function 'TeX-parse-TeX) + (setq TeX-sentinel-function 'TeX-TeX-sentinel) + (if TeX-process-asynchronous + (progn + ;; Updating the mode line. + (setq TeX-current-page "[0]") + (TeX-format-mode-line process) + (set-process-filter process 'TeX-format-filter))) + process))) + +(defun TeX-run-TeX (name command file) + "Create a process for NAME using COMMAND to format FILE with TeX." + (let ((process (TeX-run-format name command file))) + (if TeX-process-asynchronous + process + (TeX-synchronous-sentinel name file process)))) + +(defun TeX-run-LaTeX (name command file) + "Create a process for NAME using COMMAND to format FILE with TeX." + (let ((process (TeX-run-format name command file))) + (setq TeX-sentinel-function 'TeX-LaTeX-sentinel) + (if TeX-process-asynchronous + process + (TeX-synchronous-sentinel name file process)))) + +(defun TeX-run-BibTeX (name command file) + "Create a process for NAME using COMMAND to format FILE with BibTeX." + (let ((process (TeX-run-command name command file))) + (setq TeX-sentinel-function 'TeX-BibTeX-sentinel) + (if TeX-process-asynchronous + process + (TeX-synchronous-sentinel name file process)))) + +(defun TeX-run-compile (name command file) + "Ignore first and third argument, start compile with second argument." + (compile command)) + +(defun TeX-run-shell (name command file) + "Ignore first and third argument, start shell-command with second argument." + (shell-command command) + (if (eq system-type 'ms-dos) + (redraw-display))) + +(defun TeX-run-discard (name command file) + "Start process with second argument, discarding its output." + (process-kill-without-query (start-process (concat name " discard") + nil TeX-shell + TeX-shell-command-option + command))) + +(defun TeX-run-dviout (name command file) + "Call process wbith second argument, discarding its output. With support +for the dviout previewer, especially when used with PC-9801 series." + (if (and (boundp 'dos-machine-type) (eq dos-machine-type 'pc98)) ;if PC-9801 + (send-string-to-terminal "\e[2J")) ; clear screen + (call-process TeX-shell (if (eq system-type 'ms-dos) "con") nil nil + TeX-shell-command-option command) + (if (eq system-type 'ms-dos) + (redraw-display))) + +(defun TeX-run-background (name command file) + "Start process with second argument, show output when and if it arrives." + (let ((dir (TeX-master-directory))) + (set-buffer (get-buffer-create "*TeX background*")) + (if dir (cd dir)) + (erase-buffer) + (let ((process (start-process (concat name " background") + nil TeX-shell + TeX-shell-command-option command))) + (if TeX-after-start-process-function + (funcall TeX-after-start-process-function process)) + (set-process-filter process 'TeX-background-filter) + (process-kill-without-query process)))) + +(defun TeX-run-interactive (name command file) + "Run TeX interactively. +Run command in a buffer (in comint-shell-mode) so that it accepts user +interaction. If you return to the file buffer after the TeX run, +Error parsing on C-x ` should work with a bit of luck." + (require 'comint) + (let ((default TeX-command-default) + (buffer (TeX-process-buffer-name file)) + (process nil) + (dir (TeX-master-directory))) + (TeX-process-check file) ; Check that no process is running + (setq TeX-command-buffer (current-buffer)) + (with-output-to-temp-buffer buffer) + (set-buffer buffer) + (if dir (cd dir)) + (insert "Running `" name "' on `" file "' with ``" command "''\n") + (comint-exec buffer name TeX-shell nil + (list TeX-shell-command-option command)) + (comint-mode) + (setq mode-name name) + (setq TeX-command-default default) + (setq process (get-buffer-process buffer)) + (if TeX-after-start-process-function + (funcall TeX-after-start-process-function process)) + (TeX-command-mode-line process) + (set-process-sentinel process 'TeX-command-sentinel) + (set-marker (process-mark process) (point-max)) + (setq compilation-in-progress (cons process compilation-in-progress)) + (TeX-parse-reset) + (setq TeX-parse-function 'TeX-parse-TeX) + (setq TeX-sentinel-function 'TeX-LaTeX-sentinel))) + +;;; Command Sentinels + +(defun TeX-synchronous-sentinel (name file result) + "Process TeX command output buffer after the process dies." + (let* ((buffer (TeX-process-buffer file))) + (save-excursion + (set-buffer buffer) + + ;; Append post-mortem information to the buffer + (goto-char (point-max)) + (insert "\n" mode-name (if (and result (zerop result)) + " finished" " exited") " at " + (substring (current-time-string) 0 -5)) + (setq mode-line-process ": exit") + + ;; Do command specific actions. + (setq TeX-command-next TeX-command-Show) + (goto-char (point-min)) + (apply TeX-sentinel-function nil name nil) + + ;; Force mode line redisplay soon + (set-buffer-modified-p (buffer-modified-p))))) + +(defun TeX-command-sentinel (process msg) + "Process TeX command output buffer after the process dies." + (let* ((buffer (process-buffer process)) + (name (process-name process))) + (cond ((null (buffer-name buffer)) ; buffer killed + (set-process-buffer process nil) + (set-process-sentinel process nil)) + ((memq (process-status process) '(signal exit)) + (save-excursion + (set-buffer buffer) + + ;; Append post-mortem information to the buffer + (goto-char (point-max)) + (insert "\n" mode-name " " msg) + (forward-char -1) + (insert " at " + (substring (current-time-string) 0 -5)) + (forward-char 1) + + ;; Do command specific actions. + (TeX-command-mode-line process) + (setq TeX-command-next TeX-command-Show) + (goto-char (point-min)) + (apply TeX-sentinel-function process name nil) + + + ;; If buffer and mode line will show that the process + ;; is dead, we can delete it now. Otherwise it + ;; will stay around until M-x list-processes. + (delete-process process) + + ;; Force mode line redisplay soon + (set-buffer-modified-p (buffer-modified-p)))))) + (setq compilation-in-progress (delq process compilation-in-progress))) + + +(defvar TeX-sentinel-function (function (lambda (process name))) + "Hook to cleanup TeX command buffer after temination of PROCESS. +NAME is the name of the process.") + + (make-variable-buffer-local 'TeX-sentinel-function) + +(defun TeX-TeX-sentinel (process name) + "Cleanup TeX output buffer after running TeX." + (if (TeX-TeX-sentinel-check process name) + () + (message (concat name ": formatted " (TeX-current-pages))) + (setq TeX-command-next TeX-command-Show))) + +(defun TeX-current-pages () + ;; String indictating the number of pages formatted. + (cond ((null TeX-current-page) + "some pages.") + ((string-match "[^0-9]1[^0-9]" TeX-current-page) + (concat TeX-current-page " page.")) + (t + (concat TeX-current-page " pages.")))) + +(defun TeX-TeX-sentinel-check (process name) + "Cleanup TeX output buffer after running TeX. +Return nil ifs no errors were found." + (save-excursion + (goto-char (point-max)) + (if (re-search-backward "^Output written on.* (\\([0-9]+\\) page" nil t) + (setq TeX-current-page (concat "{" (TeX-match-buffer 1) "}")))) + (if process (TeX-format-mode-line process)) + (if (re-search-forward "^! " nil t) + (progn + (message (concat name " errors in `" (buffer-name) + "'. Use C-c ` to display.")) + (setq TeX-command-next TeX-command-default) + t) + (setq TeX-command-next TeX-command-Show) + nil)) + +(defun TeX-LaTeX-sentinel (process name) + "Cleanup TeX output buffer after running LaTeX." + (cond ((TeX-TeX-sentinel-check process name)) + ((and (save-excursion + (re-search-forward "^LaTeX Warning: Citation" nil t)) + (let ((current (current-buffer))) + (set-buffer TeX-command-buffer) + (prog1 (and (LaTeX-bibliography-list) + (TeX-check-files (TeX-master-file "bbl") + (TeX-style-list) + (append TeX-file-extensions + BibTeX-file-extensions))) + (set-buffer current)))) + (message (concat "You should run BibTeX to get citations right, " + (TeX-current-pages))) + (setq TeX-command-next TeX-command-BibTeX)) + ((re-search-forward "^LaTeX Warning: Label(s)" nil t) + (message (concat "You should run LaTeX again " + "to get references right, " + (TeX-current-pages))) + (setq TeX-command-next TeX-command-default)) + ((re-search-forward "^LaTeX Warning: Reference" nil t) + (message (concat name ": there were unresolved references, " + (TeX-current-pages))) + (setq TeX-command-next TeX-command-Show)) + ((re-search-forward "^LaTeX Warning: Citation" nil t) + (message (concat name ": there were unresolved citations, " + (TeX-current-pages))) + (setq TeX-command-next TeX-command-Show)) + ((re-search-forward + "^\\(\\*\\* \\)?J?I?p?\\(La\\|Sli\\)TeX\\(2e\\)? \\(Version\\|ver\\.\\|<[0-9/]*>\\)" nil t) + (message (concat name ": successfully formatted " + (TeX-current-pages))) + (setq TeX-command-next TeX-command-Show)) + (t + (message (concat name ": problems after " + (TeX-current-pages))) + (setq TeX-command-next TeX-command-default)))) + +(defun TeX-BibTeX-sentinel (process name) + "Cleanup TeX output buffer after running BibTeX." + (message "You should perhaps run LaTeX again to get citations right.") + (setq TeX-command-next TeX-command-default)) + +;;; Process Control + + +;; This variable is chared with `compile.el'. +(defvar compilation-in-progress nil + "List of compilation processes now running.") + +(or (assq 'compilation-in-progress minor-mode-alist) + (setq minor-mode-alist (cons '(compilation-in-progress " Compiling") + minor-mode-alist))) + +(defun TeX-process-get-variable (name symbol &optional default) + "Return the value in the process buffer for NAME of SYMBOL. + +Return DEFAULT if the process buffer does not exist or SYMBOL is not +defined." + (let ((buffer (TeX-process-buffer name))) + (if buffer + (save-excursion + (set-buffer buffer) + (if (boundp symbol) + (eval symbol) + default)) + default))) + +(defun TeX-process-set-variable (name symbol value) + "Set the variable SYMBOL in the process buffer to VALUE. +Return nil iff no process buffer exist." + (let ((buffer (TeX-process-buffer name))) + (if buffer + (save-excursion + (set-buffer buffer) + (set symbol value) + t) + nil))) + +(defun TeX-process-check (name) + "Check if a process for the TeX document NAME already exist. +If so, give the user the choice of aborting the process or the current +command." + (let ((process (TeX-process name))) + (cond ((null process)) + ((not (eq (process-status process) 'run))) + ((yes-or-no-p (concat "Process `" + (process-name process) + "' for document `" + name + "' running, kill it? ")) + (delete-process process)) + (t + (error "Cannot have two processes for the same document"))))) + +(defun TeX-process-buffer-name (name) + "Return name of AUC TeX buffer associated with the document NAME." + (concat "*" (abbreviate-file-name (expand-file-name name)) " output*")) + +(defun TeX-process-buffer (name) + "Return the AUC TeX buffer associated with the document NAME." + (get-buffer (TeX-process-buffer-name name))) + +(defun TeX-process (name) + "Return AUC TeX process associated with the document NAME." + (and TeX-process-asynchronous + (get-buffer-process (TeX-process-buffer name)))) + +;;; Process Filters + +(defun TeX-command-mode-line (process) + "Format the mode line for a buffer containing output from PROCESS." + (setq mode-line-process (concat ": " + (symbol-name (process-status process)))) + (set-buffer-modified-p (buffer-modified-p))) + +(defun TeX-command-filter (process string) + "Filter to process normal output." + (save-excursion + (set-buffer (process-buffer process)) + (save-excursion + (goto-char (process-mark process)) + (insert-before-markers string) + (set-marker (process-mark process) (point))))) + +(defvar TeX-current-page nil + "The page number currently being formatted, enclosed in brackets.") + + (make-variable-buffer-local 'TeX-current-page) + +(defun TeX-format-mode-line (process) + "Format the mode line for a buffer containing TeX output from PROCESS." + (setq mode-line-process (concat " " TeX-current-page ": " + (symbol-name (process-status process)))) + (set-buffer-modified-p (buffer-modified-p))) + +(defun TeX-format-filter (process string) + "Filter to process TeX output." + (save-excursion + (set-buffer (process-buffer process)) + (save-excursion + (goto-char (process-mark process)) + (insert-before-markers string) + (set-marker (process-mark process) (point))) + (save-excursion + (save-match-data + (if (re-search-backward "\\[[0-9]+\\(\\.[0-9\\.]+\\)?\\]" nil t) + (setq TeX-current-page (TeX-match-buffer 0))))) + (TeX-format-mode-line process))) + +(defvar TeX-parse-function nil + "Function to call to parse content of TeX output buffer.") + (make-variable-buffer-local 'TeX-parse-function) + +(defun TeX-background-filter (process string) + "Filter to process background output." + (let ((old-window (selected-window)) + (pop-up-windows t)) + (pop-to-buffer "*TeX background*") + (goto-char (point-max)) + (insert string) + (select-window old-window))) + + +;;; Active Process + +(defvar TeX-current-process-region-p nil + "This variable is set to t iff the last TeX command is on a region.") + +(defun TeX-active-process () + "Return the active process for the current buffer." + (if TeX-current-process-region-p + (TeX-process (TeX-region-file)) + (TeX-process (TeX-master-file)))) + +(defun TeX-active-buffer () + "Return the buffer of the active process for this buffer." + (if TeX-current-process-region-p + (TeX-process-buffer (TeX-region-file)) + (TeX-process-buffer (TeX-master-file)))) + +(defun TeX-active-master (&optional extension) + "The master file currently being compiled." + (if TeX-current-process-region-p + (TeX-region-file extension) + (TeX-master-file extension))) + +(defvar TeX-command-buffer nil + "The buffer from where the last TeX command was issued.") + +;;; Region File + +(defun TeX-region-create (file region original offset) + "Create a new file named FILE with the string REGION +The region is taken from ORIGINAL starting at line OFFSET. + +The current buffer and master file is searched, in order to ensure +that the TeX header and trailer information is also included. + +The OFFSET is used to provide the debugger with information about the +original file." + (let* (;; We shift buffer a lot, so we must keep track of the buffer + ;; local variables. + (header-end TeX-header-end) + (trailer-start TeX-trailer-start) + + ;; We seach for header and trailer in the master file. + (master-name (TeX-master-file TeX-default-extension)) + (master-buffer (find-file-noselect master-name)) + + ;; Attempt to disable font lock. + (font-lock-defaults-alist nil) + (font-lock-defaults nil) + (font-lock-maximum-size 0) + (font-lock-mode-hook nil) + (font-lock-auto-fontify nil) + (font-lock-mode-enable-list nil) + ;; And insert them into the FILE buffer. + (file-buffer (find-file-noselect file)) + ;; But remember original content. + original-content + + ;; We search for the header from the master file, if it is + ;; not present in the region. + (header (if (string-match header-end region) + "" + (save-excursion + (save-restriction + (set-buffer master-buffer) + (save-excursion + (save-restriction + (widen) + (goto-char (point-min)) + ;; NOTE: We use the local value of + ;; TeX-header-end from the master file. + (if (not (re-search-forward TeX-header-end nil t)) + "" + (re-search-forward "[\r\n]" nil t) + (buffer-substring (point-min) (point))))))))) + + ;; We search for the trailer from the master file, if it is + ;; not present in the region. + (trailer-offset 0) + (trailer (if (string-match trailer-start region) + "" + (save-excursion + (save-restriction + (set-buffer master-buffer) + (save-excursion + (save-restriction + (widen) + (goto-char (point-max)) + ;; NOTE: We use the local value of + ;; TeX-trailer-start from the master file. + (if (not (re-search-backward TeX-trailer-start nil t)) + "" + ;;(beginning-of-line 1) + (re-search-backward "[\r\n]" nil t) + (setq trailer-offset + (count-lines (point-min) (point))) + (buffer-substring (point) (point-max)))))))))) + (save-excursion + (set-buffer file-buffer) + (setq original-content (buffer-string)) + (erase-buffer) + (insert "\\message{ !name(" master-name ")}" + header + "\n\\message{ !name(" original ") !offset(") + (insert (int-to-string (- offset + (count-lines (point-min) (point)))) + ") }\n" + region + "\n\\message{ !name(" master-name ") !offset(") + (insert (int-to-string (- trailer-offset + (count-lines (point-min) (point)))) + ") }\n" + trailer) + (if (string-equal (buffer-string) original-content) + (set-buffer-modified-p nil) + (save-buffer 0))))) + +(defun TeX-region-file (&optional extension nondirectory) + "Return TeX-region file name with EXTENSION. +If optional second argument NONDIRECTORY is nil, do not include +the directory." + (concat (if nondirectory "" (TeX-master-directory)) + (cond ((eq extension t) + (concat TeX-region "." TeX-default-extension)) + (extension + (concat TeX-region "." extension)) + (t + TeX-region)))) + +(defvar TeX-region "_region_" + "*Base name for temporary file for use with TeX-region.") + +;;; Parsing + +;;; - Global Parser Variables + +(defvar TeX-error-point nil + "How far we have parsed until now.") + + (make-variable-buffer-local 'TeX-error-point) + +(defvar TeX-error-file nil + "Stack of files in which errors have occured") + + (make-variable-buffer-local 'TeX-error-file) + +(defvar TeX-error-offset nil + "Add this to any line numbers from TeX. Stack like TeX-error-file.") + + (make-variable-buffer-local 'TeX-error-offset) + +(defun TeX-parse-reset () + "Reset all variables used for parsing TeX output." + (setq TeX-error-point (point-min)) + (setq TeX-error-offset nil) + (setq TeX-error-file nil)) + +;;; - Parsers Hooks + +(defun TeX-parse-command (reparse) + "We can't parse anything but TeX." + (error "I cannot parse %s output, sorry" + (if (TeX-active-process) + (process-name (TeX-active-process)) + "this"))) + +(defun TeX-parse-TeX (reparse) + "Find the next error produced by running TeX. +Prefix by C-u to start from the beginning of the errors. + +If the file occurs in an included file, the file is loaded (if not +already in an Emacs buffer) and the cursor is placed at the error." + + (let ((old-buffer (current-buffer))) + (pop-to-buffer (TeX-active-buffer)) + (if reparse + (TeX-parse-reset)) + (goto-char TeX-error-point) + (TeX-parse-error old-buffer))) + +;;; - Parsing (La)TeX + +(defvar TeX-translate-location-hook nil + "List of functions to be called before showing an error or warning. + +You might want to examine and modify the free variables `file', +`offset', `line', `string', `error', and `context' from this hook.") + +(defun TeX-parse-error (old) + "Goto next error. Pop to OLD buffer if no more errors are found." + (while + (progn + (re-search-forward (concat "\\(" + "^! \\|" + "(\\|" + ")\\|" + "\\'\\|" + "!offset([---0-9]*)\\|" + "!name([^)]*)\\|" + "^.*erfull \\\\.*[0-9]*--[0-9]*\\|" + "^LaTeX Warning: .*[0-9]+\\.$" + "\\)")) + (let ((string (TeX-match-buffer 1))) + + (cond (;; TeX error + (string= string "! ") + (TeX-error) + nil) + + ;; LaTeX warning + ((string-match (concat "\\(" + "^.*erfull \\\\.*[0-9]*--[0-9]*\\|" + "^LaTeX Warning: .*[0-9]+\\.$" + "\\)") + + string) + (TeX-warning string)) + + ;; New file -- Push on stack + ((string= string "(") + (re-search-forward "\\([^()\n \t]*\\)") + (setq TeX-error-file + (cons (TeX-match-buffer 1) TeX-error-file)) + (setq TeX-error-offset (cons 0 TeX-error-offset)) + t) + + ;; End of file -- Pop from stack + ((string= string ")") + (setq TeX-error-file (cdr TeX-error-file)) + (setq TeX-error-offset (cdr TeX-error-offset)) + t) + + ;; Hook to change line numbers + ((string-match "!offset(\\([---0-9]*\\))" string) + (rplaca TeX-error-offset + (string-to-int (substring string + (match-beginning 1) + (match-end 1)))) + t) + + ;; Hook to change file name + ((string-match "!name(\\([^)]*\\))" string) + (rplaca TeX-error-file (substring string + (match-beginning 1) + (match-end 1))) + t) + + ;; No more errors. + (t + (message "No more errors.") + (beep) + (pop-to-buffer old) + nil)))))) + +(defun TeX-error () + "Display an error." + + (let* (;; We need the error message to show the user. + (error (progn + (re-search-forward "\\(.*\\)") + (TeX-match-buffer 1))) + + ;; And the context for the help window. + (context-start (point)) + + ;; And the line number to position the cursor. + (line (if (re-search-forward "l\\.\\([0-9]+\\)" nil t) + (string-to-int (TeX-match-buffer 1)) + 1)) + ;; And a string of the context to search for. + (string (progn + (beginning-of-line) + (re-search-forward " \\(\\([^ \t]*$\\)\\|\\($\\)\\)") + (TeX-match-buffer 1))) + + ;; And we have now found to the end of the context. + (context (buffer-substring context-start (progn + (forward-line 1) + (end-of-line) + (point)))) + ;; We may use these in another buffer. + (offset (car TeX-error-offset) ) + (file (car TeX-error-file))) + + ;; Remember where we was. + (setq TeX-error-point (point)) + + ;; Find the error. + (if (null file) + (error "Error occured after last TeX file closed")) + (run-hooks 'TeX-translate-location-hook) + (find-file-other-window file) + (goto-line (+ offset line)) + (if (not (string= string " ")) + (search-forward string nil t)) + + ;; Explain the error. + (if TeX-display-help + (TeX-help-error error context) + (message (concat "! " error))))) + +(defun TeX-warning (string) + "Display a warning for STRING. +Return nil if we gave a report." + + (let* ((error (concat "** " string)) + + ;; bad-box is nil if this is a "LaTeX Warning" + (bad-box (string-match "^.*erfull \\\\.*[0-9]*--[0-9]*" string)) + ;; line-string: match 1 is beginning line, match 2 is end line + (line-string (if bad-box " \\([0-9]*\\)--\\([0-9]*\\)" + "on input line \\([0-9]*\\)\\.")) + ;; word-string: match 1 is the word + (word-string (if bad-box "[][\\W() ---]\\(\\w+\\)[][\\W() ---]*$" + "`\\(\\w+\\)'")) + + ;; Get error-line (warning) + (line (progn + (re-search-backward line-string) + (string-to-int (TeX-match-buffer 1)))) + (line-end (if bad-box (string-to-int (TeX-match-buffer 2)) + line)) + + ;; Find the context + (context-start (progn (if bad-box (end-of-line) + (beginning-of-line)) + (point))) + + (context (progn + (forward-line 1) + (end-of-line) + (while (equal (current-column) 79) + (forward-line 1) + (end-of-line)) + (buffer-substring context-start (point)))) + + ;; This is where we want to be. + (error-point (point)) + + ;; Now find the error word. + (string (progn + (re-search-backward word-string + context-start t) + (TeX-match-buffer 1))) + + ;; We might use these in another file. + (offset (car TeX-error-offset)) + (file (car TeX-error-file))) + + ;; This is where we start next time. + (goto-char error-point) + (setq TeX-error-point (point)) + + ;; Go back to TeX-buffer + (if TeX-debug-bad-boxes + (progn + (run-hooks 'TeX-translate-location-hook) + (find-file-other-window file) + ;; Find line and string + (goto-line (+ offset line)) + (beginning-of-line 0) + (let ((start (point))) + (goto-line (+ offset line-end)) + (end-of-line) + (search-backward string start t) + (search-forward string nil t)) + ;; Display help + (if TeX-display-help + (TeX-help-error error (if bad-box context (concat "\n" context))) + (message (concat "! " error))) + nil) + t))) + +;;; - Help + +(defun TeX-help-error (error output) + "Print ERROR in context OUTPUT in another window." + + (let ((old-buffer (current-buffer)) + (log-file (TeX-active-master "log")) + (TeX-error-pointer 1)) + + ;; Find help text entry. + (while (not (string-match (car (nth TeX-error-pointer + TeX-error-description-list)) + error)) + (setq TeX-error-pointer (+ TeX-error-pointer 1))) + + (pop-to-buffer (get-buffer-create "*TeX Help*")) + (erase-buffer) + (insert "ERROR: " error + "\n\n--- TeX said ---" + output + "\n--- HELP ---\n" + (save-excursion + (if (and (string= (cdr (nth TeX-error-pointer + TeX-error-description-list)) + "No help available") + (let* ((log-buffer (find-file-noselect log-file))) + (set-buffer log-buffer) + (auto-save-mode nil) + (setq buffer-read-only t) + (goto-line (point-min)) + (search-forward error nil t 1))) + (progn + (re-search-forward "^l.") + (re-search-forward "^ [^\n]+$") + (forward-char 1) + (let ((start (point))) + (re-search-forward "^$") + (concat "From the .log file...\n\n" + (buffer-substring start (point))))) + (cdr (nth TeX-error-pointer + TeX-error-description-list))))) + (goto-char (point-min)) + (pop-to-buffer old-buffer))) + +;;; Error Messages + +(defvar TeX-error-description-list + '(("Bad \\\\line or \\\\vector argument.*" . +"The first argument of a \\line or \\vector command, which specifies the +slope, is illegal\.") + + ("Bad math environment delimiter.*" . +"TeX has found either a math-mode-starting command such as \\[ or \\( +when it is already in math mode, or else a math-mode-ending command +such as \\) or \\] while in LR or paragraph mode. The problem is caused +by either unmatched math mode delimiters or unbalanced braces\.") + + ("Bad use of \\\\\\\\.*" . +"A \\\\ command appears between paragraphs, where it makes no sense. This +error message occurs when the \\\\ is used in a centering or flushing +environment or else in the scope of a centering or flushing +declaration.") + + ("\\\\begin{[^ ]*} ended by \\\\end{[^ ]*}." . +"LaTeX has found an \\end command that doesn't match the corresponding +\\begin command. You probably misspelled the environment name in the +\\end command, have an extra \\begin, or else forgot an \\end.") + + ("Can be used only in preamble." . +"LaTeX has encountered, after the \\begin{document}, one of the +following commands that should appear only in the preamble: +\\documentstyle, \\nofiles, \\includeonly, \\makeindex, or +\\makeglossary. The error is also caused by an extra \\begin{document} +command.") + + ("Command name [^ ]* already used.*" . +"You are using \\newcommand, \\newenvironment, \\newlength, \\newsavebox, +or \\newtheorem to define a command or environment name that is +already defined, or \\newcounter to define a counter that already +exists. (Defining an environment named gnu automatically defines the +command \\gnu.) You'll have to choose a new name or, in the case of +\\newcommand or \\newenvironment, switch to the \\renew ... command.") + + ("Counter too large." . +"Some object that is numbered with letters, probably an item in a +enumerated list, has received a number greater than 26. Either you're +making a very long list or you've been resetting counter values.") + + ("Environment [^ ]* undefined." . +"LaTeX has encountered a \\begin command for a nonexistent environment. +You probably misspelled the environment name. ") + + ("Float(s) lost." . +"You put a figure or table environment or a \\marginpar command inside a +parbox---either one made with a minipage environment or \\parbox +command, or one constructed by LaTeX in making a footnote, figure, +etc. This is an outputting error, and the offending environment or +command may be quite a way back from the point where LaTeX discovered +the problem. One or more figures, tables, and/or marginal notes have +been lost, but not necessarily the one that caused the error.") + + ("Illegal character in array arg." . +"There is an illegal character in the argument of an array or tabular +environment, or in the second argument of a \\multicolumn command.") + + ("Missing \\\\begin{document}." . +"LaTeX produced printed output before encountering a \\begin{document} +command. Either you forgot the \\begin{document} command or there is +something wrong in the preamble. The problem may be a stray character +or an error in a declaration---for example, omitting the braces around +an argument or forgetting the \\ in a command name.") + + ("Missing p-arg in array arg.*" . +"There is a p that is not followed by an expression in braces in the +argument of an array or tabular environment, or in the second argument +of a \\multicolumn command.") + + ("Missing @-exp in array arg." . +"There is an @ character not followed by an @-expression in the +argument of an array or tabular environment, or in the second argument +of a \\multicolumn command.") + + ("No such counter." . +"You have specified a nonexistent counter in a \\setcounter or +\\addtocounter command. This is probably caused by a simple typing +error. However, if the error occurred while a file with the extension +aux is being read, then you probably used a \\newcounter command +outside the preamble.") + + ("Not in outer par mode." . +"You had a figure or table environment or a \\marginpar command in math +mode or inside a parbox.") + + ("\\\\pushtabs and \\\\poptabs don't match." . +"LaTeX found a \\poptabs with no matching \\pushtabs, or has come to the +\\end{tabbing} command with one or more unmatched \\pushtabs commands.") + + ("Something's wrong--perhaps a missing \\\\item." . +"The most probable cause is an omitted \\item command in a list-making +environment. It is also caused by forgetting the argument of a +thebibliography environment.") + + ("Tab overflow." . +"A \\= command has exceeded the maximum number of tab stops that LaTeX +permits.") + + ("There's no line here to end." . +"A \\newline or \\\\ command appears between paragraphs, where it makes no +sense. If you're trying to ``leave a blank line'', use a \\vspace +command.") + + ("This may be a LaTeX bug." . +"LaTeX has become thoroughly confused. This is probably due to a +previously detected error, but it is possible that you have found an +error in LaTeX itself. If this is the first error message produced by +the input file and you can't find anything wrong, save the file and +contact the person listed in your Local Guide.") + + ("Too deeply nested." . +"There are too many list-making environments nested within one another. +How many levels of nesting are permitted may depend upon what computer +you are using, but at least four levels are provided, which should be +enough.") + + ("Too many unprocessed floats." . +"While this error can result from having too many \\marginpar commands +on a page, a more likely cause is forcing LaTeX to save more figures +and tables than it has room for. When typesetting its continuous +scroll, LaTeX saves figures and tables separately and inserts them as +it cuts off pages. This error occurs when LaTeX finds too many figure +and/or table environments before it is time to cut off a page, a +problem that is solved by moving some of the environments farther +towards the end of the input file. The error can also be caused by a +``logjam''---a figure or table that cannot be printed causing others +to pile up behind it, since LaTeX will not print figures or tables out +of order. The jam can be started by a figure or table that either is +too large to fit on a page or won't fit where its optional placement +argument says it must go. This is likely to happen if the argument +does not contain a p option.") + + ("Undefined tab position." . +"A \\>, \\+, \\-, or \\< command is trying to go to a nonexistent tab +position---one not defined by a \\= command.") + + ("\\\\< in mid line." . +"A \\< command appears in the middle of a line in a tabbing environment. +This command should come only at the beginning of a line.") + + ("Counter too large." . +"Footnotes are being ``numbered'' with letters or footnote symbols and +LaTeX has run out of letters or symbols. This is probably caused by +too many \\thanks commands.") + + ("Double subscript." . +"There are two subscripts in a row in a mathematical +formula---something like x_{2}_{3}, which makes no sense.") + + ("Double superscript." . +"There are two superscripts in a row in a mathematical +formula---something like x^{2}^{3}, which makes no sense.") + + ("Extra alignment tab has been changed to \\\\cr." . +"There are too many separate items (column entries) in a single row of +an array or tabular environment. In other words, there were too many & +'s before the end of the row. You probably forgot the \\\\ at the end of +the preceding row.") + + ("Extra \\}, or forgotten \\$." . +"The braces or math mode delimiters don't match properly. You probably +forgot a {, \\[, \\(, or $.") + + ("Font [^ ]* not loaded: Not enough room left." . +"The document uses more fonts than TeX has room for. If different parts +of the document use different fonts, then you can get around the +problem by processing it in parts.") + + ("I can't find file `.*'." . +"TeX can't find a file that it needs. If the name of the missing file +has the extension tex, then it is looking for an input file that you +specified---either your main file or another file inserted with an +\\input or \\include command. If the missing file has the extension sty +, then you have specified a nonexistent document style or style +option.") + + ("Illegal parameter number in definition of .*" . +"This is probably caused by a \\newcommand, \\renewcommand, +\\newenvironment, or \\renewenvironment command in which a # is used +incorrectly. A # character, except as part of the command name \\#, +can be used only to indicate an argument parameter, as in #2, which +denotes the second argument. This error is also caused by nesting one +of the above four commands inside another, or by putting a parameter +like #2 in the last argument of a \\newenvironment or \\renewenvironment +command.") + + ("Illegal unit of measure ([^ ]* inserted)." . +"If you just got a + + ! Missing number, treated as zero. + +error, then this is part of the same problem. If not, it means that +LaTeX was expecting a length as an argument and found a number +instead. The most common cause of this error is writing 0 instead of +something like 0in for a length of zero, in which case typing return +should result in correct output. However, the error can also be caused +by omitting a command argument.") + + ("Misplaced alignment tab character \\&." . +"The special character &, which should be used only to separate items +in an array or tabular environment, appeared in ordinary text. You +probably meant to type \\&.") + + ("Missing control sequence inserted." . +"This is probably caused by a \\newcommand, \\renewcommand, \\newlength, +or \\newsavebox command whose first argument is not a command name.") + + ("Missing number, treated as zero." . +"This is usually caused by a LaTeX command expecting but not finding +either a number or a length as an argument. You may have omitted an +argument, or a square bracket in the text may have been mistaken for +the beginning of an optional argument. This error is also caused by +putting \\protect in front of either a length command or a command such +as \\value that produces a number.") + + ("Missing [{}] inserted." . +"TeX has become confused. The position indicated by the error locator +is probably beyond the point where the incorrect input is.") + + ("Missing \\$ inserted." . +"TeX probably found a command that can be used only in math mode when +it wasn't in math mode. Remember that unless stated otherwise, all +the commands of Section can be used only in math mode. TeX is not in +math mode when it begins processing the argument of a box-making +command, even if that command is inside a math environment. This error +also occurs if TeX encounters a blank line when it is in math mode.") + + ("Not a letter." . +"Something appears in the argument of a \\hyphenation command that +doesn't belong there.") + + ("Paragraph ended before [^ ]* was complete." . +"A blank line occurred in a command argument that shouldn't contain +one. You probably forgot the right brace at the end of an argument.") + + ("\\\\[^ ]*font [^ ]* is undefined .*" . +"These errors occur when an uncommon font is used in math mode---for +example, if you use a \\sc command in a formula inside a footnote, +calling for a footnote-sized small caps font. This problem is solved +by using a \\load command.") + + ("Font .* not found." . +"You requested a family/series/shape/size combination that is totally +unknown. There are two cases in which this error can occur: + 1) You used the \\size macro to select a size that is not available. + 2) If you did not do that, go to your local `wizard' and + complain fiercely that the font selection tables are corrupted!") + + ("TeX capacity exceeded, sorry .*" . +"TeX has just run out of space and aborted its execution. Before you +panic, remember that the least likely cause of this error is TeX not +having the capacity to process your document. It was probably an +error in your input file that caused TeX to run out of room. The +following discussion explains how to decide whether you've really +exceeded TeX's capacity and, if so, what to do. If the problem is an +error in the input, you may have to use the divide and conquer method +described previously to locate it. LaTeX seldom runs out of space on a +short input file, so if running it on the last few pages before the +error indicator's position still produces the error, then there's +almost certainly something wrong in the input file. + +The end of the error indicator tells what kind of space TeX ran out +of. The more common ones are listed below, with an explanation of +their probable causes. + +buffer size +=========== +Can be caused by too long a piece of text as the argument +of a sectioning, \\caption, \\addcontentsline, or \\addtocontents +command. This error will probably occur when the \\end{document} is +being processed, but it could happen when a \\tableofcontents, +\\listoffigures, or \\listoftables command is executed. To solve this +problem, use a shorter optional argument. Even if you're producing a +table of contents or a list of figures or tables, such a long entry +won't help the reader. + +exception dictionary +==================== +You have used \\hyphenation commands to give TeX +more hyphenation information than it has room for. Remove some of the +less frequently used words from the \\hyphenation commands and insert +\\- commands instead. + +hash size +========= +Your input file defines too many command names and/or uses +too many cross-ref- erencing labels. + +input stack size +================ +This is probably caused by an error in a command +definition. For example, the following command makes a circular +definition, defining \\gnu in terms of itself: + + \\newcommand{\\gnu}{a \\gnu} % This is wrong! + +When TeX encounters this \\gnu command, it will keep chasing its tail +trying to figure out what \\gnu should produce, and eventually run out +of ``input stack''. + +main memory size +================ +This is one kind of space that TeX can run out of when processing a +short file. There are three ways you can run TeX out of main memory +space: (1) defining a lot of very long, complicated commands, (2) +making an index or glossary and having too many \\index or \\glossary +commands on a single page, and (3) creating so complicated a page of +output that TeX can't hold all the information needed to generate it. +The solution to the first two problems is obvious: define fewer +commands or use fewer \\index and \\glossary commands. The third problem +is nastier. It can be caused by large tabbing, tabular, array, and +picture environments. TeX's space may also be filled up with figures +and tables waiting for a place to go. To find out if you've really +exceeded TeX's capacity in this way, put a \\clearpage command in your +input file right before the place where TeX ran out of room and try +running it again. If it doesn't run out of room with the \\clearpage +command there, then you did exceed TeX's capacity. If it still runs +out of room, then there's probably an error in your file. If TeX is +really out of room, you must give it some help. Remember that TeX +processes a complete paragraph before deciding whether to cut the +page. Inserting a \\newpage command in the middle of the paragraph, +where TeX should break the page, may save the day by letting TeX write +the current page before processing the rest of the paragraph. (A +\\pagebreak command won't help.) If the problem is caused by +accumulated figures and tables, you can try to prevent them from +accumulating---either by moving them further towards the end of the +document or by trying to get them to come out sooner. If you are +still writing the document, simply add a \\clearpage command and forget +about the problem until you're ready to produce the final version. +Changes to the input file are likely to make the problem go away. + +pool size +========= +You probably used too many cross-ref-erencing \\labels and/or defined +too many new command names. More precisely, the labels and command +names that you define have too many characters, so this problem can be +solved by using shorter names. However, the error can also be caused +by omitting the right brace that ends the argument of either a counter +command such as \\setcounter, or a \\newenvironment or \\newtheorem +command. + +save size +========= +This occurs when commands, environments, and the scopes of +declarations are nested too deeply---for example, by having the +argument of a \\multiput command contain a picture environment that in +turn has a \\footnotesize declaration whose scope contains a \\multiput +command containing a ....") + + ("Text line contains an invalid character." . +"The input contains some strange character that it shouldn't. A mistake +when creating the file probably caused your text editor to insert this +character. Exactly what could have happened depends upon what text +editor you used. If examining the input file doesn't reveal the +offending character, consult the Local Guide for suggestions.") + + ("Undefined control sequence." . +"TeX encountered an unknown command name. You probably misspelled the +name. If this message occurs when a LaTeX command is being processed, +the command is probably in the wrong place---for example, the error +can be produced by an \\item command that's not inside a list-making +environment. The error can also be caused by a missing \\documentstyle +command.") + + ("Use of [^ ]* doesn't match its definition." . +"It's probably one of the picture-drawing commands, and you have used +the wrong syntax for specifying an argument. If it's \\@array that +doesn't match its definition, then there is something wrong in an +@-expression in the argument of an array or tabular +environment---perhaps a fragile command that is not \\protect'ed.") + + ("You can't use `macro parameter character \\#' in [^ ]* mode." . +"The special character # has appeared in ordinary text. You probably +meant to type \\#.") + + ("Overfull \\\\hbox .*" . +"Because it couldn't find a good place for a line break, TeX put more +on this line than it should.") + + ("Overfull \\\\vbox .*" . +"Because it couldn't find a good place for a page break, TeX put more +on the page than it should. ") + + ("Underfull \\\\hbox .*" . +"Check your output for extra vertical space. If you find some, it was +probably caused by a problem with a \\\\ or \\newline command---for +example, two \\\\ commands in succession. This warning can also be +caused by using the sloppypar environment or \\sloppy declaration, or +by inserting a \\linebreak command.") + + ("Underfull \\\\vbox .*" . +"TeX could not find a good place to break the page, so it produced a +page without enough text on it. ") + +;; New list items should be placed here +;; +;; ("err-regexp" . "context") +;; +;; the err-regexp item should match anything + + (".*" . "No help available")) ; end definition +"A list of the form (\"err-regexp\" . \"context\") used by function +\\{TeX-help-error} to display help-text on an error message or warning. +err-regexp should be a regular expression matching the error message +given from TeX/LaTeX, and context should be some lines describing that +error") + +(provide 'tex-buf) + +;;; tex-buf.el ends here