Initial Commit
[packages] / xemacs-packages / auctex / style / beamer.el
1 ;;; beamer.el --- AUCTeX style for the latex-beamer class
2
3 ;; Copyright (C) 2003, 2004, 2005, 2008, 2013 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 (defvar LaTeX-beamer-frametitle-history nil
55   "History of frame titles in beamer.")
56
57 (TeX-add-style-hook
58  "beamer"
59  (lambda ()
60    (add-hook 'LaTeX-after-insert-env-hooks 'LaTeX-beamer-after-insert-env nil t)
61
62    (TeX-run-style-hooks "amsmath" "amssymb" "amsthm" "color" "geometry"
63                         "hyperref" "inputenc" "translator" "xcolor")
64
65    (unless LaTeX-beamer-section-labels-flag
66      (make-local-variable 'LaTeX-section-hook)
67      (setq LaTeX-section-hook
68            '(LaTeX-section-heading
69              LaTeX-section-title
70              LaTeX-section-section)))
71
72    (setq LaTeX-item-list
73          (append '(("itemize" . LaTeX-item-beamer)
74                    ("enumerate" . LaTeX-item-beamer))
75                  LaTeX-item-list))
76
77    (setq LaTeX-default-document-environment "frame")
78
79    (LaTeX-paragraph-commands-add-locally "frametitle")
80
81    (TeX-add-symbols
82     '("alert" 1)
83     '("alt" TeX-arg-beamer-overlay-spec 2)
84     '("beamerbutton" 1)
85     '("beamergotobutton" 1)
86     '("beamerreturnbutton" 1)
87     '("beamerskipbutton" 1)
88     '("frame" TeX-arg-beamer-frametitle)
89     '("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)
105     '("institute" 1)
106     '("invisible" TeX-arg-beamer-overlay-spec 1)
107     '("label" TeX-arg-beamer-overlay-spec 1)
108     '("logo" 1)
109     '("note" TeX-arg-beamer-note 1)
110     '("only" TeX-arg-beamer-overlay-spec 1)
111     '("onslide" TeX-arg-beamer-overlay-spec)
112     '("partpage")
113     '("pause")
114     '("structure" TeX-arg-beamer-overlay-spec 1)
115     '("temporal" TeX-arg-beamer-overlay-spec 3)
116     '("titlepage")
117     '("titlegraphic" 1)
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))
126
127    (LaTeX-add-environments
128     '("actionenv")
129     '("alertblock" 1)
130     '("beamerboxesrounded" 1)
131     '("block" (lambda (env &rest ignore)
132                 (LaTeX-insert-environment
133                  env (format "{%s}" (read-string "Title: ")))))
134     '("column" "Width")
135     "columns"
136     "columnsonlytextwidth"
137     '("exampleblock" 1)
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))
143                      (save-excursion
144                        (LaTeX-find-matching-begin)
145                        (end-of-line)
146                        (LaTeX-newline)
147                        (insert (format "\\frametitle{%s}" title))
148                        ;; This works because \frametitle is a
149                        ;; paragraph command.
150                        (backward-char)
151                        (LaTeX-fill-paragraph))))))
152     '("onlyenv" (lambda (env &rest ignore)
153                   (LaTeX-insert-environment
154                    env
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
161                       env
162                       (let ((width (read-string "(Optional) Area width: ")))
163                         (unless (zerop (length width))
164                           (format "[%s]" width))))))
165     "semiverbatim")
166
167    (LaTeX-largest-level-set "section")
168    (LaTeX-add-counters "lecture" "part" "section" "subsection" "subsubsection"
169                        "subsectionslide" "framenumber" "figure" "table"
170                        "beamerpauses")
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")
178
179    ;; Fontification
180    (when (and (featurep 'font-latex)
181               (eq TeX-install-font-lock 'font-latex-setup))
182      (font-latex-add-keywords '(("title" "[{")
183                                 ("author" "[{")
184                                 ("date" "[{")
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)))
191  LaTeX-dialect)
192
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)))
199
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))))
207
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
213 unconditionally."
214   (if (listp current-prefix-arg)
215       (setq current-prefix-arg (car current-prefix-arg))
216     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))
221   (insert " ")
222   (indent-according-to-mode))
223
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)))
233
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)
242                        length)
243                       ((stringp length)
244                        (string-width length))
245                       ;; Try some DWIM magic...
246                       ((and (not length)
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
252      (delete nil
253              (mapcar
254               (lambda (file)
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))))))
259
260 (defun LaTeX-arg-beamer-theme (&rest ignore)
261   "Prompt for beamer theme with completion."
262   (TeX-argument-insert
263    (completing-read
264     (TeX-argument-prompt nil nil "Theme")
265     (mapcar 'list
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)
272                    LaTeX-beamer-themes)
273                   (t (error
274                       "`LaTeX-beamer-themes' should be a list: `%s'"
275                       LaTeX-beamer-themes))))
276     nil nil nil)
277    t))
278
279 (defun LaTeX-arg-beamer-inner-theme (&rest ignore)
280   "Prompt for beamer inner theme with completion."
281   (TeX-argument-insert
282    (completing-read
283     (TeX-argument-prompt nil nil "Theme")
284     (mapcar 'list
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)
292                   (t (error
293                       "`LaTeX-beamer-inner-themes' should be a list: `%s'"
294                       LaTeX-beamer-inner-themes))))
295     nil nil nil)
296    t))
297
298 (defun LaTeX-arg-beamer-outer-theme (&rest ignore)
299   "Prompt for beamer outer theme with completion."
300   (TeX-argument-insert
301    (completing-read
302     (TeX-argument-prompt nil nil "Theme")
303     (mapcar 'list
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)
311                   (t (error
312                       "`LaTeX-beamer-outer-themes' should be a list: `%s'"
313                       LaTeX-beamer-outer-themes))))
314     nil nil nil)
315    t))
316
317 (defun LaTeX-arg-beamer-color-theme (&rest ignore)
318   "Prompt for beamer color theme with completion."
319   (TeX-argument-insert
320    (completing-read
321     (TeX-argument-prompt nil nil "Theme")
322     (mapcar 'list
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)
330                   (t (error
331                       "`LaTeX-beamer-color-themes' should be a list: `%s'"
332                       LaTeX-beamer-color-themes))))
333     nil nil nil)
334    t))
335
336 (defun LaTeX-arg-beamer-font-theme (&rest ignore)
337   "Prompt for beamer font theme with completion."
338   (TeX-argument-insert
339    (completing-read
340     (TeX-argument-prompt nil nil "Theme")
341     (mapcar 'list
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)
349                   (t (error
350                       "`LaTeX-beamer-font-themes' should be a list: `%s'"
351                       LaTeX-beamer-font-themes))))
352     nil nil nil)
353    t))
354
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")))))
368
369 ;;; beamer.el ends here