summaryrefslogtreecommitdiff
path: root/elpa/auctex-13.1.3/style/empheq.el
diff options
context:
space:
mode:
Diffstat (limited to 'elpa/auctex-13.1.3/style/empheq.el')
-rw-r--r--elpa/auctex-13.1.3/style/empheq.el485
1 files changed, 485 insertions, 0 deletions
diff --git a/elpa/auctex-13.1.3/style/empheq.el b/elpa/auctex-13.1.3/style/empheq.el
new file mode 100644
index 0000000..b9f32b1
--- /dev/null
+++ b/elpa/auctex-13.1.3/style/empheq.el
@@ -0,0 +1,485 @@
+;;; empheq.el --- AUCTeX style for `empheq.sty' (v2.14) -*- lexical-binding: t; -*-
+
+;; Copyright (C) 2016-2021 Free Software Foundation, Inc.
+
+;; Author: Arash Esbati <arash@gnu.org>
+;; Maintainer: auctex-devel@gnu.org
+;; Created: 2016-08-07
+;; 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 `empheq.sty' (v2.14) from 2014/08/04.
+;; `empheq.sty' is part of TeXLive.
+
+;;; Code:
+
+(require 'tex)
+(require 'latex)
+(eval-when-compile
+ (require 'cl-lib))
+
+;; Silence the compiler:
+(declare-function font-latex-add-keywords
+ "font-latex"
+ (keywords class))
+
+(declare-function LaTeX-item-equation-alignat
+ "amsmath" (&optional suppress))
+
+(defvar LaTeX-mathtools-package-options)
+
+(defvar LaTeX-empheq-key-val-options
+ `(("box")
+ ("innerbox")
+ ("left" ,(mapcar
+ (lambda (x)
+ (concat TeX-esc x))
+ '("empheqlbrace"
+ "empheqlbrack"
+ "empheqlangle"
+ "empheqlparen"
+ "empheqlvert"
+ "empheqlVert"
+ "empheqlfloor"
+ "empheqlceil"
+ "empheqbiglbrace"
+ "empheqbiglbrack"
+ "empheqbiglangle"
+ "empheqbiglparen"
+ "empheqbiglvert"
+ "empheqbiglVert"
+ "empheqbiglfloor"
+ "empheqbiglceil")))
+ ("right" ,(mapcar
+ (lambda (x)
+ (concat TeX-esc x))
+ '("empheqrbrace"
+ "empheqrbrack"
+ "empheqrangle"
+ "empheqrparen"
+ "empheqrvert"
+ "empheqrVert"
+ "empheqrfloor"
+ "empheqrceil"
+ "empheqbigrbrace"
+ "empheqbigrbrack"
+ "empheqbigrangle"
+ "empheqbigrparen"
+ "empheqbigrvert"
+ "empheqbigrVert"
+ "empheqbigrfloor"
+ "empheqbigrceil")))
+ ("outerbox")
+ ("marginbox"))
+ "Key=value options for environments from empheq.sty.")
+
+(defvar LaTeX-empheq-supported-amsmath-envs
+ '("equation" "equation*"
+ "align" "align*"
+ "gather" "gather*"
+ "flalign" "flalign*"
+ "alignat" "alignat*"
+ "multline" "multline*")
+ "List of amsmath environments supported by empheq package.")
+
+(defvar LaTeX-empheq-package-options
+ '("overload" "overload2" "ntheorem" "newmultline" "oldmultline")
+ "Package options for the empheq package.")
+(TeX-load-style "mathtools")
+;; Add elements from `LaTeX-mathtools-package-options' only once
+;; and not every time the style hook runs
+(dolist (elt LaTeX-mathtools-package-options)
+ (add-to-list 'LaTeX-empheq-package-options elt))
+
+;; Setup for \Declare(Left|Right)Delimiter:
+
+(TeX-auto-add-type "empheq-declaredelimiter" "LaTeX")
+
+(defvar LaTeX-empheq-declaredelimiter-regexp
+ `(,(concat "\\\\Declare\\(Left\\|Right\\)Delimiter"
+ "[ \t\n\r%]*"
+ "\\(?:\\[[^]]*\\]\\)?"
+ "[ \t\n\r%]*"
+ "{"
+ (regexp-quote TeX-esc)
+ "\\([^}]+\\)}")
+ (2 1) LaTeX-auto-empheq-declaredelimiter)
+ "Matches the argument of \\Declare(Left|Right)Delimiter from empheq package.")
+
+(defun LaTeX-empheq-auto-prepare ()
+ "Clear `LaTeX-auto-empheq-declaredelimiter' before parsing."
+ (setq LaTeX-auto-empheq-declaredelimiter nil))
+
+(defun LaTeX-empheq-auto-cleanup ()
+ "Process parsed delimiters."
+ (dolist (delim (mapcar #'car (LaTeX-empheq-declaredelimiter-list)))
+ (TeX-add-symbols (concat "empheq" delim)
+ (concat "empheqbig" delim))))
+
+(add-hook 'TeX-auto-prepare-hook #'LaTeX-empheq-auto-prepare t)
+(add-hook 'TeX-auto-cleanup-hook #'LaTeX-empheq-auto-cleanup t)
+(add-hook 'TeX-update-style-hook #'TeX-auto-parse t)
+
+(defun LaTeX-empheq-key-val-options ()
+ "Return an updated list of key=vals from empheq package.
+This function retrieves values of user defined left and right
+delimiters and prepends them to variable
+`LaTeX-empheq-key-val-options'."
+ (append
+ (when (LaTeX-empheq-declaredelimiter-list)
+ (let ((lvals (copy-sequence
+ (cadr (assoc "left" LaTeX-empheq-key-val-options))))
+ (rvals (copy-sequence
+ (cadr (assoc "right" LaTeX-empheq-key-val-options)))))
+ (dolist (delims (LaTeX-empheq-declaredelimiter-list))
+ (let ((delim (car delims))
+ (where (cadr delims)))
+ (if (string= where "Left")
+ (progn
+ (cl-pushnew (concat TeX-esc "empheq" delim) lvals :test #'equal)
+ (cl-pushnew (concat TeX-esc "empheqbig" delim) lvals :test #'equal))
+ (cl-pushnew (concat TeX-esc "empheq" delim) rvals :test #'equal)
+ (cl-pushnew (concat TeX-esc "empheqbig" delim) rvals :test #'equal))))
+ `(("left" ,lvals)
+ ("right" ,rvals))))
+ LaTeX-empheq-key-val-options))
+
+(defun LaTeX-empheq-env (env)
+ "Query for a supported amsmath environment and insert it accordingly.
+ENV is the name of environment passed to the function in the style hook."
+ (let* ((keyvals (TeX-read-key-val t (LaTeX-empheq-key-val-options)))
+ (amsenv (completing-read
+ (TeX-argument-prompt nil nil "amsmath environment")
+ LaTeX-empheq-supported-amsmath-envs))
+ (ncols (when (or (string= amsenv "alignat")
+ (string= amsenv "alignat*"))
+ (TeX-read-string
+ (TeX-argument-prompt nil nil "Number of columns"))))
+ num)
+ (LaTeX-insert-environment
+ env
+ (concat
+ (when (and keyvals (not (string= keyvals "")))
+ (concat LaTeX-optop keyvals LaTeX-optcl))
+ TeX-grop
+ (if (and ncols (not (string= ncols "")))
+ (concat amsenv "=" ncols)
+ amsenv)
+ TeX-grcl))
+ (when (and (assoc amsenv LaTeX-label-alist)
+ (LaTeX-label amsenv 'environment))
+ (LaTeX-newline)
+ (indent-according-to-mode))
+ (when (and ncols (not (string= ncols "")))
+ (setq num (string-to-number ncols))
+ (save-excursion
+ (insert (make-string (+ num num -1) ?&))))))
+
+(defun LaTeX-empheq-env-overload (env &optional _ignore)
+ "Insert amsmath ENV's when option overload is given to empheq package.
+This function combines the capabilities of `LaTeX-env-label' and
+`LaTeX-amsmath-env-alignat'. It overwrites the definitions of
+`amsmath.el'."
+ (if (or (string= env "alignat")
+ (string= env "alignat*"))
+ (let ((ncols (TeX-read-string
+ (TeX-argument-prompt nil nil "Number of columns")))
+ (keyvals (TeX-read-key-val t
+ (LaTeX-empheq-key-val-options)
+ "empheq options (k=v)")))
+ (LaTeX-insert-environment env
+ (concat TeX-grop ncols TeX-grcl
+ (when (and keyvals
+ (not (string= keyvals "")))
+ (concat LaTeX-optop
+ keyvals
+ LaTeX-optcl))))
+ (LaTeX-item-equation-alignat t))
+ (let ((keyvals
+ (TeX-read-key-val t
+ (LaTeX-empheq-key-val-options)
+ "empheq options (k=v)")))
+ (LaTeX-insert-environment env
+ (when (and keyvals
+ (not (string= keyvals "")))
+ (concat LaTeX-optop
+ keyvals
+ LaTeX-optcl)))
+ (when (and (assoc env LaTeX-label-alist)
+ (LaTeX-label env 'environment))
+ (LaTeX-newline)
+ (indent-according-to-mode)))))
+
+(defun LaTeX-empheq-item-equation ()
+ "Insert contents to terminate a line in multi-line equations environment.
+Put line break macro on the last line. Next, if the current
+environment wants \\label, insert it also. And insert suitable
+number of ampersands if possible."
+ (let ((env (LaTeX-current-environment))
+ amsenv ncols match)
+ (save-excursion
+ (LaTeX-find-matching-begin)
+ (re-search-forward (concat (regexp-quote TeX-esc)
+ "begin" TeX-grop env TeX-grcl))
+ (when (looking-at "[ \t\n\r%]*\\[")
+ (forward-sexp))
+ (re-search-forward "[ \t\n\r%]*{\\([^}]+\\)}")
+ (setq match (replace-regexp-in-string "[ \t\n\r%]" ""
+ (match-string-no-properties 1)))
+ (if (string-match "=" match)
+ (progn
+ (setq amsenv (car (split-string match "=")))
+ (setq ncols (string-to-number (cadr (split-string match "=")))))
+ (setq amsenv match)))
+ ;; Do not ask for "\\" if in "equation" or "equation*" since these
+ ;; are single line equations only
+ (if (or (string= amsenv "equation")
+ (string= amsenv "equation*"))
+ ;; Nullify the effect of `M-RET'
+ (progn
+ (message "This environment does not support multi-line equations")
+ (end-of-line 0)
+ (kill-line 1))
+ (progn
+ (end-of-line 0)
+ (just-one-space)
+ (TeX-insert-macro "\\")
+ (forward-line 1)
+ (indent-according-to-mode)))
+ ;; Add a new label only if not in "equation"
+ (when (and (not (string= amsenv "equation"))
+ (assoc amsenv LaTeX-label-alist)
+ (LaTeX-label amsenv 'environment))
+ (LaTeX-newline)
+ (indent-according-to-mode))
+ (when ncols
+ (save-excursion
+ (insert (make-string (+ ncols ncols -1) ?&))))))
+
+(TeX-add-style-hook
+ "empheq"
+ (lambda ()
+
+ ;; Add empheq to parser
+ (TeX-auto-add-regexp LaTeX-empheq-declaredelimiter-regexp)
+
+ ;; Load amsmath.el and mathtools.el
+ (TeX-run-style-hooks "amsmath" "mathtools")
+
+ (LaTeX-add-environments
+ '("empheq" LaTeX-empheq-env))
+
+ ;; Add "empheq" to `LaTeX-item-list' and run
+ ;; `LaTeX-empheq-item-equation' when `M-RET' is invoked
+ (add-to-list 'LaTeX-item-list '("empheq" . LaTeX-empheq-item-equation) t)
+
+ ;; Reftex support: Use `reftex-add-label-environments'
+ (when (fboundp 'reftex-add-label-environments)
+ (reftex-add-label-environments '(("empheq" ?e nil nil t))))
+
+ (TeX-add-symbols
+ '("empheqset" (TeX-arg-key-val (LaTeX-empheq-key-val-options)))
+
+ ;; 1.4 Special delimiters
+ ;; Normal
+ '("empheqlbrace" TeX-arg-insert-right-brace-maybe)
+ '("empheqrbrace")
+ '("empheqlbrack" TeX-arg-insert-right-brace-maybe)
+ '("empheqrbrack")
+ '("empheqlangle" TeX-arg-insert-right-brace-maybe)
+ '("empheqrangle")
+ '("empheqlparen" TeX-arg-insert-right-brace-maybe)
+ '("empheqrparen")
+ '("empheqlvert" TeX-arg-insert-right-brace-maybe)
+ '("empheqrvert")
+ '("empheqlVert" TeX-arg-insert-right-brace-maybe)
+ '("empheqrVert")
+ '("empheqlfloor" TeX-arg-insert-right-brace-maybe)
+ '("empheqrfloor")
+ '("empheqlceil" TeX-arg-insert-right-brace-maybe)
+ '("empheqrceil")
+ ;; Bigger
+ '("empheqbiglbrace" TeX-arg-insert-right-brace-maybe)
+ '("empheqbigrbrace")
+ '("empheqbiglbrack" TeX-arg-insert-right-brace-maybe)
+ '("empheqbigrbrack")
+ '("empheqbiglangle" TeX-arg-insert-right-brace-maybe)
+ '("empheqbigrangle")
+ '("empheqbiglparen" TeX-arg-insert-right-brace-maybe)
+ '("empheqbigrparen")
+ '("empheqbiglvert" TeX-arg-insert-right-brace-maybe)
+ '("empheqbigrvert")
+ '("empheqbiglVert" TeX-arg-insert-right-brace-maybe)
+ '("empheqbigrVert")
+ '("empheqbiglfloor" TeX-arg-insert-right-brace-maybe)
+ '("empheqbigrfloor")
+ '("empheqbiglceil" TeX-arg-insert-right-brace-maybe)
+ '("empheqbigrceil"))
+
+ ;; Append delimiters to `TeX-braces-association'
+ (make-local-variable 'TeX-braces-association)
+ (let ((delimiters '(("\\empheqlbrace" . "\\empheqrbrace")
+ ("\\empheqlbrack" . "\\empheqrbrack")
+ ("\\empheqlangle" . "\\empheqrangle")
+ ("\\empheqlparen" . "\\empheqrparen")
+ ("\\empheqlvert" . "\\empheqrvert")
+ ("\\empheqlVert" . "\\empheqrVert")
+ ("\\empheqlfloor" . "\\empheqrfloor")
+ ("\\empheqlceil" . "\\empheqrceil")
+ ("\\empheqbiglbrace" . "\\empheqbigrbrace")
+ ("\\empheqbiglbrack" . "\\empheqbigrbrack")
+ ("\\empheqbiglangle" . "\\empheqbigrangle")
+ ("\\empheqbiglparen" . "\\empheqbigrparen")
+ ("\\empheqbiglvert" . "\\empheqbigrvert")
+ ("\\empheqbiglVert" . "\\empheqbigrVert")
+ ("\\empheqbiglfloor" . "\\empheqbigrfloor")
+ ("\\empheqbiglceil" . "\\empheqbigrceil"))))
+ (dolist (elt delimiters)
+ (add-to-list 'TeX-braces-association elt t)))
+
+ ;; 2.2.1 Using multline
+ (when (LaTeX-provided-package-options-member "empheq" "oldmultline")
+ (LaTeX-add-environments
+ '("MTmultlined" LaTeX-mathtools-env-multlined)))
+
+ ;; 2.2.2 The overload option
+ ;; I simplify it and ignore the additional feature overload2:
+ (when (or (LaTeX-provided-package-options-member "empheq" "overload")
+ (LaTeX-provided-package-options-member "empheq" "overload2"))
+ (LaTeX-add-environments
+ '("align" LaTeX-empheq-env-overload)
+ '("alignat" LaTeX-empheq-env-overload)
+ '("equation" LaTeX-empheq-env-overload)
+ '("flalign" LaTeX-empheq-env-overload)
+ '("gather" LaTeX-empheq-env-overload)
+ '("multline" LaTeX-empheq-env-overload)
+ '("align*" LaTeX-env-args [TeX-arg-key-val (LaTeX-empheq-key-val-options)])
+ '("alignat*" LaTeX-empheq-env-overload)
+ '("equation*" LaTeX-env-args [TeX-arg-key-val (LaTeX-empheq-key-val-options)])
+ '("flalign*" LaTeX-env-args [TeX-arg-key-val (LaTeX-empheq-key-val-options)])
+ '("gather*" LaTeX-env-args [TeX-arg-key-val (LaTeX-empheq-key-val-options)])
+ '("multline*" LaTeX-env-args [TeX-arg-key-val (LaTeX-empheq-key-val-options)])
+
+ ;; Original definitions are stored prefixed with "AmS"
+ '("AmSalign" LaTeX-env-label)
+ '("AmSalignat" LaTeX-amsmath-env-alignat)
+ '("AmSequation" LaTeX-env-label)
+ '("AmSflalign" LaTeX-env-label)
+ '("AmSgather" LaTeX-env-label)
+ '("AmSmultline" LaTeX-env-label)
+ '("AmSalign*")
+ '("AmSalignat*" LaTeX-amsmath-env-alignat)
+ '("AmSequation*")
+ '("AmSflalign*")
+ '("AmSgather*")
+ '("AmSmultline*"))
+
+ ;; Append original definitions to `LaTeX-label-alist'
+ (let ((envs '("AmSalign"
+ "AmSalignat"
+ "AmSequation"
+ "AmSflalign"
+ "AmSgather"
+ "AmSmultline")))
+ (dolist (env envs)
+ (add-to-list 'LaTeX-label-alist `(,env . LaTeX-amsmath-label) t)))
+
+ ;; RefTeX support: Add original definitions with `reftex-add-label-environments'
+ (when (fboundp 'reftex-add-label-environments)
+ (let ((envs '(("AmSalign" ?e nil nil eqnarray-like)
+ ("AmSequation" ?e nil nil t)
+ ("AmSgather" ?e nil nil eqnarray-like)
+ ("AmSmultline" ?e nil nil t)
+ ("AmSflalign" ?e nil nil eqnarray-like)
+ ("AmSalignat" ?e nil nil alignat-like))))
+ (dolist (env envs)
+ (reftex-add-label-environments `(,env)))))
+
+ ;; Append original definitions to `LaTeX-item-list'; functions
+ ;; are provided by amsmath.el
+ (let ((envs '(("AmSalign" . LaTeX-item-equation)
+ ("AmSalign*" . LaTeX-item-equation)
+ ("AmSflalign" . LaTeX-item-equation)
+ ("AmSalignat" . LaTeX-item-equation-alignat)
+ ("AmSalignat*" . LaTeX-item-equation-alignat)
+ ("AmSflalign*" . LaTeX-item-equation)
+ ("AmSgather" . LaTeX-item-equation)
+ ("AmSgather*" . LaTeX-item-equation)
+ ("AmSmultline" . LaTeX-item-equation)
+ ("AmSmultline*" . LaTeX-item-equation))))
+ (dolist (env envs)
+ (add-to-list 'LaTeX-item-list env t)))
+
+ ;; Ispell skip lists:
+ (TeX-ispell-skip-setcdr
+ `(,(cons (concat "\\(AmS\\(?:align\\(?:\\*\\|at\\*?\\)?\\|"
+ "equation\\*?\\|flalign\\*?\\|gather\\*?\\|multline\\*?\\)\\)")
+ (concat "\\\\end{"
+ "\\(AmS\\(?:align\\(?:\\*\\|at\\*?\\)?\\|"
+ "equation\\*?\\|flalign\\*?\\|gather\\*?\\|multline\\*?\\)\\)}")))))
+
+ ;; 3.2 Support for ntheorem
+ (LaTeX-add-lengths "mintagvsep")
+
+ ;; 4.1 Creating your own delimiters
+ (TeX-add-symbols
+ '("DeclareLeftDelimiter"
+ [ "Space adjustment" ]
+ (TeX-arg-eval
+ (lambda ()
+ (let ((delim (TeX-read-string (concat "Delimiter: " TeX-esc))))
+ (TeX-add-symbols (concat "empheq" delim)
+ (concat "empheqbig" delim))
+ (LaTeX-add-empheq-declaredelimiters `(,delim "Left"))
+ (concat TeX-esc delim)))))
+
+ '("DeclareRightDelimiter"
+ [ "Space adjustment" ]
+ (TeX-arg-eval
+ (lambda ()
+ (let ((delim (TeX-read-string (concat "Delimiter: " TeX-esc))))
+ (TeX-add-symbols (concat "empheq" delim)
+ (concat "empheqbig" delim))
+ (LaTeX-add-empheq-declaredelimiters `(,delim "Right"))
+ (concat TeX-esc delim))))))
+
+ ;; 4.2 Fine-tuning of delimiters
+ (LaTeX-add-lengths "EmphEqdelimitershortfall")
+ (LaTeX-add-counters "EmphEqdelimiterfactor")
+
+ (TeX-add-symbols
+ ;; 4.3 Scaling material yourself
+ '("EmphEqdisplayheight" 0)
+ '("EmphEqdisplaydepth" 0)
+ ;; 6.1 New empheq-like environments
+ '("EmphEqMainEnv" 0)
+ '("endEmphEqMainEnv" 0))
+
+ ;; Fontification
+ (when (and (featurep 'font-latex)
+ (eq TeX-install-font-lock 'font-latex-setup))
+ (font-latex-add-keywords '(("empheqset" "{")
+ ("DeclareLeftDelimiter" "[{")
+ ("DeclareRightDelimiter" "[{"))
+ 'function)))
+ TeX-dialect)
+
+;;; empheq.el ends here