* erc-stamp.el (erc-echo-timestamp):
[bpt/emacs.git] / lisp / textmodes / reftex.el
index c99551f..d6ec294 100644 (file)
@@ -1,15 +1,17 @@
 ;;; reftex.el --- minor mode for doing \label, \ref, \cite, \index in LaTeX
-;; Copyright (c) 1997, 1998, 1999, 2000 Free Software Foundation, Inc.
+;; Copyright (C) 1997, 1998, 1999, 2000, 2003, 2004, 2005,
+;;   2006, 2007 Free Software Foundation, Inc.
 
 ;; Author: Carsten Dominik <dominik@science.uva.nl>
-;; Version: 4.18
+;; Maintainer: auctex-devel@gnu.org
+;; Version: 4.31
 ;; Keywords: tex
 
 ;; This file is part of GNU Emacs.
 
 ;; GNU Emacs is free software; you can redistribute it and/or modify
 ;; it under the terms of the GNU General Public License as published by
-;; the Free Software Foundation; either version 2, or (at your option)
+;; the Free Software Foundation; either version 3, or (at your option)
 ;; any later version.
 
 ;; GNU Emacs is distributed in the hope that it will be useful,
@@ -19,8 +21,8 @@
 
 ;; You should have received a copy of the GNU General Public License
 ;; along with GNU Emacs; see the file COPYING.  If not, write to the
-;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-;; Boston, MA 02111-1307, USA.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
 
 ;;---------------------------------------------------------------------------
 ;;
@@ -64,7 +66,7 @@
 ;;
 ;; The documentation in various formats is also available at
 ;;
-;;     http://www.strw.leidenuniv.nl/~dominik/Tools/
+;;     http://zon.astro.uva.nl/~dominik/Tools/
 ;;
 ;;---------------------------------------------------------------------------
 ;;
 ;; AUTHOR
 ;; ======
 ;;
-;; Carsten Dominik <dominik@strw.LeidenUniv.nl>
+;; Carsten Dominik <dominik@science.uva.nl>
 ;;
 ;;         with contributions from Stephen Eglen
 ;;
 ;; XEmacs 21.x.  If you need to install it yourself, you can find a
 ;; distribution at
 ;;
-;;    http://www.strw.leidenuniv.nl/~dominik/Tools/
+;;    http://zon.astro.uva.nl/~dominik/Tools/
 ;;
 ;; THANKS TO:
 ;; ---------
 ;; Stuff that needs to be there when we use defcustom
 (require 'custom)
 
+(require 'easymenu)
+
 (defvar reftex-tables-dirty t
   "Flag showing if tables need to be re-computed.")
 
 ;;; Define the formal stuff for a minor mode named RefTeX.
 ;;;
 
-(defconst reftex-version "RefTeX version 4.18"
+(defconst reftex-version "RefTeX version 4.31"
   "Version string for RefTeX.")
 
 (defvar reftex-mode nil
   (setq reftex-syntax-table (copy-syntax-table))
   (modify-syntax-entry ?\( "." reftex-syntax-table)
   (modify-syntax-entry ?\) "." reftex-syntax-table))
-       
+        
 (unless reftex-syntax-table-for-bib
   (setq reftex-syntax-table-for-bib
-       (copy-syntax-table reftex-syntax-table))
+        (copy-syntax-table reftex-syntax-table))
   (modify-syntax-entry ?\' "." reftex-syntax-table-for-bib)
   (modify-syntax-entry ?\" "." reftex-syntax-table-for-bib)
   (modify-syntax-entry ?\[ "." reftex-syntax-table-for-bib)
   (modify-syntax-entry ?\] "." reftex-syntax-table-for-bib))
 
+;; The following definitions are out of place, but I need them here
+;; to make the compilation of reftex-mode not complain.
 (defvar reftex-auto-view-crossref-timer nil
   "The timer used for auto-view-crossref.")
+(defvar reftex-toc-auto-recenter-timer nil
+  "The idle timer used to recenter the toc window.")
+
+;;; =========================================================================
+;;;
+;;; Parser functions
+
+(autoload 'reftex-parse-one "reftex-parse"
+  "Re-parse this file." t)
+(autoload 'reftex-parse-all "reftex-parse"
+  "Re-parse entire document." t)
+(autoload 'reftex-do-parse "reftex-parse")
+(autoload 'reftex-where-am-I "reftex-parse")
+(autoload 'reftex-init-section-numbers "reftex-parse")
+(autoload 'reftex-section-info "reftex-parse")
+(autoload 'reftex-section-number "reftex-parse")
+(autoload 'reftex-what-macro "reftex-parse")
+(autoload 'reftex-what-macro-safe "reftex-parse")
+(autoload 'reftex-index-info "reftex-parse")
+(autoload 'reftex-index-info-safe "reftex-parse")
+(autoload 'reftex-short-context "reftex-parse")
+(autoload 'reftex-what-environment "reftex-parse")
+(autoload 'reftex-what-special-env "reftex-parse")
+(autoload 'reftex-move-over-touching-args "reftex-parse")
+(autoload 'reftex-notice-new "reftex-parse")
+(autoload 'reftex-nth-arg "reftex-parse")
+(autoload 'reftex-locate-bibliography-files "reftex-parse")
+(autoload 'reftex-ensure-index-support "reftex-parse")
+(autoload 'reftex-everything-regexp "reftex-parse")
+
+
+;;; =========================================================================
+;;;
+;;; Labels and References
+
+(autoload 'reftex-label-location "reftex-ref")
+(autoload 'reftex-label-info-update "reftex-ref")
+(autoload 'reftex-label-info "reftex-ref")
+(autoload 'reftex-label "reftex-ref"
+ "Insert a unique label." t)
+(autoload 'reftex-reference "reftex-ref"
+ "Make a LaTeX reference." t)
+(autoload 'reftex-varioref-vref "reftex-ref"
+  "Make a varioref reference." t)
+(autoload 'reftex-fancyref-fref "reftex-ref"
+  "Make a fancyref \\fref reference." t)
+(autoload 'reftex-fancyref-Fref "reftex-ref"
+  "Make a fancyref \\Fref reference." t)
+(autoload 'reftex-show-label-location "reftex-ref")
+(autoload 'reftex-query-label-type "reftex-ref")
+(autoload 'reftex-goto-label "reftex-ref"
+  "Prompt for label name and go to that location." t)
+
+;;; =========================================================================
+;;;
+;;; Table of contents
+
+(autoload 'reftex-toc "reftex-toc"
+  "Show the table of contents for the current document." t)
+(autoload 'reftex-toc-recenter "reftex-toc"
+  "Display the TOC window and highlight line corresponding to current position." t)
+(autoload 'reftex-toggle-auto-toc-recenter "reftex-toc" 
+  "Toggle automatic recentering of TOC window." t)
+
+;;; =========================================================================
+;;;
+;;; BibTeX citations.
+
+(autoload 'reftex-citep "reftex-cite")
+(autoload 'reftex-citet "reftex-cite")
+(autoload 'reftex-make-cite-echo-string "reftex-cite")
+(autoload 'reftex-get-bibfile-list "reftex-cite")
+(autoload 'reftex-pop-to-bibtex-entry "reftex-cite")
+(autoload 'reftex-end-of-bib-entry "reftex-cite")
+(autoload 'reftex-parse-bibtex-entry "reftex-cite")
+(autoload 'reftex-citation "reftex-cite"
+ "Make a citation using BibTeX database files." t)
+(autoload 'reftex-default-bibliography "reftex-cite")
+(autoload 'reftex-bib-or-thebib "reftex-cite")
+(autoload 'reftex-create-bibtex-file "reftex-cite")
+
+;;; =========================================================================
+;;;
+;;; Selection
+
+(autoload 'reftex-select-label-mode "reftex-sel")
+(autoload 'reftex-select-bib-mode "reftex-sel")
+(autoload 'reftex-find-start-point "reftex-sel")
+(autoload 'reftex-insert-docstruct "reftex-sel")
+(autoload 'reftex-get-offset "reftex-sel")
+(autoload 'reftex-select-item "reftex-sel")
+
+
+;;; =========================================================================
+;;;
+;;; Index support
+
+(autoload 'reftex-index "reftex-index"
+ "Query for an index macro and insert it along with its argments." t)
+(autoload 'reftex-index-selection-or-word "reftex-index"
+ "Put selection or the word near point into the default index macro." t)
+(autoload 'reftex-index-phrase-selection-or-word "reftex-index"
+ "Put selection or the word near point into Index Phrases File." t)
+(autoload 'reftex-display-index "reftex-index"
+ "Display a buffer with an index compiled from the current document." t)
+(autoload 'reftex-index-visit-phrases-buffer "reftex-index"
+ "Visit the Index Phrases File." t)
+(autoload 'reftex-index-phrases-mode "reftex-index"
+ "Major mode for managing the Index phrases of a LaTeX document." t)
+(autoload 'reftex-index-complete-tag "reftex-index")
+(autoload 'reftex-index-complete-key "reftex-index")
+(autoload 'reftex-index-show-entry "reftex-index")
+(autoload 'reftex-index-select-tag "reftex-index")
+
+
+;;; =========================================================================
+;;;
+;;; View cross references
+
+(autoload 'reftex-view-crossref "reftex-dcr"
+ "View cross reference of \\ref or \\cite macro at point." t)
+(autoload 'reftex-mouse-view-crossref "reftex-dcr"
+ "View cross reference of \\ref or \\cite macro where you click." t)
+(autoload 'reftex-toggle-auto-view-crossref "reftex-dcr")
+(autoload 'reftex-view-crossref-from-bibtex "reftex-dcr"
+ "View location in a LaTeX document which cites the BibTeX entry at point." t)
+
+
+;;; =========================================================================
+;;;
+;;; Operations on entire Multifile documents
+
+(autoload 'reftex-create-tags-file "reftex-global"
+ "Create TAGS file by running `etags' on the current document." t)
+(autoload 'reftex-grep-document "reftex-global"
+ "Run grep query through all files related to this document." t)
+(autoload 'reftex-search-document "reftex-global"
+ "Regexp search through all files of the current TeX document." t)
+(autoload 'reftex-query-replace-document "reftex-global"
+ "Run a query-replace-regexp of FROM with TO over the entire TeX document." t)
+(autoload 'reftex-find-duplicate-labels "reftex-global"
+ "Produce a list of all duplicate labels in the document." t)
+(autoload 'reftex-change-label "reftex-global"
+ "Query replace FROM with TO in all \\label and \\ref commands." t)
+(autoload 'reftex-renumber-simple-labels "reftex-global"
+ "Renumber all simple labels in the document to make them sequentially." t)
+(autoload 'reftex-save-all-document-buffers "reftex-global"
+ "Save all documents associated with the current document." t)
+
+
+;;; =========================================================================
+;;;
+;;; AUCTeX Interface
+
+(autoload 'reftex-arg-label "reftex-auc")
+(autoload 'reftex-arg-cite "reftex-auc")
+(autoload 'reftex-arg-index-tag "reftex-auc")
+(autoload 'reftex-arg-index "reftex-auc")
+(autoload 'reftex-plug-into-AUCTeX "reftex-auc")
+(autoload 'reftex-toggle-plug-into-AUCTeX "reftex-auc"
+ "Toggle Interface between AUCTeX and RefTeX on and off." t)
+(autoload 'reftex-add-label-environments "reftex-auc")
+(autoload 'reftex-add-to-label-alist "reftex-auc")
+(autoload 'reftex-add-section-levels "reftex-auc")
+(autoload 'reftex-notice-new-section "reftex-auc")
 
 ;;;###autoload
 (defun turn-on-reftex ()
@@ -373,26 +544,30 @@ on the menu bar.
 
   (if reftex-mode
       (progn
-       ;; Mode was turned on
+        ;; Mode was turned on
         (easy-menu-add reftex-mode-menu)
-       (and reftex-plug-into-AUCTeX
-            (reftex-plug-into-AUCTeX))
-       (unless (get 'reftex-auto-view-crossref 'initialized)
-         (and reftex-auto-view-crossref
-              (reftex-toggle-auto-view-crossref))
-         (put 'reftex-auto-view-crossref 'initialized t))
-
-       ;; Prepare the special syntax tables.
-       (setq reftex-syntax-table (copy-syntax-table (syntax-table)))
-       (modify-syntax-entry ?\( "." reftex-syntax-table)
-       (modify-syntax-entry ?\) "." reftex-syntax-table)
-       
-       (setq reftex-syntax-table-for-bib
-             (copy-syntax-table reftex-syntax-table))
-       (modify-syntax-entry ?\' "." reftex-syntax-table-for-bib)
-       (modify-syntax-entry ?\" "." reftex-syntax-table-for-bib)
-       (modify-syntax-entry ?\[ "." reftex-syntax-table-for-bib)
-       (modify-syntax-entry ?\] "." reftex-syntax-table-for-bib)
+        (and reftex-plug-into-AUCTeX
+             (reftex-plug-into-AUCTeX))
+        (unless (get 'reftex-auto-view-crossref 'initialized)
+          (and reftex-auto-view-crossref
+               (reftex-toggle-auto-view-crossref))
+          (put 'reftex-auto-view-crossref 'initialized t))
+        (unless (get 'reftex-auto-recenter-toc 'initialized)
+          (and (eq reftex-auto-recenter-toc t)
+               (reftex-toggle-auto-toc-recenter))
+          (put 'reftex-auto-recenter-toc 'initialized t))
+
+        ;; Prepare the special syntax tables.
+        (setq reftex-syntax-table (copy-syntax-table (syntax-table)))
+        (modify-syntax-entry ?\( "." reftex-syntax-table)
+        (modify-syntax-entry ?\) "." reftex-syntax-table)
+        
+        (setq reftex-syntax-table-for-bib
+              (copy-syntax-table reftex-syntax-table))
+        (modify-syntax-entry ?\' "." reftex-syntax-table-for-bib)
+        (modify-syntax-entry ?\" "." reftex-syntax-table-for-bib)
+        (modify-syntax-entry ?\[ "." reftex-syntax-table-for-bib)
+        (modify-syntax-entry ?\] "." reftex-syntax-table-for-bib)
 
         (run-hooks 'reftex-mode-hook))
     ;; Mode was turned off
@@ -417,13 +592,13 @@ on the menu bar.
   ;; This function should be installed in `kill-buffer-hook'.
   ;; We are careful to make sure nothing goes wring in this function.
   (when (and (boundp 'reftex-mode)  reftex-mode
-            (boundp 'reftex-save-parse-info)  reftex-save-parse-info
-            (boundp 'reftex-docstruct-symbol)  reftex-docstruct-symbol
-            (symbol-value reftex-docstruct-symbol)
-            (get reftex-docstruct-symbol 'modified))
+             (boundp 'reftex-save-parse-info)  reftex-save-parse-info
+             (boundp 'reftex-docstruct-symbol)  reftex-docstruct-symbol
+             (symbol-value reftex-docstruct-symbol)
+             (get reftex-docstruct-symbol 'modified))
     ;; Write the file.
     (condition-case nil
-       (reftex-access-parse-file 'write)
+        (reftex-access-parse-file 'write)
       (error nil))))
 
 (defun reftex-kill-emacs-hook ()
@@ -431,9 +606,9 @@ on the menu bar.
   ;; This function should be installed in `kill-emacs-hook'.
   (save-excursion
     (mapcar (lambda (buf)
-             (set-buffer buf)
-             (reftex-kill-buffer-hook))
-           (buffer-list))))
+              (set-buffer buf)
+              (reftex-kill-buffer-hook))
+            (buffer-list))))
 
 ;;; =========================================================================
 ;;;
@@ -445,6 +620,7 @@ on the menu bar.
   (defvar tex-main-file)
   (defvar outline-minor-mode)
   (defvar font-lock-mode)
+  (defvar font-lock-keywords)
   (defvar font-lock-fontify-region-function)
   (defvar font-lock-syntactic-keywords))
 
@@ -503,8 +679,8 @@ on the menu bar.
       (put (symbol-value symbol) :master-index index)
       ;; Initialize if new symbols.
       (when newflag
-       (set (symbol-value symbol) nil)
-       (put (symbol-value symbol) 'reftex-index-macros-style '(default))))
+        (set (symbol-value symbol) nil)
+        (put (symbol-value symbol) 'reftex-index-macros-style '(default))))
 
     ;; Return t if the symbols did already exist, nil when we've made them.
     (not newflag)))
@@ -527,10 +703,10 @@ on the menu bar.
       ((master
         (cond
          ((fboundp 'TeX-master-file) ; AUCTeX is loaded.  Use its mechanism.
-         (condition-case nil 
-             (TeX-master-file t)
-           (error (buffer-file-name))))
-        ((fboundp 'tex-main-file) (tex-main-file)) ; Emacs LaTeX mode
+          (condition-case nil 
+              (TeX-master-file t)
+            (error (buffer-file-name))))
+         ((fboundp 'tex-main-file) (tex-main-file)) ; Emacs LaTeX mode
          ((boundp 'TeX-master)       ; The variable is defined - lets use it.
           (cond
            ((eq TeX-master t)
@@ -567,7 +743,7 @@ on the menu bar.
       )
      (t
       ;; Use buffer file name.
-      (buffer-file-name)))
+      (setq master (buffer-file-name))))
     (expand-file-name master)))
 
 (defun reftex-is-multi ()
@@ -585,15 +761,15 @@ for possible values.  This function should be used from AUCTeX style files."
   (unless reftex-docstruct-symbol
     (reftex-tie-multifile-symbols))
   (when (and reftex-docstruct-symbol
-            (symbolp reftex-docstruct-symbol))
+             (symbolp reftex-docstruct-symbol))
     (put reftex-docstruct-symbol 'reftex-cite-format value)))
 
 (defun reftex-get-cite-format ()
   ;; Return the current citation format.  Either the document-local value in
   ;; reftex-cite-format-symbol, or the global value in reftex-cite-format.
   (if (and reftex-docstruct-symbol
-          (symbolp reftex-docstruct-symbol)
-          (get reftex-docstruct-symbol 'reftex-cite-format))
+           (symbolp reftex-docstruct-symbol)
+           (get reftex-docstruct-symbol 'reftex-cite-format))
       (get reftex-docstruct-symbol 'reftex-cite-format)
     reftex-cite-format))
 
@@ -609,22 +785,22 @@ the label information is recompiled on next use."
   (unless reftex-docstruct-symbol
     (reftex-tie-multifile-symbols))
   (when (and reftex-docstruct-symbol
-            (symbolp reftex-docstruct-symbol))
+             (symbolp reftex-docstruct-symbol))
     (let ((list (get reftex-docstruct-symbol 'reftex-index-macros-style))
-         entry changed)
+          entry changed)
       (while entry-list
-       (setq entry (pop entry-list))
-       ;; When it is a symbol, remove all other symbols
-       (and (symbolp entry)
-            (not (memq entry list))
-            (setq list (reftex-remove-symbols-from-list list)))
-       ;; Add to list unless already member
-       (unless (member entry list)
-         (setq reftex-tables-dirty t
-               changed t)
-         (push entry list)))
+        (setq entry (pop entry-list))
+        ;; When it is a symbol, remove all other symbols
+        (and (symbolp entry)
+             (not (memq entry list))
+             (setq list (reftex-remove-symbols-from-list list)))
+        ;; Add to list unless already member
+        (unless (member entry list)
+          (setq reftex-tables-dirty t
+                changed t)
+          (push entry list)))
       (when changed
-       (put reftex-docstruct-symbol 'reftex-index-macros-style list)))))
+        (put reftex-docstruct-symbol 'reftex-index-macros-style list)))))
 
 ;;; =========================================================================
 ;;;
@@ -661,6 +837,8 @@ the label information is recompiled on next use."
 
 ;; Alist relating magic words to a label type.
 (defvar reftex-words-to-typekey-alist nil)
+;; Alist relating label prefixes to a label type.
+(defvar reftex-prefix-to-typekey-alist nil)
 
 ;; The last list-of-labels entry used in a reference.
 (defvar reftex-last-used-reference (list nil nil nil nil))
@@ -695,8 +873,6 @@ the label information is recompiled on next use."
 (defvar reftex-callback-fwd t)
 (defvar reftex-last-toc-master nil
   "Stores the name of the tex file that `reftex-toc' was last run on.")
-(defvar reftex-auto-view-crossref-timer nil
-  "The timer used for auto-view-crossref.")
 ;; Marker for return point from recursive edit
 (defvar reftex-recursive-edit-marker (make-marker))
 
@@ -744,6 +920,7 @@ the label information is recompiled on next use."
     reftex-typekey-to-format-alist
     reftex-typekey-to-prefix-alist
     reftex-words-to-typekey-alist
+    reftex-prefix-to-typekey-alist
     reftex-type-query-prompt
     reftex-type-query-help
 
@@ -768,28 +945,28 @@ the label information is recompiled on next use."
 (defun reftex-ensure-compiled-variables ()
   ;; Recompile the label alist when necessary
   (let* ((mem reftex-memory)
-        (cache (get reftex-docstruct-symbol 'reftex-cache))
-        (cmem  (car cache))
-        (alist reftex-label-alist)
-        (levels (get reftex-docstruct-symbol 'reftex-section-levels))
-        (style (get reftex-docstruct-symbol 'reftex-label-alist-style))
-        (default reftex-default-label-alist-entries)
-        (index reftex-index-macros)
-        (istyle (get reftex-docstruct-symbol 'reftex-index-macros-style)))
+         (cache (get reftex-docstruct-symbol 'reftex-cache))
+         (cmem  (car cache))
+         (alist reftex-label-alist)
+         (levels (get reftex-docstruct-symbol 'reftex-section-levels))
+         (style (get reftex-docstruct-symbol 'reftex-label-alist-style))
+         (default reftex-default-label-alist-entries)
+         (index reftex-index-macros)
+         (istyle (get reftex-docstruct-symbol 'reftex-index-macros-style)))
     (cond
      (reftex-tables-dirty (reftex-compile-variables))
      ((and (eq alist   (nth 0 mem))
-          (eq levels  (nth 1 mem))
-          (eq style   (nth 2 mem))
-          (eq default (nth 3 mem))
-          (eq index   (nth 4 mem))
-          (eq istyle  (nth 5 mem))))  ;; everything is OK
+           (eq levels  (nth 1 mem))
+           (eq style   (nth 2 mem))
+           (eq default (nth 3 mem))
+           (eq index   (nth 4 mem))
+           (eq istyle  (nth 5 mem))))  ;; everything is OK
      ((and (eq alist   (nth 0 cmem))
-          (eq levels  (nth 1 cmem))
-          (eq style   (nth 2 cmem))
-          (eq default (nth 2 cmem))
-          (eq index   (nth 4 cmem))
-          (eq istyle  (nth 5 cmem)))
+           (eq levels  (nth 1 cmem))
+           (eq style   (nth 2 cmem))
+           (eq default (nth 2 cmem))
+           (eq index   (nth 4 cmem))
+           (eq istyle  (nth 5 cmem)))
       ;; restore the cache
       (message "Restoring cache")
       (mapcar (lambda (sym) (set sym (pop cache))) reftex-cache-variables))
@@ -804,18 +981,18 @@ on next use."
 
   ;; Reset the file search path variables
   (loop for prop in '(status master-dir recursive-path rec-type) do
-       (put 'reftex-tex-path prop nil)
-       (put 'reftex-bib-path prop nil))
+        (put 'reftex-tex-path prop nil)
+        (put 'reftex-bib-path prop nil))
 
   ;; Kill temporary buffers associated with RefTeX - just in case they
   ;; were not cleaned up properly
   (save-excursion
     (let ((buffer-list '("*RefTeX Help*" "*RefTeX Select*"
-                        "*Duplicate Labels*" "*toc*" " *RefTeX-scratch*"))
-         buf)
+                         "*Duplicate Labels*" "*toc*" " *RefTeX-scratch*"))
+          buf)
       (while (setq buf (pop buffer-list))
-       (if (get-buffer buf)
-           (kill-buffer buf))))
+        (if (get-buffer buf)
+            (kill-buffer buf))))
     (reftex-erase-all-selection-and-index-buffers))
 
   ;; Make sure the current document will be rescanned soon.
@@ -830,6 +1007,7 @@ on next use."
 
   (reftex-compile-variables))
 
+;;;###autoload
 (defun reftex-reset-scanning-information ()
   "Reset the symbols containing information from buffer scanning.
 This enforces rescanning the buffer on next use."
@@ -846,12 +1024,12 @@ This enforces rescanning the buffer on next use."
 
 (defun reftex-erase-all-selection-and-index-buffers ()
   ;; Remove all selection buffers associated with current document.
-  (mapcar 
+  (mapc
    (lambda (type)
      (reftex-erase-buffer (reftex-make-selection-buffer-name type)))
    reftex-typekey-list)
   ;; Kill all index buffers
-  (mapcar 
+  (mapc
    (lambda (tag)
      (reftex-kill-buffer (reftex-make-index-buffer-name tag)))
    (cdr (assoc 'index-tags (symbol-value reftex-docstruct-symbol)))))
@@ -868,35 +1046,37 @@ This enforces rescanning the buffer on next use."
   ;; Record that we have done this, and what we have used.
   (setq reftex-tables-dirty nil)
   (setq reftex-memory 
-       (list reftex-label-alist
-             (get reftex-docstruct-symbol 'reftex-section-levels)
-             (get reftex-docstruct-symbol 'reftex-label-alist-style)
-             reftex-default-label-alist-entries
-             reftex-index-macros
-             (get reftex-docstruct-symbol 'reftex-index-macros-style)))
+        (list reftex-label-alist
+              (get reftex-docstruct-symbol 'reftex-section-levels)
+              (get reftex-docstruct-symbol 'reftex-label-alist-style)
+              reftex-default-label-alist-entries
+              reftex-index-macros
+              (get reftex-docstruct-symbol 'reftex-index-macros-style)))
 
   ;; Compile information in reftex-label-alist
   (let ((all (reftex-uniquify-by-car
-             (reftex-splice-symbols-into-list
-              (append reftex-label-alist
-                      (get reftex-docstruct-symbol
-                           'reftex-label-alist-style)
-                      reftex-default-label-alist-entries)
-              reftex-label-alist-builtin)
-             '(nil)))
-       (all-index (reftex-uniquify-by-car
-                   (reftex-splice-symbols-into-list
-                    (append reftex-index-macros 
-                            (get reftex-docstruct-symbol
-                                 'reftex-index-macros-style)
-                            '(default))
-                    reftex-index-macros-builtin)))
+              (reftex-splice-symbols-into-list
+               (append reftex-label-alist
+                       (get reftex-docstruct-symbol
+                            'reftex-label-alist-style)
+                       reftex-default-label-alist-entries)
+               reftex-label-alist-builtin)
+              '(nil)))
+        (all-index (reftex-uniquify-by-car
+                    (reftex-splice-symbols-into-list
+                     (append reftex-index-macros 
+                             (get reftex-docstruct-symbol
+                                  'reftex-index-macros-style)
+                             '(default))
+                     reftex-index-macros-builtin)))
         entry env-or-mac typekeychar typekey prefix context word
         fmt reffmt labelfmt wordlist qh-list macros-with-labels
         nargs nlabel opt-args cell sum i
-       macro verify repeat nindex tag key toc-level toc-levels)
+        macro verify repeat nindex tag key toc-level toc-levels)
 
     (setq reftex-words-to-typekey-alist nil
+          reftex-prefix-to-typekey-alist 
+          '(("sec:" . "s") ("cha:" . "s") ("chap:" . "s"))
           reftex-typekey-list nil
           reftex-typekey-to-format-alist nil
           reftex-typekey-to-prefix-alist nil
@@ -923,7 +1103,7 @@ This enforces rescanning the buffer on next use."
               fmt (nth 2 entry)
               context (nth 3 entry)
               wordlist (nth 4 entry)
-             toc-level (nth 5 entry))
+              toc-level (nth 5 entry))
         (if (stringp wordlist)
             ;; This is before version 2.04 - convert to new format
             (setq wordlist (nthcdr 4 entry)))
@@ -935,66 +1115,70 @@ This enforces rescanning the buffer on next use."
           (setq fmt (list "\\label{%s}" fmt)))
         (setq labelfmt (car fmt)
               reffmt (nth 1 fmt))
-       ;; Note a new typekey
+        ;; Note a new typekey
         (if typekey
             (add-to-list 'reftex-typekey-list typekey))
+        (if (and typekey prefix
+                 (not (assoc prefix reftex-prefix-to-typekey-alist)))
+            (add-to-list 'reftex-prefix-to-typekey-alist
+                         (cons prefix typekey)))
         (if (and typekey prefix
                  (not (assoc typekey reftex-typekey-to-prefix-alist)))
             (add-to-list 'reftex-typekey-to-prefix-alist
                          (cons typekey prefix)))
-       ;; Check if this is a macro or environment
+        ;; Check if this is a macro or environment
         (cond
-        ((symbolp env-or-mac)
-         ;; A special parser function
-         (unless (fboundp env-or-mac)
-           (message "Warning: %s does not seem to be a valid function" 
-                    env-or-mac))
+         ((symbolp env-or-mac)
+          ;; A special parser function
+          (unless (fboundp env-or-mac)
+            (message "Warning: %s does not seem to be a valid function" 
+                     env-or-mac))
           (setq nargs nil nlabel nil opt-args nil)
-         (add-to-list 'reftex-special-env-parsers env-or-mac)
-         (setq env-or-mac (symbol-name env-or-mac)))
+          (add-to-list 'reftex-special-env-parsers env-or-mac)
+          (setq env-or-mac (symbol-name env-or-mac)))
          ((string-match "\\`\\\\" env-or-mac)
           ;; It's a macro
           (let ((result (reftex-parse-args env-or-mac)))
             (setq env-or-mac (or (first result) env-or-mac)
-                 nargs (second result)
+                  nargs (second result)
                   nlabel (third result)
                   opt-args (fourth result))
             (if nlabel (add-to-list 'macros-with-labels env-or-mac)))
-         (if typekey (add-to-list 'reftex-label-mac-list env-or-mac)))
+          (if typekey (add-to-list 'reftex-label-mac-list env-or-mac)))
          (t
-         ;; It's an environment
+          ;; It's an environment
           (setq nargs nil nlabel nil opt-args nil)
           (cond ((string= env-or-mac "any"))
                 ((string= env-or-mac ""))
                 ((string= env-or-mac "section"))
                 (t
                  (add-to-list 'reftex-label-env-list env-or-mac)
-                (if toc-level
-                    (let ((string (format "begin{%s}" env-or-mac)))
-                      (or (assoc string toc-levels)
-                          (push (cons string toc-level) toc-levels))))))))
-       ;; Translate some special context cases
-       (when (assq context reftex-default-context-regexps)
-         (setq context 
-               (format 
-                (cdr (assq context reftex-default-context-regexps))
-                (regexp-quote env-or-mac))))
-       ;; See if this is the first format for this typekey
+                 (if toc-level
+                     (let ((string (format "begin{%s}" env-or-mac)))
+                       (or (assoc string toc-levels)
+                           (push (cons string toc-level) toc-levels))))))))
+        ;; Translate some special context cases
+        (when (assq context reftex-default-context-regexps)
+          (setq context 
+                (format 
+                 (cdr (assq context reftex-default-context-regexps))
+                 (regexp-quote env-or-mac))))
+        ;; See if this is the first format for this typekey
         (and reffmt
              (not (assoc typekey reftex-typekey-to-format-alist))
              (push (cons typekey reffmt) reftex-typekey-to-format-alist))
-       ;; See if this is the first definition for this env-or-mac
+        ;; See if this is the first definition for this env-or-mac
         (and (not (string= env-or-mac "any"))
              (not (string= env-or-mac ""))
              (not (assoc env-or-mac reftex-env-or-mac-alist))
              (push (list env-or-mac typekey context labelfmt
-                        nargs nlabel opt-args)
+                         nargs nlabel opt-args)
                    reftex-env-or-mac-alist))
-       ;; Are the magic words regular expressions?  Quote normal words.
-       (if (eq (car wordlist) 'regexp)
-           (setq wordlist (cdr wordlist))
-         (setq wordlist (mapcar 'regexp-quote wordlist)))
-       ;; Remember the first association of each word.
+        ;; Are the magic words regular expressions?  Quote normal words.
+        (if (eq (car wordlist) 'regexp)
+            (setq wordlist (cdr wordlist))
+          (setq wordlist (mapcar 'regexp-quote wordlist)))
+        ;; Remember the first association of each word.
         (while (stringp (setq word (pop wordlist)))
           (or (assoc word reftex-words-to-typekey-alist)
               (push (cons word typekey) reftex-words-to-typekey-alist)))
@@ -1010,9 +1194,9 @@ This enforces rescanning the buffer on next use."
 
     ;; Prepare the typekey query prompt and help string.
     (setq qh-list 
-         (sort qh-list
-               (lambda (x1 x2)
-                 (string< (downcase (car x1)) (downcase (car x2))))))
+          (sort qh-list
+                (lambda (x1 x2)
+                  (string< (downcase (car x1)) (downcase (car x2))))))
     (setq reftex-type-query-prompt
           (concat "Label type: ["
                   (mapconcat (lambda(x) (format "%s" (car x)))
@@ -1021,163 +1205,163 @@ This enforces rescanning the buffer on next use."
     ;; In the help string, we need to wrap lines...
     (setq reftex-type-query-help
           (concat 
-          "SELECT A LABEL TYPE:\n--------------------\n"
-          (mapconcat
-           (lambda(x)
-             (setq sum 0)
-             (format " [%s]   %s"
-                     (car x)
-                     (mapconcat (lambda(env)
-                                  (setq sum (+ sum (length env)))
-                                  (if (< sum 60)
-                                      env
-                                    (setq sum 0)
-                                    (concat "\n       " env)))
-                                (cdr x) " ")))
-           qh-list "\n")))
+           "SELECT A LABEL TYPE:\n--------------------\n"
+           (mapconcat
+            (lambda(x)
+              (setq sum 0)
+              (format " [%s]   %s"
+                      (car x)
+                      (mapconcat (lambda(env)
+                                   (setq sum (+ sum (length env)))
+                                   (if (< sum 60)
+                                       env
+                                     (setq sum 0)
+                                     (concat "\n       " env)))
+                                 (cdr x) " ")))
+            qh-list "\n")))
 
     ;; Convert magic words to regular expressions.  We make regular expressions
     ;; which allow for some chars from the ref format to be in the buffer.
     ;; These characters will be seen and removed.
     (setq reftex-words-to-typekey-alist
-         (mapcar 
-          (lambda (x)
-            (setq word (car x)
-                  typekey (cdr x)
-                  fmt (cdr (assoc typekey reftex-typekey-to-format-alist)))
-            (setq word (concat "\\W\\(" word "[ \t\n\r]*\\)\\("))
-            (setq i 0)
-            (while (and (< i 10)   ; maximum number of format chars allowed
-                        (< i (length fmt))
-                        (not (member (aref fmt i) '(?%))))
-              (setq word (concat word "\\|" (regexp-quote
-                                             (substring fmt 0 (1+ i)))))
-              (incf i))
-            (cons (concat word "\\)\\=") typekey))
-          (nreverse reftex-words-to-typekey-alist)))
+          (mapcar 
+           (lambda (x)
+             (setq word (car x)
+                   typekey (cdr x)
+                   fmt (cdr (assoc typekey reftex-typekey-to-format-alist)))
+             (setq word (concat "\\W\\(" word "[ \t\n\r]*\\)\\("))
+             (setq i 0)
+             (while (and (< i 10)   ; maximum number of format chars allowed
+                         (< i (length fmt))
+                         (not (member (aref fmt i) '(?%))))
+               (setq word (concat word "\\|" (regexp-quote
+                                              (substring fmt 0 (1+ i)))))
+               (incf i))
+             (cons (concat word "\\)\\=") typekey))
+           (nreverse reftex-words-to-typekey-alist)))
 
     ;; Parse the index macros
     (setq reftex-index-macro-alist nil
-         reftex-key-to-index-macro-alist nil
-         reftex-macros-with-index nil)
+          reftex-key-to-index-macro-alist nil
+          reftex-macros-with-index nil)
     (while all-index
       (setq entry (car all-index)
-           macro (car entry)
-           tag (nth 1 entry)
-           key (nth 2 entry)
-           prefix (or (nth 3 entry) "")
-           verify (nth 4 entry)
-           ;; For repeat, we need to be compatible with older code
-           ;; This information used to be given only for the default macro,
-           ;; but later we required to have it for *every* index macro
-           repeat (cond ((> (length entry) 5) (nth 5 entry))
-                        ((and (eq key (car reftex-index-default-macro))
-                              (> (length reftex-index-default-macro) 2))
-                         ;; User has old setting - respect it
-                         (nth 2 reftex-index-default-macro))
-                        (t t))
-           all-index (cdr all-index))
+            macro (car entry)
+            tag (nth 1 entry)
+            key (nth 2 entry)
+            prefix (or (nth 3 entry) "")
+            verify (nth 4 entry)
+            ;; For repeat, we need to be compatible with older code
+            ;; This information used to be given only for the default macro,
+            ;; but later we required to have it for *every* index macro
+            repeat (cond ((> (length entry) 5) (nth 5 entry))
+                         ((and (eq key (car reftex-index-default-macro))
+                               (> (length reftex-index-default-macro) 2))
+                          ;; User has old setting - respect it
+                          (nth 2 reftex-index-default-macro))
+                         (t t))
+            all-index (cdr all-index))
       (let ((result (reftex-parse-args macro)))
-       (setq macro (or (first result) macro)
-             nargs (second result)
-             nindex (third result)
-             opt-args (fourth result))
-       (unless (member macro reftex-macros-with-index)
-         ;;           0     1    2      3     4     5       6        7
-         (push (list macro tag prefix verify nargs nindex opt-args repeat)
-               reftex-index-macro-alist)
-         (or (assoc key reftex-key-to-index-macro-alist)
-             (push (list key macro) reftex-key-to-index-macro-alist))
-         (push macro reftex-macros-with-index))))
+        (setq macro (or (first result) macro)
+              nargs (second result)
+              nindex (third result)
+              opt-args (fourth result))
+        (unless (member macro reftex-macros-with-index)
+          ;;           0     1    2      3     4     5       6        7
+          (push (list macro tag prefix verify nargs nindex opt-args repeat)
+                reftex-index-macro-alist)
+          (or (assoc key reftex-key-to-index-macro-alist)
+              (push (list key macro) reftex-key-to-index-macro-alist))
+          (push macro reftex-macros-with-index))))
     ;; Make the prompt and help string for index macros query
     (setq reftex-key-to-index-macro-alist
-         (sort reftex-key-to-index-macro-alist
-               (lambda (a b) (< (downcase (car a)) (downcase (car b))))))
+          (sort reftex-key-to-index-macro-alist
+                (lambda (a b) (< (downcase (car a)) (downcase (car b))))))
     (setq reftex-query-index-macro-prompt 
-         (concat "Index macro: ["
-                 (mapconcat (lambda (x) (char-to-string (car x)))
-                            reftex-key-to-index-macro-alist "")
-                 "]"))
+          (concat "Index macro: ["
+                  (mapconcat (lambda (x) (char-to-string (car x)))
+                             reftex-key-to-index-macro-alist "")
+                  "]"))
     (setq i 0
-         reftex-query-index-macro-help
-         (concat 
-          "SELECT A MACRO:\n---------------\n"
-          (mapconcat
-           (lambda(x)
-             (format "[%c] %-20.20s%s" (car x) (nth 1 x) 
-                     (if (= 0 (mod (incf i) 3)) "\n" "")))
-           reftex-key-to-index-macro-alist "")))
+          reftex-query-index-macro-help
+          (concat 
+           "SELECT A MACRO:\n---------------\n"
+           (mapconcat
+            (lambda(x)
+              (format "[%c] %-20.20s%s" (car x) (nth 1 x) 
+                      (if (= 0 (mod (incf i) 3)) "\n" "")))
+            reftex-key-to-index-macro-alist "")))
 
     ;; Make the full list of section levels
     (setq reftex-section-levels-all
-         (append toc-levels
-                 (get reftex-docstruct-symbol 'reftex-section-levels)
-                 reftex-section-levels))
+          (append toc-levels
+                  (get reftex-docstruct-symbol 'reftex-section-levels)
+                  reftex-section-levels))
 
     ;; Calculate the regular expressions
     (let* (
-;         (wbol "\\(\\`\\|[\n\r]\\)[ \t]*")
-          (wbol "\\(^\\)[ \t]*")  ; Need to keep the empty group because
-                                 ;;; because match number are hard coded  
-          (label-re "\\\\label{\\([^}]*\\)}")
-          (include-re (concat wbol 
-                              "\\\\\\("
-                              (mapconcat 'identity 
-                                         reftex-include-file-commands "\\|")
-                              "\\)[{ \t]+\\([^} \t\n\r]+\\)"))
-          (section-re
-           (concat wbol "\\\\\\("
-                   (mapconcat (lambda (x) (regexp-quote (car x)))
-                              reftex-section-levels-all "\\|")
-                   "\\)\\*?\\(\\[[^]]*\\]\\)?[[{ \t\r\n]"))
-          (appendix-re (concat wbol "\\(\\\\appendix\\)"))
-          (macro-re
-           (if macros-with-labels
-               (concat "\\("
-                       (mapconcat 'regexp-quote macros-with-labels "\\|")
-                       "\\)[[{]")
-             ""))
-          (index-re
-           (concat "\\("
-                   (mapconcat 'regexp-quote reftex-macros-with-index "\\|")
-                   "\\)[[{]"))
-          (find-index-re-format
-           (concat "\\("
-                   (mapconcat 'regexp-quote reftex-macros-with-index "\\|")
-                   "\\)\\([[{][^]}]*[]}]\\)*[[{]\\(%s\\)[]}]"))
-          (find-label-re-format
-           (concat "\\("
-                   (mapconcat 'regexp-quote (append '("\\label")
-                                                    macros-with-labels) "\\|")
-                   "\\)\\([[{][^]}]*[]}]\\)*[[{]\\(%s\\)[]}]"))
-          (index-level-re
-           (regexp-quote (nth 0 reftex-index-special-chars)))
-          (index-key-end-re ;; ^]- not allowed
-           (concat "[^" (nth 3 reftex-index-special-chars) "]"
-                   "[" (nth 1 reftex-index-special-chars)
-                   (nth 2 reftex-index-special-chars) "]"))
-          )
+;          (wbol "\\(\\`\\|[\n\r]\\)[ \t]*")
+           (wbol "\\(^\\)[ \t]*")  ; Need to keep the empty group because
+                                  ;;; because match number are hard coded  
+           (label-re "\\\\label{\\([^}]*\\)}")
+           (include-re (concat wbol 
+                               "\\\\\\("
+                               (mapconcat 'identity 
+                                          reftex-include-file-commands "\\|")
+                               "\\)[{ \t]+\\([^} \t\n\r]+\\)"))
+           (section-re
+            (concat wbol "\\\\\\("
+                    (mapconcat (lambda (x) (regexp-quote (car x)))
+                               reftex-section-levels-all "\\|")
+                    "\\)\\*?\\(\\[[^]]*\\]\\)?[[{ \t\r\n]"))
+           (appendix-re (concat wbol "\\(\\\\appendix\\)"))
+           (macro-re
+            (if macros-with-labels
+                (concat "\\("
+                        (mapconcat 'regexp-quote macros-with-labels "\\|")
+                        "\\)[[{]")
+              ""))
+           (index-re
+            (concat "\\("
+                    (mapconcat 'regexp-quote reftex-macros-with-index "\\|")
+                    "\\)[[{]"))
+           (find-index-re-format
+            (concat "\\("
+                    (mapconcat 'regexp-quote reftex-macros-with-index "\\|")
+                    "\\)\\([[{][^]}]*[]}]\\)*[[{]\\(%s\\)[]}]"))
+           (find-label-re-format
+            (concat "\\("
+                    (mapconcat 'regexp-quote (append '("\\label")
+                                                     macros-with-labels) "\\|")
+                    "\\)\\([[{][^]}]*[]}]\\)*[[{]\\(%s\\)[]}]"))
+           (index-level-re
+            (regexp-quote (nth 0 reftex-index-special-chars)))
+           (index-key-end-re ;; ^]- not allowed
+            (concat "[^" (nth 3 reftex-index-special-chars) "]"
+                    "[" (nth 1 reftex-index-special-chars)
+                    (nth 2 reftex-index-special-chars) "]"))
+           )
       (setq reftex-section-regexp section-re
             reftex-section-or-include-regexp
             (concat section-re "\\|" include-re)
             reftex-everything-regexp
             (concat label-re "\\|" section-re "\\|" include-re
-                   "\\|" appendix-re
-                   "\\|" index-re
+                    "\\|" appendix-re
+                    "\\|" index-re
                     (if macros-with-labels "\\|" "") macro-re)
             reftex-everything-regexp-no-index
             (concat label-re "\\|" section-re "\\|" include-re
-                   "\\|" appendix-re
-                   "\\|" "\\(\\\\6\\\\3\\\\1\\)" ; This is unlikely to match
+                    "\\|" appendix-re
+                    "\\|" "\\(\\\\6\\\\3\\\\1\\)" ; This is unlikely to match
                     (if macros-with-labels "\\|" "") macro-re)
-           reftex-index-re index-re
-           reftex-index-level-re index-level-re
-           reftex-index-key-end-re index-key-end-re
-           reftex-macros-with-labels macros-with-labels
-           reftex-find-index-entry-regexp-format find-index-re-format
+            reftex-index-re index-re
+            reftex-index-level-re index-level-re
+            reftex-index-key-end-re index-key-end-re
+            reftex-macros-with-labels macros-with-labels
+            reftex-find-index-entry-regexp-format find-index-re-format
             reftex-find-label-regexp-format find-label-re-format
-           reftex-find-label-regexp-format2 
-           "\\([]} \t\n\r]\\)\\([[{]\\)\\(%s\\)[]}]")
+            reftex-find-label-regexp-format2 
+            "\\([]} \t\n\r]\\)\\([[{]\\)\\(%s\\)[]}]")
       (message "Compiling label environment definitions...done")))
   (put reftex-docstruct-symbol 'reftex-cache
        (mapcar 'symbol-value reftex-cache-variables)))
@@ -1195,8 +1379,8 @@ This enforces rescanning the buffer on next use."
             (when (eq ?\[ (string-to-char args))
               (push cnt opt-list))
             (when (and (match-end 1)
-                      (not nlabel))
-             (setq nlabel cnt))
+                       (not nlabel))
+              (setq nlabel cnt))
             (setq args (substring args (match-end 0))))
           (list must-match cnt nlabel opt-list)))
     nil))
@@ -1212,6 +1396,11 @@ This enforces rescanning the buffer on next use."
   ;; But, when RESCAN is -1, don't rescan even if docstruct is empty.
   ;; When FILE is non-nil, parse only from that file.
 
+  ;; Error out in a buffer without a file.
+  (if (and reftex-mode
+          (not (buffer-file-name)))
+      (error "RefTeX works only in buffers visiting a file"))
+
   ;; Make sure we have the symbols tied
   (if (eq reftex-docstruct-symbol nil)
       ;; Symbols are not yet tied: Tie them.
@@ -1220,14 +1409,14 @@ This enforces rescanning the buffer on next use."
   (reftex-ensure-compiled-variables)
 
   (when (or (null (symbol-value reftex-docstruct-symbol))
-           (member rescan '(t 1 (4) (16))))
+            (member rescan '(t 1 (4) (16))))
     ;; The docstruct will change: Remove selection buffers.
     (save-excursion
       (reftex-erase-buffer "*toc*")
       (reftex-erase-all-selection-and-index-buffers)))
 
   (if (and (null (symbol-value reftex-docstruct-symbol))
-          (not (member rescan '(t 1 (4) (16))))
+           (not (member rescan '(t 1 (4) (16))))
            reftex-save-parse-info)
       ;; Try to read the stuff from a file
       (reftex-access-parse-file 'read))
@@ -1261,12 +1450,12 @@ This enforces rescanning the buffer on next use."
   "Perform ACTION on the parse file (the .rel file).
 Valid actions are: readable, restore, read, kill, write."
   (let* ((list (symbol-value reftex-docstruct-symbol))
-        (docstruct-symbol reftex-docstruct-symbol)
+         (docstruct-symbol reftex-docstruct-symbol)
          (master (reftex-TeX-master-file))
-        (enable-local-variables nil)
+         (enable-local-variables nil)
          (file (if (string-match "\\.[a-zA-Z]+\\'" master)
                    (concat (substring master 0 (match-beginning 0)) 
-                          reftex-parse-file-extension)
+                           reftex-parse-file-extension)
                  (concat master reftex-parse-file-extension))))
     (cond
      ((eq action 'readable)
@@ -1278,64 +1467,60 @@ Valid actions are: readable, restore, read, kill, write."
           (reftex-tie-multifile-symbols))
       (if (file-exists-p file)
           ;; load the file and return t for success
-         (condition-case nil
-             (progn (load-file file) t)
-           (error (set reftex-docstruct-symbol nil)
-                  (error "Error while loading file %s" file)))
+          (condition-case nil
+              (progn (load-file file) t)
+            (error (set reftex-docstruct-symbol nil)
+                   (error "Error while loading file %s" file)))
         ;; Throw an exception if the file does not exist
         (error "No restore file %s" file)))
      ((eq action 'read)
       (put reftex-docstruct-symbol 'modified nil)
       (if (file-exists-p file)
           ;; load the file and return t for success
-         (condition-case nil
-             (progn
-               (load-file file)
-               (reftex-check-parse-consistency)
-               t)
-           (error (message "Error while restoring file %s" file)
-                  (set reftex-docstruct-symbol nil)
-                  nil))
+          (condition-case nil
+              (progn
+                (load-file file)
+                (reftex-check-parse-consistency)
+                t)
+            (error (message "Error while restoring file %s" file)
+                   (set reftex-docstruct-symbol nil)
+                   nil))
         ;; return nil for failure, but no exception
         nil))
      ((eq action 'kill)
       ;; Remove the file
       (when (and (file-exists-p file) (file-writable-p file))
-       (message "Unlinking file %s" file)
-       (delete-file file)))
+        (message "Unlinking file %s" file)
+        (delete-file file)))
      (t
       (put docstruct-symbol 'modified nil)
       (save-excursion
         (if (file-writable-p file)
-            (progn
+            (with-temp-file file
               (message "Writing parse file %s" (abbreviate-file-name file))
-              (find-file file)
-              (erase-buffer)
               (insert (format ";; RefTeX parse info file\n"))
               (insert (format ";; File: %s\n" master))
               (insert (format ";; User: %s (%s)\n\n"
                               (user-login-name) (user-full-name)))
               (insert "(set reftex-docstruct-symbol '(\n\n")
               (let ((standard-output (current-buffer)))
-                (mapcar
-                (lambda (x)
-                  (cond ((eq (car x) 'toc)
-                         ;; A toc entry. Do not save the marker.
-                         ;; Save the markers  position at position 8
-                         (print (list 'toc "toc" (nth 2 x) (nth 3 x)
-                                      nil (nth 5 x) (nth 6 x) (nth 7 x)
-                                      (or (and (markerp (nth 4 x))
-                                               (marker-position (nth 4 x)))
-                                          (nth 8 x)))))
-                        ((and (not (eq t reftex-support-index))
-                              (eq (car x) 'index))
-                         ;; Don't save index entries
-                         )
-                        (t (print x))))
+                (mapc
+                 (lambda (x)
+                   (cond ((eq (car x) 'toc)
+                          ;; A toc entry. Do not save the marker.
+                          ;; Save the markers  position at position 8
+                          (print (list 'toc "toc" (nth 2 x) (nth 3 x)
+                                       nil (nth 5 x) (nth 6 x) (nth 7 x)
+                                       (or (and (markerp (nth 4 x))
+                                                (marker-position (nth 4 x)))
+                                           (nth 8 x)))))
+                         ((and (not (eq t reftex-support-index))
+                               (eq (car x) 'index))
+                          ;; Don't save index entries
+                          )
+                         (t (print x))))
                  list))
-              (insert "))\n\n")
-              (save-buffer 0)
-              (kill-buffer (current-buffer)))
+              (insert "))\n\n"))
           (error "Cannot write to file %s" file)))
       t))))
 
@@ -1344,29 +1529,29 @@ Valid actions are: readable, restore, read, kill, write."
 
   ;; Check if the master is the same: when moving a document, this will see it.
   (let* ((real-master (reftex-TeX-master-file))
-        (parsed-master 
-         (nth 1 (assq 'bof (symbol-value reftex-docstruct-symbol)))))
+         (parsed-master 
+          (nth 1 (assq 'bof (symbol-value reftex-docstruct-symbol)))))
     (unless (string= (file-truename real-master) (file-truename parsed-master))
       (message "Master file name in load file is different: %s versus %s"
-              parsed-master real-master)
+               parsed-master real-master)
       (error "Master file name error")))
 
   ;; Check for the existence of all document files
 ;;;  (let* ((all (symbol-value reftex-docstruct-symbol)))
 ;;;    (while all
 ;;;      (when (and (eq (car (car all)) 'bof)
-;;;             (not (file-regular-p (nth 1 (car all)))))
-;;;    (message "File %s in saved parse info not avalable" (cdr (car all)))
-;;;    (error "File not found"))
+;;;              (not (file-regular-p (nth 1 (car all)))))
+;;;     (message "File %s in saved parse info not avalable" (cdr (car all)))
+;;;     (error "File not found"))
 ;;;      (setq all (cdr all))))
   )
 
 (defun reftex-select-external-document (xr-alist xr-index)
   ;; Return index of an external document.
   (let* ((len (length xr-alist)) (highest (1- (+ ?0 len)))
-        (prompt (format "[%c-%c] Select    TAB: Read prefix with completion" 
-                        ?0 highest))
-        key prefix)
+         (prompt (format "[%c-%c] Select    TAB: Read prefix with completion" 
+                         ?0 highest))
+         key prefix)
     (cond
      ((= len 1)
       (message "No external documents available")
@@ -1375,27 +1560,27 @@ Valid actions are: readable, restore, read, kill, write."
       (- 1 xr-index))
      (t
       (save-excursion
-       (let* ((length (apply 'max (mapcar 
-                                   (lambda(x) (length (car x))) xr-alist)))
-              (fmt (format " [%%c]  %%-%ds  %%s\n" length))
-              (n (1- ?0)))
-         (setq key
-               (reftex-select-with-char
-                prompt
-                (concat
-                 "SELECT EXTERNAL DOCUMENT\n------------------------\n"
-                 (mapconcat
-                  (lambda (x) 
-                    (format fmt (incf n) (or (car x) "")
-                            (abbreviate-file-name (cdr x))))
-                  xr-alist ""))
-                nil t))
-         (cond
-          ((and (>= key ?0) (<= key highest)) (- key ?0))
-          ((= key ?\C-i)
-           (setq prefix (completing-read "Prefix: " xr-alist nil t))
-           (- len (length (memq (assoc prefix xr-alist) xr-alist))))
-          (t (error "Illegal document selection [%c]" key)))))))))
+        (let* ((length (apply 'max (mapcar 
+                                    (lambda(x) (length (car x))) xr-alist)))
+               (fmt (format " [%%c]  %%-%ds  %%s\n" length))
+               (n (1- ?0)))
+          (setq key
+                (reftex-select-with-char
+                 prompt
+                 (concat
+                  "SELECT EXTERNAL DOCUMENT\n------------------------\n"
+                  (mapconcat
+                   (lambda (x) 
+                     (format fmt (incf n) (or (car x) "")
+                             (abbreviate-file-name (cdr x))))
+                   xr-alist ""))
+                 nil t))
+          (cond
+           ((and (>= key ?0) (<= key highest)) (- key ?0))
+           ((= key ?\C-i)
+            (setq prefix (completing-read "Prefix: " xr-alist nil t))
+            (- len (length (memq (assoc prefix xr-alist) xr-alist))))
+           (t (error "Invalid document selection [%c]" key)))))))))
 
 ;;; =========================================================================
 ;;;
@@ -1403,69 +1588,69 @@ Valid actions are: readable, restore, read, kill, write."
 
 (defun reftex-locate-file (file type master-dir &optional die)
   "Find FILE of type TYPE in MASTER-DIR or on the path associcted with TYPE.
-If the file does not have any of the legal extensions for TYPE,
+If the file does not have any of the valid extensions for TYPE,
 try first the default extension and only then the naked file name.
 When DIE is non-nil, throw an error if file not found."
   (let* ((rec-values (if reftex-search-unrecursed-path-first '(nil t) '(t)))
-        (extensions (cdr (assoc type reftex-file-extensions)))
-        (def-ext (car extensions))
-        (ext-re (concat "\\(" 
-                        (mapconcat 'regexp-quote extensions "\\|")
-                        "\\)\\'"))
-        (files (if (string-match ext-re file)
-                   (cons file nil)
-                 (cons (concat file def-ext) file)))
-        path old-path file1)
+         (extensions (cdr (assoc type reftex-file-extensions)))
+         (def-ext (car extensions))
+         (ext-re (concat "\\(" 
+                         (mapconcat 'regexp-quote extensions "\\|")
+                         "\\)\\'"))
+         (files (if (string-match ext-re file)
+                    (cons file nil)
+                 (if reftex-try-all-extensions
+                     (append (mapcar (lambda (x) (concat file x))
+                                     extensions)
+                             (list file))
+                   (list (concat file def-ext) file))))
+         path old-path file1 f fs)
     (cond
      ((file-name-absolute-p file)
-      (setq file1 
-           (or 
-            (and (car files) (file-regular-p (car files)) (car files))
-            (and (cdr files) (file-regular-p (cdr files)) (cdr files)))))
+      (while (setq f (pop files))
+       (if (file-regular-p f)
+           (setq file1 f files nil))))
      ((and reftex-use-external-file-finders
-          (assoc type reftex-external-file-finders))
+           (assoc type reftex-external-file-finders))
       (setq file1 (reftex-find-file-externally file type master-dir)))
      (t
       (while (and (null file1) rec-values)
-       (setq path (reftex-access-search-path
-                   type (pop rec-values) master-dir file))
-       (if (or (null old-path)
-               (not (eq old-path path)))
+        (setq path (reftex-access-search-path
+                    type (pop rec-values) master-dir file))
+       (setq fs files)
+       (while (and (null file1) (setq f (pop fs)))
+         (when (or (null old-path)
+                   (not (eq old-path path)))
            (setq old-path path
-                 path (cons master-dir path)
-                 file1 (or (and (car files)
-                                (reftex-find-file-on-path 
-                                 (car files) path master-dir))
-                           (and (cdr files)
-                                (reftex-find-file-on-path 
-                                 (cdr files) path master-dir))))))))
+                 path (cons master-dir path))
+           (setq file1 (reftex-find-file-on-path f path master-dir)))))))
     (cond (file1 file1)
-         (die (error "No such file: %s" file) nil)
-         (t (message "No such file: %s (ignored)" file) nil))))
+          (die (error "No such file: %s" file) nil)
+          (t (message "No such file: %s (ignored)" file) nil))))
 
 (defun reftex-find-file-externally (file type &optional master-dir)
   ;; Use external program to find FILE.
   ;; The program is taken from `reftex-external-file-finders'.
   ;; Interprete relative path definitions starting from MASTER-DIR.
   (let ((default-directory (or master-dir default-directory))
-       (prg (cdr (assoc type reftex-external-file-finders)))
-       out)
+        (prg (cdr (assoc type reftex-external-file-finders)))
+        out)
     (if (string-match "%f" prg)
-       (setq prg (replace-match file t t prg)))
+        (setq prg (replace-match file t t prg)))
     (setq out (apply 'reftex-process-string (split-string prg)))
     (if (string-match "[ \t\n]+\\'" out)     ; chomp
-       (setq out (replace-match "" nil nil out)))
+        (setq out (replace-match "" nil nil out)))
     (cond ((equal out "") nil)
-         ((file-regular-p out) (expand-file-name out master-dir))
-         (t nil))))
+          ((file-regular-p out) (expand-file-name out master-dir))
+          (t nil))))
 
 (defun reftex-process-string (program &rest args)
   "Execute PROGRAM with arguments ARGS and return its STDOUT as a string."
   (let ((calling-dir default-directory))  ; remember default directory
     (with-output-to-string
       (with-current-buffer standard-output
-       (let ((default-directory calling-dir)) ; set default directory
-         (apply 'call-process program nil '(t nil) nil args))))))
+        (let ((default-directory calling-dir)) ; set default directory
+          (apply 'call-process program nil '(t nil) nil args))))))
 
 (defun reftex-access-search-path (type &optional recurse master-dir file)
   ;; Access path from environment variables.  TYPE is either "tex" or "bib".
@@ -1479,51 +1664,51 @@ When DIE is non-nil, throw an error if file not found."
     (when (null (get pathvar 'status))
       ;; Get basic path
       (set pathvar
-          (reftex-uniq
-           (reftex-parse-colon-path
-            (mapconcat
-             (lambda(x) 
-               (if (string-match "^!" x)
-                   (apply 'reftex-process-string
-                          (split-string (substring x 1)))
-                 (or (getenv x) x)))
-             ;; For consistency, the next line should look like this:
-             ;;  (cdr (assoc type reftex-path-environment))
-             ;; However, historically we have separate options for the
-             ;; environment variables, so we have to do this:
-             (symbol-value (intern (concat "reftex-" type 
-                                           "path-environment-variables")))
-             path-separator))))
+           (reftex-uniquify
+            (reftex-parse-colon-path
+             (mapconcat
+              (lambda(x) 
+                (if (string-match "^!" x)
+                    (apply 'reftex-process-string
+                           (split-string (substring x 1)))
+                  (or (getenv x) x)))
+              ;; For consistency, the next line should look like this:
+              ;;  (cdr (assoc type reftex-path-environment))
+              ;; However, historically we have separate options for the
+              ;; environment variables, so we have to do this:
+              (symbol-value (intern (concat "reftex-" type 
+                                            "path-environment-variables")))
+              path-separator))))
       (put pathvar 'status 'split)
       ;; Check if we have recursive elements
       (let ((path (symbol-value pathvar)) dir rec)
-       (while (setq dir (pop path))
-         (when (string= (substring dir -2) "//")
-           (if (file-name-absolute-p dir)
-               (setq rec (or rec 'absolute))
-             (setq rec 'relative))))
-       (put pathvar 'rec-type rec)))
+        (while (setq dir (pop path))
+          (when (string= (substring dir -2) "//")
+            (if (file-name-absolute-p dir)
+                (setq rec (or rec 'absolute))
+              (setq rec 'relative))))
+        (put pathvar 'rec-type rec)))
 
     (if recurse
-       ;; Return the recursive expansion of the path
-       (cond
-        ((not (get pathvar 'rec-type))
-         ;; Path does not contain recursive elements - use simple path
-         (symbol-value pathvar))
-        ((or (not (get pathvar 'recursive-path))
-             (and (eq (get pathvar 'rec-type) 'relative)
-                  (not (equal master-dir (get pathvar 'master-dir)))))
-         ;; Either: We don't have a recursive expansion yet.
-         ;; or:     Relative recursive path elements need to be expanded
-         ;;         relative to new default directory
-         (message "Expanding search path to find %s file: %s ..." type file)
-         (put pathvar 'recursive-path 
-              (reftex-expand-path (symbol-value pathvar) master-dir))
-         (put pathvar 'master-dir master-dir)
-         (get pathvar 'recursive-path))
-        (t 
-         ;; Recursive path computed earlier is still OK.
-         (get pathvar 'recursive-path)))
+        ;; Return the recursive expansion of the path
+        (cond
+         ((not (get pathvar 'rec-type))
+          ;; Path does not contain recursive elements - use simple path
+          (symbol-value pathvar))
+         ((or (not (get pathvar 'recursive-path))
+              (and (eq (get pathvar 'rec-type) 'relative)
+                   (not (equal master-dir (get pathvar 'master-dir)))))
+          ;; Either: We don't have a recursive expansion yet.
+          ;; or:     Relative recursive path elements need to be expanded
+          ;;         relative to new default directory
+          (message "Expanding search path to find %s file: %s ..." type file)
+          (put pathvar 'recursive-path 
+               (reftex-expand-path (symbol-value pathvar) master-dir))
+          (put pathvar 'master-dir master-dir)
+          (get pathvar 'recursive-path))
+         (t 
+          ;; Recursive path computed earlier is still OK.
+          (get pathvar 'recursive-path)))
       ;; The simple path was requested
       (symbol-value pathvar))))
 
@@ -1533,15 +1718,15 @@ When DIE is non-nil, throw an error if file not found."
   (catch 'exit
     (when (file-name-absolute-p file)
       (if (file-regular-p file)
-         (throw 'exit file)
-       (throw 'exit nil)))
+          (throw 'exit file)
+        (throw 'exit nil)))
     (let* ((thepath path) file1 dir)
       (while (setq dir (pop thepath))
-       (when (string= (substring dir -2) "//")
-         (setq dir (substring dir 0 -1)))
-       (setq file1 (expand-file-name file (expand-file-name dir def-dir)))
-       (if (file-regular-p file1)
-           (throw 'exit file1)))
+        (when (string= (substring dir -2) "//")
+          (setq dir (substring dir 0 -1)))
+        (setq file1 (expand-file-name file (expand-file-name dir def-dir)))
+        (if (file-regular-p file1)
+            (throw 'exit file1)))
       ;; No such file
       nil)))
 
@@ -1551,7 +1736,7 @@ When DIE is non-nil, throw an error if file not found."
   (mapcar
    (lambda (dir)
      (if (string-match "\\(//+\\|/*!+\\)\\'" dir) 
-        (setq dir (replace-match "//" t t dir)))
+         (setq dir (replace-match "//" t t dir)))
      (file-name-as-directory dir))
    (delete "" (split-string path (concat path-separator "+")))))
 
@@ -1561,15 +1746,15 @@ When DIE is non-nil, throw an error if file not found."
   (let (path1 dir recursive)
     (while (setq dir (pop path))
       (if (setq recursive (string= (substring dir -2) "//"))
-         (setq dir (substring dir 0 -1)))
+          (setq dir (substring dir 0 -1)))
       (if (and recursive
-              (not (file-name-absolute-p dir)))
-         (setq dir (expand-file-name dir default-dir)))
+               (not (file-name-absolute-p dir)))
+          (setq dir (expand-file-name dir default-dir)))
       (if recursive
-         ;; Expand recursively
-         (setq path1 (append (reftex-recursive-directory-list dir) path1))
-       ;; Keep unchanged
-       (push dir path1)))
+          ;; Expand recursively
+          (setq path1 (append (reftex-recursive-directory-list dir) path1))
+        ;; Keep unchanged
+        (push dir path1)))
     (nreverse path1)))
 
 (defun reftex-recursive-directory-list (dir)
@@ -1577,181 +1762,13 @@ When DIE is non-nil, throw an error if file not found."
   (let ((path (list dir)) path1 file files)
     (while (setq dir (pop path))
       (when (file-directory-p dir)
-       (setq files (nreverse (directory-files dir t "[^.]")))
-       (while (setq file (pop files))
-         (if (file-directory-p file) 
-             (push (file-name-as-directory file) path)))
-       (push dir path1)))
+        (setq files (nreverse (directory-files dir t "[^.]")))
+        (while (setq file (pop files))
+          (if (file-directory-p file) 
+              (push (file-name-as-directory file) path)))
+        (push dir path1)))
     path1))
 
-(defun reftex-uniq (list)
-  (let (new)
-    (while list
-      (or (member (car list) new)
-         (push (car list) new))
-      (pop list))
-    (nreverse new)))
-
-
-;;; =========================================================================
-;;;
-;;; Parser functions
-
-(autoload 'reftex-parse-one "reftex-parse"
-  "Re-parse this file." t)
-(autoload 'reftex-parse-all "reftex-parse"
-  "Re-parse entire document." t)
-(autoload 'reftex-do-parse "reftex-parse")
-(autoload 'reftex-where-am-I "reftex-parse")
-(autoload 'reftex-init-section-numbers "reftex-parse")
-(autoload 'reftex-section-info "reftex-parse")
-(autoload 'reftex-section-number "reftex-parse")
-(autoload 'reftex-what-macro "reftex-parse")
-(autoload 'reftex-what-macro-safe "reftex-parse")
-(autoload 'reftex-index-info "reftex-parse")
-(autoload 'reftex-index-info-safe "reftex-parse")
-(autoload 'reftex-short-context "reftex-parse")
-(autoload 'reftex-what-environment "reftex-parse")
-(autoload 'reftex-what-special-env "reftex-parse")
-(autoload 'reftex-move-over-touching-args "reftex-parse")
-(autoload 'reftex-notice-new "reftex-parse")
-(autoload 'reftex-nth-arg "reftex-parse")
-(autoload 'reftex-locate-bibliography-files "reftex-parse")
-(autoload 'reftex-all-document-files "reftex-parse")
-(autoload 'reftex-ensure-index-support "reftex-parse")
-(autoload 'reftex-everything-regexp "reftex-parse")
-
-
-;;; =========================================================================
-;;;
-;;; Labels and References
-
-(autoload 'reftex-label-location "reftex-ref")
-(autoload 'reftex-label-info-update "reftex-ref")
-(autoload 'reftex-label-info "reftex-ref")
-(autoload 'reftex-label "reftex-ref"
- "Insert a unique label." t)
-(autoload 'reftex-reference "reftex-ref"
- "Make a LaTeX reference." t)
-(autoload 'reftex-varioref-vref "reftex-ref"
-  "Make a varioref reference." t)
-(autoload 'reftex-fancyref-fref "reftex-ref"
-  "Make a fancyref \\fref reference." t)
-(autoload 'reftex-fancyref-Fref "reftex-ref"
-  "Make a fancyref \\Fref reference." t)
-(autoload 'reftex-show-label-location "reftex-ref")
-(autoload 'reftex-query-label-type "reftex-ref")
-
-
-;;; =========================================================================
-;;;
-;;; Table of contents
-
-(autoload 'reftex-toc "reftex-toc"
- "Show the table of contents for the current document." t)
-
-
-;;; =========================================================================
-;;;
-;;; BibTeX citations.
-
-(autoload 'reftex-citep "reftex-cite")
-(autoload 'reftex-citet "reftex-cite")
-(autoload 'reftex-make-cite-echo-string "reftex-cite")
-(autoload 'reftex-get-bibfile-list "reftex-cite")
-(autoload 'reftex-pop-to-bibtex-entry "reftex-cite")
-(autoload 'reftex-end-of-bib-entry "reftex-cite")
-(autoload 'reftex-parse-bibtex-entry "reftex-cite")
-(autoload 'reftex-citation "reftex-cite"
- "Make a citation using BibTeX database files." t)
-(autoload 'reftex-default-bibliography "reftex-cite")
-
-
-;;; =========================================================================
-;;;
-;;; Selection
-
-(autoload 'reftex-select-label-mode "reftex-sel")
-(autoload 'reftex-select-bib-mode "reftex-sel")
-(autoload 'reftex-find-start-point "reftex-sel")
-(autoload 'reftex-insert-docstruct "reftex-sel")
-(autoload 'reftex-get-offset "reftex-sel")
-(autoload 'reftex-select-item "reftex-sel")
-
-
-;;; =========================================================================
-;;;
-;;; Index support
-
-(autoload 'reftex-index "reftex-index"
- "Query for an index macro and insert it along with its argments." t)
-(autoload 'reftex-index-selection-or-word "reftex-index"
- "Put selection or the word near point into the default index macro." t)
-(autoload 'reftex-index-phrase-selection-or-word "reftex-index"
- "Put selection or the word near point into Index Phrases File." t)
-(autoload 'reftex-display-index "reftex-index"
- "Display a buffer with an index compiled from the current document." t)
-(autoload 'reftex-index-visit-phrases-buffer "reftex-index"
- "Visit the Index Phrases File." t)
-(autoload 'reftex-index-phrases-mode "reftex-index"
- "Major mode for managing the Index phrases of a LaTeX document." t)
-(autoload 'reftex-index-complete-tag "reftex-index")
-(autoload 'reftex-index-complete-key "reftex-index")
-(autoload 'reftex-index-show-entry "reftex-index")
-(autoload 'reftex-index-select-tag "reftex-index")
-
-
-;;; =========================================================================
-;;;
-;;; View cross references
-
-(autoload 'reftex-view-crossref "reftex-dcr"
- "View cross reference of \\ref or \\cite macro at point." t)
-(autoload 'reftex-mouse-view-crossref "reftex-dcr"
- "View cross reference of \\ref or \\cite macro where you click." t)
-(autoload 'reftex-toggle-auto-view-crossref "reftex-dcr")
-(autoload 'reftex-view-crossref-from-bibtex "reftex-dcr"
- "View location in a LaTeX document which cites the BibTeX entry at point." t)
-
-
-;;; =========================================================================
-;;;
-;;; Operations on entire Multifile documents
-
-(autoload 'reftex-create-tags-file "reftex-global"
- "Create TAGS file by running `etags' on the current document." t)
-(autoload 'reftex-grep-document "reftex-global"
- "Run grep query through all files related to this document." t)
-(autoload 'reftex-search-document "reftex-global"
- "Regexp search through all files of the current TeX document." t)
-(autoload 'reftex-query-replace-document "reftex-global"
- "Run a query-replace-regexp of FROM with TO over the entire TeX document." t)
-(autoload 'reftex-find-duplicate-labels "reftex-global"
- "Produce a list of all duplicate labels in the document." t)
-(autoload 'reftex-change-label "reftex-global"
- "Query replace FROM with TO in all \\label and \\ref commands." t)
-(autoload 'reftex-renumber-simple-labels "reftex-global"
- "Renumber all simple labels in the document to make them sequentially." t)
-(autoload 'reftex-save-all-document-buffers "reftex-global"
- "Save all documents associated with the current document." t)
-
-
-;;; =========================================================================
-;;;
-;;; AUCTeX Interface
-
-(autoload 'reftex-arg-label "reftex-auc")
-(autoload 'reftex-arg-cite "reftex-auc")
-(autoload 'reftex-arg-index-tag "reftex-auc")
-(autoload 'reftex-arg-index "reftex-auc")
-(autoload 'reftex-plug-into-AUCTeX "reftex-auc")
-(autoload 'reftex-toggle-plug-into-AUCTeX "reftex-auc"
- "Toggle Interface between AUCTeX and RefTeX on and off." t)
-(autoload 'reftex-add-label-environments "reftex-auc")
-(autoload 'reftex-add-to-label-alist "reftex-auc")
-(autoload 'reftex-add-section-levels "reftex-auc")
-(autoload 'reftex-notice-new-section "reftex-auc")
-
 ;;; =========================================================================
 ;;;
 ;;; Some generally useful functions
@@ -1787,6 +1804,13 @@ When DIE is non-nil, throw an error if file not found."
   (when (match-beginning n)
     (buffer-substring-no-properties (match-beginning n) (match-end n))))
 
+(defun reftex-region-active-p ()
+  "Is transient-mark-mode on and the region active?
+Works on both Emacs and XEmacs."
+  (if (featurep 'xemacs)
+      (and zmacs-regions (region-active-p))
+    (and transient-mark-mode mark-active)))
+
 (defun reftex-kill-buffer (buffer)
   ;; Kill buffer if it exists.
   (and (setq buffer (get-buffer buffer))
@@ -1844,7 +1868,7 @@ When DIE is non-nil, throw an error if file not found."
   (let* ((elt (car (member elt list))) (ex (not exclusive)) ass last-ass)
     (while (and (setq ass (assoc key list))
                 (setq list (memq ass list))
-               (or ex (not (eq elt (car list))))
+                (or ex (not (eq elt (car list))))
                 (memq elt list))
       (setq last-ass ass
             list (cdr list)))
@@ -1858,22 +1882,22 @@ When DIE is non-nil, throw an error if file not found."
   (let (rtn)
     (while list
       (if (funcall predicate (car list))
-         (push (if completion
-                   (list (nth nth (car list))) 
-                 (nth nth (car list)))
-               rtn))
+          (push (if completion
+                    (list (nth nth (car list))) 
+                  (nth nth (car list)))
+                rtn))
       (setq list (cdr list)))
     (nreverse rtn)))
 
 (defun reftex-make-selection-buffer-name (type &optional index)
   ;; Make unique name for a selection buffer.
   (format " *RefTeX[%s][%d]*"
-         type (or index (get reftex-docstruct-symbol :master-index) 0)))
+          type (or index (get reftex-docstruct-symbol :master-index) 0)))
 
 (defun reftex-make-index-buffer-name (tag &optional cnt)
   ;; Make unique name for an index buffer.
   (format "*Index[%s][%d]*"
-         tag (or cnt (get reftex-docstruct-symbol :master-index) 0)))
+          tag (or cnt (get reftex-docstruct-symbol :master-index) 0)))
 
 (defun reftex-truncate (string ncols &optional ellipses padding)
   ;; Truncate STRING to NCOLS characters.
@@ -1881,11 +1905,11 @@ When DIE is non-nil, throw an error if file not found."
   ;; white space to NCOLS characters.  When ELLIPSES is non-nil and the
   ;; string needs to be truncated, replace last 3 characters by dots.
   (setq string
-       (if (<= (length string) ncols)
-           string
-         (if ellipses
-             (concat (substring string 0 (- ncols 3)) "...")
-           (substring string 0 ncols))))
+        (if (<= (length string) ncols)
+            string
+          (if ellipses
+              (concat (substring string 0 (- ncols 3)) "...")
+            (substring string 0 ncols))))
   (if padding
       (format (format "%%-%ds" ncols) string)
     string))
@@ -1895,8 +1919,8 @@ When DIE is non-nil, throw an error if file not found."
   ;; If POS is given, calculate distances relative to it.
   ;; Return nil if there is no match.
   (let ((pos (point))
-       (dist (or max-length (length regexp)))  
-       match1 match2 match)
+        (dist (or max-length (length regexp)))  
+        match1 match2 match)
     (goto-char (min (+ pos dist) (point-max)))
     (when (re-search-backward regexp nil t)
       (setq match1 (match-data)))
@@ -1932,14 +1956,14 @@ When DIE is non-nil, throw an error if file not found."
   ;; Enlarge other window displaying buffer to show whole buffer if possible.
   ;; If KEEP-CURRENT in non-nil, current buffer must remain visible.
   (let* ((win1 (selected-window))
-        (buf1 (current-buffer))
-        (win2 (get-buffer-window buf2))) ;; Only on current frame.
+         (buf1 (current-buffer))
+         (win2 (get-buffer-window buf2))) ;; Only on current frame.
     (when win2
       (select-window win2)
-      (unless (and (pos-visible-in-window-p 1)
-                  (pos-visible-in-window-p (point-max)))
-       (enlarge-window (1+ (- (count-lines 1 (point-max))
-                              (reftex-window-height))))))
+      (unless (and (pos-visible-in-window-p (point-min))
+                   (pos-visible-in-window-p (point-max)))
+        (enlarge-window (1+ (- (count-lines (point-min) (point-max))
+                               (reftex-window-height))))))
     (cond
      ((window-live-p win1) (select-window win1))
      (keep-current
@@ -1954,36 +1978,36 @@ When DIE is non-nil, throw an error if file not found."
   (let ((char ?\?))
     (save-window-excursion
       (catch 'exit
-       (message (concat prompt "   (?=Help)"))
-       (when (or (sit-for (or delay-time 0))
-                 (= ?\? (setq char (read-char-exclusive))))
-         (reftex-kill-buffer "*RefTeX Select*")
-         (switch-to-buffer-other-window "*RefTeX Select*")
-         (insert help-string)
-         (goto-char 1)
-         (unless (and (pos-visible-in-window-p 1)
-                      (pos-visible-in-window-p (point-max)))
-           (enlarge-window (1+ (- (count-lines 1 (point-max))
-                                  (reftex-window-height)))))
-         (setq truncate-lines t))
-       (if (and (pos-visible-in-window-p 1)
-                (pos-visible-in-window-p (point-max)))
-           nil
-         (setq prompt (concat prompt (if scroll "   (SPC/DEL=Scroll)" ""))))
-       (message prompt)
-       (and (equal char ?\?) (setq char (read-char-exclusive)))
-       (while t
-         (cond ((equal char ?\C-g) (keyboard-quit))
-               ((equal char ?\?))
-               ((and scroll (equal char ?\ ))
-                (condition-case nil (scroll-up) (error nil))
-                (message prompt))
-               ((and scroll (equal char ?\C-? ))
-                (condition-case nil (scroll-down) (error nil))
-                (message prompt))
-               (t (message "") 
-                  (throw 'exit char)))
-         (setq char (read-char-exclusive)))))))
+        (message "%s   (?=Help)" prompt)
+        (when (or (sit-for (or delay-time 0))
+                  (= ?\? (setq char (read-char-exclusive))))
+          (reftex-kill-buffer "*RefTeX Select*")
+          (switch-to-buffer-other-window "*RefTeX Select*")
+          (insert help-string)
+          (goto-char 1)
+          (unless (and (pos-visible-in-window-p (point-min))
+                       (pos-visible-in-window-p (point-max)))
+            (enlarge-window (1+ (- (count-lines (point-min) (point-max))
+                                   (reftex-window-height)))))
+          (setq truncate-lines t))
+        (if (and (pos-visible-in-window-p (point-min))
+                 (pos-visible-in-window-p (point-max)))
+            nil
+          (setq prompt (concat prompt (if scroll "   (SPC/DEL=Scroll)" ""))))
+        (message "%s" prompt)
+        (and (equal char ?\?) (setq char (read-char-exclusive)))
+        (while t
+          (cond ((equal char ?\C-g) (keyboard-quit))
+                ((equal char ?\?))
+                ((and scroll (equal char ?\ ))
+                 (condition-case nil (scroll-up) (error nil))
+                 (message "%s" prompt))
+                ((and scroll (equal char ?\C-? ))
+                 (condition-case nil (scroll-down) (error nil))
+                 (message "%s" prompt))
+                (t (message "") 
+                   (throw 'exit char)))
+          (setq char (read-char-exclusive)))))))
       
 
 (defun reftex-make-regexp-allow-for-ctrl-m (string)
@@ -2007,14 +2031,14 @@ When DIE is non-nil, throw an error if file not found."
 ;; Define `current-message' for compatibility with XEmacs prior to 20.4
 (defvar message-stack)
 (if (and (featurep 'xemacs)
-        (not (fboundp 'current-message)))
+         (not (fboundp 'current-message)))
     (defun current-message (&optional frame)
       (cdr (car message-stack))))
 
 (defun reftex-visited-files (list)
   ;; Takes a list of filenames and returns the buffers of those already visited
   (delq nil (mapcar (lambda (x) (if (reftex-get-buffer-visiting x) x nil))
-                   list)))
+                    list)))
 
 (defun reftex-get-file-buffer-force (file &optional mark-to-kill)
   ;; Return a buffer visiting file.  Make one, if necessary.
@@ -2045,7 +2069,7 @@ When DIE is non-nil, throw an error if file not found."
              (let ((format-alist nil)
                    (auto-mode-alist (reftex-auto-mode-alist))
                    (default-major-mode 'fundamental-mode)
-                  (enable-local-variables nil)
+                   (enable-local-variables nil)
                    (after-insert-file-functions nil))
                (setq buf (find-file-noselect file)))
 
@@ -2055,9 +2079,9 @@ When DIE is non-nil, throw an error if file not found."
                  (set-buffer buf)
                  (run-hooks 'reftex-initialize-temporary-buffers))))
 
-          ;; Lets see if we got a license to kill :-|
-          (and mark-to-kill
-               (add-to-list 'reftex-buffers-to-kill buf))
+           ;; Lets see if we got a license to kill :-|
+           (and mark-to-kill
+                (add-to-list 'reftex-buffers-to-kill buf))
 
            ;; Return the new buffer
            buf)
@@ -2107,17 +2131,17 @@ When DIE is non-nil, throw an error if file not found."
   (let (rtn)
     (while list
       (unless (symbolp (car list))
-       (push (car list) rtn))
+        (push (car list) rtn))
       (setq list (cdr list)))
     (nreverse rtn)))
 
 (defun reftex-uniquify (list)
-  ;; Return a list of all elements in LIST, but each only once
+  ;; Return a list of all elements in LIST, but each only once, keeping order
   (let (new elm)
     (while list
       (setq elm (pop list))
       (unless (member elm new)
-       (push elm new)))
+        (push elm new)))
     (nreverse new)))
 
 (defun reftex-uniquify-by-car (alist &optional keep-list)
@@ -2133,19 +2157,19 @@ When DIE is non-nil, throw an error if file not found."
 
 (defun reftex-abbreviate-title (string)
   (reftex-convert-string string "[-~ \t\n\r,;]" nil t t
-                        5 40 nil 1 " " (nth 5 reftex-derive-label-parameters)))
+                         5 40 nil 1 " " (nth 5 reftex-derive-label-parameters)))
 
-(defun reftex-convert-string (string split-re illegal-re dot keep-fp
-                                    nwords maxchar illegal abbrev sep
-                                    ignore-words &optional downcase)
+(defun reftex-convert-string (string split-re invalid-re dot keep-fp
+                                     nwords maxchar invalid abbrev sep
+                                     ignore-words &optional downcase)
   "Convert a string (a sentence) to something shorter.
 SPLIT-RE     is the regular expression used to split the string into words.
-ILLEGAL-RE   matches characters which are illegal in the final string.
+INVALID-RE   matches characters which are invalid in the final string.
 DOT          t means add dots to abbreviated words.
 KEEP-FP      t means to keep a final punctuation when applicable.
 NWORDS       Number of words to use.
 MAXCHAR      Maximum number of characters in the final string.
-ILLEGAL      nil: Throw away any words containing stuff matched with ILLEGAL-RE.
+INVALID      nil: Throw away any words containing stuff matched with INVALID-RE.
              t:   Throw away only the matched part, not the whole word.
 ABBREV       nil: Never abbreviate words.
              t:   Always abbreviate words (see `reftex-abbrev-parameters').
@@ -2155,14 +2179,14 @@ SEP          String separating different words in the output string.
 IGNORE-WORDS List of words which should be removed from the string."
 
   (let* ((words0 (split-string string (or split-re "[ \t\n\r]")))
-        (reftex-label-illegal-re (or illegal-re "\000"))
-        (abbrev-re (concat
-                    "\\`\\("
-                    (make-string (nth 0 reftex-abbrev-parameters) ?.)
-                    "[" (nth 2 reftex-abbrev-parameters) "]*"
-                    "\\)"
-                    "[" (nth 3 reftex-abbrev-parameters) "]"
-                    (make-string (1- (nth 1 reftex-abbrev-parameters)) ?.)))
+         (reftex-label-illegal-re (or invalid-re "\000"))
+         (abbrev-re (concat
+                     "\\`\\("
+                     (make-string (nth 0 reftex-abbrev-parameters) ?.)
+                     "[" (nth 2 reftex-abbrev-parameters) "]*"
+                     "\\)"
+                     "[" (nth 3 reftex-abbrev-parameters) "]"
+                     (make-string (1- (nth 1 reftex-abbrev-parameters)) ?.)))
          words word)
 
     ;; Remove words from the ignore list or with funny characters
@@ -2171,7 +2195,7 @@ IGNORE-WORDS List of words which should be removed from the string."
       (cond
        ((member (downcase word) ignore-words))
        ((string-match reftex-label-illegal-re word)
-        (when illegal
+        (when invalid
           (while (string-match reftex-label-illegal-re word)
             (setq word (replace-match "" nil nil word)))
           (push word words)))
@@ -2192,11 +2216,11 @@ IGNORE-WORDS List of words which should be removed from the string."
                  (> (length string) maxchar)))
         (setq words
               (mapcar
-              (lambda (w) (if (string-match abbrev-re w)
-                              (if dot
-                                  (concat (match-string 1 w) ".")
-                                (match-string 1 w))
-                            w))
+               (lambda (w) (if (string-match abbrev-re w)
+                               (if dot
+                                   (concat (match-string 1 w) ".")
+                                 (match-string 1 w))
+                             w))
                words)
               string (mapconcat 'identity words sep)))
 
@@ -2237,7 +2261,7 @@ IGNORE-WORDS List of words which should be removed from the string."
 
 (defun reftex-use-fonts ()
   ;; Return t if we can and want to use fonts.
-  (and window-system
+  (and window-system
        reftex-use-fonts
        (featurep 'font-lock)))
 
@@ -2246,47 +2270,47 @@ IGNORE-WORDS List of words which should be removed from the string."
   (and (reftex-use-fonts)
        (or (eq t reftex-refontify-context)
            (and (eq 1 reftex-refontify-context)
-               ;; Test of we use the font-lock version of x-symbol
-               (and (featurep 'x-symbol-tex) (not (boundp 'x-symbol-mode)))))))
+                ;; Test of we use the font-lock version of x-symbol
+                (and (featurep 'x-symbol-tex) (not (boundp 'x-symbol-mode)))))))
 
 (defvar font-lock-defaults-computed)
 (defun reftex-fontify-select-label-buffer (parent-buffer)
   ;; Fontify the `*RefTeX Select*' buffer.  Buffer is temporarily renamed to
   ;; start with none-SPC char, beacuse Font-Lock otherwise refuses operation.
   (run-hook-with-args 'reftex-pre-refontification-functions
-                     parent-buffer 'reftex-ref)
+                      parent-buffer 'reftex-ref)
   (let* ((oldname (buffer-name))
-        (newname (concat "Fontify-me-" oldname)))
+         (newname (concat "Fontify-me-" oldname)))
     (unwind-protect
-       (progn
-         ;; Rename buffer temporarily to start w/o space (because of font-lock)
-         (rename-buffer newname t)
-         (cond
-          ((fboundp 'font-lock-default-fontify-region)
-           ;; Good: we have the indirection functions
-           (set (make-local-variable 'font-lock-fontify-region-function)
-                'reftex-select-font-lock-fontify-region)
-           (let ((major-mode 'latex-mode))
-             (font-lock-mode 1)))
-          ((fboundp 'font-lock-set-defaults-1)
-           ;; Looks like the XEmacs font-lock stuff.
-           ;; FIXME: this is still kind of a hack, but it works.
-           (set (make-local-variable 'font-lock-keywords) nil)
-           (let ((major-mode 'latex-mode)
-                 (font-lock-defaults-computed nil))
-             (font-lock-set-defaults-1)
-             (reftex-select-font-lock-fontify-region (point-min) (point-max))))
-          (t
-           ;; Oops? 
-           (message "Sorry: cannot refontify RefTeX Select buffer."))))
+        (progn
+          ;; Rename buffer temporarily to start w/o space (because of font-lock)
+          (rename-buffer newname t)
+          (cond
+           ((fboundp 'font-lock-default-fontify-region)
+            ;; Good: we have the indirection functions
+            (set (make-local-variable 'font-lock-fontify-region-function)
+                 'reftex-select-font-lock-fontify-region)
+            (let ((major-mode 'latex-mode))
+              (font-lock-mode 1)))
+           ((fboundp 'font-lock-set-defaults-1)
+            ;; Looks like the XEmacs font-lock stuff.
+            ;; FIXME: this is still kind of a hack, but it works.
+            (set (make-local-variable 'font-lock-keywords) nil)
+            (let ((major-mode 'latex-mode)
+                  (font-lock-defaults-computed nil))
+              (font-lock-set-defaults-1)
+              (reftex-select-font-lock-fontify-region (point-min) (point-max))))
+           (t
+            ;; Oops? 
+            (message "Sorry: cannot refontify RefTeX Select buffer."))))
       (rename-buffer oldname))))
 
 (defun reftex-select-font-lock-fontify-region (beg end &optional loudly)
   ;; Fontify a region, but only lines starting with a dot.
   (let ((func (if (fboundp 'font-lock-default-fontify-region)
-                 'font-lock-default-fontify-region
-               'font-lock-fontify-region))
-       beg1 end1)
+                  'font-lock-default-fontify-region
+                'font-lock-fontify-region))
+        beg1 end1)
     (goto-char beg)
     (while (re-search-forward "^\\." end t)
       (setq beg1 (point) end1 (progn (skip-chars-forward "^\n") (point)))
@@ -2305,32 +2329,42 @@ IGNORE-WORDS List of words which should be removed from the string."
   (let (face)
     (catch 'exit
       (while (setq face (pop faces))
-       (if (featurep 'xemacs)
-           (if (find-face face) (throw 'exit face))
-         (if (facep face) (throw 'exit face)))))))
-
-;; Highlighting uses overlays.  For XEmacs, we need the emulation.
-(if (featurep 'xemacs) (require 'overlay))
+        (if (featurep 'xemacs)
+            (if (find-face face) (throw 'exit face))
+          (if (facep face) (throw 'exit face)))))))
+
+;; Highlighting uses overlays.  For XEmacs, we use extends.
+(defalias 'reftex-make-overlay
+  (if (featurep 'xemacs) 'make-extent 'make-overlay))
+(defalias 'reftex-overlay-put
+  (if (featurep 'xemacs) 'set-extent-property 'overlay-put))
+(defalias 'reftex-move-overlay
+  (if (featurep 'xemacs) 'set-extent-endpoints 'move-overlay))
+(defalias 'reftex-delete-overlay
+  (if (featurep 'xemacs) 'detach-extent 'delete-overlay))
 
 ;; We keep a vector with several different overlays to do our highlighting.
-(defvar reftex-highlight-overlays [nil nil])
+(defvar reftex-highlight-overlays [nil nil nil])
 
 ;; Initialize the overlays
-(aset reftex-highlight-overlays 0 (make-overlay 1 1))
-(overlay-put (aref reftex-highlight-overlays 0) 
-            'face 'highlight)
-(aset reftex-highlight-overlays 1 (make-overlay 1 1))
-(overlay-put (aref reftex-highlight-overlays 1)
-            'face reftex-cursor-selected-face)
+(aset reftex-highlight-overlays 0 (reftex-make-overlay 1 1))
+(reftex-overlay-put (aref reftex-highlight-overlays 0) 
+             'face 'highlight)
+(aset reftex-highlight-overlays 1 (reftex-make-overlay 1 1))
+(reftex-overlay-put (aref reftex-highlight-overlays 1)
+             'face reftex-cursor-selected-face)
+(aset reftex-highlight-overlays 2 (reftex-make-overlay 1 1))
+(reftex-overlay-put (aref reftex-highlight-overlays 2)
+             'face reftex-cursor-selected-face)
 
 ;; Two functions for activating and deactivation highlight overlays
 (defun reftex-highlight (index begin end &optional buffer)
   "Highlight a region with overlay INDEX."
-  (move-overlay (aref reftex-highlight-overlays index)
+  (reftex-move-overlay (aref reftex-highlight-overlays index)
                 begin end (or buffer (current-buffer))))
 (defun reftex-unhighlight (index)
   "Detach overlay INDEX."
-  (delete-overlay (aref reftex-highlight-overlays index)))
+  (reftex-delete-overlay (aref reftex-highlight-overlays index)))
 
 (defun reftex-highlight-shall-die ()
   ;; Function used in pre-command-hook to remove highlights.
@@ -2344,22 +2378,23 @@ IGNORE-WORDS List of words which should be removed from the string."
 ;; The default bindings in the mode map.
 (loop for x in
       '(("\C-c="  . reftex-toc)
-       ("\C-c("  . reftex-label)
-       ("\C-c)"  . reftex-reference)
-       ("\C-c["  . reftex-citation)
-       ("\C-c<"  . reftex-index)
-       ("\C-c>"  . reftex-display-index)
-       ("\C-c/"  . reftex-index-selection-or-word)
-       ("\C-c\\" . reftex-index-phrase-selection-or-word)
-       ("\C-c|"  . reftex-index-visit-phrases-buffer)
-       ("\C-c&"  . reftex-view-crossref))
+        ("\C-c-"  . reftex-toc-recenter)
+        ("\C-c("  . reftex-label)
+        ("\C-c)"  . reftex-reference)
+        ("\C-c["  . reftex-citation)
+        ("\C-c<"  . reftex-index)
+        ("\C-c>"  . reftex-display-index)
+        ("\C-c/"  . reftex-index-selection-or-word)
+        ("\C-c\\" . reftex-index-phrase-selection-or-word)
+        ("\C-c|"  . reftex-index-visit-phrases-buffer)
+        ("\C-c&"  . reftex-view-crossref))
       do (define-key reftex-mode-map (car x) (cdr x)))
 
 ;; Bind `reftex-mouse-view-crossref' only when the key is still free
 (if (featurep 'xemacs)
     (unless (key-binding [(shift button2)])
       (define-key reftex-mode-map [(shift button2)] 
-       'reftex-mouse-view-crossref))
+        'reftex-mouse-view-crossref))
   (unless (key-binding [(shift mouse-2)])
     (define-key reftex-mode-map [(shift mouse-2)] 
       'reftex-mouse-view-crossref)))
@@ -2372,14 +2407,14 @@ IGNORE-WORDS List of words which should be removed from the string."
 ;; If the user requests so, she can have a few more bindings:
 (when reftex-extra-bindings
   (loop for x in
-       '(("\C-ct" . reftex-toc)
-         ("\C-cl" . reftex-label)
-         ("\C-cr" . reftex-reference)
-         ("\C-cc" . reftex-citation)
-         ("\C-cv" . reftex-view-crossref)
-         ("\C-cg" . reftex-grep-document)
-         ("\C-cs" . reftex-search-document))
-       do (define-key reftex-mode-map (car x) (cdr x))))
+        '(("\C-ct" . reftex-toc)
+          ("\C-cl" . reftex-label)
+          ("\C-cr" . reftex-reference)
+          ("\C-cc" . reftex-citation)
+          ("\C-cv" . reftex-view-crossref)
+          ("\C-cg" . reftex-grep-document)
+          ("\C-cs" . reftex-search-document))
+        do (define-key reftex-mode-map (car x) (cdr x))))
 
 ;;; =========================================================================
 ;;;
@@ -2387,12 +2422,14 @@ IGNORE-WORDS List of words which should be removed from the string."
 
 ;; Define a menu for the menu bar if Emacs is running under X
 
-(require 'easymenu)
+(defvar reftex-isearch-minor-mode nil)
+(make-variable-buffer-local 'reftex-isearch-minor-mode)
 
 (easy-menu-define reftex-mode-menu reftex-mode-map
  "Menu used in RefTeX mode"
  `("Ref"
    ["Table of Contents"       reftex-toc t]
+   ["Recenter TOC"            reftex-toc-recenter t]
    "--"
    ["\\label"                 reftex-label t]
    ["\\ref"                   reftex-reference t]
@@ -2414,18 +2451,20 @@ IGNORE-WORDS List of words which should be removed from the string."
     ["Entire Document"        reftex-parse-all t]
     ["Save to File"           (reftex-access-parse-file 'write)
      (> (length (symbol-value reftex-docstruct-symbol)) 0)]
-    ["Restore from File"      (reftex-access-parse-file 'restore) t]
-    "--"
-    ["Reset RefTeX Mode"       reftex-reset-mode t])
+    ["Restore from File"      (reftex-access-parse-file 'restore) t])
    ("Global Actions"
     ["Search Whole Document"  reftex-search-document t]
+    ["Search Again"           tags-loop-continue t]
     ["Replace in Document"    reftex-query-replace-document t]
     ["Grep on Document"       reftex-grep-document t]
     "--"
+    ["Goto Label"             reftex-goto-label t]
     ["Find Duplicate Labels"  reftex-find-duplicate-labels t]
     ["Change Label and Refs"  reftex-change-label t]
     ["Renumber Simple Labels" reftex-renumber-simple-labels t]
     "--"
+    ["Create BibTeX File"     reftex-create-bibtex-file t]
+    "--"
     ["Create TAGS File"       reftex-create-tags-file t]
     "--"
     ["Save Document"          reftex-save-all-document-buffers t])
@@ -2439,6 +2478,10 @@ IGNORE-WORDS List of words which should be removed from the string."
      (setq reftex-save-parse-info (not reftex-save-parse-info))
      :style toggle :selected reftex-save-parse-info]
     "--"
+    "TOC RECENTER"
+    ["Automatic Recenter" reftex-toggle-auto-toc-recenter
+     :style toggle :selected reftex-toc-auto-recenter-timer]
+    "--"
     "CROSSREF INFO"
     ["Automatic Info" reftex-toggle-auto-view-crossref
      :style toggle :selected reftex-auto-view-crossref-timer]
@@ -2449,26 +2492,28 @@ IGNORE-WORDS List of words which should be removed from the string."
     "--"
     "MISC"
     ["AUC TeX Interface" reftex-toggle-plug-into-AUCTeX
-     :style toggle :selected reftex-plug-into-AUCTeX])
+     :style toggle :selected reftex-plug-into-AUCTeX]
+    ["isearch whole document" reftex-isearch-minor-mode
+     :style toggle :selected reftex-isearch-minor-mode])
    ("Reference Style"
     ["Default" (setq reftex-vref-is-default nil
-                    reftex-fref-is-default nil)
+                     reftex-fref-is-default nil)
      :style radio :selected (not (or reftex-vref-is-default 
-                                    reftex-fref-is-default))]
+                                     reftex-fref-is-default))]
     ["Varioref" (setq reftex-vref-is-default t
-                     reftex-fref-is-default nil)
+                      reftex-fref-is-default nil)
      :style radio :selected reftex-vref-is-default]
     ["Fancyref" (setq reftex-fref-is-default t
-                     reftex-vref-is-default nil)
+                      reftex-vref-is-default nil)
      :style radio :selected reftex-fref-is-default])
    ("Citation Style"
     ,@(mapcar
        (lambda (x)
-        (vector
-         (capitalize (symbol-name (car x)))
-         (list 'reftex-set-cite-format (list 'quote (car x)))
-         :style 'radio :selected
-         (list 'eq (list 'reftex-get-cite-format) (list 'quote (car x)))))
+         (vector
+          (capitalize (symbol-name (car x)))
+          (list 'reftex-set-cite-format (list 'quote (car x)))
+          :style 'radio :selected
+          (list 'eq (list 'reftex-get-cite-format) (list 'quote (car x)))))
        reftex-cite-format-builtin)
     "--"
     "Sort Database Matches"
@@ -2483,14 +2528,16 @@ IGNORE-WORDS List of words which should be removed from the string."
    ("Index Style"
     ,@(mapcar
        (lambda (x)
-        (vector
-         (capitalize (symbol-name (car x)))
-         (list 'reftex-add-index-macros (list 'list (list 'quote (car x))))
-         :style 'radio :selected
-         (list 'memq (list 'quote (car x))
-               (list 'get 'reftex-docstruct-symbol 
-                     (list 'quote 'reftex-index-macros-style)))))
+         (vector
+          (capitalize (symbol-name (car x)))
+          (list 'reftex-add-index-macros (list 'list (list 'quote (car x))))
+          :style 'radio :selected
+          (list 'memq (list 'quote (car x))
+                (list 'get 'reftex-docstruct-symbol 
+                      (list 'quote 'reftex-index-macros-style)))))
        reftex-index-macros-builtin))
+   "--"
+    ["Reset RefTeX Mode"       reftex-reset-mode t]
    "--"
    ("Customize"
     ["Browse RefTeX Group" reftex-customize t]
@@ -2511,17 +2558,17 @@ IGNORE-WORDS List of words which should be removed from the string."
   (interactive)
   (if (fboundp 'customize-menu-create)
       (progn
-       (easy-menu-change 
-        '("Ref") "Customize"
-        `(["Browse RefTeX group" reftex-customize t]
-          "--"
-          ,(customize-menu-create 'reftex)
-          ["Set" Custom-set t]
-          ["Save" Custom-save t]
-          ["Reset to Current" Custom-reset-current t]
-          ["Reset to Saved" Custom-reset-saved t]
-          ["Reset to Standard Settings" Custom-reset-standard t]))
-       (message "\"Ref\"-menu now contains full customization menu"))
+        (easy-menu-change 
+         '("Ref") "Customize"
+         `(["Browse RefTeX group" reftex-customize t]
+           "--"
+           ,(customize-menu-create 'reftex)
+           ["Set" Custom-set t]
+           ["Save" Custom-save t]
+           ["Reset to Current" Custom-reset-current t]
+           ["Reset to Saved" Custom-reset-saved t]
+           ["Reset to Standard Settings" Custom-reset-standard t]))
+        (message "\"Ref\"-menu now contains full customization menu"))
     (error "Cannot expand menu (outdated version of cus-edit.el)")))
 
 (defun reftex-show-commentary ()
@@ -2534,7 +2581,7 @@ IGNORE-WORDS List of words which should be removed from the string."
   "Read documentation for RefTeX in the info system.
 With optional NODE, go directly to that node."
   (interactive)
-  (require 'info)
+  (eval-and-compile (require 'info))
   (Info-goto-node (format "(reftex)%s" (or node ""))))
 
 ;;; Install the kill-buffer and kill-emacs hooks ------------------------------
@@ -2553,4 +2600,5 @@ With optional NODE, go directly to that node."
 
 ;;;============================================================================
 
+;;; arch-tag: 49e0da4e-bd5e-4cfc-a717-fb444fccb9e6
 ;;; reftex.el ends here