EasyPG 1.07 Released
[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-2016 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 TeX-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" ["Slide number"])
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}" (TeX-read-string "Title: ")))))
134     '("column" "Width")
135     "columns"
136     "columnsonlytextwidth"
137     '("exampleblock" 1)
138     '("frame"  (lambda (env &rest ignore)
139                  (let ((title (TeX-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 (TeX-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 (TeX-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    (add-to-list (make-local-variable 'LaTeX-indent-environment-list)
173                 '("semiverbatim" current-indentation) t)
174    (add-to-list 'LaTeX-verbatim-environments-local "semiverbatim")
175
176    ;; Fontification
177    (when (and (featurep 'font-latex)
178               (eq TeX-install-font-lock 'font-latex-setup))
179      (font-latex-add-keywords '(("title" "[{")
180                                 ("subtitle" "[{")
181                                 ("author" "[{")
182                                 ("date" "[{")
183                                 ("frametitle" "<[{")) 'slide-title)
184      (font-latex-update-font-lock t)))
185  LaTeX-dialect)
186
187 (defun TeX-arg-beamer-overlay-spec (_optional &optional _prompt)
188   "Prompt for overlay specification."
189   (let ((overlay (TeX-read-string "(Optional) Overlay: ")))
190     (unless (zerop (length overlay))
191       (insert "<" overlay ">"))
192     (indent-according-to-mode)))
193
194 (defun TeX-arg-beamer-frametitle (_optional &optional _prompt)
195   "Prompt for the frametitle."
196   (let ((title (TeX-read-string "Title: " nil 'LaTeX-beamer-frametitle-history)))
197     (if (not (zerop (length title)))
198         (insert TeX-grop TeX-esc "frametitle" TeX-grop
199                 title TeX-grcl TeX-grcl)
200       (insert TeX-grop TeX-grcl))))
201
202 (defun LaTeX-item-beamer ()
203   "Insert a new item with an optional overlay argument. You
204 can turn off the prompt for the overlay argument by setting
205 `LaTeX-beamer-item-overlay-flag' to nil. Calling the function
206 with a prefix argument prompts for the overlay specification
207 unconditionally."
208   (if (listp current-prefix-arg)
209       (setq current-prefix-arg (car current-prefix-arg))
210     current-prefix-arg)
211   (TeX-insert-macro "item")
212   (delete-horizontal-space)
213   (if (or current-prefix-arg LaTeX-beamer-item-overlay-flag)
214       (TeX-arg-beamer-overlay-spec 0))
215   (insert " ")
216   (indent-according-to-mode))
217
218 (defun TeX-arg-beamer-note (_optional &optional _prompt)
219   "Prompt for overlay specification and optional argument."
220   (let ((overlay (TeX-read-string "(Optional) Overlay: "))
221         (options (TeX-read-string "(Optional) Options: ")))
222     (unless (zerop (length overlay))
223       (insert "<" overlay ">"))
224     (unless (zerop (length options))
225       (insert "[" options "]"))
226     (indent-according-to-mode)))
227
228 (defun LaTeX-beamer-search-themes (&optional regexp extensions length)
229   "Search for beamer themes matching REGEXP with EXTENSIONS.
230 The function removes the first LENGTH characters and the
231 extension of the file and returns a list of strings.  LENGTH may
232 also be a string.  Then the length of the string is used."
233   (let* ((match (or regexp "^beamertheme[A-Z]"))
234          (exts  (or extensions '("tex" "sty")))
235          (chars (cond ((integerp length)
236                        length)
237                       ((stringp length)
238                        (string-width length))
239                       ;; Try some DWIM magic...
240                       ((and (not length)
241                             (string-match "beamer[A-Za-z0-9]*theme" match))
242                        (- (match-end 0) (match-beginning 0)))
243                       (t (error "Invalid length: `%s'" length)))))
244     ;; (message "match=`%s' chars=`%s'" match chars)
245     (TeX-delete-duplicate-strings
246      (delete nil
247              (mapcar
248               (lambda (file)
249                 (let ((case-fold-search nil))
250                   (and (numberp (string-match match file))
251                        (substring file chars))))
252               (TeX-search-files nil exts t t))))))
253
254 (defun LaTeX-arg-beamer-theme (&rest _ignore)
255   "Prompt for beamer theme with completion."
256   (TeX-argument-insert
257    (completing-read
258     (TeX-argument-prompt nil nil "Theme")
259     (mapcar 'list
260             (cond ((eq LaTeX-beamer-themes 'local)
261                    (set (make-local-variable 'LaTeX-beamer-themes)
262                         (LaTeX-beamer-search-themes)))
263                   ((functionp LaTeX-beamer-themes)
264                    (funcall LaTeX-beamer-themes))
265                   ((listp LaTeX-beamer-themes)
266                    LaTeX-beamer-themes)
267                   (t (error
268                       "`LaTeX-beamer-themes' should be a list: `%s'"
269                       LaTeX-beamer-themes))))
270     nil nil nil)
271    t))
272
273 (defun LaTeX-arg-beamer-inner-theme (&rest _ignore)
274   "Prompt for beamer inner theme with completion."
275   (TeX-argument-insert
276    (completing-read
277     (TeX-argument-prompt nil nil "Theme")
278     (mapcar 'list
279             (cond ((eq LaTeX-beamer-inner-themes 'local)
280                    (set (make-local-variable 'LaTeX-beamer-inner-themes)
281                         (LaTeX-beamer-search-themes "^beamerinnertheme")))
282                   ((functionp LaTeX-beamer-inner-themes)
283                    (funcall LaTeX-beamer-inner-themes))
284                   ((listp LaTeX-beamer-inner-themes)
285                    LaTeX-beamer-inner-themes)
286                   (t (error
287                       "`LaTeX-beamer-inner-themes' should be a list: `%s'"
288                       LaTeX-beamer-inner-themes))))
289     nil nil nil)
290    t))
291
292 (defun LaTeX-arg-beamer-outer-theme (&rest _ignore)
293   "Prompt for beamer outer theme with completion."
294   (TeX-argument-insert
295    (completing-read
296     (TeX-argument-prompt nil nil "Theme")
297     (mapcar 'list
298             (cond ((eq LaTeX-beamer-outer-themes 'local)
299                    (set (make-local-variable 'LaTeX-beamer-outer-themes)
300                         (LaTeX-beamer-search-themes "^beameroutertheme")))
301                   ((functionp LaTeX-beamer-outer-themes)
302                    (funcall LaTeX-beamer-outer-themes))
303                   ((listp LaTeX-beamer-outer-themes)
304                    LaTeX-beamer-outer-themes)
305                   (t (error
306                       "`LaTeX-beamer-outer-themes' should be a list: `%s'"
307                       LaTeX-beamer-outer-themes))))
308     nil nil nil)
309    t))
310
311 (defun LaTeX-arg-beamer-color-theme (&rest _ignore)
312   "Prompt for beamer color theme with completion."
313   (TeX-argument-insert
314    (completing-read
315     (TeX-argument-prompt nil nil "Theme")
316     (mapcar 'list
317             (cond ((eq LaTeX-beamer-color-themes 'local)
318                    (set (make-local-variable 'LaTeX-beamer-color-themes)
319                         (LaTeX-beamer-search-themes "^beamercolortheme")))
320                   ((functionp LaTeX-beamer-color-themes)
321                    (funcall LaTeX-beamer-color-themes))
322                   ((listp LaTeX-beamer-color-themes)
323                    LaTeX-beamer-color-themes)
324                   (t (error
325                       "`LaTeX-beamer-color-themes' should be a list: `%s'"
326                       LaTeX-beamer-color-themes))))
327     nil nil nil)
328    t))
329
330 (defun LaTeX-arg-beamer-font-theme (&rest _ignore)
331   "Prompt for beamer font theme with completion."
332   (TeX-argument-insert
333    (completing-read
334     (TeX-argument-prompt nil nil "Theme")
335     (mapcar 'list
336             (cond ((eq LaTeX-beamer-font-themes 'local)
337                    (set (make-local-variable 'LaTeX-beamer-font-themes)
338                         (LaTeX-beamer-search-themes "^beamerfonttheme")))
339                   ((functionp LaTeX-beamer-font-themes)
340                    (funcall LaTeX-beamer-font-themes))
341                   ((listp LaTeX-beamer-font-themes)
342                    LaTeX-beamer-font-themes)
343                   (t (error
344                       "`LaTeX-beamer-font-themes' should be a list: `%s'"
345                       LaTeX-beamer-font-themes))))
346     nil nil nil)
347    t))
348
349 (defun LaTeX-beamer-class-options ()
350   "Read the beamer class options from the user."
351   (TeX-read-key-val t '(("usepdftitle" ("false")) ("envcountsect")
352                         ("notheorems") ("noamsthm") ("compress") ("t") ("c")
353                         ("leqno") ("fleqn") ("handout") ("trans") ("pdftex")
354                         ("nativepdf") ("pdfmark") ("dvips") ("dviwindo")
355                         ("dvipsone") ("vtex") ("ps2pdf") ("ignorenonframetext")
356                         ("noamssymb") ("bigger") ("smaller") ("8pt") ("9pt")
357                         ("10pt") ("11pt") ("12pt") ("14pt") ("17pt") ("20pt")
358                         ("draft") ("CJK") ("cjk") ("pgf")
359                         ("hyperref" LaTeX-hyperref-package-options-list)
360                         ("color") ("xcolor") ("ucs") ("utf8x") ("utf8")
361                         ("aspectratio" ("1610" "169" "149" "54" "43" "32")))))
362
363 ;;; beamer.el ends here