comparison lisp/auctex/latex.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
comparison
equal deleted inserted replaced
23:0edd3412f124 24:4103f0995bd7
1 ;;; latex.el --- Support for LaTeX documents.
2 ;;
3 ;; Maintainer: Per Abrahamsen <auc-tex@sunsite.auc.dk>
4 ;; Version: 9.7i
5 ;; Keywords: wp
6 ;; X-URL: http://sunsite.auc.dk/auctex
7
8 ;; Copyright 1991 Kresten Krab Thorup
9 ;; Copyright 1993, 1994, 1995, 1996, 1997 Per Abrahamsen
10 ;;
11 ;; This program is free software; you can redistribute it and/or modify
12 ;; it under the terms of the GNU General Public License as published by
13 ;; the Free Software Foundation; either version 1, or (at your option)
14 ;; any later version.
15 ;;
16 ;; This program is distributed in the hope that it will be useful,
17 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
18 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 ;; GNU General Public License for more details.
20 ;;
21 ;; You should have received a copy of the GNU General Public License
22 ;; along with this program; if not, write to the Free Software
23 ;; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
24
25 ;;; Code:
26
27 (require 'tex)
28
29 ;;; Syntax
30
31 (defvar LaTeX-optop "["
32 "The LaTeX optional argument opening character.")
33 (make-variable-buffer-local 'LaTeX-optop)
34
35 (defvar LaTeX-optcl "]"
36 "The LaTeX optional argument closeing character.")
37 (make-variable-buffer-local 'LaTeX-optcl)
38
39 ;;; Style
40
41 (defvar LaTeX-default-style "article"
42 "*Default when creating new documents.")
43
44 (make-variable-buffer-local 'LaTeX-default-style)
45
46 (defvar LaTeX-default-options nil
47 "*Default options to documentstyle.
48 A list of strings.")
49
50 (make-variable-buffer-local 'LaTeX-default-options)
51
52 ;;; Syntax Table
53
54 (defvar LaTeX-mode-syntax-table (copy-syntax-table TeX-mode-syntax-table)
55 "Syntax table used in LaTeX mode.")
56
57 (progn ; set [] to match for LaTeX.
58 (modify-syntax-entry (string-to-char LaTeX-optop)
59 (concat "(" LaTeX-optcl)
60 LaTeX-mode-syntax-table)
61 (modify-syntax-entry (string-to-char LaTeX-optcl)
62 (concat ")" LaTeX-optop)
63 LaTeX-mode-syntax-table))
64
65 ;;; Sections
66
67 (defun LaTeX-section (arg)
68 "Insert a template for a LaTeX section.
69 Determinate the type of section to be inserted, by the argument ARG.
70
71 If ARG is nil or missing, use the current level.
72 If ARG is a list (selected by C-u), go downward one level.
73 If ARG is negative, go up that many levels.
74 If ARG is positive or zero, use absolute level:
75
76 0 : part
77 1 : chapter
78 2 : section
79 3 : subsection
80 4 : subsubsection
81 5 : paragraph
82 6 : subparagraph
83
84 The following variables can be set to customize:
85
86 LaTeX-section-hook Hooks to run when inserting a section.
87 LaTeX-section-label Prefix to all section labels."
88
89 (interactive "*P")
90 (let* ((val (prefix-numeric-value arg))
91 (level (cond ((null arg)
92 (LaTeX-current-section))
93 ((listp arg)
94 (LaTeX-down-section))
95 ((< val 0)
96 (LaTeX-up-section (- val)))
97 (t val)))
98 (name (LaTeX-section-name level))
99 (toc nil)
100 (title "")
101 (done-mark (make-marker)))
102 (newline)
103 (run-hooks 'LaTeX-section-hook)
104 (newline)
105 (if (marker-position done-mark)
106 (goto-char (marker-position done-mark)))
107 (set-marker done-mark nil)))
108
109 (defun LaTeX-current-section ()
110 "Return the level of the section that contain point.
111 See also LaTeX-section for description of levels."
112 (save-excursion
113 (max (LaTeX-largest-level)
114 (if (re-search-backward (LaTeX-outline-regexp) nil t)
115 (- (LaTeX-outline-level) (LaTeX-outline-offset))
116 (LaTeX-largest-level)))))
117
118 (defun LaTeX-down-section ()
119 "Return the value of a section one level under the current. Tries to
120 find what kind of section that have been used earlier in the text, If
121 this fail, it will just return one less than the current section."
122 (save-excursion
123 (let ((current (LaTeX-current-section))
124 (next nil)
125 (regexp (LaTeX-outline-regexp)))
126 (if (not (re-search-backward regexp nil t))
127 (1+ current)
128 (while (not next)
129 (cond
130 ((eq (LaTeX-current-section) current)
131 (if (re-search-forward regexp nil t)
132 (if (<= (setq next (LaTeX-current-section)) current) ;Wow!
133 (setq next (1+ current)))
134 (setq next (1+ current))))
135 ((not (re-search-backward regexp nil t))
136 (setq next (1+ current)))))
137 next))))
138
139 (defun LaTeX-up-section (arg)
140 "Return the value of the section ARG levels above this one."
141 (save-excursion
142 (if (zerop arg)
143 (LaTeX-current-section)
144 (let ((current (LaTeX-current-section)))
145 (while (and (>= (LaTeX-current-section) current)
146 (re-search-backward (LaTeX-outline-regexp)
147 nil t)))
148 (LaTeX-up-section (1- arg))))))
149
150 (defvar LaTeX-section-list '(("part" 0)
151 ("chapter" 1)
152 ("section" 2)
153 ("subsection" 3)
154 ("subsubsection" 4)
155 ("paragraph" 5)
156 ("subparagraph" 6))
157 "List which elements is the names of the sections used by LaTeX.")
158
159 (defun LaTeX-section-name (level)
160 "Return the name of the section corresponding to LEVEL."
161 (let ((entry (TeX-member level LaTeX-section-list
162 (function (lambda (a b) (equal a (nth 1 b)))))))
163 (if entry
164 (nth 0 entry)
165 nil)))
166
167 (defun LaTeX-section-level (name)
168 "Return the level of the section NAME."
169 (let ((entry (TeX-member name LaTeX-section-list
170 (function (lambda (a b) (equal a (nth 0 b)))))))
171
172 (if entry
173 (nth 1 entry)
174 nil)))
175
176 (defvar TeX-outline-extra nil
177 "*List of extra TeX outline levels.
178
179 Each element is a list with two entries. The first entry is the
180 regular expression matching a header, and the second is the level of
181 the header. See LaTeX-section-list for existing header levels.")
182
183 (defun LaTeX-outline-regexp (&optional anywhere)
184 "Return regexp for LaTeX sections.
185
186 If optional argument ANYWHERE is not nil, do not require that the
187 header is at the start of a line."
188 (concat (if anywhere "" "^")
189 "[ \t]*"
190 (regexp-quote TeX-esc)
191 "\\(appendix\\|documentstyle\\|documentclass\\|"
192 (mapconcat 'car LaTeX-section-list "\\|")
193 "\\)\\b"
194 (if TeX-outline-extra
195 "\\|"
196 "")
197 (mapconcat 'car TeX-outline-extra "\\|")
198 "\\|" TeX-header-end
199 "\\|" TeX-trailer-start))
200
201 (defvar LaTeX-largest-level nil
202 "Largest sectioning level with current document style")
203
204 (make-variable-buffer-local 'LaTeX-largest-level)
205
206 (defun LaTeX-largest-level ()
207 (TeX-update-style)
208 LaTeX-largest-level)
209
210 (defun LaTeX-outline-offset ()
211 "Offset to add to LaTeX-section-list levels to get outline level."
212 (- 2 (LaTeX-largest-level)))
213
214 (defun TeX-look-at (list)
215 "Check if we are looking at the first element of a member of LIST.
216 If so, return the second element, otherwise return nil."
217 (while (and list
218 (not (looking-at (nth 0 (car list)))))
219 (setq list (cdr list)))
220 (if list
221 (nth 1 (car list))
222 nil))
223
224 (defun LaTeX-outline-level ()
225 "Find the level of current outline heading in an LaTeX document."
226 (cond ((looking-at LaTeX-header-end) 1)
227 ((looking-at LaTeX-trailer-start) 1)
228 ((TeX-look-at TeX-outline-extra)
229 (max 1 (+ (TeX-look-at TeX-outline-extra)
230 (LaTeX-outline-offset))))
231 (t
232 (save-excursion
233 (skip-chars-forward " \t")
234 (forward-char 1)
235 (cond ((looking-at "appendix") 1)
236 ((looking-at "documentstyle") 1)
237 ((looking-at "documentclass") 1)
238 ((TeX-look-at LaTeX-section-list)
239 (max 1 (+ (TeX-look-at LaTeX-section-list)
240 (LaTeX-outline-offset))))
241 (t
242 (error "Unrecognized header")))))))
243
244 (add-hook 'TeX-remove-style-hook
245 (function (lambda () (setq LaTeX-largest-level nil))))
246
247 (defvar LaTeX-section-hook
248 '(LaTeX-section-heading
249 LaTeX-section-title
250 ;; LaTeX-section-toc ; Most people won't want this
251 LaTeX-section-section
252 LaTeX-section-label)
253 "*List of hooks to run when a new section is inserted.
254
255 The following variables are set before the hooks are run
256
257 level - numeric section level, see the documentation of `LaTeX-section'.
258 name - name of the sectioning command, derived from `level'.
259 title - The title of the section, default to an empty string.
260 toc - Entry for the table of contents list, default nil.
261 done-mark - Position of point afterwards, default nil (meaning end).
262
263 The following standard hook exist -
264
265 LaTeX-section-heading: Query the user about the name of the
266 sectioning command. Modifies `level' and `name'.
267
268 LaTeX-section-title: Query the user about the title of the
269 section. Modifies `title'.
270
271 LaTeX-section-toc: Query the user for the toc entry. Modifies
272 `toc'.
273
274 LaTeX-section-section: Insert LaTeX section command according to
275 `name', `title', and `toc'. If `toc' is nil, no toc entry is
276 enserted. If `toc' or `title' are empty strings, `done-mark' will be
277 placed at the point they should be inserted.
278
279 LaTeX-section-label: Insert a label after the section command.
280 Controled by the variable `LaTeX-section-label'.
281
282 To get a full featured LaTeX-section command, insert
283
284 (setq LaTeX-section-hook
285 '(LaTeX-section-heading
286 LaTeX-section-title
287 LaTeX-section-toc
288 LaTeX-section-section
289 LaTeX-section-label))
290
291 in your .emacs file.")
292
293 (defvar LaTeX-section-label
294 '(("chapter" . "cha:")
295 ("section" . "sec:")
296 ("subsection" . "sec:"))
297 "*Default prefix when asking for a label.
298
299 If it is a string, it it used unchanged for all kinds of sections.
300 If it is nil, no label is inserted.
301 If it is a list, the list is searched for a member whose car is equal
302 to the name of the sectioning command being inserted. The cdr is then
303 used as the prefix. If the name is not found, or if the cdr is nil,
304 no label is inserted.")
305
306 ;;; Section Hooks.
307
308 (defun LaTeX-section-heading ()
309 "Hook to prompt for LaTeX section name.
310 Insert this hook into LaTeX-section-hook to allow the user to change
311 the name of the sectioning command inserted with M-x LaTeX-section."
312 (let ((string (completing-read
313 (concat "Select level: (default " name ") ")
314 LaTeX-section-list
315 nil nil nil)))
316 ; Update name
317 (if (not (zerop (length string)))
318 (setq name string))
319 ; Update level
320 (setq level (LaTeX-section-level name))))
321
322 (defun LaTeX-section-title ()
323 "Hook to prompt for LaTeX section title.
324 Insert this hook into LaTeX-section-hook to allow the user to change
325 the title of the section inserted with M-x LaTeX-section."
326 (setq title (read-string "What title: ")))
327
328 (defun LaTeX-section-toc ()
329 "Hook to prompt for the LaTeX section entry in the table of content .
330 Insert this hook into LaTeX-section-hook to allow the user to insert
331 a different entry for the section in the table of content."
332 (setq toc (read-string "Toc Entry: "))
333 (if (zerop (length toc))
334 (setq toc nil)))
335
336 (defun LaTeX-section-section ()
337 "Hook to insert LaTeX section command into the file.
338 Insert this hook into LaTeX-section-hook after those hooks which sets
339 the `name', `title', and `toc' variables, but before those hooks which
340 assumes the section already is inserted."
341 (insert TeX-esc name)
342 (cond ((null toc))
343 ((zerop (length toc))
344 (insert LaTeX-optop)
345 (set-marker done-mark (point))
346 (insert LaTeX-optcl))
347 (t
348 (insert LaTeX-optop toc LaTeX-optcl)))
349 (insert TeX-grop)
350 (if (zerop (length title))
351 (set-marker done-mark (point)))
352 (insert title TeX-grcl)
353 (newline))
354
355 (defun LaTeX-section-label ()
356 "Hook to insert a label after the sectioning command.
357 Insert this hook into LaTeX-section-hook to prompt for a label to be
358 inserted after the sectioning command.
359
360 The beaviour of this hook is controled by LaTeX-section-label."
361 (and (LaTeX-label name)
362 (newline)))
363
364 ;;; Environments
365
366 (defvar LaTeX-default-environment "itemize"
367 "*The default environment when creating new ones with LaTeX-environment.")
368 (make-variable-buffer-local 'LaTeX-default-environment)
369
370 (defun LaTeX-environment (arg)
371 "Make LaTeX environment (\\begin{...}-\\end{...} pair).
372 With optional ARG, modify current environment.
373
374 It may be customized with the following variables:
375
376 LaTeX-default-environment Your favorite environment.
377 LaTeX-default-style Your favorite document style.
378 LaTeX-default-options Your favorite document style options.
379 LaTeX-float Where you want figures and tables to float.
380 LaTeX-table-label Your prefix to labels in tables.
381 LaTeX-figure-label Your prefix to labels in figures.
382 LaTeX-default-format Format for array and tabular.
383 LaTeX-default-position Position for array and tabular."
384
385 (interactive "*P")
386 (let ((environment (completing-read (concat "Environment type: (default "
387 (if (TeX-near-bobp)
388 "document"
389 LaTeX-default-environment)
390 ") ")
391 (LaTeX-environment-list))))
392 ;; Get default
393 (cond ((and (zerop (length environment))
394 (TeX-near-bobp))
395 (setq environment "document"))
396 ((zerop (length environment))
397 (setq environment LaTeX-default-environment))
398 (t
399 (setq LaTeX-default-environment environment)))
400
401 (let ((entry (assoc environment (LaTeX-environment-list))))
402 (if (null entry)
403 (LaTeX-add-environments (list environment)))
404
405 (if arg
406 (LaTeX-modify-environment environment)
407 (LaTeX-environment-menu environment)))))
408
409 (defun LaTeX-environment-menu (environment)
410 ;; Insert ENVIRONMENT around point or region.
411 (let ((entry (assoc environment (LaTeX-environment-list))))
412 (cond ((not (and entry (nth 1 entry)))
413 (LaTeX-insert-environment environment))
414 ((numberp (nth 1 entry))
415 (let ((count (nth 1 entry))
416 (args ""))
417 (while (> count 0)
418 (setq args (concat args TeX-grop TeX-grcl))
419 (setq count (- count 1)))
420 (LaTeX-insert-environment environment args)))
421 ((stringp (nth 1 entry))
422 (let ((prompts (cdr entry))
423 (args ""))
424 (while prompts
425 (setq args (concat args
426 TeX-grop
427 (read-from-minibuffer (concat (car prompts)
428 ": "))
429 TeX-grcl))
430 (setq prompts (cdr prompts)))
431 (LaTeX-insert-environment environment args)))
432 (t
433 (apply (nth 1 entry) environment (nthcdr 2 entry))))))
434
435 (defun LaTeX-close-environment ()
436 "Creates an \\end{...} to match the current environment."
437 (interactive "*")
438 (if (> (point)
439 (save-excursion
440 (beginning-of-line)
441 (skip-chars-forward " \t")
442 (point)))
443 (insert "\n"))
444 (insert "\\end{" (LaTeX-current-environment 1) "}")
445 (LaTeX-indent-line)
446 (if (not (looking-at "[ \t]*$"))
447 (insert "\n")
448 (let ((next-line-add-newlines t))
449 (next-line 1)
450 (beginning-of-line)))
451 (LaTeX-indent-line))
452
453 (autoload 'outline-flag-region "outline")
454
455 (defun LaTeX-hide-environment ()
456 "Hide current LaTeX environment using selective display."
457 (interactive)
458 (outline-flag-region (save-excursion (LaTeX-find-matching-begin) (point))
459 (save-excursion (LaTeX-find-matching-end) (point))
460 ?\r))
461
462 (defun LaTeX-show-environment ()
463 "Show current LaTeX environment."
464 (interactive)
465 (outline-flag-region (save-excursion (LaTeX-find-matching-begin) (point))
466 (save-excursion (LaTeX-find-matching-end) (point))
467 ?\n))
468
469 (defun LaTeX-insert-environment (environment &optional extra)
470 "Insert environment of type ENV, with optional argument EXTRA."
471 (if (and (TeX-active-mark)
472 (not (eq (mark) (point))))
473 (progn
474 (if (< (mark) (point))
475 (exchange-point-and-mark))
476 (or (TeX-looking-at-backward "^[ \t]*")
477 (newline))
478 (insert TeX-esc "begin" TeX-grop environment TeX-grcl)
479 (LaTeX-indent-line)
480 (if extra (insert extra))
481 (newline)
482 (goto-char (mark))
483 (or (TeX-looking-at-backward "^[ \t]*")
484 (newline))
485 (insert TeX-esc "end" TeX-grop environment TeX-grcl)
486 (or (looking-at "[ \t]*$")
487 (save-excursion (newline-and-indent)))
488 (LaTeX-indent-line)
489 (end-of-line 0)
490 (or (assoc environment LaTeX-indent-environment-list)
491 (LaTeX-fill-environment nil)))
492 (or (TeX-looking-at-backward "^[ \t]*")
493 (newline))
494 (insert TeX-esc "begin" TeX-grop environment TeX-grcl)
495 (LaTeX-indent-line)
496 (if extra (insert extra))
497 (newline-and-indent)
498 (newline)
499 (insert TeX-esc "end" TeX-grop environment TeX-grcl)
500 (or (looking-at "[ \t]*$")
501 (save-excursion (newline-and-indent)))
502 (LaTeX-indent-line)
503 (end-of-line 0)))
504
505 (defun LaTeX-modify-environment (environment)
506 ;; Modify current environment.
507 (save-excursion
508 (LaTeX-find-matching-end)
509 (re-search-backward (concat (regexp-quote TeX-esc)
510 "end"
511 (regexp-quote TeX-grop)
512 " *\\([a-zA-Z*]*\\)"
513 (regexp-quote TeX-grcl))
514 (save-excursion (beginning-of-line 1) (point)))
515 (replace-match (concat TeX-esc "end" TeX-grop environment TeX-grcl) t t)
516 (beginning-of-line 1)
517 (LaTeX-find-matching-begin)
518 (re-search-forward (concat (regexp-quote TeX-esc)
519 "begin"
520 (regexp-quote TeX-grop)
521 " *\\([a-zA-Z*]*\\)"
522 (regexp-quote TeX-grcl))
523 (save-excursion (end-of-line 1) (point)))
524 (replace-match (concat TeX-esc "begin" TeX-grop environment TeX-grcl) t t)))
525
526 (defun LaTeX-current-environment (&optional arg)
527 "Return the name (a string) of the enclosing LaTeX environment.
528 With optional ARG>=1, find that outer level."
529 (setq arg (if arg (if (< arg 1) 1 arg) 1))
530 (save-excursion
531 (while (and
532 (/= arg 0)
533 (re-search-backward
534 (concat (regexp-quote TeX-esc) "begin" (regexp-quote TeX-grop)
535 "\\|"
536 (regexp-quote TeX-esc) "end" (regexp-quote TeX-grop))
537 nil t 1))
538 (cond ((TeX-in-comment)
539 (beginning-of-line 1))
540 ((looking-at (concat (regexp-quote TeX-esc)
541 "end" (regexp-quote TeX-grop)))
542 (setq arg (1+ arg)))
543 (t
544 (setq arg (1- arg)))))
545 (if (/= arg 0)
546 "document"
547 (search-forward TeX-grop)
548 (let ((beg (point)))
549 (search-forward TeX-grcl)
550 (backward-char 1)
551 (buffer-substring beg (point))))))
552
553 (defun TeX-near-bobp ()
554 ;; Return t iff there's nothing but whitespace between (bob) and (point).
555 (save-excursion
556 (skip-chars-backward " \t\n")
557 (bobp)))
558
559 ;;; Environment Hooks
560
561 (defvar LaTeX-document-style-hook nil
562 "List of hooks to run when inserting a document style environment.
563
564 To insert a hook here, you must insert it in the appropiate style file.")
565
566 (defun LaTeX-env-document (&optional ignore)
567 "Create new LaTeX document."
568
569 (TeX-insert-macro (if (string-equal LaTeX-version "2")
570 "documentstyle"
571 "documentclass"))
572
573 (newline 3)
574 (end-of-line 0)
575 (LaTeX-insert-environment "document")
576 (run-hooks 'LaTeX-document-style-hook)
577 (setq LaTeX-document-style-hook nil))
578
579 (defvar LaTeX-float "htbp"
580 "*Default float when creating figure and table environments.
581 Set to nil if you don't want any float.")
582 (make-variable-buffer-local 'LaTeX-float)
583
584 (defvar LaTeX-label-function nil
585 "*A function inserting a label at point.
586 Sole argument of the function is the environment. The function has to return
587 the label inserted, or nil if no label was inserted.")
588
589 (defvar LaTeX-figure-label "fig:"
590 "*Default prefix to figure labels.")
591 (make-variable-buffer-local 'LaTeX-figure-label)
592
593 (defvar LaTeX-table-label "tab:"
594 "*Default prefix to table labels.")
595 (make-variable-buffer-local 'LaTeX-table-label)
596
597 (defvar LaTeX-default-format ""
598 "Specifies the default format string for array and tabular environments.")
599 (make-variable-buffer-local 'LaTeX-default-format)
600
601 (defvar LaTeX-default-position ""
602 "Specifies the default position string for array and tabular environments.")
603 (make-variable-buffer-local 'LaTeX-default-position)
604
605 (defun LaTeX-env-item (environment)
606 "Insert ENVIRONMENT and the first item."
607 (LaTeX-insert-environment environment)
608 (if (TeX-active-mark)
609 (progn
610 (LaTeX-find-matching-begin)
611 (end-of-line 1))
612 (end-of-line 0))
613 (delete-char 1)
614 (delete-horizontal-space)
615 (LaTeX-insert-item))
616
617 (defun LaTeX-label (environment)
618 "Insert a label for ENVIRONMENT at point.
619 If LaTeX-label-function is a valid function, LaTeX label will transfer the
620 job to this function."
621 (let (label)
622 (if (and (boundp 'LaTeX-label-function)
623 LaTeX-label-function
624 (fboundp LaTeX-label-function))
625
626 (setq label (funcall LaTeX-label-function environment))
627 (let ((prefix
628 (cond
629 ((string= "figure" environment) LaTeX-figure-label)
630 ((string= "table" environment) LaTeX-table-label)
631 ((assoc environment LaTeX-section-list)
632 (cond
633 ((stringp LaTeX-section-label) LaTeX-section-label)
634 ((and (listp LaTeX-section-label)
635 (assoc environment LaTeX-section-label))
636 (cdr (assoc environment LaTeX-section-label)))
637 (t nil)))
638 (t ""))))
639 (if prefix
640 (progn
641 (setq label (read-string "What label: " prefix))
642 (if (string= prefix label)
643 (setq label nil) ; No label eneterd
644 (insert TeX-esc "label" TeX-grop label TeX-grcl)))))
645 (if label
646 (progn
647 (LaTeX-add-labels label)
648 label)
649 nil))))
650
651
652 (defun LaTeX-env-figure (environment)
653 "Create ENVIRONMENT with \\label and \\caption commands."
654 (let ((float (read-string "Float to: " LaTeX-float))
655 (caption (read-string "Caption: "))
656 (center (y-or-n-p "Center: ")))
657
658 (setq LaTeX-float (if (zerop (length float))
659 LaTeX-float
660 float))
661
662 (LaTeX-insert-environment environment
663 (and LaTeX-float
664 (concat LaTeX-optop
665 LaTeX-float
666 LaTeX-optcl)))
667
668 (if center
669 (progn
670 (LaTeX-insert-environment "center")))
671
672 (newline-and-indent)
673 (LaTeX-label environment)
674 (end-of-line 0)
675 (LaTeX-indent-line)
676
677 (if (zerop (length caption))
678 ()
679 ;; NOTE: Caption is _inside_ center because that looks best typeset.
680 (newline-and-indent)
681 (insert TeX-esc "caption" TeX-grop caption TeX-grcl)
682 (end-of-line 0)
683 (LaTeX-indent-line))
684
685 (if (string= environment "table") (LaTeX-env-array "tabular"))))
686
687 (defun LaTeX-env-array (environment)
688 "Insert ENVIRONMENT with position and column specifications
689 like array and tabular."
690 (let ((pos (read-string "Position: "))
691 (fmt (read-string "Format: " LaTeX-default-format)))
692 (setq LaTeX-default-position pos)
693 (setq LaTeX-default-format fmt)
694 (LaTeX-insert-environment environment
695 (concat
696 (if (not (zerop (length pos)))
697 (format "[%s]" pos))
698 (format "{%s}" fmt)))
699 (end-of-line 0)
700 (next-line 1)
701 (delete-horizontal-space)))
702
703 (defun LaTeX-env-label (environment)
704 "Insert ENVIRONMENT and prompt for label."
705 (LaTeX-insert-environment environment)
706 (and (LaTeX-label environment)
707 (newline-and-indent)))
708
709 (defun LaTeX-env-list (environment)
710 "Insert ENVIRONMENT and the first item."
711 (let ((label (read-string "Default Label: ")))
712 (LaTeX-insert-environment environment
713 (format "{%s}{}" label))
714 (end-of-line 0)
715 (delete-char 1)
716 (delete-horizontal-space))
717 (LaTeX-insert-item))
718
719 (defun LaTeX-env-minipage (environment)
720 "Create new LaTeX minipage."
721 (let ((pos (read-string "Position: " LaTeX-default-position))
722 (width (read-string "Width: ")))
723 (setq LaTeX-default-position pos)
724 (if (zerop (length width))
725 (setq width "4cm"))
726 (LaTeX-insert-environment environment
727 (concat (if (not (zerop (length pos)))
728 (format "[%s]" pos))
729 (format "{%s}" width)))
730 (end-of-line 0)
731 (next-line 1)
732 (delete-horizontal-space)))
733
734 (defun LaTeX-env-tabular* (environment)
735 "Insert ENVIRONMENT with width, position and column specifications."
736 (let ((width (read-string "Width: "))
737 (pos (read-string "Position: " LaTeX-default-position))
738 (fmt (read-string "Format: " LaTeX-default-format)))
739 (setq LaTeX-default-position pos)
740 (setq LaTeX-default-format fmt)
741 (LaTeX-insert-environment environment
742 (concat
743 (if (not (zerop (length width)))
744 (format "{%s}" width))
745 (if (not (zerop (length pos)))
746 (format "[%s]" pos))
747 (format "{%s}" fmt)))
748 (end-of-line 0)
749 (next-line 1)
750 (delete-horizontal-space)))
751
752 (defun LaTeX-env-picture (environment)
753 "Insert ENVIRONMENT with width, height specifications."
754 (let ((width (read-string "Width: "))
755 (height (read-string "Height: "))
756 (x-offset (read-string "X Offset: "))
757 (y-offset (read-string "Y Offset: ")))
758 (if (zerop (length x-offset))
759 (setq x-offset "0"))
760 (if (zerop (length y-offset))
761 (setq y-offset "0"))
762 (LaTeX-insert-environment environment
763 (concat (format "(%s,%s)" width height)
764 (if (not (and (string= x-offset "0")
765 (string= y-offset "0")))
766 (format "(%s,%s)" x-offset y-offset))))
767
768 (end-of-line 0)
769 (next-line 1)
770 (delete-horizontal-space)))
771
772 (defun LaTeX-env-bib (environment)
773 "Insert ENVIRONMENT with label for bibitem."
774 (LaTeX-insert-environment environment
775 (concat TeX-grop
776 (read-string "Label for BibItem: " "99")
777 TeX-grcl))
778 (end-of-line 0)
779 (delete-char 1)
780 (delete-horizontal-space)
781 (LaTeX-insert-item))
782
783 ;;; Item hooks
784
785 (defvar LaTeX-item-list nil
786 "An list of environments where items have a special syntax.
787 The cdr is the name of the function, used to insert this kind of items.")
788
789 (defun LaTeX-insert-item ()
790 "Insert a new item in an environment.
791 You may use LaTeX-item-list to change the routines used to insert the item."
792 (interactive "*")
793 (let ((environment (LaTeX-current-environment)))
794 (newline)
795 (if (assoc environment LaTeX-item-list)
796 (funcall (cdr (assoc environment LaTeX-item-list)))
797 (TeX-insert-macro "item"))
798 (LaTeX-indent-line)))
799
800 (defun LaTeX-item-argument ()
801 "Insert a new item with an optional argument."
802 (let ((TeX-arg-item-label-p t))
803 (TeX-insert-macro "item")))
804
805 (defun LaTeX-item-bib ()
806 "Insert a new bibitem."
807 (TeX-insert-macro "bibitem"))
808
809 ;;; Parser
810
811 (defvar LaTeX-auto-minimal-regexp-list
812 '(("\\\\document\\(style\\|class\\)\
813 \\(\\[\\(\\([^#\\\\\\.%]\\|%[^\n\r]*[\n\r]\\)+\\)\\]\\)?\
814 {\\([^#\\\\\\.\n\r]+\\)}"
815 (3 5 1) LaTeX-auto-style))
816 "Minimal list of regular expressions matching LaTeX macro definitions.")
817
818 (defvar LaTeX-auto-label-regexp-list
819 '(("\\\\label{\\([^\n\r%\\{}]+\\)}" 1 LaTeX-auto-label))
820 "List of regular expression matching LaTeX labels only.")
821
822 (defvar LaTeX-auto-regexp-list
823 (append
824 '(("\\\\newcommand{?\\\\\\([a-zA-Z]+\\)}?\\[\\([0-9]+\\)\\]\
825 \\[\\([^\]\\\\\n\r]+\\)\\]"
826 (1 2 3) LaTeX-auto-optional)
827 ("\\\\newcommand{?\\\\\\([a-zA-Z]+\\)}?\\[\\([0-9]+\\)\\]"
828 (1 2) LaTeX-auto-arguments)
829 ("\\\\newcommand{?\\\\\\([a-zA-Z]+\\)}?" 1 TeX-auto-symbol)
830 ("\\\\newenvironment{?\\([a-zA-Z]+\\)}?\\[\\([0-9]+\\)\\]\\["
831 1 LaTeX-auto-environment)
832 ("\\\\newenvironment{?\\([a-zA-Z]+\\)}?\\[\\([0-9]+\\)\\]"
833 (1 2) LaTeX-auto-env-args)
834 ("\\\\newenvironment{?\\([a-zA-Z]+\\)}?" 1 LaTeX-auto-environment)
835 ("\\\\newtheorem{\\([a-zA-Z]+\\)}" 1 LaTeX-auto-environment)
836 ("\\\\input{\\(\\.*[^#}%\\\\\\.\n\r]+\\)\\(\\.[^#}%\\\\\\.\n\r]+\\)?}"
837 1 TeX-auto-file)
838 ("\\\\include{\\(\\.*[^#}%\\\\\\.\n\r]+\\)\\(\\.[^#}%\\\\\\.\n\r]+\\)?}"
839 1 TeX-auto-file)
840 ("\\\\usepackage\\(\\[[^\]\\\\]*\\]\\)?\
841 {\\(\\([^#}\\\\\\.%]\\|%[^\n\r]*[\n\r]\\)+\\)}"
842 (2) LaTeX-auto-style)
843 ("\\\\bibitem{\\([a-zA-Z][^, \n\r\t%\"#'()={}]*\\)}" 1 LaTeX-auto-bibitem)
844 ("\\\\bibitem\\[[^][\n\r]+\\]{\\([a-zA-Z][^, \n\r\t%\"#'()={}]*\\)}"
845 1 LaTeX-auto-bibitem)
846 ("\\\\bibliography{\\([^#}\\\\\n\r]+\\)}" 1 LaTeX-auto-bibliography))
847 LaTeX-auto-label-regexp-list
848 LaTeX-auto-minimal-regexp-list)
849 "List of regular expression matching common LaTeX macro definitions.")
850
851 (defun LaTeX-auto-prepare ()
852 ;; Prepare for LaTeX parsing.
853 (setq LaTeX-auto-arguments nil
854 LaTeX-auto-optional nil
855 LaTeX-auto-env-args nil
856 LaTeX-auto-style nil
857 LaTeX-auto-end-symbol nil))
858
859 (add-hook 'TeX-auto-prepare-hook 'LaTeX-auto-prepare)
860
861 (defun LaTeX-auto-cleanup ()
862 ;; Cleanup after LaTeX parsing.
863
864 ;; Cleanup BibTeX files
865 (setq LaTeX-auto-bibliography
866 (apply 'append (mapcar (function (lambda (arg)
867 (TeX-split-string "," arg)))
868 LaTeX-auto-bibliography)))
869
870 ;; Cleanup document styles and packages
871 (if (null LaTeX-auto-style)
872 ()
873 (while LaTeX-auto-style
874 (let* ((entry (car LaTeX-auto-style))
875 (options (nth 0 entry))
876 (style (nth 1 entry))
877 (class (nth 2 entry)))
878
879 ;; Next document style.
880 (setq LaTeX-auto-style (cdr LaTeX-auto-style))
881
882 ;; Get the options.
883 (setq options (TeX-split-string
884 "\\([ \t\r\n]\\|%[^\n\r]*[\n\r]\\|,\\)+"
885 options))
886
887 ;; Strip empty options.
888 (if (string-equal (car options) "")
889 (setq options (cdr options)))
890 (let ((index options))
891 (while (cdr-safe index)
892 (if (string-equal (car (cdr index)) "")
893 (setcdr index (cdr (cdr index)))
894 (setq index (cdr index)))))
895
896 ;; Add them, to the style list.
897 (setq TeX-auto-file (append options TeX-auto-file))
898
899 ;; The second argument if present is a normal style file.
900 (if (null style)
901 ()
902 (setq TeX-auto-file (cons style TeX-auto-file))
903
904 ;; And a special "art10" style file combining style and size.
905 (setq TeX-auto-file
906 (cons (concat
907 (cond ((string-equal "article" style)
908 "art")
909 ((string-equal "book" style)
910 "bk")
911 ((string-equal "report" style)
912 "rep")
913 ((string-equal "jarticle" style)
914 "jart")
915 ((string-equal "jbook" style)
916 "jbk")
917 ((string-equal "jreport" style)
918 "jrep")
919 ((string-equal "j-article" style)
920 "j-art")
921 ((string-equal "j-book" style)
922 "j-bk")
923 ((string-equal "j-report" style )
924 "j-rep")
925 (t style))
926 (cond ((member "11pt" options)
927 "11")
928 ((member "12pt" options)
929 "12")
930 (t
931 "10")))
932 TeX-auto-file)))
933
934 ;; The third argument if "class" indicates LaTeX2e features.
935 (cond ((equal class "class")
936 (setq TeX-auto-file (cons "latex2e" TeX-auto-file)))
937 ((equal class "style")
938 (setq TeX-auto-file (cons "latex2" TeX-auto-file)))))))
939
940 ;; Cleanup optional arguments
941 (mapcar (function (lambda (entry)
942 (setq TeX-auto-symbol
943 (cons (list (nth 0 entry)
944 (string-to-int (nth 1 entry)))
945 TeX-auto-symbol))))
946 LaTeX-auto-arguments)
947
948 ;; Cleanup default optional arguments
949 (mapcar (function (lambda (entry)
950 (setq TeX-auto-symbol
951 (cons (list (nth 0 entry)
952 (vector "argument")
953 (1- (string-to-int (nth 1 entry))))
954 TeX-auto-symbol))))
955 LaTeX-auto-optional)
956
957 ;; Cleanup environments arguments
958 (mapcar (function (lambda (entry)
959 (setq LaTeX-auto-environment
960 (cons (list (nth 0 entry)
961 (string-to-int (nth 1 entry)))
962 LaTeX-auto-environment))))
963 LaTeX-auto-env-args)
964
965 ;; Cleanup use of def to add environments
966 ;; NOTE: This uses an O(N^2) algorithm, while an O(N log N)
967 ;; algorithm is possible.
968 (mapcar (function (lambda (symbol)
969 (if (not (TeX-member symbol TeX-auto-symbol 'equal))
970 ;; No matching symbol, insert in list
971 (setq TeX-auto-symbol
972 (cons (concat "end" symbol) TeX-auto-symbol))
973 ;; Matching symbol found, remove from list
974 (if (equal (car TeX-auto-symbol) symbol)
975 ;; Is it the first symbol?
976 (setq TeX-auto-symbol (cdr TeX-auto-symbol))
977 ;; Nope! Travel the list
978 (let ((list TeX-auto-symbol))
979 (while (consp (cdr list))
980 ;; Until we find it.
981 (if (equal (car (cdr list)) symbol)
982 ;; Then remove it.
983 (setcdr list (cdr (cdr list))))
984 (setq list (cdr list)))))
985 ;; and add the symbol as an environment.
986 (setq LaTeX-auto-environment
987 (cons symbol LaTeX-auto-environment)))))
988 LaTeX-auto-end-symbol))
989
990 (add-hook 'TeX-auto-cleanup-hook 'LaTeX-auto-cleanup)
991
992 (TeX-auto-add-type "label" "LaTeX")
993 (TeX-auto-add-type "bibitem" "LaTeX")
994 (TeX-auto-add-type "environment" "LaTeX")
995 (TeX-auto-add-type "bibliography" "LaTeX" "bibliographies")
996
997 (fset 'LaTeX-add-bibliographies-auto
998 (symbol-function 'LaTeX-add-bibliographies))
999 (defun LaTeX-add-bibliographies (&rest bibliographies)
1000 "Add BIBLIOGRAPHIES to the list of known bibliographies and style files."
1001 (apply 'LaTeX-add-bibliographies-auto bibliographies)
1002 (apply 'TeX-run-style-hooks bibliographies))
1003
1004 (fset 'LaTeX-add-environments-auto
1005 (symbol-function 'LaTeX-add-environments))
1006 (defun LaTeX-add-environments (&rest environments)
1007 "Add ENVIRONMENTS to the list of known environments."
1008 (apply 'LaTeX-add-environments-auto environments)
1009 (setq LaTeX-menu-changed t))
1010
1011 ;;; BibTeX
1012
1013 ;;;###autoload
1014 (defun BibTeX-auto-store ()
1015 "This function should be called from bibtex-mode-hook.
1016 It will setup BibTeX to store keys in an auto file."
1017 ;; We want this to be early in the list, so we do not
1018 ;; add it before we enter BibTeX mode the first time.
1019 (if (boundp 'local-write-file-hooks)
1020 (add-hook 'local-write-file-hooks 'TeX-safe-auto-write)
1021 (add-hook 'write-file-hooks 'TeX-safe-auto-write))
1022 (make-local-variable 'TeX-auto-update)
1023 (setq TeX-auto-update 'BibTeX)
1024 (make-local-variable 'TeX-auto-untabify)
1025 (setq TeX-auto-untabify nil)
1026 (make-local-variable 'TeX-auto-parse-length)
1027 (setq TeX-auto-parse-length 999999)
1028 (make-local-variable 'TeX-auto-regexp-list)
1029 (setq TeX-auto-regexp-list BibTeX-auto-regexp-list))
1030
1031 (defvar BibTeX-auto-regexp-list
1032 '(("@[Ss][Tt][Rr][Ii][Nn][Gg]" 1 ignore)
1033 ("@[a-zA-Z]+[{(][ \t]*\\([a-zA-Z][^, \n\r\t%\"#'()={}]*\\)"
1034 1 LaTeX-auto-bibitem))
1035 "List of regexp-list expressions matching BibTeX items.")
1036
1037 ;;; Macro Argument Hooks
1038
1039 (defun TeX-arg-conditional (optional expr then else)
1040 "Implement if EXPR THEN ELSE.
1041
1042 If EXPR evaluate to true, parse THEN as an argument list, else parse
1043 ELSE as an argument list."
1044 (TeX-parse-arguments (if (eval expr) then else)))
1045
1046 (defun TeX-arg-free (optional &optional &rest args)
1047 "Parse its arguments but use no braces when they are inserted."
1048 (let ((< "")
1049 (> ""))
1050 (if (equal (length args) 1)
1051 (TeX-parse-argument optional (car args))
1052 (TeX-parse-argument optional args))))
1053
1054 (defun TeX-arg-literal (optional &optional &rest args)
1055 "Insert its arguments into the buffer.
1056 Used for specifying extra syntax for a macro."
1057 (apply 'insert args))
1058
1059 (defun TeX-arg-eval (optional &rest args)
1060 "Evaluate args and insert value in buffer."
1061 (TeX-argument-insert (eval args) optional))
1062
1063 (defun TeX-arg-label (optional &optional prompt definition)
1064 "Prompt for a label completing with known labels."
1065 (let ((label (completing-read (TeX-argument-prompt optional prompt "Key")
1066 (LaTeX-label-list))))
1067 (if (and definition (not (string-equal "" label)))
1068 (LaTeX-add-labels label))
1069 (TeX-argument-insert label optional optional)))
1070
1071 (defun TeX-arg-macro (optional &optional prompt definition)
1072 "Prompt for a TeX macro with completion."
1073 (let ((macro (completing-read (TeX-argument-prompt optional prompt
1074 (concat "Macro: "
1075 TeX-esc)
1076 t)
1077 (TeX-symbol-list))))
1078 (if (and definition (not (string-equal "" macro)))
1079 (TeX-add-symbols macro))
1080 (TeX-argument-insert macro optional TeX-esc)))
1081
1082 (defun TeX-arg-environment (optional &optional prompt definition)
1083 "Prompt for a LaTeX environment with completion."
1084 (let ((environment (completing-read (TeX-argument-prompt optional prompt
1085 "Environment")
1086 (TeX-symbol-list))))
1087 (if (and definition (not (string-equal "" environment)))
1088 (LaTeX-add-environments environment))
1089
1090 (TeX-argument-insert environment optional)))
1091
1092 (defun TeX-arg-cite (optional &optional prompt definition)
1093 "Prompt for a BibTeX citation with completion."
1094 (setq prompt (concat (if optional "(Optional) " "")
1095 (if prompt prompt "Add key")
1096 ": (default none) "))
1097 (let ((items (multi-prompt "," t prompt (LaTeX-bibitem-list))))
1098 (apply 'LaTeX-add-bibitems items)
1099 (TeX-argument-insert (mapconcat 'identity items ",") optional optional)))
1100
1101 (defun TeX-arg-counter (optional &optional prompt definition)
1102 "Prompt for a LaTeX counter."
1103 ;; Completion not implemented yet.
1104 (TeX-argument-insert
1105 (read-string (TeX-argument-prompt optional prompt "Counter"))
1106 optional))
1107
1108 (defun TeX-arg-savebox (optional &optional prompt definition)
1109 "Prompt for a LaTeX savebox."
1110 ;; Completion not implemented yet.
1111 (TeX-argument-insert
1112 (read-string (TeX-argument-prompt optional prompt
1113 (concat "Savebox: " TeX-esc)
1114 t))
1115 optional TeX-esc))
1116
1117 (defun TeX-arg-file (optional &optional prompt)
1118 "Prompt for a filename in the current directory."
1119 (TeX-argument-insert (read-file-name (TeX-argument-prompt optional
1120 prompt "File")
1121 "" "" nil)
1122 optional))
1123
1124 (defun TeX-arg-define-label (optional &optional prompt)
1125 "Prompt for a label completing with known labels."
1126 (TeX-arg-label optional prompt t))
1127
1128 (defun TeX-arg-define-macro (optional &optional prompt)
1129 "Prompt for a TeX macro with completion."
1130 (TeX-arg-macro optional prompt t))
1131
1132 (defun TeX-arg-define-environment (optional &optional prompt)
1133 "Prompt for a LaTeX environment with completion."
1134 (TeX-arg-environment optional prompt t))
1135
1136 (defun TeX-arg-define-cite (optional &optional prompt)
1137 "Prompt for a BibTeX citation."
1138 (TeX-arg-cite optional prompt t))
1139
1140 (defun TeX-arg-define-counter (optional &optional prompt)
1141 "Prompt for a LaTeX counter."
1142 (TeX-arg-counter optional prompt t))
1143
1144 (defun TeX-arg-define-savebox (optional &optional prompt)
1145 "Prompt for a LaTeX savebox."
1146 (TeX-arg-savebox optional prompt t))
1147
1148 (defvar LaTeX-style-list '(("book")
1149 ("article")
1150 ("letter")
1151 ("slides")
1152 ("report"))
1153 "*List of document styles.")
1154
1155 (make-variable-buffer-local 'LaTeX-style-list)
1156
1157 (defun TeX-arg-document (optional &optional ignore)
1158 "Insert arguments to documentstyle and documentclass."
1159 (let ((style (completing-read
1160 (concat "Document style: (default " LaTeX-default-style ") ")
1161 LaTeX-style-list))
1162 (options (read-string "Options: "
1163 (if (stringp LaTeX-default-options)
1164 LaTeX-default-options
1165 (mapconcat 'identity
1166 LaTeX-default-options
1167 ",")))))
1168 (if (zerop (length style))
1169 (setq style LaTeX-default-style))
1170 (if (not (zerop (length options)))
1171 (insert LaTeX-optop options LaTeX-optcl))
1172 (insert TeX-grop style TeX-grcl))
1173
1174 ;; remove old information
1175 (TeX-remove-style)
1176
1177 ;; defined in individual style hooks
1178 (TeX-update-style))
1179
1180 (defvar TeX-global-input-files nil
1181 "*List of the non-local TeX input files.
1182
1183 Initialized once at the first time you prompt for an input file.
1184 May be reset with `C-u \\[TeX-normal-mode]'.")
1185
1186 (defun TeX-arg-input-file (optionel &optional prompt local)
1187 "Prompt for a tex or sty file.
1188
1189 First optional argument is the promt, the second is a flag.
1190 If the flag is set, only complete with local files."
1191 (if (or TeX-global-input-files local)
1192 ()
1193 (message "Searching for files...")
1194 (setq TeX-global-input-files
1195 (mapcar 'list (TeX-search-files (append TeX-macro-private
1196 TeX-macro-global)
1197 TeX-file-extensions t t))))
1198 (let ((file (if TeX-check-path
1199 (completing-read
1200 (TeX-argument-prompt optionel prompt "File")
1201 (append (mapcar 'list
1202 (TeX-search-files '(".")
1203 TeX-file-extensions
1204 t t))
1205 (if local
1206 nil
1207 TeX-global-input-files)))
1208 (read-file-name
1209 (TeX-argument-prompt optionel prompt "File")))))
1210 (if (null file)
1211 (setq file ""))
1212 (if (not (string-equal "" file))
1213 (TeX-run-style-hooks file))
1214 (TeX-argument-insert file optionel)))
1215
1216 (defvar BibTeX-global-style-files nil
1217 "*Association list of BibTeX style files.
1218
1219 Initialized once at the first time you prompt for an input file.
1220 May be reset with `C-u \\[TeX-normal-mode]'.")
1221
1222 (defun TeX-arg-bibstyle (optional &optional prompt)
1223 "Prompt for a BibTeX style file."
1224 (message "Searching for BibTeX styles...")
1225 (or BibTeX-global-style-files
1226 (setq BibTeX-global-style-files
1227 (mapcar 'list
1228 (TeX-search-files (append TeX-macro-private
1229 TeX-macro-global)
1230 BibTeX-style-extensions t t))))
1231
1232 (TeX-argument-insert
1233 (completing-read (TeX-argument-prompt optional prompt "BibTeX style")
1234 (append (mapcar 'list
1235 (TeX-search-files '(".")
1236 BibTeX-style-extensions
1237 t t))
1238 BibTeX-global-style-files))
1239 optional))
1240
1241 (defvar BibTeX-global-files nil
1242 "*Association list of BibTeX files.
1243
1244 Initialized once at the first time you prompt for an BibTeX file.
1245 May be reset with `C-u \\[TeX-normal-mode]'.")
1246
1247 (defun TeX-arg-bibliography (optional &optional prompt)
1248 "Prompt for a BibTeX database file."
1249 (message "Searching for BibTeX files...")
1250 (or BibTeX-global-files
1251 (setq BibTeX-global-files
1252 (mapcar 'list (TeX-search-files nil BibTeX-file-extensions t t))))
1253
1254 (let ((styles (multi-prompt
1255 "," t
1256 (TeX-argument-prompt optional prompt "BibTeX files")
1257 (append (mapcar 'list
1258 (TeX-search-files '(".")
1259 BibTeX-file-extensions
1260 t t))
1261 BibTeX-global-files))))
1262 (apply 'LaTeX-add-bibliographies styles)
1263 (TeX-argument-insert (mapconcat 'identity styles ",") optional)))
1264
1265 (defun TeX-arg-corner (optional &optional prompt)
1266 "Prompt for a LaTeX side or corner position with completion."
1267 (TeX-argument-insert
1268 (completing-read (TeX-argument-prompt optional prompt "Position")
1269 '(("") ("l") ("r") ("t") ("b") ("tl") ("tr") ("bl") ("br"))
1270 nil t)
1271 optional))
1272
1273 (defun TeX-arg-lr (optional &optional prompt)
1274 "Prompt for a LaTeX side with completion."
1275 (TeX-argument-insert
1276 (completing-read (TeX-argument-prompt optional prompt "Position")
1277 '(("") ("l") ("r"))
1278 nil t)
1279 optional))
1280
1281 (defun TeX-arg-tb (optional &optional prompt)
1282 "Prompt for a LaTeX side with completion."
1283 (TeX-argument-insert
1284 (completing-read (TeX-argument-prompt optional prompt "Position")
1285 '(("") ("t") ("b"))
1286 nil t)
1287 optional))
1288
1289 (defun TeX-arg-pagestyle (optional &optional prompt)
1290 "Prompt for a LaTeX pagestyle with completion."
1291 (TeX-argument-insert
1292 (completing-read (TeX-argument-prompt optional prompt "Pagestyle")
1293 '(("plain") ("empty") ("headings") ("myheadings")))
1294 optional))
1295
1296 (defun TeX-arg-verb (optional &optional ignore)
1297 "Prompt for delimiter and text."
1298 (let ((del (read-quoted-char "Delimiter: "))
1299 (text (read-from-minibuffer "Text: ")))
1300 (insert del text del)))
1301
1302 (defun TeX-arg-pair (optional first second)
1303 "Insert a pair of number, prompted by FIRST and SECOND.
1304
1305 The numbers are surounded by parenthesizes and separated with a
1306 comma."
1307 (insert "(" (read-string (concat first ": ")) ","
1308 (read-string (concat second ": ")) ")"))
1309
1310 (defun TeX-arg-size (optional)
1311 "Insert width and height as a pair."
1312 (TeX-arg-pair optional "Width" "Height"))
1313
1314 (defun TeX-arg-coordinate (optional)
1315 "Insert x and y coordinate as a pair."
1316 (TeX-arg-pair optional "X position" "Y position"))
1317
1318 (defconst TeX-braces-default-association
1319 '(("[" . "]")
1320 ("\\{" . "\\}")
1321 ("(" . ")")
1322 ("|" . "|")
1323 ("\\|" . "\\|")
1324 ("/" . "/")
1325 ("\\backslash" . "\\backslash")
1326 ("\\lfloor" . "\\rfloor")
1327 ("\\lceil" . "\\rceil")
1328 ("\\langle" . "\\rangle")))
1329
1330 (defvar TeX-braces-user-association nil
1331 "A list of your personal association of brace symbols for \\left and \\right
1332
1333 The car of each entry is the brace used with \\left,
1334 the cdr is the brace used with \\right.")
1335
1336 (defvar TeX-braces-association
1337 (append TeX-braces-user-association
1338 TeX-braces-default-association)
1339 "A list of association of brace symbols for \\left and \\right.
1340 The car of each entry is the brace used with \\left,
1341 the cdr is the brace used with \\right.")
1342
1343 (defvar TeX-left-right-braces
1344 '(("[") ("]") ("\\{") ("\\}") ("(") (")") ("|") ("\\|")
1345 ("/") ("\\backslash") ("\\lfloor") ("\\rfloor")
1346 ("\\lceil") ("\\rceil") ("\\langle") ("\\rangle")
1347 ("\\uparrow") ("\\Uparrow") ("\\downarrow") ("\\Downarrow")
1348 ("\\updownarrow") ("\\Updownarrow") ("."))
1349 "List of symbols which can follow the \\left or \\right command")
1350
1351 (defun TeX-arg-insert-braces (optional &optional prompt)
1352 (save-excursion
1353 (backward-word 1)
1354 (backward-char)
1355 (newline-and-indent)
1356 (beginning-of-line 0)
1357 (if (looking-at "^[ \t]*$")
1358 (progn (delete-horizontal-space)
1359 (delete-char 1))))
1360 (let ((left-brace (completing-read
1361 (TeX-argument-prompt optional prompt "Which brace")
1362 TeX-left-right-braces)))
1363 (insert left-brace)
1364 (newline-and-indent)
1365 (save-excursion
1366 (let ((right-brace (cdr (assoc left-brace
1367 TeX-braces-association))))
1368 (newline)
1369 (insert TeX-esc "right")
1370 (if (and TeX-arg-right-insert-p
1371 right-brace)
1372 (insert right-brace)
1373 (insert (completing-read
1374 (TeX-argument-prompt optional prompt "Which brace")
1375 TeX-left-right-braces)))
1376 (LaTeX-indent-line)))))
1377
1378 ;;; Indentation
1379
1380 (defvar LaTeX-indent-level 2
1381 "*Indentation of begin-end blocks in LaTeX.")
1382
1383 (defvar LaTeX-item-indent (- LaTeX-indent-level)
1384 "*Extra indentation for lines beginning with an item.")
1385
1386 (defvar LaTeX-item-regexp "\\(bib\\)?item\\b"
1387 "*Regular expression matching macros considered items.")
1388
1389 (defun LaTeX-indent-line ()
1390 "Indent the line containing point, as LaTeX source.
1391 Add LaTeX-indent-level indentation in each \\begin{ - \\end{ block.
1392 Lines starting with an item is given an extra indentation of
1393 LaTeX-item-indent."
1394 (interactive)
1395 (let ((indent (LaTeX-indent-calculate)))
1396 (save-excursion
1397 (if (/= (current-indentation) indent)
1398 (let ((beg (progn
1399 (beginning-of-line)
1400 (point))))
1401 (back-to-indentation)
1402 (delete-region beg (point))
1403 (indent-to indent))))
1404 (if (< (current-column) indent)
1405 (back-to-indentation))))
1406
1407 (defun LaTeX-fill-region-as-paragraph (from to &optional justify-flag)
1408 "Fill region as one paragraph: break lines to fit fill-column,
1409 but leave all lines ending with \\\\ (plus its optional argument) alone.
1410 Prefix arg means justify too.
1411 From program, pass args FROM, TO and JUSTIFY-FLAG."
1412 (interactive "*r\nP")
1413 (or (assoc (LaTeX-current-environment) LaTeX-indent-environment-list)
1414 (save-restriction
1415 (narrow-to-region from to)
1416 (goto-char from)
1417 (while (not (eobp))
1418 (LaTeX-indent-line)
1419 (forward-line))
1420 (goto-char from)
1421 (while (not (eobp))
1422 (if
1423 (re-search-forward (concat "^.*"
1424 (regexp-quote TeX-esc)
1425 (regexp-quote TeX-esc)
1426 "\\(\\s-*\\*\\)?"
1427 "\\(\\s-*\\[[^]]*\\]\\)?\\s-*$")
1428 nil t)
1429 (progn
1430 (goto-char (match-end 0))
1431 (delete-horizontal-space)
1432 ;; I doubt very much if we want justify -
1433 ;; this is a line with \\
1434 ;; if you think otherwise - uncomment the next line
1435 ;; (and justify-flag (justify-current-line))
1436 (forward-char)
1437 ;; keep our position in a buffer
1438 (save-excursion
1439 (LaTeX-fill-region-as-para-do
1440 from (match-beginning 0) justify-flag))
1441 (setq from (point)))
1442 ;; ELSE part follows - loop termination relies on a fact
1443 ;; that (LaTeX-fill-region-as-para-do) moves point past
1444 ;; the filled region
1445 (LaTeX-fill-region-as-para-do from to justify-flag)))
1446 ;; the following four lines are clearly optional, but I like my
1447 ;; LaTeX code that way
1448 (goto-char (point-min))
1449 (while (search-forward "$$ " nil t)
1450 (replace-match "$$\n" t t)
1451 (LaTeX-indent-line)))))
1452
1453 (defun LaTeX-fill-region-as-para-do (from to justify-flag)
1454 "Fill region as one paragraph: break lines to fit fill-column."
1455 (if (< from to)
1456 (progn
1457 ;; (save-restriction) here is likely not needed because
1458 ;; it was done by a caller, but I am not sure - mj
1459 (save-restriction
1460 (goto-char from)
1461 (skip-chars-forward " \n")
1462 (LaTeX-indent-line)
1463 (beginning-of-line)
1464 (narrow-to-region (point) to)
1465 (setq from (point))
1466
1467 ;; from is now before the text to fill,
1468 ;; but after any fill prefix on the first line.
1469
1470 ;; Make sure sentences ending at end of line get an extra space.
1471 (if (or (not (boundp 'sentence-end-double-space))
1472 sentence-end-double-space)
1473 (progn
1474 (goto-char from)
1475 (while (re-search-forward "[.?!][]})\"']*$" nil t)
1476 (insert ? ))))
1477 ;; The change all newlines to spaces.
1478 (subst-char-in-region from (point-max) ?\n ?\ )
1479 ;; Flush excess spaces, except in the paragraph indentation.
1480 (goto-char from)
1481 (skip-chars-forward " \t")
1482 (while (re-search-forward " *" nil t)
1483 (delete-region
1484 (+ (match-beginning 0)
1485 (if (save-excursion
1486 (skip-chars-backward " ]})\"'")
1487 (memq (preceding-char) '(?. ?? ?!)))
1488 2 1))
1489 (match-end 0)))
1490 (goto-char (point-max))
1491 (delete-horizontal-space)
1492 (insert " ")
1493 (goto-char (point-min))
1494 (let ((prefixcol 0))
1495 (while (not (eobp))
1496 (move-to-column (1+ fill-column))
1497 (if (eobp)
1498 nil
1499 (skip-chars-backward "^ \n")
1500 (if (if (zerop prefixcol)
1501 (bolp)
1502 (>= prefixcol (current-column)))
1503 (skip-chars-forward "^ \n")
1504 (forward-char -1)))
1505 (delete-horizontal-space)
1506 (if (equal (preceding-char) ?\\)
1507 (insert ? ))
1508 (insert ?\n)
1509 (LaTeX-indent-line)
1510 (setq prefixcol (current-column))
1511 (and justify-flag (not (eobp))
1512 (progn
1513 (forward-line -1)
1514 (justify-current-line)
1515 (forward-line 1)))
1516 )
1517 (goto-char (point-max))
1518 (delete-horizontal-space))))))
1519
1520 (defun LaTeX-fill-paragraph (prefix)
1521 "Fill and indent paragraph at or after point.
1522 Prefix arg means justify as well."
1523 (interactive "*P")
1524 (save-excursion
1525 (beginning-of-line)
1526 (if (looking-at "[ \t]*%]")
1527 (re-search-forward "^[ \t]*[^% \t\n]"))
1528 (forward-paragraph)
1529 (or (bolp) (newline 1))
1530 (and (eobp) (open-line 1))
1531 (let ((end (point-marker))
1532 (start (progn
1533 (backward-paragraph)
1534 (point))))
1535 (LaTeX-fill-region-as-paragraph start end prefix))))
1536
1537 (defun LaTeX-fill-region (from to &optional justify what)
1538 "Fill and indent each of the paragraphs in the region as LaTeX text.
1539 Prefix arg (non-nil third arg, if called from program)
1540 means justify as well. Fourth arg WHAT is a word to be displayed when
1541 formatting."
1542 (interactive "*r\nP")
1543 (save-restriction
1544 (save-excursion
1545 (let ((length (- to from))
1546 (to (set-marker (make-marker) to)))
1547 (goto-char from)
1548 (beginning-of-line)
1549 (while (< (point) to)
1550 (message "Formatting%s ... %d%%"
1551 (if (not what)
1552 ""
1553 what)
1554 (/ (* 100 (- (point) from)) length))
1555 (save-excursion (LaTeX-fill-paragraph justify))
1556 (forward-paragraph 2)
1557 (if (not (eobp))
1558 (backward-paragraph)))
1559 (set-marker to nil)))
1560 (message "Finished")))
1561
1562 (defun LaTeX-find-matching-end ()
1563 "Move point to the \\end of the current environment"
1564 (interactive)
1565 (let ((regexp (concat (regexp-quote TeX-esc) "\\(begin\\|end\\)\\b"))
1566 (level 1))
1567 (beginning-of-line 1)
1568 (if (looking-at (concat " *" (regexp-quote TeX-esc) "begin\\b"))
1569 (end-of-line 1))
1570 (while (and (> level 0) (re-search-forward regexp nil t))
1571 (if (= (char-after (1+ (match-beginning 0))) ?b);;begin
1572 (setq level (1+ level))
1573 (setq level (1- level))))
1574 (if (= level 0)
1575 (search-forward "}")
1576 (error "Can't locate end of current environment"))))
1577
1578 (defun LaTeX-find-matching-begin ()
1579 "Move point to the \\begin of the current environment"
1580 (interactive)
1581 (let ((regexp (concat (regexp-quote TeX-esc) "\\(begin\\|end\\)\\b"))
1582 (level 1))
1583 (beginning-of-line 1)
1584 (if (looking-at (concat " *" (regexp-quote TeX-esc) "begin\\b"))
1585 (end-of-line 1))
1586 (while (and (> level 0) (re-search-backward regexp nil t))
1587 (if (= (char-after (1+ (match-beginning 0))) ?e);;end
1588 (setq level (1+ level))
1589 (setq level (1- level))))
1590 (or (= level 0)
1591 (error "Can't locate beginning of current environment"))))
1592
1593 (defun LaTeX-mark-environment ()
1594 "Set mark to end of current environment and point to the matching begin
1595 will not work properly if there are unbalanced begin-end pairs in
1596 comments and verbatim environments"
1597 (interactive)
1598 (let ((cur (point)))
1599 (LaTeX-find-matching-end)
1600 (beginning-of-line 2)
1601 (set-mark (point))
1602 (goto-char cur)
1603 (LaTeX-find-matching-begin)
1604 (TeX-activate-region)))
1605
1606 (defun LaTeX-fill-environment (justify)
1607 "Fill and indent current environment as LaTeX text."
1608 (interactive "*P")
1609 (save-excursion
1610 (LaTeX-mark-environment)
1611 (re-search-forward "{\\([^}]+\\)}")
1612 (LaTeX-fill-region
1613 (region-beginning)
1614 (region-end)
1615 justify
1616 (concat " environment " (TeX-match-buffer 1)))))
1617
1618 (defun LaTeX-fill-section (justify)
1619 "Fill and indent current logical section as LaTeX text."
1620 (interactive "*P")
1621 (save-excursion
1622 (LaTeX-mark-section)
1623 (re-search-forward "{\\([^}]+\\)}")
1624 (LaTeX-fill-region
1625 (region-beginning)
1626 (region-end)
1627 justify
1628 (concat " section " (TeX-match-buffer 1)))))
1629
1630 (defun LaTeX-mark-section ()
1631 "Set mark at end of current logical section, and point at top."
1632 (interactive)
1633 (re-search-forward (concat "\\(" (LaTeX-outline-regexp)
1634 "\\|\\'\\)"))
1635 (re-search-backward "^")
1636 (set-mark (point))
1637 (re-search-backward (concat "\\(" (LaTeX-outline-regexp)
1638 "\\|\\`\\)"))
1639 (TeX-activate-region))
1640
1641 (defun LaTeX-fill-buffer (justify)
1642 "Fill and indent current buffer as LaTeX text."
1643 (interactive "*P")
1644 (save-excursion
1645 (LaTeX-fill-region
1646 (point-min)
1647 (point-max)
1648 justify
1649 (concat " buffer " (buffer-name)))))
1650
1651 (defvar LaTeX-indent-environment-list
1652 '(("verbatim" current-indentation)
1653 ("verbatim*" current-indentation)
1654 ;; The following should have there own, smart indentation function.
1655 ;; Some other day.
1656 ("alltt")
1657 ("array")
1658 ("displaymath")
1659 ("eqnarray")
1660 ("eqnarray*")
1661 ("equation")
1662 ("equation*")
1663 ("picture")
1664 ("tabbing")
1665 ("table")
1666 ("table*")
1667 ("tabular")
1668 ("tabular*"))
1669 "Alist of environments with special indentation.
1670 The second element in each entry is the function to calculate the
1671 indentation level in columns.")
1672
1673 (defvar LaTeX-indent-environment-check t
1674 "*If non-nil, check for any special environments.")
1675
1676 (defvar LaTeX-left-comment-regexp "%%%"
1677 "*Regexp matching comments that should be placed on the left margin.")
1678
1679 (defvar LaTeX-right-comment-regexp "%[^%]"
1680 "*Regexp matching comments that should be placed to the right margin.")
1681
1682 (defvar LaTeX-ignore-comment-regexp nil
1683 "*Regexp matching comments that whose indentation should not be touched.")
1684
1685 (defun LaTeX-indent-calculate ()
1686 ;; Return the correct indentation of line of LaTeX source. (I hope...)
1687 (save-excursion
1688 (back-to-indentation)
1689 (cond ((looking-at (concat (regexp-quote TeX-esc)
1690 "\\(begin\\|end\\){verbatim\\*?}"))
1691 ;; \end{verbatim} must be flush left, otherwise an unwanted
1692 ;; empty line appears in LaTeX's output.
1693 0)
1694 ((and LaTeX-left-comment-regexp
1695 (looking-at LaTeX-left-comment-regexp))
1696 ;; Comments to the left margin.
1697 0)
1698 ((and LaTeX-right-comment-regexp
1699 (looking-at LaTeX-right-comment-regexp))
1700 ;; Comments to the right margin.
1701 comment-column)
1702 ((and LaTeX-ignore-comment-regexp
1703 (looking-at LaTeX-ignore-comment-regexp))
1704 ;; Comments best left alone.
1705 (current-indentation))
1706 ((and LaTeX-indent-environment-check
1707 ;; Special environments.
1708 (let ((entry (assoc (LaTeX-current-environment)
1709 LaTeX-indent-environment-list)))
1710 (and entry
1711 (nth 1 entry)
1712 (funcall (nth 1 entry))))))
1713 ((looking-at (concat (regexp-quote TeX-esc) "end\\b"))
1714 ;; Backindent at \end.
1715 (- (LaTeX-indent-calculate-last) LaTeX-indent-level))
1716 ((looking-at (concat (regexp-quote TeX-esc) "right\\b"))
1717 ;; Backindent at \right.
1718 (- (LaTeX-indent-calculate-last) LaTeX-left-right-indent-level))
1719 ((looking-at (concat (regexp-quote TeX-esc) LaTeX-item-regexp))
1720 ;; Items.
1721 (+ (LaTeX-indent-calculate-last) LaTeX-item-indent))
1722 (t (LaTeX-indent-calculate-last)))))
1723
1724 (defvar LaTeX-left-right-indent-level LaTeX-indent-level
1725 "*The level of indentation produced by a \\left macro.")
1726
1727 (defun LaTeX-indent-level-count ()
1728 ;; Count indentation change caused by all \left, \right, \begin, and
1729 ;; \end commands in the current line.
1730 (save-excursion
1731 (save-restriction
1732 (let ((count 0))
1733 (narrow-to-region (point)
1734 (save-excursion
1735 (re-search-forward (concat "[^"
1736 (regexp-quote TeX-esc)
1737 "]%\\|\n\\|\\'"))
1738 (backward-char)
1739 (point)))
1740 (while (search-forward TeX-esc nil t)
1741 (cond
1742 ((looking-at "left\\b")
1743 (setq count (+ count LaTeX-left-right-indent-level)))
1744 ((looking-at "right\\b")
1745 (setq count (- count LaTeX-left-right-indent-level)))
1746 ((looking-at "begin\\b")
1747 (setq count (+ count LaTeX-indent-level)))
1748 ((looking-at "end\\b")
1749 (setq count (- count LaTeX-indent-level)))
1750 ((looking-at (regexp-quote TeX-esc))
1751 (forward-char 1))))
1752 count))))
1753
1754 (defun LaTeX-indent-calculate-last ()
1755 "Return the correct indentation of a normal line of text.
1756 The point is supposed to be at the beginning of the current line."
1757 (save-restriction
1758 (widen)
1759 (skip-chars-backward "\n\t ")
1760 (move-to-column (current-indentation))
1761
1762 ;; Ignore comments.
1763 (while (and (looking-at (regexp-quote comment-start)) (not (bobp)))
1764 (skip-chars-backward "\n\t ")
1765 (if (not (bobp))
1766 (move-to-column (current-indentation))))
1767
1768 (cond ((bobp) 0)
1769 ((looking-at (concat (regexp-quote TeX-esc) "begin{document}"))
1770 ;; I dislike having all of the document indented...
1771 (current-indentation))
1772 ((looking-at (concat (regexp-quote TeX-esc) "begin *"
1773 (regexp-quote TeX-grop)
1774 "verbatim\\*?"
1775 (regexp-quote TeX-grcl)))
1776 0)
1777 ((looking-at (concat (regexp-quote TeX-esc) "end"
1778 (regexp-quote TeX-grop)
1779 "verbatim\\*?"
1780 (regexp-quote TeX-grcl)))
1781 ;; If I see an \end{verbatim} in the previous line I skip
1782 ;; back to the preceding \begin{verbatim}.
1783 (save-excursion
1784 (if (re-search-backward (concat (regexp-quote TeX-esc)
1785 "begin *"
1786 (regexp-quote TeX-grop)
1787 "verbatim\\*?"
1788 (regexp-quote TeX-grcl)) 0 t)
1789 (LaTeX-indent-calculate-last)
1790 0)))
1791 (t (+ (current-indentation)
1792 (TeX-brace-count-line)
1793 (LaTeX-indent-level-count)
1794 (cond ((looking-at (concat (regexp-quote TeX-esc) "end\\b"))
1795 LaTeX-indent-level)
1796 ((looking-at (concat (regexp-quote TeX-esc) "right\\b"))
1797 LaTeX-left-right-indent-level)
1798 ((looking-at (concat (regexp-quote TeX-esc)
1799 LaTeX-item-regexp))
1800 (- LaTeX-item-indent))
1801 (t 0)))))))
1802
1803 ;;; Math Minor Mode
1804
1805 (defvar LaTeX-math-list nil
1806 "AList of your personal LaTeX math symbols.
1807
1808 Each entry should be a list with three elements, KEY, VALUE, and MENU.
1809 KEY is the key to be redefined (under `LaTeX-math-abbrev-prefix' in
1810 math minor mode, VALUE can be a string with the name of the macro to
1811 be inserted, or a function to be called. The optional third element is
1812 the name of the submenu where the command should be added.
1813
1814 See also `LaTeX-math-menu'.")
1815
1816 (defconst LaTeX-math-default
1817 '((?a "alpha" "greek")
1818 (?b "beta" "greek")
1819 (?c LaTeX-math-cal "Cal-whatever")
1820 (?d "delta" "greek")
1821 (?e "epsilon" "greek")
1822 (?f "phi" "greek")
1823 (?g "gamma" "greek")
1824 (?h "eta" "greek")
1825 (?k "kappa" "greek")
1826 (?l "lambda" "greek")
1827 (?m "mu" "greek")
1828 (?N "nabla" "greek")
1829 (?n "nu" "greek")
1830 (?o "omega" "greek")
1831 (?p "pi" "greek")
1832 (?q "theta" "greek")
1833 (?r "rho" "greek")
1834 (?s "sigma" "greek")
1835 (?t "tau" "greek")
1836 (?u "upsilon" "greek")
1837 (?x "chi" "greek")
1838 (?y "psi" "greek")
1839 (?z "zeta" "greek")
1840 (?D "Delta" "Greek")
1841 (?F "Phi" "Greek")
1842 (?G "Gamma" "Greek")
1843 (?Q "Theta" "Greek")
1844 (?L "Lambda" "Greek")
1845 (?Y "Psi" "Greek")
1846 (?P "Pi" "Greek")
1847 (?S "Sigma" "Greek")
1848 (?U "Upsilon" "Greek")
1849 (?O "Omega" "Greek")
1850 (nil "pm" "Binary Op")
1851 (nil "mp" "Binary Op")
1852 (?* "times" "Binary Op")
1853 (nil "div" "Binary Op")
1854 (nil "ast" "Binary Op")
1855 (nil "star" "Binary Op")
1856 (nil "circ" "Binary Op")
1857 (nil "bullet" "Binary Op")
1858 (?. "cdot" "Binary Op")
1859 (?- "cap" "Binary Op")
1860 (?+ "cup" "Binary Op")
1861 (nil "uplus" "Binary Op")
1862 (nil "sqcap" "Binary Op")
1863 (?| "vee" "Binary Op")
1864 (?& "wedge" "Binary Op")
1865 (?\\ "setminus" "Binary Op")
1866 (nil "wr" "Binary Op")
1867 (nil "diamond" "Binary Op")
1868 (nil "bigtriangleup" "Binary Op")
1869 (nil "bigtriangledown" "Binary Op")
1870 (nil "triangleleft" "Binary Op")
1871 (nil "triangleright" "Binary Op")
1872 (nil "lhd" "Binary Op")
1873 (nil "rhd" "Binary Op")
1874 (nil "unlhd" "Binary Op")
1875 (nil "unrhd" "Binary Op")
1876 (nil "oplus" "Binary Op")
1877 (nil "ominus" "Binary Op")
1878 (nil "otimes" "Binary Op")
1879 (nil "oslash" "Binary Op")
1880 (nil "odot" "Binary Op")
1881 (nil "bigcirc" "Binary Op")
1882 (nil "dagger" "Binary Op")
1883 (nil "ddagger" "Binary Op")
1884 (nil "amalg" "Binary Op")
1885 (?< "leq" "Relational")
1886 (?> "geq" "Relational")
1887 (nil "qed" "Relational")
1888 (nil "equiv" "Relational")
1889 (nil "models" "Relational")
1890 (nil "prec" "Relational")
1891 (nil "succ" "Relational")
1892 (nil "sim" "Relational")
1893 (nil "perp" "Relational")
1894 (nil "preceq" "Relational")
1895 (nil "succeq" "Relational")
1896 (nil "simeq" "Relational")
1897 (nil "mid" "Relational")
1898 (nil "ll" "Relational")
1899 (nil "gg" "Relational")
1900 (nil "asymp" "Relational")
1901 (nil "parallel" "Relational")
1902 (?{ "subset" "Relational")
1903 (?} "supset" "Relational")
1904 (nil "approx" "Relational")
1905 (nil "bowtie" "Relational")
1906 (?\[ "subseteq" "Relational")
1907 (?\] "supseteq" "Relational")
1908 (nil "cong" "Relational")
1909 (nil "Join" "Relational")
1910 (nil "sqsubset" "Relational")
1911 (nil "sqsupset" "Relational")
1912 (nil "neq" "Relational")
1913 (nil "smile" "Relational")
1914 (nil "sqsubseteq" "Relational")
1915 (nil "sqsupseteq" "Relational")
1916 (nil "doteq" "Relational")
1917 (nil "frown" "Relational")
1918 (?i "in" "Relational")
1919 (nil "ni" "Relational")
1920 (nil "propto" "Relational")
1921 (nil "vdash" "Relational")
1922 (nil "dashv" "Relational")
1923 (?\C-b "leftarrow" "Arrows")
1924 (nil "Leftarrow" "Arrows")
1925 (?\C-f "rightarrow" "Arrows")
1926 (nil "Rightarrow" "Arrows")
1927 (nil "leftrightarrow" "Arrows")
1928 (nil "Leftrightarrow" "Arrows")
1929 (nil "mapsto" "Arrows")
1930 (nil "hookleftarrow" "Arrows")
1931 (nil "leftharpoonup" "Arrows")
1932 (nil "leftharpoondown" "Arrows")
1933 (nil "longleftarrow" "Arrows")
1934 (nil "Longleftarrow" "Arrows")
1935 (nil "longrightarrow" "Arrows")
1936 (nil "Longrightarrow" "Arrows")
1937 (nil "longleftrightarrow" "Arrows")
1938 (nil "Longleftrightarrow" "Arrows")
1939 (nil "longmapsto" "Arrows")
1940 (nil "hookrightarrow" "Arrows")
1941 (nil "rightharpoonup" "Arrows")
1942 (nil "rightharpoondown" "Arrows")
1943 (?\C-p "uparrow" "Arrows")
1944 (nil "Uparrow" "Arrows")
1945 (?\C-n "downarrow" "Arrows")
1946 (nil "Downarrow" "Arrows")
1947 (nil "updownarrow" "Arrows")
1948 (nil "Updownarrow" "Arrows")
1949 (nil "nearrow" "Arrows")
1950 (nil "searrow" "Arrows")
1951 (nil "swarrow" "Arrows")
1952 (nil "nwarrow" "Arrows")
1953 (nil "ldots" "Misc Symbol")
1954 (nil "cdots" "Misc Symbol")
1955 (nil "vdots" "Misc Symbol")
1956 (nil "ddots" "Misc Symbol")
1957 (nil "aleph" "Misc Symbol")
1958 (nil "prime" "Misc Symbol")
1959 (?A "forall" "Misc Symbol")
1960 (?I "infty" "Misc Symbol")
1961 (nil "hbar" "Misc Symbol")
1962 (?0 "emptyset" "Misc Symbol")
1963 (?E "exists" "Misc Symbol")
1964 (nil "nabla" "Misc Symbol")
1965 (nil "surd" "Misc Symbol")
1966 (nil "Box" "Misc Symbol")
1967 (nil "triangle" "Misc Symbol")
1968 (nil "Diamond" "Misc Symbol")
1969 (nil "imath" "Misc Symbol")
1970 (nil "jmath" "Misc Symbol")
1971 (nil "ell" "Misc Symbol")
1972 (nil "neg" "Misc Symbol")
1973 (?/ "not" "Misc Symbol")
1974 (nil "top" "Misc Symbol")
1975 (nil "flat" "Misc Symbol")
1976 (nil "natural" "Misc Symbol")
1977 (nil "sharp" "Misc Symbol")
1978 (nil "wp" "Misc Symbol")
1979 (nil "bot" "Misc Symbol")
1980 (nil "clubsuit" "Misc Symbol")
1981 (nil "diamondsuit" "Misc Symbol")
1982 (nil "heartsuit" "Misc Symbol")
1983 (nil "spadesuit" "Misc Symbol")
1984 (nil "mho" "Misc Symbol")
1985 (nil "Re" "Misc Symbol")
1986 (nil "Im" "Misc Symbol")
1987 (nil "angle" "Misc Symbol")
1988 (nil "partial" "Misc Symbol")
1989 (nil "sum" "Var Symbol")
1990 (nil "prod" "Var Symbol")
1991 (nil "coprod" "Var Symbol")
1992 (nil "int" "Var Symbol")
1993 (nil "oint" "Var Symbol")
1994 (nil "bigcap" "Var Symbol")
1995 (nil "bigcup" "Var Symbol")
1996 (nil "bigsqcup" "Var Symbol")
1997 (nil "bigvee" "Var Symbol")
1998 (nil "bigwedge" "Var Symbol")
1999 (nil "bigodot" "Var Symbol")
2000 (nil "bigotimes" "Var Symbol")
2001 (nil "bigoplus" "Var Symbol")
2002 (nil "biguplus" "Var Symbol")
2003 (nil "arccos" "Log-like")
2004 (nil "arcsin" "Log-like")
2005 (nil "arctan" "Log-like")
2006 (nil "arg" "Log-like")
2007 (?\C-c "cos" "Log-like")
2008 (nil "cosh" "Log-like")
2009 (nil "cot" "Log-like")
2010 (nil "coth" "Log-like")
2011 (nil "csc" "Log-like")
2012 (nil "deg" "Log-like")
2013 (?\C-d "det" "Log-like")
2014 (nil "dim" "Log-like")
2015 (?\C-e "exp" "Log-like")
2016 (nil "gcd" "Log-like")
2017 (nil "hom" "Log-like")
2018 (?\C-_ "inf" "Log-like")
2019 (nil "ker" "Log-like")
2020 (nil "lg" "Log-like")
2021 (?\C-l "lim" "Log-like")
2022 (nil "liminf" "Log-like")
2023 (nil "limsup" "Log-like")
2024 (nil "ln" "Log-like")
2025 (nil "log" "Log-like")
2026 (nil "max" "Log-like")
2027 (nil "min" "Log-like")
2028 (nil "Pr" "Log-like")
2029 (nil "sec" "Log-like")
2030 (?\C-s "sin" "Log-like")
2031 (nil "sinh" "Log-like")
2032 (?\C-^ "sup" "Log-like")
2033 (?\C-t "tan" "Log-like")
2034 (nil "tanh" "Log-like")
2035 (nil "uparrow" "delimiters")
2036 (nil "Uparrow" "delimiters")
2037 (nil "downarrow" "delimiters")
2038 (nil "Downarrow" "delimiters")
2039 (nil "{" "delimiters")
2040 (nil "}" "delimiters")
2041 (nil "updownarrow" "delimiters")
2042 (nil "Updownarrow" "delimiters")
2043 (nil "lfloor" "delimiters")
2044 (nil "rfloor" "delimiters")
2045 (nil "lceil" "delimiters")
2046 (nil "rceil" "delimiters")
2047 (?\( "langle" "delimiters")
2048 (?\) "rangle" "delimiters")
2049 (nil "backslash" "delimiters")
2050 (nil "|" "delimiters")
2051 (nil "rmoustache" "Delimiters")
2052 (nil "lmoustache" "Delimiters")
2053 (nil "rgroup" "Delimiters")
2054 (nil "lgroup" "Delimiters")
2055 (nil "arrowvert" "Delimiters")
2056 (nil "Arrowvert" "Delimiters")
2057 (nil "bracevert" "Delimiters")
2058 (nil "widetilde" "Constructs")
2059 (nil "widehat" "Constructs")
2060 (nil "overleftarrow" "Constructs")
2061 (nil "overrightarrow" "Constructs")
2062 (nil "overline" "Constructs")
2063 (nil "underline" "Constructs")
2064 (nil "overbrace" "Constructs")
2065 (nil "underbrace" "Constructs")
2066 (nil "sqrt" "Constructs")
2067 (nil "frac" "Constructs")
2068 (?^ "hat" "Accents")
2069 (nil "acute" "Accents")
2070 (nil "bar" "Accents")
2071 (nil "dot" "Accents")
2072 (nil "breve" "Accents")
2073 (nil "check" "Accents")
2074 (nil "grave" "Accents")
2075 (nil "vec" "Accents")
2076 (nil "ddot" "Accents")
2077 (?~ "tilde" "Accents")
2078 (nil "ulcorner" ("AMS" "Hebrew"))
2079 (nil "urcorner" ("AMS" "Hebrew"))
2080 (nil "llcorner" ("AMS" "Hebrew"))
2081 (nil "lrcorner" ("AMS" "Hebrew"))
2082 (nil "dashrightarrow" ("AMS" "Arrows"))
2083 (nil "dashleftarrow" ("AMS" "Arrows"))
2084 (nil "leftleftarrows" ("AMS" "Arrows"))
2085 (nil "leftrightarrows" ("AMS" "Arrows"))
2086 (nil "Lleftarrow" ("AMS" "Arrows"))
2087 (nil "twoheadleftarrow" ("AMS" "Arrows"))
2088 (nil "leftarrowtail" ("AMS" "Arrows"))
2089 (nil "looparrowleft" ("AMS" "Arrows"))
2090 (nil "leftrightharpoons" ("AMS" "Arrows"))
2091 (nil "curvearrowleft" ("AMS" "Arrows"))
2092 (nil "circlearrowleft" ("AMS" "Arrows"))
2093 (nil "Lsh" ("AMS" "Arrows"))
2094 (nil "upuparrows" ("AMS" "Arrows"))
2095 (nil "upharpoonleft" ("AMS" "Arrows"))
2096 (nil "downharpoonleft" ("AMS" "Arrows"))
2097 (nil "multimap" ("AMS" "Arrows"))
2098 (nil "leftrightsquigarrow" ("AMS" "Arrows"))
2099 (nil "looparrowright" ("AMS" "Arrows"))
2100 (nil "rightleftharpoons" ("AMS" "Arrows"))
2101 (nil "curvearrowright" ("AMS" "Arrows"))
2102 (nil "circlearrowright" ("AMS" "Arrows"))
2103 (nil "Rsh" ("AMS" "Arrows"))
2104 (nil "downdownarrows" ("AMS" "Arrows"))
2105 (nil "upharpoonright" ("AMS" "Arrows"))
2106 (nil "downharpoonright" ("AMS" "Arrows"))
2107 (nil "rightsquigarrow" ("AMS" "Arrows"))
2108 (nil "nleftarrow" ("AMS" "Neg Arrows"))
2109 (nil "nrightarrow" ("AMS" "Neg Arrows"))
2110 (nil "nLeftarrow" ("AMS" "Neg Arrows"))
2111 (nil "nRightarrow" ("AMS" "Neg Arrows"))
2112 (nil "nleftrightarrow" ("AMS" "Neg Arrows"))
2113 (nil "nLeftrightarrow" ("AMS" "Neg Arrows"))
2114 (nil "leqq" ("AMS" "Relational I"))
2115 (nil "leqslant" ("AMS" "Relational I"))
2116 (nil "eqslantless" ("AMS" "Relational I"))
2117 (nil "lesssim" ("AMS" "Relational I"))
2118 (nil "lessapprox" ("AMS" "Relational I"))
2119 (nil "approxeq" ("AMS" "Relational I"))
2120 (nil "lessdot" ("AMS" "Relational I"))
2121 (nil "lll" ("AMS" "Relational I"))
2122 (nil "lessgtr" ("AMS" "Relational I"))
2123 (nil "lesseqgtr" ("AMS" "Relational I"))
2124 (nil "lesseqqgtr" ("AMS" "Relational I"))
2125 (nil "doteqdot" ("AMS" "Relational I"))
2126 (nil "risingdotseq" ("AMS" "Relational I"))
2127 (nil "fallingdotseq" ("AMS" "Relational I"))
2128 (nil "backsim" ("AMS" "Relational I"))
2129 (nil "backsimeq" ("AMS" "Relational I"))
2130 (nil "subseteqq" ("AMS" "Relational I"))
2131 (nil "Subset" ("AMS" "Relational I"))
2132 (nil "sqsubset" ("AMS" "Relational I"))
2133 (nil "preccurlyeq" ("AMS" "Relational I"))
2134 (nil "curlyeqprec" ("AMS" "Relational I"))
2135 (nil "precsim" ("AMS" "Relational I"))
2136 (nil "precapprox" ("AMS" "Relational I"))
2137 (nil "vartriangleleft" ("AMS" "Relational I"))
2138 (nil "trianglelefteq" ("AMS" "Relational I"))
2139 (nil "vDash" ("AMS" "Relational I"))
2140 (nil "Vvdash" ("AMS" "Relational I"))
2141 (nil "smallsmile" ("AMS" "Relational I"))
2142 (nil "smallfrown" ("AMS" "Relational I"))
2143 (nil "bumpeq" ("AMS" "Relational I"))
2144 (nil "Bumpeq" ("AMS" "Relational I"))
2145 (nil "geqq" ("AMS" "Relational II"))
2146 (nil "geqslant" ("AMS" "Relational II"))
2147 (nil "eqslantgtr" ("AMS" "Relational II"))
2148 (nil "gtrsim" ("AMS" "Relational II"))
2149 (nil "gtrapprox" ("AMS" "Relational II"))
2150 (nil "gtrdot" ("AMS" "Relational II"))
2151 (nil "ggg" ("AMS" "Relational II"))
2152 (nil "gtrless" ("AMS" "Relational II"))
2153 (nil "gtreqless" ("AMS" "Relational II"))
2154 (nil "gtreqqless" ("AMS" "Relational II"))
2155 (nil "eqcirc" ("AMS" "Relational II"))
2156 (nil "circeq" ("AMS" "Relational II"))
2157 (nil "triangleq" ("AMS" "Relational II"))
2158 (nil "thicksim" ("AMS" "Relational II"))
2159 (nil "thickapprox" ("AMS" "Relational II"))
2160 (nil "supseteqq" ("AMS" "Relational II"))
2161 (nil "Supset" ("AMS" "Relational II"))
2162 (nil "sqsupset" ("AMS" "Relational II"))
2163 (nil "succcurlyeq" ("AMS" "Relational II"))
2164 (nil "curlyeqsucc" ("AMS" "Relational II"))
2165 (nil "succsim" ("AMS" "Relational II"))
2166 (nil "succapprox" ("AMS" "Relational II"))
2167 (nil "vartriangleright" ("AMS" "Relational II"))
2168 (nil "trianglerighteq" ("AMS" "Relational II"))
2169 (nil "Vdash" ("AMS" "Relational II"))
2170 (nil "shortmid" ("AMS" "Relational II"))
2171 (nil "shortparallel" ("AMS" "Relational II"))
2172 (nil "between" ("AMS" "Relational II"))
2173 (nil "pitchfork" ("AMS" "Relational II"))
2174 (nil "varpropto" ("AMS" "Relational II"))
2175 (nil "blacktriangleleft" ("AMS" "Relational II"))
2176 (nil "therefore" ("AMS" "Relational II"))
2177 (nil "backepsilon" ("AMS" "Relational II"))
2178 (nil "blacktriangleright" ("AMS" "Relational II"))
2179 (nil "because" ("AMS" "Relational II"))
2180 (nil "nless" ("AMS" "Neg Rel I"))
2181 (nil "nleq" ("AMS" "Neg Rel I"))
2182 (nil "nleqslant" ("AMS" "Neg Rel I"))
2183 (nil "nleqq" ("AMS" "Neg Rel I"))
2184 (nil "lneq" ("AMS" "Neg Rel I"))
2185 (nil "lneqq" ("AMS" "Neg Rel I"))
2186 (nil "lvertneqq" ("AMS" "Neg Rel I"))
2187 (nil "lnsim" ("AMS" "Neg Rel I"))
2188 (nil "lnapprox" ("AMS" "Neg Rel I"))
2189 (nil "nprec" ("AMS" "Neg Rel I"))
2190 (nil "npreceq" ("AMS" "Neg Rel I"))
2191 (nil "precnsim" ("AMS" "Neg Rel I"))
2192 (nil "precnapprox" ("AMS" "Neg Rel I"))
2193 (nil "nsim" ("AMS" "Neg Rel I"))
2194 (nil "nshortmid" ("AMS" "Neg Rel I"))
2195 (nil "nmid" ("AMS" "Neg Rel I"))
2196 (nil "nvdash" ("AMS" "Neg Rel I"))
2197 (nil "nvDash" ("AMS" "Neg Rel I"))
2198 (nil "ntriangleleft" ("AMS" "Neg Rel I"))
2199 (nil "ntrianglelefteq" ("AMS" "Neg Rel I"))
2200 (nil "nsubseteq" ("AMS" "Neg Rel I"))
2201 (nil "subsetneq" ("AMS" "Neg Rel I"))
2202 (nil "varsubsetneq" ("AMS" "Neg Rel I"))
2203 (nil "subsetneqq" ("AMS" "Neg Rel I"))
2204 (nil "varsubsetneqq" ("AMS" "Neg Rel I"))
2205 (nil "ngtr" ("AMS" "Neg Rel II"))
2206 (nil "ngeq" ("AMS" "Neg Rel II"))
2207 (nil "ngeqslant" ("AMS" "Neg Rel II"))
2208 (nil "ngeqq" ("AMS" "Neg Rel II"))
2209 (nil "gneq" ("AMS" "Neg Rel II"))
2210 (nil "gneqq" ("AMS" "Neg Rel II"))
2211 (nil "gvertneqq" ("AMS" "Neg Rel II"))
2212 (nil "gnsim" ("AMS" "Neg Rel II"))
2213 (nil "gnapprox" ("AMS" "Neg Rel II"))
2214 (nil "nsucc" ("AMS" "Neg Rel II"))
2215 (nil "nsucceq" ("AMS" "Neg Rel II"))
2216 (nil "succnsim" ("AMS" "Neg Rel II"))
2217 (nil "succnapprox" ("AMS" "Neg Rel II"))
2218 (nil "ncong" ("AMS" "Neg Rel II"))
2219 (nil "nshortparallel" ("AMS" "Neg Rel II"))
2220 (nil "nparallel" ("AMS" "Neg Rel II"))
2221 (nil "nvDash" ("AMS" "Neg Rel II"))
2222 (nil "nVDash" ("AMS" "Neg Rel II"))
2223 (nil "ntriangleright" ("AMS" "Neg Rel II"))
2224 (nil "ntrianglerighteq" ("AMS" "Neg Rel II"))
2225 (nil "nsupseteq" ("AMS" "Neg Rel II"))
2226 (nil "nsupseteqq" ("AMS" "Neg Rel II"))
2227 (nil "supsetneq" ("AMS" "Neg Rel II"))
2228 (nil "varsupsetneq" ("AMS" "Neg Rel II"))
2229 (nil "supsetneqq" ("AMS" "Neg Rel II"))
2230 (nil "varsupsetneqq" ("AMS" "Neg Rel II"))
2231 (nil "dotplus" ("AMS" "Binary Op"))
2232 (nil "smallsetminus" ("AMS" "Binary Op"))
2233 (nil "Cap" ("AMS" "Binary Op"))
2234 (nil "Cup" ("AMS" "Binary Op"))
2235 (nil "barwedge" ("AMS" "Binary Op"))
2236 (nil "veebar" ("AMS" "Binary Op"))
2237 (nil "doublebarwedge" ("AMS" "Binary Op"))
2238 (nil "boxminus" ("AMS" "Binary Op"))
2239 (nil "boxtimes" ("AMS" "Binary Op"))
2240 (nil "boxdot" ("AMS" "Binary Op"))
2241 (nil "boxplus" ("AMS" "Binary Op"))
2242 (nil "divideontimes" ("AMS" "Binary Op"))
2243 (nil "ltimes" ("AMS" "Binary Op"))
2244 (nil "rtimes" ("AMS" "Binary Op"))
2245 (nil "leftthreetimes" ("AMS" "Binary Op"))
2246 (nil "rightthreetimes" ("AMS" "Binary Op"))
2247 (nil "curlywedge" ("AMS" "Binary Op"))
2248 (nil "curlyvee" ("AMS" "Binary Op"))
2249 (nil "circleddash" ("AMS" "Binary Op"))
2250 (nil "circledast" ("AMS" "Binary Op"))
2251 (nil "circledcirc" ("AMS" "Binary Op"))
2252 (nil "centerdot" ("AMS" "Binary Op"))
2253 (nil "intercal" ("AMS" "Binary Op"))
2254 (nil "hbar" ("AMS" "Misc"))
2255 (nil "hslash" ("AMS" "Misc"))
2256 (nil "vartriangle" ("AMS" "Misc"))
2257 (nil "triangledown" ("AMS" "Misc"))
2258 (nil "square" ("AMS" "Misc"))
2259 (nil "lozenge" ("AMS" "Misc"))
2260 (nil "circledS" ("AMS" "Misc"))
2261 (nil "angle" ("AMS" "Misc"))
2262 (nil "measuredangle" ("AMS" "Misc"))
2263 (nil "nexists" ("AMS" "Misc"))
2264 (nil "mho" ("AMS" "Misc"))
2265 (nil "Finv" ("AMS" "Misc"))
2266 (nil "Game" ("AMS" "Misc"))
2267 (nil "Bbbk" ("AMS" "Misc"))
2268 (nil "backprime" ("AMS" "Misc"))
2269 (nil "varnothing" ("AMS" "Misc"))
2270 (nil "blacktriangle" ("AMS" "Misc"))
2271 (nil "blacktriangledown" ("AMS" "Misc"))
2272 (nil "blacksquare" ("AMS" "Misc"))
2273 (nil "blacklozenge" ("AMS" "Misc"))
2274 (nil "bigstar" ("AMS" "Misc"))
2275 (nil "sphericalangle" ("AMS" "Misc"))
2276 (nil "complement" ("AMS" "Misc"))
2277 (nil "eth" ("AMS" "Misc"))
2278 (nil "diagup" ("AMS" "Misc"))
2279 (nil "diagdown" ("AMS" "Misc"))
2280 (nil "Hat" ("AMS" "Accents"))
2281 (nil "Check" ("AMS" "Accents"))
2282 (nil "Tilde" ("AMS" "Accents"))
2283 (nil "Acute" ("AMS" "Accents"))
2284 (nil "Grave" ("AMS" "Accents"))
2285 (nil "Dot" ("AMS" "Accents"))
2286 (nil "Ddot" ("AMS" "Accents"))
2287 (nil "Breve" ("AMS" "Accents"))
2288 (nil "Bar" ("AMS" "Accents"))
2289 (nil "Vec" ("AMS" "Accents"))
2290 (nil "dddot" ("AMS" "Accents"))
2291 (nil "ddddot" ("AMS" "Accents"))
2292 (nil "bigl" ("AMS" "Delimiters"))
2293 (nil "bigr" ("AMS" "Delimiters"))
2294 (nil "Bigl" ("AMS" "Delimiters"))
2295 (nil "Bigr" ("AMS" "Delimiters"))
2296 (nil "biggl" ("AMS" "Delimiters"))
2297 (nil "biggr" ("AMS" "Delimiters"))
2298 (nil "Biggl" ("AMS" "Delimiters"))
2299 (nil "Biggr" ("AMS" "Delimiters"))
2300 (nil "lvert" ("AMS" "Delimiters"))
2301 (nil "rvert" ("AMS" "Delimiters"))
2302 (nil "lVert" ("AMS" "Delimiters"))
2303 (nil "rVert" ("AMS" "Delimiters"))
2304 (nil "nobreakdash" ("AMS" "Special"))
2305 (nil "leftroot" ("AMS" "Special"))
2306 (nil "uproot" ("AMS" "Special"))
2307 (nil "accentedsymbol" ("AMS" "Special"))
2308 (nil "xleftarrow" ("AMS" "Special"))
2309 (nil "xrightarrow" ("AMS" "Special"))
2310 (nil "overset" ("AMS" "Special"))
2311 (nil "underset" ("AMS" "Special"))
2312 (nil "dfrac" ("AMS" "Special"))
2313 (nil "genfrac" ("AMS" "Special"))
2314 (nil "tfrac" ("AMS" "Special"))
2315 (nil "binom" ("AMS" "Special"))
2316 (nil "dbinom" ("AMS" "Special"))
2317 (nil "tbinom" ("AMS" "Special"))
2318 (nil "smash" ("AMS" "Special"))
2319 (nil "eucal" ("AMS" "Special"))
2320 (nil "boldsymbol" ("AMS" "Special"))
2321 (nil "text" ("AMS" "Special"))
2322 (nil "intertext" ("AMS" "Special"))
2323 (nil "substack" ("AMS" "Special"))
2324 (nil "subarray" ("AMS" "Special"))
2325 (nil "sideset" ("AMS" "Special"))))
2326
2327 (defvar LaTeX-math-abbrev-prefix "`"
2328 "Prefix key for use in LaTeX-math-mode.")
2329
2330 (defvar LaTeX-math-keymap (make-sparse-keymap)
2331 "Keymap used for LaTeX-math-mode commands.")
2332
2333 (defvar LaTeX-math-menu
2334 '("Math"
2335 ("Greek") ("greek") ("Binary Op") ("Relational") ("Arrows")
2336 ("Misc Symbol") ("Var Symbol") ("Log-like") ("delimiters")
2337 ("Delimiters") ("Constructs") ("Accents") ("AMS"))
2338 "Menu containing LaTeX math commands.
2339 The menu entries will be generated dynamically, but you can specify
2340 the sequence by initializing this variable.")
2341
2342 (define-key LaTeX-math-keymap
2343 (concat LaTeX-math-abbrev-prefix LaTeX-math-abbrev-prefix)
2344 'LaTeX-math-insert-prefix)
2345
2346 (let ((math (reverse (append LaTeX-math-list LaTeX-math-default)))
2347 (map (lookup-key LaTeX-math-keymap LaTeX-math-abbrev-prefix)))
2348 (while math
2349 (let* ((entry (car math))
2350 (key (nth 0 entry))
2351 value menu name)
2352 (setq math (cdr math))
2353 (if (listp (cdr entry))
2354 (setq value (nth 1 entry)
2355 menu (nth 2 entry))
2356 (setq value (cdr entry)
2357 menu nil))
2358 (if (stringp value)
2359 (progn
2360 (setq name (intern (concat "LaTeX-math-" value)))
2361 (fset name (list 'lambda (list 'arg) (list 'interactive "*P")
2362 (list 'LaTeX-math-insert value 'arg))))
2363 (setq name value))
2364 (if key
2365 (progn
2366 (setq key (if (numberp key) (char-to-string key) (vector key)))
2367 (define-key map key name)))
2368 (if menu
2369 (let ((parent LaTeX-math-menu))
2370 (if (listp menu)
2371 (progn
2372 (while (cdr menu)
2373 (let ((sub (assoc (car menu) LaTeX-math-menu)))
2374 (if sub
2375 (setq parent sub)
2376 (setcdr parent (cons (list (car menu)) (cdr parent))))
2377 (setq menu (cdr menu))))
2378 (setq menu (car menu))))
2379 (let ((sub (assoc menu parent)))
2380 (if sub
2381 (if (stringp value)
2382 (setcdr sub (cons (vector value name t) (cdr sub)))
2383 (error "Cannot have multiple special math menu items"))
2384 (setcdr parent
2385 (cons (if (stringp value)
2386 (list menu (vector value name t))
2387 (vector menu name t))
2388 (cdr parent))))))))))
2389
2390 (easy-menu-define LaTeX-math-mode-menu
2391 LaTeX-math-keymap
2392 "Menu used in math minor mode."
2393 LaTeX-math-menu)
2394
2395 (defvar LaTeX-math-mode nil
2396 "Is LaTeX-math-mode on or off? non nil means on.")
2397
2398 (make-variable-buffer-local 'LaTeX-math-mode)
2399
2400 (or (assoc 'LaTeX-math-mode minor-mode-alist)
2401 (setq minor-mode-alist (cons '(LaTeX-math-mode " Math") minor-mode-alist)))
2402
2403 (or (assoc 'LaTeX-math-mode minor-mode-map-alist)
2404 (setq minor-mode-map-alist
2405 (cons (cons 'LaTeX-math-mode LaTeX-math-keymap)
2406 minor-mode-map-alist)))
2407
2408 (defun LaTeX-math-mode (&optional arg)
2409 "A minor mode with easy acces to TeX math macros.
2410
2411 Easy insertion of LaTeX math symbols. If you give a prefix argument,
2412 the symbols will be surrounded by dollar signs. The following
2413 commands are defined:
2414
2415 \\{LaTeX-math-keymap}"
2416 (interactive "P")
2417 (setq LaTeX-math-mode
2418 (not (or (and (null arg) LaTeX-math-mode)
2419 (<= (prefix-numeric-value arg) 0))))
2420 (if LaTeX-math-mode
2421 (easy-menu-add LaTeX-math-mode-menu LaTeX-math-keymap)
2422 (easy-menu-remove LaTeX-math-mode-menu))
2423 (set-buffer-modified-p (buffer-modified-p)))
2424
2425 (fset 'latex-math-mode 'LaTeX-math-mode)
2426
2427 (defun LaTeX-math-insert-prefix ()
2428 "Insert the value of `LaTeX-math-abbrev-prefix'."
2429 (interactive "*")
2430 (let (LaTeX-math-mode)
2431 (call-interactively (key-binding LaTeX-math-abbrev-prefix))))
2432
2433 (defun LaTeX-math-insert (string dollar)
2434 ;; Inserts \STRING{}. If DOLLAR is non-nil, put $'s around it.
2435 (if dollar (insert "$"))
2436 (TeX-insert-macro string)
2437 (if dollar (insert "$")))
2438
2439 (defun LaTeX-math-cal (char dollar)
2440 "Inserts a {\\cal CHAR}. If DOLLAR is non-nil, put $'s around it."
2441 (interactive "*c\nP")
2442 (if dollar (insert "$"))
2443 (if (member "latex2e" (TeX-style-list))
2444 (insert "\\mathcal{" (char-to-string char) "}")
2445 (insert "{\\cal " (char-to-string char) "}"))
2446 (if dollar (insert "$")))
2447
2448 (provide 'latex)
2449
2450 ;;; Keymap
2451
2452 (defvar LaTeX-mode-map
2453 (let ((map (copy-keymap TeX-mode-map)))
2454
2455 ;; Standard
2456 (define-key map "\n" 'reindent-then-newline-and-indent)
2457
2458 ;; From latex.el
2459 (define-key map "\t" 'LaTeX-indent-line)
2460 (define-key map "\eq" 'LaTeX-fill-paragraph) ;*** Alias
2461 ;; This key is now used by Emacs for face settings.
2462 ;; (define-key map "\eg" 'LaTeX-fill-region) ;*** Alias
2463 (define-key map "\e\C-e" 'LaTeX-find-matching-end)
2464 (define-key map "\e\C-a" 'LaTeX-find-matching-begin)
2465
2466 (define-key map "\C-c\C-q\C-p" 'LaTeX-fill-paragraph)
2467 (define-key map "\C-c\C-q\C-r" 'LaTeX-fill-region)
2468 (define-key map "\C-c\C-q\C-s" 'LaTeX-fill-section)
2469 (define-key map "\C-c\C-q\C-e" 'LaTeX-fill-environment)
2470
2471 (define-key map "\C-c." 'LaTeX-mark-environment) ;*** Dubious
2472 (define-key map "\C-c*" 'LaTeX-mark-section) ;*** Dubious
2473
2474 (define-key map "\C-c\C-e" 'LaTeX-environment)
2475 (define-key map "\C-c\n" 'LaTeX-insert-item)
2476 (or (key-binding "\e\r")
2477 (define-key map "\e\r" 'LaTeX-insert-item)) ;*** Alias
2478 (define-key map "\C-c]" 'LaTeX-close-environment)
2479 (define-key map "\C-c\C-s" 'LaTeX-section)
2480
2481 ;; Outline commands...
2482 ;; We want to use the right prefix, if possible.
2483 (let ((outline (cond ((not (boundp 'outline-minor-mode-prefix))
2484 (lookup-key map "\C-c"))
2485 ((keymapp (lookup-key map outline-minor-mode-prefix))
2486 (lookup-key map outline-minor-mode-prefix))
2487 (t
2488 (define-key map
2489 outline-minor-mode-prefix (make-sparse-keymap))
2490 (lookup-key map outline-minor-mode-prefix)))))
2491 (define-key outline "\C-z" 'LaTeX-hide-environment)
2492 (define-key outline "\C-x" 'LaTeX-show-environment))
2493
2494 (define-key map "\C-c~" 'LaTeX-math-mode) ;*** Dubious
2495
2496 map)
2497 "Keymap used in LaTeX-mode.")
2498
2499 (defvar LaTeX-environment-menu-name "Insert Environment (C-c C-e)")
2500
2501 (defun LaTeX-environment-menu-entry (entry)
2502 ;; Create an entry for the environment menu.
2503 (vector (car entry) (list 'LaTeX-environment-menu (car entry)) t))
2504
2505 (defvar LaTeX-environment-modify-menu-name "Change Environment (C-u C-c C-e)")
2506
2507 (defun LaTeX-environment-modify-menu-entry (entry)
2508 ;; Create an entry for the change environment menu.
2509 (vector (car entry) (list 'LaTeX-modify-environment (car entry)) t))
2510
2511 (defun LaTeX-section-enable-symbol (LEVEL)
2512 ;; Symbol used to enable section LEVEL in the menu bar.
2513 (intern (concat "LaTeX-section-" (int-to-string (nth 1 entry)) "-enable")))
2514
2515 (defun LaTeX-section-enable (entry)
2516 ;; Enable or disable section ENTRY from LaTeX-section-list.
2517 (let ((level (nth 1 entry)))
2518 (set (LaTeX-section-enable-symbol level)
2519 (>= level LaTeX-largest-level))))
2520
2521 (defun LaTeX-section-menu (level)
2522 ;; Insert section from menu.
2523 (let ((LaTeX-section-hook (delq 'LaTeX-section-heading
2524 (copy-sequence LaTeX-section-hook))))
2525 (LaTeX-section level)))
2526
2527 (defun LaTeX-section-menu-entry (entry)
2528 ;; Create an entry for the section menu.
2529 (let ((enable (LaTeX-section-enable-symbol (nth 1 entry))))
2530 (set enable t)
2531 (vector (car entry) (list 'LaTeX-section-menu (nth 1 entry)) enable)))
2532
2533 (defun LaTeX-section-menu-create ()
2534 ;; Create a menu over LaTeX sections.
2535 (append '("Section (C-c C-s)")
2536 (mapcar 'LaTeX-section-menu-entry LaTeX-section-list)))
2537
2538 (defvar LaTeX-menu-changed nil)
2539 ;; Need to update LaTeX menu.
2540 (make-variable-buffer-local 'LaTeX-menu-changed)
2541
2542 (defun LaTeX-menu-update ()
2543 ;; Update entries on AUC TeX menu.
2544 (or (not (eq major-mode 'latex-mode))
2545 (null LaTeX-menu-changed)
2546 (not (fboundp 'easy-menu-change))
2547 (progn
2548 (TeX-update-style)
2549 (setq LaTeX-menu-changed nil)
2550 (message "Updating section menu...")
2551 (mapcar 'LaTeX-section-enable LaTeX-section-list)
2552 (message "Updating environment menu...")
2553 (easy-menu-change '("LaTeX") LaTeX-environment-menu-name
2554 (mapcar 'LaTeX-environment-menu-entry
2555 (LaTeX-environment-list)))
2556 (message "Updating modify environment menu...")
2557 (easy-menu-change '("LaTeX") LaTeX-environment-modify-menu-name
2558 (mapcar 'LaTeX-environment-modify-menu-entry
2559 (LaTeX-environment-list)))
2560 (message "Updating...done"))))
2561
2562 (add-hook 'activate-menubar-hook 'LaTeX-menu-update)
2563
2564 (easy-menu-define LaTeX-mode-menu
2565 LaTeX-mode-map
2566 "Menu used in LaTeX mode."
2567 (list "LaTeX"
2568 (list LaTeX-environment-menu-name "Bug.")
2569 (list LaTeX-environment-modify-menu-name "Bug.")
2570 (LaTeX-section-menu-create)
2571 ["Macro..." TeX-insert-macro t]
2572 ["Complete" TeX-complete-symbol t]
2573 ["Item" LaTeX-insert-item t]
2574 (list "Insert Font"
2575 ["Emphasize" (TeX-font nil ?\C-e) :keys "C-c C-f C-e"]
2576 ["Bold" (TeX-font nil ?\C-b) :keys "C-c C-f C-b"]
2577 ["Typewriter" (TeX-font nil ?\C-t) :keys "C-c C-f C-t"]
2578 ["Small Caps" (TeX-font nil ?\C-c) :keys "C-c C-f C-c"]
2579 ["Sans Serif" (TeX-font nil ?\C-f) :keys "C-c C-f C-f"]
2580 ["Italic" (TeX-font nil ?\C-i) :keys "C-c C-f C-i"]
2581 ["Slanted" (TeX-font nil ?\C-s) :keys "C-c C-f C-s"]
2582 ["Roman" (TeX-font nil ?\C-r) :keys "C-c C-f C-r"])
2583 (list "Change Font"
2584 ["Emphasize" (TeX-font t ?\C-e) :keys "C-u C-c C-f C-e"]
2585 ["Bold" (TeX-font t ?\C-b) :keys "C-u C-c C-f C-b"]
2586 ["Typewriter" (TeX-font t ?\C-t) :keys "C-u C-c C-f C-t"]
2587 ["Small Caps" (TeX-font t ?\C-c) :keys "C-u C-c C-f C-c"]
2588 ["Sans Serif" (TeX-font t ?\C-f) :keys "C-u C-c C-f C-f"]
2589 ["Italic" (TeX-font t ?\C-i) :keys "C-u C-c C-f C-i"]
2590 ["Slanted" (TeX-font t ?\C-s) :keys "C-u C-c C-f C-s"]
2591 ["Roman" (TeX-font t ?\C-r) :keys "C-u C-c C-f C-r"])
2592 ["Delete Font" (TeX-font t ?\C-d) :keys "C-c C-f C-d"]
2593 "-"
2594 ["Next Error" TeX-next-error t]
2595 (list "TeX Output"
2596 ["Kill Job" TeX-kill-job t]
2597 ["Debug Bad Boxes" TeX-toggle-debug-boxes
2598 :style toggle :selected TeX-debug-bad-boxes ]
2599 ["Switch to Original File" TeX-home-buffer t]
2600 ["Recenter Output Buffer" TeX-recenter-output-buffer t])
2601 (list "Formatting and Marking"
2602 ["Format Environment" LaTeX-fill-environment t]
2603 ["Format Paragraph" LaTeX-fill-paragraph t]
2604 ["Format Region" LaTeX-fill-region t]
2605 ["Format Section" LaTeX-fill-section t]
2606 ["Mark Environment" LaTeX-mark-environment t]
2607 ["Mark Section" LaTeX-mark-section t]
2608 ["Beginning of Environment" LaTeX-find-matching-begin t]
2609 ["End of Environment" LaTeX-find-matching-end t]
2610 ["Hide Environment" LaTeX-hide-environment t]
2611 ["Show Environment" LaTeX-show-environment t])
2612 (list "Miscellaneous"
2613 ["Uncomment Region" TeX-un-comment-region t]
2614 ["Comment Region" TeX-comment-region t]
2615 ["Switch to Master file" TeX-home-buffer t]
2616 ["Save Document" TeX-save-document t]
2617 ["Math Mode" LaTeX-math-mode
2618 :style toggle :selected LaTeX-math-mode ]
2619 ["Documentation" TeX-goto-info-page t]
2620 ["Submit bug report" TeX-submit-bug-report t]
2621 [ "Convert 209 to 2e" LaTeX-209-to-2e
2622 :active (member "latex2" (TeX-style-list)) ]
2623 ["Reset Buffer" TeX-normal-mode t]
2624 ["Reset AUC TeX" (TeX-normal-mode t) :keys "C-u C-c C-n"])))
2625
2626 (defvar LaTeX-font-list
2627 '((?\C-b "\\textbf{" "}")
2628 (?\C-c "\\textsc{" "}")
2629 (?\C-e "\\emph{" "}")
2630 (?\C-f "\\textsf{" "}")
2631 (?\C-i "\\textit{" "}")
2632 (?\C-m "\\textmd{" "}")
2633 (?\C-n "\\textnormal{" "}")
2634 (?\C-r "\\textrm{" "}")
2635 (?\C-s "\\textsl{" "}")
2636 (?\C-t "\\texttt{" "}")
2637 (?\C-u "\\textup{" "}")
2638 (?\C-d "" "" t))
2639 "Font commands used with LaTeX2e. See `TeX-font-list'.")
2640
2641 ;;; Mode
2642
2643 (defvar TeX-arg-cite-note-p nil
2644 "*If non-nil, ask for optional note in citations.")
2645
2646 (defvar TeX-arg-footnote-number-p nil
2647 "*If non-nil, ask for optional number in footnotes.")
2648
2649 (defvar TeX-arg-item-label-p nil
2650 "*If non-nil, always ask for optional label in items.
2651 Otherwise, only ask in description environments.")
2652
2653 (defvar TeX-arg-right-insert-p t
2654 "*If non-nil, always insert automatically the corresponding
2655 \\right if \\left is inserted.")
2656
2657 (defvar LaTeX-paragraph-commands
2658 (concat "\\[\\|\\]\\|" ; display math delimitors
2659 "begin\\b\\|end\\b\\|part\\b\\|chapter\\b\\|label\\b\\|"
2660 "caption\\b\\|section\\b\\|subsection\\b\\|subsubsection\\b\\|"
2661 "par\\b\\|noindent\\b\\|paragraph\\b\\|include\\b\\|"
2662 "includeonly\\b\\|tableofcontents\\b\\|appendix\\b")
2663 "Regexp matching names of LaTeX macros that should have their own line.")
2664
2665 ;;; Do not ;;;###autoload because of conflict with standard tex-mode.el.
2666 (defun latex-mode ()
2667 "Major mode for editing files of input for LaTeX.
2668 See info under AUC TeX for full documentation.
2669
2670 Special commands:
2671 \\{LaTeX-mode-map}
2672
2673 Entering LaTeX mode calls the value of text-mode-hook,
2674 then the value of TeX-mode-hook, and then the value
2675 of LaTeX-mode-hook."
2676 (interactive)
2677 (LaTeX-common-initialization)
2678 (setq mode-name "LaTeX")
2679 (setq major-mode 'latex-mode)
2680 (setq TeX-command-default "LaTeX")
2681 (run-hooks 'text-mode-hook 'TeX-mode-hook 'LaTeX-mode-hook)
2682
2683 ;; Defeat filladapt if auto-fill-mode is set in text-mode-hook.
2684 (and (boundp 'filladapt-function-table)
2685 (boundp 'auto-fill-function)
2686 (eq auto-fill-function 'do-auto-fill)
2687 (setq auto-fill-function
2688 (cdr (assoc 'do-auto-fill filladapt-function-table)))))
2689
2690 (defvar LaTeX-header-end
2691 (concat (regexp-quote TeX-esc) "begin *" TeX-grop "document" TeX-grcl)
2692 "Default end of header marker for LaTeX documents.")
2693
2694 (defvar LaTeX-trailer-start
2695 (concat (regexp-quote TeX-esc) "end *" TeX-grop "document" TeX-grcl)
2696 "Default start of trailer marker for LaTeX documents.")
2697
2698 (defun LaTeX2e-font-replace (start end)
2699 "Replace LaTeX2e font specification around point with START and END."
2700 (save-excursion
2701 (catch 'done
2702 (while t
2703 (if (/= ?\\ (following-char))
2704 (skip-chars-backward "a-zA-Z "))
2705 (skip-chars-backward "\\\\")
2706 (if (looking-at "\\\\\\(emph\\|text[a-z]+\\){")
2707 (throw 'done t)
2708 (up-list -1))))
2709 (forward-sexp 2)
2710 (save-excursion
2711 (replace-match start t t))
2712 (delete-backward-char 1)
2713 (insert end)))
2714
2715 (defun LaTeX-common-initialization ()
2716 ;; Common initialization for LaTeX derived modes.
2717 (VirTeX-common-initialization)
2718 (set-syntax-table LaTeX-mode-syntax-table)
2719 (make-local-variable 'indent-line-function)
2720 (setq indent-line-function 'LaTeX-indent-line)
2721 (use-local-map LaTeX-mode-map)
2722 (easy-menu-add TeX-mode-menu LaTeX-mode-map)
2723 (easy-menu-add LaTeX-mode-menu LaTeX-mode-map)
2724
2725 (or LaTeX-largest-level
2726 (setq LaTeX-largest-level (LaTeX-section-level "section")))
2727
2728 (setq TeX-header-end LaTeX-header-end
2729 TeX-trailer-start LaTeX-trailer-start)
2730
2731 (require 'outline)
2732 (make-local-variable 'outline-level)
2733 (setq outline-level 'LaTeX-outline-level)
2734 (make-local-variable 'outline-regexp)
2735 (setq outline-regexp (LaTeX-outline-regexp t))
2736
2737 (make-local-variable 'TeX-auto-full-regexp-list)
2738 (setq TeX-auto-full-regexp-list
2739 (append LaTeX-auto-regexp-list plain-TeX-auto-regexp-list))
2740
2741 (setq paragraph-start
2742 (concat
2743 "\\("
2744 "^.*[^" TeX-esc "\n]%.*$\\|"
2745 "^%.*$\\|"
2746 "^[ \t]*$\\|"
2747 "^[ \t]*"
2748 (regexp-quote TeX-esc)
2749 "\\("
2750 LaTeX-paragraph-commands
2751 "\\|item\\b"
2752 "\\)"
2753 "\\|"
2754 "^[ \t]*\\$\\$" ; display math delimitor
2755 "\\)" ))
2756 (setq paragraph-separate
2757 (concat
2758 "\\("
2759 "^.*[^" TeX-esc "\n]%.*$\\|"
2760 "^%.*$\\|"
2761 "^[ \t]*$\\|"
2762 "^[ \t]*"
2763 (regexp-quote TeX-esc)
2764 "\\("
2765 LaTeX-paragraph-commands
2766 "\\)"
2767 "\\)"))
2768 (setq selective-display t)
2769
2770 (make-local-variable 'LaTeX-item-list)
2771 (setq LaTeX-item-list '(("description" . LaTeX-item-argument)
2772 ("thebibliography" . LaTeX-item-bib)))
2773
2774 (setq TeX-complete-list
2775 (append '(("\\\\cite\\[[^]\n\r\\%]*\\]{\\([^{}\n\r\\%,]*\\)"
2776 1 LaTeX-bibitem-list "}")
2777 ("\\\\cite{\\([^{}\n\r\\%,]*\\)" 1 LaTeX-bibitem-list "}")
2778 ("\\\\cite{\\([^{}\n\r\\%]*,\\)\\([^{}\n\r\\%,]*\\)"
2779 2 LaTeX-bibitem-list)
2780 ("\\\\nocite{\\([^{}\n\r\\%,]*\\)" 1 LaTeX-bibitem-list "}")
2781 ("\\\\nocite{\\([^{}\n\r\\%]*,\\)\\([^{}\n\r\\%,]*\\)"
2782 2 LaTeX-bibitem-list)
2783 ("\\\\ref{\\([^{}\n\r\\%,]*\\)" 1 LaTeX-label-list "}")
2784 ("\\\\eqref{\\([^{}\n\r\\%,]*\\)" 1 LaTeX-label-list "}")
2785 ("\\\\pageref{\\([^{}\n\r\\%,]*\\)" 1 LaTeX-label-list "}")
2786 ("\\\\begin{\\([A-Za-z]*\\)" 1 LaTeX-environment-list "}")
2787 ("\\\\end{\\([A-Za-z]*\\)" 1 LaTeX-environment-list "}")
2788 ("\\\\renewcommand{\\\\\\([A-Za-z]*\\)"
2789 1 LaTeX-symbol-list "}")
2790 ("\\\\renewenvironment{\\([A-Za-z]*\\)"
2791 1 LaTeX-environment-list "}"))
2792 TeX-complete-list))
2793
2794 (LaTeX-add-environments
2795 '("document" LaTeX-env-document)
2796 '("enumerate" LaTeX-env-item)
2797 '("itemize" LaTeX-env-item)
2798 '("list" LaTeX-env-list)
2799 '("trivlist" LaTeX-env-item)
2800 '("picture" LaTeX-env-picture)
2801 '("tabular" LaTeX-env-array)
2802 '("tabular*" LaTeX-env-array)
2803 '("array" LaTeX-env-array)
2804 '("eqnarray" LaTeX-env-label)
2805 '("equation" LaTeX-env-label)
2806 '("minipage" LaTeX-env-minipage)
2807
2808 ;; The following have no special support, but are included in
2809 ;; case the auto files are missing.
2810
2811 "sloppypar" "picture" "tabbing" "verbatim" "verbatim*"
2812 "flushright" "flushleft" "displaymath" "math" "quote" "quotation"
2813 "abstract" "center" "titlepage" "verse" "eqnarray*"
2814
2815 ;; The following are not defined in latex.el, but in a number of
2816 ;; other style files. I'm to lazy to copy them to all the
2817 ;; corresponding .el files right now.
2818
2819 ;; This means that AUC TeX will complete e.g.
2820 ;; ``thebibliography'' in a letter, but I guess we can live with
2821 ;; that.
2822
2823 '("description" LaTeX-env-item)
2824 '("figure" LaTeX-env-figure)
2825 '("figure*" LaTeX-env-figure)
2826 '("table" LaTeX-env-figure)
2827 '("table*" LaTeX-env-figure)
2828 '("thebibliography" LaTeX-env-bib)
2829 '("theindex" LaTeX-env-item))
2830
2831 (TeX-add-symbols
2832 '("addtocounter" TeX-arg-counter "Value")
2833 '("alph" TeX-arg-counter)
2834 '("arabic" TeX-arg-counter)
2835 '("fnsymbol" TeX-arg-define-counter)
2836 '("newcounter" TeX-arg-define-counter
2837 [ TeX-arg-counter "Within counter" ])
2838 '("roman" TeX-arg-counter)
2839 '("setcounter" TeX-arg-counter "Value")
2840 '("usecounter" TeX-arg-counter)
2841 '("value" TeX-arg-counter)
2842 '("stepcounter" TeX-arg-counter)
2843 '("refstepcounter" TeX-arg-counter)
2844 '("label" TeX-arg-define-label)
2845 '("pageref" TeX-arg-label)
2846 '("ref" TeX-arg-label)
2847 '("newcommand" TeX-arg-define-macro [ "Number of arguments" ] t)
2848 '("renewcommand" TeX-arg-macro [ "Number of arguments" ] t)
2849 '("newenvironment" TeX-arg-define-environment
2850 [ "Number of arguments"] t t)
2851 '("renewenvironment" TeX-arg-environment
2852 [ "Number of arguments"] t t)
2853 '("newtheorem" TeX-arg-define-environment
2854 [ TeX-arg-environment "Numbered like" ]
2855 t [ (TeX-arg-eval progn (if (eq (save-excursion
2856 (backward-char 2)
2857 (preceding-char)) ?\])
2858 ()
2859 (TeX-arg-counter t "Within counter"))
2860 "") ])
2861 '("newfont" TeX-arg-define-macro t)
2862 '("circle" "Diameter")
2863 '("circle*" "Diameter")
2864 '("dashbox" "Dash Length" TeX-arg-size
2865 [ TeX-arg-corner ] t)
2866 '("frame" t)
2867 '("framebox" (TeX-arg-conditional
2868 (string-equal (LaTeX-current-environment) "picture")
2869 (TeX-arg-size [ TeX-arg-corner ] t)
2870 ([ "Length" ] [ TeX-arg-lr ] t)))
2871 '("line" (TeX-arg-pair "X slope" "Y slope") "Length")
2872 '("linethickness" "Dimension")
2873 '("makebox" (TeX-arg-conditional
2874 (string-equal (LaTeX-current-environment) "picture")
2875 (TeX-arg-size [ TeX-arg-corner ] t)
2876 ([ "Length" ] [ TeX-arg-lr ] t)))
2877 '("multiput"
2878 TeX-arg-coordinate
2879 (TeX-arg-pair "X delta" "Y delta")
2880 "Number of copies"
2881 t)
2882 '("oval" TeX-arg-size [ TeX-arg-corner "Portion" ])
2883 '("put" TeX-arg-coordinate t)
2884 '("savebox" TeX-arg-define-savebox
2885 (TeX-arg-conditional
2886 (string-equal (LaTeX-current-environment) "picture")
2887 (TeX-arg-size [ TeX-arg-corner ] t)
2888 ([ "Length" ] [ TeX-arg-lr ] t)))
2889 '("shortstack" [ TeX-arg-lr ] t)
2890 '("vector" (TeX-arg-pair "X slope" "Y slope") "Length")
2891 '("cline" "Span `i-j'")
2892 '("multicolumn" "Columns" "Position" t)
2893 '("item"
2894 (TeX-arg-conditional (or TeX-arg-item-label-p
2895 (string-equal (LaTeX-current-environment)
2896 "description"))
2897 ([ "Item label" ])
2898 ())
2899 (TeX-arg-literal " "))
2900 '("bibitem" [ "Bibitem label" ] TeX-arg-define-cite)
2901 '("cite"
2902 (TeX-arg-conditional TeX-arg-cite-note-p ([ "Note" ]) ())
2903 TeX-arg-cite)
2904 '("nocite" TeX-arg-cite)
2905 '("bibliographystyle" TeX-arg-bibstyle)
2906 '("bibliography" TeX-arg-bibliography)
2907 '("footnote"
2908 (TeX-arg-conditional TeX-arg-footnote-number-p ([ "Number" ]) nil)
2909 t)
2910 '("footnotetext"
2911 (TeX-arg-conditional TeX-arg-footnote-number-p ([ "Number" ]) nil)
2912 t)
2913 '("footnotemark"
2914 (TeX-arg-conditional TeX-arg-footnote-number-p ([ "Number" ]) nil))
2915 '("newlength" TeX-arg-define-macro)
2916 '("setlength" TeX-arg-macro "Length")
2917 '("addtolength" TeX-arg-macro "Length")
2918 '("settowidth" TeX-arg-macro t)
2919 '("\\" [ "Space" ])
2920 '("\\*" [ "Space" ])
2921 '("hyphenation" t)
2922 '("linebreak" [ "How much [0 - 4]" ])
2923 '("nolinebreak" [ "How much [0 - 4]" ])
2924 '("nopagebreak" [ "How much [0 - 4]" ])
2925 '("pagebreak" [ "How much [0 - 4]" ])
2926 '("stackrel" t nil)
2927 '("frac" t nil)
2928 '("lefteqn" t)
2929 '("overbrace" t)
2930 '("overline" t)
2931 '("sqrt" [ "Root" ] t)
2932 '("underbrace" t)
2933 '("underline" t)
2934 '("author" t)
2935 '("date" t)
2936 '("thanks" t)
2937 '("title" t)
2938 '("pagenumbering" (TeX-arg-eval
2939 completing-read "Numbering style: "
2940 '(("arabic") ("roman") ("Roman") ("alph") ("Alph"))))
2941 '("pagestyle" TeX-arg-pagestyle)
2942 '("markboth" t nil)
2943 '("markright" t)
2944 '("thispagestyle" TeX-arg-pagestyle)
2945 '("addvspace" "Length")
2946 '("fbox" t)
2947 '("hspace*" "Length")
2948 '("hspace" "Length")
2949 '("mbox" t)
2950 '("newsavebox" TeX-arg-define-savebox)
2951 '("parbox" [ TeX-arg-tb] "Width" t)
2952 '("raisebox" "Raise" [ "Height above" ] [ "Depth below" ] t)
2953 '("rule" [ "Raise" ] "Width" "Thickness")
2954 '("sbox" TeX-arg-define-savebox t)
2955 '("usebox" TeX-arg-savebox)
2956 '("vspace*" "Length")
2957 '("vspace" "Length")
2958 '("documentstyle" TeX-arg-document)
2959 '("include" (TeX-arg-input-file "File" t))
2960 '("includeonly" t)
2961 '("input" TeX-arg-input-file)
2962 '("addcontentsline" TeX-arg-file
2963 (TeX-arg-eval
2964 completing-read "Numbering style: " LaTeX-section-list)
2965 t)
2966 '("addtocontents" TeX-arg-file t)
2967 '("typeout" t)
2968 '("typein" [ TeX-arg-define-macro ] t)
2969 '("verb" TeX-arg-verb)
2970 '("verb*" TeX-arg-verb)
2971 '("extracolsep" t)
2972 '("index" t)
2973 '("glossary" t)
2974 '("numberline" "Section number" "Heading")
2975 '("caption" t)
2976 '("marginpar" [ "Left margin text" ] "Text")
2977 '("left" TeX-arg-insert-braces)
2978
2979 ;; These have no special support, but are included in case the
2980 ;; auto files are missing.
2981
2982 "LaTeX" "SLiTeX" "samepage" "newline" "smallskip" "medskip"
2983 "bigskip" "stretch" "nonumber" "centering" "raggedright"
2984 "raggedleft" "kill" "pushtabs" "poptabs" "protect" "arraystretch"
2985 "hline" "vline" "cline" "thinlines" "thicklines" "and" "makeindex"
2986 "makeglossary" "reversemarginpar" "normalmarginpar"
2987 "raggedbottom" "flushbottom" "sloppy" "fussy" "newpage"
2988 "clearpage" "cleardoublepage" "twocolumn" "onecolumn")
2989
2990 (TeX-run-style-hooks "LATEX")
2991
2992 (make-local-variable 'TeX-font-list)
2993 (make-local-variable 'TeX-font-replace-function)
2994 (if (string-equal LaTeX-version "2")
2995 ()
2996 (setq TeX-font-list LaTeX-font-list)
2997 (setq TeX-font-replace-function 'LaTeX2e-font-replace)
2998 (TeX-add-symbols
2999 '("newcommand" TeX-arg-define-macro
3000 [ "Number of arguments" ] [ "Default value for first argument" ] t)
3001 '("renewcommand" TeX-arg-macro
3002 [ "Number of arguments" ] [ "Default value for first argument" ] t)
3003 '("usepackage" [ "Options" ] (TeX-arg-input-file "Package"))
3004 '("documentclass" TeX-arg-document)))
3005
3006 (TeX-add-style-hook "latex2e"
3007 ;; Use new fonts for `\documentclass' documents.
3008 (function (lambda ()
3009 (setq TeX-font-list LaTeX-font-list)
3010 (setq TeX-font-replace-function 'LaTeX2e-font-replace)
3011 (if (equal LaTeX-version "2")
3012 (setq TeX-command-default "LaTeX2e"))
3013 (run-hooks 'LaTeX2e-hook))))
3014
3015 (TeX-add-style-hook "latex2"
3016 ;; Use old fonts for `\documentstyle' documents.
3017 (function (lambda ()
3018 (setq TeX-font-list (default-value 'TeX-font-list))
3019 (setq TeX-font-replace-function
3020 (default-value 'TeX-font-replace-function))
3021 (run-hooks 'LaTeX2-hook)))))
3022
3023 (defvar LaTeX-builtin-opts
3024 '("12pt" "11pt" "10pt" "twocolumn" "twoside" "draft")
3025 "Built in options for LaTeX standard styles")
3026
3027 (defun LaTeX-209-to-2e ()
3028 "Make a stab at changing 2.09 doc header to 2e style."
3029 (interactive)
3030 (TeX-home-buffer)
3031 (let (optstr optlist 2eoptlist 2epackages docline docstyle)
3032 (goto-char (point-min))
3033 (if
3034 (search-forward-regexp
3035 "\\documentstyle\\[\\([^]]*\\)\\]{\\([^}]*\\)}"
3036 (point-max) t)
3037 (setq optstr (buffer-substring (match-beginning 1) (match-end 1))
3038 docstyle (buffer-substring (match-beginning 2)
3039 (match-end 2))
3040 optlist (TeX-split-string "," optstr))
3041 (if (search-forward-regexp
3042 "\\documentstyle{\\([^}]*\\)}"
3043 (point-max) t)
3044 (setq docstyle (buffer-substring (match-beginning 1)
3045 (match-end 1)))
3046 (error "No documentstyle defined")))
3047 (beginning-of-line 1)
3048 (setq docline (point))
3049 (insert "%%%")
3050 (while optlist
3051 (if (member (car optlist) LaTeX-builtin-opts)
3052 (setq 2eoptlist (cons (car optlist) 2eoptlist))
3053 (setq 2epackages (cons (car optlist) 2epackages)))
3054 (setq optlist (cdr optlist)))
3055 ;;(message (format "%S %S" 2eoptlist 2epackages))
3056 (goto-char docline)
3057 (next-line 1)
3058 (insert "\\documentclass")
3059 (if 2eoptlist
3060 (insert "["
3061 (mapconcat (function (lambda (x) x))
3062 (nreverse 2eoptlist) ",") "]"))
3063 (insert "{" docstyle "}\n")
3064 (if 2epackages
3065 (insert "\\usepackage{"
3066 (mapconcat (function (lambda (x) x))
3067 (nreverse 2epackages) "}\n\\usepackage{") "}\n"))
3068 (if (equal docstyle "slides")
3069 (progn
3070 (goto-char (point-min))
3071 (while (re-search-forward "\\\\blackandwhite{" nil t)
3072 (replace-match "\\\\input{" nil nil)))))
3073 (TeX-normal-mode nil))
3074
3075 ;;; latex.el ends here