branch: externals/auctex commit 54c82bd093aec4b1fa9264ac91b70cf30da737b6 Author: Ikumi Keita <ik...@ikumi.que.jp> Commit: Ikumi Keita <ik...@ikumi.que.jp>
New style file physics.el * style/physics.el: New style file. * Makefile.in (STYLESRC): Add it. --- Makefile.in | 3 +- style/physics.el | 418 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 420 insertions(+), 1 deletion(-) diff --git a/Makefile.in b/Makefile.in index a2bb2d9db7..f64125c78f 100644 --- a/Makefile.in +++ b/Makefile.in @@ -195,7 +195,8 @@ STYLESRC = style/prosper.el \ style/ifxetex.el style/multibib.el style/ltcaption.el \ style/keyval.el style/kvoptions.el style/kvsetkeys.el \ style/proc.el style/microtype.el style/tcolorboxlib-theorems.el \ - style/amsaddr.el style/parskip.el style/catchfilebetweentags.el + style/amsaddr.el style/parskip.el style/catchfilebetweentags.el \ + style/physics.el STYLEELC = $(STYLESRC:.el=.elc) diff --git a/style/physics.el b/style/physics.el new file mode 100644 index 0000000000..8676a696a2 --- /dev/null +++ b/style/physics.el @@ -0,0 +1,418 @@ +;;; physics.el --- AUCTeX style for `physics' (v1.3). -*- lexical-binding: t; -*- + +;; Copyright (C) 2022 Free Software Foundation, Inc. + +;; Author: Ikumi Keita <ikumike...@jcom.home.ne.jp> +;; Maintainer: auctex-de...@gnu.org +;; Created: 2022-12-xx +;; 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 `physics.sty' (v1.3) from 2012/12/12 +;; `physics.sty' is part of TeX Live. + +;;; Code: + +(require 'tex) + +;; List of supported braces by macros in physics package +;; | () | [] | || | {} |null| big +;; ----+----+----+----+----+--- +---- +;; qty | + | + | + | + | ! | + +;; abs | ! | ! | ! | @ | ! | + +;; eval| * | * | ! | - | ! | ! +;; grad| + | + | | @ | = | ! +;; sin | + | ^ | | @ | = | ! +;; exp | + | + | | + | | ! +;; tr | + | + | | + | | ! +;; erf | | | | @ | = | ! +;; Res | + | + | | + | | ! +;; pv | | | | @ | = | ! +;; Re | | | | + | | ! +;; dd | + | ^ | | @ | | ! +;; bra | | | | + | = | ! +;; mqty| + | + | + | @ | ! | ! +;;mqty*| + | | | @ | ! | ! +;; +;; + ... supported +;; ! ... error or wrong result +;; @ ... works, but missing "{}" in the output +;; * ... supported, but the right brace must be "|" +;; - ... works, with only right "|" in the output +;; = ... same as {} +;; ^ ... interpreted as power optional argument +;; +;; Special note +;; + \sin[2]x and \sin[2]{x} aren't supported. +;; + "\dd{x}" and "\dd x" give different output. +;; + mqty* is only meaningful when followed by "(...)". +;; + as opposed to the document, \tr and \trace aren't equivalent. +;; + dv accepts one or two arguments except optional argument. +;; o 1 arg ... {derivative variable} +;; o 2 arg ... {function to derive}{derivative variable} +;; O 1 arg + () ... {derivative variable}(function to derive) +;; + pdv accepts one, two or three arguments except optional argument. +;; o 1 arg ... {derivative variable} +;; o 2 args ... {function to derive}{derivative variable} +;; o 3 args ... {func. to der.}{der. var.1}{der. var.2} +;; o 1 arg + () ... {derivative variable}(function to derive) +;; - 2 args + ()... NA +;; - 3 args + ()... NA + +(defun TeX-arg-physics-big (_optional) + "Prompt for various \\big specification and insert it without braces. +\\Big, \\bigg and \\Bigg are also allowed." + (TeX-arg-completing-read t '("big" "Big" "bigg" "Bigg") + "bigness specification: " t TeX-esc "" "" nil t)) + +(defun TeX-physics--arg-any-braces (paren bracket vert brace + &optional default close) + "Template to query and insert various braces. +Boolean arguments PAREN, BRACKET, VERT and BRACE mean to support (...), +[...], |...| and {...}, respectively. +Optional argument DEFAULT specifies default open brace. +Non-nil CLOSE specifies close brace unconditionally." + (let* ((candidates + (let (lst) + (if paren (push '("(" . ")") lst)) + (if bracket (push (cons LaTeX-optop LaTeX-optcl) lst)) + (if vert (push '("|" . "|") lst)) + (if brace (push (cons TeX-grop TeX-grcl) lst)) + lst)) + (open (completing-read + (concat "Which brace?" + (cond + (default + (format " (default \"%s\")" default)) + (brace + " (RET to omit)") + (t + "")) + ": ") + candidates nil t nil nil default))) + (or close + (setq close (cdr (assoc open candidates)))) + ;; When `default' is nil and the user gave empty answer, + ;; - If `brace' is nil, use "{}". + ;; - Otherwise do nothing. + (if (and (= 0 (length open)) + (not brace)) + (setq open TeX-grop + close TeX-grcl)) + (when (< 0 (length open)) + (setq TeX-arg-opening-brace open + TeX-arg-closing-brace close) + (let ((content + (if (TeX-active-mark) + (prog1 + (buffer-substring-no-properties (point) (mark)) + (delete-region (point) (mark))) + ""))) + (TeX-argument-insert content nil))))) + +(defun TeX-arg-physics-qty (_optional) + "Query and insert (), [], || or {}. +Default ()." + (TeX-physics--arg-any-braces t t t t "(")) + +(defun TeX-arg-physics-eval (_optional) + "Query and insert (| or [|. +When the user declined, supplement {} instead." + (TeX-physics--arg-any-braces t t nil nil nil "|")) + +(defun TeX-arg-physics-grad (_optional) + "Query and insert () or []. +When the user declined, supplement {} instead." + (TeX-physics--arg-any-braces t t nil nil)) + +(defun TeX-arg-physics-exp (_optional) + "Query and insert (), [] or {}." + (TeX-physics--arg-any-braces t t nil t)) + +(defun TeX-arg-physics-dd (_optional) + "Query and insert () or {}." + (TeX-physics--arg-any-braces t nil nil t)) + +(defun TeX-arg-physics-mqty (_optional) + "Query and insert (), [] or ||. +When the user declined, supplement {} instead." + (TeX-physics--arg-any-braces t t t nil)) + +(defun TeX-physics--arg-single-brace (open close &optional force) + "Template to query and insert single flavor of braces. +If optional argument FORCE is non-nil, don't ask and always insert." + (when (or force + (y-or-n-p (format "Use \"%s%s\"? " open close))) + (setq TeX-arg-opening-brace open + TeX-arg-closing-brace close) + (let ((content (if (TeX-active-mark) + (prog1 + (buffer-substring-no-properties (point) (mark)) + (delete-region (point) (mark))) + ""))) + (TeX-argument-insert content nil)))) + +(defun TeX-arg-physics-trig (_optional) + "Query and insert (). +First query optional argument for power. If that is non-empty, +use () unconditionally." + ;; XXX: Should we respect `TeX-insert-macro-default-style'? + (let ((power (TeX-read-string "(Optional) Power: "))) + (let ((TeX-arg-opening-brace LaTeX-optop) + (TeX-arg-closing-brace LaTeX-optcl)) + (TeX-argument-insert power t)) + (TeX-physics--arg-single-brace "(" ")" (< 0 (length power))))) + +(defun TeX-arg-physics-ReIm (_optional) + "Query and insert {}." + (TeX-physics--arg-single-brace TeX-grop TeX-grcl)) + +(defun TeX-arg-physics-mqty* (_optional) + "Insert ()." + (TeX-physics--arg-single-brace "(" ")" t)) + +(defun TeX-physics--arg-1-or-2-arg (prompt1 prompt2) + "Template to query and insert one or two arguments." + (let* ((arg1 (TeX-read-string (concat prompt1 ": "))) + (arg2 (TeX-read-string (concat prompt2 " (RET to omit): ")))) + (TeX-argument-insert arg1 nil) + (if (< 0 (length arg2)) + (TeX-argument-insert arg2 nil)))) + +(defun TeX-arg-physics-braket (_optional) + (TeX-physics--arg-1-or-2-arg "Bra content" "Ket content")) + +(defun TeX-arg-physics-ketbra (_optional) + (TeX-physics--arg-1-or-2-arg "Ket content" "Bra content")) + +(defun TeX-arg-physics-expval (_optional) + (TeX-physics--arg-1-or-2-arg "Observable" "State")) + +(defun TeX-arg-physics-derivative (_optional &optional partial) + "Query and insert one or two arguments for derivative. +The user can choose whether to wrap the function to derive with (). +In addition, query and insert optional power argument. + +If optional argument PARTIAL is non-nil, three arguments are also +supported for partial derivative. +When three arguments are specified, don't ask optional power argument." + (let* ((func (TeX-read-string + "\ +Function to derive (RET to omit, SPC RET to have empty placeholder): ")) + (paren (and (< 0 (length func)) + (y-or-n-p "Use \"()\" to wrap the function? "))) + (var1 (TeX-read-string "Derivative variable: ")) + (var2 (and partial (not paren) (< 0 (length func)) + (TeX-read-string + "Derivative variable 2nd (RET to omit): ")))) + (unless var2 + ;; XXX: Should we respect `TeX-insert-macro-default-style'? + (TeX-arg-string t "Power" nil nil nil LaTeX-optop LaTeX-optcl)) + (when (and (< 0 (length func)) + (not paren)) + (if (equal func " ") + (setq func "")) + (TeX-argument-insert func nil)) + (TeX-argument-insert var1 nil) + (if (< 0 (length var2)) + (TeX-argument-insert var2 nil)) + (when paren + (setq TeX-arg-opening-brace "(" + TeX-arg-closing-brace ")") + (if (equal func " ") + (setq func "")) + (TeX-argument-insert func nil)))) + +(TeX-add-style-hook + "physics" + (lambda () + ;; physics requires amsmath and xparse. + (TeX-run-style-hooks "amsmath" "xparse") + + (TeX-add-symbols + ;; 2.1 Automatic bracing + '("quantity" [TeX-arg-physics-big] TeX-arg-physics-qty) + '("qty" [TeX-arg-physics-big] TeX-arg-physics-qty) + '("pqty" [TeX-arg-physics-big] t) '("bqty" [TeX-arg-physics-big] t) + '("vqtry" [TeX-arg-physics-big] t) '("Bqty" [TeX-arg-physics-big] t) + '("absolutevalue" [TeX-arg-physics-big] t) + '("absolutevalue*" t) + '("abs" [TeX-arg-physics-big] t) '("abs*" t) + '("norm" [TeX-arg-physics-big] t) + '("norm*" t) + '("evaluated" TeX-arg-physics-eval) + '("evaluated*" TeX-arg-physics-eval) + '("eval" TeX-arg-physics-eval) '("eval*" TeX-arg-physics-eval) + '("order" [TeX-arg-physics-big] t) + '("order*" t) + '("commutator" [TeX-arg-physics-big] 2) + '("commutator*" 2) + '("comm" [TeX-arg-physics-big] 2) '("comm*" 2) + '("anticommutator" [TeX-arg-physics-big] 2) + '("anticommutator*" 2) + '("acomm" [TeX-arg-physics-big] 2) '("acomm*" 2) + '("poissonbracket" [TeX-arg-physics-big] 2) + '("poissonbracket*" 2) + '("pb" [TeX-arg-physics-big] 2) '("pb*" 2) + ;; 2.2 Vector notation + '("vectorbold" t) '("vectorbold*" t) + '("vb" t) '("vb*" t) + '("vectorarrow" t) '("vectorarrow*" t) + '("va" t) '("va*" t) + '("vectorunit" t) '("vectorunit*" t) + '("vu" t) '("vu*" t) + "dotproduct" "vdot" + "crossproduct" "cross" + "cp" + '("gradient" TeX-arg-physics-grad) + '("grad" TeX-arg-physics-grad) + '("divergence" TeX-arg-physics-grad) + '("div" TeX-arg-physics-grad) + "divisionsymbol" + '("curl" TeX-arg-physics-grad) + '("laplacian" TeX-arg-physics-grad) + ;; 2.3 Operators + '("sin" TeX-arg-physics-trig) + '("sinh" TeX-arg-physics-trig) + '("arcsin" TeX-arg-physics-trig) + '("asin" TeX-arg-physics-trig) + '("cos" TeX-arg-physics-trig) + '("cosh" TeX-arg-physics-trig) + '("arccos" TeX-arg-physics-trig) + '("acos" TeX-arg-physics-trig) + '("tan" TeX-arg-physics-trig) + '("tanh" TeX-arg-physics-trig) + '("arctan" TeX-arg-physics-trig) + '("atan" TeX-arg-physics-trig) + '("csc" TeX-arg-physics-trig) + '("csch" TeX-arg-physics-trig) + '("arccsc" TeX-arg-physics-trig) + '("acsc" TeX-arg-physics-trig) + "sine" "hypsine" "arcsine" "asine" + "cosine" "hypcosine" "arccosine" "acosine" + "tangent" "hyptangent" "arctangent" "atangent" + "cosecant" "hypcosecant" "arccosecant" "acosecant" + "secant" "hypsecant" "arcsecant" "asecant" + "cotangent" "hypcotangent" "arccotangent" "acotangent" + '("exp" TeX-arg-physics-exp) + '("log" TeX-arg-physics-exp) + '("ln" TeX-arg-physics-exp) + '("det" TeX-arg-physics-exp) + '("Pr" TeX-arg-physics-exp) + "exponential" "logarithm" "naturallogarithm" "determinant" "Probability" + '("tr" TeX-arg-physics-exp) + '("Tr" TeX-arg-physics-exp) + "rank" "erf" + '("Res" TeX-arg-physics-exp) + '("principalvalue" t) + '("pv" t) '("PV" t) + '("Re" TeX-arg-physics-ReIm) + '("Im" TeX-arg-physics-ReIm) + "real" "imaginary" + ;; 2.4 Quick quad text + '("qqtext" t) + '("qqtext*" t) + '("qq" t) '("qq*" t) + "qcomma" "qcomma*" "qc" "qc*" "qcc" "qcc*" + "qif" "qif*" "qthen" "qthen*" "qelse" "qelse*" "qotherwise" "qotherwise*" + "qunless" "qunless*" "qgiven" "qgiven*" "qusing" "qusing*" + "qassume" "qassume*" "qsince" "qsince*" "qlet" "qlet*" "qfor" "qfor*" + "qall" "qall*" "qeven" "qeven*" "qodd" "qodd*" "qinteger" "qinteger*" + "qand" "qand*" "qor" "qor*" "qas" "qas*" "qin" "qin*" + ;; 2.5 Derivatives + '("differential" ["Power"] TeX-arg-physics-dd) + '("dd" ["Power"] TeX-arg-physics-dd) + '("derivative" TeX-arg-physics-derivative) + '("derivative*" TeX-arg-physics-derivative) + '("dv" TeX-arg-physics-derivative) + '("dv*" TeX-arg-physics-derivative) + '("partialderivative" (TeX-arg-physics-derivative t)) + '("partialderivative*" (TeX-arg-physics-derivative t)) + '("pderivative" (TeX-arg-physics-derivative t)) + '("pderivative*" (TeX-arg-physics-derivative t)) + '("pdv" (TeX-arg-physics-derivative t)) + '("pdv*" (TeX-arg-physics-derivative t)) + '("variation" ["Power"] TeX-arg-physics-dd) + '("var" ["Power"] TeX-arg-physics-dd) + '("functionalderivative" TeX-arg-physics-derivative) + '("fdv" TeX-arg-physics-derivative) + ;; 2.6 Dirac bra-ket notation + '("bra" t) + '("bra*" t) + '("ket" t) + '("ket*" t) + '("innerproduct" TeX-arg-physics-braket) + '("innerproduct*" TeX-arg-physics-braket) + '("braket" TeX-arg-physics-braket) + '("braket*" TeX-arg-physics-braket) + '("ip" TeX-arg-physics-braket) + '("outerproduct" TeX-arg-physics-ketbra) + '("outerproduct*" TeX-arg-physics-ketbra) + '("dyad" TeX-arg-physics-ketbra) + '("dyad*" TeX-arg-physics-ketbra) + '("ketbra" TeX-arg-physics-ketbra) + '("ketbra*" TeX-arg-physics-ketbra) + '("op" TeX-arg-physics-ketbra) + '("op*" TeX-arg-physics-ketbra) + '("expectationvalue" TeX-arg-physics-expval) + '("expectationvalue*" TeX-arg-physics-expval) + '("expval" TeX-arg-physics-expval) + '("expval*" TeX-arg-physics-expval) + '("ev" TeX-arg-physics-expval) + '("ev*" TeX-arg-physics-expval) + '("matrixelement" 3) + '("matrixelement*" 3) + '("matrixelement**" 3) + '("matrixel" 3) '("matrixel*" 3) '("matrixel**" 3) + '("mel" 3) '("mel*" 3) '("mel**" 3) + ;; 2.7 Matrix macros + '("matrixquantity" TeX-arg-physics-mqty) + '("matrixquantity*" TeX-arg-physics-mqty*) + '("mqty" TeX-arg-physics-mqty) + '("mqty*" TeX-arg-physics-mqty*) + '("pmqty" t) '("Pmqty" t) '("bmqty" t) '("vmqty" t) + '("smallmatrixquantity" TeX-arg-physics-mqty) + '("smallmatrixquantity*" TeX-arg-physics-mqty*) + '("smqty" TeX-arg-physics-mqty) + '("smqty*" TeX-arg-physics-mqty*) + '("spmqty" t) '("sPmqty" t) '("sbmqty" t) '("svmqty" t) + '("matrixdeterminant" t) + '("mdet" t) '("smdet" t) + '("identitymatrix" "Size") + '("imat" "Size") + '("xmatrix" "Element" "Rows" "Cols") + '("xmatrix*" "Element" "Rows" "Cols") + '("xmat" "Element" "Rows" "Cols") '("xmat*" "Element" "Rows" "Cols") + '("zeromatrix" "Rows" "Cols") + '("zmat" "Rows" "Cols") + '("paulimatrix" "0,1,2,3 or x,y,z") + '("pmat" "0,1,2,3 or x,y,z") + '("diagonalmatrix" ["Filler"] t) + '("dmat" ["Filler"] t) + '("antidiagonalmatrix" ["Filler"] t) + '("admatrix" ["Filler"] t))) + TeX-dialect) + +(defvar LaTeX-physics-package-options + '("bolddel" "arrowdel" "trig" "notrig" "uprightdiff" "italicdiff") + "Package options for the physics package.") + +;;; physics.el ends here