branch: elpa/cdlatex commit aa298afc87f848806e5ea99b6f59b23c158dfa90 Author: Carsten Dominik <carsten.domi...@gmail.com> Commit: Carsten Dominik <carsten.domi...@gmail.com>
Initial commit --- cdlatex.el | 2166 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 2166 insertions(+) diff --git a/cdlatex.el b/cdlatex.el new file mode 100644 index 0000000000..c75b6aef9e --- /dev/null +++ b/cdlatex.el @@ -0,0 +1,2166 @@ +;;; cdlatex.el -- Fast input methods for LaTeX environments and math +;; Copyright (c) 1995, 1996, 1997, 2003, 2005 Carsten Dominik +;; +;; Author: Carsten Dominik <domi...@science.uva.nl> +;; Keywords: tex +;; Version: 4.3 +;; +;; This file is not part of GNU Emacs +;; +;; This program 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 2 of the License, or (at your option) +;; any later version. +;; +;; This program 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 GNU Emacs. If you did not, write to the Free Software Foundation, +;; Inc., 675 Mass Ave., Cambridge, MA 02139, USA. +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;; Commentary: +;; +;; CDLaTeX is a minor mode supporting fast insertion of environment +;; templates and math stuff in LaTeX. +;; +;; INSTALLATION +;; +;; In order to make the command `cdlatex-mode' work, you need to put the +;; file cdlatex.el on your load path (you should compile it) and put +;; this in you .emacs file: +;; +;; (autoload 'cdlatex-mode "cdlatex" "CDLaTeX Mode" t) +;; (autoload 'turn-on-cdlatex "cdlatex" "CDLaTeX Mode" nil) +;; +;; To turn CDLaTeX Minor Mode on and off in a particular buffer, use +;; `M-x cdlatex-mode'. +;; +;; To turn on CDLaTeX Minor Mode for all LaTeX files, add one of the +;; following lines to your .emacs file: +;; +;; (add-hook 'LaTeX-mode-hook 'turn-on-cdlatex) ; with AUCTeX LaTeX mode +;; (add-hook 'latex-mode-hook 'turn-on-cdlatex) ; with Emacs latex mode +;; +;; For key bindings, see further down in this documentation. +;; +;; CDLaTeX requires texmathp.el which is distributed with AUCTeX. +;; Starting with Emacs 21.3, texmathp.el will be part of Emacs. +;; +;;-------------------------------------------------------------------------- +;; +;; OVERVIEW +;; ======== +;; +;; CDLaTeX is a minor mode supporting mainly mathematical and scientific +;; text development with LaTeX. CDLaTeX is really about speed. AUCTeX +;; (the major mode I recommend for editing LaTeX files) does have a hook +;; based system for inserting environments and macros - but while this is +;; useful and general, it is sometimes slow to use. CDLaTeX tries to be +;; quick, with very few and easy to remember keys, and intelligent +;; on-the-fly help. +;; +;; 1. ABBREVIATIONS. +;; ------------- +;; CDLaTeX has an abbrev-like mechanism to insert full LaTeX +;; environments and other templates into the buffer. Abbreviation +;; expansion is triggered with the TAB key only, not with SPC or RET. +;; For example, typing "ite<TAB>" inserts an itemize environment. A +;; full list of defined abbreviations is available with the command +;; `C-c ?' (`cdlatex-command-help'). +;; +;; 1a. ENVIRONMENT TEMPLATES +;; --------------------- +;; Typing `C-c {' (`cdlatex-environment') uses the minibuffer to +;; complete the name of a LaTeX environment and inserts a template +;; for this environment into the buffer. These environment +;; templates also contain labels created with RefTeX. In a +;; template, text needs to be filled in at various places, which we +;; call "points of interest". You can use the TAB key to jump to +;; the next point of interest in the template. +;; +;; For many frequently used LaTeX environments, abbreviations are +;; available. Most of the time, the abbreviation consists of the +;; first three letters of the environment name: `equ<TAB>' expands +;; into +;; \begin{equation} +;; \label{eq:1} +;; +;; \end{equation} +;; +;; Similarly, `ali<TAB>' inserts an AMS-LaTeX align environment +;; template etc. For a full list of environment abbreviations, use +;; `C-c ?'. +;; +;; Use the command `C-c -' (`cdlatex-item') to insert a generalized +;; new "item" in any "list"-like environment. For example, in an +;; itemize environment, this inserts "\item", in an enumerate +;; environment it inserts "\item\label{item:25}" and in an eqnarray +;; environment, it inserts "\label{eq:25} \n & &". When +;; appropriate, newlines are inserted, and the previous item is also +;; closed with "\\". `cdlatex-item' can also be invoked with the +;; abbreviation "it<TAB>". +;; +;; 1b. MATH TEMPLATES +;; -------------- +;; Abbreviations are also used to insert simple math templates +;; into the buffer. The cursor will be positioned properly. For +;; example, typing `fr<TAB>' will insert "\frac{}{}" with the +;; cursor in the first pair of parenthesis. Typing `lr(<TAB>' +;; will insert a "\left( \right)" pair and position the cursor in +;; between, etc. Again, the TAB key can be used to jump to the +;; points in the template where additional text has to be +;; inserted. For example in the `\frac{}{}' template, it will +;; move you from the first argument to the second and then out of +;; the second. For a list of available templates, type `C-c ?'. +;; +;; 2. MATHEMATICAL SYMBOLS +;; -------------------- +;; This feature is similar to the functionality in the Math minor mode +;; of AUCTeX, and to the input methods of the X-Symbol package. It is +;; introduced by the backquote character. Backquote followed by any +;; character inserts a LaTeX math macro into the buffer. If +;; necessary, a pair of "$" is inserted to switch to math mode. For +;; example, typing "`a" inserts "$\alpha$". Since LaTeX defines many +;; more mathematical symbols than the alphabet has letters, different +;; sets of math macros are provided. We call the different sets +;; "levels". On each level, another LaTeX macro is assigned to a +;; given letter. To select the different levels, simply press the +;; backquote character several times before pressing the letter. For +;; example, typing "`d" inserts "\delta" (level 1), and typing "``d" +;; inserts "\partial" (level 2). Similarly, "`e" inserts "\epsilon" +;; and "``e" inserts "\vareppsilon". +;; +;; On each level, on-thy-fly help will pop up automatically if you +;; hesitate to press the next key. The help screen is a window which +;; lists all math macros available on the current level. Initially, +;; when you type slowly, this window will pop up each time you press +;; backquote. However, after you have learned the different keys, you +;; will type more quickly and the help window is not shown. Try it +;; out: First press "`" (backquote), wait for the help window and then +;; press "a" to get "\alpha". Then press "`" and "b" as a quick +;; sequence to get "\beta", without the help window. +;; +;; The LaTeX macros available through this mechanism are fully +;; configurable - see the variable `cdlatex-math-symbol-alist'. +;; +;; 3. ACCENTS AND FONTS +;; ----------------- +;; Putting accents on mathematical characters and/or changing the font +;; of a character uses key combinations with the quote character "'" +;; as a prefix. The accent or font change is applied to the character +;; or LaTeX macro *before* point. For example +;; +;; Keys Result +;; -------------------------------------------------------------------- +;; a'~ ERROR % in text mode +;; $a'~ \tilde{a} % in math mode +;; a': \ddot{a} +;; ab'b \textbf{ab} % in text mode +;; $ab'b a\mathbf{b} % in math mode +;; \alpha'. \dot{\alpha} +;; r_{dust}'r r_\mathrm{dust} % in math mode +;; <SPC> 'e \emph{} +;; this is important M-2 'b this \textbf{is important} +;; +;; As you can see: +;; - using math accents like ~ outside math mode will throw an error. +;; - the font change used automatically adapts to math mode. +;; - if the item before point is a LaTeX macro, the change applies to +;; the whole macro. +;; - in text mode, the change applies to the entire word before point, +;; while in math mode only the last character is modified. +;; - if the character before point is white space, a dollar or an +;; opening parenthesis, this command just opens an empty template +;; and positions the cursor inside. +;; - when a numeric prefix argument is supplied, the command acts on +;; whole words before the cursor. +;; +;; In order to insert a normal quote, you can press the quote +;; character twice. Also, if the key character is not associated with +;; an accent or font, the quote will be inserted. For example, "'t" +;; and "'s" insert just that, so that normal text typing will not be +;; disturbed. Just like during the insertion of math macros (see above +;; under (4.)), automatic on-the-fly help will pop up when you pause +;; after hitting the quote character, but will be suppressed when you +;; continue quickly. The available accents and also the prefix key +;; can be can be configured - see documentation of the variables +;; `cdlatex-math-modify-alist' and `cdlatex-math-modify-prefix'. +;; +;; 4. PAIR INSERTION of (), [], {}, and $$ +;; ------------------------------------ +;; Dollars and parens can be inserted as pairs. When you type the +;; opening delimiter, the closing delimiter will be inserted as well, +;; and the cursor positioned between them. You can configure which +;; delimiter are inserted pairwise by configuring the variable +;; `cdlatex-paired-parens'. +;; +;; Also, the keys `_' and `^' will insert "_{}" and "^{}", +;; respectively, and, if necessary, also a pair of dollar signs to +;; switch to math mode. You can use TAB to exit paired parenthesis. +;; As a special case, when you use TAB to exit a pair of braces that +;; belong to a subscript or superscript, CDLaTeX removes the braces if +;; the sub/superscript consists of a single character. For example +;; typing "$10^3<TAB>" inserts "$10^3$", but typing "$10^34<TAB>" +;; inserts "$10^{34}$" +;; +;; 5. THE OVERLOADED TAB KEY +;; ---------------------- +;; You may have noticed that we use the TAB key for many different +;; purposes in this package. While this may seem confusing, I have +;; gotten used to this very much. Hopefully this will work for you as +;; well: "when in doubt, press TAB". Here is a summary of what happens +;; when you press the TAB key: +;; +;; The function first tries to expand any abbreviation before point. +;; +;; If there is none, it cleans up short subscripts and superscripts at +;; point. I.e., is the cursor is just before the closing brace in +;; "a^{2}", it changes it to "a^2", since this is more readable. If +;; you want to keep the braces also for simple superscripts and +;; subscripts, set the variable `cdlatex-simplify-sub-super-scripts' +;; to nil. +;; +;; After that, the TAB function jumps to the next point of interest in +;; a LaTeX text where one would reasonably expect that more input can +;; be put in. This does *not* use special markers in the template, +;; but a heuristic method which works quite well. For the detailed +;; rules which govern this feature, check the documentation of the +;; function `cdlatex-tab'. +;; +;;----------------------------------------------------------------------------- +;; +;; CONFIGURATION EXAMPLES +;; ====================== +;; +;; Check out the documentation of the variables in the configuration +;; section. The variables must be set before loading CDLaTeX in order to +;; be effective. +;; +;; Here is how you might configure CDLaTeX to provide environment templates +;; (including automatic labels) for two theorem-like environments. +;; +;; (setq cdlatex-env-alist +;; '(("axiom" "\\begin{axiom}\nAUTOLABEL\n?\n\\end{axiom}\n" nil) +;; ("theorem" "\\begin{theorem}\nAUTOLABEL\n?\n\\end{theorem}\n" nil))) +;; +;; The "AUTOLABEL" indicates the place where an automatic label should be +;; inserted, using RefTeX. The question mark defines the position of the +;; cursor after the template has been inserted into the buffer. +;; +;; You could also define your own keyword commands "axm" and "thr" to make +;; the template insertion quicker (e.g. `axm<TAB>' and `thm<TAB>'): +;; +;; (setq cdlatex-command-alist +;; '(("axm" "Insert axiom env" "" cdlatex-environment ("axiom") t nil) +;; ("thr" "Insert theorem env" "" cdlatex-environment ("theorem") t nil))) +;; +;; Here is how to add new math symbols to CDLaTeX's list: In order to put +;; all rightarrow commands onto `>, ``>, ```>, and ````> (i.e. several +;; backquotes followed by >) and all leftarrow commands onto '<, ``<, ```<, +;; and ````<, you could do this in .emacs: +;; +;; (setq cdlatex-math-symbol-alist +;; '((?< ("\\leftarrow" "\\Leftarrow" "\\longleftarrow" "\\Longleftarrow")) +;; (?> ("\\rightarrow" "\\Rightarrow" "\\longrightarrow" "\\Longrightarrow")) +;; )) +;; +;; To change the prefix key for math accents and font switching, you could +;; do something like +;; +;; (setq cdlatex-math-modify-prefix [f7]) +;;----------------------------------------------------------------------------- +;; +;; KEY BINDINGS +;; +;; Here is the default set of keybindings from CDLaTeX. A menu is also +;; installed. +;; +;; $ cdlatex-dollar +;; ( cdlatex-pbb +;; { cdlatex-pbb +;; [ cdlatex-pbb +;; | cdlatex-pbb +;; < cdlatex-pbb +;; ^ cdlatex-sub-superscript +;; _ cdlatex-sub-superscript +;; +;; TAB cdlatex-tab +;; C-c ? cdlatex-command-help +;; C-c { cdlatex-environment +;; C-c - cdlatex-item +;; ` cdlatex-math-symbol +;; ' cdlatex-math-modify +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; FAQ +;; +;; - Some people find it disturbing that the quote character (') is active +;; for math accents and font switching. I have tried to avoid any letters +;; which are frequently following ' in normal text. For example, 's and 't +;; insert just this. If you still prefer a different prefix key, just +;; configure the variable `cdlatex-math-modify-prefix'. +;; +;; - To insert a backquote into the buffer, use C-q ` +;; +;; TODO +;; +;; - include the molecular formatter? Maybe even into TAB? +;; - Alternatively, program a hook to allow TAB to do more things. +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;;;;; + +;;; Code: + +(eval-when-compile (require 'cl)) + +;;; Begin of Configuration Section ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +;; Configuration Variables and User Options for CDLaTeX ------------------ + +(defgroup cdlatex nil + "LaTeX label and citation support." + :tag "CDLaTeX" + :link '(url-link :tag "Home Page" "http://zon.astro.uva.nl/~dominik/Tools/") + :prefix "cdlatex-" + :group 'tex) + +(defun cdlatex-customize () + "Call the customize function with cdlatex as argument." + (interactive) + (cond + ((fboundp 'customize-browse) + (customize-browse 'cdlatex)) + ((fboundp 'customize-group) + (customize-group 'cdlatex)) + ((fboundp 'customize) + (customize 'cdlatex)) + (t (error "No customization available")))) + +(defun cdlatex-create-customize-menu () + "Create a full customization menu for CDLaTeX." + (interactive) + (if (fboundp 'customize-menu-create) + (progn + (easy-menu-change + '("CDLTX") "Customize" + `(["Browse CDLaTeX group" cdlatex-customize t] + "---" + ,(customize-menu-create 'cdlatex) + ["Set" Custom-set t] + ["Save" Custom-save t] + ["Reset to Current" Custom-reset-current t] + ["Reset to Saved" Custom-reset-saved t] + ["Reset to Standard Settings" Custom-reset-standard t])) + (message "\"CDLTX\"-menu now contains full customization menu")) + (error "Cannot expand menu (outdated version of cus-edit.el)"))) + +;; Configuration of KEYWORD commands ------------------------------------ + +(defgroup cdlatex-keyword-commands nil + "How to type a keyword in the buffer and hit TAB to execute." + :group 'cdlatex) + +(defcustom cdlatex-command-alist nil + "List of abbrev-like commands, available with keyword and TAB. +See `cdlatex-command-alist-default' for examples. This list only +defines additons to the defaults. For a full list of active commands, +press \\[cdlatex-command-help]. +Each element of this list is again a list with the following items: +0. KEYWORD The key that has to be typed into the text. +1. DOCSTRING A documentation string, less than 60 characters long. +2. REPLACE The text to be substituted for the keyword, if any. +3. HOOK A function to be called. +4. ARGS Optional list of arguments to the function. +5. TEXTFLAG non-nil means this keyword command is active in textmode. +6. MATHFLAG non-nil means this keyword command is active in math mode." + :group 'cdlatex-keyword-commands + :type '(repeat + (list (string :tag "Keyword ") + (string :tag "Docstring ") + (string :tag "Replacement") + (function :tag "Hook ") + (sexp :tag "Arguments ") + (boolean :tag "Available in Text mode") + (boolean :tag "Available in Math mode")))) + +(defcustom cdlatex-tab-hook nil + "List of functions called by TAB before the default command is executed. +These functions are called each time TAB is pressed. They may parse the +environment and take an action. The function should return t when it +successful executed an action and other TAB actions should *not* be tried. +When a return value is nil, other hook functions are tried, followed by the +default action of TAB (see documentation of the command `cdlatex-tab'." + :group 'cdlatex-keyword-commands + :type '(repeat (function :tag "Function" :value nil))) + +;; Configuration of environment templates ------------------------------- + +(defgroup cdlatex-environment-support nil + "Template-based insertion of LaTeX environments." + :group 'cdlatex) + +(defcustom cdlatex-env-alist nil + "Association list of LaTeX environments and the corresponding templates. +The car of the list is a keyword to identify the environment. +the two following items in the list are the templates for environment +and item. See `cdlatex-env-alist-default' for examples. Any entries +in this variable will be added to the default definitions." + :group 'cdlatex-environment-support + :type '(repeat + (list :tag "" + (string :format "ENVIRONMENT %v" "") + (text :format "ENVIRONMENT TEMPLATE\n%v" "") + (choice :tag "ITEM" + (const :tag "none" nil) + (text :tag "template" :format "TEMPLATE\n%v" ""))))) + +(defcustom cdlatex-insert-auto-labels-in-env-templates t + "*Non-nil means the environment templates CDLaTeX will contain labels. +This variable may be set to t, nil, or a string of label type letters +indicating the label types for which it should be true." + :group 'cdlatex-making-and-inserting-labels + :type '(choice :tag "Insert labels in templates" + (const :tag "always" t) + (const :tag "never" nil) + (string :tag "selected label types" ""))) + +;; Configuration of Math character insertion and accents ---------------- + +(defgroup cdlatex-math-support nil + "Support for mathematical symbols and accents in CDLaTeX." + :group 'cdlatex) + +(defcustom cdlatex-math-symbol-prefix ?` + "Prefix key for `cdlatex-math-symbol'. +This may be a character, a string readable with read-kbd-macro, or a +lisp vector." + :group 'cdlatex-math-support + :type '(choice + (character) + (string :value "" :tag "kbd readable string") + (sexp :value [] :tag "a lisp vector"))) + +(defcustom cdlatex-math-symbol-direct-bindings '(nil nil nil) + "How to bind the math symbols directly. +This is a list of key binding descriptions for different levels of +math symbols. First entry for level 1 etc. +Each entry consists of a prefix key and a list of modifiers for the +character. The prefix key can be nil, or any of a character, a +read-kbd-macro readable string or a vector. +Examples: +`((nil alt))' bind `\\delta' to `A-d'. +`((\"C-c C-f\"))' bind `\\delta' to `C-c C-f d'. +`((nil alt) (nil alt control))' bind `\\delta' to `A-d' and + `\\partial' (which is on level 2) + to `A-C-d'" + :group 'cdlatex-math-support + :type '(repeat + (choice + (const :tag "No binding of this level" nil) + (cons + :tag "Specify a binding" + :value (nil alt) + (choice + (const :tag "No prefix" nil) + (character :value ?@) + (string :value "" :tag "kbd readable string") + (sexp :value [] :tag "a lisp vector")) + (set :tag "Modifiers for the final character" :greedy t + (const control) + (const meta) + (const alt) + (const super) + (const hyper)))))) + +(defcustom cdlatex-math-symbol-alist nil + "Key characters and math symbols for fast access with the prefix key. +First element is a character, followed by a number of strings attached to +this key. When the string contains a question mark, this is where the +cursor will be positioned after insertion of the string into the buffer. +See `cdlatex-math-symbol-alist-default' for an example. Any entry defined +here will replace the corresponding entry of the default list. The +defaults implement 3 levels of symbols so far: Level 1 for greek letters +and standard symbols, level 2 for variations of level 1, and level 3 for +functions and opperators." + :group 'cdlatex-math-support + :type '(repeat + (list + (character ?a) + (repeat (string :tag "macro" ""))))) + +(defcustom cdlatex-math-modify-prefix ?' + "Prefix key for `cdlatex-math-modify'. +It can be a character, a string interpretable with `read-kbd-macro', +or a lisp vector." + :group 'cdlatex-math-support + :type '(choice + (character) + (string :value "" :tag "kbd readable string") + (sexp :value [] :tag "a lisp vector"))) + +(defcustom cdlatex-modify-backwards t + "*Non-nil means, `cdlatex-math-modify' modifies char before point. +Nil means, always insert only an empty modification form. This is also +the case if the character before point is white or some punctuation. " + :group 'cdlatex-math-support + :type 'boolean) + +(defcustom cdlatex-math-modify-alist nil + "List description of the LaTeX math accents. +See `cdlatex-math-modify-alist-default' for an example. Any entries in this +variable will be added to the default. +Each element contains 6 items: +0. key: The character that is the key for a the accent. +1. mathcmd: The LaTeX command associated with the accent in math mode +2. textcmd: The LaTeX command associated with the accent in text mode +3. type: t if command with argument (e.g. \\tilde{a}). + nil if style (e.g. {\\cal a}). +4. rmdot: t if the dot on i and j has to be removed. +5. it t if italic correction is required." + :group 'cdlatex-math-support + :type '(repeat + (list (character :tag "Key character ") + (choice :tag "TeX macro inside math mode" + (string "") + (const :tag "none" nil)) + (choice :tag "TeX macro outside math mode" + (string "") + (const :tag "none" nil)) + (boolean :tag "Type " :on "Command" :off "Style") + (boolean :tag "Remove dot in i/j") + (boolean :tag "Italic correction")))) + +;; Miscellaneous configurations ----------------------------------------- + +(defgroup cdlatex-miscellaneous-configurations nil + "Collection of further configurations." + :group 'cdlatex) + +(defcustom cdlatex-use-fonts t + "*Non-nil means, use fonts in label menu and on-the-fly help. +Font-lock must be loaded as well to actually get fontified display." + :group 'cdlatex-miscellaneous-configurations + :type '(boolean)) + +(defcustom cdlatex-paired-parens "$[{" + "*String with the opening parens you want to have inserted paired. +The following parens are allowed here: `$([{|<'. +I recommend to set this to '$[{' as these have syntactical meaning in +TeX and are required to be paired. TAB is a good way to move out of paired +parens." + :group 'cdlatex-miscellaneous-configurations + :type '(string :tag "Opening delimiters")) + +(defcustom cdlatex-simplify-sub-super-scripts t + "*Non-nil means, TAB will simplify sub- and superscripts at point. +When you use TAB to exit from a sub- or superscript which is a single +letter, the parenthesis will be removed." + :group 'cdlatex-miscellaneous-configurations + :type '(boolean)) + +(defcustom cdlatex-auto-help-delay 1.5 + "Number of idle seconds before display of auto-help. +When executing cdlatex-math-symbol or cdlatex-math-modify, display +automatic help when idle for more than this amount of time." + :group 'cdlatex-miscellaneous-configurations + :type 'number) + +(require 'texmathp) + +;;;============================================================================ +;;; +;;; Define the formal stuff for a minor mode named CDLaTeX. +;;; + +(defun cdlatex-show-commentary () + "Use the finder to view the file documentation from `cdlatex.el'." + (interactive) + (require 'finder) + (finder-commentary "cdlatex.el")) + +(defconst cdlatex-version "4.3" + "Version string for CDLaTeX.") + +(defvar cdlatex-mode nil + "Determines if CDLaTeX minor mode is active.") +(make-variable-buffer-local 'cdlatex-mode) + +(defvar cdlatex-mode-map (make-sparse-keymap) + "Keymap for CDLaTeX minor mode.") +(defvar cdlatex-mode-menu nil) + +;;;###autoload +(defun turn-on-cdlatex () + "Turn on CDLaTeX minor mode." + (cdlatex-mode t)) + +;;;###autoload +(defun cdlatex-mode (&optional arg) + "Minor mode for editing scientific LaTeX documents. Here is a +list of features: \\<cdlatex-mode-map> + + KEYWORD COMMANDS + ---------------- +Many CDLaTeX commands are activated with an abbrev-like mechanism. +When a keyword is typed followed `\\[cdlatex-tab]', the keyword is deleted +from the buffer and a command is executed. You can get a full list +of these commands with `\\[cdlatex-command-help]'. +For example, when you type `fr<TAB>', CDLaTeX will insert `\\frac{}{}'. + +When inserting templates like '\\frac{}{}', the cursor is positioned +properly. Use `\\[cdlatex-tab]' to move through templates. `\\[cdlatex-tab]' also kills +unnecessary braces around subscripts and superscripts at point. + + MATH CHARACTERS AND ACCENTS + --------------------------- +\\[cdlatex-math-symbol] followed by any character inserts a LaTeX math character + e.g. \\[cdlatex-math-symbol]e => \\epsilon +\\[cdlatex-math-symbol]\\[cdlatex-math-symbol] followed by any character inserts other LaTeX math character + e.g. \\[cdlatex-math-symbol]\\[cdlatex-math-symbol]e => \\varepsilon +\\[cdlatex-math-modify] followed by character puts a math accent on a letter or symbol + e.g. \\[cdlatex-math-symbol]a\\[cdlatex-math-modify]~ => \\tilde{\\alpha} + +CDLaTeX is aware of the math environments in LaTeX and modifies the +workings of some functions according to the current status. + + ONLINE HELP + ----------- +After pressing \\[cdlatex-math-symbol] or \\[cdlatex-math-modify], CDLaTeX waits for a short time for the second character. +If that does not come, it will pop up a window displaying the available +characters and their meanings. + + KEY BINDINGS + ------------ +\\{cdlatex-mode-map} + +Under X, many functions will be available also in a menu on the menu bar. + +Entering cdlatex-mode calls the hook cdlatex-mode-hook. +------------------------------------------------------------------------------" + + (interactive "P") + (setq cdlatex-mode (not (or (and (null arg) cdlatex-mode) + (<= (prefix-numeric-value arg) 0)))) + + ; Add or remove the menu, and run the hook + (if cdlatex-mode + (progn + (easy-menu-add cdlatex-mode-menu) + (run-hooks 'cdlatex-mode-hook)) + (easy-menu-remove cdlatex-mode-menu))) + +(or (assoc 'cdlatex-mode minor-mode-alist) + (setq minor-mode-alist + (cons '(cdlatex-mode " CDL") minor-mode-alist))) + +(or (assoc 'cdlatex-mode minor-mode-map-alist) + (setq minor-mode-map-alist + (cons (cons 'cdlatex-mode cdlatex-mode-map) + minor-mode-map-alist))) + + +;;; =========================================================================== +;;; +;;; Functions that check out the surroundings + +(defun cdlatex-dollars-balanced-to-here (&optional from) + ;; Return t if the dollars are balanced between start of paragraph and point. + (save-excursion + (let ((answer t) (pos (point))) + (if from + (goto-char from) + (backward-paragraph 1)) + (if (not (bobp)) (backward-char 1)) + (while (re-search-forward "[^\\]\\$+" pos t) + (if (/= (char-after (match-beginning 0)) ?\\) + (setq answer (not answer)))) + (setq answer answer)))) + +(defun cdlatex-number-of-backslashes-is-odd () + ;; Count backslashes before point and return t if number is odd. + (let ((odd nil)) + (save-excursion + (while (equal (preceding-char) ?\\) + (progn + (forward-char -1) + (setq odd (not odd))))) + (setq odd odd))) + +;; ============================================================================ +;; +;; Some generally useful functions + +(defun cdlatex-get-kbd-vector (obj) + (cond ((vectorp obj) obj) + ((integerp obj) (vector obj)) + ((stringp obj) (read-kbd-macro obj)) + ((and (fboundp 'characterp) (characterp obj)) + (vector obj)) ; XEmacs only + (t nil))) + +(defun cdlatex-uniquify (alist &optional keep-list) + ;; Return a list of all elements in ALIST, but each car only once. + ;; Elements of KEEP-LIST are not removed even if duplicate. + (let (new elm) + (while alist + (setq elm (car alist) + alist (cdr alist)) + (if (or (member (car elm) keep-list) + (not (assoc (car elm) new))) + (setq new (cons elm new)))) + (setq new (nreverse new)) + new)) + +(defun cdlatex-use-fonts () + ;; Return t if we can and want to use fonts. + (and window-system + cdlatex-use-fonts + (boundp 'font-lock-keyword-face))) + +;;; --------------------------------------------------------------------------- +;;; +;;; Insert pairs of $$ (), etc. + +;; Alist connection opening with closing delimiters +(defconst cdlatex-parens-pairs '(("(".")") ("["."]") ("{"."}") + ("|"."|") ("<".">"))) + +(defun cdlatex-pbb () + "Insert a pair of parens, brackets or braces." + (interactive) + (let ((paren (char-to-string last-command-event))) + (if (and (stringp cdlatex-paired-parens) + (string-match (regexp-quote paren) cdlatex-paired-parens) + (not (cdlatex-number-of-backslashes-is-odd))) + (progn + (insert paren) + (insert (cdr (assoc paren cdlatex-parens-pairs))) + (forward-char -1)) + (insert paren)))) + +(defun cdlatex-ensure-math () + ;; Make sure we are in math + (unless (texmathp) + (cdlatex-dollar))) + +(defun cdlatex-dollar (&optional arg) + "Insert a pair of dollars unless number of backslashes before point is odd. +With arg, insert pair of double dollars." + (interactive "P") + (if (cdlatex-number-of-backslashes-is-odd) + (insert "$") + (if (texmathp) + (if (and (stringp (car texmathp-why)) + (equal (substring (car texmathp-why) 0 1) "\$")) + (progn + (insert (car texmathp-why)) + (save-excursion + (goto-char (cdr texmathp-why)) + (if (pos-visible-in-window-p) + (sit-for 1)))) + (message "No dollars inside a math environment!") + (ding)) + (if (and (stringp cdlatex-paired-parens) + (string-match "\\$" cdlatex-paired-parens)) + (if arg + (if (bolp) + (progn (insert "\$\$\n\n\$\$\n") (backward-char 4)) + (insert "\$\$ \$\$") (backward-char 3)) + (insert "$$") (backward-char 1)) + (if arg + (if (bolp) (insert "$$\n") (insert "$$")) + (insert "$")))))) + +(defun cdlatex-sub-superscript () + "Insert ^{} or _{} unless the number of backslashes before point is odd. +When not in LaTeX math environment, _{} and ^{} will have dollars." + (interactive) + (if (cdlatex-number-of-backslashes-is-odd) + ;; Quoted + (insert last-command-event) + ;; Check if we need to switch to math mode + (if (not (texmathp)) (cdlatex-dollar)) + (if (string= (buffer-substring (max (point-min) (- (point) 2)) (point)) + (concat (char-to-string last-command-event) "{")) + ;; We are at the start of a sub/suberscript. Allow a__{b} and a^^{b} + ;; This is an undocumented feature, please keep it in. It supports + ;; a special notation which can be used for upright sub- and + ;; superscripts. + (progn + (backward-char 1) + (insert last-command-event) + (forward-char 1)) + ;; Insert the normal template. + (insert last-command-event) + (insert "{}") + (forward-char -1)))) + +(defun cdlatex-lr-pair () + "Insert a \\left-\\right pair of parens." + (interactive) + (let* ((paren (char-to-string (preceding-char))) + (close (cdr (assoc paren cdlatex-parens-pairs))) + (paren1 paren) + (close1 close)) + (if (string= paren "<") (setq paren1 "\\langle" close1 "\\rangle")) + (if (string= paren "{") (setq paren1 "\\{" close1 "\\}")) + (backward-delete-char 1) + (if (and (stringp cdlatex-paired-parens) + (string-match (regexp-quote paren) cdlatex-paired-parens) + (string= close (char-to-string (following-char)))) + (delete-char 1)) + (insert "\\left" paren1 " ? \\right" close1) + (cdlatex-position-cursor))) + +;;; =========================================================================== +;;; +;;; Keyword controlled commands and cursor movement + +(defvar cdlatex-command-alist-comb nil) + +(defun cdlatex-tab () + "This function is intended to do many cursor movements. +It is bound to the tab key since tab does nothing useful in a TeX file. + +This function first calls all functions in `cdlatex-tab-hook', which see. + +If none of those functions returns t, the command first tries to expand +any command keyword before point. + +If there is none, it cleans up short subscripts and superscripts at point. +I.e. it changes a^{2} into a^2, since this is more readable. This feature +can be disabled by setting `cdlatex-simplify-sub-super-scripts' to nil. + +Then it jumps to the next point in a LaTeX text where one would reasonably +expect that more input can be put in. +To do that, the cursor is moved according to the following rules: + +The cursor stops... +- before closing brackets if preceding-char is any of -({[]}) +- after closing brackets, but not if following-char is any of ({[_^ +- just after $, if the cursor was before that $. +- at end of non-empty lines +- at the beginning of empty lines +- before a SPACE at beginning of line +- after first of several SPACE + +Sounds strange? Try it out!" + (interactive) + (catch 'stop + + ;; try hook stuff + (let ((funcs cdlatex-tab-hook)) + (while funcs (if (funcall (pop funcs)) (throw 'stop t)))) + + ;; try command expansion + (let ((pos (point)) exp math-mode) + (backward-word 1) + (while (eq (following-char) ?$) (forward-char 1)) + (setq exp (buffer-substring-no-properties (point) pos)) + (setq exp (assoc exp cdlatex-command-alist-comb)) + (when exp + (setq math-mode (texmathp)) + (when (or (and (not math-mode) (nth 5 exp)) + (and math-mode (nth 6 exp))) + (delete-char (- pos (point))) + (insert (nth 2 exp)) + ;; call the function if there is one defined + (and (nth 3 exp) + (if (nth 4 exp) + (apply (nth 3 exp) (nth 4 exp)) + (funcall (nth 3 exp)))) + (throw 'stop t))) + (goto-char pos)) + + ;; Check for simplification of sub and superscripts + (cond + ((looking-at "}\\|\\]\\|)") + (forward-char -3) + (if (and (looking-at "[_^]{[-+0-9a-zA-Z]}") + cdlatex-simplify-sub-super-scripts) + ;; simplify sub/super script + (progn (forward-char 1) + (delete-char 1) + (forward-char 1) + (delete-char 1)) + (forward-char 4)) + (if (looking-at "[^_\\^({\\[]") + ;; stop after closing bracket, unless ^_[{( follow + (throw 'stop t))) + ((= (following-char) ?$) + (while (= (following-char) ?$) (forward-char 1)) + (throw 'stop t)) + ((= (following-char) ?\ ) + ;; stop after first of many spaces + (forward-char 1) + (re-search-forward "[^ ]") + (if (/= (preceding-char) ?\n) (forward-char -1))) + (t + (forward-char 1))) + + ;; move to next possible stopping site and check out the place + (while (re-search-forward "[ )}\n]\\|\\]" (point-max) t) + (forward-char -1) + (cond + ((= (following-char) ?\ ) + ;; stop at first space or b-o-l + (if (not (bolp)) (forward-char 1)) (throw 'stop t)) + ((= (following-char) ?\n) + ;; stop at line end, but not after \\ + (if (and (bolp) (not (eobp))) + (throw 'stop t) + (if (equal "\\\\" (buffer-substring-no-properties + (- (point) 2) (point))) + (forward-char 1) + (throw 'stop t)))) + (t + ;; Stop before )}] if preceding-char is any parenthesis + (if (or (= (char-syntax (preceding-char)) ?\() + (= (char-syntax (preceding-char)) ?\)) + (= (preceding-char) ?-)) + (throw 'stop t) + (forward-char 1) + (if (looking-at "[^_\\^({\\[]") + ;; stop after closing bracket, unless ^_[{( follow + (throw 'stop t)))))))) + +(defun cdlatex-command-help () + "Show the available cdlatex commands in the help buffer." + (interactive) + (with-output-to-temp-buffer " *CDLaTeX Help*" + (princ " AVAILABLE KEYWORD COMMANDS WITH CDLaTeX\n") + (princ " --------------------------------------\n") + (princ "To execute, type keyword into buffer followed by TAB.\n\n") + (let ((cmdlist cdlatex-command-alist-comb) item key doc text math) + (while cmdlist + (setq item (car cmdlist) + cmdlist (cdr cmdlist) + key (car item) + doc (nth 1 item) + text (nth 5 item) + math (nth 6 item)) + (princ (format "%-10.10s %-58.58s %4s/%4s\n" key + (if (> (length doc) 59) + (substring doc 0 59) + doc) + (if text "TEXT" "") + (if math "MATH" ""))))))) + +;;; --------------------------------------------------------------------------- +;;; +;;; Cursor position after insertion of forms + +(defun cdlatex-position-cursor () + ;; Search back to question mark, delete it, leave point there + (if (search-backward "\?" (- (point) 100) t) + (delete-char 1))) + +;;; --------------------------------------------------------------------------- +;;; +;;; Environments +;;; +;;; The following code implements insertion of LaTeX environments +;;; I prefer these environment over AUCTeX's definitions, since they give +;;; my memory more support and don't prompt for anything. + +(defvar cdlatex-env-alist-comb nil) + +(defun cdlatex-environment (&optional environment item) + "Complete the name of an ENVIRONMENT and insert it. +If the environment is not found in the list, a \\begin \\end pair is +inserted. Any keywords AUTOLABEL will be replaced by an automatic label +statement. Any keywords AUTOFILE will prompt the user for a file name +\(with completion) and insert that file names. If a template starts with +\"\\\\\", the function will make sure that a double backslash occurs before +the template. This is mainly useful for \"items\" of environments, where +\"\\\\\" is often needed as separator." + (interactive) + (let ((env environment) begpos (endmarker (make-marker)) + (auto-label cdlatex-insert-auto-labels-in-env-templates) + template) + (if (not env) + (setq env (completing-read "Environment: " cdlatex-env-alist-comb nil nil ""))) + (if (not (bolp)) (newline)) + (setq begpos (point)) + (if (try-completion env cdlatex-env-alist-comb) + (progn + (setq template (nth (if item 2 1) + (assoc env cdlatex-env-alist-comb))) + (if (string= (substring template 0 2) "\\\\") + ;; Need a double backslash to teminate previous item + (progn + (setq template (substring template 2)) + (if (not (save-excursion + (re-search-backward "\\\\\\\\[ \t\n]*\\=" + (- (point) 20) t))) + (save-excursion + (skip-chars-backward " \t\n") + (insert "\\\\"))))) + (insert template)) + (insert "\\begin{" env "}\n?\n\\end{" env "}\n")) + (move-marker endmarker (point)) + + ;; Look for AUTOFILE requests + (goto-char begpos) + (while (search-forward "AUTOFILE" (marker-position endmarker) t) + (backward-delete-char 8) + (call-interactively 'cdlatex-insert-filename)) + + ;; Look for AUTOLABEL requests + (goto-char begpos) + (while (search-forward "AUTOLABEL" (marker-position endmarker) t) + (backward-delete-char 9) + (if (and auto-label (fboundp 'reftex-label)) + (reftex-label env) + (save-excursion + (beginning-of-line 1) + (if (looking-at "[ \t]*\n") + (kill-line 1))))) + + ;; Position cursor at the first question-mark + (goto-char begpos) + (if (search-forward "?" (marker-position endmarker) t) + (backward-delete-char 1)))) + +(defun cdlatex-item () + "Insert an \\item and provide a label if the environments supports that. +In eqnarrays this inserts a new line with two ampersands. It will also +add two backslashes to the previous line if required." + (interactive) + (let* ((env (car (car (reftex-what-environment t)))) + (envl (assoc env cdlatex-env-alist-comb))) + + (if (not env) (error "No open environment at point.")) + (if (or (< (length envl) 3) + (null (nth 2 envl)) + (and (stringp (nth 2 envl)) + (string= (nth 2 envl) ""))) + (error "No item defined for %s environment." env)) + (cdlatex-environment env t))) + +(defun cdlatex-comment-at-point () + ;; Return t if point is inside a TeX comment + (let ((end (point)) + (start (progn (beginning-of-line 1) (point)))) + (goto-char end) + (save-match-data + (string-match "^%\\|[^\\]%" (buffer-substring start end))))) + +(defun cdlatex-insert-filename (&optional absolute) + (interactive "P") + "Insert a file name, with completion. +The path to the file will be relative to the current directory if the file +is in the current directory or a subdirectory. Otherwise, the link will +be as completed in the minibuffer (i.e. normally relative to the users +HOME directory). +With optional prefix ABSOLUTE, insert the absolute path." + (let ((file (read-file-name "File: " nil ""))) + (let ((pwd (file-name-as-directory (expand-file-name ".")))) + (cond + (absolute + (insert (expand-file-name file))) + ((string-match (concat "^" (regexp-quote pwd) "\\(.+\\)") + (expand-file-name file)) + (insert (match-string 1 (expand-file-name file)))) + (t (insert (expand-file-name file))))))) + + +;;; =========================================================================== +;;; +;;; Math characters and modifiers + +;; The actual value of the following variable is calculated +;; by `cdlatex-compute-tables'. It holds the number of levels of math symbols +(defvar cdlatex-math-symbol-no-of-levels 1) +(defvar cdlatex-math-symbol-alist-comb nil) +(defvar cdlatex-math-modify-alist-comb nil) + +(defun cdlatex-region-active-p () + "Is `transient-mark-mode' on and the region active? +Works on both Emacs and XEmacs." + (if (featurep 'xmeacs) + (and zmacs-regions (region-active-p)) + (and transient-mark-mode mark-active))) + +(defun cdlatex-math-symbol () + "Read a char from keyboard and insert corresponding math char. +The combinations are defined in `cdlatex-math-symbol-alist'. If not in a LaTeX +math environment, you also get a pair of dollars." + (interactive) + (let* ((cell (cdlatex-read-char-with-help + cdlatex-math-symbol-alist-comb + 1 cdlatex-math-symbol-no-of-levels + "Math symbol level %d of %d: " + "AVAILABLE MATH SYMBOLS. [%c]=next level " + cdlatex-math-symbol-prefix + (get 'cdlatex-math-symbol-alist-comb 'cdlatex-bindings))) + (char (car cell)) + (level (cdr cell)) + (entry (assoc char cdlatex-math-symbol-alist-comb)) + (symbol (nth level entry))) + + (if (or (not symbol) + (not (stringp symbol)) + (equal symbol "")) + (error "No such math symbol %c on level %d" char level)) + + (if (or (not (texmathp)) + (cdlatex-number-of-backslashes-is-odd)) + (cdlatex-dollar)) + + (insert symbol) + (when (string-match "\\?" symbol) + (cdlatex-position-cursor)))) + +(defun cdlatex-read-char-with-help (alist start-level max-level prompt-format + header-format prefix bindings) + "Read a char from keyboard and provide help if necessary." + (interactive) + (let (char (help-is-on nil) + (level start-level)) + (catch 'exit + (save-window-excursion + (while t + (if help-is-on + (progn + (cdlatex-turn-on-help + (concat (format header-format prefix) + (if (assoc level bindings) + (concat " Direct binding are `" + (cdr (assoc level bindings)) "' etc.") + "")) + level alist help-is-on nil))) + (message prompt-format level max-level) + (if (and (not help-is-on) + (sit-for cdlatex-auto-help-delay)) + (setq char ?\?) + (setq char (read-char))) + (cond + ((= char ?\C-g) + (keyboard-quit)) + ((= char ?\?) + (if help-is-on + (progn + (setq help-is-on (+ help-is-on (- (window-height) 1))) + (if (> help-is-on (count-lines (point-min) (point-max))) + (setq help-is-on 1))) + (setq help-is-on 1))) + ((or (= char ?\ ) + (equal char prefix)) + (setq level (if (= level cdlatex-math-symbol-no-of-levels) + 1 + (1+ level)))) + (t (throw 'exit (cons char level))))))))) + +;;; The following code implements the possibility to modify a character +;;; by an accent or style when point is behind it. This is more naturally +;;; then the usual way. E.g. \tilde{a} can be typed as a'~ + +(defun cdlatex-math-modify (arg) + "Modify previous char/group/macro with math accent/style. +This macro modifies the character or TeX macro or TeX group BEFORE point +with a math accent or a style. +If the character before point is white space, an empty modifying form +is inserted and the cursor positioned properly. +If the object before point looks like word, this macro modifies the last +character of it. +All this happens only, when the cursor is actually inside a LaTeX math +environment. In normal text, it does just a self-insert. +The accent and style commands and their properties are defined in the +constant `cdlatex-math-modify-alist'." + (interactive "P") + (catch 'exit + + (let ((inside-math (texmathp)) + (win (selected-window)) + char (help-is-on nil) ass acc rmdot it cmd extrabrac) + (catch 'exit1 + (save-window-excursion + (while t + (if help-is-on + (progn + (cdlatex-turn-on-help + "AVAILABLE MODIFIERS. (?=SCROLL)" + (if inside-math 1 2) + cdlatex-math-modify-alist-comb help-is-on t) + (message "Math modify: ")) + (message "Math modify: (?=HELP)")) + + (if (and (not help-is-on) + (sit-for cdlatex-auto-help-delay)) + (setq char ?\?) + (setq char (read-char))) + + (cond + ((= char ?\C-g) + (keyboard-quit)) + ((= char ?\?) + (if help-is-on + (progn + (setq help-is-on (+ help-is-on (- (window-height) 1))) + (if (> help-is-on (count-lines (point-min) (point-max))) + (setq help-is-on 1))) + (setq help-is-on 1))) + ((equal char cdlatex-math-modify-prefix) + (select-window win) + (insert cdlatex-math-modify-prefix) + (message "") + (throw 'exit t)) + (t (throw 'exit1 t)))))) + (message "") + (setq ass (assoc char cdlatex-math-modify-alist-comb)) + (if (not ass) + (progn + (insert cdlatex-math-modify-prefix char) + (throw 'exit t))) + (setq ass (cdr ass)) + (setq cmd (nth (if inside-math 0 1) ass)) + (setq acc (nth 2 ass)) + (setq rmdot (nth 3 ass)) + (setq it (nth 4 ass)) + (if (not cmd) (error "No such modifier `%c' %s math mode." char + (if inside-math "inside" "outside"))) + (cond + ((cdlatex-region-active-p) + (let ((beg (min (region-beginning) (region-end))) + (end (max (region-beginning) (region-end)))) + (goto-char end) + (point-to-register ?x) + (goto-char beg) + (insert "{") + (if acc (forward-char -1)) + (insert cmd) + (if (not acc) (insert " ")) + (register-to-point ?x) + (insert "}"))) + (arg + (point-to-register ?x) + (backward-word arg) + (insert "{") + (if acc (forward-char -1)) + (insert cmd) + (if (not acc) (insert " ")) + (register-to-point ?x) + (insert "}")) + ((or (bolp) + (not cdlatex-modify-backwards) + (memq (preceding-char) '(?\ ?$ ?- ?{ ?\( ))) + ;; Just insert empty form and position cursor + (if acc + (insert cmd "{?") + (insert "{" cmd " ?")) + (if it (insert "\\/")) + (insert "}") + (search-backward "?") + (delete-char 1)) + (t + ;; Modify preceding character or word + (point-to-register ?x) + (if (= (preceding-char) ?\}) + ;; its a group + (progn (setq extrabrac nil) + (backward-list 1) + (if (not acc) (forward-char 1))) + ;; not a group + (forward-char -1) + (if (looking-at "[a-zA-Z]") + ;; a character: look if word or macro + (progn + (setq extrabrac t) + (re-search-backward "[^a-zA-Z]") + (cond + ((= (following-char) ?\\)) + ((not inside-math) (forward-char 1)) + (t (register-to-point ?x) + (forward-char -1) + (if (and rmdot (looking-at "[ij]")) + (progn (insert "\\") + (forward-char 1) + (insert "math") + (point-to-register ?x) + (forward-char -6)))))) + (setq extrabrac t))) + (if extrabrac (progn (insert "{") + (if acc (forward-char -1)))) + (insert cmd) + (if (not acc) (insert " ")) + (register-to-point ?x) + (if extrabrac (insert "}"))))))) + +;;; And here is the help function for the symbol insertions stuff + +(defun cdlatex-turn-on-help (header level alist offset &optional sparse) + ;; Show help-window for alist + (let ((cnt 0) (all-chars "") + (flock (cdlatex-use-fonts)) this-char value) + (if sparse + (setq all-chars (concat (mapcar 'car alist))) + (setq all-chars "aA0 bB1!cC2@dD3#eE4$fF5%gG6^hH7&iI8 jJ9?kK+~lL-_mM*|nN/\\oO=\"pP()qQ[]rR{}sS<>tT`'uU.:vV wW xX yY zZ ")) + (if (get-buffer-window " *CDLaTeX Help*") + (select-window (get-buffer-window " *CDLaTeX Help*")) + (switch-to-buffer-other-window " *CDLaTeX Help*")) + (erase-buffer) + (make-local-variable 'truncate-lines) + (setq truncate-lines t) + (insert (concat header "\n\n")) + + (while (not (equal "" all-chars)) + (setq cnt (1+ cnt)) + (setq this-char (string-to-char all-chars)) + (setq all-chars (substring all-chars 1)) + (cond + ( (= this-char ?\?) + (setq value "SCROLL")) + ( (= this-char ?\C-m) + (setq this-char ?\ ) + (setq value "")) + ( t + (setq value (nth level (assoc this-char alist))) + (if (not value) (setq value "")))) + (setq this-char (char-to-string this-char) + value (if (> (length value) 15) + (concat (substring value 0 13) "..") + (substring (concat value " ") 0 15))) + (if flock + (put-text-property 0 15 + 'face 'font-lock-keyword-face value)) + + (insert this-char " " value " ") + (if (= (* 4 (/ cnt 4)) cnt) (insert "\n"))) + (unless (one-window-p t) + (enlarge-window (1+(- (count-lines 1 (point)) (window-height))))) + (goto-line offset) + (beginning-of-line 1) + (recenter 0))) + +;;; --------------------------------------------------------------------------- +;;; +;;; Data Section: Definition of large constants + +(defconst cdlatex-command-alist-default + '( + ("pref" "Make page reference" + "" reftex-reference nil t t) + ("ref" "Make reference" + "" reftex-reference nil t t) + + ("lbl" "Insert automatic label at point" + "" reftex-label nil t t) + + ("ct" "Insert \\cite" + "\\cite{?}" cdlatex-position-cursor nil t nil) + ("cte" "Make a citation interactively" + "" reftex-citation nil t nil) + ("cite{" "Make a citation interactively" + "cite{" reftex-citation nil t nil) + + ("beg" "Complete an environment name and insert template" + "" cdlatex-environment nil t t) + ("env" "Complete an environment name and insert template" + "" cdlatex-environment nil t t) + ("it" "New item in current environment" + "" cdlatex-item nil t t) + ("ite" "Insert an ITEMIZE environment template" + "" cdlatex-environment ("itemize") t nil) + ("enu" "Insert an ENUMERATE environment template" + "" cdlatex-environment ("enumerate") t nil) + ("equ" "Insert an EQUATION environment template" + "" cdlatex-environment ("equation") t nil) + ("eqn" "Insert an EQUATION environment template" + "" cdlatex-environment ("eqnarray") t nil) + ("ali" "Insert an ALIGN environment template" + "" cdlatex-environment ("align") t nil) + ("ali*" "Insert an ALIGN* environment template" + "" cdlatex-environment ("align*") t nil) + ("alit" "Insert an ALIGNAT environment template" + "" cdlatex-environment ("alignat") t nil) + ("alit*" "Insert an ALIGNAT* environment template" + "" cdlatex-environment ("alignat*") t nil) + ("xal" "Insert a XALIGNAT environment template" + "" cdlatex-environment ("xalignat") t nil) + ("xal*" "Insert a XALIGNAT* environment template" + "" cdlatex-environment ("xalignat*") t nil) + ("xxa" "Insert a XXALIGNAT environment template" + "" cdlatex-environment ("xxalignat") t nil) + ("xxa*" "Insert a XXALIGNAT environment template" + "" cdlatex-environment ("xxalignat") t nil) + ("mul" "Insert a MULTINE environment template" + "" cdlatex-environment ("multline") t nil) + ("mul*" "Insert a MULTINE* environment template" + "" cdlatex-environment ("multline*") t nil) + ("gat" "Insert a GATHER environment template" + "" cdlatex-environment ("gather") t nil) + ("gat*" "Insert a GATHER* environment template" + "" cdlatex-environment ("gather*") t nil) + ("fla" "Insert a FLALIGN environment template" + "" cdlatex-environment ("flalign") t nil) + ("fla*" "Insert a FLALIGN* environment template" + "" cdlatex-environment ("flalign*") t nil) + ("fg" "Insert a FIGURE environment template" + "" cdlatex-environment ("figure") t nil) + + + ("sn" "Insert a \\section{} statement" + "\\section{?}" cdlatex-position-cursor nil t nil) + ("ss" "Insert a \\subsection{} statement" + "\\subsection{?}" cdlatex-position-cursor nil t nil) + ("sss" "Insert a \\subsubsection{} statement" + "\\subsubsection{?}" cdlatex-position-cursor nil t nil) + ("pf" "Insert a \\paragraph{} statement" + "\\paragraph{?}" cdlatex-position-cursor nil t nil) + ("sp" "Insert a \\subparagraph{} statement" + "\\subparagraph{?}" cdlatex-position-cursor nil t nil) + ("ssp" "Insert a \\subsubparagraph{} statement" + "\\subsubparagraph{?}" cdlatex-position-cursor nil t nil) + + ("cl" "Insert \\centerline" + "\\centerline{?}" cdlatex-position-cursor nil t nil) + ("inc" "Insert \\includegraphics with file name" + "\\includegraphics[]{?}" (lambda () + (cdlatex-position-cursor) + (call-interactively 'cdlatex-insert-filename) + (forward-char 1)) + nil t nil) + ("lr(" "Insert a \\left( \\right) pair" + "(" cdlatex-lr-pair nil nil t) + ("lr[" "Insert a \\left[ \\right] pair" + "[" cdlatex-lr-pair nil nil t) + ("lr{" "Insert a \\left{ \\right} pair" + "{" cdlatex-lr-pair nil nil t) + ("lr<" "Insert a \\left\\langle \\right\\rangle pair" + "<" cdlatex-lr-pair nil nil t) + ("lr|" "Insert a \\left| \\right| pair" + "|" cdlatex-lr-pair nil nil t) + ("caseeq" "Insert a = { construct" + "\\left\\{ \n\\begin{array}{l@{\\quad:\\quad}l}\n? & \\\\\n & \n\\end{array}\\right." cdlatex-position-cursor nil nil t) + ("fr" "Insert \\frac{}{}" + "\\frac{?}{}" cdlatex-position-cursor nil nil t) + ("sq" "Insert \\sqrt{}" + "\\sqrt{?}" cdlatex-position-cursor nil nil t) + ("intl" "Insert \\int\\limits_{}^{}" + "\\int\\limits_{?}^{}" cdlatex-position-cursor nil nil t) + ("suml" "Insert \\sum\\limits_{}^{}" + "\\sum\\limits_{?}^{}" cdlatex-position-cursor nil nil t) + ("nonum" "Insert \\nonumber\\\\" + "\\nonumber\\\\\n" nil nil nil t) + ("fn" "Make a footnote" + "\\footnote{?}" cdlatex-position-cursor nil t nil) + ("qq" "Insert \\quad" + "\\quad" nil nil t t) + ("qqq" "Insert \\qquad" + "\\qquad" nil nil t t) + ) + "Default for cdlatex-command-alist.") + +(defconst cdlatex-math-modify-alist-default + '( + ( ?\. "\\dot" nil t t nil ) + ( ?\: "\\ddot" nil t t nil ) + ( ?\~ "\\tilde" nil t t nil ) + ( ?N "\\widetilde" nil t t nil ) + ( ?^ "\\hat" nil t t nil ) + ( ?H "\\widehat" nil t t nil ) + ( ?\- "\\bar" nil t t nil ) + ( ?T "\\overline" nil t nil nil ) + ( ?\_ "\\underline" nil t nil nil ) + ( ?\{ "\\overbrace" nil t nil nil ) + ( ?\} "\\underbrace" nil t nil nil ) + ( ?\> "\\vec" nil t t nil ) + ( ?/ "\\grave" nil t t nil ) + ( ?\\ "\\acute" nil t t nil ) + ( ?v "\\check" nil t t nil ) + ( ?u "\\breve" nil t t nil ) + ( ?m "\\mbox" nil t nil nil ) + ( ?c "\\mathcal" nil t nil nil ) + ( ?r "\\mathrm" "\\textrm" t nil nil ) + ( ?i "\\mathit" "\\textit" t nil nil ) + ( ?l nil "\\textsl" t nil nil ) + ( ?b "\\mathbf" "\\textbf" t nil nil ) + ( ?e "\\mathem" "\\emph" t nil nil ) + ( ?y "\\mathtt" "\\texttt" t nil nil ) + ( ?f "\\mathsf" "\\textsf" t nil nil ) + ( ?0 "\\textstyle" nil nil nil nil ) + ( ?1 "\\displaystyle" nil nil nil nil ) + ( ?2 "\\scriptstyle" nil nil nil nil ) + ( ?3 "\\scriptscriptstyle" nil nil nil nil ) + ) + "Default for cdlatex-math-modify-alist.") + +(defconst cdlatex-math-symbol-alist-default + '( + ( ?a ("\\alpha" )) + ( ?A ("\\forall" "\\aleph")) + ( ?b ("\\beta" )) + ( ?B ("" )) + ( ?c ("" "" "\\cos")) + ( ?C ("" "" "\\arccos")) + ( ?d ("\\delta" "\\partial")) + ( ?D ("\\Delta" "\\nabla")) + ( ?e ("\\epsilon" "\\varepsilon" "\\exp")) + ( ?E ("\\exists" "" "\\ln")) + ( ?f ("\\phi" "\\varphi")) + ( ?F ("" )) + ( ?g ("\\gamma" "" "\\lg")) + ( ?G ("\\Gamma" "" "10^{?}")) + ( ?h ("\\eta" "\\hbar")) + ( ?H ("" )) + ( ?i ("\\in" "\\imath")) + ( ?I ("" "\\Im")) + ( ?j ("" "\\jmath")) + ( ?J ("" )) + ( ?k ("\\kappa" )) + ( ?K ("" )) + ( ?l ("\\lambda" "\\ell" "\\log")) + ( ?L ("\\Lambda" )) + ( ?m ("\\mu" )) + ( ?M ("" )) + ( ?n ("\\nu" "" "\\ln")) + ( ?N ("\\nabla" "" "\\exp")) + ( ?o ("\\omega" )) + ( ?O ("\\Omega" "\\mho")) + ( ?p ("\\pi" "\\varpi")) + ( ?P ("\\Pi" )) + ( ?q ("\\theta" "\\vartheta")) + ( ?Q ("\\Theta" )) + ( ?r ("\\rho" "\\varrho")) + ( ?R ("" "\\Re")) + ( ?s ("\\sigma" "\\varsigma" "\\sin")) + ( ?S ("\\Sigma" "" "\\arcsin")) + ( ?t ("\\tau" "" "\\tan")) + ( ?T ("" "" "\\arctan")) + ( ?u ("\\upsilon" )) + ( ?U ("\\Upsilon" )) + ( ?v ("\\vee" )) + ( ?V ("\\Phi" )) + ( ?w ("\\xi" )) + ( ?W ("\\Xi" )) + ( ?x ("\\chi" )) + ( ?X ("" )) + ( ?y ("\\psi" )) + ( ?Y ("\\Psi" )) + ( ?z ("\\zeta" )) + ( ?Z ("" )) + ( ? ("" )) + ( ?0 ("\\emptyset" )) + ( ?1 ("" )) + ( ?2 ("" )) + ( ?3 ("" )) + ( ?4 ("" )) + ( ?5 ("" )) + ( ?6 ("" )) + ( ?7 ("" )) + ( ?8 ("\\infty" )) + ( ?9 ("" )) + ( ?! ("\\neg" )) + ( ?@ ("" )) + ( ?# ("" )) + ( ?$ ("" )) + ( ?% ("" )) + ( ?^ ("\\uparrow" )) + ( ?& ("\\wedge" )) + ( ?\? ("" )) + ( ?~ ("\\approx" "\\simeq")) + ( ?_ ("\\downarrow" )) + ( ?+ ("\\cup" )) + ( ?- ("\\leftrightarrow" "\\longleftrightarrow" )) + ( ?* ("\\times" )) + ( ?/ ("\\not" )) + ( ?| ("\\mapsto" "\\longmapsto")) + ( ?\\ ("\\setminus" )) + ( ?\" ("" )) + ( ?= ("\\Leftrightarrow" "\\Longleftrightarrow")) + ( ?\( ("\\langle" )) + ( ?\) ("\\rangle" )) + ( ?\[ ("\\Leftarrow" "\\Longleftarrow")) + ( ?\] ("\\Rightarrow" "\\Longrightarrow")) + ( ?{ ("\\subset" )) + ( ?} ("\\supset" )) + ( ?< ("\\leftarrow" "\\longleftarrow" "\\min")) + ( ?> ("\\rightarrow" "\\longrightarrow" "\\max")) + ( ?` ("" )) + ( ?' ("\\prime" )) + ( ?. ("\\cdot" )) + ) + "Default for cdlatex-math-symbol-alist." + ) + +;;; --------------------------------------------------------------------------- + +(defconst cdlatex-env-alist-default + '( +;;------------------------------------ +( "abstract" +"\\begin{abstract} +? +\\end{abstract}" +nil +) +;;------------------------------------ +( "appendix" +"\\begin{appendix} +? +\\end{appendix}" +nil +) +;;------------------------------------ +( "array" +"\\begin{array}[tb]{?lcrp{width}*{num}{lcrp{}}|} + & & & \\\\ +\\end{array}" +" & & &" +) +;;------------------------------------ +( "center" +"\\begin{center} +? \\\\ +\\end{center}" +nil +) +;;------------------------------------ +( "deflist" +"\\begin{deflist}{width-text} +\\item ? +\\end{deflist}" +"\\item ?" +) +;;------------------------------------ +( "description" +"\\begin{description} +\\item[?] +\\end{description}" +"\\item[?] " +) +;;------------------------------------ +( "displaymath" +"\\begin{displaymath} +? +\\end{displaymath}" +nil +) +;;------------------------------------ +( "document" +"\\begin{document} +? +\\end{document}" +nil +) +;;------------------------------------ +( "enumerate" +"\\begin{enumerate} +\\itemAUTOLABEL ? +\\end{enumerate}" +"\\itemAUTOLABEL ?" +) +;;------------------------------------ +( "eqnarray" +"\\begin{eqnarray} +AUTOLABEL +? & & \\\\ +\\end{eqnarray}" +"\\\\AUTOLABEL +? & & " +) +;;------------------------------------ +( "eqnarray*" +"\\begin{eqnarray*} +? & & \\\\ +\\end{eqnarray*}" +"\\\\? & & " +) +;;------------------------------------ +( "equation" +"\\begin{equation} +AUTOLABEL +? +\\end{equation}" +nil +) +;;------------------------------------ +( "figure" +"\\begin{figure}[htbp] +\\centerline{\\includegraphics[]{AUTOFILE}} +\\caption[]{AUTOLABEL ?} +\\end{figure}" +nil +) +;;------------------------------------ +( "figure*" +"\\begin{figure*}[htbp] +\\centerline{\includegraphics[]{AUTOFILE} +\\end{figure*}" +nil +) +;;------------------------------------ +( "flushleft" +"\\begin{flushleft} +? \\\\ +\\end{flushleft}" +"\\\\?" +) +;;------------------------------------ +( "flushright" +"\\begin{flushright} +? \\\\ +\\end{flushright}" +"\\\\?" +) +;;------------------------------------ +( "fussypar" +"\\begin{fussypar} +? +\\end{fussypar}" +nil +) +;;------------------------------------ +( "itemize" +"\\begin{itemize} +\\item ? +\\end{itemize}" +"\\item ?" +) +;;------------------------------------ +( "letter" +"\\begin{letter} +? +\\end{letter}" +nil +) +;;------------------------------------ +( "list" +"\\begin{list}{}{} +\\item ? +\\end{list}" +"\\item ?" +) +;;------------------------------------ +( "math" +"\\begin{math} +? +\\end{math}" +nil +) +;;------------------------------------ +( "minipage" +"\\begin{minipage}[bt]{?.cm} + +\\end{minipage}" +nil +) +;;------------------------------------ +( "picture" +"\\begin{picture}(,)(,) +? +\\end{picture}" +nil +) +;;------------------------------------ +( "quotation" +"\\begin{quotation} +? +\\end{quotation}" +nil +) +;;------------------------------------ +( "quote" +"\\begin{quote} +? +\\end{quote}" +nil +) +;;------------------------------------ +( "sloppypar" +"\\begin{sloppypar} +? +\\end{sloppypar}" +nil +) +;;------------------------------------ +( "tabbing" +"\\begin{tabbing} +? \\= \\= \\= \\= \\\\[0.5ex] + \\> \\> \\> \\> \\\\ +\\end{tabbing}" +"\\\\?" +) +;;------------------------------------ +( "table" +"\\begin{table}[htbp] +\\caption[]{AUTOLABEL ?} +\\vspace{4mm} + +\\end{table}" +nil +) +;;------------------------------------ +( "tabular" +"\\begin{tabular}[tb]{lcrp{width}*{num}{lcrp{}}|} +? +\\end{tabular}" +nil +) +;;------------------------------------ +( "tabular*" +"\\begin{tabular*}{width}[tb]{lcrp{width}*{num}{lcrp{}}|} +? +\\end{tabular*}" +nil +) +;;------------------------------------ +( "thebibliography" +"\\begin{thebibliography}{} + +\\bibitem[?]{} + +\\end{thebibliography}" +" +\\bibitem[?]{} +") +;;------------------------------------ +( "theindex" +"\\begin{theindex} +? +\\end{theindex}" +nil +) +;;------------------------------------ +( "titlepage" +"\\begin{titlepage} + +\\title{?} + +\\author{ + \\\\ + \\\\ +%\\thanks{} +%\\and +} + +\\date{\\today} + +\\end{titlepage}" +nil +) +;;------------------------------------ +( "trivlist" +"\\begin{trivlist} +? +\\end{trivlist}" +nil +) +;;------------------------------------ +( "verbatim" +"\\begin{verbatim} +? +\\end{verbatim}" +nil +) +;;------------------------------------ +( "verbatim*" +"\\begin{verbatim*} +? +\\end{verbatim*}" +nil +) +;;------------------------------------ +( "verse" +"\\begin{verse} +? \\\\ +\\end{verse}" +nil +) +;;------------------------------------ +;; AMS-LaTeX +( "align" +"\\begin{align} +AUTOLABEL +? +\\end{align}" +"\\\\AUTOLABEL +?") +;;------------------------------------ +( "align*" +"\\begin{align*} +? +\\end{align*}" +"\\\\?") +;;------------------------------------ +( "alignat" +"\\begin{alignat}{?} +AUTOLABEL + +\\end{alignat}" +"\\\\AUTOLABEL +?") +;;------------------------------------ +( "alignat*" +"\\begin{alignat*}{?} + +\\end{alignat*}" +"\\\\?") +;;------------------------------------ +( "xalignat" +"\\begin{xalignat}{?} +AUTOLABEL + +\\end{xalignat}" +"\\\\AUTOLABEL +?") +;;------------------------------------ +( "xalignat*" +"\\begin{xalignat*}{?} + +\\end{xalignat*}" +"\\\\?") +;;------------------------------------ +( "xxalignat" +"\\begin{xxalignat}{?} + +\\end{xxalignat}" +"\\\\?") +;;------------------------------------ +("multline" +"\\begin{multline} +AUTOLABEL +? +\\end{multline}" +"\\\\AUTOLABEL +?") +;;------------------------------------ +("multline*" +"\\begin{multline*} +? +\\end{multline*}" +"?") +;;------------------------------------ +( "flalign" +"\\begin{flalign} +AUTOLABEL +? +\\end{flalign}" +"\\\\AUTOLABEL +?" +) +;;------------------------------------ +( "flalign*" +"\\begin{flalign*} +? +\\end{flalign*}" +"\\\\?" +) +;;------------------------------------ +( "gather" +"\\begin{gather} +AUTOLABEL +? +\\end{gather}" +"\\\\AUTOLABEL +?") +;;------------------------------------ +( "gather*" +"\\begin{gather*} +? +\\end{gather*}" +"\\\\?") +;;------------------------------------ +;;; SOME NON-STANDARD ENVIRONMENTS +;; figure environment for the epsf macro package +( "epsfigure" +"\\begin{figure}[htbp] +\\centerline{\\epsfxsize=\\textwidth \\epsffile{?.eps}} +\\caption[]{AUTOLABEL} +\\end{figure}" +nil +) +;;------------------------------------ +;; table environment for AASTeX +( "deluxetable" +"\\begin{deluxetable}{?lcrp{width}*{num}{lcrp{}}} +\\tablecolumns{} +\\tablewidth{0pt} +\\tablecaption{AUTOLABEL } +\\tablehead{ \\colhead{} & \colhead{} & \\multicolumn{3}{c}{} } +\\startdata + & & \\nl +\\enddata +\\end{deluxetable}" +nil +) +;;------------------------------------ +;; figure environments for A&A +( "aafigure" +"\\begin{figure} +\\resizebox{\\hsize}{!}{\\includegraphics{?.eps}} +\\caption[]{AUTOLABEL} +\\end{figure}" +nil +) +;;------------------------------------ +( "aafigure*" +"\\begin{figure*} +\\resizebox{12cm}{!}{\\includegraphics{?.eps}} +\\caption[]{AUTOLABEL} +\\end{figure*}" +nil +) +)) + +;;; --------------------------------------------------------------------------- +;;; +;;; Functions to compile the tables, reset the mode etc. + +(defun cdlatex-reset-mode () + "Reset CDLaTeX Mode. Required to implement changes to some list variables. +This function will compile the information in `cdlatex-label-alist' and similar +variables. It is called when CDLaTeX is first used, and after changes to +these variables via `cdlatex-add-to-label-alist'." + (interactive) + (cdlatex-compute-tables)) + + +(defun cdlatex-compute-tables () + ;; Update tables not connected with ref and cite support + + (setq cdlatex-env-alist-comb + (cdlatex-uniquify + (append cdlatex-env-alist + cdlatex-env-alist-default))) + ;; Merge the user specified lists with the defaults + (setq cdlatex-command-alist-comb + (cdlatex-uniquify + (append cdlatex-command-alist + cdlatex-command-alist-default))) + (setq cdlatex-math-symbol-alist-comb + (cdlatex-uniquify + (mapcar (lambda (x) + (if (listp (nth 1 x)) + (cons (car x) (nth 1 x)) + x)) + (append cdlatex-math-symbol-alist + cdlatex-math-symbol-alist-default)))) + (setq cdlatex-math-modify-alist-comb + (cdlatex-uniquify + (append cdlatex-math-modify-alist + cdlatex-math-modify-alist-default))) + + ;; find out how many levels are needed for the math symbol stuff + (let ((maxlev 0) (list cdlatex-math-symbol-alist-comb) entry) + (while (setq entry (pop list)) + (setq maxlev (max maxlev (length (nth 1 list))) + list (cdr list))) + (setq cdlatex-math-symbol-no-of-levels (1- maxlev))) + + ;; The direct key bindings. + (let (map dummy-map prefix modifiers symbol bindings) + (loop for level from 1 to cdlatex-math-symbol-no-of-levels do + (setq dummy-map (make-sparse-keymap)) + (setq prefix (car (nth (1- level) + cdlatex-math-symbol-direct-bindings))) + (setq modifiers (cdr + (nth (1- level) + cdlatex-math-symbol-direct-bindings))) + (when (or prefix modifiers) + (cond + ((stringp prefix) (setq prefix (read-kbd-macro prefix))) + ((integerp prefix) (setq prefix (vector prefix)))) + + (if (null prefix) + (setq map cdlatex-mode-map) + (setq map (make-keymap)) + (define-key cdlatex-mode-map prefix (setq map + (make-keymap)))) + (defun cdlatex-nop () (interactive)) + (define-key dummy-map + (vector (append modifiers (list ?a))) 'cdlatex-nop) + (push (cons level (substitute-command-keys + "\\<dummy-map>\\[cdlatex-nop]")) + bindings) + (mapcar (lambda (entry) + (setq symbol (nth level entry)) + (when (and symbol (stringp symbol) + (not (equal "" symbol))) + (define-key + map (vector (append modifiers (list (car entry)))) + (list 'lambda '() '(interactive) + (list 'cdlatex-insert-math symbol))))) + cdlatex-math-symbol-alist-comb))) + (put 'cdlatex-math-symbol-alist-comb 'cdlatex-bindings bindings))) + +(defun cdlatex-insert-math (string) + (cdlatex-ensure-math) + (insert string) + (if (string-match "\\?" string) + (cdlatex-position-cursor))) + +;;; Keybindings -------------------------------------------------------------- + +(define-key cdlatex-mode-map "$" 'cdlatex-dollar) +(define-key cdlatex-mode-map "(" 'cdlatex-pbb) +(define-key cdlatex-mode-map "{" 'cdlatex-pbb) +(define-key cdlatex-mode-map "[" 'cdlatex-pbb) +(define-key cdlatex-mode-map "|" 'cdlatex-pbb) +(define-key cdlatex-mode-map "<" 'cdlatex-pbb) +(define-key cdlatex-mode-map "^" 'cdlatex-sub-superscript) +(define-key cdlatex-mode-map "_" 'cdlatex-sub-superscript) + +(define-key cdlatex-mode-map "\t" 'cdlatex-tab) +(define-key cdlatex-mode-map "\C-c?" 'cdlatex-command-help) +(define-key cdlatex-mode-map "\C-c{" 'cdlatex-environment) +(define-key cdlatex-mode-map [(control return)] 'cdlatex-item) + +(define-key cdlatex-mode-map + (cdlatex-get-kbd-vector cdlatex-math-symbol-prefix) + 'cdlatex-math-symbol) +(define-key cdlatex-mode-map + (cdlatex-get-kbd-vector cdlatex-math-modify-prefix) + 'cdlatex-math-modify) + +;;; Menus -------------------------------------------------------------------- + +;; Define a menu for the menu bar if Emacs is running under X + +(require 'easymenu) + +(easy-menu-define + cdlatex-mode-menu cdlatex-mode-map + "Menu used in CDLaTeX mode" + '("CDLTX" + ["\\begin{...} \\label" cdlatex-environment t] + ["\\item \\label" cdlatex-item t] + "----" + ["Insert Math Symbol" cdlatex-math-symbol t] + ["Modify Math Symbol" cdlatex-math-modify t] + "----" + ("Customize" + ["Browse CDLaTeX group" cdlatex-customize t] + "---" + ["Build Full Customize Menu" cdlatex-create-customize-menu + (fboundp 'customize-menu-create)]) + "----" + ["Show documentation" cdlatex-show-commentary t] + ["Help with KEYWORD Cmds" cdlatex-command-help t] + ["Reset CDLaTeX Mode" cdlatex-reset-mode t])) + +;(eval-after-load "cus-edit" +; '(and (fboundp 'customize-menu-create) (cdlatex-create-customize-menu))) + +;;; Run Hook ------------------------------------------------------------------ + +(run-hooks 'cdlatex-load-hook) + +;;; That's it! ---------------------------------------------------------------- + +; Make sure tabels are compiled +(cdlatex-compute-tables) + +(provide 'cdlatex) + +;;;============================================================================ + +;;; cdlatex.el ends here