Add some keybindings.
[bpt/emacs.git] / lisp / textmodes / tex-mode.el
CommitLineData
d501f516
ER
1;;; tex-mode.el --- TeX, LaTeX, and SliTeX mode commands.
2
f8c25f1b 3;; Copyright (C) 1985, 86, 89, 92, 94, 95 Free Software Foundation, Inc.
eea8d4ef 4
70f20973 5;; Maintainer: FSF
d7b4d18f 6;; Keywords: tex
e5167999 7
528415e7 8;; Contributions over the years by William F. Schelter, Dick King,
70f20973 9;; Stephen Gildea, Michael Prange, Jacob Gore, and Edward M. Reingold.
528415e7 10
869bff31 11;; This file is part of GNU Emacs.
12
13;; GNU Emacs is free software; you can redistribute it and/or modify
14;; it under the terms of the GNU General Public License as published by
e5167999 15;; the Free Software Foundation; either version 2, or (at your option)
869bff31 16;; any later version.
17
18;; GNU Emacs is distributed in the hope that it will be useful,
19;; but WITHOUT ANY WARRANTY; without even the implied warranty of
20;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21;; GNU General Public License for more details.
22
23;; You should have received a copy of the GNU General Public License
24;; along with GNU Emacs; see the file COPYING. If not, write to
25;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
26
e5167999
ER
27;;; Code:
28
a0e9c22a 29(require 'shell)
2f3067de 30(require 'compile)
528415e7 31
7e1dae73 32;;;###autoload
528415e7 33(defvar tex-shell-file-name nil
81c735c0 34 "*If non-nil, the shell file name to run in the subshell used to run TeX.")
528415e7 35
7e1dae73 36;;;###autoload
528415e7
RS
37(defvar tex-directory "."
38 "*Directory in which temporary files are left.
81c735c0 39You can make this `/tmp' if your TEXINPUTS has no relative directories in it
528415e7 40and you don't try to apply \\[tex-region] or \\[tex-buffer] when there are
81c735c0 41`\\input' commands with relative directories.")
869bff31 42
7e1dae73 43;;;###autoload
528415e7
RS
44(defvar tex-offer-save t
45 "*If non-nil, ask about saving modified buffers before \\[tex-file] is run.")
869bff31 46
7e1dae73 47;;;###autoload
869bff31 48(defvar tex-run-command "tex"
49 "*Command used to run TeX subjob.
81c735c0
RS
50If this string contains an asterisk (`*'), that is replaced by the file name;
51otherwise, the file name, preceded by blank, is added at the end.")
869bff31 52
7e1dae73 53;;;###autoload
869bff31 54(defvar latex-run-command "latex"
55 "*Command used to run LaTeX subjob.
81c735c0
RS
56If this string contains an asterisk (`*'), that is replaced by the file name;
57otherwise, the file name, preceded by blank, is added at the end.")
528415e7
RS
58
59(defvar standard-latex-block-names
60 '("abstract" "array" "center" "description"
61 "displaymath" "document" "enumerate" "eqnarray"
62 "eqnarray*" "equation" "figure" "figure*"
63 "flushleft" "flushright" "itemize" "letter"
64 "list" "minipage" "picture" "quotation"
65 "quote" "slide" "sloppypar" "tabbing"
66 "table" "table*" "tabular" "tabular*"
67 "thebibliography" "theindex*" "titlepage" "trivlist"
68 "verbatim" "verbatim*" "verse")
69 "Standard LaTeX block names.")
70
7e1dae73 71;;;###autoload
528415e7
RS
72(defvar latex-block-names nil
73 "*User defined LaTeX block names.
74Combined with `standard-latex-block-names' for minibuffer completion.")
869bff31 75
7e1dae73 76;;;###autoload
869bff31 77(defvar slitex-run-command "slitex"
78 "*Command used to run SliTeX subjob.
81c735c0
RS
79If this string contains an asterisk (`*'), that is replaced by the file name;
80otherwise, the file name, preceded by blank, is added at the end.")
869bff31 81
7e1dae73 82;;;###autoload
869bff31 83(defvar tex-bibtex-command "bibtex"
528415e7 84 "*Command used by `tex-bibtex-file' to gather bibliographic data.
81c735c0
RS
85If this string contains an asterisk (`*'), that is replaced by the file name;
86otherwise, the file name, preceded by blank, is added at the end.")
869bff31 87
7e1dae73 88;;;###autoload
869bff31 89(defvar tex-dvi-print-command "lpr -d"
528415e7 90 "*Command used by \\[tex-print] to print a .dvi file.
81c735c0
RS
91If this string contains an asterisk (`*'), that is replaced by the file name;
92otherwise, the file name, preceded by blank, is added at the end.")
528415e7 93
7e1dae73 94;;;###autoload
528415e7
RS
95(defvar tex-alt-dvi-print-command "lpr -d"
96 "*Command used by \\[tex-print] with a prefix arg to print a .dvi file.
81c735c0
RS
97If this string contains an asterisk (`*'), that is replaced by the file name;
98otherwise, the file name, preceded by blank, is added at the end.
528415e7 99
81c735c0
RS
100If two printers are not enough of a choice, you can set the variable
101`tex-alt-dvi-print-command' to an expression that asks what you want;
528415e7
RS
102for example,
103
104 (setq tex-alt-dvi-print-command
105 '(format \"lpr -P%s\" (read-string \"Use printer: \")))
106
107would tell \\[tex-print] with a prefix argument to ask you which printer to
108use.")
869bff31 109
7e1dae73 110;;;###autoload
869bff31 111(defvar tex-dvi-view-command nil
81c735c0
RS
112 "*Command used by \\[tex-view] to display a `.dvi' file.
113If this string contains an asterisk (`*'), that is replaced by the file name;
114otherwise, the file name, preceded by blank, is added at the end.
528415e7
RS
115
116This can be set conditionally so that the previewer used is suitable for the
117window system being used. For example,
118
119 (setq tex-dvi-view-command
120 (if (eq window-system 'x) \"xdvi\" \"dvi2tty * | cat -s\"))
121
81c735c0 122would tell \\[tex-view] to use xdvi under X windows and to use dvi2tty
528415e7 123otherwise.")
869bff31 124
7e1dae73 125;;;###autoload
869bff31 126(defvar tex-show-queue-command "lpq"
528415e7
RS
127 "*Command used by \\[tex-show-print-queue] to show the print queue.
128Should show the queue(s) that \\[tex-print] puts jobs on.")
869bff31 129
7e1dae73 130;;;###autoload
869bff31 131(defvar tex-default-mode 'plain-tex-mode
132 "*Mode to enter for a new file that might be either TeX or LaTeX.
133This variable is used when it can't be determined whether the file
134is plain TeX or LaTeX or what because the file contains no commands.
81c735c0 135Normally set to either `plain-tex-mode' or `latex-mode'.")
869bff31 136
7e1dae73 137;;;###autoload
869bff31 138(defvar tex-open-quote "``"
139 "*String inserted by typing \\[tex-insert-quote] to open a quotation.")
140
7e1dae73 141;;;###autoload
869bff31 142(defvar tex-close-quote "''"
143 "*String inserted by typing \\[tex-insert-quote] to close a quotation.")
144
528415e7
RS
145(defvar tex-last-temp-file nil
146 "Latest temporary file generated by \\[tex-region] and \\[tex-buffer].
147Deleted when the \\[tex-region] or \\[tex-buffer] is next run, or when the
81c735c0 148tex shell terminates.")
528415e7 149
869bff31 150(defvar tex-command nil
151 "Command to run TeX.
528415e7 152The name of the file, preceded by a blank, will be added to this string.")
869bff31 153
154(defvar tex-trailer nil
155 "String appended after the end of a region sent to TeX by \\[tex-region].")
156
157(defvar tex-start-of-header nil
898b9ac1 158 "Regular expression used by \\[tex-region] to find start of file's header.")
869bff31 159
160(defvar tex-end-of-header nil
898b9ac1 161 "Regular expression used by \\[tex-region] to find end of file's header.")
869bff31 162
163(defvar tex-shell-cd-command "cd"
164 "Command to give to shell running TeX to change directory.
81c735c0 165The value of `tex-directory' is appended to this, separated by a space.")
869bff31 166
167(defvar tex-zap-file nil
168 "Temporary file name used for text being sent as input to TeX.
169Should be a simple file name with no extension or directory specification.")
170
171(defvar tex-last-buffer-texed nil
172 "Buffer which was last TeXed.")
173
174(defvar tex-print-file nil
175 "File name that \\[tex-print] prints.
176Set by \\[tex-region], \\[tex-buffer], and \\[tex-file].")
177
178(defvar tex-mode-syntax-table nil
179 "Syntax table used while in TeX mode.")
180
0fb4f245
KH
181;; Written by Wolfgang Bangerth <zcg51122@rpool1.rus.uni-stuttgart.de>
182(defvar latex-imenu-generic-expression
183 '(
184 ("Part" "\\\\part{\\([^}]*\\)}" 1)
185 ("Chapter" "\\\\chapter{\\([^}]*\\)}" 1)
186 ("Section" "\\\\[a-zA-Z]*section{\\([^}]*\\)}" 1)
187 ;; i put numbers like 3.15 before my
188 ;; \begin{equation}'s which tell me
189 ;; the number the equation will get when
190 ;; being printed.
191 ("Equations" "%[ \t]*\\([0-9]+\\.[0-9]+\\)[,;]?[ \t]?" 1))
192
193 "Imenu generic expression for LaTex mode. See `imenu-generic-expression'.")
194
869bff31 195(defun tex-define-common-keys (keymap)
81c735c0 196 "Define the keys that we want defined both in TeX mode and in the TeX shell."
869bff31 197 (define-key keymap "\C-c\C-k" 'tex-kill-job)
198 (define-key keymap "\C-c\C-l" 'tex-recenter-output-buffer)
199 (define-key keymap "\C-c\C-q" 'tex-show-print-queue)
200 (define-key keymap "\C-c\C-p" 'tex-print)
201 (define-key keymap "\C-c\C-v" 'tex-view)
62a24cb5
RS
202
203 (define-key keymap [menu-bar tex] (cons "TeX" (make-sparse-keymap "TeX")))
204
205 (define-key keymap [menu-bar tex tex-kill-job] '("Tex Kill" . tex-kill-job))
cf6d6e8a
RS
206 (define-key keymap [menu-bar tex tex-recenter-output-buffer]
207 '("Tex Recenter" . tex-recenter-output-buffer))
62a24cb5
RS
208 (define-key keymap [menu-bar tex tex-show-print-queue]
209 '("Show Print Queue" . tex-show-print-queue))
cf6d6e8a
RS
210 (define-key keymap [menu-bar tex tex-alt-print]
211 '("Tex Print (alt printer)" . tex-alt-print))
62a24cb5 212 (define-key keymap [menu-bar tex tex-print] '("Tex Print" . tex-print))
cf6d6e8a 213 (define-key keymap [menu-bar tex tex-view] '("Tex View" . tex-view))
869bff31 214 )
215
216(defvar tex-mode-map nil "Keymap for TeX mode.")
217
218(if tex-mode-map
219 nil
220 (setq tex-mode-map (make-sparse-keymap))
221 (tex-define-common-keys tex-mode-map)
222 (define-key tex-mode-map "\"" 'tex-insert-quote)
223 (define-key tex-mode-map "\n" 'tex-terminate-paragraph)
224 (define-key tex-mode-map "\C-c}" 'up-list)
225 (define-key tex-mode-map "\C-c{" 'tex-insert-braces)
226 (define-key tex-mode-map "\C-c\C-r" 'tex-region)
227 (define-key tex-mode-map "\C-c\C-b" 'tex-buffer)
228 (define-key tex-mode-map "\C-c\C-f" 'tex-file)
229 (define-key tex-mode-map "\C-c\C-i" 'tex-bibtex-file)
230 (define-key tex-mode-map "\C-c\C-o" 'tex-latex-block)
cf6d6e8a 231 (define-key tex-mode-map "\C-c\C-e" 'tex-close-latex-block)
6a900cf1 232 (define-key tex-mode-map "\C-c\C-u" 'tex-goto-last-unclosed-latex-block)
002b0d00
RS
233 (define-key tex-mode-map [menu-bar tex tex-bibtex-file]
234 '("BibTeX File" . tex-bibtex-file))
cf6d6e8a
RS
235 (define-key tex-mode-map [menu-bar tex tex-validate-region]
236 '("Validate Region" . tex-validate-region))
237 (define-key tex-mode-map [menu-bar tex validate-tex-buffer]
238 '("Validate Buffer" . validate-tex-buffer))
239 (define-key tex-mode-map [menu-bar tex tex-region]
002b0d00 240 '("TeX Region" . tex-region))
cf6d6e8a 241 (define-key tex-mode-map [menu-bar tex tex-buffer]
002b0d00
RS
242 '("TeX Buffer" . tex-buffer))
243 (define-key tex-mode-map [menu-bar tex tex-file] '("TeX File" . tex-file)))
cf6d6e8a
RS
244
245(put 'tex-region 'menu-enable 'mark-active)
246(put 'tex-validate-region 'menu-enable 'mark-active)
247(put 'tex-print 'menu-enable '(stringp tex-print-file))
248(put 'tex-alt-print 'menu-enable '(stringp tex-print-file))
249(put 'tex-view 'menu-enable '(stringp tex-print-file))
250(put 'tex-recenter-output-buffer 'menu-enable '(get-buffer "*tex-shell*"))
251(put 'tex-kill-job 'menu-enable '(tex-shell-running))
252
869bff31 253
254(defvar tex-shell-map nil
81c735c0 255 "Keymap for the TeX shell.
dca5ea48 256Inherits `shell-mode-map' with a few additions.")
869bff31 257
0d548e5d 258(defvar compare-windows-whitespace) ; Pacify the byte-compiler
8241d7b9 259
869bff31 260;;; This would be a lot simpler if we just used a regexp search,
261;;; but then it would be too slow.
7229064d 262;;;###autoload
869bff31 263(defun tex-mode ()
264 "Major mode for editing files of input for TeX, LaTeX, or SliTeX.
265Tries to determine (by looking at the beginning of the file) whether
81c735c0
RS
266this file is for plain TeX, LaTeX, or SliTeX and calls `plain-tex-mode',
267`latex-mode', or `slitex-mode', respectively. If it cannot be determined,
268such as if there are no commands in the file, the value of `tex-default-mode'
269says which mode to use."
869bff31 270 (interactive)
271 (let (mode slash comment)
272 (save-excursion
273 (goto-char (point-min))
274 (while (and (setq slash (search-forward "\\" nil t))
275 (setq comment (let ((search-end (point)))
276 (save-excursion
277 (beginning-of-line)
278 (search-forward "%" search-end t))))))
279 (if (and slash (not comment))
c0bcb239 280 (setq mode (if (looking-at "documentstyle\\|documentclass\\|begin\\b\\|NeedsTeXFormat{LaTeX")
0edb9815
RS
281 (if (looking-at
282 "document\\(style\\|class\\)\\(\\[.*\\]\\)?{slides}")
869bff31 283 'slitex-mode
284 'latex-mode)
285 'plain-tex-mode))))
286 (if mode (funcall mode)
287 (funcall tex-default-mode))))
e4c8c838 288
6503cec3 289;;;###autoload
31e1d920 290(defalias 'TeX-mode 'tex-mode)
6503cec3 291;;;###autoload
31e1d920 292(defalias 'LaTeX-mode 'latex-mode)
869bff31 293
7229064d 294;;;###autoload
869bff31 295(defun plain-tex-mode ()
296 "Major mode for editing files of input for plain TeX.
297Makes $ and } display the characters they match.
298Makes \" insert `` when it seems to be the beginning of a quotation,
299and '' when it appears to be the end; it inserts \" only after a \\.
300
301Use \\[tex-region] to run TeX on the current region, plus a \"header\"
302copied from the top of the file (containing macro definitions, etc.),
303running TeX under a special subshell. \\[tex-buffer] does the whole buffer.
304\\[tex-file] saves the buffer and then processes the file.
305\\[tex-print] prints the .dvi file made by any of these.
306\\[tex-view] previews the .dvi file made by any of these.
307\\[tex-bibtex-file] runs bibtex on the file of the current buffer.
308
309Use \\[validate-tex-buffer] to check buffer for paragraphs containing
310mismatched $'s or braces.
311
312Special commands:
313\\{tex-mode-map}
314
315Mode variables:
316tex-run-command
317 Command string used by \\[tex-region] or \\[tex-buffer].
318tex-directory
319 Directory in which to create temporary files for TeX jobs
320 run by \\[tex-region] or \\[tex-buffer].
321tex-dvi-print-command
322 Command string used by \\[tex-print] to print a .dvi file.
528415e7
RS
323tex-alt-dvi-print-command
324 Alternative command string used by \\[tex-print] (when given a prefix
325 argument) to print a .dvi file.
869bff31 326tex-dvi-view-command
327 Command string used by \\[tex-view] to preview a .dvi file.
328tex-show-queue-command
329 Command string used by \\[tex-show-print-queue] to show the print
330 queue that \\[tex-print] put your job on.
331
81c735c0
RS
332Entering Plain-tex mode runs the hook `text-mode-hook', then the hook
333`tex-mode-hook', and finally the hook `plain-tex-mode-hook'. When the
334special subshell is initiated, the hook `tex-shell-hook' is run."
8241d7b9 335
869bff31 336 (interactive)
337 (tex-common-initialization)
338 (setq mode-name "TeX")
339 (setq major-mode 'plain-tex-mode)
340 (setq tex-command tex-run-command)
898b9ac1
RS
341 (setq tex-start-of-header "%\\*\\*start of header")
342 (setq tex-end-of-header "%\\*\\*end of header")
869bff31 343 (setq tex-trailer "\\bye\n")
344 (run-hooks 'text-mode-hook 'tex-mode-hook 'plain-tex-mode-hook))
6503cec3 345;;;###autoload
31e1d920 346(defalias 'plain-TeX-mode 'plain-tex-mode)
869bff31 347
7229064d 348;;;###autoload
869bff31 349(defun latex-mode ()
350 "Major mode for editing files of input for LaTeX.
351Makes $ and } display the characters they match.
352Makes \" insert `` when it seems to be the beginning of a quotation,
353and '' when it appears to be the end; it inserts \" only after a \\.
354
355Use \\[tex-region] to run LaTeX on the current region, plus the preamble
356copied from the top of the file (containing \\documentstyle, etc.),
357running LaTeX under a special subshell. \\[tex-buffer] does the whole buffer.
358\\[tex-file] saves the buffer and then processes the file.
359\\[tex-print] prints the .dvi file made by any of these.
360\\[tex-view] previews the .dvi file made by any of these.
361\\[tex-bibtex-file] runs bibtex on the file of the current buffer.
362
363Use \\[validate-tex-buffer] to check buffer for paragraphs containing
364mismatched $'s or braces.
365
366Special commands:
367\\{tex-mode-map}
368
369Mode variables:
370latex-run-command
371 Command string used by \\[tex-region] or \\[tex-buffer].
372tex-directory
373 Directory in which to create temporary files for LaTeX jobs
374 run by \\[tex-region] or \\[tex-buffer].
375tex-dvi-print-command
376 Command string used by \\[tex-print] to print a .dvi file.
528415e7
RS
377tex-alt-dvi-print-command
378 Alternative command string used by \\[tex-print] (when given a prefix
379 argument) to print a .dvi file.
869bff31 380tex-dvi-view-command
381 Command string used by \\[tex-view] to preview a .dvi file.
382tex-show-queue-command
383 Command string used by \\[tex-show-print-queue] to show the print
384 queue that \\[tex-print] put your job on.
385
81c735c0
RS
386Entering Latex mode runs the hook `text-mode-hook', then
387`tex-mode-hook', and finally `latex-mode-hook'. When the special
388subshell is initiated, `tex-shell-hook' is run."
869bff31 389 (interactive)
390 (tex-common-initialization)
391 (setq mode-name "LaTeX")
392 (setq major-mode 'latex-mode)
393 (setq tex-command latex-run-command)
898b9ac1
RS
394 (setq tex-start-of-header "\\\\documentstyle\\|\\\\documentclass")
395 (setq tex-end-of-header "\\\\begin{document}")
869bff31 396 (setq tex-trailer "\\end{document}\n")
ab2c9f54
RS
397 ;; A line containing just $$ is treated as a paragraph separator.
398 ;; A line starting with $$ starts a paragraph,
399 ;; but does not separate paragraphs if it has more stuff on it.
02202839
BG
400 (setq paragraph-start "[ \t]*$\\|[\f%]\\|[ \t]*\\$\\$\\|\
401\\\\begin\\>\\|\\\\label\\>\\|\\\\end\\>\\|\\\\\\[\\|\\\\\\]\\|\
402\\\\chapter\\>\\|\\\\section\\>\\|\
403\\\\subsection\\>\\|\\\\subsubsection\\>\\|\
404\\\\paragraph\\>\\|\\\\subparagraph\\>\\|\
405\\\\item\\>\\|\\\\bibitem\\>\\|\\\\newline\\>\\|\\\\noindent\\>\\|\
406\\\\[a-z]*space\\>\\|\\\\[a-z]*skip\\>\\|\
407\\\\newpage\\>\\|\\\\[a-z]*page\\|\\\\footnote\\>\\|\
408\\\\marginpar\\>\\|\\\\parbox\\>\\|\\\\caption\\>")
409 (setq paragraph-separate "[ \t]*$\\|[\f%]\\|[ \t]*\\$\\$[ \t]*$\\|\
410\\\\begin\\>\\|\\\\label\\>\\|\\\\end\\>\\|\\\\\\[\\|\\\\\\]\\|\
411\\\\chapter\\>\\|\\\\section\\>\\|\
412\\\\subsection\\>\\|\\\\subsubsection\\>\\|\
413\\\\paragraph\\>\\|\\\\subparagraph\\>\\|\
414\\(\\\\item\\|\\\\bibitem\\|\\\\newline\\|\\\\noindent\\|\
415\\\\[a-z]*space\\|\\\\[a-z]*skip\\|\
416\\\\newpage\\|\\\\[a-z]*page[a-z]*\\|\\\\footnote\\|\
417\\\\marginpar\\|\\\\parbox\\|\\\\caption\\)[ \t]*\\($\\|%\\)")
0fb4f245
KH
418 (make-local-variable 'imenu-generic-expression)
419 (setq imenu-generic-expression latex-imenu-generic-expression)
869bff31 420 (run-hooks 'text-mode-hook 'tex-mode-hook 'latex-mode-hook))
421
bd2f2323 422;;;###autoload
869bff31 423(defun slitex-mode ()
424 "Major mode for editing files of input for SliTeX.
425Makes $ and } display the characters they match.
426Makes \" insert `` when it seems to be the beginning of a quotation,
427and '' when it appears to be the end; it inserts \" only after a \\.
428
429Use \\[tex-region] to run SliTeX on the current region, plus the preamble
430copied from the top of the file (containing \\documentstyle, etc.),
431running SliTeX under a special subshell. \\[tex-buffer] does the whole buffer.
432\\[tex-file] saves the buffer and then processes the file.
433\\[tex-print] prints the .dvi file made by any of these.
434\\[tex-view] previews the .dvi file made by any of these.
435\\[tex-bibtex-file] runs bibtex on the file of the current buffer.
436
437Use \\[validate-tex-buffer] to check buffer for paragraphs containing
438mismatched $'s or braces.
439
440Special commands:
441\\{tex-mode-map}
442
443Mode variables:
444slitex-run-command
445 Command string used by \\[tex-region] or \\[tex-buffer].
446tex-directory
447 Directory in which to create temporary files for SliTeX jobs
448 run by \\[tex-region] or \\[tex-buffer].
449tex-dvi-print-command
450 Command string used by \\[tex-print] to print a .dvi file.
528415e7
RS
451tex-alt-dvi-print-command
452 Alternative command string used by \\[tex-print] (when given a prefix
453 argument) to print a .dvi file.
869bff31 454tex-dvi-view-command
455 Command string used by \\[tex-view] to preview a .dvi file.
456tex-show-queue-command
457 Command string used by \\[tex-show-print-queue] to show the print
458 queue that \\[tex-print] put your job on.
459
81c735c0
RS
460Entering SliTeX mode runs the hook `text-mode-hook', then the hook
461`tex-mode-hook', then the hook `latex-mode-hook', and finally the hook
462`slitex-mode-hook'. When the special subshell is initiated, the hook
463`tex-shell-hook' is run."
869bff31 464 (interactive)
465 (tex-common-initialization)
466 (setq mode-name "SliTeX")
467 (setq major-mode 'slitex-mode)
468 (setq tex-command slitex-run-command)
898b9ac1
RS
469 (setq tex-start-of-header "\\\\documentstyle{slides}\\|\\\\docuentclass{slides}")
470 (setq tex-end-of-header "\\\\begin{document}")
869bff31 471 (setq tex-trailer "\\end{document}\n")
ab2c9f54
RS
472 ;; A line containing just $$ is treated as a paragraph separator.
473 ;; A line starting with $$ starts a paragraph,
474 ;; but does not separate paragraphs if it has more stuff on it.
02202839
BG
475 (setq paragraph-start "[ \t]*$\\|[\f%]\\|[ \t]*\\$\\$\\|\
476\\\\begin\\>\\|\\\\label\\>\\|\\\\end\\>\\|\\\\\\[\\|\\\\\\]\\|\
477\\\\chapter\\>\\|\\\\section\\>\\|\
478\\\\subsection\\>\\|\\\\subsubsection\\>\\|\
479\\\\paragraph\\>\\|\\\\subparagraph\\>\\|\
480\\\\item\\>\\|\\\\bibitem\\>\\|\\\\newline\\>\\|\\\\noindent\\>\\|\
481\\\\[a-z]*space\\>\\|\\\\[a-z]*skip\\>\\|\
482\\\\newpage\\>\\|\\\\[a-z]*page\\|\\\\footnote\\>\\|\
483\\\\marginpar\\>\\|\\\\parbox\\>\\|\\\\caption\\>")
484 (setq paragraph-separate "[ \t]*$\\|[\f%]\\|[ \t]*\\$\\$[ \t]*$\\|\
485\\\\begin\\>\\|\\\\label\\>\\|\\\\end\\>\\|\\\\\\[\\|\\\\\\]\\|\
486\\\\chapter\\>\\|\\\\section\\>\\|\
487\\\\subsection\\>\\|\\\\subsubsection\\>\\|\
488\\\\paragraph\\>\\|\\\\subparagraph\\>\\|\
489\\\\item[ \t]*$\\|\\\\bibitem[ \t]*$\\|\\\\newline[ \t]*$\\|\\\\noindent[ \t]*$\\|\
490\\\\[a-z]*space[ \t]*$\\|\\\\[a-z]*skip[ \t]*$\\|\
491\\\\newpage[ \t]*$\\|\\\\[a-z]*page[a-z]*[ \t]*$\\|\\\\footnote[ \t]*$\\|\
492\\\\marginpar[ \t]*$\\|\\\\parbox[ \t]*$\\|\\\\caption[ \t]*$")
869bff31 493 (run-hooks
494 'text-mode-hook 'tex-mode-hook 'latex-mode-hook 'slitex-mode-hook))
495
496(defun tex-common-initialization ()
497 (kill-all-local-variables)
498 (use-local-map tex-mode-map)
499 (setq local-abbrev-table text-mode-abbrev-table)
500 (if (null tex-mode-syntax-table)
501 (let ((char 0))
502 (setq tex-mode-syntax-table (make-syntax-table))
503 (set-syntax-table tex-mode-syntax-table)
504 (while (< char ? )
505 (modify-syntax-entry char ".")
506 (setq char (1+ char)))
507 (modify-syntax-entry ?\C-@ "w")
508 (modify-syntax-entry ?\t " ")
509 (modify-syntax-entry ?\n ">")
510 (modify-syntax-entry ?\f ">")
511 (modify-syntax-entry ?$ "$$")
512 (modify-syntax-entry ?% "<")
513 (modify-syntax-entry ?\\ "/")
514 (modify-syntax-entry ?\" ".")
515 (modify-syntax-entry ?& ".")
516 (modify-syntax-entry ?_ ".")
517 (modify-syntax-entry ?@ "_")
518 (modify-syntax-entry ?~ " ")
519 (modify-syntax-entry ?' "w"))
520 (set-syntax-table tex-mode-syntax-table))
521 (make-local-variable 'paragraph-start)
64db2461 522 ;; A line containing just $$ is treated as a paragraph separator.
02202839 523 (setq paragraph-start "[ \t]*$\\|[\f\\\\%]\\|[ \t]*\\$\\$")
869bff31 524 (make-local-variable 'paragraph-separate)
ab2c9f54
RS
525 ;; A line starting with $$ starts a paragraph,
526 ;; but does not separate paragraphs if it has more stuff on it.
02202839 527 (setq paragraph-separate "[ \t]*$\\|[\f\\\\%]\\|[ \t]*\\$\\$[ \t]*$")
869bff31 528 (make-local-variable 'comment-start)
529 (setq comment-start "%")
530 (make-local-variable 'comment-start-skip)
531 (setq comment-start-skip "\\(\\(^\\|[^\\]\\)\\(\\\\\\\\\\)*\\)\\(%+ *\\)")
e41b2db1
ER
532 (make-local-variable 'comment-indent-function)
533 (setq comment-indent-function 'tex-comment-indent)
2e0b53ad
RS
534 (make-local-variable 'parse-sexp-ignore-comments)
535 (setq parse-sexp-ignore-comments t)
869bff31 536 (make-local-variable 'compare-windows-whitespace)
537 (setq compare-windows-whitespace 'tex-categorize-whitespace)
538 (make-local-variable 'tex-command)
539 (make-local-variable 'tex-start-of-header)
540 (make-local-variable 'tex-end-of-header)
541 (make-local-variable 'tex-trailer))
542
543(defun tex-comment-indent ()
544 (if (looking-at "%%%")
545 (current-column)
546 (skip-chars-backward " \t")
547 (max (if (bolp) 0 (1+ (current-column)))
548 comment-column)))
549
550(defun tex-categorize-whitespace (backward-limit)
551 ;; compare-windows-whitespace is set to this.
552 ;; This is basically a finite-state machine.
553 ;; Returns a symbol telling how TeX would treat
554 ;; the whitespace we are looking at: null, space, or par.
555 (let ((category 'null)
556 (not-finished t))
557 (skip-chars-backward " \t\n\f" backward-limit)
558 (while not-finished
559 (cond ((looking-at "[ \t]+")
560 (goto-char (match-end 0))
561 (if (eql category 'null)
562 (setq category 'space)))
563 ((looking-at "\n")
564 (cond ((eql category 'newline)
565 (setq category 'par)
566 (setq not-finished nil))
567 (t
568 (setq category 'newline) ;a strictly internal state
569 (goto-char (match-end 0)))))
570 ((looking-at "\f+")
571 (setq category 'par)
572 (setq not-finished nil))
573 (t
574 (setq not-finished nil))))
575 (skip-chars-forward " \t\n\f")
576 (if (eql category 'newline)
577 'space ;TeX doesn't distinguish
578 category)))
579
580(defun tex-insert-quote (arg)
581 "Insert the appropriate quote marks for TeX.
08348502
RS
582Inserts the value of `tex-open-quote' (normally ``) or `tex-close-quote'
583\(normally '') depending on the context. With prefix argument, always
869bff31 584inserts \" characters."
528415e7 585 (interactive "*P")
869bff31 586 (if arg
587 (self-insert-command (prefix-numeric-value arg))
588 (insert
589 (cond ((or (bobp)
590 (save-excursion
591 (forward-char -1)
592 (looking-at "\\s(\\|\\s \\|\\s>")))
593 tex-open-quote)
594 ((= (preceding-char) ?\\)
595 ?\")
596 (t
597 tex-close-quote)))))
598
599(defun validate-tex-buffer ()
8241d7b9 600 "Check current buffer for paragraphs containing mismatched $s.
bbd93e41
RS
601Their positions are recorded in the buffer `*Occur*'.
602To find a particular invalidity from `*Occur*',
603switch to to that buffer and type C-c C-c on the line
604for the invalidity you want to see."
869bff31 605 (interactive)
bbd93e41
RS
606 (let ((buffer (current-buffer))
607 (prevpos (point-min))
608 (linenum nil))
609 (with-output-to-temp-buffer "*Occur*"
610 (princ "Mismatches:\n")
611 (save-excursion
612 (set-buffer standard-output)
613 (occur-mode)
614 (setq occur-buffer buffer)
615 (setq occur-nlines 0)
616 (setq occur-pos-list nil))
617 (save-excursion
618 (goto-char (point-max))
869bff31 619 (while (and (not (input-pending-p)) (not (bobp)))
620 (let ((end (point)))
bbd93e41 621 ;; Scan the previous paragraph for invalidities.
869bff31 622 (search-backward "\n\n" nil 'move)
623 (or (tex-validate-region (point) end)
bbd93e41
RS
624 (let* ((end (save-excursion (forward-line 1) (point)))
625 start tem)
626 (beginning-of-line)
627 (setq start (point))
628 ;; Keep track of line number as we scan,
629 ;; in a cumulative fashion.
630 (if linenum
631 (setq linenum (- linenum (count-lines prevpos (point))))
632 (setq linenum (1+ (count-lines 1 start))))
633 (setq prevpos (point))
634 ;; Mention this mismatch in *Occur*.
635 ;; Since we scan from end of buffer to beginning,
636 ;; add each mismatch at the beginning of *Occur*
637 ;; and at the beginning of occur-pos-list.
638 (save-excursion
639 (setq tem (point-marker))
640 (set-buffer standard-output)
641 (goto-char (point-min))
642 ;; Skip "Mismatches:" header line.
643 (forward-line 1)
644 (setq occur-pos-list (cons tem occur-pos-list))
645 (insert-buffer-substring buffer start end)
646 (forward-char (- start end))
647 (insert (format "%3d: " linenum))))))))
648 (save-excursion
649 (set-buffer standard-output)
650 (if (null occur-pos-list)
651 (insert "None!\n"))
652 (if (interactive-p)
653 (message "%d mismatches found" (length occur-pos-list)))))))
869bff31 654
655(defun tex-validate-region (start end)
656 "Check for mismatched braces or $'s in region.
657Returns t if no mismatches. Returns nil and moves point to suspect
658area if a mismatch is found."
659 (interactive "r")
660 (let ((failure-point nil) (max-possible-sexps (- end start)))
661 (save-excursion
662 (condition-case ()
663 (save-restriction
664 (narrow-to-region start end)
665 (goto-char start)
666 (while (< 0 (setq max-possible-sexps (1- max-possible-sexps)))
667 (forward-sexp 1)))
668 (error
669 (setq failure-point (point)))))
670 (if failure-point
671 (progn
672 (goto-char failure-point)
673 nil)
674 t)))
675
676(defun tex-terminate-paragraph (inhibit-validation)
677 "Insert two newlines, breaking a paragraph for TeX.
81c735c0 678Check for mismatched braces or $s in paragraph being terminated.
869bff31 679A prefix arg inhibits the checking."
528415e7 680 (interactive "*P")
869bff31 681 (or inhibit-validation
682 (save-excursion
683 (tex-validate-region
684 (save-excursion
685 (search-backward "\n\n" nil 'move)
686 (point))
687 (point)))
688 (message "Paragraph being closed appears to contain a mismatch"))
689 (insert "\n\n"))
690
691(defun tex-insert-braces ()
692 "Make a pair of braces and be poised to type inside of them."
528415e7 693 (interactive "*")
869bff31 694 (insert ?\{)
695 (save-excursion
696 (insert ?})))
697
698;;; Like tex-insert-braces, but for LaTeX.
699(defun tex-latex-block (name)
81c735c0 700 "Creates a matching pair of lines `\\begin{NAME}' and `\\end{NAME}' at point.
869bff31 701Puts point on a blank line between them."
528415e7
RS
702 (interactive
703 (prog2
704 (barf-if-buffer-read-only)
705 (list
706 (completing-read "LaTeX block name: "
707 (mapcar 'list
708 (append standard-latex-block-names
709 latex-block-names))))))
869bff31 710 (let ((col (current-column)))
711 (insert (format "\\begin{%s}\n" name))
712 (indent-to col)
713 (save-excursion
714 (insert ?\n)
715 (indent-to col)
716 (insert-string (format "\\end{%s}" name))
717 (if (eobp) (insert ?\n)))))
718
719(defun tex-last-unended-begin ()
81c735c0 720 "Leave point at the beginning of the last `\\begin{...}' that is unended."
869bff31 721 (while (and (re-search-backward "\\(\\\\begin\\s *{\\)\\|\\(\\\\end\\s *{\\)")
722 (looking-at "\\\\end{"))
723 (tex-last-unended-begin)))
724
6a900cf1
ER
725(defun tex-goto-last-unclosed-latex-block ()
726 "Move point to the last unclosed \\begin{...}.
727Mark is left at original location."
728 (interactive)
729 (let ((spot))
730 (save-excursion
731 (condition-case nil
732 (tex-last-unended-begin)
733 (error (error "Couldn't find unended \\begin")))
734 (setq spot (point)))
735 (push-mark)
736 (goto-char spot)))
737
869bff31 738(defun tex-close-latex-block ()
739 "Creates an \\end{...} to match the last unclosed \\begin{...}."
740 (interactive "*")
741 (let ((new-line-needed (bolp))
742 text indentation)
743 (save-excursion
528415e7 744 (condition-case nil
869bff31 745 (tex-last-unended-begin)
746 (error (error "Couldn't find unended \\begin")))
747 (setq indentation (current-column))
748 (re-search-forward "\\\\begin\\(\\s *{[^}\n]*}\\)")
749 (setq text (buffer-substring (match-beginning 1) (match-end 1))))
750 (indent-to indentation)
751 (insert "\\end" text)
752 (if new-line-needed (insert ?\n))))
753\f
2f3067de
ER
754(defun tex-compilation-parse-errors ()
755 "Parse the current buffer as error messages.
756This makes a list of error descriptors, compilation-error-list.
757For each source-file, line-number pair in the buffer,
758the source file is read in, and the text location is saved in
8241d7b9 759compilation-error-list. The function `next-error', assigned to
2f3067de
ER
760\\[next-error], takes the next error off the list and visits its location.
761
762This function works on TeX compilations only. It is necessary for
763that purpose, since TeX does not put file names on the same line as
764line numbers for the errors."
765 (setq compilation-error-list nil)
766 (message "Parsing error messages...")
767 (modify-syntax-entry ?\{ "_")
768 (modify-syntax-entry ?\} "_")
769 (modify-syntax-entry ?\[ "_")
770 (modify-syntax-entry ?\] "_")
2f3067de
ER
771 (let (text-buffer
772 last-filename last-linenum)
773 ;; Don't reparse messages already seen at last parse.
774 (goto-char compilation-parsing-end)
775 ;; Don't parse the first two lines as error messages.
776 ;; This matters for grep.
777 (if (bobp)
778 (forward-line 2))
8241d7b9 779 (while (re-search-forward "^l\.[0-9]+ " nil t)
2f3067de
ER
780 (let (linenum filename
781 error-marker text-marker)
782 ;; Extract file name and line number from error message.
783 ;; Line number is 2 away from beginning of line: "l.23"
784 (beginning-of-line)
785 (goto-char (+ (point) 2))
786 (setq linenum (read (current-buffer)))
787 ;; The file is the one that was opened last and is still open.
788 ;; We need to find the last open parenthesis.
789 (insert ?\))
790 (backward-sexp)
791 (forward-char)
8241d7b9 792 (setq filename (current-word))
2f3067de
ER
793 ;; Locate the erring file and line.
794 (if (and (equal filename last-filename)
795 (= linenum last-linenum))
796 nil
797 (skip-chars-backward "^(")
798 (backward-char)
799 (forward-sexp)
800 (backward-delete-char 1)
801 (setq error-marker (point-marker))
802 ;; text-buffer gets the buffer containing this error's file.
803 (if (not (equal filename last-filename))
804 (setq text-buffer
805 (and (file-exists-p (setq last-filename filename))
806 (find-file-noselect filename))
807 last-linenum 0))
808 (if text-buffer
809 ;; Go to that buffer and find the erring line.
810 (save-excursion
811 (set-buffer text-buffer)
812 (if (zerop last-linenum)
813 (progn
814 (goto-char 1)
815 (setq last-linenum 1)))
816 (forward-line (- linenum last-linenum))
817 (setq last-linenum linenum)
818 (setq text-marker (point-marker))
819 (setq compilation-error-list
820 (cons (list error-marker text-marker)
821 compilation-error-list)))))
822 (forward-line 1)))
823 (setq compilation-parsing-end (point-max)))
824 (message "Parsing error messages...done")
825 (setq compilation-error-list (nreverse compilation-error-list)))
826\f
869bff31 827;;; Invoking TeX in an inferior shell.
828
829;;; Why use a shell instead of running TeX directly? Because if TeX
830;;; gets stuck, the user can switch to the shell window and type at it.
831
832;;; The utility functions:
833
d974af30 834;;;###autoload
869bff31 835(defun tex-start-shell ()
836 (save-excursion
528415e7
RS
837 (set-buffer
838 (make-comint
839 "tex-shell"
840 (or tex-shell-file-name (getenv "ESHELL") (getenv "SHELL") "/bin/sh")
4cdc1d4b 841 nil))
528415e7
RS
842 (let ((proc (get-process "tex-shell")))
843 (set-process-sentinel proc 'tex-shell-sentinel)
844 (process-kill-without-query proc)
e8c04c88 845 (setq comint-prompt-regexp shell-prompt-pattern)
191cda94 846 (setq tex-shell-map (nconc (make-sparse-keymap) shell-mode-map))
528415e7
RS
847 (tex-define-common-keys tex-shell-map)
848 (use-local-map tex-shell-map)
849 (run-hooks 'tex-shell-hook)
850 (while (zerop (buffer-size))
51b2c841
RS
851 (sleep-for 1)))))
852
853(defun tex-display-shell ()
854 "Make the TeX shell buffer visible in a window."
855 (display-buffer (process-buffer (get-process "tex-shell")))
856 (tex-recenter-output-buffer nil))
528415e7
RS
857
858(defun tex-shell-sentinel (proc msg)
859 (cond ((null (buffer-name (process-buffer proc)))
860 ;; buffer killed
861 (set-process-buffer proc nil)
862 (tex-delete-last-temp-files))
863 ((memq (process-status proc) '(signal exit))
864 (tex-delete-last-temp-files))))
865
866(defun tex-set-buffer-directory (buffer directory)
869bff31 867 "Set BUFFER's default directory to be DIRECTORY."
868 (setq directory (file-name-as-directory (expand-file-name directory)))
869 (if (not (file-directory-p directory))
870 (error "%s is not a directory" directory)
871 (save-excursion
872 (set-buffer buffer)
873 (setq default-directory directory))))
874
30803a05
RS
875(defvar tex-send-command-modified-tick 0)
876(make-variable-buffer-local 'tex-send-command-modified-tick)
877
528415e7 878(defun tex-send-command (command &optional file background)
4cdc1d4b 879 "Send COMMAND to TeX shell process, substituting optional FILE for *.
8241d7b9
ER
880Do this in background if optional BACKGROUND is t. If COMMAND has no *,
881FILE will be appended, preceded by a blank, to COMMAND. If FILE is nil, no
882substitution will be made in COMMAND. COMMAND can be any expression that
883evaluates to a command string."
528415e7
RS
884 (save-excursion
885 (let* ((cmd (eval command))
c93931c3 886 (proc (or (get-process "tex-shell") (error "No TeX subprocess")))
64db2461 887 (buf (process-buffer proc))
4f45adda 888 (star (string-match "\\*" cmd))
4cdc1d4b
RS
889 (string
890 (concat
891 (if file
892 (if star (concat (substring cmd 0 star)
893 file (substring cmd (1+ star)))
894 (concat cmd " " file))
895 cmd)
896 (if background "&" ""))))
64db2461
RS
897 ;; Switch to buffer before checking for subproc output in it.
898 (set-buffer buf)
30803a05
RS
899 ;; If text is unchanged since previous tex-send-command,
900 ;; we haven't got any output. So wait for output now.
64db2461 901 (if (= (buffer-modified-tick buf) tex-send-command-modified-tick)
30803a05 902 (accept-process-output proc))
4cdc1d4b
RS
903 (goto-char (process-mark proc))
904 (insert string)
30803a05 905 (comint-send-input)
64db2461 906 (setq tex-send-command-modified-tick (buffer-modified-tick buf)))))
528415e7 907
a15849cb
RS
908(defun tex-delete-last-temp-files (&optional not-all)
909 "Delete any junk files from last temp file.
910If NOT-ALL is non-nil, save the `.dvi' file."
528415e7
RS
911 (if tex-last-temp-file
912 (let* ((dir (file-name-directory tex-last-temp-file))
adf6b7f9
KH
913 (list (and (file-directory-p dir)
914 (file-name-all-completions
915 (file-name-nondirectory tex-last-temp-file) dir))))
916 (while list
a15849cb
RS
917 (if not-all
918 (and
919 ;; If arg is non-nil, don't delete the .dvi file.
920 (not (string-match "\\.dvi$" (car list)))
921 (delete-file (concat dir (car list))))
922 (delete-file (concat dir (car list))))
528415e7
RS
923 (setq list (cdr list))))))
924
99621a14 925(add-hook 'kill-emacs-hook 'tex-delete-last-temp-files)
869bff31 926
528415e7 927;;; The commands:
869bff31 928
929(defun tex-region (beg end)
930 "Run TeX on the current region, via a temporary file.
931The file's name comes from the variable `tex-zap-file' and the
932variable `tex-directory' says where to put it.
933
934If the buffer has a header, the header is given to TeX before the
935region itself. The buffer's header is all lines between the strings
936defined by `tex-start-of-header' and `tex-end-of-header' inclusive.
937The header must start in the first 100 lines of the buffer.
938
939The value of `tex-trailer' is given to TeX as input after the region.
940
941The value of `tex-command' specifies the command to use to run TeX."
942 (interactive "r")
943 (if (tex-shell-running)
944 (tex-kill-job)
945 (tex-start-shell))
946 (or tex-zap-file
947 (setq tex-zap-file (tex-generate-zap-file-name)))
528415e7
RS
948 (let* ((temp-buffer (get-buffer-create " TeX-Output-Buffer"))
949 ; Temp file will be written and TeX will be run in zap-directory.
950 ; If the TEXINPUTS file has relative directories or if the region has
951 ; \input of files, this must be the same directory as the file for
952 ; TeX to access the correct inputs. That's why it's safest if
953 ; tex-directory is ".".
954 (zap-directory
955 (file-name-as-directory (expand-file-name tex-directory)))
956 (tex-out-file (concat zap-directory tex-zap-file)))
0d548e5d
RS
957 ;; Don't delete temp files if we do the same buffer twice in a row.
958 (or (eq (current-buffer) tex-last-buffer-texed)
959 (tex-delete-last-temp-files t))
869bff31 960 ;; Write the new temp file.
961 (save-excursion
962 (save-restriction
963 (widen)
964 (goto-char (point-min))
965 (forward-line 100)
966 (let ((search-end (point))
967 (hbeg (point-min)) (hend (point-min))
968 (default-directory zap-directory))
969 (goto-char (point-min))
970 ;; Initialize the temp file with either the header or nothing
898b9ac1 971 (if (re-search-forward tex-start-of-header search-end t)
869bff31 972 (progn
973 (beginning-of-line)
974 (setq hbeg (point)) ;mark beginning of header
898b9ac1 975 (if (re-search-forward tex-end-of-header nil t)
869bff31 976 (progn (forward-line 1)
977 (setq hend (point))) ;mark end of header
978 (setq hbeg (point-min))))) ;no header
528415e7
RS
979 (write-region (min hbeg beg) hend
980 (concat tex-out-file ".tex") nil nil)
981 (write-region (max beg hend) end (concat tex-out-file ".tex") t nil))
869bff31 982 (let ((local-tex-trailer tex-trailer))
983 (set-buffer temp-buffer)
984 (erase-buffer)
985 ;; make sure trailer isn't hidden by a comment
986 (insert-string "\n")
987 (if local-tex-trailer (insert-string local-tex-trailer))
528415e7
RS
988 (tex-set-buffer-directory temp-buffer zap-directory)
989 (write-region (point-min) (point-max)
990 (concat tex-out-file ".tex") t nil))))
991 ;; Record the file name to be deleted afterward.
992 (setq tex-last-temp-file tex-out-file)
993 (tex-send-command tex-shell-cd-command zap-directory)
994 (tex-send-command tex-command tex-out-file)
51b2c841 995 (tex-display-shell)
528415e7
RS
996 (setq tex-print-file tex-out-file)
997 (setq tex-last-buffer-texed (current-buffer))))
869bff31 998
999(defun tex-buffer ()
1000 "Run TeX on current buffer. See \\[tex-region] for more information.
528415e7
RS
1001Does not save the buffer, so it's useful for trying experimental versions.
1002See \\[tex-file] for an alternative."
869bff31 1003 (interactive)
1004 (tex-region (point-min) (point-max)))
1005
1006(defun tex-file ()
1007 "Prompt to save all buffers and run TeX (or LaTeX) on current buffer's file.
1008This function is more useful than \\[tex-buffer] when you need the
1009`.aux' file of LaTeX to have the correct name."
1010 (interactive)
1011 (let ((tex-out-file
1012 (if (buffer-file-name)
1013 (file-name-nondirectory (buffer-file-name))
1014 (error "Buffer does not seem to be associated with any file")))
1015 (file-dir (file-name-directory (buffer-file-name))))
7047ec77 1016 (if tex-offer-save
99621a14 1017 (save-some-buffers))
869bff31 1018 (if (tex-shell-running)
1019 (tex-kill-job)
1020 (tex-start-shell))
528415e7
RS
1021 (tex-send-command tex-shell-cd-command file-dir)
1022 (tex-send-command tex-command tex-out-file))
51b2c841 1023 (tex-display-shell)
869bff31 1024 (setq tex-last-buffer-texed (current-buffer))
528415e7 1025 (setq tex-print-file (buffer-file-name)))
869bff31 1026
1027(defun tex-generate-zap-file-name ()
1028 "Generate a unique name suitable for use as a file name."
1029 ;; Include the shell process number and host name
1030 ;; in case there are multiple shells (for same or different user).
1031 (format "#tz%d%s"
1032 (process-id (get-buffer-process "*tex-shell*"))
1033 (tex-strip-dots (system-name))))
1034
1035(defun tex-strip-dots (s)
1036 (setq s (copy-sequence s))
1037 (while (string-match "\\." s)
1038 (aset s (match-beginning 0) ?-))
1039 s)
1040
1041;; This will perhaps be useful for modifying TEXINPUTS.
1042;; Expand each file name, separated by colons, in the string S.
1043(defun tex-expand-files (s)
1044 (let (elts (start 0))
1045 (while (string-match ":" s start)
1046 (setq elts (cons (substring s start (match-beginning 0)) elts))
1047 (setq start (match-end 0)))
1048 (or (= start 0)
1049 (setq elts (cons (substring s start) elts)))
1050 (mapconcat 'expand-file-name (nreverse elts) ":")))
1051
1052(defun tex-shell-running ()
1053 (and (get-process "tex-shell")
1054 (eq (process-status (get-process "tex-shell")) 'run)))
1055
1056(defun tex-kill-job ()
1057 "Kill the currently running TeX job."
1058 (interactive)
528415e7 1059 (quit-process (get-process "tex-shell") t))
869bff31 1060
1061(defun tex-recenter-output-buffer (linenum)
1062 "Redisplay buffer of TeX job output so that most recent output can be seen.
1063The last line of the buffer is displayed on
1064line LINE of the window, or centered if LINE is nil."
1065 (interactive "P")
1066 (let ((tex-shell (get-buffer "*tex-shell*"))
1067 (old-buffer (current-buffer)))
1068 (if (null tex-shell)
1069 (message "No TeX output buffer")
1070 (pop-to-buffer tex-shell)
1071 (bury-buffer tex-shell)
1072 (goto-char (point-max))
1073 (recenter (if linenum
1074 (prefix-numeric-value linenum)
1075 (/ (window-height) 2)))
528415e7 1076 (pop-to-buffer old-buffer))))
869bff31 1077
528415e7 1078(defun tex-print (&optional alt)
869bff31 1079 "Print the .dvi file made by \\[tex-region], \\[tex-buffer] or \\[tex-file].
1433a222
CZ
1080Runs the shell command defined by `tex-dvi-print-command'. If prefix argument
1081is provided, use the alternative command, `tex-alt-dvi-print-command'."
528415e7 1082 (interactive "P")
869bff31 1083 (let ((print-file-name-dvi (tex-append tex-print-file ".dvi"))
1084 test-name)
1085 (if (and (not (equal (current-buffer) tex-last-buffer-texed))
45c3304d
RS
1086 (buffer-file-name)
1087 ;; Check that this buffer's printed file is up to date.
869bff31 1088 (file-newer-than-file-p
1089 (setq test-name (tex-append (buffer-file-name) ".dvi"))
45c3304d 1090 (buffer-file-name)))
869bff31 1091 (setq print-file-name-dvi test-name))
528415e7
RS
1092 (if (not (file-exists-p print-file-name-dvi))
1093 (error "No appropriate `.dvi' file could be found")
1094 (tex-send-command
1095 (if alt tex-alt-dvi-print-command tex-dvi-print-command)
1096 print-file-name-dvi t))))
869bff31 1097
cf6d6e8a
RS
1098(defun tex-alt-print ()
1099 "Print the .dvi file made by \\[tex-region], \\[tex-buffer] or \\[tex-file].
002b0d00 1100Runs the shell command defined by `tex-alt-dvi-print-command'."
cf6d6e8a
RS
1101 (interactive)
1102 (tex-print t))
1103
869bff31 1104(defun tex-view ()
1105 "Preview the last `.dvi' file made by running TeX under Emacs.
1106This means, made using \\[tex-region], \\[tex-buffer] or \\[tex-file].
2b7971c9
RS
1107The variable `tex-dvi-view-command' specifies the shell command for preview.
1108You must set that variable yourself before using this command,
1109because there is no standard value that would generally work."
869bff31 1110 (interactive)
2b7971c9
RS
1111 (or tex-dvi-view-command
1112 (error "You must set `tex-dvi-view-command'"))
869bff31 1113 (let ((tex-dvi-print-command tex-dvi-view-command))
1114 (tex-print)))
1115
1116(defun tex-append (file-name suffix)
1117 "Append to FILENAME the suffix SUFFIX, using same algorithm TeX uses.
cf6d6e8a 1118Pascal-based TeX scans for the first period, C TeX uses the last.
869bff31 1119No period is retained immediately before SUFFIX,
1120so normally SUFFIX starts with one."
1121 (if (stringp file-name)
cf6d6e8a
RS
1122 (let ((file (file-name-nondirectory file-name))
1123 trial-name)
7d0ca249
RS
1124 ;; Try spliting on last period.
1125 ;; The first-period split can get fooled when two files
1126 ;; named a.tex and a.b.tex are both tex'd;
1127 ;; the last-period split must be right if it matches at all.
cf6d6e8a
RS
1128 (setq trial-name
1129 (concat (file-name-directory file-name)
1130 (substring file 0
7d0ca249 1131 (string-match "\\.[^.]*$" file))
cf6d6e8a
RS
1132 suffix))
1133 (if (or (file-exists-p trial-name)
1134 (file-exists-p (concat trial-name ".aux"))) ;for BibTeX files
1135 trial-name
7d0ca249 1136 ;; Not found, so split on first period.
cf6d6e8a
RS
1137 (concat (file-name-directory file-name)
1138 (substring file 0
7d0ca249 1139 (string-match "\\." file))
cf6d6e8a 1140 suffix)))
869bff31 1141 " "))
1142
1143(defun tex-show-print-queue ()
1144 "Show the print queue that \\[tex-print] put your job on.
1433a222 1145Runs the shell command defined by `tex-show-queue-command'."
869bff31 1146 (interactive)
1147 (if (tex-shell-running)
1148 (tex-kill-job)
1149 (tex-start-shell))
51b2c841
RS
1150 (tex-send-command tex-show-queue-command)
1151 (tex-display-shell))
869bff31 1152
1153(defun tex-bibtex-file ()
1154 "Run BibTeX on the current buffer's file."
1155 (interactive)
1156 (if (tex-shell-running)
1157 (tex-kill-job)
1158 (tex-start-shell))
1159 (let ((tex-out-file
1160 (tex-append (file-name-nondirectory (buffer-file-name)) ""))
1161 (file-dir (file-name-directory (buffer-file-name))))
528415e7 1162 (tex-send-command tex-shell-cd-command file-dir)
51b2c841
RS
1163 (tex-send-command tex-bibtex-command tex-out-file))
1164 (tex-display-shell))
528415e7
RS
1165
1166(run-hooks 'tex-mode-load-hook)
869bff31 1167
49116ac0
JB
1168(provide 'tex-mode)
1169
d501f516 1170;;; tex-mode.el ends here
99621a14 1171