diff options
Diffstat (limited to 'elpa/auctex-13.1.3/style/thmtools.el')
-rw-r--r-- | elpa/auctex-13.1.3/style/thmtools.el | 313 |
1 files changed, 313 insertions, 0 deletions
diff --git a/elpa/auctex-13.1.3/style/thmtools.el b/elpa/auctex-13.1.3/style/thmtools.el new file mode 100644 index 0000000..d17b30e --- /dev/null +++ b/elpa/auctex-13.1.3/style/thmtools.el @@ -0,0 +1,313 @@ +;;; thmtools.el --- AUCTeX style for `thmtools.sty' (v0.72) -*- lexical-binding: t; -*- + +;; Copyright (C) 2018--2021 Free Software Foundation, Inc. + +;; Author: Arash Esbati <arash@gnu.org> +;; Maintainer: auctex-devel@gnu.org +;; Created: 2018-07-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 `thmtools.sty' (v0.72) from 2020/08/01. +;; `thmtools.sty' is part of TeXLive. + +;;; Code: + +;; Silence the compiler: +(declare-function font-latex-add-keywords + "font-latex" + (keywords class)) + +;; Needed for auto-parsing: +(require 'tex) +(require 'latex) + +;; Setup for \declaretheoremstyle: +(TeX-auto-add-type "thmtools-declaretheoremstyle" "LaTeX") + +(defvar LaTeX-thmtools-declaretheoremstyle-regexp + `(,(concat "\\\\declaretheoremstyle" + "[ \t\n\r%]*" + "\\(?:" + (LaTeX-extract-key-value-label 'none) + "\\)?" + "[ \t\n\r%]*" + "{\\([^}]+\\)}") + 1 LaTeX-auto-thmtools-declaretheoremstyle) + "Matches the argument of \\declaretheoremstyle from thmtools package.") + +;; Setup for \declaretheorem: +(TeX-auto-add-type "thmtools-declaretheorem" "LaTeX") + +(defvar LaTeX-thmtools-declaretheorem-regexp + `(,(concat "\\\\declaretheorem" + "[ \t\n\r%]*" + "\\(?:" + (LaTeX-extract-key-value-label 'none) + "\\)?" + "[ \t\n\r%]*" + "{\\([^}]+\\)}") + 1 LaTeX-auto-thmtools-declaretheorem) + "Matches the argument of \\declaretheorem from thmtools package.") + +(defun LaTeX-thmtools-auto-prepare () + "Clear `LaTeX-auto-thmtools-*' before parsing." + (setq LaTeX-auto-thmtools-declaretheoremstyle nil + LaTeX-auto-thmtools-declaretheorem nil)) + +(defun LaTeX-thmtools-auto-cleanup () + "Process parsed elements from thmtools package." + (dolist (newthm (mapcar #'car (LaTeX-thmtools-declaretheorem-list))) + (LaTeX-add-environments `(,newthm LaTeX-thmtools-env-label)))) + +(add-hook 'TeX-auto-prepare-hook #'LaTeX-thmtools-auto-prepare t) +(add-hook 'TeX-auto-cleanup-hook #'LaTeX-thmtools-auto-cleanup t) +(add-hook 'TeX-update-style-hook #'TeX-auto-parse t) + +(defun LaTeX-thmtools-declaretheoremstyle-key-val (optional &optional prompt) + "Query and return a key=val string for \\declaretheoremstyle macro. +If OPTIONAL is non-nil, indicate an optional argument in +minibuffer. PROMPT replaces the standard one." + (let ((lengths (mapcar (lambda (x) + (concat TeX-esc x)) + (mapcar #'car (LaTeX-length-list)))) + (fonts (mapcar (lambda (x) + (concat TeX-esc x)) + '("rmfamily" "sffamily" "ttfamily" "mdseries" "bfseries" + "upshape" "itshape" "slshape" "scshape" + "tiny" "scriptsize" "footnotesize" + "small" "normalsize" "large" + "Large" "LARGE" "huge" "Huge" "normalfont")))) + (TeX-read-key-val + optional + `(("spaceabove" ,lengths) + ("spacebelow" ,lengths) + ("headfont" ,fonts) + ("notefont" ,fonts) + ("bodyfont" ,fonts) + ("headpunct") + ("notebraces") + ("postheadspace" ,lengths) + ("headformat" ("margin" "swapnumber" "\\NUMBER" "\\NAME" "\\NOTE")) + ("headindent" ,lengths)) + prompt))) + +(defun LaTeX-arg-thmtools-declaretheoremstyle (optional &optional prompt) + "Insert the key=val and style name defined by \\declaretheoremstyle. +If OPTIONAL is non-nil, also insert the second argument in square +brackets. PROMPT replaces the standard one for the second +argument." + (let ((TeX-arg-opening-brace "[") + (TeX-arg-closing-brace "]")) + (TeX-argument-insert + (LaTeX-thmtools-declaretheoremstyle-key-val t) + t)) + (let ((style (TeX-read-string + (TeX-argument-prompt optional prompt "Style")))) + (LaTeX-add-thmtools-declaretheoremstyles style) + (TeX-argument-insert style optional))) + +(defun LaTeX-thmtools-declaretheorem-key-val (optional &optional prompt) + "Query and return a key=val string for \\declaretheorem macro. +If OPTIONAL is non-nil, indicate an optional argument in +minibuffer. PROMPT replaces the standard one." + (let ((counters (mapcar #'car (LaTeX-counter-list)))) + (TeX-read-key-val + optional + `(("parent" ,counters) + ("numberwithin" ,counters) + ("within" ,counters) + ("sibling" ,counters) + ("numberlike" ,counters) + ("sharenumber" ,counters) + ("title") + ("name") + ("heading") + ("numbered" ("yes" "no" "unless unique")) + ("style" + ,(append + ;; check for \newtheoremstyle from amsthm.sty: + (when (and (fboundp 'LaTeX-amsthm-newtheoremstyle-list) + (LaTeX-amsthm-newtheoremstyle-list)) + (mapcar #'car (LaTeX-amsthm-newtheoremstyle-list))) + ;; check for \newtheoremstyle from ntheorem.sty: + (when (and (fboundp 'LaTeX-ntheorem-newtheoremstyle-list) + (LaTeX-ntheorem-newtheoremstyle-list)) + (mapcar #'car (LaTeX-ntheorem-newtheoremstyle-list))) + ;; thmtools version is called \declaretheoremstyle: + (mapcar #'car (LaTeX-thmtools-declaretheoremstyle-list)))) + ("preheadhook") + ("postheadhook") + ("prefoothook") + ("postfoothook") + ("refname") + ("Refname") + ("shaded" ("textwidth" "bgcolor" "rulecolor" "rulewidth" "margin")) + ("thmbox" ("L" "M" "S"))) + prompt))) + +(defun LaTeX-arg-thmtools-declaretheorem (optional &optional prompt) + "Insert the key=val and environment name defined by \\declaretheorem. +If OPTIONAL is non-nil, also insert the second argument in square +brackets. PROMPT replaces the standard one for the second +argument." + (let ((env (TeX-read-string + (TeX-argument-prompt optional prompt "Environment")))) + (LaTeX-add-environments `(,env LaTeX-thmtools-env-label)) + (TeX-argument-insert env optional)) + (let ((TeX-arg-opening-brace "[") + (TeX-arg-closing-brace "]")) + (TeX-argument-insert + (LaTeX-thmtools-declaretheorem-key-val t) + t))) + +(defun LaTeX-thmtools-listoftheorems-key-val (optional &optional prompt) + "Query and return a key=val string for \\listoftheorems macro. +If OPTIONAL is non-nil, indicate an optional argument in +minibuffer. PROMPT replaces the standard one." + (let ((lengths (mapcar (lambda (x) + (concat TeX-esc x)) + (mapcar #'car (LaTeX-length-list)))) + (thms (append + ;; check for \newtheorem from amsthm.sty: + (when (and (fboundp 'LaTeX-amsthm-newtheorem-list) + (LaTeX-amsthm-newtheorem-list)) + (mapcar #'car (LaTeX-amsthm-newtheorem-list))) + ;; check for \newtheorem from ntheorem.sty: + (when (and (fboundp 'LaTeX-ntheorem-newtheorem-list) + (LaTeX-ntheorem-newtheorem-list)) + (mapcar #'car (LaTeX-ntheorem-newtheorem-list))) + ;; thmtools version is called \declaretheorem: + (mapcar #'car (LaTeX-thmtools-declaretheorem-list))))) + (TeX-read-key-val + optional + `(("title") + ("ignore" ,thms) + ("ignoreall" ("true" "false")) + ("show" ,thms) + ("showall" ("true" "false")) + ("onlynamed" ,thms) + ("swapnumber" ("true" "false")) + ("numwidth" ,lengths)) + prompt))) + +(defun LaTeX-arg-thmtools-listoftheorems (optional &optional prompt) + "Insert the key=val to \\listoftheorems macro. +If OPTIONAL is non-nil, insert the result square brackets. +OPTIONAL and PROMPT are passed to `LaTeX-thmtools-listoftheorems-key-val'." + (TeX-argument-insert + (LaTeX-thmtools-listoftheorems-key-val optional prompt) + optional)) + +(defun LaTeX-thmtools-env-label (environment) + "Insert thmtools ENVIRONMENT, query for an optional argument and label. +AUCTeX users should add ENVIRONMENT to `LaTeX-label-alist' via +customize or in init-file with: + + (add-to-list \\='LaTeX-label-alist \\='(\"theorem\" . \"thm:\")) + +RefTeX users should customize or add ENVIRONMENT to +`LaTeX-label-alist' and `reftex-label-alist', for example + + (add-to-list \\='LaTeX-label-alist \\='(\"theorem\" . \"thm:\")) + (add-to-list \\='reftex-label-alist + \\='(\"theorem\" ?m \"thm:\" \"~\\ref{%s}\" + nil (\"Theorem\" \"theorem\") nil))" + (let* ((help-form "\ +Select the content of the optional argument with a key: +'h' in order to insert a plain heading, +'k' in order to insert key=value pairs with completion, +RET in order to leave it empty.") + (choice (read-char-choice + (TeX-argument-prompt + nil nil "Heading (h), Key=val (k), Empty (RET)") + '(?h ?k))) + (opthead (cond ((= choice ?h) + (TeX-read-string + (TeX-argument-prompt t nil "Heading"))) + ((= choice ?k) + (TeX-read-key-val + t + `(("name") + ("continues" ,(mapcar #'car (LaTeX-label-list))) + ("restate" ,(mapcar #'car (LaTeX-label-list))) + ;; We don't offer a label key here: It is + ;; marked "experimental" in the manual and + ;; inserting and parsing \label{foo} is + ;; much easier for AUCTeX and RefTeX + ;; ("label") + ("listhack" ("true" "false"))))) + (t "")))) + (LaTeX-insert-environment environment + (when (and opthead + (not (string= opthead ""))) + (format "[%s]" opthead)))) + (when (LaTeX-label environment 'environment) + (LaTeX-newline) + (indent-according-to-mode))) + +(TeX-add-style-hook + "thmtools" + (lambda () + + ;; Add thmtools to the parser. + (TeX-auto-add-regexp LaTeX-thmtools-declaretheoremstyle-regexp) + (TeX-auto-add-regexp LaTeX-thmtools-declaretheorem-regexp) + + (TeX-add-symbols + '("declaretheoremstyle" LaTeX-arg-thmtools-declaretheoremstyle) + '("declaretheorem" LaTeX-arg-thmtools-declaretheorem) + + '("listoftheorems" [ LaTeX-arg-thmtools-listoftheorems ]) + '("ignoretheorems" + (TeX-arg-eval mapconcat #'identity + (TeX-completing-read-multiple + (TeX-argument-prompt nil nil "Environment(s)") + (append + ;; check for \newtheorem from amsthm.sty: + (when (and (fboundp 'LaTeX-amsthm-newtheorem-list) + (LaTeX-amsthm-newtheorem-list)) + (mapcar #'car (LaTeX-amsthm-newtheorem-list))) + ;; check for \newtheorem from ntheorem.sty: + (when (and (fboundp 'LaTeX-ntheorem-newtheorem-list) + (LaTeX-ntheorem-newtheorem-list)) + (mapcar #'car (LaTeX-ntheorem-newtheorem-list))) + ;; thmtools version is called \declaretheorem: + (mapcar #'car (LaTeX-thmtools-declaretheorem-list)))) + ",")) + '("listtheoremname" 0)) + + ;; Fontification + (when (and (featurep 'font-latex) + (eq TeX-install-font-lock 'font-latex-setup)) + (font-latex-add-keywords '(("declaretheoremstyle" "[{") + ("declaretheorem" "[{[") + ("listoftheorems" "[") + ("ignoretheorems" "{")) + 'function))) + TeX-dialect) + +;; The package has only one option `debug'. We ignore that in order +;; to make loading faster: +(defvar LaTeX-thmtools-package-options nil + "Package options for the thmtools package.") + +;;; thmtools.el ends here |