Source

reftex / reftex-dcr.el

Diff from to

File reftex-dcr.el

 ;;; reftex-dcr.el --- viewing cross references and citations with RefTeX
-;; Copyright (c) 1997, 1998, 1999, 2000 Free Software Foundation, Inc.
+;; Copyright (c) 1997, 1998, 1999, 2000, 2003 Free Software Foundation, Inc.
 
 ;; Author: Carsten Dominik <dominik@science.uva.nl>
-;; Version: 4.18
+;; Version: 4.21
 ;;
 
 ;; This file is part of GNU Emacs.
   ;; See where we are.
   (let* ((macro (car (reftex-what-macro-safe 1)))
          (key (reftex-this-word "^{}%\n\r, \t"))
-	 dw)
+         dw)
 
     (if (or (null macro) (reftex-in-comment))
-	(error "Not on a crossref macro argument"))
+        (error "Not on a crossref macro argument"))
 
     (setq reftex-call-back-to-this-buffer (current-buffer))
 
       (setq dw (reftex-view-cr-ref arg key auto-how)))
      (auto-how nil)  ;; No further action for automatic display (speed)
      ((or (equal macro "\\label")
-	  (member macro reftex-macros-with-labels))
+          (member macro reftex-macros-with-labels))
       ;; A label macro: search for reference macros
       (reftex-access-scan-info arg)
       (setq dw (reftex-view-regexp-match
-		(format reftex-find-reference-format (regexp-quote key))
-		4 nil nil)))
+                (format reftex-find-reference-format (regexp-quote key))
+                4 nil nil)))
      ((equal macro "\\bibitem")
       ;; A bibitem macro: search for citations
       (reftex-access-scan-info arg)
       (setq dw (reftex-view-regexp-match
-		(format reftex-find-citation-regexp-format (regexp-quote key))
-		4 nil nil)))
+                (format reftex-find-citation-regexp-format (regexp-quote key))
+                4 nil nil)))
      ((member macro reftex-macros-with-index)
       (reftex-access-scan-info arg)
       (setq dw (reftex-view-regexp-match
-		(format reftex-find-index-entry-regexp-format
-			(regexp-quote key))
-		3 nil nil)))
+                (format reftex-find-index-entry-regexp-format
+                        (regexp-quote key))
+                3 nil nil)))
      (t 
       (reftex-access-scan-info arg)
       (catch 'exit
-	(let ((list reftex-view-crossref-extra)
-	      entry mre action group)
-	  (while (setq entry (pop list))
-	    (setq mre (car entry)
-		  action (nth 1 entry)
-		  group (nth 2 entry))
-	    (when (string-match mre macro)
-	      (setq dw (reftex-view-regexp-match 
-			(format action key) group nil nil))
-	      (throw 'exit t))))
-	(error "Not on a crossref macro argument"))))
+        (let ((list reftex-view-crossref-extra)
+              entry mre action group)
+          (while (setq entry (pop list))
+            (setq mre (car entry)
+                  action (nth 1 entry)
+                  group (nth 2 entry))
+            (when (string-match mre macro)
+              (setq dw (reftex-view-regexp-match 
+                        (format action key) group nil nil))
+              (throw 'exit t))))
+        (error "Not on a crossref macro argument"))))
     (if (and (eq arg 2) (windowp dw)) (select-window dw))))
      
 (defun reftex-view-cr-cite (arg key how)
   (if (eq how 'tmp-window)
       ;; Remember the window configuration
       (put 'reftex-auto-view-crossref 'last-window-conf 
-	   (current-window-configuration)))
+           (current-window-configuration)))
 
   (let (files size item (pos (point)) (win (selected-window)) pop-win
-	      (bibtype (reftex-bib-or-thebib)))
+              (bibtype (reftex-bib-or-thebib)))
     ;; Find the citation mode and the file list
     (cond
 ;     ((assq 'bib (symbol-value reftex-docstruct-symbol))
      ((eq bibtype 'bib)
       (setq item nil
-	    files (reftex-get-bibfile-list)))
+            files (reftex-get-bibfile-list)))
 ;     ((assq 'thebib (symbol-value reftex-docstruct-symbol))
      ((eq bibtype 'thebib)
       (setq item t
-	    files (reftex-uniquify
-		   (mapcar 'cdr
-			   (reftex-all-assq 
-			    'thebib (symbol-value reftex-docstruct-symbol))))))
+            files (reftex-uniquify
+                   (mapcar 'cdr
+                           (reftex-all-assq 
+                            'thebib (symbol-value reftex-docstruct-symbol))))))
      (reftex-default-bibliography
       (setq item nil
-	    files (reftex-default-bibliography)))
+            files (reftex-default-bibliography)))
      (how)  ;; don't throw for special display
      (t (error "Cannot display crossref")))
 
     (if (eq how 'echo)
-	;; Display in Echo area
-	(reftex-echo-cite key files item)
+        ;; Display in Echo area
+        (reftex-echo-cite key files item)
       ;; Display in a window
       (if (not (eq how 'tmp-window))
-	  ;; Normal display
-	  (reftex-pop-to-bibtex-entry key files nil t item)
-	;; A temporary window
-	(condition-case nil
-	    (reftex-pop-to-bibtex-entry key files nil t item)
-	  (error (goto-char pos)
-		 (message "cite: no such citation key %s" key)
-		 (error "")))
-	;; Resize the window
-	(setq size (max 1 (count-lines (point)
-				       (reftex-end-of-bib-entry item))))
-	(let ((window-min-height 2))
-	  (shrink-window (1- (- (window-height) size)))
-	  (recenter 0))
-	;; Arrange restoration
-	(add-hook 'pre-command-hook 'reftex-restore-window-conf))
+          ;; Normal display
+          (reftex-pop-to-bibtex-entry key files nil t item)
+        ;; A temporary window
+        (condition-case nil
+            (reftex-pop-to-bibtex-entry key files nil t item)
+          (error (goto-char pos)
+                 (message "cite: no such citation key %s" key)
+                 (error "")))
+        ;; Resize the window
+        (setq size (max 1 (count-lines (point)
+                                       (reftex-end-of-bib-entry item))))
+        (let ((window-min-height 2))
+          (shrink-window (1- (- (window-height) size)))
+          (recenter 0))
+        ;; Arrange restoration
+        (add-hook 'pre-command-hook 'reftex-restore-window-conf))
 
-	;; Normal display in other window
+        ;; Normal display in other window
       (add-hook 'pre-command-hook 'reftex-highlight-shall-die)
       (setq pop-win (selected-window))
       (select-window win)
       (goto-char pos)
       (when (equal arg 2)
-	(select-window pop-win)))))
+        (select-window pop-win)))))
 
 (defun reftex-view-cr-ref (arg label how)
   ;; View crossreference of a ref macro.  HOW can have the values 
   (if (eq how 'tmp-window)
       ;; Remember the window configuration
       (put 'reftex-auto-view-crossref 'last-window-conf 
-	   (current-window-configuration)))
+           (current-window-configuration)))
 
   (let* ((xr-data (assoc 'xr (symbol-value reftex-docstruct-symbol)))
-	 (xr-re (nth 2 xr-data))
-	 (entry (assoc label (symbol-value reftex-docstruct-symbol)))
-	 (win (selected-window)) pop-win (pos (point)))
+         (xr-re (nth 2 xr-data))
+         (entry (assoc label (symbol-value reftex-docstruct-symbol)))
+         (win (selected-window)) pop-win (pos (point)))
 
     (if (and (not entry) (stringp label) xr-re (string-match xr-re label))
-	;; Label is defined in external document
-	(save-excursion
-	  (save-match-data
-	    (set-buffer 
-	     (or (reftex-get-file-buffer-force
-		  (cdr (assoc (match-string 1 label) (nth 1
-							  xr-data))))
-		 (error "Problem with external label %s" label))))
-	  (setq label (substring label (match-end 1)))
-	  (reftex-access-scan-info)
-	  (setq entry 
-		(assoc label (symbol-value reftex-docstruct-symbol)))))
+        ;; Label is defined in external document
+        (save-excursion
+          (save-match-data
+            (set-buffer 
+             (or (reftex-get-file-buffer-force
+                  (cdr (assoc (match-string 1 label) (nth 1
+                                                          xr-data))))
+                 (error "Problem with external label %s" label))))
+          (setq label (substring label (match-end 1)))
+          (reftex-access-scan-info)
+          (setq entry 
+                (assoc label (symbol-value reftex-docstruct-symbol)))))
     (if (eq how 'echo)
-	;; Display in echo area
-	(reftex-echo-ref label entry (symbol-value reftex-docstruct-symbol))
+        ;; Display in echo area
+        (reftex-echo-ref label entry (symbol-value reftex-docstruct-symbol))
       (let ((window-conf (current-window-configuration)))
-	(condition-case nil
-	    (reftex-show-label-location entry t nil t t)
-	  (error (set-window-configuration window-conf)
-		 (message "ref: Label %s not found" label)
-		 (error "ref: Label %s not found" label)))) ;; 2nd is line OK
+        (condition-case nil
+            (reftex-show-label-location entry t nil t t)
+          (error (set-window-configuration window-conf)
+                 (message "ref: Label %s not found" label)
+                 (error "ref: Label %s not found" label)))) ;; 2nd is line OK
       (add-hook 'pre-command-hook 'reftex-highlight-shall-die)
 
       (when (eq how 'tmp-window)
-	;; Resize window and arrange restauration
-	(shrink-window (1- (- (window-height) 9)))
-	(recenter '(4))
-	(add-hook 'pre-command-hook 'reftex-restore-window-conf))
+        ;; Resize window and arrange restauration
+        (shrink-window (1- (- (window-height) 9)))
+        (recenter '(4))
+        (add-hook 'pre-command-hook 'reftex-restore-window-conf))
       (setq pop-win (selected-window))
       (select-window win)
       (goto-char pos)
       (when (equal arg 2)
-	(select-window pop-win)))))
+        (select-window pop-win)))))
 
 (defun reftex-mouse-view-crossref (ev)
   "View cross reference of \\ref or \\cite macro where you click.
        (or (eq reftex-auto-view-crossref 'window) (not (current-message)))
        ;; Make sure we are not already displaying this one
        (not (memq last-command '(reftex-view-crossref
-				 reftex-mouse-view-crossref)))
+                                 reftex-mouse-view-crossref)))
        ;; Quick precheck if this might be a relevant spot
        ;; FIXME: Can fail with backslash in comment
        (save-excursion  
-	 (search-backward "\\" nil t)
-	 (looking-at "\\\\[a-zA-Z]*\\(cite\\|ref\\|bibentry\\)"))
+         (search-backward "\\" nil t)
+         (looking-at "\\\\[a-zA-Z]*\\(cite\\|ref\\|bibentry\\)"))
 
        (condition-case nil
-	   (let ((current-prefix-arg nil))
-	     (cond
-	      ((eq reftex-auto-view-crossref t)
-	       (reftex-view-crossref -1 'echo))
-	      ((eq reftex-auto-view-crossref 'window)
-	       (reftex-view-crossref -1 'tmp-window))
-	      (t nil)))
-	 (error nil))))
+           (let ((current-prefix-arg nil))
+             (cond
+              ((eq reftex-auto-view-crossref t)
+               (reftex-view-crossref -1 'echo))
+              ((eq reftex-auto-view-crossref 'window)
+               (reftex-view-crossref -1 'tmp-window))
+              (t nil)))
+         (error nil))))
 
 (defun reftex-restore-window-conf ()
   (set-window-configuration (get 'reftex-auto-view-crossref 'last-window-conf))
   (put 'reftex-auto-view-crossref 'last-window-conf nil)
   (remove-hook 'pre-command-hook 'reftex-restore-window-conf))
-		  
+                  
 (defun reftex-echo-ref (label entry docstruct)
   ;; Display crossref info in echo area.
   (cond
       (message "ref(%s): %s" (nth 1 entry) (nth 2 entry)))
     (let ((buf (get-buffer " *Echo Area*")))
       (when buf
-	(save-excursion
-	  (set-buffer buf)
-	  (run-hooks 'reftex-display-copied-context-hook)))))))
+        (save-excursion
+          (set-buffer buf)
+          (run-hooks 'reftex-display-copied-context-hook)))))))
 
 (defun reftex-echo-cite (key files item)
   ;; Display citation info in echo area.
   (let* ((cache (assq 'bibview-cache (symbol-value reftex-docstruct-symbol)))
-	 (cache-entry (assoc key (cdr cache)))
-	 entry string buf (all-files files))
+         (cache-entry (assoc key (cdr cache)))
+         entry string buf (all-files files))
 
     (if (and reftex-cache-cite-echo cache-entry)
-	;; We can just use the cache
-	(setq string (cdr cache-entry))
+        ;; We can just use the cache
+        (setq string (cdr cache-entry))
 
       ;; Need to look in the database
       (unless reftex-revisit-to-echo
-	(setq files (reftex-visited-files files)))
+        (setq files (reftex-visited-files files)))
 
       (setq entry 
-	    (condition-case nil
-		(save-excursion
-		  (reftex-pop-to-bibtex-entry key files nil nil item t))
-	      (error
-	       (if (and files (= (length all-files) (length files)))
-		   (message "cite: no such database entry: %s" key)
-		 (message (substitute-command-keys 
-			   (format reftex-no-info-message "cite"))))
-	       nil)))
+            (condition-case nil
+                (save-excursion
+                  (reftex-pop-to-bibtex-entry key files nil nil item t))
+              (error
+               (if (and files (= (length all-files) (length files)))
+                   (message "cite: no such database entry: %s" key)
+                 (message (substitute-command-keys 
+                           (format reftex-no-info-message "cite"))))
+               nil)))
       (when entry
-	(if item
-	    (setq string (reftex-nicify-text entry))
-	  (setq string (reftex-make-cite-echo-string
-			(reftex-parse-bibtex-entry entry)
-			reftex-docstruct-symbol)))))
+        (if item
+            (setq string (reftex-nicify-text entry))
+          (setq string (reftex-make-cite-echo-string
+                        (reftex-parse-bibtex-entry entry)
+                        reftex-docstruct-symbol)))))
     (unless (or (null string) (equal string ""))
       (message "cite: %s" string))
     (when (setq buf (get-buffer " *Echo Area*"))
       (save-excursion
-	(set-buffer buf)
-	(run-hooks 'reftex-display-copied-context-hook)))))
+        (set-buffer buf)
+        (run-hooks 'reftex-display-copied-context-hook)))))
 
 (defvar reftex-use-itimer-in-xemacs nil
   "*Non-nil means use the idle timers in XEmacs for crossref display.
   (interactive)
   (if reftex-auto-view-crossref-timer
       (progn
-	(if (featurep 'xemacs)
-	    (if reftex-use-itimer-in-xemacs
-		(delete-itimer reftex-auto-view-crossref-timer)
-	      (remove-hook 'post-command-hook 'reftex-start-itimer-once))
-	  (cancel-timer reftex-auto-view-crossref-timer))
-	(setq reftex-auto-view-crossref-timer nil)
-	(message "Automatic display of crossref information was turned off"))
+        (if (featurep 'xemacs)
+            (if reftex-use-itimer-in-xemacs
+                (delete-itimer reftex-auto-view-crossref-timer)
+              (remove-hook 'post-command-hook 'reftex-start-itimer-once))
+          (cancel-timer reftex-auto-view-crossref-timer))
+        (setq reftex-auto-view-crossref-timer nil)
+        (message "Automatic display of crossref information was turned off"))
     (setq reftex-auto-view-crossref-timer
-	  (if (featurep 'xemacs)
-	      (if reftex-use-itimer-in-xemacs
-		  (start-itimer "RefTeX Idle Timer"
-				'reftex-view-crossref-when-idle 
-				reftex-idle-time reftex-idle-time t)
-		(add-hook 'post-command-hook 'reftex-start-itimer-once)
-		t)
-	    (run-with-idle-timer
-	     reftex-idle-time t 'reftex-view-crossref-when-idle)))
+          (if (featurep 'xemacs)
+              (if reftex-use-itimer-in-xemacs
+                  (start-itimer "RefTeX Idle Timer"
+                                'reftex-view-crossref-when-idle 
+                                reftex-idle-time reftex-idle-time t)
+                (add-hook 'post-command-hook 'reftex-start-itimer-once)
+                t)
+            (run-with-idle-timer
+             reftex-idle-time t 'reftex-view-crossref-when-idle)))
     (unless reftex-auto-view-crossref
       (setq reftex-auto-view-crossref t))
     (message "Automatic display of crossref information was turned on")))
 
 (defun reftex-start-itimer-once ()
    (and reftex-mode
-	(not (itimer-live-p reftex-auto-view-crossref-timer))
-	(setq reftex-auto-view-crossref-timer
-	      (start-itimer "RefTeX Idle Timer"
-			    'reftex-view-crossref-when-idle 
-			    reftex-idle-time nil t))))
+        (not (itimer-live-p reftex-auto-view-crossref-timer))
+        (setq reftex-auto-view-crossref-timer
+              (start-itimer "RefTeX Idle Timer"
+                            'reftex-view-crossref-when-idle 
+                            reftex-idle-time nil t))))
 
 (defun reftex-view-crossref-from-bibtex (&optional arg)
   "View location in a LaTeX document which cites the BibTeX entry at point.
     ;; Establish connection to reference buffer
     (unless ref-buffer
       (setq ref-buffer
-	    (save-excursion
-	      (completing-read 
-	       "Reference buffer: "
-	       (delq nil
-		     (mapcar 
-		      (lambda (b)
-			(set-buffer b)
-			(if reftex-mode (list (buffer-name b)) nil))
-		      (buffer-list)))
-	       nil t)))
+            (save-excursion
+              (completing-read 
+               "Reference buffer: "
+               (delq nil
+                     (mapcar 
+                      (lambda (b)
+                        (set-buffer b)
+                        (if reftex-mode (list (buffer-name b)) nil))
+                      (buffer-list)))
+               nil t)))
       (put 'reftex-bibtex-view-cite-locations :ref-buffer ref-buffer))
     ;; Search for citations
     (bibtex-beginning-of-entry)
     (if (looking-at
-	 "@[a-zA-Z]+[ \t\n\r]*[{(][ \t\n\r]*\\([^, \t\r\n}]+\\)")
-	(progn
-	  (goto-char (match-beginning 1))
-	  (reftex-view-regexp-match
-	   (format reftex-find-citation-regexp-format
-		   (regexp-quote (match-string 1)))
-	   4 arg ref-buffer))
+         "@[a-zA-Z]+[ \t\n\r]*[{(][ \t\n\r]*\\([^, \t\r\n}]+\\)")
+        (progn
+          (goto-char (match-beginning 1))
+          (reftex-view-regexp-match
+           (format reftex-find-citation-regexp-format
+                   (regexp-quote (match-string 1)))
+           4 arg ref-buffer))
       (error "Cannot find citation key in BibTeX entry"))))
 
 (defun reftex-view-regexp-match (re &optional highlight-group new ref-buffer)
 
   ;;; Decide if new search or continued search
   (let* ((oldprop (get 'reftex-view-regexp-match :props))
-	 (newprop (list (current-buffer) re))
-	 (cont (and (not new) (equal oldprop newprop)))
-	 (cnt (if cont (get 'reftex-view-regexp-match :cnt) 0))
-	 (current-window (selected-window))
-	 (window-conf (current-window-configuration))
-	 match pop-window)
+         (newprop (list (current-buffer) re))
+         (cont (and (not new) (equal oldprop newprop)))
+         (cnt (if cont (get 'reftex-view-regexp-match :cnt) 0))
+         (current-window (selected-window))
+         (window-conf (current-window-configuration))
+         match pop-window)
     (switch-to-buffer-other-window (or ref-buffer (current-buffer)))
     ;; Search
     (condition-case nil
-	(if cont
-	    (setq match (reftex-global-search-continue))
-	  (reftex-access-scan-info)
-	  (setq match (reftex-global-search re (reftex-all-document-files))))
+        (if cont
+            (setq match (reftex-global-search-continue))
+          (reftex-access-scan-info)
+          (setq match (reftex-global-search re (reftex-all-document-files))))
       (error nil))
     ;; Evaluate the match.
     (if match
-	(progn
-	  (put 'reftex-view-regexp-match :props newprop)
-	  (put 'reftex-view-regexp-match :cnt (incf cnt))
-	  (reftex-highlight 0 (match-beginning highlight-group)
-			    (match-end highlight-group))
-	  (add-hook 'pre-command-hook 'reftex-highlight-shall-die)
-	  (setq pop-window (selected-window)))
+        (progn
+          (put 'reftex-view-regexp-match :props newprop)
+          (put 'reftex-view-regexp-match :cnt (incf cnt))
+          (reftex-highlight 0 (match-beginning highlight-group)
+                            (match-end highlight-group))
+          (add-hook 'pre-command-hook 'reftex-highlight-shall-die)
+          (setq pop-window (selected-window)))
       (put 'reftex-view-regexp-match :props nil)
       (or cont (set-window-configuration window-conf)))
     (select-window current-window)
     (if match
-	(progn
-	  (message "Match Nr. %s" cnt)
-	  pop-window)
+        (progn
+          (message "Match Nr. %s" cnt)
+          pop-window)
       (if cont
-	  (error "No further matches (total number of matches: %d)" cnt)
-	(error "No matches")))))
+          (error "No further matches (total number of matches: %d)" cnt)
+        (error "No matches")))))
 
 (defvar reftex-global-search-marker (make-marker))
 (defun reftex-global-search (regexp file-list)
   (unless (get 'reftex-global-search :file-list)
     (error "No global search to continue"))
   (let* ((file-list (get 'reftex-global-search :file-list))
-	 (regexp (get 'reftex-global-search :regexp))
-	 (buf (or (marker-buffer reftex-global-search-marker)
-		  (reftex-get-file-buffer-force (car file-list))))
-	 (pos (or (marker-position reftex-global-search-marker) 1))
-	 file)
+         (regexp (get 'reftex-global-search :regexp))
+         (buf (or (marker-buffer reftex-global-search-marker)
+                  (reftex-get-file-buffer-force (car file-list))))
+         (pos (or (marker-position reftex-global-search-marker) 1))
+         file)
     ;; Take up starting position
     (unless buf (error "No such buffer %s" buf))
     (switch-to-buffer buf)
     (goto-char pos)
     ;; Search and switch file if necessary
     (if (catch 'exit
-	  (while t
-	    (when (re-search-forward regexp nil t)
-	      (move-marker reftex-global-search-marker (point))
-	      (throw 'exit t))
-	    ;; No match - goto next file
-	    (pop file-list)
-	    (or file-list (throw 'exit nil))
-	    (setq file (car file-list)
-		  buf (reftex-get-file-buffer-force file))
-	    (unless buf (error "Cannot access file %s" file))
-	    (put 'reftex-global-search :file-list file-list)
-	    (switch-to-buffer buf)
-	    (widen)
-	    (goto-char 1)))
-	t
+          (while t
+            (when (re-search-forward regexp nil t)
+              (move-marker reftex-global-search-marker (point))
+              (throw 'exit t))
+            ;; No match - goto next file
+            (pop file-list)
+            (or file-list (throw 'exit nil))
+            (setq file (car file-list)
+                  buf (reftex-get-file-buffer-force file))
+            (unless buf (error "Cannot access file %s" file))
+            (put 'reftex-global-search :file-list file-list)
+            (switch-to-buffer buf)
+            (widen)
+            (goto-char 1)))
+        t
       (move-marker reftex-global-search-marker nil)
       (error "All files processed"))))