X-Git-Url: https://code.delx.au/gnu-emacs-elpa/blobdiff_plain/108d6d47a903cff5d7ac7d83f126dda209c3eeb2..b717b0ee04ffdfd6c44c24cec77ef464fa8d4b95:/packages/auctex/style/beamer.el diff --git a/packages/auctex/style/beamer.el b/packages/auctex/style/beamer.el new file mode 100644 index 000000000..7b911cd4b --- /dev/null +++ b/packages/auctex/style/beamer.el @@ -0,0 +1,334 @@ +;;; beamer.el --- AUCTeX style for the latex-beamer class + +;; Copyright (C) 2003, 2004, 2005,2008 Free Software Foundation + +;; Author: Thomas Baumann +;; Created: 2003-12-20 +;; Keywords: tex + +;; This file is part of AUCTeX. + +;; AUCTeX is free software; you can redistribute it and/or modify it +;; under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 3, or (at your option) +;; any later version. + +;; AUCTeX is distributed in the hope that it will be useful, but +;; WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +;; General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with AUCTeX; see the file COPYING. If not, write to the Free +;; Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +;; 02110-1301, USA. + +;;; Commentary: + +;; This file adds support for the latex-beamer class. + +;;; Code: + +(defun LaTeX-beamer-after-insert-env (env start end) + "Do beamer-specific stuff after the insertion of an environment." + ;; Add `fragile' as an optional argument to the frame environment if + ;; a verbatim environment is inserted. + (when (and (TeX-member env (LaTeX-verbatim-environments) 'string-equal) + (save-excursion + (goto-char start) + (string-equal (LaTeX-current-environment) "frame"))) + (save-excursion + (when (re-search-backward "\\\\begin[ \t]*{frame}" nil t) + (let ((end-of-begin (match-end 0))) + (goto-char end-of-begin) + (while (forward-comment 1)) + (if (eq (char-after) (string-to-char LaTeX-optop)) + (progn + (forward-char) + (insert "fragile") + (unless (looking-at (concat "[ \t]*" LaTeX-optcl)) + (insert ","))) + (goto-char end-of-begin) + (insert "[fragile]"))))))) + +(TeX-add-style-hook + "beamer" + (lambda () + (add-hook 'LaTeX-after-insert-env-hooks 'LaTeX-beamer-after-insert-env nil t) + + (unless LaTeX-beamer-section-labels-flag + (make-local-variable 'LaTeX-section-hook) + (setq LaTeX-section-hook + '(LaTeX-section-heading + LaTeX-section-title + LaTeX-section-section))) + + (setq LaTeX-item-list + (append '(("itemize" . LaTeX-item-beamer) + ("enumerate" . LaTeX-item-beamer)) + LaTeX-item-list)) + + (LaTeX-paragraph-commands-add-locally "frametitle") + + (TeX-add-symbols + '("alert" 1) + '("alt" TeX-arg-beamer-overlay-spec 2) + '("beamerbutton" 1) + '("beamergotobutton" 1) + '("beamerreturnbutton" 1) + '("beamerskipbutton" 1) + '("frame" TeX-arg-beamer-frametitle) + '("frametitle" 1) + '("hyperlink" TeX-arg-beamer-overlay-spec 2) + '("hyperlinkslideprev" TeX-arg-beamer-overlay-spec 1) + '("hyperlinkslidenext" TeX-arg-beamer-overlay-spec 1) + '("hyperlinkframestart" TeX-arg-beamer-overlay-spec 1) + '("hyperlinkframeend" TeX-arg-beamer-overlay-spec 1) + '("hyperlinkframestartnext" TeX-arg-beamer-overlay-spec 1) + '("hyperlinkframeendprev" TeX-arg-beamer-overlay-spec 1) + '("hyperlinkpresentationstart" TeX-arg-beamer-overlay-spec 1) + '("hyperlinkpresentationend" TeX-arg-beamer-overlay-spec 1) + '("hyperlinkappendixstart" TeX-arg-beamer-overlay-spec 1) + '("hyperlinkappendixend" TeX-arg-beamer-overlay-spec 1) + '("hyperlinkdocumentstart" TeX-arg-beamer-overlay-spec 1) + '("hyperlinkdocumentend" TeX-arg-beamer-overlay-spec 1) + '("hypertarget" TeX-arg-beamer-overlay-spec 2) + '("institute" 1) + '("invisible" TeX-arg-beamer-overlay-spec 1) + '("label" TeX-arg-beamer-overlay-spec 1) + '("logo" 1) + '("note" TeX-arg-beamer-note 1) + '("only" TeX-arg-beamer-overlay-spec 1) + '("onslide" TeX-arg-beamer-overlay-spec) + '("partpage") + '("pause") + '("structure" TeX-arg-beamer-overlay-spec 1) + '("temporal" TeX-arg-beamer-overlay-spec 3) + '("titlepage") + '("titlegraphic" 1) + '("uncover" TeX-arg-beamer-overlay-spec 1) + '("usetheme" LaTeX-arg-beamer-theme) + '("useinnertheme" LaTeX-arg-beamer-inner-theme) + '("useoutertheme" LaTeX-arg-beamer-outer-theme) + '("usecolortheme" LaTeX-arg-beamer-color-theme) + '("usefonttheme" LaTeX-arg-beamer-font-theme) + '("usetheme" LaTeX-arg-beamer-theme) + '("visible" TeX-arg-beamer-overlay-spec 1)) + + (LaTeX-add-environments + '("actionenv") + '("alertblock" 1) + '("beamerboxesrounded" 1) + '("block" 1) + '("column" "Width") + "columns" + "columnsonlytextwidth" + '("exampleblock" 1) + '("frame" (lambda (env &rest ignore) + (let ((title (read-string "(Optional) Title: "))) + (LaTeX-insert-environment env) + (unless (zerop (length title)) + (save-excursion + (LaTeX-find-matching-begin) + (end-of-line) + (LaTeX-newline) + (insert (format "\\frametitle{%s}" title)) + ;; This works because \frametitle is a + ;; paragraph command. + (backward-char) + (LaTeX-fill-paragraph)))))) + '("onlyenv" (lambda (env &rest ignore) + (LaTeX-insert-environment + env + (let ((overlay (read-string "(Optional) Overlay: "))) + (unless (zerop (length overlay)) + (format "<%s>" overlay)))))) + '("overlayarea" "Area width" "Area height") + '("overprint" (lambda (env &rest ignore) + (LaTeX-insert-environment + env + (let ((width (read-string "(Optional) Area width: "))) + (unless (zerop (length width)) + (format "[%s]" width)))))) + "semiverbatim") + + (make-local-variable 'LaTeX-indent-environment-list) + (add-to-list 'LaTeX-indent-environment-list + '("semiverbatim" current-indentation)) + (make-local-variable 'LaTeX-verbatim-regexp) + (setq LaTeX-verbatim-regexp (concat LaTeX-verbatim-regexp "\\|semiverbatim")) + (add-to-list 'LaTeX-verbatim-environments-local "semiverbatim") + + ;; Fontification + (when (and (featurep 'font-latex) + (eq TeX-install-font-lock 'font-latex-setup)) + (font-latex-add-keywords '(("frametitle" "<[{")) 'slide-title) + ;; For syntactic fontification, e.g. verbatim constructs. + (font-latex-set-syntactic-keywords) + ;; Tell font-lock about the update. + (setq font-lock-set-defaults nil) + (font-lock-set-defaults)))) + +(defun TeX-arg-beamer-overlay-spec (optional &optional prompt) + "Prompt for overlay specification." + (let ((overlay (read-string "(Optional) Overlay: "))) + (unless (zerop (length overlay)) + (insert "<" overlay ">")) + (indent-according-to-mode))) + +(defun TeX-arg-beamer-frametitle (optional &optional prompt) + "Prompt for the frametitle." + (let ((title (read-string "Title: "))) + (if (not (zerop (length title))) + (insert TeX-grop TeX-esc "frametitle" TeX-grop + title TeX-grcl TeX-grcl) + (insert TeX-grop TeX-grcl)))) + +(defun LaTeX-item-beamer () + "Insert a new item with an optional overlay argument. You +can turn off the prompt for the overlay argument by setting +`LaTeX-beamer-item-overlay-flag' to nil. Calling the function +with a prefix argument prompts for the overlay specification +unconditionally." + (if (listp current-prefix-arg) + (setq current-prefix-arg (car current-prefix-arg)) + current-prefix-arg) + (TeX-insert-macro "item") + (delete-horizontal-space) + (if (or current-prefix-arg LaTeX-beamer-item-overlay-flag) + (TeX-arg-beamer-overlay-spec 0)) + (insert " ") + (indent-according-to-mode)) + +(defun TeX-arg-beamer-note (optional &optional prompt) + "Prompt for overlay specification and optional argument." + (let ((overlay (read-string "(Optional) Overlay: ")) + (options (read-string "(Optional) Options: "))) + (unless (zerop (length overlay)) + (insert "<" overlay ">")) + (unless (zerop (length options)) + (insert "[" options "]")) + (indent-according-to-mode))) + +(defun LaTeX-beamer-search-themes (&optional regexp extensions length) + "Search for beamer themes matching REGEXP with EXTENSIONS. +The function removes the first LENGTH characters and the +extension of the file and returns a list of strings. LENGTH may +also be a string. Then the length of the string is used." + (let* ((match (or regexp "^beamertheme[A-Z]")) + (exts (or extensions '("tex" "sty"))) + (chars (cond ((integerp length) + length) + ((stringp length) + (string-width length)) + ;; Try some DWIM magic... + ((and (not length) + (string-match "beamer[A-Za-z0-9]*theme" match)) + (- (match-end 0) (match-beginning 0))) + (t (error "Invalid length: `%s'" length))))) + ;; (message "match=`%s' chars=`%s'" match chars) + (TeX-delete-duplicate-strings + (delete nil + (mapcar + (lambda (file) + (let ((case-fold-search nil)) + (and (numberp (string-match match file)) + (substring file chars)))) + (TeX-search-files nil exts t t)))))) + +(defun LaTeX-arg-beamer-theme (&rest ignore) + "Prompt for beamer theme with completion." + (TeX-argument-insert + (completing-read + (TeX-argument-prompt nil nil "Theme") + (mapcar 'list + (cond ((eq LaTeX-beamer-themes 'local) + (set (make-local-variable 'LaTeX-beamer-themes) + (LaTeX-beamer-search-themes))) + ((functionp LaTeX-beamer-themes) + (funcall LaTeX-beamer-themes)) + ((listp LaTeX-beamer-themes) + LaTeX-beamer-themes) + (t (error + "`LaTeX-beamer-themes' should be a list: `%s'" + LaTeX-beamer-themes)))) + nil nil nil) + t)) + +(defun LaTeX-arg-beamer-inner-theme (&rest ignore) + "Prompt for beamer inner theme with completion." + (TeX-argument-insert + (completing-read + (TeX-argument-prompt nil nil "Theme") + (mapcar 'list + (cond ((eq LaTeX-beamer-inner-themes 'local) + (set (make-local-variable 'LaTeX-beamer-inner-themes) + (LaTeX-beamer-search-themes "^beamerinnertheme"))) + ((functionp LaTeX-beamer-inner-themes) + (funcall LaTeX-beamer-inner-themes)) + ((listp LaTeX-beamer-inner-themes) + LaTeX-beamer-inner-themes) + (t (error + "`LaTeX-beamer-inner-themes' should be a list: `%s'" + LaTeX-beamer-inner-themes)))) + nil nil nil) + t)) + +(defun LaTeX-arg-beamer-outer-theme (&rest ignore) + "Prompt for beamer outer theme with completion." + (TeX-argument-insert + (completing-read + (TeX-argument-prompt nil nil "Theme") + (mapcar 'list + (cond ((eq LaTeX-beamer-outer-themes 'local) + (set (make-local-variable 'LaTeX-beamer-outer-themes) + (LaTeX-beamer-search-themes "^beameroutertheme"))) + ((functionp LaTeX-beamer-outer-themes) + (funcall LaTeX-beamer-outer-themes)) + ((listp LaTeX-beamer-outer-themes) + LaTeX-beamer-outer-themes) + (t (error + "`LaTeX-beamer-outer-themes' should be a list: `%s'" + LaTeX-beamer-outer-themes)))) + nil nil nil) + t)) + +(defun LaTeX-arg-beamer-color-theme (&rest ignore) + "Prompt for beamer color theme with completion." + (TeX-argument-insert + (completing-read + (TeX-argument-prompt nil nil "Theme") + (mapcar 'list + (cond ((eq LaTeX-beamer-color-themes 'local) + (set (make-local-variable 'LaTeX-beamer-color-themes) + (LaTeX-beamer-search-themes "^beamercolortheme"))) + ((functionp LaTeX-beamer-color-themes) + (funcall LaTeX-beamer-color-themes)) + ((listp LaTeX-beamer-color-themes) + LaTeX-beamer-color-themes) + (t (error + "`LaTeX-beamer-color-themes' should be a list: `%s'" + LaTeX-beamer-color-themes)))) + nil nil nil) + t)) + +(defun LaTeX-arg-beamer-font-theme (&rest ignore) + "Prompt for beamer font theme with completion." + (TeX-argument-insert + (completing-read + (TeX-argument-prompt nil nil "Theme") + (mapcar 'list + (cond ((eq LaTeX-beamer-font-themes 'local) + (set (make-local-variable 'LaTeX-beamer-font-themes) + (LaTeX-beamer-search-themes "^beamerfonttheme"))) + ((functionp LaTeX-beamer-font-themes) + (funcall LaTeX-beamer-font-themes)) + ((listp LaTeX-beamer-font-themes) + LaTeX-beamer-font-themes) + (t (error + "`LaTeX-beamer-font-themes' should be a list: `%s'" + LaTeX-beamer-font-themes)))) + nil nil nil) + t)) + +;;; beamer.el ends here