]> git.eshelyaron.com Git - emacs.git/commitdiff
* reftex.el (reftex-compile-variables): respect new structure of
authorCarsten Dominik <dominik@science.uva.nl>
Wed, 15 Dec 1999 17:02:38 +0000 (17:02 +0000)
committerCarsten Dominik <dominik@science.uva.nl>
Wed, 15 Dec 1999 17:02:38 +0000 (17:02 +0000)
`reftex-index-macro'
(reftex-compile-variables): Use the changed structure of
`reftex-label-alist'.

* reftex-vars.el (reftex-index-math-format,
(reftex-toc-max-level): New option.
reftex-index-phrases-search-whole-words,
reftex-index-phrases-case-fold-search,
reftex-index-phrases-skip-indexed-matches,
reftex-index-phrases-wrap-long-lines,
reftex-index-phrases-sort-prefers-entry,
reftex-index-phrases-sort-in-blocks): New options.
(reftex-index-macros): Option structure changed.
(reftex-index-macros-builtin): Added `repeat' item to each entry.
(reftex-label-alist): Additional item in each entry to specify if
the environment should be listed in the TOC.
(eval-when-compile (require 'cl)) added.

* reftex-index.el (reftex-index-selection-or-word): No longer
deals with "repeat".
(reftex-index): "repeat property in `reftex-index-macro-alist' is
now used.
(reftex-index-phrases-comment-regexp,
reftex-index-phrases-macrodef-regexp,
reftex-index-phrases-phrase-regexp1,
reftex-index-phrases-phrase-regexp2,
reftex-index-phrases-phrase-regexp12, reftex-index-phrases-help):
New constants.
(reftex-index-phrases-macro-data, reftex-index-phrases-files,
reftex-index-phrases-font-lock-keywords,
reftex-index-phrases-font-lock-defaults, reftex-index-phrases-map,
reftex-index-phrases-restrict-file): New variables.
(reftex-index-phrase-selection-or-word,
reftex-index-visit-phrases-buffer,
reftex-index-initialize-phrases-buffer,
reftex-index-phrases-save-and-return, reftex-index-phrases-mode,
reftex-index-next-phrase, reftex-index-this-phrase,
reftex-index-all-phrases, reftex-index-region-phrases,
reftex-index-phrases-parse-header,
reftex-index-phrases-toggle-restricted, reftex-index-new-phrase,
reftex-index-find-next-conflict-phrase, reftex-index-phrases-info,
reftex-index-phrases-set-macro-key, reftex-index-sort-phrases,
reftex-compare-phrase-lines, reftex-index-make-phrase-regexp,
reftex-index-simplify-phrase, reftex-index-phrases-find-dup-re,
reftex-index-make-replace-string,
reftex-query-index-phrase-globally, reftex-query-index-phrase,
reftex-index-phrase-match-is-indexed,
reftex-index-phrases-fixup-line,
reftex-index-phrases-replace-space,
reftex-index-select-phrases-macro): New functions.
(reftex-index-globalize, reftex-index-globally): functions removed
(eval-when-compile (require 'cl)) added.

* reftex-toc.el (reftex-toc-mode): Create new indicator for max
level.
(reftex-toc-max-level-indicator): New variable.
(reftex-toc-max-level): New command.
(reftex-toc-map): New keybinding `t'.
(reftex-toc-help): Constant updated.
(eval-when-compile (require 'cl)) added.

* reftex-ref.el (reftex-offer-label-menu): Prefix to `t' command key
can change `reftex-toc-max-level'
(eval-when-compile (require 'cl)) added.

* reftex-sel (reftex-insert-docstruct): Respect
`reftex-toc-max-level'
(eval-when-compile (require 'cl)) added.

* reftex-auc.el (eval-when-compile (require 'cl)) added.

* reftex-vcr.el (eval-when-compile (require 'cl)) added.

* reftex-cite.el (reftex-citep, reftex-citet): New commands.
(reftex-citation, reftex-do-citation,
reftex-figure-out-cite-format): Additional argument FORMAT-KEY to
preselect a citation format.
(eval-when-compile (require 'cl)) added.

* reftex-parse.el (reftex-context-substring): Optional parameter
to-end
(reftex-section-info): Deal with environment matches.
(eval-when-compile (require 'cl)) added.

* reftex-global.el (eval-when-compile (require 'cl)) added.

lisp/textmodes/reftex-auc.el
lisp/textmodes/reftex-cite.el
lisp/textmodes/reftex-global.el
lisp/textmodes/reftex-index.el
lisp/textmodes/reftex-parse.el
lisp/textmodes/reftex-ref.el
lisp/textmodes/reftex-sel.el
lisp/textmodes/reftex-toc.el
lisp/textmodes/reftex-vars.el
lisp/textmodes/reftex-vcr.el
lisp/textmodes/reftex.el

index 0e6ad5f5059bca90bc1958de1e5fbbd54e039f6d..8324357b2b4fff0f3dd648b7f5efd882262a784b 100644 (file)
@@ -1,8 +1,9 @@
 ;;; reftex-auc.el - RefTeX's interface to AUC TeX
-;;; Version: 4.6
+;;; Version: 4.9
 ;;;
 ;;; See main file reftex.el for licensing information
 
+(eval-when-compile (require 'cl))
 (provide 'reftex-auc)
 (require 'reftex)
 ;;;
index d528b54540e3e015fbae9b1d8c178c3e995cf5bb..ae42e7a932cc63f839f33b2dc8df3176f9722e15 100644 (file)
@@ -1,8 +1,9 @@
 ;;; reftex-cite.el - Creating citations with RefTeX
-;;; Version: 4.6
+;;; Version: 4.9
 ;;;
 ;;; See main file reftex.el for licensing information
 
+(eval-when-compile (require 'cl))
 (provide 'reftex-cite)
 (require 'reftex)
 ;;;
 ;; Make a citation
 
 ;;;###autoload
-(defun reftex-citation (&optional no-insert)
+(defun reftex-citation (&optional no-insert format-key)
   "Make a citation using BibTeX database files.
 After prompting for a regular expression, scans the buffers with
 bibtex entries (taken from the \\bibliography command) and offers the
@@ -510,6 +511,8 @@ to `reftex-cite-format' and inserted into the buffer.
 
 If NO-INSERT is non-nil, nothing is inserted, only the selected key returned.
 
+FORAT-KEY can be used to pre-select a citation format.
+
 When called with one or two `C-u' prefixes, first rescans the document.
 When called with a numeric prefix, make that many citations.  When
 called with point inside the braces of a `\cite' command, it will
@@ -533,13 +536,13 @@ While entering the regexp, completion on knows citation keys is possible.
 
   ;; Call reftex-do-citation, but protected
   (unwind-protect
-      (reftex-do-citation current-prefix-arg no-insert)
+      (reftex-do-citation current-prefix-arg no-insert format-key)
     (reftex-kill-temporary-buffers)))
 
-(defun reftex-do-citation (&optional arg no-insert)
+(defun reftex-do-citation (&optional arg no-insert format-key)
   ;; This really does the work of reftex-citation.
 
-  (let* ((format (reftex-figure-out-cite-format arg no-insert))
+  (let* ((format (reftex-figure-out-cite-format arg no-insert format-key))
         (docstruct-symbol reftex-docstruct-symbol)
         (selected-entries (reftex-offer-bib-menu))
         (insert-entries selected-entries)
@@ -610,7 +613,7 @@ While entering the regexp, completion on knows citation keys is possible.
     ;; Return the citation key
     (car (car selected-entries))))
 
-(defun reftex-figure-out-cite-format (arg no-insert)
+(defun reftex-figure-out-cite-format (arg &optional no-insert format-key)
   ;; Check if there is already a cite command at point and change cite format
   ;; in order to only add another reference in the same cite command.
   (let ((macro (car (reftex-what-macro 1)))
@@ -640,19 +643,30 @@ While entering the regexp, completion on knows citation keys is possible.
              cite-format-value))
       (when (listp format)
        (setq key
-             (reftex-select-with-char 
-              "" (concat "SELECT A CITATION FORMAT\n\n"
-                         (mapconcat
-                          (lambda (x)
-                            (format "[%c] %s  %s" (car x)
-                                    (if (> (car x) 31) " " "")
-                                    (cdr x)))
-                          format "\n"))))
+             (or format-key
+                 (reftex-select-with-char 
+                  "" (concat "SELECT A CITATION FORMAT\n\n"
+                             (mapconcat
+                              (lambda (x)
+                                (format "[%c] %s  %s" (car x)
+                                        (if (> (car x) 31) " " "")
+                                        (cdr x)))
+                              format "\n")))))
        (if (assq key format)
            (setq format (cdr (assq key format)))
          (error "No citation format associated with key `%c'" key)))))
     format))
 
+(defun reftex-citep ()
+  "Call `reftex-citation' with a format selector `?p'."
+  (interactive)
+  (reftex-citation nil ?p))
+
+(defun reftex-citet ()
+  "Call `reftex-citation' with a format selector `?t'."
+  (interactive)
+  (reftex-citation nil ?t))
+
 (defvar reftex-select-bib-map)
 (defun reftex-offer-bib-menu ()
   ;; Offer bib menu and return list of selected items
index d484f5f03657749502f01c6f3b7b7c5cace3a25e..c62a555ac17f1b9059bbf2a69916292491a07767 100644 (file)
@@ -1,8 +1,9 @@
 ;;; reftex-global.el - Operations on entire documents with RefTeX
-;;; Version: 4.6
+;;; Version: 4.9
 ;;;
 ;;; See main file reftex.el for licensing information
 
+(eval-when-compile (require 'cl))
 (provide 'reftex-global)
 (require 'reftex)
 ;;;
@@ -191,7 +192,7 @@ one with the `xr' package."
        (if (assoc label translate-alist)
            (error "Duplicate label %s" label))
        (setq new-label (concat (match-string 1 (car entry))
-                               (incf (cdr nr-cell))))
+                               (int-to-string (incf (cdr nr-cell)))))
        (push (cons label new-label) translate-alist)
        (or (string= label new-label) (setq changed-sequence t))))
 
index 64ee50046d645b5bd83cc38c7efd0a96ed1f4d7c..0c020f6bf063528b0e6d9d1a33190a1a429ddfae 100644 (file)
@@ -1,8 +1,9 @@
 ;;; reftex-index.el - Index support with RefTeX
-;;; Version: 4.6
+;;; Version: 4.9
 ;;;
 ;;; See main file reftex.el for licensing information
 
+(eval-when-compile (require 'cl))
 (provide 'reftex-index)
 (require 'reftex)
 ;;;
@@ -10,7 +11,7 @@
 (defvar mark-active)
 (defvar zmacs-regions)
 (defvar transient-mark-mode)
-(defun reftex-index-selection-or-word (&optional arg)
+(defun reftex-index-selection-or-word (&optional arg phrase)
   "Put selection or the word near point into the default index macro.
 This uses the information in `reftex-index-default-macro' to make an index
 entry.  The phrase indexed is the current selection or the word near point.
@@ -37,33 +38,34 @@ which is part of AUCTeX, the string is first processed with the
         (sel (buffer-substring beg end))
         (mathp (condition-case nil (texmathp) (error nil)))
         (current-prefix-arg nil) ; we want to call reftex-index without prefix.
-        key def-char def-tag full-entry repeat-word)
-
-    (if (equal sel "")
-       ;; Nothing selecte, no word, so use full reftex-index command
-       (reftex-index)
-      ;; OK, we have something to index here.
-      ;; Add the dollars when necessary
-      (setq key (if mathp
-                   (format reftex-index-math-format sel)
-                 sel))
-      ;; Get info from `reftex-index-default-macro'
-      (setq def-char (if use-default (car reftex-index-default-macro)))
-      (setq def-tag  (if use-default (nth 1 reftex-index-default-macro)))
-      ;; Does the user want to edit the entry?
-      (setq full-entry (if arg
-                          (reftex-index-complete-key
-                           def-tag nil (cons key 0))
-                        key))
-      ;; Do we neet to repeat the word outside the macro?
-      (setq repeat-word (if use-default
-                           (nth 2 reftex-index-default-macro)
-                         (y-or-n-p "Repeat phrase outside macro? ")))
-      ;; Delete what is in the buffer and make the index entry
-      (delete-region beg end)
-      (reftex-index def-char full-entry def-tag (if repeat-word sel nil)))))
+        key def-char def-tag full-entry)
 
-(defun reftex-index (&optional char key tag postfix no-insert)
+    (if phrase
+       (progn
+         (reftex-index-visit-phrases-buffer)
+         (reftex-index-new-phrase sel))
+
+      (if (equal sel "")
+         ;; Nothing selected, no word, so use full reftex-index command
+         (reftex-index)
+       ;; OK, we have something to index here.
+       ;; Add the dollars when necessary
+       (setq key (if mathp
+                     (format reftex-index-math-format sel)
+                   sel))
+       ;; Get info from `reftex-index-default-macro'
+       (setq def-char  (if use-default (car reftex-index-default-macro)))
+       (setq def-tag   (if use-default (nth 1 reftex-index-default-macro)))
+       ;; Does the user want to edit the entry?
+       (setq full-entry (if arg
+                            (reftex-index-complete-key
+                             def-tag nil (cons key 0))
+                          key))
+       ;; Delete what is in the buffer and make the index entry
+       (delete-region beg end)
+       (reftex-index def-char full-entry def-tag sel)))))
+  
+(defun reftex-index (&optional char key tag sel no-insert)
   "Query for an index macro and insert it along with its argments.
 The index macros available are those defined in `reftex-index-macro' or
 by a call to `reftex-add-index-macros', typically from an AUCTeX style file.
@@ -88,6 +90,7 @@ will prompt for other arguments."
         (nargs (nth 4 entry))
         (nindex (nth 5 entry))
         (opt-args (nth 6 entry))
+        (repeat (nth 7 entry))
         opt tag1 value)
 
     ;; Get the supported arguments
@@ -111,7 +114,7 @@ will prompt for other arguments."
                                                ": ")))))
       (unless (and opt (string= value ""))
        (insert (if opt "[" "{") value (if opt "]" "}"))))
-    (and (stringp postfix) (insert postfix))
+    (and repeat (stringp sel) (insert sel))
     (and key reftex-plug-into-AUCTeX (fboundp 'LaTeX-add-index-entries)
         (LaTeX-add-index-entries key))
     (reftex-index-update-taglist tag1)
@@ -236,98 +239,6 @@ will prompt for other arguments."
     (and newtag (cdr cell) (not (member newtag (cdr cell)))
         (push newtag (cdr cell)))))
 
-(defvar reftex-last-index-file)
-(defun reftex-index-globally (&optional data call-file)
-  "Index a word with a global search and replace.
-This works very much like `reftex-query-replace-document', but the
-defaults for the search and replace strings are derived from
-local context.
-When there is an index entry, we try to index similar words.  The word
-to search for is either a word in direct contact with the index macro
-(like `\\index{WORD}WORD' or `WORD\\index{WORD}') or the index key.
-The replacement text is the index macro with all its arguments and the
-attached word.
-When there is no index entry at point, we search for the word near point
-and propose to index it like this: `\\index{word}word'.
-You get a chance to edit the search and replacement strings.
-DATA can be a docstruct entry describing an index entry, and then the 
-defaults will be derived from it.
-CALL-FILE may be the file from where to call the global search command."
-  (interactive)
-  (let* ((call-file (cond (call-file call-file)
-                         (reftex-mode (buffer-file-name))
-                         ((eq major-mode 'reftex-index-mode)
-                          reftex-last-index-file)
-                         (t (error "Need a call file here"))))
-        (pos (point))
-        (data (cond 
-               (data data)
-               ((and reftex-mode
-                     (save-excursion
-                       (forward-char 20)
-                       (re-search-backward reftex-everything-regexp nil t)
-                       (< (count-lines (min pos (point)) (max pos (point)))
-                          2)))
-                (reftex-index-info (buffer-file-name)))
-               (t nil)))
-        (ksep (car reftex-index-special-chars))
-        (words-include-escapes t)
-        (case-replace nil)
-        (case-fold-search t)
-        word rpl start analyze-list pre key attr actual post)
-
-    ;; Find the word and construct the replacement string
-    (if (and data (eq (car data) 'index))
-        ;; OK, we have an index entry
-       (progn
-         (setq analyze-list (reftex-index-analyze-entry data)
-               pre (car analyze-list)
-               key (nth 1 analyze-list)
-               attr (nth 2 analyze-list)
-               actual (nth 3 analyze-list)
-               post (nth 4 analyze-list)) 
-         (when (string-match (concat "\\<\\(\\sw+\\)" reftex-index-re) pre)
-           (setq word (match-string 1 pre)
-                 pre (concat "<<<1>>>" (substring pre (match-end 1)))
-                 rpl (concat pre key attr actual post)))           
-         (when (string-match "}\\(\\sw+\\)\\>[^}]*\\'" post)
-           (setq word (match-string 1 post)
-                 post (concat (substring post 0 (match-beginning 1))
-                              "<<<1>>>")
-                 rpl (concat pre key attr actual post)))
-         (when (and (not word) key)
-           (if (string-match (concat ".*" (regexp-quote ksep)) key)
-               (setq word (substring key (match-end 0)))
-             (setq word key))
-           (setq rpl (concat pre key attr actual post))))
-      ;; No index entry, just use local word.
-      (setq word (save-excursion
-                  (buffer-substring-no-properties
-                   (progn (skip-syntax-backward "w") (point))
-                   (progn (skip-syntax-forward  "w") (point))))
-           rpl (concat "\\index{" word "}<<<1>>>")))
-    ;; Quote what is necessary
-    (setq word (regexp-quote (downcase word)))
-    (setq start 0)
-    (while (setq start (string-match "\\\\" rpl start))
-      (setq rpl (replace-match "\\\\" t t rpl)
-           start (+ 2 start)))
-    ;; We used <<<1>>> instead of \1 to avoid the quoting.  Fix this now.
-    (if (string-match "<<<1>>>" rpl)
-       (setq rpl (replace-match "\\1" t t rpl)))
-
-    ;; Give the user a chance to edit the strings
-    (setq word (read-string "Search: " 
-                           (if word (format "\\<\\(%s\\)\\>" word)))
-         rpl (read-string "Replace with: " rpl))
-
-    ;; Execute the command
-    (save-excursion
-      (switch-to-buffer (get-file-buffer call-file))
-      (condition-case nil
-         (reftex-query-replace-document word rpl)
-       (error nil)))))
-
 (defvar reftex-index-map (make-sparse-keymap)
   "Keymap used for *Index* buffers.")
 
@@ -392,7 +303,6 @@ e / C-k    Edit/Kill the entry.
            With prefix: kill that part.
 ( )        Toggle entry's beginning/end of page range property.
 _ ^        Add/Remove parent key (to make this item a subitem).
-&          Index the same word everywhere in the document.
 } / {      Restrict Index to a single document section / Widen.
 < / >      When restricted, move restriction to previous/next section.")
 
@@ -918,22 +828,6 @@ When index is restricted, select the previous section as restriction criterion."
         (post (substring context eoa)))
     (list pre key attr actual post)))
 
-(defun reftex-index-globalize (&optional arg)
-  "Globalize the current index entry.
-This starts a global search and replace to index the same word
-at other places in the document. After this function completes, you 
-need to rescan the document with `r' or `C-u r' in order to get the
-entries into the index buffer.
-Defaults for the search and replace strings are derived from
-the current entry.  See the command `reftex-index-globally'."
-  (interactive)
-  (let* ((data (get-text-property (point) :data))
-        (buf (current-buffer)))
-    (unless data
-      (error "No index entry at point"))
-    (reftex-index-globally data)
-    (switch-to-buffer buf)))
-
 (defun reftex-index-edit ()
   "Edit the index entry at point."
   (interactive)
@@ -964,7 +858,7 @@ the current entry.  See the command `reftex-index-globally'."
   "Toggle the page-range-end attribute `|)'."
   (interactive)
   (let* ((data (get-text-property (point) :data))
-        (eor (concat (nth 1 reftex-index-special-chars) "("))
+        (eor (concat (nth 1 reftex-index-special-chars) ")"))
         new analyze attr)
     (unless data (error "Don't know which index entry to edit"))
     (setq analyze (reftex-index-analyze-entry data)
@@ -1138,7 +1032,6 @@ the current entry.  See the command `reftex-index-globally'."
        ("|"    . reftex-index-edit-attribute)
        ("@"    . reftex-index-edit-visual)
        ("*"    . reftex-index-edit-key)
-       ("&"    . reftex-index-globalize)
        ("\C-c=". reftex-index-goto-toc)
        ("c"    . reftex-index-toggle-context))
       do (define-key reftex-index-map (car x) (cdr x)))
@@ -1164,8 +1057,11 @@ the current entry.  See the command `reftex-index-globally'."
          (recenter 0)
          (reftex-index-next))
       (goto-char pos)
-      (error "This <%s> index does not contain entries starting with `%c'" 
-            reftex-index-tag char))))
+      (if (eq char ?!)
+         (error "This <%s> index does not contain entries sorted before the letters"
+                reftex-index-tag)
+       (error "This <%s> index does not contain entries starting with `%c'" 
+              reftex-index-tag char)))))
 
 (easy-menu-define 
  reftex-index-menu reftex-index-map
@@ -1204,7 +1100,6 @@ the current entry.  See the command `reftex-index-globally'."
     ["Make Start-of-Range" reftex-index-toggle-range-beginning t]
     ["Make End-of-Range" reftex-index-toggle-range-end t]
     "--"
-    ["Globalize"  reftex-index-globalize t]
     ["Kill Entry" reftex-index-kill nil]
     "--"
     ["Undo" reftex-index-undo nil])
@@ -1217,4 +1112,941 @@ the current entry.  See the command `reftex-index-globally'."
    "--"
    ["Help" reftex-index-show-help t]))
 
+
+;;----------------------------------------------------------------------
+;; The Index Phrases File
+
+;; Some constants and variables
+(defconst reftex-index-phrases-comment-regexp "^[ \t]*%.*"
+  "Regular expression to match comment lines in phrases buffer")
+(defconst reftex-index-phrases-macrodef-regexp
+  "^\\(>>>INDEX_MACRO_DEFINITION:\\)[ \t]+\\(\\S-\\)\\( *\t[ \t]*\\)\\([^\t]*[^ \t]\\)\\( *\t[ \t]*\\)\\(\\S-+\\)"
+  "Regular expression to match macro definition lines the phrases buffer.")
+;(defconst reftex-index-phrases-macrodef-regexp
+;  "^\\(>>>INDEX_MACRO_DEFINITION:\\)[ \t]+\\(\\S-\\)\\([ \t]*\\)\\([^\t]*[^ \t]\\)\\([ \t]*\\)\\(nil\\|t\\)[ \t]*$"
+;  "Regular expression to match macro definition lines the phrases buffer.
+;This version would allow just spaces as separators.")
+(defconst reftex-index-phrases-phrase-regexp1
+  "^\\(\\S-?\\)\\(\t\\)\\([^\t\n]*\\S-\\)\\([ \t]*\\)$"
+  "Regular expression matching phrases which have no separate index key.")
+(defconst reftex-index-phrases-phrase-regexp2
+  "^\\(\\S-?\\)\\(\t\\)\\([^\t]*\\S-\\)\\(\t[ \t]*\\)\\([^\n\t]*\\S-\\)[ \t]*$"
+  "Regular expression matching phrases which have a separate index key.")
+(defconst reftex-index-phrases-phrase-regexp12
+  "^\\(\\S-?\\)\\(\t\\)\\([^\n\t]*\\S-\\)\\(\\(\t[ \t]*\\)\\([^\n\t]*\\S-\\)\\)?[ \t]*$"
+  "Regular expression matching all types of phrase lines.")
+(defvar reftex-index-phrases-macro-data nil
+  "Alist containing the information taken from the macro definition lines.
+This gets refreshed in every phrases command.")
+(defvar reftex-index-phrases-files nil
+  "List of document files relevant for the phrases file.")
+
+(defvar reftex-index-phrases-font-lock-keywords nil
+  "Font lock keywords for reftex-index-phrases-mode.")
+(defvar reftex-index-phrases-font-lock-defaults nil
+  "Font lock defaults for reftex-index-phrases-mode.")
+(defvar reftex-index-phrases-map (make-sparse-keymap)
+  "Keymap used for *toc* buffer.")
+
+
+(defun reftex-index-phrase-selection-or-word (arg)
+  "Add current selection or word at point to the phrases buffer.
+When you are in transient-mark-mode and the region is active, the
+selection will be used - otherwise the word at point.
+You get a chance to edit the entry in the phrases buffer - finish with
+`C-c C-c'."
+  (interactive "P")
+  (set-marker reftex-index-return-marker (point))
+  (reftex-index-selection-or-word arg 'phrase)
+  (if (eq major-mode 'reftex-index-phrases-mode)
+      (message 
+       (substitute-command-keys
+       "Return to LaTeX with \\[reftex-index-phrases-save-and-return]"))))
+
+(defun reftex-index-visit-phrases-buffer ()
+  "Switch to the phrases buffer, initialize if empty."
+  (interactive)
+  (reftex-access-scan-info)
+  (let* ((master (reftex-TeX-master-file))
+        (name (concat (file-name-sans-extension master) ".rip")))
+    (find-file name)
+    (unless (eq major-mode 'reftex-index-phrases-mode)
+      (reftex-index-phrases-mode))
+    (if (= (buffer-size) 0)
+       (reftex-index-initialize-phrases-buffer master))))
+
+(defun reftex-index-initialize-phrases-buffer (&optional master)
+  "Initialize the phrases buffer by creating the header.
+If the buffer is non-empty, delete the old header first."
+  (interactive)
+  (let* ((case-fold-search t)
+        (default-key (car reftex-index-default-macro))
+        (default-macro (nth 1 (assoc default-key
+                                     reftex-key-to-index-macro-alist)))
+        (macro-alist
+         (sort (copy-sequence reftex-index-macro-alist)
+               (lambda (a b) (equal (car a) default-macro))))
+        macro entry key repeat)
+    
+    (if master (set (make-local-variable 'TeX-master)
+                   (file-name-nondirectory master)))
+
+    (when (> (buffer-size) 0)
+      (goto-char 1)
+      (set-mark (point))
+      (while (re-search-forward reftex-index-phrases-macrodef-regexp nil t)
+       (end-of-line))
+      (beginning-of-line 2)
+      (if (looking-at reftex-index-phrases-comment-regexp)
+         (beginning-of-line 2))
+      (while (looking-at "^[ \t]*$")
+         (beginning-of-line 2))          
+      (cond ((fboundp 'zmacs-activate-region) (zmacs-activate-region))
+           ((boundp 'make-active) (setq mark-active t)))
+      (if (yes-or-no-p "Delete and rebuilt header ")
+         (delete-region (point-min) (point))))
+
+    ;; Insert the mode line
+    (insert
+     (format "%% -*- mode: reftex-index-phrases; TeX-master: \"%s\" -*-\n"
+            (file-name-nondirectory (reftex-index-phrase-tex-master))))
+    ;; Insert the macro definitions
+    (insert "%                              Key      Macro Format            Repeat\n")
+    (insert "%---------------------------------------------------------------------\n")
+    (while (setq entry (pop macro-alist))
+      (setq macro (car entry)
+           repeat (nth 7 entry)
+           key (car (delq nil (mapcar (lambda (x) (if (equal (nth 1 x) macro)
+                                                      (car x)
+                                                    nil))
+                                      reftex-key-to-index-macro-alist))))
+      (insert (format ">>>INDEX_MACRO_DEFINITION:\t%s\t%-20s\t%s\n"
+                     (char-to-string key) (concat macro "{%s}")
+                     (if repeat "t" "nil"))))
+    (insert "%---------------------------------------------------------------------\n\n\n")))
+
+(defvar TeX-master)
+(defun reftex-index-phrase-tex-master (&optional dir)
+  "Return the name of the master file associated with a phrase buffer."
+  (if (and (boundp 'TeX-master)
+          (local-variable-p 'TeX-master (current-buffer))
+          (stringp TeX-master))
+      ;; We have a local variable which tells us which file to use
+      (expand-file-name TeX-master dir)
+    ;; have to guess
+    (concat (file-name-sans-extension (buffer-file-name)) ".tex")))
+
+(defun reftex-index-phrases-save-and-return ()
+  "Return to where the `reftex-index-phrase-selection-or-word' was called."
+  (interactive)
+  (save-buffer)
+  (switch-to-buffer (marker-buffer reftex-index-return-marker))
+  (goto-char (or (marker-position reftex-index-return-marker) (point))))
+
+
+(defvar reftex-index-phrases-menu)
+(defvar reftex-index-phrases-restrict-file nil)
+;;;###autoload
+(defun reftex-index-phrases-mode ()
+  "Major mode for managing the Index phrases of a LaTeX document.
+This buffer was created with RefTeX.
+
+To insert new phrases, use
+ - `C-c \\' in the LaTeX document to copy selection or word
+ - `\\[reftex-index-new-phrase]' in the phrases buffer.
+
+To index phrases use one of:
+
+\\[reftex-index-this-phrase]     index current phrase
+\\[reftex-index-next-phrase]     index next phrase (or N with prefix arg)
+\\[reftex-index-all-phrases]     index all phrases
+\\[reftex-index-remaining-phrases]     index current and following phrases
+\\[reftex-index-region-phrases]     index the phrases in the region
+
+You can sort the phrases in this buffer with \\[reftex-index-sort-phrases].
+To display information about the phrase at point, use \\[reftex-index-phrases-info].
+
+For more information see the RefTeX User Manual.
+
+Here are all local bindings.
+
+\\{reftex-index-phrases-map}"
+  (interactive)
+  (kill-all-local-variables)
+  (setq major-mode 'reftex-index-phrases-mode
+       mode-name "Phrases")
+  (use-local-map reftex-index-phrases-map)
+  (set (make-local-variable 'font-lock-defaults) 
+       reftex-index-phrases-font-lock-defaults)
+  (easy-menu-add reftex-index-phrases-menu reftex-index-phrases-map)
+  (set (make-local-variable 'reftex-index-phrases-marker) (make-marker))
+  (run-hooks 'reftex-index-phrases-mode-hook))
+(add-hook 'reftex-index-phrases-mode-hook 'turn-on-font-lock)
+
+;; Font Locking stuff
+(let ((ss (if (featurep 'xemacs) 'secondary-selection ''secondary-selection)))
+  (setq reftex-index-phrases-font-lock-keywords
+       (list 
+        (cons reftex-index-phrases-comment-regexp 'font-lock-comment-face)
+        (list reftex-index-phrases-macrodef-regexp
+              '(1 font-lock-type-face)
+              '(2 font-lock-keyword-face)
+              (list 3 ss)
+              '(4 font-lock-function-name-face)
+              (list 5 ss)
+              '(6 font-lock-string-face))
+        (list reftex-index-phrases-phrase-regexp1
+              '(1 font-lock-keyword-face)
+              (list 2 ss)
+              '(3 font-lock-string-face)
+              (list 4 ss))
+        (list reftex-index-phrases-phrase-regexp2
+              '(1 font-lock-keyword-face)
+              (list 2 ss)
+              '(3 font-lock-string-face)
+              (list 4 ss)
+              '(5 font-lock-function-name-face))
+        (cons "^\t$" ss)))
+  (setq reftex-index-phrases-font-lock-defaults
+       '((reftex-index-phrases-font-lock-keywords)
+         nil t nil beginning-of-line))
+  (put 'reftex-index-phrases-mode 'font-lock-defaults 
+       reftex-index-phrases-font-lock-defaults) ; XEmacs
+  )
+
+(defvar reftex-index-phrases-marker)
+(defun reftex-index-next-phrase (&optional arg)
+  "Index the next ARG phrases in the phrases buffer."
+  (interactive "p")
+  (reftex-index-phrases-parse-header t)
+  (while (> arg 0)
+    (decf arg)
+    (end-of-line)
+    (if (re-search-forward reftex-index-phrases-phrase-regexp12 nil t)
+       (progn
+         (goto-char (match-beginning 0))
+         (reftex-index-this-phrase))
+      (error "No more phrase lines after point"))))
+
+(defun reftex-index-this-phrase ()
+  "Index the phrase in the current line.
+Does a global search and replace in the entire document.  At each
+match, the user will be asked to confirm the replacement."
+  (interactive)
+  (if (interactive-p) (reftex-index-phrases-parse-header t))
+  (save-excursion
+    (beginning-of-line)
+    (cond ((looking-at reftex-index-phrases-comment-regexp)
+          (if (interactive-p) (error "Comment line")))
+         ((looking-at "^[ \t]*$")
+          (if (interactive-p) (error "Empty line")))
+         ((looking-at reftex-index-phrases-macrodef-regexp)
+          (if (interactive-p) (error "Macro definition line")))
+         ((looking-at reftex-index-phrases-phrase-regexp12)
+          ;; This is a phrase
+          (let* ((char (if (not (equal (match-string 1) ""))
+                           (string-to-char (match-string 1))))
+                 (phrase (match-string 3))
+                 (index-key (match-string 6))
+                 (macro-data (cdr (if (null char)
+                                      (car reftex-index-phrases-macro-data)
+                                    (assoc char reftex-index-phrases-macro-data))))
+                 (macro-fmt (car macro-data))
+                 (repeat (nth 1 macro-data))
+                 (files
+                  (cond ((and (stringp reftex-index-phrases-restrict-file)
+                              (file-regular-p reftex-index-phrases-restrict-file))
+                         (list reftex-index-phrases-restrict-file))
+                        ((stringp reftex-index-phrases-restrict-file)
+                         (error "Illegal restriction file %s"
+                                reftex-index-phrases-restrict-file))
+                        (t reftex-index-phrases-files)))
+                 (as-words reftex-index-phrases-search-whole-words))
+            (unless macro-data
+              (error "No macro associated with key %c" char))
+            (unwind-protect
+                (let ((overlay-arrow-string "=>")
+                      (overlay-arrow-position
+                       reftex-index-phrases-marker)
+                      (replace-count 0))
+                  ;; Show the overlay arrow
+                  (move-marker reftex-index-phrases-marker
+                               (match-beginning 0) (current-buffer))
+                  ;; Start the query-replace
+                  (reftex-query-index-phrase-globally 
+                   files phrase macro-fmt 
+                   index-key repeat as-words)
+                  (message "%s replaced" 
+                           (reftex-number replace-count "occurrence"))))))
+         (t (error "Cannot parse this line")))))
+
+(defun reftex-index-all-phrases ()
+  "Index all phrases in the phrases buffer.
+Calls `reftex-index-this-phrase' on each line in the buffer."
+  (interactive)
+  (reftex-index-region-phrases (point-min) (point-max)))
+
+(defun reftex-index-remaining-phrases ()
+  "Index all phrases in the phrases buffer.
+Calls `reftex-index-this-phrase' on each line ay and below point in
+the buffer."
+  (interactive)
+  (beginning-of-line)
+  (reftex-index-region-phrases (point) (point-max)))
+
+(defun reftex-index-region-phrases (beg end)
+  "Index all phrases in the phrases buffer.
+Calls `reftex-index-this-phrase' on each line in the region."
+  (interactive "r")
+  (reftex-index-phrases-parse-header t)
+  (goto-char beg)
+  (while (not (or (eobp)
+                 (>= (point) end)))
+    (save-excursion (reftex-index-this-phrase))
+    (beginning-of-line 2)))
+
+(defun reftex-index-phrases-parse-header (&optional get-files)
+  "Parse the header of a phrases file to extract the macro definitions.
+The definitions get stored in `reftex-index-phrases-macro-data'.
+Also switches to the LaTeX document to find out which files belong to
+the document and stores the list in `reftex-index-phrases-files'."
+  (let* ((master (reftex-index-phrase-tex-master))
+        buf)
+    (if get-files
+       ;; Get the file list
+       (save-excursion
+         (setq buf (reftex-get-file-buffer-force master))
+         (unless buf (error "Master file %s not found" master))
+         (set-buffer buf)
+         (reftex-access-scan-info)
+         (setq reftex-index-phrases-files 
+               (reftex-all-document-files))))
+    ;; Parse the files header for macro definitions
+    (setq reftex-index-phrases-macro-data nil)
+    (save-excursion
+      (goto-char (point-min))
+      (while (re-search-forward reftex-index-phrases-macrodef-regexp nil t)
+       (push (list
+              (string-to-char (match-string 2))
+              (match-string 4)
+              (equal (match-string 6) "t"))
+             reftex-index-phrases-macro-data))
+      ;; Reverse the list, so that the first macro is first
+      (if (null reftex-index-phrases-macro-data)
+         (error "No valid MACRO DEFINITION line in .rip file (make sure to use TAB separators)"))
+      (setq reftex-index-phrases-macro-data 
+           (nreverse reftex-index-phrases-macro-data))
+      (goto-char (point-min)))))
+
+(defun reftex-index-phrases-apply-to-region (beg end)
+  "Index all index phrases in the current region.
+This works exactly like global indexing from the index phrases buffer,
+but operation is restricted to the current region.  This is useful if
+you need to add/change text in an already indexed document and want to
+index the new part without having to go over the unchanged parts again."
+  (interactive "r")
+  (let ((win-conf (current-window-configuration))
+       (reftex-index-phrases-restrict-file (buffer-file-name)))        
+  (save-excursion
+    (save-restriction
+      (narrow-to-region beg end)
+      (unwind-protect
+         (progn
+           ;; Hide the region highlighting
+           (cond ((fboundp 'zmacs-deactivate-region) (zmacs-deactivate-region))
+                 ((fboundp 'deactivate-mark) (deactivate-mark)))
+           (delete-other-windows)
+           (reftex-index-visit-phrases-buffer)
+           (reftex-index-all-phrases))
+       (set-window-configuration win-conf))))))
+
+(defun reftex-index-new-phrase (&optional text)
+  "Open a new line in the phrases buffer, insert TEXT."
+  (interactive)
+  (if (and text (stringp text))
+      (progn
+       ;; Check if the phrase is already in the buffer
+       (setq text (reftex-index-simplify-phrase text))
+       (goto-char (point-min))
+       (if (re-search-forward
+            (concat "^\\(\\S-*\\)\t\\(" (regexp-quote text) 
+                    "\\) *[\t\n]") nil t)
+           (progn
+             (goto-char (match-end 2))
+             (error "Phrase is already in phrases buffer")))))
+  ;; Add the new phrase line after the last in the buffer
+  (goto-char (point-max))
+  (if (re-search-backward reftex-index-phrases-phrase-regexp12 nil t)
+      (end-of-line))
+  (if (not (bolp))
+      (insert "\n"))
+  (insert "\t")
+  (if (and text (stringp text))
+      (insert text)))
+
+(defun reftex-index-find-next-conflict-phrase (&optional arg)
+  "Find the next a phrase which is has conflicts in the phrase buffer.
+The command helps to find possible conflicts in the phrase indexing process.
+It searches downward from point for a phrase which is repeated elsewhere
+in the buffer, or which is a subphrase of another phrase.  If such a
+phrase is found, the phrase info is displayed.
+To check the whole buffer, start at the beginning and continue by calling
+this function repeatedly."
+  (interactive "P")
+  (if (catch 'exit
+       (while (re-search-forward reftex-index-phrases-phrase-regexp12 nil t)
+         (goto-char (match-beginning 3))
+         (let* ((phrase (match-string 3))
+                (case-fold-search reftex-index-phrases-case-fold-search)
+                (re (reftex-index-phrases-find-dup-re phrase t)))
+           (if (save-excursion 
+                 (goto-char (point-min))
+                 (and (re-search-forward re nil t)
+                      (re-search-forward re nil t)))
+               (throw 'exit t)))))
+      (progn
+       (reftex-index-phrases-info)
+       (message "Phrase with match conflict discovered"))
+    (goto-char (point-max))
+    (error "No further problematic phrases found")))
+
+(defun reftex-index-phrases-info ()
+  "Display information about the phrase at point."
+  (interactive)
+  (save-excursion
+    (beginning-of-line)
+    (unless (looking-at reftex-index-phrases-phrase-regexp12)
+      (error "Not a phrase line"))
+    (save-match-data (reftex-index-phrases-parse-header t))
+    (let* ((char (if (not (equal (match-string 1) ""))
+                    (string-to-char (match-string 1))))
+          (phrase (match-string 3))
+          (index-key (match-string 6))
+          (index-keys (split-string
+                       (or index-key phrase)
+                       reftex-index-phrases-logical-or-regexp))
+          (macro-data (cdr (if (null char)
+                               (car reftex-index-phrases-macro-data)
+                             (assoc char reftex-index-phrases-macro-data))))
+          (macro-fmt (car macro-data))
+          (repeat (nth 1 macro-data))
+          (as-words reftex-index-phrases-search-whole-words)
+          (example (reftex-index-make-replace-string
+                    macro-fmt (downcase phrase) (car index-keys) repeat))
+          (re (reftex-index-make-phrase-regexp phrase as-words t))
+          (re1 (reftex-index-phrases-find-dup-re phrase))
+          (re2 (reftex-index-phrases-find-dup-re phrase 'sub))
+          superphrases
+          (nmatches 0)
+          (ntimes1 0)
+          (ntimes2 0)
+          (case-fold-search reftex-index-phrases-case-fold-search)
+          file files buf)
+      (setq files reftex-index-phrases-files)
+      (save-excursion
+       (save-restriction
+         (widen)
+         (goto-char (point-min))
+         (while (re-search-forward re1 nil t)
+           (incf ntimes1))
+         (goto-char (point-min))
+         (while (re-search-forward re2 nil t)
+           (push (cons (count-lines 1 (point)) (match-string 1)) superphrases)
+           (incf ntimes2))))
+      (save-excursion
+       (while (setq file (pop files))
+         (setq buf (reftex-get-file-buffer-force file))
+         (when buf
+           (set-buffer buf)
+           (save-excursion
+             (save-restriction
+               (widen)
+               (goto-char (point-min))
+               (let ((case-fold-search reftex-index-phrases-case-fold-search))
+                 (while (re-search-forward re nil t)
+                   (or (reftex-in-comment)
+                       (incf nmatches)))))))))
+      (with-output-to-temp-buffer "*Help*"
+       (princ (format "       Phrase:  %s\n" phrase))
+       (princ (format "    Macro key:  %s\n" char))
+       (princ (format " Macro format:  %s\n" macro-fmt))
+       (princ (format "       Repeat:  %s\n" repeat))
+       (cond
+        (index-key
+         (let ((iks index-keys) (cnt 0) ik)
+           (while (setq ik (pop iks))
+             (princ (format "Index entry %d:  %s\n" (incf cnt) ik)))))
+        (repeat
+         (princ (format "  Index entry:  %s\n" phrase)))
+        (t
+         (princ (format "    Index key:  <<Given by the match>>\n"))))
+       (princ (format "      Example:  %s\n" example))
+       (terpri)
+       (princ (format "Total matches:  %s in %s\n"
+                      (reftex-number nmatches "match" "es")
+                      (reftex-number (length reftex-index-phrases-files)
+                                     "LaTeX file")))
+       (princ (format "   Uniqueness:  Phrase occurs %s in phrase buffer\n"
+                      (reftex-number ntimes1 "time")))
+       (if (> ntimes2 1)
+           (progn
+             (princ (format " Superphrases:  Phrase matches the following %s in the phrase buffer:\n"
+                            (reftex-number ntimes2 "line")))
+             (mapcar (lambda(x) 
+                       (princ (format "                Line %4d:  %s\n" (car x) (cdr x))))
+                     (nreverse superphrases))))))))
+
+(defun reftex-index-phrases-set-macro-key ()
+  "Change the macro key for the current line.
+Prompts for a macro key and insert is at the beginning of the line.
+If you reply with SPACE, the macro keyn will be removed, so that the
+default macro will be used.  If you reply with `RET', just prints
+information about the currently selected macro."
+  (interactive)
+  (reftex-index-phrases-parse-header)
+  (save-excursion
+    (beginning-of-line)
+    (unless (or (looking-at reftex-index-phrases-phrase-regexp12)
+               (looking-at "\t"))
+      (error "This is not a phrase line"))
+    (let* ((nc (reftex-index-select-phrases-macro 0))
+          (macro-data (assoc nc reftex-index-phrases-macro-data))
+          macro-fmt repeat)
+      (cond (macro-data)
+           ((equal nc ?\ )
+            (setq nc ""
+                  macro-data (car reftex-index-phrases-macro-data)))
+           ((equal nc ?\C-m)
+            (setq nc (char-after (point)))
+            (if (equal nc ?\t)
+                (setq nc ""
+                      macro-data (car reftex-index-phrases-macro-data))
+              (setq macro-data (assoc nc reftex-index-phrases-macro-data))))
+           (t (error "No macro associated with %c" nc)))
+
+      (setq macro-fmt (nth 1 macro-data)
+           repeat (nth 2 macro-data))
+      (if macro-data
+         (progn
+           (if (looking-at "[^\t]") (delete-char 1))
+           (insert nc)
+           (message "Line will use %s %s repeat" macro-fmt
+                    (if repeat "with" "without")))
+       (error "Abort")))))
+
+(defun reftex-index-sort-phrases (&optional chars-first)
+  "Sort the phrases lines in the buffer alphabetically.
+Normally, this looks only at the phrases.  With a prefix arg CHARS-FIRST,
+it first compares the macro identifying chars and then the phrases."
+  (interactive "P")
+  ;; Remember the current line, so that we can return
+  (let ((line (buffer-substring (progn (beginning-of-line) (point))
+                               (progn (end-of-line) (point))))
+       beg end)
+    (goto-char (point-min))
+    ;; Find first and last phrase line in buffer
+    (setq beg 
+         (and (re-search-forward reftex-index-phrases-phrase-regexp12 nil t)
+              (match-beginning 0)))
+    (goto-char (point-max))
+    (setq end (re-search-backward reftex-index-phrases-phrase-regexp12 nil t))
+    (if end (setq end (progn (goto-char end) (end-of-line) (point))))
+    ;; Take the lines, sort them and re-insert.
+    (if (and beg end)
+       (progn
+         (message "Sorting lines...")
+         (let* ((lines (split-string (buffer-substring beg end) "\n"))
+                (lines1 (sort lines 'reftex-compare-phrase-lines)))
+           (message "Sorting lines...done")
+           (let ((inhibit-quit t))  ;; make sure we do not loose lines
+             (delete-region beg end)
+             (insert (mapconcat 'identity lines1 "\n"))))
+         (goto-char (point-max))
+         (re-search-backward (concat "^" (regexp-quote line) "$") nil t))
+      (error "Cannot find phrases lines to sort"))))
+
+(defvar chars-first)
+(defun reftex-compare-phrase-lines (a b)
+  "The comparison function used for sorting."
+  (let (ca cb pa pb c-p p-p)
+    (if (string-match reftex-index-phrases-phrase-regexp12 a)
+       (progn
+         ;; Extract macro char and phrase-or-key for a
+         (setq ca (match-string 1 a) 
+               pa (downcase 
+                   (or (and reftex-index-phrases-sort-prefers-entry
+                            (match-string 6 a))
+                       (match-string 3 a))))
+         (if (string-match reftex-index-phrases-phrase-regexp12 b)
+             (progn
+               ;; Extract macro char and phrase-or-key for b
+               (setq cb (match-string 1 b) 
+                     pb (downcase
+                         (or (and reftex-index-phrases-sort-prefers-entry
+                                  (match-string 6 b))
+                             (match-string 3 b))))
+               (setq c-p (string< ca cb)
+                     p-p (string< pa pb))
+               ;; Do the right comparison, based on the value of `chars-first'
+               ;; `chars-first' is bound locally in the calling function               
+               (if chars-first
+                   (if (string= ca cb) p-p c-p)
+                 (if (string= pa pb) c-p p-p)))))
+      ;; If line a does not match, the answer we return determines
+      ;; if non-matching lines are collected at the beginning.
+      ;; When we return t here, non-matching lines form
+      ;; block separators for searches.
+      (not reftex-index-phrases-sort-in-blocks))))
+
+(defvar reftex-index-phrases-menu)
+(defun reftex-index-make-phrase-regexp (phrase &optional 
+                                              as-words allow-newline)
+  "Return a regexp matching PHRASE, even if distributed over lines.
+With optional arg AS-WORDS, require word boundary at beginning and end.
+With optional arg ALLOW-NEWLINE, allow single newline between words."
+  (let* ((words (split-string phrase))
+        (space-re (if allow-newline
+                      "\\([ \t]*\\(\n[ \t]*\\)?\\|[ \t]\\)"
+                    "\\([ \t]+\\)")))
+    (concat (if (and as-words (string-match "\\`\\w" (car words)))
+               "\\<" "")
+           (mapconcat (lambda (w) (regexp-quote (downcase w)))
+                      words space-re)
+           (if (and as-words 
+                    (string-match "\\w\\'" (nth (1- (length words)) words)))
+               "\\>" ""))))
+
+(defun reftex-index-simplify-phrase (phrase)
+  "Make phrase single spaces and single line."
+  (mapconcat 'identity (split-string phrase) " "))
+
+(defun reftex-index-phrases-find-dup-re (phrase &optional sub)
+  "Return a regexp which matches variations of PHRASE (with additional space).
+When SUB ins non-nil, the regexp will also match when PHRASE is a subphrase
+of another phrase.  The regexp works lonly in the phrase buffer."
+  (concat (if sub "^\\S-?\t\\([^\t\n]*" "^\\S-?\t")
+         (mapconcat 'regexp-quote (split-string phrase) " +")
+         (if sub "[^\t\n]*\\)\\([\t\n]\\|$\\)" " *\\([\t\n]\\|$\\)")))
+
+(defun reftex-index-make-replace-string (macro-fmt match index-key
+                                                  &optional repeat mathp)
+  "Return the string which can be used as replacement.
+Treats the logical `and' for index phrases."
+  (let ((index-keys (split-string (or index-key match)
+                                 reftex-index-phrases-logical-and-regexp)))
+    (concat
+     (mapconcat (lambda (x) 
+                 (format macro-fmt 
+                         (format (if mathp reftex-index-math-format "%s") x)))
+               index-keys "")
+   (if repeat (reftex-index-simplify-phrase match) ""))))
+
+(defun reftex-query-index-phrase-globally (files &rest args)
+  "Call `reftex-query-index-phrase' for all files in FILES."
+  (let ((win-conf (current-window-configuration))
+       (file))
+    (unless files (error "No files"))
+    (unwind-protect
+       (progn
+         (switch-to-buffer-other-window (reftex-get-file-buffer-force 
+                                         (car files)))
+         (catch 'no-more-files
+           (while (setq file (pop files))
+             (switch-to-buffer (reftex-get-file-buffer-force file))
+             (save-excursion
+               (save-restriction
+                 (unless (stringp reftex-index-phrases-restrict-file)
+                   (widen))
+                 (goto-char (point-min))
+                 (apply 'reftex-query-index-phrase args))))))
+      (reftex-unhighlight 0)
+      (set-window-configuration win-conf))))
+
+(defconst reftex-index-phrases-help
+  "     Keys for query-index search
+     ===========================
+y       Replace this match
+n       Skip this match
+!       Replace this and all further matches in this file
+q / Q   Skip match, start next file / start next phrase
+o       Use a different indexing macro for this match
+1 - 9   Select one of the multiple phrases
+e       Edit the replacement text
+C-r     Recursive edit.
+s / S   Save this buffer  /  Save all document buffers
+C-g     Abort"
+  "The help string for indexing phrases.")
+
+(defvar replace-count)
+(defun reftex-query-index-phrase (phrase macro-fmt &optional
+                                        index-key repeat as-words)
+  "Search through buffer for PHRASE, and offer to replace it with an indexed
+version.  The index version is derived by applying `format' with MACRO-FMT
+to INDEX-KEY or PHRASE.  When REPEAT is non-nil, the PHRASE is inserted
+again after the macro.
+AS-WORDS means, the search for PHRASE should require word boundaries at
+both ends."
+  (let* ((re (reftex-index-make-phrase-regexp phrase as-words 'allow-newline))
+        (case-fold-search reftex-index-phrases-case-fold-search)
+        (index-keys (split-string 
+                     (or index-key phrase)
+                     reftex-index-phrases-logical-or-regexp))
+        (nkeys (length index-keys))
+        (ckey (nth 0 index-keys))
+        (all-yes nil) 
+        match rpl char beg end mathp)
+    (unwind-protect
+       (while (re-search-forward re nil t)
+         (catch 'next-match
+           (setq match (match-string 0))
+           (setq mathp
+                 (save-match-data
+                   (condition-case nil (texmathp) (error nil))))
+           (setq beg (car (match-data))
+                 end (nth 1 (match-data)))
+           (if (and reftex-index-phrases-skip-indexed-matches
+                    (save-match-data
+                      (reftex-index-phrase-match-is-indexed beg
+                                                            end)))
+               (throw 'next-match nil))
+           (reftex-highlight 0 (match-beginning 0) (match-end 0))
+           (setq rpl 
+                 (save-match-data
+                   (reftex-index-make-replace-string
+                    macro-fmt (match-string 0) ckey repeat mathp)))
+           (while 
+               (not
+                (catch 'loop
+                  (message "REPLACE: %s?   (yn!qoe%s?)"
+                           rpl
+                           (if (> nkeys 1) 
+                               (concat "1-" (int-to-string nkeys))
+                             ""))
+                  (setq char (if all-yes ?y (read-char-exclusive)))
+                  (cond ((member char '(?y ?Y ?\ ))
+                         ;; Yes!
+                         (replace-match rpl t t)
+                         (incf replace-count)
+                         ;; See if we should insert newlines to shorten lines
+                         (and reftex-index-phrases-wrap-long-lines
+                              (reftex-index-phrases-fixup-line beg end))
+                         (throw 'loop t))
+                        ((member char '(?n ?N ?\C-h ?\C-?));; FIXME: DEL
+                         ;; No
+                         (throw 'loop t))
+                        ((equal char ?!)
+                         ;; Yes for all in this buffer
+                         (setq all-yes t))
+                        ((equal char ?q)
+                         ;; Stop this one in this file
+                         (goto-char (point-max))
+                         (throw 'loop t))
+                        ((equal char ?Q)
+                         ;; Stop this one
+                         (throw 'no-more-files t))
+                        ((equal char ?s)
+                         (save-buffer))
+                        ((equal char ?S)
+                         (reftex-save-all-document-buffers))
+                        ((equal char ?\C-g)
+                         (keyboard-quit))
+                        ((member char '(?o ?O))
+                         ;; Select a differnt macro
+                         (let* ((nc (reftex-index-select-phrases-macro 2))
+                                (macro-data 
+                                 (cdr (assoc nc reftex-index-phrases-macro-data)))
+                                (macro-fmt (car macro-data))
+                                (repeat (nth 1 macro-data)))
+                           (if macro-data
+                               (setq rpl (save-match-data
+                                           (reftex-index-make-replace-string
+                                            macro-fmt match
+                                            ckey repeat mathp)))
+                             (ding))))
+                        ((equal char ?\?)
+                         ;; Help
+                         (with-output-to-temp-buffer "*Help*"
+                           (princ reftex-index-phrases-help)))
+                        ((equal char ?\C-r)
+                         ;; Recursive edit
+                         (save-match-data
+                           (save-excursion
+                             (message 
+                              (substitute-command-keys
+                               "Recursive edit.  Resume with \\[exit-recursive-edit]"))
+                             (recursive-edit))))
+                        ((equal char ?e)
+                         (setq rpl (read-string "Edit: " rpl)))
+                        ((equal char ?0)
+                         (setq ckey (or index-key phrase)
+                               rpl (save-match-data
+                                     (reftex-index-make-replace-string
+                                      macro-fmt match ckey repeat mathp))))
+                        ((and (> char ?0)
+                              (<= char (+ ?0 nkeys)))
+                         (setq ckey (nth (1- (- char ?0)) index-keys)
+                               rpl (save-match-data
+                                     (reftex-index-make-replace-string
+                                      macro-fmt match ckey repeat mathp))))
+                        (t (ding)))
+                  nil)))))
+      (message "")
+      (setq all-yes nil)
+      (reftex-unhighlight 0))))
+
+(defun reftex-index-phrase-match-is-indexed (beg end)
+  (save-excursion
+    (goto-char end)
+    (let* ((this-macro (car (reftex-what-macro 1)))
+          (before-char (char-before beg))
+          (after-char (char-after end))
+          (before-macro
+           (and (> beg 2)
+                (goto-char (1- beg))
+                (memq (char-after (point)) '(?\] ?\}))
+                (car (reftex-what-macro 1))))
+          (after-macro
+           (and (goto-char end)
+                (looking-at "\\(\\\\[a-zA-Z]+\\*?\\)[[{]")
+                (match-string 1))))
+      (or (and this-macro
+              (member before-char '(?\{ ?\[))
+              (member after-char '(?\} ?\]))
+              (member this-macro reftex-macros-with-index))
+         (and before-macro
+              (member before-macro reftex-macros-with-index))
+         (and after-macro
+              (member after-macro reftex-macros-with-index))))))
+
+    
+(defun reftex-index-phrases-fixup-line (beg end)
+  "Insert newlines before BEG and/or after END to shorten line."
+  (let (bol eol space1 space2)
+    (save-excursion
+      ;; Find line boundaries and possible line breaks near BEG and END
+      (beginning-of-line)
+      (setq bol (point))
+      (end-of-line)
+      (setq eol (point))
+      (goto-char beg)
+      (skip-chars-backward "^ \n")
+      (if (and (equal (preceding-char) ?\ )
+              (string-match "\\S-" (buffer-substring bol (point))))
+         (setq space1 (1- (point))))
+      (goto-char end)
+      (skip-chars-forward "^ \n")
+      (if (and (equal (following-char) ?\ )
+              (string-match "\\S-" (buffer-substring (point) eol)))
+         (setq space2 (point)))
+      ;; Now check what we have and insert the newlines
+      (if (<= (- eol bol) fill-column)
+         ;; Line is already short
+         nil
+       (cond
+        ((and (not space1) (not space2))) ; No spaces available
+        ((not space2)                  ; Do space1
+         (reftex-index-phrases-replace-space space1))
+        ((not space1)                  ; Do space2
+         (reftex-index-phrases-replace-space space2))
+        (t ; We have both spaces
+         (let ((l1 (- space1 bol))
+               (l2 (- space2 space1))
+               (l3 (- eol space2)))
+           (if (> l2 fill-column)
+               ;; The central part alone is more than one line
+               (progn
+                 (reftex-index-phrases-replace-space space1)
+                 (reftex-index-phrases-replace-space space2))
+             (if (> (+ l1 l2) fill-column)
+                 ;; Need to split beginning
+                 (reftex-index-phrases-replace-space space1))
+             (if (> (+ l2 l3) fill-column)
+                 ;; Need to split end
+                 (reftex-index-phrases-replace-space space2))))))))))
+
+(defun reftex-index-phrases-replace-space (pos)
+  "If there is a space at POS, replace it with a newline char.
+Does not do a save-excursion."
+  (when (equal (char-after pos) ?\ )
+    (goto-char pos)
+    (delete-char 1)
+    (insert "\n")))
+
+(defun reftex-index-select-phrases-macro (&optional delay)
+  "Offer a list of possible index macros and have the user select one."
+  (let* ((prompt (concat "Select macro: ["
+                        (mapconcat (lambda (x) (char-to-string (car x)))
+                                   reftex-index-phrases-macro-data "")
+                        "] "))
+        (help (concat "Select an indexing macro\n========================\n"
+                      (mapconcat (lambda (x)
+                                   (format " [%c]     %s"
+                                           (car x) (nth 1 x)))
+                                 reftex-index-phrases-macro-data "\n"))))
+    (reftex-select-with-char prompt help delay)))
+
+;; Keybindings and Menu for phrases buffer
+
+(loop for x in
+      '(("\C-c\C-c" . reftex-index-phrases-save-and-return)
+       ("\C-c\C-x" . reftex-index-this-phrase)
+       ("\C-c\C-f" . reftex-index-next-phrase)
+       ("\C-c\C-r" . reftex-index-region-phrases)
+       ("\C-c\C-a" . reftex-index-all-phrases)
+       ("\C-c\C-d" . reftex-index-remaining-phrases)
+       ("\C-c\C-s" . reftex-index-sort-phrases)
+       ("\C-c\C-n" . reftex-index-new-phrase)
+       ("\C-c\C-m" . reftex-index-phrases-set-macro-key)
+       ("\C-c\C-i" . reftex-index-phrases-info)
+       ("\C-c\C-t" . reftex-index-find-next-conflict-phrase)
+       ("\C-i"     . self-insert-command))
+      do (define-key reftex-index-phrases-map (car x) (cdr x)))
+
+(easy-menu-define 
+ reftex-index-phrases-menu reftex-index-phrases-map
+ "Menu for Phrases buffer"
+ '("Phrases"
+   ["New Phrase" reftex-index-new-phrase t]
+   ["Set Phrase Macro" reftex-index-phrases-set-macro-key t]
+   ["Recreate File Header" reftex-index-initialize-phrases-buffer t]
+   "--"
+   ("Sort Phrases"
+    ["Sort" reftex-index-sort-phrases t]
+    "--"
+    "Sort Options"
+    ["by Search Phrase" (setq reftex-index-phrases-sort-prefers-entry nil)
+     :style radio :selected (not reftex-index-phrases-sort-prefers-entry)]
+    ["by Index Entry" (setq reftex-index-phrases-sort-prefers-entry t)
+     :style radio :selected reftex-index-phrases-sort-prefers-entry]
+    ["in Blocks" (setq reftex-index-phrases-sort-in-blocks
+                         (not reftex-index-phrases-sort-in-blocks))
+     :style toggle :selected reftex-index-phrases-sort-in-blocks])
+   ["Describe Phrase" reftex-index-phrases-info t]
+   ["Next Phrase Conflict" reftex-index-find-next-conflict-phrase t]
+   "--"
+   ("Find and Index in Document"
+    ["Current Phrase" reftex-index-this-phrase t]
+    ["Next Phrase" reftex-index-next-phrase t]
+    ["Current and Following" reftex-index-remaining-phrases t]
+    ["Region Phrases" reftex-index-region-phrases t]
+    ["All Phrases" reftex-index-all-phrases t]
+    "--"
+    "Options"
+    ["Match Whole Words" (setq reftex-index-phrases-search-whole-words
+                         (not reftex-index-phrases-search-whole-words))
+     :style toggle :selected reftex-index-phrases-search-whole-words]
+    ["Case Sensitive Search" (setq reftex-index-phrases-case-fold-search
+                                 (not  reftex-index-phrases-case-fold-search))
+     :style toggle :selected (not
+                             reftex-index-phrases-case-fold-search)]
+    ["Wrap Long Lines" (setq reftex-index-phrases-wrap-long-lines
+                            (not reftex-index-phrases-wrap-long-lines))
+    :style toggle :selected reftex-index-phrases-wrap-long-lines]
+    ["Skip Indexed Matches" (setq reftex-index-phrases-skip-indexed-matches
+                                 (not reftex-index-phrases-skip-indexed-matches))
+     :style toggle :selected reftex-index-phrases-skip-indexed-matches])
+   "--"
+   ["Save and Return" reftex-index-phrases-save-and-return t]))
+
+
 ;;; reftex-index.el ends here
index a6570bcc6cb57251b58cbef2c299c5d6f1d36bfb..f38a02425aa26ced4cd523a2798bce128a6e2448 100644 (file)
@@ -1,8 +1,9 @@
 ;;; reftex-parse.el - Parser Functions for RefTeX
-;;; Version: 4.6
+;;; Version: 4.9
 ;;;
 ;;; See main file reftex.el for licensing information
 
+(eval-when-compile (require 'cl))
 (provide 'reftex-parse)
 (require 'reftex)
 
@@ -216,16 +217,18 @@ of master file."
 
                 ;; Insert in List
                 (setq toc-entry (reftex-section-info file))
-                (setq level (nth 5 toc-entry))
-                (setq highest-level (min highest-level level))
-                (if (= level highest-level)
-                    (message
-                     "Scanning %s %s ..."
-                     (car (rassoc level reftex-section-levels-all))
-                     (nth 6 toc-entry)))
-
-                (push toc-entry docstruct)
-                (setq reftex-active-toc toc-entry))
+                (when toc-entry
+                  ;; It can happen that section info returns nil
+                  (setq level (nth 5 toc-entry))
+                  (setq highest-level (min highest-level level))
+                  (if (= level highest-level)
+                      (message
+                       "Scanning %s %s ..."
+                       (car (rassoc level reftex-section-levels-all))
+                       (nth 6 toc-entry)))
+
+                  (push toc-entry docstruct)
+                  (setq reftex-active-toc toc-entry)))
 
                ((match-end 7)
                 ;; It's an include or input
@@ -355,6 +358,9 @@ of master file."
   ;; Carefull: This function expects the match-data to be still in place!
   (let* ((marker (set-marker (make-marker) (1- (match-beginning 3))))
          (macro (reftex-match-string 3))
+        (prefix (save-match-data
+                  (if (string-match "begin{\\([^}]+\\)}" macro)
+                      (match-string 1 macro))))
         (level-exp (cdr (assoc macro reftex-section-levels-all)))
          (level (if (symbolp level-exp)
                    (save-match-data (funcall level-exp))
@@ -363,7 +369,9 @@ of master file."
         (unnumbered (or star (< level 0)))
         (level (abs level))
          (section-number (reftex-section-number level unnumbered))
-         (text1 (save-match-data (save-excursion (reftex-context-substring))))
+         (text1 (save-match-data 
+                 (save-excursion
+                   (reftex-context-substring prefix))))
          (literal (buffer-substring-no-properties
                    (1- (match-beginning 3))
                    (min (point-max) (+ (match-end 0) (length text1) 1))))
@@ -376,6 +384,7 @@ of master file."
            (make-string (* reftex-level-indent level) ?\ )
            (if (nth 1 reftex-label-menu-flags) ; section number flag
                (concat section-number " "))
+          (if prefix (concat (capitalize prefix) ": ") "")
            text))
     (list 'toc "toc" text file marker level section-number
           literal (marker-position marker))))
@@ -908,10 +917,20 @@ of master file."
        (forward-list 1))
     (error nil)))  
 
-(defun reftex-context-substring ()
+(defun reftex-context-substring (&optional to-end)
   ;; Return up to 150 chars from point
   ;; When point is just after a { or [, limit string to matching parenthesis
   (cond
+   (to-end
+    ;; Environment - find next \end
+    (buffer-substring-no-properties
+     (point)
+     (min (+ (point) 150)
+         (save-match-data
+           ;; FIXME: THis is not perfect
+           (if (re-search-forward "\\\\end{" nil t)
+               (match-beginning 0)
+             (point-max))))))
    ((or (= (preceding-char) ?\{)
         (= (preceding-char) ?\[))
     ;; Inside a list - get only the list.
index dc0ff9b1be32e96da37ed614c48f57ef8800126d..5c9e8450544cb51893f8b625d5426ff0dcb11b11 100644 (file)
@@ -1,8 +1,9 @@
 ;;; reftex-ref.el - Code to create labels and references with RefTeX
-;;; Version: 4.6
+;;; Version: 4.9
 ;;;
 ;;; See main file reftex.el for licensing information
 
+(eval-when-compile (require 'cl))
 (provide 'reftex-ref)
 (require 'reftex)
 ;;;
@@ -561,9 +562,12 @@ When called with 2 C-u prefix args, disable magic word recognition."
                (setq here-I-am here-I-am1)
                 (setq typekey (reftex-query-label-type)))
                ((eq key ?t)
-                ;; toggle table of contents display
+                ;; toggle table of contents display, or change depth
                (reftex-erase-buffer)
-                (setq toc (not toc)))
+               (if current-prefix-arg
+                   (setq reftex-toc-max-level (prefix-numeric-value
+                                               current-prefix-arg))
+                 (setq toc (not toc))))
                ((eq key ?F)
                 ;; toggle display of included file borders
                (reftex-erase-buffer)
index 703abe655d0a16774f52dffbb1b1b99cdaa60c7e..136186f31a02b233ffe85579bad8ffa5d7e8dcd5 100644 (file)
@@ -1,8 +1,9 @@
 ;;; reftex-sel.el - The selection modes for RefTeX
-;;; Version: 4.6
+;;; Version: 4.9
 ;;;
 ;;; See main file reftex.el for licensing information
 
+(eval-when-compile (require 'cl))
 (provide 'reftex-sel)
 (require 'reftex)
 ;;;
@@ -180,7 +181,8 @@ During a selection process, these are the local bindings.
 
        ((eq (car cell) 'toc)
         ;; a table of contents entry
-        (when toc
+        (when (and toc
+                  (<= (nth 5 cell) reftex-toc-max-level))
          (if (eq offset 'attention) (setq offset cell))
           (setq reftex-active-toc cell)
           (insert (concat toc-indent (nth 2 cell) "\n"))
index 9a12856cfe1e0bf64b5e5eb232a122cbde550bc8..ffbf05b329663ce9687c04f87c22ad06cf907b63 100644 (file)
@@ -1,8 +1,9 @@
 ;;; reftex-toc.el - RefTeX's table of contents mode
-;;; Version: 4.6
+;;; Version: 4.9
 ;;;
 ;;; See main file reftex.el for licensing information
 
+(eval-when-compile (require 'cl))
 (provide 'reftex-toc)
 (require 'reftex)
 ;;;
@@ -27,12 +28,16 @@ Here are all local bindings.
   (use-local-map reftex-toc-map)
   (set (make-local-variable 'revert-buffer-function) 'reftex-toc-revert)
   (set (make-local-variable 'reftex-toc-include-labels-indicator) "")
-  (set (make-local-variable 'reftex-toc-include-index-indicator) "")
+  (set (make-local-variable 'reftex-toc-max-level-indicator)
+       (if (= reftex-toc-max-level 100)
+          "ALL"
+        (int-to-string reftex-toc-max-level)))
   (setq mode-line-format
        (list "----  " 'mode-line-buffer-identification
              "  " 'global-mode-string "   (" mode-name ")"
              "  L<" 'reftex-toc-include-labels-indicator ">"
              "  I<" 'reftex-toc-include-index-indicator ">"
+             "  T<" 'reftex-toc-max-level-indicator ">"
              " -%-"))
   (setq truncate-lines t)
   (make-local-hook 'post-command-hook)
@@ -49,6 +54,7 @@ Here are all local bindings.
 (defvar reftex-last-window-height nil)
 (defvar reftex-toc-include-labels-indicator nil)
 (defvar reftex-toc-include-index-indicator nil)
+(defvar reftex-toc-max-level-indicator nil)
 
 (defvar reftex-toc-return-marker (make-marker)
   "Marker which makes it possible to return from toc to old position.")
@@ -63,6 +69,7 @@ RET        Goto the location and hide the *toc* window (also on mouse-2).
 C-c >      Display Index. With prefix arg, restrict index to current section.
 q / k      Hide/Kill *toc* buffer, return to position of reftex-toc command.
 l i c F    Toggle display of  [l]abels,  [i]ndex,  [c]ontext,  [F]ile borders.
+t          Change maximum toc depth (e.g. `3 t' hides levels greater than 3).
 f / g      Toggle follow mode on and off  / Refresh *toc* buffer.
 r / C-u r  Reparse the LaTeX document     / Reparse entire LaTeX document.
 .          In other window, show position from where `reftex-toc' was called.
@@ -281,6 +288,17 @@ Label context is only displayed when the labels are there as well."
   (interactive)
   (setq reftex-toc-include-context (not reftex-toc-include-context))
   (reftex-toc-revert))
+(defun reftex-toc-max-level (arg)
+  "Set the maximum level of toc lines in this buffer to value of prefix ARG.
+When no prefix is given, set the max level to a large number, so that all
+levels are shown.  For eaxample, to set the level to 3, type `3 m'."
+  (interactive "P")
+  (setq reftex-toc-max-level (if arg
+                                (prefix-numeric-value arg)
+                              100))
+  (setq reftex-toc-max-level-indicator
+       (if arg (int-to-string reftex-toc-max-level) "ALL"))
+  (reftex-toc-revert))
 (defun reftex-toc-view-line ()
   "View document location in other window."
   (interactive)
@@ -473,7 +491,7 @@ With prefix arg 1, restrict index to the section at point."
                                     (car 
                                      (rassq level 
                                             reftex-section-levels-all)))
-                                   "[[{]"))))
+                                   "[[{]?"))))
           ((or (not no-revisit)
                (reftex-get-buffer-visiting file))
            ;; Marker is lost.  Use the backup method.
@@ -535,6 +553,7 @@ With prefix arg 1, restrict index to the section at point."
        ("F"    . reftex-toc-toggle-file-boundary)
        ("i"    . reftex-toc-toggle-index)
        ("l"    . reftex-toc-toggle-labels)
+       ("t"    . reftex-toc-max-level)
        ("c"    . reftex-toc-toggle-context)
        ("%"    . reftex-toc-toggle-commented)
        ("x"    . reftex-toc-external)
index 40af81b9d8672bd3ee12b6f20553653cf7ace9fb..b7fa158a2fc3cd5f0e75bdf4e35f6d020667d16f 100644 (file)
@@ -1,8 +1,9 @@
 ;;; reftex-vars.el - Configuration variables for RefTeX
-;;; Version: 4.6
+;;; Version: 4.9
 ;;;
 ;;; See main file reftex.el for licensing information
 
+(eval-when-compile (require 'cl))
 (provide 'reftex-vars)
 
 ;; Define the two constants which are needed during compilation
@@ -151,18 +152,18 @@ The following conventions are valid for all alist entries:
 
 (defconst reftex-index-macros-builtin 
   '((default "Default \\index and \\glossary macros"
-      (("\\index{*}" "idx" ?i "" nil)
-       ("\\glossary{*}" "glo" ?g "" nil)))
+      (("\\index{*}" "idx" ?i "" nil t)
+       ("\\glossary{*}" "glo" ?g "" nil t)))
     (multind "The multind.sty package"
-       (("\\index{}{*}" 1 ?i "" nil)))
+       (("\\index{}{*}" 1 ?i "" nil t)))
     (index "The index.sty package"
-          (("\\index[]{*}" 1 ?i "" nil)
-           ("\\index*[]{*}" 1 ?I "" nil)))
+          (("\\index[]{*}" 1 ?i "" nil t)
+           ("\\index*[]{*}" 1 ?I "" nil nil)))
     (Index-Shortcut "index.sty with \\shortindexingon"
-       (("\\index[]{*}" 1 ?i "" nil)
-       ("\\index*[]{*}" 1 ?I "" nil)
-       ("^[]{*}" 1 ?^ "" texmathp)   
-       ("_[]{*}" 1 ?_ "" texmathp))))
+       (("\\index[]{*}" 1 ?i "" nil t)
+       ("\\index*[]{*}" 1 ?I "" nil nil)
+       ("^[]{*}" 1 ?^ "" texmathp t)   
+       ("_[]{*}" 1 ?_ "" texmathp nil))))
   "Builtin stuff for reftex-index-macros.
 Lower-case symbols correspond to a style file of the same name in the LaTeX
 distribution.  Mixed-case symbols are convenience aliases.")
@@ -186,6 +187,14 @@ distribution.  Mixed-case symbols are convenience aliases.")
   "A multifile table of contents browser."
   :group 'reftex)
 
+(defcustom reftex-toc-max-level 100
+  "*The maximum level of toc entries which will be included in the TOC.
+Section headings with a bigger level will be ignored.  In RefTeX, chapters
+are level 1, sections are level 2 etc.
+This variable can be changed from within the *toc* buffer with the `t' key."
+  :group 'reftex-table-of-contents-browser
+  :type 'integer)
+
 (defcustom reftex-toc-keep-other-windows t
   "*Non-nil means, split the selected window to display the *toc* buffer.
 This helps to keep the window configuration, but makes the *toc* small.
@@ -284,7 +293,7 @@ The value of the variable must be a list of items.  Each item is a list
 itself and has the following structure:
 
  (ENV-OR-MACRO TYPE-KEY LABEL-PREFIX REFERENCE-FORMAT CONTEXT-METHOD
-           (MAGIC-WORD ... ))
+           (MAGIC-WORD ... ) TOC-LEVEL)
 
 Each list entry describes either an environment carrying a counter for use
 with \\label and \\ref, or a LaTeX macro defining a label as (or inside)
@@ -385,6 +394,14 @@ MAGIC-WORDS
     strings are interpreted as regular expressions.  RefTeX will add
     a \"\\\\W\" to the beginning and other stuff to the end of the regexp.
 
+TOC-LEVEL
+    The integer level at which this environment should be added to the
+    table of contents.  See also `reftex-section-levels'.  A positive
+    value will number the entries mixed with the sectioning commands of
+    the same level.  A negative value will make unnumbered entries.
+    Useful only for theorem-like environments, will be ignored for macros.
+    When omitted or nil, no TOC entries will be made.
+
 If the type indicator characters of two or more entries are the same, RefTeX
 will use
  - the first non-nil format and prefix
@@ -425,7 +442,10 @@ list.  However, builtin defaults should normally be set with the variable
                      (const  :tag "Eqnarray-like" eqnarray-like)
                      (const  :tag "Alignat-like" alignat-like)
                      (symbol :tag "Function" my-func))
-          (repeat :tag "Magic words" :extra-offset 2 (string)))
+          (repeat :tag "Magic words" :extra-offset 2 (string))
+          (option (choice :tag "Make TOC entry     "
+                          (const :tag "No entry" nil)
+                          (integer :tag "Level" :value -3))))
      (choice
       :tag "Package"
       :value AMSTeX
@@ -982,7 +1002,7 @@ These correspond to the makeindex keywords LEVEL ENCAP ACTUAL QUOTE ESCAPE."
 (defcustom reftex-index-macros nil
   "Macros which define index entries.  The structure is
 
-(MACRO INDEX-TAG KEY PREFIX EXCLUDE)
+(MACRO INDEX-TAG KEY PREFIX EXCLUDE REPEAT)
 
 MACRO is the macro.  Arguments should be denoted by empty braces like
 \\index[]{*}.  Use square brackets to denote optional arguments.  The star
@@ -1004,6 +1024,11 @@ EXCLUDE can be a function.  If this function exists and returns a non-nil
 value, the index entry at point is ignored.  This was implemented to support
 the (deprecated) `^' and `_' shortcuts in the LaTeX2e `index' package.
 
+REPEAT, if non-nil, means the index macro does not typeset the entry in
+the text, so that the text has to be repeated outside the index macro.
+Needed for `reftex-index-selection-or-word' and for indexing from the
+phrase buffer.
+
 The final entry may also be a symbol if this entry has a association
 in the variable `reftex-index-macros-builtin' to specify the main
 indexing package you are using.  Legal values are currently
@@ -1021,13 +1046,14 @@ package here."
          (repeat 
           :inline t
           (list :value ("" "idx" ?a "" nil)
-                (string :tag "Macro with args")
-                (choice :tag "Index Tag      "
+                (string  :tag "Macro with args")
+                (choice  :tag "Index Tag      "
                         (string)
                         (integer :tag "Macro arg Nr" :value 1))
                 (character :tag "Access Key     ")
-                (string :tag "Key Prefix     ")
-                (symbol :tag "Exclusion hook ")))
+                (string  :tag "Key Prefix     ")
+                (symbol  :tag "Exclusion hook ")
+                 (boolean :tag "Repeat Outside ")))
          (option
           :tag "Package:"
           (choice :tag "Package"
@@ -1039,25 +1065,21 @@ package here."
                              (nth 0 x)))
                      reftex-index-macros-builtin)))))
 
-(defcustom reftex-index-default-macro '(?i "idx" t)
+(defcustom reftex-index-default-macro '(?i "idx")
   "The default index macro for \\[reftex-index-selection-or-word].
-This is a list with (MACRO-KEY DEFAULT-TAG REPEAT-WORD).
+This is a list with (MACRO-KEY DEFAULT-TAG).
 
 MACRO-KEY:   Character identifying an index macro - see `reftex-index-macros'.
 DEFAULT-TAG: This is the tag to be used if the macro requires a TAG argument.  
              When this is nil and a TAG is needed, RefTeX will ask for it.
              When this is the empty string and the TAG argument of the index
-             macro is optional, the TAG argument will be omitted.
-REPEAT-WORD: Non-nil means, the index macro does not typeset the entry in
-             the text, so that the text has to be repeated outside the index
-             macro." 
+             macro is optional, the TAG argument will be omitted."
   :group 'reftex-index-support
   :type '(list
          (character :tag "Character identifying default macro")
          (choice    :tag "Default index tag                  "
                  (const nil)
-                 (string))
-         (boolean   :tag "Word needs to be repeated          ")))
+                 (string))))
 
 (defcustom reftex-index-default-tag "idx"
   "Default index tag.
@@ -1085,6 +1107,80 @@ Requires the `texmathp.el' library which is part of AUCTeX."
   :group 'reftex-index-support
   :type 'string)
 
+(defcustom reftex-index-phrases-logical-and-regexp " *&& *"
+  "Regexp matching the `and' operator for index arguments in phrases file.
+When several index arguments in a phrase line are separated by this
+operator, each part will generate an index macro.  So each match of
+the search phrase will produce *several* different index entries.
+
+Note: make sure this does no match things which are not separators.
+This logical `and' has higher priority than the logical `or' specified in
+`reftex-index-phrases-logical-or-regexp'."
+  :group 'reftex-index-support
+  :type 'regexp)
+
+(defcustom reftex-index-phrases-logical-or-regexp " *|| *"
+  "Regexp matching the `or' operator for index arguments in phrases file.
+When several index arguments in a phrase line are separated by this
+operator, the user will be asked to select one of them at each match
+of the search phrase.  The first index arg will be the default - a
+number key 1-9 must be pressed to switch to another.
+
+Note: make sure this does no match things which are not separators.
+The logical `and' specified in `reftex-index-phrases-logical-or-regexp'
+has higher priority than this logical `or'."
+  :group 'reftex-index-support
+  :type 'regexp)
+
+(defcustom reftex-index-phrases-search-whole-words t
+  "*Non-nil means phrases search will look for whole words, not subwords.
+This works by requiring word boundaries at the beginning and end of
+the search string.  When the search phrase already has a non-word-char
+at one of these points, no word boundary is required there."
+  :group 'reftex-index-support
+  :type 'boolean)
+
+(defcustom reftex-index-phrases-case-fold-search t
+  "*Non-nil means, searching for index phrases will ignore case."
+  :group 'reftex-index-support
+  :type 'boolean)
+
+(defcustom reftex-index-phrases-skip-indexed-matches nil
+  "*Non-nil means, skip matches which appear to be indexed already.
+When doing global indexing from the phrases buffer, searches for some
+phrases may match at places where that phrase was already indexed.  In
+particular when indexing an already processed document again, this
+will even be the norm.  When this variable is non-nil, RefTeX checks if
+the match is an index macro argument, or if an index macro is directly
+before or after the phrase.  If that is the case, that match will
+be ignored."
+  :group 'reftex-index-support
+  :type 'boolean)
+
+(defcustom reftex-index-phrases-wrap-long-lines nil
+  "*Non-nil means, when indexing from the phrases buffer, wrap lines.
+Inserting indexing commands in a line makes the line longer - often
+so long that it does not fit onto the screen.  When this variable is
+non-nil, newlines will be added as necessary before and/or after the
+indexing command to keep lines short.  However, the matched text
+phrase and its index command will always end up on a single line.")
+
+(defcustom reftex-index-phrases-sort-prefers-entry nil
+  "*Non-nil means when sorting phrase lines, the explicit index entry is used.
+Phrase lines in the phrases buffer contain a search phrase, and
+sorting is normally based on these.  Some phrase lines also have
+an explicit index argument specified.  When this variable is non-nil,
+the index argument will be used for sorting."
+  :group 'reftex-index-support
+  :type 'boolean)
+
+(defcustom reftex-index-phrases-sort-in-blocks t
+  "*Non-nil means, empty and comment lines separate phrase buffer into blocks.
+Sorting will then preserve blocks, so that lines are re-arranged only
+within blocks."
+  :group 'reftex-index-support
+  :type 'boolean)
+
 (defcustom reftex-index-section-letters "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
   "The letters which denote sections in the index.
 Usually these are all capital letters.  Don't use any downcase letters.
index 65442bb5931e83d11de679af176b7a5cce900de6..7f56098b7ca4817ba488f4be492034e4c0a21a65 100644 (file)
@@ -1,8 +1,9 @@
 ;;; reftex-vcr.el - Viewing cross references and citations with RefTeX
-;;; Version: 4.6
+;;; Version: 4.9
 ;;;
 ;;; See main file reftex.el for licensing information
 
+(eval-when-compile (require 'cl))
 (provide 'reftex-vcr)
 (require 'reftex)
 ;;;
index 07c1184ba54ae876695c2b12beb800ec0e79c21e..481f4cdbe8c9f8f758f3173be222c34766da0e16 100644 (file)
@@ -2,7 +2,7 @@
 ;; Copyright (c) 1997, 1998, 1999 Free Software Foundation, Inc.
 
 ;; Author:     Carsten Dominik <dominik@strw.LeidenUniv.nl>
-;; Version:    4.6
+;; Version:    4.9
 ;; Keywords:   tex
 
 ;; This file is not part of GNU Emacs.
@@ -32,6 +32,7 @@
 ;; - Labels are created semi-automatically.
 ;; - Definition context of labels is provided when creating a reference.
 ;; - Citations are simplified with efficient database lookup.
+;; - Text phrases can be collected in a file, for later global indexing.
 ;; - The index preview buffer helps to check and edit index entries.
 ;;
 ;;
 ;;
 ;;---------------------------------------------------------------------------
 ;;
+;; 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
+;; usually requires looking up different parts of the document and
+;; searching through BibTeX database files.  RefTeX automates these
+;; 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
+;; search path, i.e. a list of directories to check.  Normally this list
+;; is stored in the environment variables `TEXINPUTS' and `BIBINPUTS'
+;; 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
 ;; ====================
 ;; 
 ;;      Typing `C-c [' (`reftex-citation') will let you specify a regular
 ;;      expression to search in current BibTeX database files (as
 ;;      specified in the `\bibliography' command) and pull out a list of
-;;      matches for you to choose from.  The list is *formatted* and
+;;      matches for you to choose from.  The list is _formatted_ and
 ;;      sorted.  The selected article is referenced as `\cite{KEY}' (see
 ;;      the variable `reftex-cite-format' if you want to insert different
 ;;      macros).
 ;;      are supported.
 ;; 
 ;;         * Creating Index Entries
-;;           Type `C-c /' (`reftex-index-selection-or-word') to index the
-;;           current selection or the word at the cursor with the default
-;;           macro (see the variable `reftex-index-default-macro').
-;;           Type `C-c <' (`reftex-index') to insert a general index macro.
-;;           RefTeX will offer a list of available macros and provide
-;;           completion for the index tag (used to identify one of
-;;           multiple indices) and for the entry itself (useful with
-;;           subentries).
+;;           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.
 ;; 
-;;         * Displaying the Index
+;;         * 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.  The index can be restricted to those
-;;           entries defined in a single document section or in a user
-;;           defined region.
+;;           and edit all entries.
 ;; 
 ;;   5. Viewing Cross-References
 ;;      When point is on the KEY argument of a cross-referencing macro
 ;;      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 different special buffers, press `?'.  Read the manual if you
-;;      get stuck.  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.
+;;      get stuck, of if you are curious what else might be available.
+;;      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.
 ;; 
 ;;---------------------------------------------------------------------------
 ;;
 ;;
 ;;    Fran Burstall, Alastair Burt, Soren Dayton, Stephen Eglen,
 ;;    Karl Eichwalder, Peter Galbraith, Dieter Kraft, Kai Grossjohann,
-;;    Adrian Lanz, Rory Molinari, Stefan Monnier, Laurent Mugnier,
-;;    Sudeep Kumar Palat, Daniel Polani, Robin Socha, Richard Stanton,
-;;    Allan Strand, Jan Vroonhof, Christoph Wedler, Alan Williams.
+;;    Frank Harrell, Adrian Lanz, Rory Molinari, Stefan Monnier,
+;;    Laurent Mugnier, Sudeep Kumar Palat, Daniel Polani, Robin Socha,
+;;    Richard Stanton, Allan Strand, Jan Vroonhof, Christoph Wedler,
+;;    Alan Williams.
 ;;
 ;; Finally thanks to Uwe Bolick who first got me (some years ago) into
 ;; supporting LaTeX labels and references with an editor (which was
 ;;; Define the formal stuff for a minor mode named RefTeX.
 ;;;
 
-(defconst reftex-version "RefTeX version 4.6"
+(defconst reftex-version "RefTeX version 4.9"
   "Version string for RefTeX.")
 
 (defvar reftex-mode nil
@@ -828,7 +869,7 @@ This enforces rescanning the buffer on next use."
         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 nindex tag key)
+       macro verify repeat nindex tag key toc-level toc-levels)
 
     (setq reftex-words-to-typekey-alist nil
           reftex-typekey-list nil
@@ -856,7 +897,8 @@ This enforces rescanning the buffer on next use."
               prefix (nth 1 entry)
               fmt (nth 2 entry)
               context (nth 3 entry)
-              wordlist (nth 4 entry))
+              wordlist (nth 4 entry)
+             toc-level (nth 5 entry))
         (if (stringp wordlist)
             ;; This is before version 2.04 - convert to new format
             (setq wordlist (nthcdr 4 entry)))
@@ -901,7 +943,11 @@ This enforces rescanning the buffer on next use."
                 ((string= env-or-mac ""))
                 ((string= env-or-mac "section"))
                 (t
-                 (add-to-list 'reftex-label-env-list env-or-mac)))))
+                 (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 
@@ -996,15 +1042,24 @@ This enforces rescanning the buffer on next use."
            key (nth 2 entry)
            prefix (or (nth 3 entry) "")
            verify (nth 4 entry)
-           all-index (cdr all-index)) 
+           ;; 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
-         (push (list macro tag prefix verify nargs nindex opt-args)
+         ;;           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))
@@ -1030,7 +1085,8 @@ This enforces rescanning the buffer on next use."
 
     ;; Make the full list of section levels
     (setq reftex-section-levels-all
-         (append (get reftex-docstruct-symbol 'reftex-section-levels)
+         (append toc-levels
+                 (get reftex-docstruct-symbol 'reftex-section-levels)
                  reftex-section-levels))
 
     ;; Calculate the regular expressions
@@ -1040,7 +1096,7 @@ This enforces rescanning the buffer on next use."
           (section-re
            (concat wbol "\\\\\\("
                    (mapconcat 'car reftex-section-levels-all "\\|")
-                   "\\)\\*?\\(\\[[^]]*\\]\\)?{"))
+                   "\\)\\*?\\(\\[[^]]*\\]\\)?{?"))
           (appendix-re (concat wbol "\\(\\\\appendix\\)"))
           (macro-re
            (if macros-with-labels
@@ -1581,10 +1637,14 @@ When DIE is non-nil, throw an error if file not found."
  "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-globally "reftex-index"
- "Copy index entry at point to other occurrences of this word." 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")
@@ -1638,6 +1698,7 @@ When DIE is non-nil, throw an error if file not found."
 (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")
 
@@ -1702,6 +1763,11 @@ When DIE is non-nil, throw an error if file not found."
      (progn (skip-chars-backward class) (point))
      (progn (skip-chars-forward  class) (point)))))
 
+(defun reftex-number (n unit &optional ending)
+  (if (and (integerp n) (stringp unit))
+      (format "%d %s%s" n unit (if (= n 1) "" (or ending "s")))
+    ""))
+
 (defun reftex-all-assq (key list)
   ;; Return a list of all associations of KEY in LIST.  Comparison with eq.
   (let (rtn)
@@ -2227,14 +2293,16 @@ 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-view-crossref))
+      '(("\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))
       do (define-key reftex-mode-map (car x) (cdr x)))
 
 ;; Bind `reftex-mouse-view-crossref' only when the key is still free
@@ -2279,11 +2347,17 @@ IGNORE-WORDS List of words which should be removed from the string."
    ["\\label"                 reftex-label t]
    ["\\ref"                   reftex-reference t]
    ["\\cite"                  reftex-citation t]
-   ["\\index"                 reftex-index t]
-   ["\\index{THIS}"           reftex-index-selection-or-word t]
-   ["View Crossref"           reftex-view-crossref t]
+   ("\\index"
+    ["\\index"                    reftex-index t]
+    ["\\index{THIS}"              reftex-index-selection-or-word t]
+    "--"
+    ["Add THIS to Index Phrases"  reftex-index-phrase-selection-or-word t]
+    ["Visit Phrase Buffer"        reftex-index-visit-phrases-buffer t]
+    ["Apply Phrases to Region"    reftex-index-phrases-apply-to-region t]
+    "--"
+    ["Display the Index"          reftex-display-index t])
    "--"
-   ["Index Buffer"            reftex-display-index t]
+   ["View Crossref"           reftex-view-crossref t]
    "--"
    ("Parse Document"
     ["One File"               reftex-parse-one reftex-enable-partial-scans]
@@ -2302,8 +2376,6 @@ IGNORE-WORDS List of words which should be removed from the string."
     ["Change Label and Refs"  reftex-change-label t]
     ["Renumber Simple Labels" reftex-renumber-simple-labels t]
     "--"
-    ["Index Globally"         reftex-index-globally t]
-    "--"
     ["Create TAGS File"       reftex-create-tags-file t]
     "--"
     ["Save Document"          reftex-save-all-document-buffers t])
@@ -2408,11 +2480,12 @@ IGNORE-WORDS List of words which should be removed from the string."
   (require 'finder)
   (finder-commentary "reftex.el"))
 
-(defun reftex-info ()
-  "Read documentation for RefTeX in the info system."
+(defun reftex-info (&optional node)
+  "Read documentation for RefTeX in the info system.
+With optional NODE, go directly to that node."
   (interactive)
   (require 'info)
-  (Info-goto-node "(reftex)"))
+  (Info-goto-node (format "(reftex)%s" (or node ""))))
 
 ;;; Install the kill-buffer and kill-emacs hooks ------------------------------
 
@@ -2431,3 +2504,4 @@ IGNORE-WORDS List of words which should be removed from the string."
 ;;;============================================================================
 
 ;;; reftex.el ends here
+