summaryrefslogtreecommitdiff
path: root/elpa/auctex-13.1.3/style/mathtools.el
diff options
context:
space:
mode:
Diffstat (limited to 'elpa/auctex-13.1.3/style/mathtools.el')
-rw-r--r--elpa/auctex-13.1.3/style/mathtools.el504
1 files changed, 504 insertions, 0 deletions
diff --git a/elpa/auctex-13.1.3/style/mathtools.el b/elpa/auctex-13.1.3/style/mathtools.el
new file mode 100644
index 0000000..d0e1f26
--- /dev/null
+++ b/elpa/auctex-13.1.3/style/mathtools.el
@@ -0,0 +1,504 @@
+;;; mathtools.el --- Style hook for the LaTeX package `mathtools'. -*- lexical-binding: t; -*-
+
+;; Copyright (C) 2011-2020, 2022 Free Software Foundation, Inc.
+
+;; Author: Mads Jensen <mje@inducks.org>
+;; Created: 2011-02-13
+;; 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 `mathtools.sty'
+
+;;; Comments:
+
+;;; This package serves as a wrapper for amsmath, adding more features
+;;; and fixing a few bugs in amsmath. The mathstyle argument for many
+;;; of the macros is discussed at
+;;; <https://www.tug.org/TUGboat/Articles/tb22-4/tb72perlS.pdf>
+
+;;; Code:
+
+;; Needed for auto-parsing:
+(require 'tex)
+(require 'latex)
+
+;; Silence the compiler:
+(declare-function font-latex-add-keywords
+ "font-latex"
+ (keywords class))
+
+(defvar LaTeX-amsmath-package-options)
+
+;; amsmath options which can be passed directly to mathtools are
+;; appended in the style hook below
+(defvar LaTeX-mathtools-package-options
+ '("fixamsmath" "donotfixamsmathbugs" "allowspaces" "disallowspaces"
+ ;; Update 2013: We now make \(\) and \[\] robust (can be disabled
+ ;; via nonrobust package option)
+ "nonrobust")
+ "Package options for the mathtools package.")
+(TeX-load-style "amsmath")
+(dolist (elt LaTeX-amsmath-package-options)
+ (add-to-list 'LaTeX-mathtools-package-options elt))
+
+(defvar LaTeX-mathtools-key-val-options
+ '(("showonlyrefs")
+ ("mathic" ("true" "false"))
+ ("showmanualtags" ("true" "false"))
+ ;; 3.4.1 Matrices
+ ("smallmatrix-align" ("c" "l" "r"))
+ ("smallmatrix-inner-space")
+ ;; 3.4.2 The multlined environment
+ ("firstline-afterskip")
+ ("lastline-preskip")
+ ("multlined-pos" ("c" "b" "t"))
+ ("multlined-width")
+ ;; 3.4.7 Centered \vdots
+ ("shortvdotsadjustabove")
+ ("shortvdotsadjustbelow")
+ ;; 3.5 Intertext and short intertext
+ ("original-intertext" ("true" "false"))
+ ("original-shortintertext" ("true" "false"))
+ ("above-intertext-sep")
+ ("below-intertext-sep")
+ ("above-shortintertext-sep")
+ ("below-shortintertext-sep")
+ ;; 3.7.2 Vertically centered colon
+ ("centercolon" ("true" "false"))
+ ;; 4.2 Left sub/superscripts
+ ("prescript-sub-format")
+ ("prescript-sup-format")
+ ("prescript-arg-format"))
+ "Options for the \\mathtoolsset command.")
+
+;; Setup for \newtagform
+(TeX-auto-add-type "mathtools-newtagform" "LaTeX")
+
+(defvar LaTeX-mathtools-newtagform-regexp
+ '("\\\\newtagform{\\([^}]+\\)}"
+ 1 LaTeX-auto-mathtools-newtagform)
+ "Matches the first argument of \\newtagform from mathtools package.")
+
+;; Setup for \DeclarePairedDelimiter(X)?:
+(TeX-auto-add-type "mathtools-DeclarePairedDelimiter" "LaTeX")
+
+(defvar LaTeX-mathtools-DeclarePairedDelimiter-regexp
+ `(,(concat "\\\\DeclarePairedDelimiter\\(?:X\\|XPP\\)?"
+ "{?"
+ "\\\\\\([a-zA-Z]+\\)"
+ "}?"
+ "\\(?:\\[\\([0-9]+\\)\\]\\)?")
+ (1 2) LaTeX-auto-mathtools-DeclarePairedDelimiter)
+ "Match the arguments of \\DeclarePairedDelimiterX? from mathtools package.")
+
+;; Setup for \newgathered
+(TeX-auto-add-type "mathtools-newgathered" "LaTeX")
+
+(defvar LaTeX-mathtools-newgathered-regexp
+ '("\\\\newgathered{\\([^}]+\\)}"
+ 1 LaTeX-auto-mathtools-newgathered)
+ "Matches the first argument of \\newgathered from mathtools package.")
+
+(defun LaTeX-mathtools-auto-prepare ()
+ "Clear various variables for mathtools package before parsing."
+ (setq LaTeX-auto-mathtools-newtagform nil
+ LaTeX-auto-mathtools-DeclarePairedDelimiter nil
+ LaTeX-auto-mathtools-newgathered nil))
+
+(defun LaTeX-mathtools-auto-cleanup ()
+ "Process the parsed elements for mathtools package."
+ (when (LaTeX-mathtools-DeclarePairedDelimiter-list)
+ (dolist (delim (LaTeX-mathtools-DeclarePairedDelimiter-list))
+ (let ((cmd (car delim))
+ (arg (cadr delim)))
+ (TeX-add-symbols `(,cmd [ LaTeX-mathtools-arg-mathsize-completion ]
+ ,(if (string= arg "")
+ 1
+ (string-to-number arg)))
+ `(,(concat cmd "*")
+ ,(if (string= arg "")
+ 1
+ (string-to-number arg)))))))
+ (when (LaTeX-mathtools-newgathered-list)
+ (dolist (env (mapcar #'car (LaTeX-mathtools-newgathered-list)))
+ (LaTeX-add-environments env)
+ (add-to-list 'LaTeX-item-list
+ `(,env . LaTeX-item-equation) t)
+ (add-to-list 'LaTeX-label-alist
+ `(,env . LaTeX-amsmath-label) t)
+ (when (fboundp 'reftex-add-label-environments)
+ (reftex-add-label-environments `((,env ?e nil nil t)))))))
+
+(add-hook 'TeX-auto-prepare-hook #'LaTeX-mathtools-auto-prepare t)
+(add-hook 'TeX-auto-cleanup-hook #'LaTeX-mathtools-auto-cleanup t)
+(add-hook 'TeX-update-style-hook #'TeX-auto-parse t)
+
+(defun LaTeX-mathtools-arg-mathstyle-completion (optional)
+ "Query and insert mathstyle argument to various commands.
+If OPTIONAL, insert it as optional argument in brackets."
+ (TeX-argument-insert
+ (completing-read
+ (TeX-argument-prompt optional nil
+ (concat "Math style: " TeX-esc) t)
+ '("displaystyle" "textstyle"
+ "scriptstyle" "scriptscriptstyle"))
+ optional TeX-esc))
+
+(defun LaTeX-mathtools-arg-mathsize-completion (optional)
+ "Query and insert math size argument to various commands.
+If OPTIONAL, insert it as optional argument in brackets."
+ (TeX-argument-insert
+ (completing-read
+ (TeX-argument-prompt optional nil
+ (concat "Size command: " TeX-esc) t)
+ '("big" "Big" "bigg" "Bigg"))
+ optional TeX-esc))
+
+(defun LaTeX-mathtools-arg-declarepaireddelimiter (optional &optional X)
+ "Query and insert various \\DeclarePairedDelimiter macros from mathtools package."
+ (let ((cmd (TeX-read-string (concat "Command: " TeX-esc)))
+ (arg (when X (TeX-read-string
+ (TeX-argument-prompt t nil "Number of arguments")))))
+ (TeX-add-symbols `(,cmd [ LaTeX-mathtools-arg-mathsize-completion ]
+ ,(if X
+ ;; This is no precaution, arg has to be > 0
+ (string-to-number arg)
+ 1))
+ `(,(concat cmd "*")
+ ,(if X
+ (string-to-number arg)
+ 1)))
+ (LaTeX-add-mathtools-DeclarePairedDelimiters
+ `(,cmd ,(if X arg "")))
+ (TeX-argument-insert cmd optional TeX-esc)
+ (when arg
+ (insert (concat LaTeX-optop arg LaTeX-optcl)))))
+
+(defun LaTeX-mathtools-env-multlined (env)
+ "Query and insert two optional arguments for ENV multlined.
+If both arguments are given, insert them in brackets. If only a
+width is given, insert it prefixed with a pair of empty
+brackets."
+ (let ((pos (TeX-read-string
+ (TeX-argument-prompt t nil "Position (t, b or c (default))")))
+ (width (completing-read
+ (TeX-argument-prompt t nil "Width")
+ (mapcar
+ (lambda (x) (concat TeX-esc (car x)))
+ (LaTeX-length-list)))))
+ (LaTeX-insert-environment
+ env
+ (cond (;; both arguments
+ (and pos (not (string= pos ""))
+ width (not (string= width "")))
+ (format "[%s][%s]" pos width))
+ (;; pos not empty, width empty
+ (and pos (not (string= pos ""))
+ (string= width ""))
+ (format "[%s]" pos))
+ (;; pos empty, width not
+ (and (string= pos "")
+ width (not (string= width "")))
+ (format "[][%s]" width))
+ (t nil)))))
+
+(defun LaTeX-mathtools-env-cases (env)
+ "Insert various cases ENVs incl. an ampersand from mathtools package."
+ (LaTeX-insert-environment env)
+ (save-excursion
+ (insert ?&)))
+
+(defun LaTeX-mathtools-item-cases ()
+ "Insert contents to terminate a line in multi-line cases environment.
+Put line break macro on the last line. Next, insert an ampersand."
+ (end-of-line 0)
+ (just-one-space)
+ (TeX-insert-macro "\\")
+ (forward-line 1)
+ (save-excursion
+ (insert ?&)))
+
+(TeX-add-style-hook
+ "mathtools"
+ (lambda ()
+
+ ;; Add mathtools to parser
+ (TeX-auto-add-regexp LaTeX-mathtools-newtagform-regexp)
+ (TeX-auto-add-regexp LaTeX-mathtools-DeclarePairedDelimiter-regexp)
+ (TeX-auto-add-regexp LaTeX-mathtools-newgathered-regexp)
+
+ ;; "default" is pre-defined
+ (LaTeX-add-mathtools-newtagforms "default")
+
+ ;; mathtools requires amsmath, as some bugs in amsmath are fixed
+ (TeX-run-style-hooks "amsmath")
+
+ (LaTeX-add-environments
+ ;; 3.4.1 Matrices
+ '("matrix*" [ "Vertical alignment (l, r or c (default))" ])
+ '("pmatrix*" [ "Vertical alignment (l, r or c (default))" ])
+ '("bmatrix*" [ "Vertical alignment (l, r or c (default))" ])
+ '("Bmatrix*" [ "Vertical alignment (l, r or c (default))" ])
+ '("vmatrix*" [ "Vertical alignment (l, r or c (default))" ])
+ '("Vmatrix*" [ "Vertical alignment (l, r or c (default))" ])
+ '("smallmatrix*" [ "Vertical alignment (l, r or c (default))" ])
+ '("psmallmatrix")
+ '("psmallmatrix*" [ "Vertical alignment (l, r or c (default))" ])
+ '("bsmallmatrix")
+ '("bsmallmatrix*" [ "Vertical alignment (l, r or c (default))" ])
+ '("Bsmallmatrix")
+ '("Bsmallmatrix*" [ "Vertical alignment (l, r or c (default))" ])
+ '("vsmallmatrix")
+ '("vsmallmatrix*" [ "Vertical alignment (l, r or c (default))" ])
+ '("Vsmallmatrix")
+ '("Vsmallmatrix*" [ "Vertical alignment (l, r or c (default))" ])
+ ;; 3.4.2 The multlined environment
+ '("multlined" LaTeX-mathtools-env-multlined)
+ ;; 3.4.3 More cases -like environments
+ '("dcases" LaTeX-mathtools-env-cases)
+ '("dcases*" LaTeX-mathtools-env-cases)
+ '("rcases" LaTeX-mathtools-env-cases)
+ '("rcases*" LaTeX-mathtools-env-cases)
+ '("drcases" LaTeX-mathtools-env-cases)
+ '("drcases*" LaTeX-mathtools-env-cases)
+ '("cases*" LaTeX-mathtools-env-cases)
+ ;; 4.4 Spreading equations
+ '("spreadlines" "Spacing between lines")
+ ;; 4.5 Gathered environments
+ '("lgathered" ["Vertical position (t or b)"])
+ '("rgathered" ["Vertical position (t or b)"]))
+
+ (TeX-add-symbols
+ '("mathtoolsset" (TeX-arg-key-val LaTeX-mathtools-key-val-options))
+ ;; 3.1.1 A complement to \smash, \llap, and \rlap
+ '("mathllap" [ LaTeX-mathtools-arg-mathstyle-completion ] t)
+ '("mathrlap" [ LaTeX-mathtools-arg-mathstyle-completion ] t)
+ '("mathclap" [ LaTeX-mathtools-arg-mathstyle-completion ] t)
+ '("mathmakebox" [ (TeX-arg-length "Width") ] [ "Position" ] 1)
+ '("clap" 1)
+ '("mathmbox" 1)
+ ;; 3.1.2 Forcing a cramped style
+ '("cramped" [ LaTeX-mathtools-arg-mathstyle-completion ] 1)
+ '("crampedllap" [ LaTeX-mathtools-arg-mathstyle-completion ] t)
+ '("crampedrlap" [ LaTeX-mathtools-arg-mathstyle-completion ] t)
+ '("crampedclap" [ LaTeX-mathtools-arg-mathstyle-completion ] t)
+ ;; 3.1.3 Smashing an operator
+ '("smashoperator" [ "Position (l, r or lr (default)" ] 1)
+ ;; 3.1.4 Adjusting the limits of operators
+ '("adjustlimits" t (TeX-arg-literal "_") nil nil (TeX-arg-literal "_") nil)
+ ;; 3.1.5 Swapping space above AMS display math environments
+ '("SwapAboveDisplaySkip" 0)
+ ;; 3.2.1 The appearance of tags
+ '("newtagform"
+ (TeX-arg-eval
+ (lambda ()
+ (let ((newtag (TeX-read-string
+ (TeX-argument-prompt nil nil "Name"))))
+ (LaTeX-add-mathtools-newtagforms newtag)
+ (format "%s" newtag))))
+ [ "Inner format" ] "Left" "Right")
+ '("renewtagform"
+ (TeX-arg-eval completing-read
+ (TeX-argument-prompt nil nil "Name")
+ (LaTeX-mathtools-newtagform-list))
+ [ "Inner format" ] "Left" "Right")
+ '("usetagform"
+ (TeX-arg-eval completing-read
+ (TeX-argument-prompt nil nil "Name")
+ (LaTeX-mathtools-newtagform-list)))
+ ;; 3.2.2 Showing only referenced tags
+ '("refeq" TeX-arg-ref)
+ '("noeqref" TeX-arg-ref)
+ ;; 3.3.1 Arrow-like symbols
+ '("xleftrightarrow" ["Below"] "Above")
+ '("xLeftarrow" ["Below"] "Above")
+ '("xRightarrow" ["Below"] "Above")
+ '("xLeftrightarrow" ["Below"] "Above")
+ '("xhookleftarrow" ["Below"] "Above")
+ '("xhookrightarrow" ["Below"] "Above")
+ '("xmapsto" ["Below"] "Above")
+ '("xrightharpoondown" ["Below"] "Above")
+ '("xrightharpoonup" ["Below"] "Above")
+ '("xleftharpoondown" ["Below"] "Above")
+ '("xleftharpoonup" ["Below"] "Above")
+ '("xrightleftharpoons" ["Below"] "Above")
+ '("xleftrightharpoons" ["Below"] "Above")
+ ;; 3.3.2 Braces and brackets
+ '("underbracket" [ (TeX-arg-length "Rule thickness") ]
+ [ (TeX-arg-length "Bracket height") ] t)
+ '("overbracket" [ (TeX-arg-length "Rule thickness") ]
+ [ (TeX-arg-length "Bracket height") ] t)
+ '("underbrace" 1)
+ '("overbrace" 1)
+ '("LaTeXunderbrace" 1)
+ '("LaTeXoverbrace" 1)
+ ;; 3.4.2
+ '("shoveleft" [ (TeX-arg-length "Dimension") ] 1)
+ '("shoveright" [ (TeX-arg-length "Dimension") ] 1)
+ ;; 3.4.4
+ '("MoveEqLeft" [ "Number" ])
+ ;; 3.4.5 Boxing a single line in an alignment
+ '("Aboxed" 1)
+ ;; 3.4.6 Adding arrows between lines in an alignment
+ '("ArrowBetweenLines" [ TeX-arg-macro ] )
+ '("ArrowBetweenLines*" [ TeX-arg-macro ] )
+ ;; 3.4.7 Centered \vdots
+ '("vdotswithin" "Symbol")
+ '("shortvdotswithin" "Symbol")
+ '("shortvdotswithin*" "Symbol")
+ '("MTFlushSpaceAbove")
+ '("MTFlushSpaceBelow")
+ ;; 3.5 Intertext and short intertext
+ ;; don't understand t, but intertext in amsmath.el uses it
+ '("shortintertext" t)
+ ;; 3.6 Paired delimiters
+ '("DeclarePairedDelimiter"
+ LaTeX-mathtools-arg-declarepaireddelimiter
+ "Left delimiter" "Right delimiter")
+ '("DeclarePairedDelimiterX"
+ (LaTeX-mathtools-arg-declarepaireddelimiter t)
+ "Left delimiter" "Right delimiter" t)
+ '("DeclarePairedDelimiterXPP"
+ (LaTeX-mathtools-arg-declarepaireddelimiter t)
+ "Pre-code" "Left delimiter" "Right delimiter" 2)
+ '("delimsize" 0)
+ ;; 3.6.1 Expert use
+ '("reDeclarePairedDelimiterInnerWrapper"
+ (TeX-arg-eval
+ (lambda ()
+ (let ((cmd (completing-read
+ (concat "Command: " TeX-esc)
+ (mapcar #'car (LaTeX-mathtools-DeclarePairedDelimiter-list)))))
+ (concat TeX-esc cmd))))
+ (TeX-arg-eval completing-read
+ "star or nostar: "
+ '("star" "nostar"))
+ t)
+ ;; 3.7.1 Left and right parentheses
+ '("lparen" TeX-arg-insert-right-brace-maybe)
+ '("rparen")
+ ;; 3.7.2 Vertically centered colon
+ "vcentcolon" "ordinarycolon" "coloneqq" "Coloneqq"
+ "coloneq" "Coloneq" "eqqcolon" "Eqqcolon" "eqcolon"
+ "Eqcolon" "colonapprox" "Colonapprox" "colonsim" "Colonsim"
+ "dblcolon"
+ ;; 3.7.3 A few missing symbols
+ "nuparrow" "ndownarrow" "bigtimes"
+ ;; 4.2 Left sub/superscripts
+ '("prescript" "Below" "Above" t)
+ ;; 4.3 Declaring math sizes
+ '("DeclareMathSizes" 4)
+ ;; 4.5 Gathered environments
+ '("newgathered"
+ (TeX-arg-eval
+ (lambda ()
+ (let ((env (TeX-read-string
+ (TeX-argument-prompt nil nil "Name"))))
+ (LaTeX-add-environments env)
+ (LaTeX-add-mathtools-newgathereds env)
+ (add-to-list 'LaTeX-item-list
+ `(,env . LaTeX-item-equation) t)
+ (add-to-list 'LaTeX-label-alist
+ `(,env . LaTeX-amsmath-label) t)
+ (format "%s" env))))
+ 3)
+ '("renewgathered"
+ (TeX-arg-eval completing-read
+ (TeX-argument-prompt nil nil "Name")
+ (LaTeX-mathtools-newgathered-list))
+ 3)
+ ;; 4.6 Split fractions
+ '("splitfrac" 2)
+ '("splitdfrac" 2))
+
+ ;; Append delimiters to `TeX-braces-association'
+ ;; 3.7.1 Left and right parentheses
+ (make-local-variable 'TeX-braces-association)
+ (add-to-list 'TeX-braces-association '("\\lparen" . "\\rparen") t)
+
+ (setq LaTeX-item-list
+ (append '(("multlined" . LaTeX-item-equation)
+ ("lgathered" . LaTeX-item-equation)
+ ("rgathered" . LaTeX-item-equation)
+ ;; FIXME: The entry for spreadlines seems dubious.
+ ("spreadlines" . LaTeX-item-equation)
+ ("matrix*" . LaTeX-item-equation)
+ ("pmatrix*" . LaTeX-item-equation)
+ ("bmatrix*" . LaTeX-item-equation)
+ ("Bmatrix*" . LaTeX-item-equation)
+ ("vmatrix*" . LaTeX-item-equation)
+ ("Vmatrix*" . LaTeX-item-equation)
+ ("smallmatrix*" . LaTeX-item-equation)
+ ("psmallmatrix" . LaTeX-item-equation)
+ ("psmallmatrix*" . LaTeX-item-equation)
+ ("bsmallmatrix" . LaTeX-item-equation)
+ ("bsmallmatrix*" . LaTeX-item-equation)
+ ("Bsmallmatrix" . LaTeX-item-equation)
+ ("Bsmallmatrix*" . LaTeX-item-equation)
+ ("vsmallmatrix" . LaTeX-item-equation)
+ ("vsmallmatrix*" . LaTeX-item-equation)
+ ("Vsmallmatrix" . LaTeX-item-equation)
+ ("Vsmallmatrix*" . LaTeX-item-equation)
+ ("dcases" . LaTeX-mathtools-item-cases)
+ ("dcases*" . LaTeX-mathtools-item-cases)
+ ("rcases" . LaTeX-mathtools-item-cases)
+ ("rcases*" . LaTeX-mathtools-item-cases)
+ ("drcases" . LaTeX-mathtools-item-cases)
+ ("drcases*" . LaTeX-mathtools-item-cases)
+ ("cases*" . LaTeX-mathtools-item-cases))
+ LaTeX-item-list))
+
+ (setq LaTeX-label-alist
+ (append '(("lgathered" . LaTeX-amsmath-label)
+ ("rgathered" . LaTeX-amsmath-label)
+ ("multlined" . LaTeX-amsmath-label))
+ LaTeX-label-alist))
+
+ ;; RefTeX support: Add env's with `reftex-add-label-environments'
+ (when (fboundp 'reftex-add-label-environments)
+ (let ((envs '(("lgathered" ?e nil nil t)
+ ("rgathered" ?e nil nil t)
+ ("multlined" ?e nil nil t))))
+ (dolist (env envs)
+ (reftex-add-label-environments `(,env)))))
+
+ ;; Fontification
+ (when (and (featurep 'font-latex)
+ (eq TeX-install-font-lock 'font-latex-setup))
+ (font-latex-add-keywords '(("mathtoolsset" "{")
+ ("newtagform" "{[{{")
+ ("renewtagform" "{[{{")
+ ("DeclarePairedDelimiter" "|{\\{{")
+ ("DeclarePairedDelimiterX" "|{\\[{{{")
+ ("DeclarePairedDelimiterXPP" "|{\\[{{{{{")
+ ("reDeclarePairedDelimiterInnerWrapper" "|{\\{{")
+ ("DeclareMathSizes" "{{{{")
+ ("newgathered" "{{{{")
+ ("renewgathered" "{{{{"))
+ 'function)
+ (font-latex-add-keywords '(("usetagform" "{"))
+ 'variable)
+ (font-latex-add-keywords '(("refeq" "{")
+ ("noeqref" "{"))
+ 'reference)))
+ TeX-dialect)
+
+;;; mathtools.el ends here