]> code.delx.au - gnu-emacs-elpa/blob - packages/auctex-11.86/style/beamer.el
7b911cd4b7767e00729a1083189a971519ae7c49
[gnu-emacs-elpa] / packages / auctex-11.86 / style / beamer.el
1 ;;; beamer.el --- AUCTeX style for the latex-beamer class
2
3 ;; Copyright (C) 2003, 2004, 2005,2008 Free Software Foundation
4
5 ;; Author: Thomas Baumann <thomas.baumann@ch.tum.de>
6 ;; Created: 2003-12-20
7 ;; Keywords: tex
8
9 ;; This file is part of AUCTeX.
10
11 ;; AUCTeX is free software; you can redistribute it and/or modify it
12 ;; under the terms of the GNU General Public License as published by
13 ;; the Free Software Foundation; either version 3, or (at your option)
14 ;; any later version.
15
16 ;; AUCTeX is distributed in the hope that it will be useful, but
17 ;; WITHOUT ANY WARRANTY; without even the implied warranty of
18 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19 ;; General Public License for more details.
20
21 ;; You should have received a copy of the GNU General Public License
22 ;; along with AUCTeX; see the file COPYING. If not, write to the Free
23 ;; Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
24 ;; 02110-1301, USA.
25
26 ;;; Commentary:
27
28 ;; This file adds support for the latex-beamer class.
29
30 ;;; Code:
31
32 (defun LaTeX-beamer-after-insert-env (env start end)
33 "Do beamer-specific stuff after the insertion of an environment."
34 ;; Add `fragile' as an optional argument to the frame environment if
35 ;; a verbatim environment is inserted.
36 (when (and (TeX-member env (LaTeX-verbatim-environments) 'string-equal)
37 (save-excursion
38 (goto-char start)
39 (string-equal (LaTeX-current-environment) "frame")))
40 (save-excursion
41 (when (re-search-backward "\\\\begin[ \t]*{frame}" nil t)
42 (let ((end-of-begin (match-end 0)))
43 (goto-char end-of-begin)
44 (while (forward-comment 1))
45 (if (eq (char-after) (string-to-char LaTeX-optop))
46 (progn
47 (forward-char)
48 (insert "fragile")
49 (unless (looking-at (concat "[ \t]*" LaTeX-optcl))
50 (insert ",")))
51 (goto-char end-of-begin)
52 (insert "[fragile]")))))))
53
54 (TeX-add-style-hook
55 "beamer"
56 (lambda ()
57 (add-hook 'LaTeX-after-insert-env-hooks 'LaTeX-beamer-after-insert-env nil t)
58
59 (unless LaTeX-beamer-section-labels-flag
60 (make-local-variable 'LaTeX-section-hook)
61 (setq LaTeX-section-hook
62 '(LaTeX-section-heading
63 LaTeX-section-title
64 LaTeX-section-section)))
65
66 (setq LaTeX-item-list
67 (append '(("itemize" . LaTeX-item-beamer)
68 ("enumerate" . LaTeX-item-beamer))
69 LaTeX-item-list))
70
71 (LaTeX-paragraph-commands-add-locally "frametitle")
72
73 (TeX-add-symbols
74 '("alert" 1)
75 '("alt" TeX-arg-beamer-overlay-spec 2)
76 '("beamerbutton" 1)
77 '("beamergotobutton" 1)
78 '("beamerreturnbutton" 1)
79 '("beamerskipbutton" 1)
80 '("frame" TeX-arg-beamer-frametitle)
81 '("frametitle" 1)
82 '("hyperlink" TeX-arg-beamer-overlay-spec 2)
83 '("hyperlinkslideprev" TeX-arg-beamer-overlay-spec 1)
84 '("hyperlinkslidenext" TeX-arg-beamer-overlay-spec 1)
85 '("hyperlinkframestart" TeX-arg-beamer-overlay-spec 1)
86 '("hyperlinkframeend" TeX-arg-beamer-overlay-spec 1)
87 '("hyperlinkframestartnext" TeX-arg-beamer-overlay-spec 1)
88 '("hyperlinkframeendprev" TeX-arg-beamer-overlay-spec 1)
89 '("hyperlinkpresentationstart" TeX-arg-beamer-overlay-spec 1)
90 '("hyperlinkpresentationend" TeX-arg-beamer-overlay-spec 1)
91 '("hyperlinkappendixstart" TeX-arg-beamer-overlay-spec 1)
92 '("hyperlinkappendixend" TeX-arg-beamer-overlay-spec 1)
93 '("hyperlinkdocumentstart" TeX-arg-beamer-overlay-spec 1)
94 '("hyperlinkdocumentend" TeX-arg-beamer-overlay-spec 1)
95 '("hypertarget" TeX-arg-beamer-overlay-spec 2)
96 '("institute" 1)
97 '("invisible" TeX-arg-beamer-overlay-spec 1)
98 '("label" TeX-arg-beamer-overlay-spec 1)
99 '("logo" 1)
100 '("note" TeX-arg-beamer-note 1)
101 '("only" TeX-arg-beamer-overlay-spec 1)
102 '("onslide" TeX-arg-beamer-overlay-spec)
103 '("partpage")
104 '("pause")
105 '("structure" TeX-arg-beamer-overlay-spec 1)
106 '("temporal" TeX-arg-beamer-overlay-spec 3)
107 '("titlepage")
108 '("titlegraphic" 1)
109 '("uncover" TeX-arg-beamer-overlay-spec 1)
110 '("usetheme" LaTeX-arg-beamer-theme)
111 '("useinnertheme" LaTeX-arg-beamer-inner-theme)
112 '("useoutertheme" LaTeX-arg-beamer-outer-theme)
113 '("usecolortheme" LaTeX-arg-beamer-color-theme)
114 '("usefonttheme" LaTeX-arg-beamer-font-theme)
115 '("usetheme" LaTeX-arg-beamer-theme)
116 '("visible" TeX-arg-beamer-overlay-spec 1))
117
118 (LaTeX-add-environments
119 '("actionenv")
120 '("alertblock" 1)
121 '("beamerboxesrounded" 1)
122 '("block" 1)
123 '("column" "Width")
124 "columns"
125 "columnsonlytextwidth"
126 '("exampleblock" 1)
127 '("frame" (lambda (env &rest ignore)
128 (let ((title (read-string "(Optional) Title: ")))
129 (LaTeX-insert-environment env)
130 (unless (zerop (length title))
131 (save-excursion
132 (LaTeX-find-matching-begin)
133 (end-of-line)
134 (LaTeX-newline)
135 (insert (format "\\frametitle{%s}" title))
136 ;; This works because \frametitle is a
137 ;; paragraph command.
138 (backward-char)
139 (LaTeX-fill-paragraph))))))
140 '("onlyenv" (lambda (env &rest ignore)
141 (LaTeX-insert-environment
142 env
143 (let ((overlay (read-string "(Optional) Overlay: ")))
144 (unless (zerop (length overlay))
145 (format "<%s>" overlay))))))
146 '("overlayarea" "Area width" "Area height")
147 '("overprint" (lambda (env &rest ignore)
148 (LaTeX-insert-environment
149 env
150 (let ((width (read-string "(Optional) Area width: ")))
151 (unless (zerop (length width))
152 (format "[%s]" width))))))
153 "semiverbatim")
154
155 (make-local-variable 'LaTeX-indent-environment-list)
156 (add-to-list 'LaTeX-indent-environment-list
157 '("semiverbatim" current-indentation))
158 (make-local-variable 'LaTeX-verbatim-regexp)
159 (setq LaTeX-verbatim-regexp (concat LaTeX-verbatim-regexp "\\|semiverbatim"))
160 (add-to-list 'LaTeX-verbatim-environments-local "semiverbatim")
161
162 ;; Fontification
163 (when (and (featurep 'font-latex)
164 (eq TeX-install-font-lock 'font-latex-setup))
165 (font-latex-add-keywords '(("frametitle" "<[{")) 'slide-title)
166 ;; For syntactic fontification, e.g. verbatim constructs.
167 (font-latex-set-syntactic-keywords)
168 ;; Tell font-lock about the update.
169 (setq font-lock-set-defaults nil)
170 (font-lock-set-defaults))))
171
172 (defun TeX-arg-beamer-overlay-spec (optional &optional prompt)
173 "Prompt for overlay specification."
174 (let ((overlay (read-string "(Optional) Overlay: ")))
175 (unless (zerop (length overlay))
176 (insert "<" overlay ">"))
177 (indent-according-to-mode)))
178
179 (defun TeX-arg-beamer-frametitle (optional &optional prompt)
180 "Prompt for the frametitle."
181 (let ((title (read-string "Title: ")))
182 (if (not (zerop (length title)))
183 (insert TeX-grop TeX-esc "frametitle" TeX-grop
184 title TeX-grcl TeX-grcl)
185 (insert TeX-grop TeX-grcl))))
186
187 (defun LaTeX-item-beamer ()
188 "Insert a new item with an optional overlay argument. You
189 can turn off the prompt for the overlay argument by setting
190 `LaTeX-beamer-item-overlay-flag' to nil. Calling the function
191 with a prefix argument prompts for the overlay specification
192 unconditionally."
193 (if (listp current-prefix-arg)
194 (setq current-prefix-arg (car current-prefix-arg))
195 current-prefix-arg)
196 (TeX-insert-macro "item")
197 (delete-horizontal-space)
198 (if (or current-prefix-arg LaTeX-beamer-item-overlay-flag)
199 (TeX-arg-beamer-overlay-spec 0))
200 (insert " ")
201 (indent-according-to-mode))
202
203 (defun TeX-arg-beamer-note (optional &optional prompt)
204 "Prompt for overlay specification and optional argument."
205 (let ((overlay (read-string "(Optional) Overlay: "))
206 (options (read-string "(Optional) Options: ")))
207 (unless (zerop (length overlay))
208 (insert "<" overlay ">"))
209 (unless (zerop (length options))
210 (insert "[" options "]"))
211 (indent-according-to-mode)))
212
213 (defun LaTeX-beamer-search-themes (&optional regexp extensions length)
214 "Search for beamer themes matching REGEXP with EXTENSIONS.
215 The function removes the first LENGTH characters and the
216 extension of the file and returns a list of strings. LENGTH may
217 also be a string. Then the length of the string is used."
218 (let* ((match (or regexp "^beamertheme[A-Z]"))
219 (exts (or extensions '("tex" "sty")))
220 (chars (cond ((integerp length)
221 length)
222 ((stringp length)
223 (string-width length))
224 ;; Try some DWIM magic...
225 ((and (not length)
226 (string-match "beamer[A-Za-z0-9]*theme" match))
227 (- (match-end 0) (match-beginning 0)))
228 (t (error "Invalid length: `%s'" length)))))
229 ;; (message "match=`%s' chars=`%s'" match chars)
230 (TeX-delete-duplicate-strings
231 (delete nil
232 (mapcar
233 (lambda (file)
234 (let ((case-fold-search nil))
235 (and (numberp (string-match match file))
236 (substring file chars))))
237 (TeX-search-files nil exts t t))))))
238
239 (defun LaTeX-arg-beamer-theme (&rest ignore)
240 "Prompt for beamer theme with completion."
241 (TeX-argument-insert
242 (completing-read
243 (TeX-argument-prompt nil nil "Theme")
244 (mapcar 'list
245 (cond ((eq LaTeX-beamer-themes 'local)
246 (set (make-local-variable 'LaTeX-beamer-themes)
247 (LaTeX-beamer-search-themes)))
248 ((functionp LaTeX-beamer-themes)
249 (funcall LaTeX-beamer-themes))
250 ((listp LaTeX-beamer-themes)
251 LaTeX-beamer-themes)
252 (t (error
253 "`LaTeX-beamer-themes' should be a list: `%s'"
254 LaTeX-beamer-themes))))
255 nil nil nil)
256 t))
257
258 (defun LaTeX-arg-beamer-inner-theme (&rest ignore)
259 "Prompt for beamer inner theme with completion."
260 (TeX-argument-insert
261 (completing-read
262 (TeX-argument-prompt nil nil "Theme")
263 (mapcar 'list
264 (cond ((eq LaTeX-beamer-inner-themes 'local)
265 (set (make-local-variable 'LaTeX-beamer-inner-themes)
266 (LaTeX-beamer-search-themes "^beamerinnertheme")))
267 ((functionp LaTeX-beamer-inner-themes)
268 (funcall LaTeX-beamer-inner-themes))
269 ((listp LaTeX-beamer-inner-themes)
270 LaTeX-beamer-inner-themes)
271 (t (error
272 "`LaTeX-beamer-inner-themes' should be a list: `%s'"
273 LaTeX-beamer-inner-themes))))
274 nil nil nil)
275 t))
276
277 (defun LaTeX-arg-beamer-outer-theme (&rest ignore)
278 "Prompt for beamer outer theme with completion."
279 (TeX-argument-insert
280 (completing-read
281 (TeX-argument-prompt nil nil "Theme")
282 (mapcar 'list
283 (cond ((eq LaTeX-beamer-outer-themes 'local)
284 (set (make-local-variable 'LaTeX-beamer-outer-themes)
285 (LaTeX-beamer-search-themes "^beameroutertheme")))
286 ((functionp LaTeX-beamer-outer-themes)
287 (funcall LaTeX-beamer-outer-themes))
288 ((listp LaTeX-beamer-outer-themes)
289 LaTeX-beamer-outer-themes)
290 (t (error
291 "`LaTeX-beamer-outer-themes' should be a list: `%s'"
292 LaTeX-beamer-outer-themes))))
293 nil nil nil)
294 t))
295
296 (defun LaTeX-arg-beamer-color-theme (&rest ignore)
297 "Prompt for beamer color theme with completion."
298 (TeX-argument-insert
299 (completing-read
300 (TeX-argument-prompt nil nil "Theme")
301 (mapcar 'list
302 (cond ((eq LaTeX-beamer-color-themes 'local)
303 (set (make-local-variable 'LaTeX-beamer-color-themes)
304 (LaTeX-beamer-search-themes "^beamercolortheme")))
305 ((functionp LaTeX-beamer-color-themes)
306 (funcall LaTeX-beamer-color-themes))
307 ((listp LaTeX-beamer-color-themes)
308 LaTeX-beamer-color-themes)
309 (t (error
310 "`LaTeX-beamer-color-themes' should be a list: `%s'"
311 LaTeX-beamer-color-themes))))
312 nil nil nil)
313 t))
314
315 (defun LaTeX-arg-beamer-font-theme (&rest ignore)
316 "Prompt for beamer font theme with completion."
317 (TeX-argument-insert
318 (completing-read
319 (TeX-argument-prompt nil nil "Theme")
320 (mapcar 'list
321 (cond ((eq LaTeX-beamer-font-themes 'local)
322 (set (make-local-variable 'LaTeX-beamer-font-themes)
323 (LaTeX-beamer-search-themes "^beamerfonttheme")))
324 ((functionp LaTeX-beamer-font-themes)
325 (funcall LaTeX-beamer-font-themes))
326 ((listp LaTeX-beamer-font-themes)
327 LaTeX-beamer-font-themes)
328 (t (error
329 "`LaTeX-beamer-font-themes' should be a list: `%s'"
330 LaTeX-beamer-font-themes))))
331 nil nil nil)
332 t))
333
334 ;;; beamer.el ends here