1 ;;; reftex-auc.el --- RefTeX's interface to AUCTeX
3 ;; Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
4 ;; 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
6 ;; Author: Carsten Dominik <dominik@science.uva.nl>
7 ;; Maintainer: auctex-devel@gnu.org
10 ;; This file is part of GNU Emacs.
12 ;; GNU Emacs is free software: you can redistribute it and/or modify
13 ;; it under the terms of the GNU General Public License as published by
14 ;; the Free Software Foundation, either version 3 of the License, or
15 ;; (at your option) any later version.
17 ;; GNU Emacs is distributed in the hope that it will be useful,
18 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
19 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 ;; GNU General Public License for more details.
22 ;; You should have received a copy of the GNU General Public License
23 ;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
29 (eval-when-compile (require 'cl
))
34 (declare-function TeX-argument-insert
"ext:tex" (name optional
&optional prefix
))
35 (declare-function TeX-argument-prompt
"ext:tex" (optional prompt default
&optional complete
))
36 (declare-function multi-prompt
"ext:multi-prompt"
39 &optional mp-predicate require-match initial history
))
40 (declare-function LaTeX-add-index-entries
"ext:tex" (&rest entries
) t
)
41 (declare-function LaTeX-add-labels
"ext:tex" (&rest entries
) t
)
42 (declare-function LaTeX-bibitem-list
"ext:tex" () t
)
43 (declare-function LaTeX-index-entry-list
"ext:tex" () t
)
44 (declare-function LaTeX-label-list
"ext:tex" () t
)
46 (defun reftex-plug-flag (which)
47 ;; Tell if a certain flag is set in reftex-plug-into-AUCTeX
48 (or (eq t reftex-plug-into-AUCTeX
)
49 (and (listp reftex-plug-into-AUCTeX
)
50 (nth which reftex-plug-into-AUCTeX
))))
52 (defun reftex-arg-label (optional &optional prompt definition
)
53 "Use `reftex-label', `reftex-reference' or AUCTeX's code to insert label arg.
54 What is being used depends upon `reftex-plug-into-AUCTeX'."
57 ((and definition
(reftex-plug-flag 1))
58 ;; Create a new label, with a temporary brace for `reftex-what-macro'
60 (progn (insert "{") (setq label
(or (reftex-label nil t
) "")))
61 (delete-backward-char 1)))
62 ((and (not definition
) (reftex-plug-flag 2))
63 ;; Reference a label with RefTeX
64 (setq label
(reftex-reference nil t
)))
66 ;; AUCTeX's default mechanism
67 (setq label
(completing-read (TeX-argument-prompt optional prompt
"Key")
68 (LaTeX-label-list)))))
69 (if (and definition
(not (string-equal "" label
)))
70 (LaTeX-add-labels label
))
71 (TeX-argument-insert label optional
)))
73 (defun reftex-arg-cite (optional &optional prompt definition
)
74 "Use `reftex-citation' or AUCTeX's code to insert a cite-key macro argument.
75 What is being used depends upon `reftex-plug-into-AUCTeX'."
78 ((and (not definition
) (reftex-plug-flag 3))
79 (setq items
(list (or (reftex-citation t
) ""))))
81 (setq prompt
(concat (if optional
"(Optional) " "")
82 (if prompt prompt
"Add key")
84 (setq items
(multi-prompt "," t prompt
(LaTeX-bibitem-list)))))
85 (apply 'LaTeX-add-bibitems items
)
86 (TeX-argument-insert (mapconcat 'identity items
",") optional
)))
89 (defun reftex-arg-index-tag (optional &optional prompt
&rest args
)
90 "Prompt for an index tag with completion.
91 This is the name of an index, not the entry."
93 (setq prompt
(concat (if optional
"(Optional) " "")
94 (if prompt prompt
"Index tag")
96 (if (and reftex-support-index
(reftex-plug-flag 4))
97 ;; Use RefTeX completion
99 (reftex-access-scan-info nil
)
101 (cdr (assoc 'index-tags
102 (symbol-value reftex-docstruct-symbol
)))
103 tag
(completing-read prompt
(mapcar 'list taglist
))))
104 ;; Just ask like AUCTeX does.
105 (setq tag
(read-string prompt
)))
106 (TeX-argument-insert tag optional
)))
108 (defun reftex-arg-index (optional &optional prompt
&rest args
)
109 "Prompt for an index entry completing with known entries.
110 Completion is specific for just one index, if the macro or a tag
111 argument identify one of multiple indices."
113 (if (and reftex-support-index
(reftex-plug-flag 4))
115 (reftex-access-scan-info nil
)
116 (setq tag
(reftex-what-index-tag)
117 key
(reftex-index-complete-key (or tag
"idx"))))
118 (setq key
(completing-read (TeX-argument-prompt optional prompt
"Key")
119 (LaTeX-index-entry-list))))
120 (unless (string-equal "" key
)
121 (LaTeX-add-index-entries key
))
122 (TeX-argument-insert key optional
)))
124 (defun reftex-what-index-tag ()
125 ;; Look backward to find out what index the macro at point belongs to
126 (let ((macro (save-excursion
127 (and (re-search-backward "\\\\[a-zA-Z*]+" nil t
)
131 (setq entry
(assoc macro reftex-index-macro-alist
)))
132 (setq tag
(nth 1 entry
))
137 (goto-char (match-end 1))
138 (or (reftex-nth-arg tag
(nth 6 entry
)) "idx")))
141 (defvar LaTeX-label-function
)
142 (defun reftex-plug-into-AUCTeX ()
143 ;; Replace AUCTeX functions with RefTeX functions.
144 ;; Which functions are replaced is controlled by the variable
145 ;; `reftex-plug-into-AUCTeX'.
147 (if (reftex-plug-flag 0)
148 (setq LaTeX-label-function
'reftex-label
)
149 (setq LaTeX-label-function nil
))
151 (and (or (reftex-plug-flag 1) (reftex-plug-flag 2))
152 (fboundp 'TeX-arg-label
)
153 (fset 'TeX-arg-label
'reftex-arg-label
))
155 (and (reftex-plug-flag 3)
156 (fboundp 'TeX-arg-cite
)
157 (fset 'TeX-arg-cite
'reftex-arg-cite
))
159 (and (reftex-plug-flag 4)
160 (fboundp 'TeX-arg-index-tag
)
161 (fset 'TeX-arg-index-tag
'reftex-arg-index-tag
))
162 (and (reftex-plug-flag 4)
163 (fboundp 'TeX-arg-index
)
164 (fset 'TeX-arg-index
'reftex-arg-index
)))
166 (defun reftex-toggle-plug-into-AUCTeX ()
167 "Toggle Interface between AUCTeX and RefTeX on and off."
169 (unless (and (featurep 'tex-site
) (featurep 'latex
))
170 (error "AUCTeX's LaTeX mode does not seem to be loaded"))
171 (setq reftex-plug-into-AUCTeX
(not reftex-plug-into-AUCTeX
))
172 (reftex-plug-into-AUCTeX)
173 (if reftex-plug-into-AUCTeX
174 (message "RefTeX has been plugged into AUCTeX.")
175 (message "RefTeX no longer interacts with AUCTeX.")))
177 (defun reftex-add-label-environments (entry-list)
178 "Add label environment descriptions to `reftex-label-alist-style'.
179 The format of ENTRY-LIST is exactly like `reftex-label-alist'. See there
181 This function makes it possible to support RefTeX from AUCTeX style files.
182 The entries in ENTRY-LIST will be processed after the user settings in
183 `reftex-label-alist', and before the defaults (specified in
184 `reftex-default-label-alist-entries'). Any changes made to
185 `reftex-label-alist-style' will raise a flag to the effect that
186 the label information is recompiled on next use."
187 (unless reftex-docstruct-symbol
188 (reftex-tie-multifile-symbols))
189 (when (and reftex-docstruct-symbol
190 (symbolp reftex-docstruct-symbol
))
191 (let ((list (get reftex-docstruct-symbol
'reftex-label-alist-style
))
194 (setq entry
(pop entry-list
))
195 (unless (member entry list
)
196 (setq reftex-tables-dirty t
200 (put reftex-docstruct-symbol
'reftex-label-alist-style list
)))))
201 (defalias 'reftex-add-to-label-alist
'reftex-add-label-environments
)
203 (defun reftex-add-section-levels (entry-list)
204 "Add entries to the value of `reftex-section-levels'.
205 The added values are kept local to the current document. The format
206 of ENTRY-LIST is a list of cons cells (\"MACRONAME\" . LEVEL). See
207 `reftex-section-levels' for an example."
208 (unless reftex-docstruct-symbol
209 (reftex-tie-multifile-symbols))
210 (when (and reftex-docstruct-symbol
211 (symbolp reftex-docstruct-symbol
))
212 (let ((list (get reftex-docstruct-symbol
'reftex-section-levels
))
215 (setq entry
(pop entry-list
))
216 (unless (member entry list
)
217 (setq reftex-tables-dirty t
221 (put reftex-docstruct-symbol
'reftex-section-levels list
)))))
223 (defun reftex-notice-new-section ()
224 (reftex-notice-new 1 'force
))
226 ;; arch-tag: 4a798e68-3405-421c-a09b-0269aac64ab4
227 ;;; reftex-auc.el ends here