1 ;;; beamer.el --- AUCTeX style for the latex-beamer class
3 ;; Copyright (C) 2003, 2004, 2005, 2008, 2013 Free Software Foundation
5 ;; Author: Thomas Baumann <thomas.baumann@ch.tum.de>
9 ;; This file is part of AUCTeX.
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)
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.
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
28 ;; This file adds support for the latex-beamer class.
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)
39 (string-equal (LaTeX-current-environment) "frame")))
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))
49 (unless (looking-at (concat "[ \t]*" LaTeX-optcl))
51 (goto-char end-of-begin)
52 (insert "[fragile]")))))))
54 (defvar LaTeX-beamer-frametitle-history nil
55 "History of frame titles in beamer.")
60 (add-hook 'LaTeX-after-insert-env-hooks 'LaTeX-beamer-after-insert-env nil t)
62 (TeX-run-style-hooks "amsmath" "amssymb" "amsthm" "color" "geometry"
63 "hyperref" "inputenc" "translator" "xcolor")
65 (unless LaTeX-beamer-section-labels-flag
66 (make-local-variable 'LaTeX-section-hook)
67 (setq LaTeX-section-hook
68 '(LaTeX-section-heading
70 LaTeX-section-section)))
73 (append '(("itemize" . LaTeX-item-beamer)
74 ("enumerate" . LaTeX-item-beamer))
77 (setq LaTeX-default-document-environment "frame")
79 (LaTeX-paragraph-commands-add-locally "frametitle")
83 '("alt" TeX-arg-beamer-overlay-spec 2)
85 '("beamergotobutton" 1)
86 '("beamerreturnbutton" 1)
87 '("beamerskipbutton" 1)
88 '("frame" TeX-arg-beamer-frametitle)
90 (TeX-arg-eval read-string "Title: " nil 'LaTeX-beamer-frametitle-history))
91 '("hyperlink" TeX-arg-beamer-overlay-spec 2)
92 '("hyperlinkslideprev" TeX-arg-beamer-overlay-spec 1)
93 '("hyperlinkslidenext" TeX-arg-beamer-overlay-spec 1)
94 '("hyperlinkframestart" TeX-arg-beamer-overlay-spec 1)
95 '("hyperlinkframeend" TeX-arg-beamer-overlay-spec 1)
96 '("hyperlinkframestartnext" TeX-arg-beamer-overlay-spec 1)
97 '("hyperlinkframeendprev" TeX-arg-beamer-overlay-spec 1)
98 '("hyperlinkpresentationstart" TeX-arg-beamer-overlay-spec 1)
99 '("hyperlinkpresentationend" TeX-arg-beamer-overlay-spec 1)
100 '("hyperlinkappendixstart" TeX-arg-beamer-overlay-spec 1)
101 '("hyperlinkappendixend" TeX-arg-beamer-overlay-spec 1)
102 '("hyperlinkdocumentstart" TeX-arg-beamer-overlay-spec 1)
103 '("hyperlinkdocumentend" TeX-arg-beamer-overlay-spec 1)
104 '("hypertarget" TeX-arg-beamer-overlay-spec 2)
106 '("invisible" TeX-arg-beamer-overlay-spec 1)
107 '("label" TeX-arg-beamer-overlay-spec 1)
109 '("note" TeX-arg-beamer-note 1)
110 '("only" TeX-arg-beamer-overlay-spec 1)
111 '("onslide" TeX-arg-beamer-overlay-spec)
114 '("structure" TeX-arg-beamer-overlay-spec 1)
115 '("temporal" TeX-arg-beamer-overlay-spec 3)
118 '("uncover" TeX-arg-beamer-overlay-spec 1)
119 '("usetheme" LaTeX-arg-beamer-theme)
120 '("useinnertheme" LaTeX-arg-beamer-inner-theme)
121 '("useoutertheme" LaTeX-arg-beamer-outer-theme)
122 '("usecolortheme" LaTeX-arg-beamer-color-theme)
123 '("usefonttheme" LaTeX-arg-beamer-font-theme)
124 '("usetheme" LaTeX-arg-beamer-theme)
125 '("visible" TeX-arg-beamer-overlay-spec 1))
127 (LaTeX-add-environments
130 '("beamerboxesrounded" 1)
131 '("block" (lambda (env &rest ignore)
132 (LaTeX-insert-environment
133 env (format "{%s}" (read-string "Title: ")))))
136 "columnsonlytextwidth"
138 '("frame" (lambda (env &rest ignore)
139 (let ((title (read-string "(Optional) Title: " nil
140 'LaTeX-beamer-frametitle-history)))
141 (LaTeX-insert-environment env)
142 (unless (zerop (length title))
144 (LaTeX-find-matching-begin)
147 (insert (format "\\frametitle{%s}" title))
148 ;; This works because \frametitle is a
149 ;; paragraph command.
151 (LaTeX-fill-paragraph))))))
152 '("onlyenv" (lambda (env &rest ignore)
153 (LaTeX-insert-environment
155 (let ((overlay (read-string "(Optional) Overlay: ")))
156 (unless (zerop (length overlay))
157 (format "<%s>" overlay))))))
158 '("overlayarea" "Area width" "Area height")
159 '("overprint" (lambda (env &rest ignore)
160 (LaTeX-insert-environment
162 (let ((width (read-string "(Optional) Area width: ")))
163 (unless (zerop (length width))
164 (format "[%s]" width))))))
167 (LaTeX-largest-level-set "section")
168 (LaTeX-add-counters "lecture" "part" "section" "subsection" "subsubsection"
169 "subsectionslide" "framenumber" "figure" "table"
171 (LaTeX-add-pagestyles "navigation")
172 (make-local-variable 'LaTeX-indent-environment-list)
173 (add-to-list 'LaTeX-indent-environment-list
174 '("semiverbatim" current-indentation))
175 (make-local-variable 'LaTeX-verbatim-regexp)
176 (setq LaTeX-verbatim-regexp (concat LaTeX-verbatim-regexp "\\|semiverbatim"))
177 (add-to-list 'LaTeX-verbatim-environments-local "semiverbatim")
180 (when (and (featurep 'font-latex)
181 (eq TeX-install-font-lock 'font-latex-setup))
182 (font-latex-add-keywords '(("title" "[{")
185 ("frametitle" "<[{")) 'slide-title)
186 ;; For syntactic fontification, e.g. verbatim constructs.
187 (font-latex-set-syntactic-keywords)
188 ;; Tell font-lock about the update.
189 (setq font-lock-set-defaults nil)
190 (font-lock-set-defaults)))
193 (defun TeX-arg-beamer-overlay-spec (optional &optional prompt)
194 "Prompt for overlay specification."
195 (let ((overlay (read-string "(Optional) Overlay: ")))
196 (unless (zerop (length overlay))
197 (insert "<" overlay ">"))
198 (indent-according-to-mode)))
200 (defun TeX-arg-beamer-frametitle (optional &optional prompt)
201 "Prompt for the frametitle."
202 (let ((title (read-string "Title: " nil 'LaTeX-beamer-frametitle-history)))
203 (if (not (zerop (length title)))
204 (insert TeX-grop TeX-esc "frametitle" TeX-grop
205 title TeX-grcl TeX-grcl)
206 (insert TeX-grop TeX-grcl))))
208 (defun LaTeX-item-beamer ()
209 "Insert a new item with an optional overlay argument. You
210 can turn off the prompt for the overlay argument by setting
211 `LaTeX-beamer-item-overlay-flag' to nil. Calling the function
212 with a prefix argument prompts for the overlay specification
214 (if (listp current-prefix-arg)
215 (setq current-prefix-arg (car current-prefix-arg))
217 (TeX-insert-macro "item")
218 (delete-horizontal-space)
219 (if (or current-prefix-arg LaTeX-beamer-item-overlay-flag)
220 (TeX-arg-beamer-overlay-spec 0))
222 (indent-according-to-mode))
224 (defun TeX-arg-beamer-note (optional &optional prompt)
225 "Prompt for overlay specification and optional argument."
226 (let ((overlay (read-string "(Optional) Overlay: "))
227 (options (read-string "(Optional) Options: ")))
228 (unless (zerop (length overlay))
229 (insert "<" overlay ">"))
230 (unless (zerop (length options))
231 (insert "[" options "]"))
232 (indent-according-to-mode)))
234 (defun LaTeX-beamer-search-themes (&optional regexp extensions length)
235 "Search for beamer themes matching REGEXP with EXTENSIONS.
236 The function removes the first LENGTH characters and the
237 extension of the file and returns a list of strings. LENGTH may
238 also be a string. Then the length of the string is used."
239 (let* ((match (or regexp "^beamertheme[A-Z]"))
240 (exts (or extensions '("tex" "sty")))
241 (chars (cond ((integerp length)
244 (string-width length))
245 ;; Try some DWIM magic...
247 (string-match "beamer[A-Za-z0-9]*theme" match))
248 (- (match-end 0) (match-beginning 0)))
249 (t (error "Invalid length: `%s'" length)))))
250 ;; (message "match=`%s' chars=`%s'" match chars)
251 (TeX-delete-duplicate-strings
255 (let ((case-fold-search nil))
256 (and (numberp (string-match match file))
257 (substring file chars))))
258 (TeX-search-files nil exts t t))))))
260 (defun LaTeX-arg-beamer-theme (&rest ignore)
261 "Prompt for beamer theme with completion."
264 (TeX-argument-prompt nil nil "Theme")
266 (cond ((eq LaTeX-beamer-themes 'local)
267 (set (make-local-variable 'LaTeX-beamer-themes)
268 (LaTeX-beamer-search-themes)))
269 ((functionp LaTeX-beamer-themes)
270 (funcall LaTeX-beamer-themes))
271 ((listp LaTeX-beamer-themes)
274 "`LaTeX-beamer-themes' should be a list: `%s'"
275 LaTeX-beamer-themes))))
279 (defun LaTeX-arg-beamer-inner-theme (&rest ignore)
280 "Prompt for beamer inner theme with completion."
283 (TeX-argument-prompt nil nil "Theme")
285 (cond ((eq LaTeX-beamer-inner-themes 'local)
286 (set (make-local-variable 'LaTeX-beamer-inner-themes)
287 (LaTeX-beamer-search-themes "^beamerinnertheme")))
288 ((functionp LaTeX-beamer-inner-themes)
289 (funcall LaTeX-beamer-inner-themes))
290 ((listp LaTeX-beamer-inner-themes)
291 LaTeX-beamer-inner-themes)
293 "`LaTeX-beamer-inner-themes' should be a list: `%s'"
294 LaTeX-beamer-inner-themes))))
298 (defun LaTeX-arg-beamer-outer-theme (&rest ignore)
299 "Prompt for beamer outer theme with completion."
302 (TeX-argument-prompt nil nil "Theme")
304 (cond ((eq LaTeX-beamer-outer-themes 'local)
305 (set (make-local-variable 'LaTeX-beamer-outer-themes)
306 (LaTeX-beamer-search-themes "^beameroutertheme")))
307 ((functionp LaTeX-beamer-outer-themes)
308 (funcall LaTeX-beamer-outer-themes))
309 ((listp LaTeX-beamer-outer-themes)
310 LaTeX-beamer-outer-themes)
312 "`LaTeX-beamer-outer-themes' should be a list: `%s'"
313 LaTeX-beamer-outer-themes))))
317 (defun LaTeX-arg-beamer-color-theme (&rest ignore)
318 "Prompt for beamer color theme with completion."
321 (TeX-argument-prompt nil nil "Theme")
323 (cond ((eq LaTeX-beamer-color-themes 'local)
324 (set (make-local-variable 'LaTeX-beamer-color-themes)
325 (LaTeX-beamer-search-themes "^beamercolortheme")))
326 ((functionp LaTeX-beamer-color-themes)
327 (funcall LaTeX-beamer-color-themes))
328 ((listp LaTeX-beamer-color-themes)
329 LaTeX-beamer-color-themes)
331 "`LaTeX-beamer-color-themes' should be a list: `%s'"
332 LaTeX-beamer-color-themes))))
336 (defun LaTeX-arg-beamer-font-theme (&rest ignore)
337 "Prompt for beamer font theme with completion."
340 (TeX-argument-prompt nil nil "Theme")
342 (cond ((eq LaTeX-beamer-font-themes 'local)
343 (set (make-local-variable 'LaTeX-beamer-font-themes)
344 (LaTeX-beamer-search-themes "^beamerfonttheme")))
345 ((functionp LaTeX-beamer-font-themes)
346 (funcall LaTeX-beamer-font-themes))
347 ((listp LaTeX-beamer-font-themes)
348 LaTeX-beamer-font-themes)
350 "`LaTeX-beamer-font-themes' should be a list: `%s'"
351 LaTeX-beamer-font-themes))))
355 (defun LaTeX-beamer-class-options ()
356 "Read the beamer class options from the user."
357 (TeX-read-key-val t '(("usepdftitle" ("false")) ("envcountsect")
358 ("notheorems") ("noamsthm") ("compress") ("t") ("c")
359 ("leqno") ("fleqn") ("handout") ("trans") ("pdftex")
360 ("nativepdf") ("pdfmark") ("dvips") ("dviwindo")
361 ("dvipsone") ("vtex") ("ps2pdf") ("ignorenonframetext")
362 ("noamssymb") ("bigger") ("smaller") ("8pt") ("9pt")
363 ("10pt") ("11pt") ("12pt") ("14pt") ("17pt") ("20pt")
364 ("draft") ("CJK") ("cjk") ("pgf")
365 ("hyperref" LaTeX-hyperref-package-options-list)
366 ("color") ("xcolor") ("ucs") ("utf8x") ("utf8")
367 ("aspectratio" ("1610" "169" "149" "54" "43" "32")))))
369 ;;; beamer.el ends here