]> code.delx.au - gnu-emacs/blobdiff - lisp/textmodes/reftex.el
(tex-main-file): Use with-no-warnings.
[gnu-emacs] / lisp / textmodes / reftex.el
index 95ae59922ad01fe5c9a2af82eedc78712971d6d7..72d670e6655b7976203b0b10f3831af0504dea1a 100644 (file)
@@ -1,9 +1,9 @@
-;;; reftex.el --- Minor mode for doing \label, \ref, \cite, \index in LaTeX
-;; Copyright (c) 1997, 1998, 1999, 2000 Free Software Foundation, Inc.
+;;; reftex.el --- minor mode for doing \label, \ref, \cite, \index in LaTeX
+;; Copyright (c) 1997, 1998, 1999, 2000, 2003  Free Software Foundation, Inc.
 
-;; Author:     Carsten Dominik <dominik@strw.LeidenUniv.nl>
-;; Version:    4.10
-;; Keywords:   tex
+;; Author: Carsten Dominik <dominik@science.uva.nl>
+;; Version: 4.18
+;; Keywords: tex
 
 ;; This file is part of GNU Emacs.
 
@@ -25,7 +25,7 @@
 ;;---------------------------------------------------------------------------
 ;;
 ;;; Commentary:
-;; 
+;;
 ;; RefTeX is a minor mode with distinct support for \ref, \label, \cite,
 ;; and \index commands in (multi-file) LaTeX documents.
 ;; - A table of contents provides easy access to any part of a document.
@@ -70,7 +70,7 @@
 ;;
 ;; Introduction
 ;; ************
-;; 
+;;
 ;; RefTeX is a specialized package for support of labels, references,
 ;; citations, and the index in LaTeX.  RefTeX wraps itself round 4 LaTeX
 ;; macros: `\label', `\ref', `\cite', and `\index'.  Using these macros
 ;; time-consuming tasks almost entirely.  It also provides functions to
 ;; display the structure of a document and to move around in this
 ;; structure quickly.
-;; 
+;;
 ;;    *Note Imprint::, for information about who to contact for help, bug
 ;; reports or suggestions.
-;; 
+;;
 ;; Environment
 ;; ===========
-;; 
+;;
 ;; RefTeX needs to access all files which are part of a multifile
 ;; document, and the BibTeX database files requested by the
 ;; `\bibliography' command.  To find these files, RefTeX will require a
 ;; which are also used by RefTeX.  However, on some systems these
 ;; variables do not contain the full search path.  If RefTeX does not work
 ;; for you because it cannot find some files, read *Note Finding Files::.
-;; 
+;;
 ;; Entering RefTeX Mode
 ;; ====================
-;; 
+;;
 ;; To turn RefTeX Mode on and off in a particular buffer, use `M-x
 ;; reftex-mode'.  To turn on RefTeX Mode for all LaTeX files, add the
 ;; following lines to your `.emacs' file:
-;; 
+;;
 ;;      (add-hook 'LaTeX-mode-hook 'turn-on-reftex)   ; with AUCTeX LaTeX mode
 ;;      (add-hook 'latex-mode-hook 'turn-on-reftex)   ; with Emacs latex mode
-;; 
+;;
 ;; RefTeX in a Nutshell
 ;; ====================
-;; 
+;;
 ;;   1. Table of Contents
 ;;      Typing `C-c =' (`reftex-toc') will show a table of contents of the
 ;;      document.  This buffer can display sections, labels and index
 ;;      entries defined in the document.  From the buffer, you can jump
 ;;      quickly to every part of your document.  Press `?' to get help.
-;; 
+;;
 ;;   2. Labels and References
 ;;      RefTeX helps to create unique labels and to find the correct key
 ;;      for references quickly.  It distinguishes labels for different
 ;;      others), and can be configured to recognize any additional labeled
 ;;      environments you have defined yourself (variable
 ;;      `reftex-label-alist').
-;; 
+;;
 ;;         * Creating Labels
 ;;           Type `C-c (' (`reftex-label') to insert a label at point.
 ;;           RefTeX will either
 ;;                tables) or
 ;;              - insert a simple label made of a prefix and a number (all
 ;;                other environments)
-;; 
+;;
 ;;           Which labels are created how is configurable with the variable
 ;;           `reftex-insert-label-flags'.
-;; 
+;;
 ;;         * Referencing Labels
 ;;           To make a reference, type `C-c )' (`reftex-reference').  This
 ;;           shows an outline of the document with all labels of a certain
 ;;           type (figure, equation,...) and some label context.
 ;;           Selecting a label inserts a `\ref{LABEL}' macro into the
 ;;           original buffer.
-;; 
+;;
 ;;   3. Citations
 ;;      Typing `C-c [' (`reftex-citation') will let you specify a regular
 ;;      expression to search in current BibTeX database files (as
 ;;      sorted.  The selected article is referenced as `\cite{KEY}' (see
 ;;      the variable `reftex-cite-format' if you want to insert different
 ;;      macros).
-;; 
+;;
 ;;   4. Index Support
 ;;      RefTeX helps to enter index entries.  It also compiles all entries
 ;;      into an alphabetically sorted `*Index*' buffer which you can use
 ;;      index macros and can be configured to recognize any additional
 ;;      macros you have defined (`reftex-index-macros').  Multiple indices
 ;;      are supported.
-;; 
+;;
 ;;         * Creating Index Entries
 ;;           To index the current selection or the word at point, type
 ;;           `C-c /' (`reftex-index-selection-or-word').  The default macro
 ;;           `reftex-index-default-macro' will be used.  For a more
 ;;           complex entry type `C-c <' (`reftex-index'), select any of
 ;;           the index macros and enter the arguments with completion.
-;; 
+;;
 ;;         * The Index Phrases File (Delayed Indexing)
 ;;           Type `C-c \' (`reftex-index-phrase-selection-or-word') to add
 ;;           the current word or selection to a special _index phrase
 ;;           file_.  RefTeX can later search the document for occurrences
 ;;           of these phrases and let you interactively index the matches.
-;; 
+;;
 ;;         * Displaying and Editing the Index
 ;;           To display the compiled index in a special buffer, type `C-c
 ;;           >' (`reftex-display-index').  From that buffer you can check
 ;;           and edit all entries.
-;; 
+;;
 ;;   5. Viewing Cross-References
 ;;      When point is on the KEY argument of a cross-referencing macro
 ;;      (`\label', `\ref', `\cite', `\bibitem', `\index', and variations)
 ;;      When the enclosing macro is `\cite' or `\ref' and no other message
 ;;      occupies the echo area, information about the citation or label
 ;;      will automatically be displayed in the echo area.
-;; 
+;;
 ;;   6. Multifile Documents
 ;;      Multifile Documents are fully supported.  The included files must
 ;;      have a file variable `TeX-master' or `tex-main-file' pointing to
 ;;      the master file.  RefTeX provides cross-referencing information
 ;;      from all parts of the document, and across document borders
 ;;      (`xr.sty').
-;; 
+;;
 ;;   7. Document Parsing
 ;;      RefTeX needs to parse the document in order to find labels and
 ;;      other information.  It does it automatically once and updates its
 ;;      with a raw `C-u' prefix, or press the `r' key in the label
 ;;      selection buffer, the table of contents buffer, or the index
 ;;      buffer.
-;; 
+;;
 ;;   8. AUCTeX
 ;;      If your major LaTeX mode is AUCTeX, RefTeX can cooperate with it
 ;;      (see variable `reftex-plug-into-AUCTeX').  AUCTeX contains style
 ;;      files which trigger appropriate settings in RefTeX, so that for
 ;;      many of the popular LaTeX packages no additional customizations
 ;;      will be necessary.
-;; 
+;;
 ;;   9. Useful Settings
 ;;      To make RefTeX faster for large documents, try these:
 ;;           (setq reftex-enable-partial-scans t)
 ;;           (setq reftex-save-parse-info t)
 ;;           (setq reftex-use-multiple-selection-buffers t)
-;; 
+;;
 ;;      To integrate with AUCTeX, use
 ;;           (setq reftex-plug-into-AUCTeX t)
-;; 
+;;
 ;;      To make your own LaTeX macro definitions known to RefTeX,
 ;;      customize the variables
 ;;           `reftex-label-alist'          (for label macros/environments)
 ;;           `reftex-index-default-macro'  (to set the default macro)
 ;;      If you have a large number of macros defined, you may want to write
 ;;      an AUCTeX style file to support them with both AUCTeX and RefTeX.
-;; 
+;;
 ;;  10. Where Next?
 ;;      Go ahead and use RefTeX.  Use its menus until you have picked up
 ;;      the key bindings.  For an overview of what you can do in each of
 ;;      The first part of the manual explains in a tutorial way how to use
 ;;      and customize RefTeX.  The second part is a command and variable
 ;;      reference.
-;; 
+;;
 ;;---------------------------------------------------------------------------
 ;;
 ;; AUTHOR
 (defvar reftex-tables-dirty t
   "Flag showing if tables need to be re-computed.")
 
-(eval-and-compile
-  (defun reftex-set-dirty (symbol value)
-    (setq reftex-tables-dirty t)
-    (set symbol value)))
-
-
 ;;; =========================================================================
 ;;;
 ;;; Configuration variables
 ;;; Define the formal stuff for a minor mode named RefTeX.
 ;;;
 
-(defconst reftex-version "RefTeX version 4.10"
+(defconst reftex-version "RefTeX version 4.18"
   "Version string for RefTeX.")
 
 (defvar reftex-mode nil
 
 (defvar reftex-mode-menu nil)
 (defvar reftex-syntax-table nil)
-
+(defvar reftex-syntax-table-for-bib nil)
+
+(unless reftex-syntax-table
+  (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))
+  (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.")
 
 ;;;###autoload
 (defun turn-on-reftex ()
@@ -367,10 +379,23 @@ on the menu bar.
          (and reftex-auto-view-crossref
               (reftex-toggle-auto-view-crossref))
          (put 'reftex-auto-view-crossref 'initialized t))
-       (unless reftex-syntax-table
-         (setq reftex-syntax-table (copy-syntax-table (syntax-table)))
-         (modify-syntax-entry ?\( "." reftex-syntax-table)
-         (modify-syntax-entry ?\) "." reftex-syntax-table))
+       (unless (get 'reftex-auto-recenter-toc 'initialized)
+         (and reftex-auto-recenter-toc
+              (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
     (easy-menu-remove reftex-mode-menu)))
@@ -415,14 +440,15 @@ on the menu bar.
 ;;; =========================================================================
 ;;;
 ;;; Silence warnings about variables in other packages.
-(defvar TeX-master)
-(defvar LaTeX-section-hook)
-(defvar LaTeX-label-function)
-(defvar tex-main-file)
-(defvar outline-minor-mode)
-(defvar font-lock-mode)
-(defvar font-lock-fontify-region-function)
-(defvar font-lock-syntactic-keywords)
+(eval-when-compile
+  (defvar TeX-master)
+  (defvar LaTeX-section-hook)
+  (defvar LaTeX-label-function)
+  (defvar tex-main-file)
+  (defvar outline-minor-mode)
+  (defvar font-lock-mode)
+  (defvar font-lock-fontify-region-function)
+  (defvar font-lock-syntactic-keywords))
 
 ;;; =========================================================================
 ;;;
@@ -503,9 +529,10 @@ on the menu bar.
       ((master
         (cond
          ((fboundp 'TeX-master-file) ; AUCTeX is loaded.  Use its mechanism.
-         (condition-case nil 
+         (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)
@@ -531,7 +558,7 @@ on the menu bar.
           (buffer-file-name)))))
     (cond
      ((null master)
-      (error "Need a filename for this buffer,  please save it first"))
+      (error "Need a filename for this buffer, please save it first"))
      ((or (file-exists-p (concat master ".tex"))
           (reftex-get-buffer-visiting (concat master ".tex")))
       ;; Ahh, an extra .tex was missing...
@@ -542,7 +569,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 ()
@@ -608,49 +635,49 @@ the label information is recompiled on next use."
 ;; The following constants are derived from `reftex-label-alist'.
 
 ;; Prompt used for label type queries directed to the user.
-(defconst reftex-type-query-prompt nil)
+(defvar reftex-type-query-prompt nil)
 
 ;; Help string for label type queries.
-(defconst reftex-type-query-help nil)
+(defvar reftex-type-query-help nil)
 
 ;; Alist relating label type to reference format.
-(defconst reftex-typekey-to-format-alist nil)
+(defvar reftex-typekey-to-format-alist nil)
 
 ;; Alist relating label type to label prefix.
-(defconst reftex-typekey-to-prefix-alist nil)
+(defvar reftex-typekey-to-prefix-alist nil)
 
 ;; Alist relating environments or macros to label type and context regexp.
-(defconst reftex-env-or-mac-alist nil)
+(defvar reftex-env-or-mac-alist nil)
 
 ;; List of special environment parser functions
-(defconst reftex-special-env-parsers nil)
+(defvar reftex-special-env-parsers nil)
 
 ;; List of macros carrying a label.
-(defconst reftex-label-mac-list nil)
+(defvar reftex-label-mac-list nil)
 
 ;; List of environments carrying a label.
-(defconst reftex-label-env-list nil)
+(defvar reftex-label-env-list nil)
 
 ;; List of all typekey letters in use.
-(defconst reftex-typekey-list nil)
+(defvar reftex-typekey-list nil)
 
 ;; Alist relating magic words to a label type.
-(defconst reftex-words-to-typekey-alist nil)
+(defvar reftex-words-to-typekey-alist nil)
 
 ;; The last list-of-labels entry used in a reference.
 (defvar reftex-last-used-reference (list nil nil nil nil))
 
 ;; Alist relating index macros to other info.
-(defconst reftex-key-to-index-macro-alist nil)
+(defvar reftex-key-to-index-macro-alist nil)
 ;; Prompt for index macro queries
-(defconst reftex-query-index-macro-prompt nil)
+(defvar reftex-query-index-macro-prompt nil)
 ;; Help string for index macro queries
-(defconst reftex-query-index-macro-help nil)
+(defvar reftex-query-index-macro-help nil)
 
 ;; The message when follow-mode is suspended
-(defconst reftex-no-follow-message
+(defvar reftex-no-follow-message
   "No follow-mode into unvisited file.  Press SPC to visit it.")
-(defconst reftex-no-info-message
+(defvar reftex-no-info-message
   "%s: info not available, use `\\[reftex-view-crossref]' to get it.")
 
 ;; Global variables used for communication between functions.
@@ -670,8 +697,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))
 
@@ -689,7 +714,7 @@ the label information is recompiled on next use."
 (defvar reftex-everything-regexp-no-index nil)
 (defvar reftex-index-re nil)
 (defvar reftex-find-citation-regexp-format
-  "\\\\[a-zA-Z]*cite[*a-zA-Z]*\\*?\\(\\[[^]]*\\]\\|{[^}]*}\\)*{\\([^}]*,\\)?\\(%s\\)[},]")
+  "\\\\\\([a-zA-Z]*cite[*a-zA-Z]*\\*?\\|bibentry\\)\\(\\[[^]]*\\]\\|{[^}]*}\\)*{\\([^}]*,\\)?\\(%s\\)[},]")
 (defvar reftex-find-reference-format
   "\\\\\\(ref[a-zA-Z]*\\|[a-zA-Z]*ref\\(range\\)?\\)\\*?\\(\\[[^]]*\\]\\|{[^}]*}\\)*{\\(%s\\)}")
 (defvar reftex-macros-with-labels nil)
@@ -703,14 +728,14 @@ the label information is recompiled on next use."
 
 ;; A list of all variables in the cache.
 ;; The cache is used to save the compiled versions of some variables.
-(defconst reftex-cache-variables 
+(defconst reftex-cache-variables
   '(reftex-memory ;; This MUST ALWAYS be the first!
-    
+
     ;; Outline
     reftex-section-levels-all
 
     ;; Labels
-    reftex-env-or-mac-alist 
+    reftex-env-or-mac-alist
     reftex-special-env-parsers
     reftex-macros-with-labels
     reftex-label-mac-list
@@ -726,7 +751,7 @@ the label information is recompiled on next use."
     reftex-index-macro-alist
     reftex-macros-with-index
     reftex-query-index-macro-prompt
-    reftex-query-index-macro-help 
+    reftex-query-index-macro-help
     reftex-key-to-index-macro-alist
 
     ;; Regular expressions
@@ -771,7 +796,7 @@ the label information is recompiled on next use."
      (t (reftex-compile-variables)))))
 
 (defun reftex-reset-mode ()
-  "Reset RefTeX Mode.  
+  "Reset RefTeX Mode.
 This will re-compile the configuration information and remove all
 current scanning information and the parse file to enforce a rescan
 on next use."
@@ -821,12 +846,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 
+  (mapcar
    (lambda (type)
      (reftex-erase-buffer (reftex-make-selection-buffer-name type)))
    reftex-typekey-list)
   ;; Kill all index buffers
-  (mapcar 
+  (mapcar
    (lambda (tag)
      (reftex-kill-buffer (reftex-make-index-buffer-name tag)))
    (cdr (assoc 'index-tags (symbol-value reftex-docstruct-symbol)))))
@@ -842,7 +867,7 @@ 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 
+  (setq reftex-memory
        (list reftex-label-alist
              (get reftex-docstruct-symbol 'reftex-section-levels)
              (get reftex-docstruct-symbol 'reftex-label-alist-style)
@@ -861,7 +886,7 @@ This enforces rescanning the buffer on next use."
              '(nil)))
        (all-index (reftex-uniquify-by-car
                    (reftex-splice-symbols-into-list
-                    (append reftex-index-macros 
+                    (append reftex-index-macros
                             (get reftex-docstruct-symbol
                                  'reftex-index-macros-style)
                             '(default))
@@ -922,7 +947,7 @@ This enforces rescanning the buffer on next use."
         ((symbolp env-or-mac)
          ;; A special parser function
          (unless (fboundp env-or-mac)
-           (message "Warning: %s does not seem to be a valid function" 
+           (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)
@@ -950,8 +975,8 @@ This enforces rescanning the buffer on next use."
                           (push (cons string toc-level) toc-levels))))))))
        ;; Translate some special context cases
        (when (assq context reftex-default-context-regexps)
-         (setq context 
-               (format 
+         (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
@@ -984,7 +1009,7 @@ This enforces rescanning the buffer on next use."
           (nreverse reftex-typekey-to-prefix-alist))
 
     ;; Prepare the typekey query prompt and help string.
-    (setq qh-list 
+    (setq qh-list
          (sort qh-list
                (lambda (x1 x2)
                  (string< (downcase (car x1)) (downcase (car x2))))))
@@ -995,7 +1020,7 @@ This enforces rescanning the buffer on next use."
                   "]"))
     ;; In the help string, we need to wrap lines...
     (setq reftex-type-query-help
-          (concat 
+          (concat
           "SELECT A LABEL TYPE:\n--------------------\n"
           (mapconcat
            (lambda(x)
@@ -1015,7 +1040,7 @@ This enforces rescanning the buffer on next use."
     ;; 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 
+         (mapcar
           (lambda (x)
             (setq word (car x)
                   typekey (cdr x)
@@ -1068,18 +1093,18 @@ This enforces rescanning the buffer on next use."
     (setq reftex-key-to-index-macro-alist
          (sort reftex-key-to-index-macro-alist
                (lambda (a b) (< (downcase (car a)) (downcase (car b))))))
-    (setq reftex-query-index-macro-prompt 
+    (setq reftex-query-index-macro-prompt
          (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 
+         (concat
           "SELECT A MACRO:\n---------------\n"
           (mapconcat
            (lambda(x)
-             (format "[%c] %-20.20s%s" (car x) (nth 1 x) 
+             (format "[%c] %-20.20s%s" (car x) (nth 1 x)
                      (if (= 0 (mod (incf i) 3)) "\n" "")))
            reftex-key-to-index-macro-alist "")))
 
@@ -1090,13 +1115,21 @@ This enforces rescanning the buffer on next use."
                  reftex-section-levels))
 
     ;; Calculate the regular expressions
-    (let* ((wbol "\\(\\`\\|[\n\r]\\)[ \t]*")
+    (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 "\\\\\\(include\\|input\\)[{ \t]+\\([^} \t\n\r]+\\)"))
+          (include-re (concat wbol
+                              "\\\\\\("
+                              (mapconcat 'identity
+                                         reftex-include-file-commands "\\|")
+                              "\\)[{ \t]+\\([^} \t\n\r]+\\)"))
           (section-re
            (concat wbol "\\\\\\("
-                   (mapconcat 'car reftex-section-levels-all "\\|")
-                   "\\)\\*?\\(\\[[^]]*\\]\\)?{?"))
+                   (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
@@ -1143,7 +1176,7 @@ This enforces rescanning the buffer on next use."
            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 
+           reftex-find-label-regexp-format2
            "\\([]} \t\n\r]\\)\\([[{]\\)\\(%s\\)[]}]")
       (message "Compiling label environment definitions...done")))
   (put reftex-docstruct-symbol 'reftex-cache
@@ -1208,6 +1241,14 @@ This enforces rescanning the buffer on next use."
     ;; Scan whatever was required by the caller.
     (reftex-do-parse rescan file))))
 
+(defun reftex-scanning-info-available-p ()
+  "Is the scanning info about the current document available?"
+  (unless reftex-docstruct-symbol
+    (reftex-tie-multifile-symbols))
+  (and (symbolp reftex-docstruct-symbol)
+       (symbol-value reftex-docstruct-symbol)
+       t))
+
 (defun reftex-silence-toc-markers (list n)
   ;; Set all toc markers in the first N entries in list to nil
   (while (and list (> (decf n) -1))
@@ -1224,7 +1265,7 @@ Valid actions are: readable, restore, read, kill, write."
          (master (reftex-TeX-master-file))
         (enable-local-variables nil)
          (file (if (string-match "\\.[a-zA-Z]+\\'" master)
-                   (concat (substring master 0 (match-beginning 0)) 
+                   (concat (substring master 0 (match-beginning 0))
                           reftex-parse-file-extension)
                  (concat master reftex-parse-file-extension))))
     (cond
@@ -1303,7 +1344,7 @@ 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 
+        (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"
@@ -1323,7 +1364,7 @@ Valid actions are: readable, restore, read, kill, write."
 (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" 
+        (prompt (format "[%c-%c] Select    TAB: Read prefix with completion"
                         ?0 highest))
         key prefix)
     (cond
@@ -1334,7 +1375,7 @@ Valid actions are: readable, restore, read, kill, write."
       (- 1 xr-index))
      (t
       (save-excursion
-       (let* ((length (apply 'max (mapcar 
+       (let* ((length (apply 'max (mapcar
                                    (lambda(x) (length (car x))) xr-alist)))
               (fmt (format " [%%c]  %%-%ds  %%s\n" length))
               (n (1- ?0)))
@@ -1344,7 +1385,7 @@ Valid actions are: readable, restore, read, kill, write."
                 (concat
                  "SELECT EXTERNAL DOCUMENT\n------------------------\n"
                  (mapconcat
-                  (lambda (x) 
+                  (lambda (x)
                     (format fmt (incf n) (or (car x) "")
                             (abbreviate-file-name (cdr x))))
                   xr-alist ""))
@@ -1368,7 +1409,7 @@ 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 "\\(" 
+        (ext-re (concat "\\("
                         (mapconcat 'regexp-quote extensions "\\|")
                         "\\)\\'"))
         (files (if (string-match ext-re file)
@@ -1377,8 +1418,8 @@ When DIE is non-nil, throw an error if file not found."
         path old-path file1)
     (cond
      ((file-name-absolute-p file)
-      (setq file1 
-           (or 
+      (setq file1
+           (or
             (and (car files) (file-regular-p (car files)) (car files))
             (and (cdr files) (file-regular-p (cdr files)) (cdr files)))))
      ((and reftex-use-external-file-finders
@@ -1393,10 +1434,10 @@ When DIE is non-nil, throw an error if file not found."
            (setq old-path path
                  path (cons master-dir path)
                  file1 (or (and (car files)
-                                (reftex-find-file-on-path 
+                                (reftex-find-file-on-path
                                  (car files) path master-dir))
                            (and (cdr files)
-                                (reftex-find-file-on-path 
+                                (reftex-find-file-on-path
                                  (cdr files) path master-dir))))))))
     (cond (file1 file1)
          (die (error "No such file: %s" file) nil)
@@ -1441,7 +1482,7 @@ When DIE is non-nil, throw an error if file not found."
           (reftex-uniq
            (reftex-parse-colon-path
             (mapconcat
-             (lambda(x) 
+             (lambda(x)
                (if (string-match "^!" x)
                    (apply 'reftex-process-string
                           (split-string (substring x 1)))
@@ -1450,7 +1491,7 @@ When DIE is non-nil, throw an error if file not found."
              ;;  (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 
+             (symbol-value (intern (concat "reftex-" type
                                            "path-environment-variables")))
              path-separator))))
       (put pathvar 'status 'split)
@@ -1476,11 +1517,11 @@ When DIE is non-nil, throw an error if file not found."
          ;; 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 
+         (put pathvar 'recursive-path
               (reftex-expand-path (symbol-value pathvar) master-dir))
          (put pathvar 'master-dir master-dir)
          (get pathvar 'recursive-path))
-        (t 
+        (t
          ;; Recursive path computed earlier is still OK.
          (get pathvar 'recursive-path)))
       ;; The simple path was requested
@@ -1509,7 +1550,7 @@ When DIE is non-nil, throw an error if file not found."
   ;; Trailing ! or !! will be converted into `//' (emTeX convention)
   (mapcar
    (lambda (dir)
-     (if (string-match "\\(//+\\|/*!+\\)\\'" dir) 
+     (if (string-match "\\(//+\\|/*!+\\)\\'" dir)
         (setq dir (replace-match "//" t t dir)))
      (file-name-as-directory dir))
    (delete "" (split-string path (concat path-separator "+")))))
@@ -1538,7 +1579,7 @@ When DIE is non-nil, throw an error if file not found."
       (when (file-directory-p dir)
        (setq files (nreverse (directory-files dir t "[^.]")))
        (while (setq file (pop files))
-         (if (file-directory-p file) 
+         (if (file-directory-p file)
              (push (file-name-as-directory file) path)))
        (push dir path1)))
     path1))
@@ -1592,22 +1633,34 @@ When DIE is non-nil, throw an error if file not found."
  "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)
+  "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" 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")
@@ -1616,7 +1669,7 @@ When DIE is non-nil, throw an error if file not found."
 (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")
 
 ;;; =========================================================================
 ;;;
@@ -1810,7 +1863,7 @@ When DIE is non-nil, throw an error if file not found."
     (while list
       (if (funcall predicate (car list))
          (push (if completion
-                   (list (nth nth (car list))) 
+                   (list (nth nth (car list)))
                  (nth nth (car list)))
                rtn))
       (setq list (cdr list)))
@@ -1846,7 +1899,7 @@ 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)))  
+       (dist (or max-length (length regexp)))
        match1 match2 match)
     (goto-char (min (+ pos dist) (point-max)))
     (when (re-search-backward regexp nil t)
@@ -1912,12 +1965,12 @@ When DIE is non-nil, throw an error if file not found."
          (switch-to-buffer-other-window "*RefTeX Select*")
          (insert help-string)
          (goto-char 1)
-         (unless (and (pos-visible-in-window-p 1)
+         (unless (and (pos-visible-in-window-p (point-min))
                       (pos-visible-in-window-p (point-max)))
-           (enlarge-window (1+ (- (count-lines 1 (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 1)
+       (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)" ""))))
@@ -1932,10 +1985,10 @@ When DIE is non-nil, throw an error if file not found."
                ((and scroll (equal char ?\C-? ))
                 (condition-case nil (scroll-down) (error nil))
                 (message prompt))
-               (t (message "") 
+               (t (message "")
                   (throw 'exit char)))
          (setq char (read-char-exclusive)))))))
-      
+
 
 (defun reftex-make-regexp-allow-for-ctrl-m (string)
   ;; convert STRING into a regexp, allowing ^M for \n and vice versa
@@ -2133,10 +2186,10 @@ IGNORE-WORDS List of words which should be removed from the string."
     ;; Restrict number of words
     (if (> (length words) nwords)
         (setcdr (nthcdr (1- nwords) words) nil))
-    
+
     ;; First, try to use all words
     (setq string (mapconcat 'identity words sep))
-  
+
     ;; Abbreviate words if enforced by user settings or string length
     (if (or (eq t abbrev)
             (and abbrev
@@ -2228,7 +2281,7 @@ IGNORE-WORDS List of words which should be removed from the string."
              (font-lock-set-defaults-1)
              (reftex-select-font-lock-fontify-region (point-min) (point-max))))
           (t
-           ;; Oops? 
+           ;; Oops?
            (message "Sorry: cannot refontify RefTeX Select buffer."))))
       (rename-buffer oldname))))
 
@@ -2264,15 +2317,18 @@ IGNORE-WORDS List of words which should be removed from the string."
 (if (featurep 'xemacs) (require '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) 
+(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 2 (make-overlay 1 1))
+(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)
@@ -2290,11 +2346,12 @@ IGNORE-WORDS List of words which should be removed from the string."
 
 ;;; =========================================================================
 ;;;
-;;; Keybindings 
+;;; Keybindings
 
 ;; The default bindings in the mode map.
 (loop for x in
       '(("\C-c="  . reftex-toc)
+       ("\C-c-"  . reftex-toc-recenter)
        ("\C-c("  . reftex-label)
        ("\C-c)"  . reftex-reference)
        ("\C-c["  . reftex-citation)
@@ -2309,10 +2366,10 @@ IGNORE-WORDS List of words which should be removed from the string."
 ;; 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)] 
+      (define-key reftex-mode-map [(shift button2)]
        'reftex-mouse-view-crossref))
   (unless (key-binding [(shift mouse-2)])
-    (define-key reftex-mode-map [(shift mouse-2)] 
+    (define-key reftex-mode-map [(shift mouse-2)]
       'reftex-mouse-view-crossref)))
 
 ;; Bind `reftex-view-crossref-from-bibtex' in BibTeX mode map
@@ -2344,6 +2401,7 @@ IGNORE-WORDS List of words which should be removed from the string."
  "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]
@@ -2365,14 +2423,13 @@ 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]
     ["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]
@@ -2390,6 +2447,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]
@@ -2404,7 +2465,7 @@ IGNORE-WORDS List of words which should be removed from the string."
    ("Reference Style"
     ["Default" (setq reftex-vref-is-default nil
                     reftex-fref-is-default nil)
-     :style radio :selected (not (or reftex-vref-is-default 
+     :style radio :selected (not (or reftex-vref-is-default
                                     reftex-fref-is-default))]
     ["Varioref" (setq reftex-vref-is-default t
                      reftex-fref-is-default nil)
@@ -2439,14 +2500,16 @@ IGNORE-WORDS List of words which should be removed from the string."
          (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 '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]
     "--"
-    ["Build Full Customize Menu" reftex-create-customize-menu 
+    ["Build Full Customize Menu" reftex-create-customize-menu
      (fboundp 'customize-menu-create)])
    ("Documentation"
     ["Info" reftex-info t]
@@ -2462,7 +2525,7 @@ IGNORE-WORDS List of words which should be removed from the string."
   (interactive)
   (if (fboundp 'customize-menu-create)
       (progn
-       (easy-menu-change 
+       (easy-menu-change
         '("Ref") "Customize"
         `(["Browse RefTeX group" reftex-customize t]
           "--"
@@ -2500,9 +2563,8 @@ With optional NODE, go directly to that node."
 ;;; That's it! ----------------------------------------------------------------
 
 (setq reftex-tables-dirty t)  ; in case this file is evaluated by hand
-(provide 'reftex) 
+(provide 'reftex)
 
 ;;;============================================================================
 
 ;;; reftex.el ends here
-