Hi all, I plan to push the following change to AUCTeX repo. It basically moves the content of xparse.el into latex.el and font-latex.el. I would be grateful if others could install and test it. From my brief testing, it seems to work as advertised, but you'll never know.
TIA and any comments welcome. Best, Arash
diff --git a/font-latex.el b/font-latex.el index ae922b5b..7deb9ec6 100644 --- a/font-latex.el +++ b/font-latex.el @@ -365,7 +365,19 @@ variable `font-latex-fontify-sectioning'." ',num) ("labelformat" "{{") ("linespread" "{") ("AddToHook" "{[{") ("RemoveFromHook" "{[") ("AddToHookNext" "{{") ("ProvidesClass" "{[") ("ProvidesPackage" "{[") ("ProvidesFile" "{[") - ("NewMarkClass" "{")) + ("NewMarkClass" "{") + ("DeclareDocumentCommand" "|{\\{{") + ("NewDocumentCommand" "|{\\{{") + ("ProvideDocumentCommand" "|{\\{{") + ("RenewDocumentCommand" "|{\\{{") + ("DeclareExpandableDocumentCommand" "|{\\{{") + ("NewExpandableDocumentCommand" "|{\\{{") + ("ProvideExpandableDocumentCommand" "|{\\{{") + ("RenewExpandableDocumentCommand" "|{\\{{") + ("DeclareDocumentEnvironment" "{{{{") + ("NewDocumentEnvironment" "{{{{") + ("ProvideDocumentEnvironment" "{{{{") + ("RenewDocumentEnvironment" "{{{{")) font-lock-function-name-face 2 command) ("function-noarg" ("enspace" "enskip" "quad" "qquad" "nonumber" diff --git a/latex.el b/latex.el index a18592d3..e5757e7f 100644 --- a/latex.el +++ b/latex.el @@ -1731,6 +1731,8 @@ right number." (TeX-auto-add-type "counter" "LaTeX") (TeX-auto-add-type "length" "LaTeX") (TeX-auto-add-type "savebox" "LaTeX" "saveboxes") +(TeX-auto-add-type "xparse-macro" "LaTeX") +(TeX-auto-add-type "xparse-environment" "LaTeX") (defvar LaTeX-auto-minimal-regexp-list '(("\\\\document\\(style\\|class\\)\ @@ -1827,12 +1829,33 @@ This is necessary since index entries may contain commands and stuff.") (2 3 1) LaTeX-auto-arguments) (,(concat "\\\\\\(?:new\\|provide\\)command\\*?{?\\\\\\(" token "+\\)}?") 1 TeX-auto-symbol) + (,(concat + "\\\\\\(New\\|Renew\\|Provide\\|Declare\\)" + "\\(?:Expandable\\)?" + "DocumentCommand" + "[ \t\n\r]*" + "{?" + "[ \t\n\r]*" + "\\\\\\(" token "+\\)" + "[ \t\n\r]*" + "}?" + "[ \t\n\r]*" + "{\\([^}{]*\\(?:{[^}{]*\\(?:{[^}{]*\\(?:{[^}{]*}[^}{]*\\)*}[^}{]*\\)*}[^}{]*\\)*\\)}") + (0 2 3 1) LaTeX-auto-xparse-macro) ("\\\\\\(re\\)?newenvironment\\*?{\\([^}]+\\)}\\[\\([0-9]+\\)\\]\\[" (2 3 1) LaTeX-auto-env-args-with-opt) ("\\\\\\(re\\)?newenvironment\\*?{\\([^}]+\\)}\\[\\([0-9]+\\)\\]" (2 3 1) LaTeX-auto-env-args) ("\\\\newenvironment\\*?{\\([^}]+\\)}" 1 LaTeX-auto-environment) + (,(concat + "\\\\\\(New\\|Renew\\|Provide\\|Declare\\)" + "DocumentEnvironment" + "[ \t\n\r]*" + "{\\([^}]+\\)}" + "[ \t\n\r]*" + "{\\([^}{]*\\(?:{[^}{]*\\(?:{[^}{]*\\(?:{[^}{]*}[^}{]*\\)*}[^}{]*\\)*}[^}{]*\\)*\\)}") + (0 2 3 1) LaTeX-auto-xparse-environment) (,(concat "\\\\newtheorem{\\(" token "+\\)}") 1 LaTeX-auto-environment) ("\\\\input{\"?\\([^#}%\"\\\n\r]+?\\)\\(?:\\.[^#}%/\"\\.\n\r]+\\)?\"?}" 1 TeX-auto-file) @@ -1876,7 +1899,9 @@ Split the string at commas and remove Biber file extensions." LaTeX-auto-optional nil LaTeX-auto-env-args nil LaTeX-auto-style nil - LaTeX-auto-end-symbol nil)) + LaTeX-auto-end-symbol nil + LaTeX-auto-xparse-macro nil + LaTeX-auto-xparse-environment nil)) (add-hook 'TeX-auto-prepare-hook #'LaTeX-auto-prepare) @@ -1962,6 +1987,163 @@ See also `LaTeX-provided-class-options'.") The value is actually the tail of the list of options given to PACKAGE." (member option (cdr (assoc package LaTeX-provided-package-options)))) +(defun LaTeX-arg-xparse-embellishment (_optional embellish) + "Special insert function for embellishments. +Compatibility argument OPTIONAL is ignored. EMBELLISH is a +string with parsed elements inserted in the buffer. This +function also sets the value of `TeX-exit-mark' where the point +will be once the insertion is completed." + (let (p) + (just-one-space) + (setq p (point)) + (insert embellish) + (set-marker TeX-exit-mark (1+ p)))) + +(defun LaTeX-xparse-macro-parse (type) + "Process parsed macro and environment definitions. +TYPE is one of the symbols mac or env." + (dolist (xcmd (if (eq type 'mac) + LaTeX-auto-xparse-macro + LaTeX-auto-xparse-environment)) + (let ((name (string-trim (nth 1 xcmd) "[ \t\r\n%]+" "[ \t\r\n%]+")) + (spec (nth 2 xcmd)) + (what (nth 3 xcmd)) + (case-fold-search nil) + (syntax (TeX-search-syntax-table ?\{ ?\})) + args opt-star opt-token) + (with-temp-buffer + (set-syntax-table LaTeX-mode-syntax-table) + ;; This one is probably not really needed? + (goto-char (point-min)) + (insert (replace-regexp-in-string "[ \t\r\n%]" "" spec)) + (goto-char (point-min)) + (while (looking-at-p "[+!>=bmrRvodODsteE]") + (cond ((looking-at-p "[+!b]") + ;; + or !: Long argument or space aware: Move over + ;; them. b is special; only available for + ;; enviroments + (forward-char 1)) + ;; Argument processors and key-val modifier: Move + ;; over [>=] and a balanced {} + ((looking-at-p "[>=]") + (forward-char 1) + (with-syntax-table syntax (forward-sexp))) + ;; Mandatory arguments: + ;; m: Ask for input with "Text" as prompt + ((looking-at-p "m") + (forward-char 1) + (push "Text" args)) + ;; r<token1><token2> + ((looking-at-p "r") + (re-search-forward "r\\(.\\)\\(.\\)" (+ (point) 3) t) + (push `(TeX-arg-string nil nil nil nil + ,(match-string-no-properties 1) + ,(match-string-no-properties 2)) + args)) + ;; R<token1><token2>{default} + ((looking-at-p "R") + (re-search-forward "R\\(.\\)\\(.\\)" (+ (point) 3) t) + (with-syntax-table syntax (forward-sexp)) + (push `(TeX-arg-string nil nil nil nil + ,(match-string-no-properties 1) + ,(match-string-no-properties 2)) + args)) + ;; v: Use `TeX-arg-verb-delim-or-brace' + ((looking-at-p "v") + (forward-char 1) + (push #'TeX-arg-verb-delim-or-brace args)) + ;; Optional arguments: + ;; o standard LaTeX optional in square brackets + ((looking-at-p "o") + (forward-char 1) + (push (vector "Text") args)) + ;; d<token1><token2> + ((looking-at-p "d") + (re-search-forward "d\\(.\\)\\(.\\)" (+ (point) 3) t) + (push (vector #'TeX-arg-string nil nil nil nil + (match-string-no-properties 1) + (match-string-no-properties 2)) + args)) + ;; O{default} + ((looking-at-p "O") + (forward-char 1) + (with-syntax-table syntax (forward-sexp)) + (push (vector "Text") args)) + ;; D<token1><token2>{default} + ((looking-at-p "D") + (re-search-forward "D\\(.\\)\\(.\\)" (+ (point) 3) t) + (with-syntax-table syntax (forward-sexp)) + (push (vector #'TeX-arg-string nil nil nil nil + (match-string-no-properties 1) + (match-string-no-properties 2)) + args)) + ;; s: optional star + ((looking-at-p "s") + (forward-char 1) + (setq opt-star t)) + ;; t: optional <token> + ((looking-at-p "t") + (re-search-forward "t\\(.\\)" (+ (point) 2) t) + (setq opt-token (match-string-no-properties 1))) + ;; e{tokes} a set of optional embellishments + ((looking-at-p "e") + (forward-char) + (if (looking-at-p TeX-grop) + (re-search-forward "{\\([^}]+\\)}" nil t) + (re-search-forward "\\(.\\)" (1+ (point)) t)) + (push `(LaTeX-arg-xparse-embellishment + ,(match-string-no-properties 1)) + args)) + ;; E{tokes}{defaults} + ((looking-at-p "E") + (forward-char) + (if (looking-at-p TeX-grop) + (re-search-forward "{\\([^}]+\\)}" nil t) + (re-search-forward "\\(.\\)" (1+ (point)) t)) + (push `(LaTeX-arg-xparse-embellishment + ,(match-string-no-properties 1)) + args) + (when (looking-at-p TeX-grop) + (with-syntax-table syntax (forward-sexp)))) + ;; Finished: + (t nil)))) + (if (eq type 'env) + ;; Parsed enviroments: If we are Renew'ing or Delare'ing, we + ;; delete the enviroment first from `LaTeX-environment-list' + ;; before adding the new one. We have to sort the value of + ;; `LaTeX-environment-list' by running the function of the + ;; same name: + (progn + (when (member what '("Renew" "Declare")) + (setq LaTeX-auto-environment + (assq-delete-all (car (assoc name LaTeX-auto-environment)) + LaTeX-auto-environment))) + (add-to-list 'LaTeX-auto-environment + `(,name LaTeX-env-args ,@(reverse args)))) + ;; Parsed macros: If we are Renew'ing or Delare'ing, we delete + ;; the macros first from `TeX-symbol-list' before adding the + ;; new ones. We have to sort the value of `TeX-symbol-list' + ;; by running the function of the same name: + (when (member what '("Renew" "Declare")) + (setq TeX-auto-symbol + (assq-delete-all (car (assoc name TeX-auto-symbol)) + TeX-auto-symbol)) + (when opt-star + (setq TeX-auto-symbol + (assq-delete-all (car (assoc (concat name "*") TeX-auto-symbol)) + TeX-auto-symbol))) + (when opt-token + (setq TeX-auto-symbol + (assq-delete-all (car (assoc (concat name opt-token) TeX-auto-symbol)) + TeX-auto-symbol)))) + (add-to-list 'TeX-auto-symbol (cons name (reverse args))) + (when opt-star + (add-to-list 'TeX-auto-symbol (cons (concat name "*") + (reverse args)))) + (when opt-token + (add-to-list 'TeX-auto-symbol (cons (concat name opt-token) + (reverse args)))))))) + (defun LaTeX-auto-cleanup () "Cleanup after LaTeX parsing." @@ -2057,6 +2239,9 @@ The value is actually the tail of the list of options given to PACKAGE." (string-to-number (nth 1 entry))))) LaTeX-auto-arguments) + ;; Cleanup for marcos defined with former xparse commands: + (LaTeX-xparse-macro-parse 'mac) + ;; Cleanup default optional arguments (mapc (lambda (entry) ;; If we're renewcommand-ing and there is already an entry @@ -2103,6 +2288,9 @@ The value is actually the tail of the list of options given to PACKAGE." (1- (string-to-number (nth 1 entry)))))) LaTeX-auto-env-args-with-opt) + ;; Cleanup for enviroments defined with former xparse commands: + (LaTeX-xparse-macro-parse 'env) + ;; Cleanup use of def to add environments ;; NOTE: This uses an O(N^2) algorithm, while an O(N log N) ;; algorithm is possible. @@ -8708,6 +8896,65 @@ function would return non-nil and `(match-string 1)' would return '("linespread" "Factor") + ;; Macros for document-command parser, aka xparse added to LaTeX + ;; kernel with 2020-10-01 release: + '("DeclareDocumentCommand" + TeX-arg-define-macro "Argument specification" t) + '("NewDocumentCommand" + TeX-arg-define-macro "Argument specification" t) + '("RenewDocumentCommand" + TeX-arg-macro "Argument specification" t) + '("ProvideDocumentCommand" + TeX-arg-define-macro "Argument specification" t) + + ;; Declaring environments + '("DeclareDocumentEnvironment" TeX-arg-define-environment + "Argument specification" t t) + '("NewDocumentEnvironment" TeX-arg-define-environment + "Argument specification" t t) + '("RenewDocumentEnvironment" TeX-arg-environment + "Argument specification" t t) + '("ProvideDocumentEnvironment" TeX-arg-define-environment + "Argument specification" t t) + + ;; Fully-expandable document commands + '("DeclareExpandableDocumentCommand" + TeX-arg-define-macro "Argument specification" t) + '("NewExpandableDocumentCommand" + TeX-arg-define-macro "Argument specification" t) + '("RenewExpandableDocumentCommand" + TeX-arg-macro "Argument specification" t) + '("ProvideExpandableDocumentCommand" + TeX-arg-define-macro "Argument specification" t) + + ;; Testing special values + '("IfBooleanTF" 3) + '("IfBooleanT" 2) + '("IfBooleanF" 2) + '("IfNoValueTF" 3) + '("IfNoValueT" 2) + '("IfNoValueF" 2) + '("IfValueTF" 3) + '("IfValueT" 2) + '("IfValueF" 2) + '("IfBlankTF" 3) + '("IfBlankT" 2) + '("IfBlankF" 2) + "BooleanTrue" + "BooleanFalse" + ;; Argument processors + "ProcessedArgument" + "ReverseBoolean" + '("SplitArgument" "Number" "Token") + '("SplitList" "Token") + "TrimSpaces" + '("ProcessList" "List" "Function") + ;; Access to the argument specification + '("GetDocumentCommandArgSpec" TeX-arg-macro) + '("GetDocumentEnvironmmentArgSpec" TeX-arg-environment) + '("ShowDocumentCommandArgSpec" TeX-arg-macro) + '("ShowDocumentEnvironmentArgSpec" TeX-arg-environment) + ;; LaTeX hook macros: '("AddToHook" TeX-arg-hook [ "Label" ] t) '("RemoveFromHook" TeX-arg-hook [ "Label" ]) diff --git a/style/xparse.el b/style/xparse.el index f3feaa56..aa6b4ff6 100644 --- a/style/xparse.el +++ b/style/xparse.el @@ -1,6 +1,6 @@ ;;; xparse.el --- AUCTeX style for `xparse.sty' version 2022-07-05 -*- lexical-binding: t; -*- -;; Copyright (C) 2013, 2020--2023 Free Software Foundation, Inc. +;; Copyright (C) 2013--2023 Free Software Foundation, Inc. ;; Maintainer: auctex-devel@gnu.org ;; Author: Mosè Giordano <m...@gnu.org> @@ -25,332 +25,17 @@ ;;; Commentary: -;; This file adds basic support for `xparse.sty' version 2022-07-05. -;; It parses argument specification of macros and environments. +;; The content of this file is now (November 2023) part of latex.el +;; and font-latex.el. This style provides only completion for xparse +;; package options. ;; The "yet not more supported" specifiers `l', `u', `g' and `G' are ;; ignored completely and may lead to wrong parsing results. ;;; Code: -(require 'tex) (require 'latex) -;; Silence the compiler: -(declare-function font-latex-add-keywords - "font-latex" - (keywords class)) - -(TeX-auto-add-type "xparse-macro" "LaTeX") - -(defvar LaTeX-xparse-macro-regexp - `(,(concat - (regexp-quote TeX-esc) - "\\(New\\|Renew\\|Provide\\|Declare\\)" - "\\(?:Expandable\\)?" - "DocumentCommand" - "[ \t\n\r]*" - "{?" - "[ \t\n\r]*" - (regexp-quote TeX-esc) - "\\([A-Za-z]+\\)" - "[ \t\n\r]*" - "}?" - "[ \t\n\r]*" - "{\\([^}{]*\\(?:{[^}{]*\\(?:{[^}{]*\\(?:{[^}{]*}[^}{]*\\)*}[^}{]*\\)*}[^}{]*\\)*\\)}") - (0 2 3 1) LaTeX-auto-xparse-macro) - "Matches macros by xparse package.") - -(TeX-auto-add-type "xparse-environment" "LaTeX") - -(defvar LaTeX-xparse-environment-regexp - `(,(concat - (regexp-quote TeX-esc) - "\\(New\\|Renew\\|Provide\\|Declare\\)" - "DocumentEnvironment" - "[ \t\n\r]*" - "{" - "[ \t\n\r]*" - "\\([A-Za-z]+\\)" - "[ \t\n\r]*" - "}" - "[ \t\n\r]*" - "{\\([^}{]*\\(?:{[^}{]*\\(?:{[^}{]*\\(?:{[^}{]*}[^}{]*\\)*}[^}{]*\\)*}[^}{]*\\)*\\)}") - (0 2 3 1) LaTeX-auto-xparse-environment) - "Matches environments by xparse package.") - -(defun LaTeX-arg-xparse-query (optional op-brace cl-brace &optional prompt) - "Special query function for parsed elements from xparse package. -If OPTIONAL is non-nil, indicate it in minibuffer. OP-BRACE sets -the opening brace, CL-BRACE sets the closing one. PROMPT -replaces the standard one." - (let ((TeX-arg-opening-brace op-brace) - (TeX-arg-closing-brace cl-brace)) - (TeX-argument-insert - (TeX-read-string (TeX-argument-prompt optional prompt "Text")) - optional))) - -(defun LaTeX-arg-xparse-embellishment-query (_optional embellish) - "Special insert function for embellishments from xparse package. -Compatibility argument OPTIONAL is ignored. EMBELLISH is a -string with parsed elements inserted in the buffer. This -function also sets the value of `TeX-exit-mark' where the point -will be once the insertion is completed." - (let (p) - (just-one-space) - (setq p (point)) - (insert embellish) - (set-marker TeX-exit-mark (1+ p)))) - -(defun LaTeX-xparse-macro-parse (type) - "Process parsed macro and environment definitions. -TYPE is one of the symbols mac or env." - (dolist (xcmd (if (eq type 'mac) - (LaTeX-xparse-macro-list) - (LaTeX-xparse-environment-list))) - (let ((name (nth 1 xcmd)) - (spec (nth 2 xcmd)) - (what (nth 3 xcmd)) - (case-fold-search nil) - (syntax (TeX-search-syntax-table ?\{ ?\})) - args opt-star opt-token) - (with-temp-buffer - (set-syntax-table LaTeX-mode-syntax-table) - ;; This one is probably not really needed? - (goto-char (point-min)) - (insert (replace-regexp-in-string "[ \t\r\n%]" "" spec)) - (goto-char (point-min)) - (while (looking-at-p "[+!>=bmrRvodODsteE]") - (cond ((looking-at-p "[+!b]") - ;; + or !: Long argument or space aware: Move over - ;; them. b is special; only available for - ;; enviroments - (forward-char 1)) - ;; Argument processors and key-val modifier: Move - ;; over [>=] and a balanced {} - ((looking-at-p "[>=]") - (forward-char 1) - (with-syntax-table syntax (forward-sexp))) - ;; Mandatory arguments: - ;; m: Ask for input with "Text" as prompt - ((looking-at-p "m") - (forward-char 1) - (push "Text" args)) - ;; r<token1><token2> - ((looking-at-p "r") - (re-search-forward "r\\(.\\)\\(.\\)" (+ (point) 3) t) - (push `(LaTeX-arg-xparse-query - ,(match-string-no-properties 1) - ,(match-string-no-properties 2)) - args)) - ;; R<token1><token2>{default} - ((looking-at-p "R") - (re-search-forward "R\\(.\\)\\(.\\)" (+ (point) 3) t) - (with-syntax-table syntax (forward-sexp)) - (push `(LaTeX-arg-xparse-query - ,(match-string-no-properties 1) - ,(match-string-no-properties 2)) - args)) - ;; v: Use `TeX-arg-verb-delim-or-brace' - ((looking-at-p "v") - (forward-char 1) - (push #'TeX-arg-verb-delim-or-brace args)) - ;; Optional arguments: - ;; o standard LaTeX optional in square brackets - ((looking-at-p "o") - (forward-char 1) - (push (vector "Text") args)) - ;; d<token1><token2> - ((looking-at-p "d") - (re-search-forward "d\\(.\\)\\(.\\)" (+ (point) 3) t) - (push (vector #'LaTeX-arg-xparse-query - (match-string-no-properties 1) - (match-string-no-properties 2)) - args)) - ;; O{default} - ((looking-at-p "O") - (forward-char 1) - (with-syntax-table syntax (forward-sexp)) - (push (vector "Text") args)) - ;; D<token1><token2>{default} - ((looking-at-p "D") - (re-search-forward "D\\(.\\)\\(.\\)" (+ (point) 3) t) - (with-syntax-table syntax (forward-sexp)) - (push (vector #'LaTeX-arg-xparse-query - (match-string-no-properties 1) - (match-string-no-properties 2)) - args)) - ;; s: optional star - ((looking-at-p "s") - (forward-char 1) - (setq opt-star t)) - ;; t: optional <token> - ((looking-at-p "t") - (re-search-forward "t\\(.\\)" (+ (point) 2) t) - (setq opt-token (match-string-no-properties 1))) - ;; e{tokes} a set of optional embellishments - ((looking-at-p "e") - (forward-char) - (if (looking-at-p TeX-grop) - (re-search-forward "{\\([^}]+\\)}" nil t) - (re-search-forward "\\(.\\)" (1+ (point)) t)) - (push `(LaTeX-arg-xparse-embellishment-query - ,(match-string-no-properties 1)) - args)) - ;; E{tokes}{defaults} - ((looking-at-p "E") - (forward-char) - (if (looking-at-p TeX-grop) - (re-search-forward "{\\([^}]+\\)}" nil t) - (re-search-forward "\\(.\\)" (1+ (point)) t)) - (push `(LaTeX-arg-xparse-embellishment-query - ,(match-string-no-properties 1)) - args) - (when (looking-at-p TeX-grop) - (with-syntax-table syntax (forward-sexp)))) - ;; Finished: - (t nil)))) - (if (eq type 'env) - ;; Parsed enviroments: If we are Renew'ing or Delare'ing, we - ;; delete the enviroment first from `LaTeX-environment-list' - ;; before adding the new one. We have to sort the value of - ;; `LaTeX-environment-list' by running the function of the - ;; same name: - (progn - (when (member what '("Renew" "Declare")) - (LaTeX-environment-list) - (setq LaTeX-environment-list - (assq-delete-all (car (assoc name LaTeX-environment-list)) - LaTeX-environment-list))) - (LaTeX-add-environments `(,name - LaTeX-env-args - ,@(reverse args)))) - ;; Parsed macros: If we are Renew'ing or Delare'ing, we delete - ;; the macros first from `TeX-symbol-list' before adding the - ;; new ones. We have to sort the value of `TeX-symbol-list' - ;; by running the function of the same name: - (when (member what '("Renew" "Declare")) - (TeX-symbol-list) - (setq TeX-symbol-list - (assq-delete-all (car (assoc name TeX-symbol-list)) - TeX-symbol-list)) - (when opt-star - (setq TeX-symbol-list - (assq-delete-all (car (assoc (concat name "*") TeX-symbol-list)) - TeX-symbol-list))) - (when opt-token - (setq TeX-symbol-list - (assq-delete-all (car (assoc (concat name opt-token) TeX-symbol-list)) - TeX-symbol-list)))) - (TeX-add-symbols (cons name - (reverse args))) - (when opt-star - (TeX-add-symbols (cons (concat name "*") - (reverse args)))) - (when opt-token - (TeX-add-symbols (cons (concat name opt-token) - (reverse args)))))))) - -(defun LaTeX-xparse-auto-prepare () - "Clear various `LaTeX-auto-xparse-*' variables before parsing." - (setq LaTeX-auto-xparse-macro nil - LaTeX-auto-xparse-environment nil)) - -(defun LaTeX-xparse-auto-cleanup () - "Process parsed elements for xparse package." - (LaTeX-xparse-macro-parse 'mac) - (LaTeX-xparse-macro-parse 'env)) - -(add-hook 'TeX-auto-prepare-hook #'LaTeX-xparse-auto-prepare t) -(add-hook 'TeX-auto-cleanup-hook #'LaTeX-xparse-auto-cleanup t) -(add-hook 'TeX-update-style-hook #'TeX-auto-parse t) - -(TeX-add-style-hook - "xparse" - (lambda () - (TeX-auto-add-regexp LaTeX-xparse-macro-regexp) - (TeX-auto-add-regexp LaTeX-xparse-environment-regexp) - (TeX-run-style-hooks - "expl3") - (TeX-add-symbols - ;; Declaring commands - '("DeclareDocumentCommand" - TeX-arg-define-macro "Argument specification" t) - '("NewDocumentCommand" - TeX-arg-define-macro "Argument specification" t) - '("RenewDocumentCommand" - TeX-arg-macro "Argument specification" t) - '("ProvideDocumentCommand" - TeX-arg-define-macro "Argument specification" t) - - ;; Declaring commands and environments - '("DeclareDocumentEnvironment" TeX-arg-define-environment - "Argument specification" t t) - '("NewDocumentEnvironment" TeX-arg-define-environment - "Argument specification" t t) - '("RenewDocumentEnvironment" TeX-arg-environment - "Argument specification" t t) - '("ProvideDocumentEnvironment" TeX-arg-define-environment - "Argument specification" t t) - - ;; Fully-expandable document commands - '("DeclareExpandableDocumentCommand" - TeX-arg-define-macro "Argument specification" t) - '("NewExpandableDocumentCommand" - TeX-arg-define-macro "Argument specification" t) - '("RenewExpandableDocumentCommand" - TeX-arg-macro "Argument specification" t) - '("ProvideExpandableDocumentCommand" - TeX-arg-define-macro "Argument specification" t) - - ;; Testing special values - '("IfBooleanTF" 3) - '("IfBooleanT" 2) - '("IfBooleanF" 2) - '("IfNoValueTF" 3) - '("IfNoValueT" 2) - '("IfNoValueF" 2) - '("IfValueTF" 3) - '("IfValueT" 2) - '("IfValueF" 2) - '("IfBlankTF" 3) - '("IfBlankT" 2) - '("IfBlankF" 2) - "BooleanTrue" - "BooleanFalse" - ;; Argument processors - "ProcessedArgument" - "ReverseBoolean" - '("SplitArgument" "Number" "Token") - '("SplitList" "Token") - "TrimSpaces" - '("ProcessList" "List" "Function") - ;; Access to the argument specification - '("GetDocumentCommandArgSpec" TeX-arg-macro) - '("GetDocumentEnvironmmentArgSpec" TeX-arg-environment) - '("ShowDocumentCommandArgSpec" TeX-arg-macro) - '("ShowDocumentEnvironmentArgSpec" TeX-arg-environment)) - - ;; Fontification - (when (and (featurep 'font-latex) - (eq TeX-install-font-lock 'font-latex-setup)) - (font-latex-add-keywords '(("DeclareDocumentCommand" "|{\\{{") - ("NewDocumentCommand" "|{\\{{") - ("ProvideDocumentCommand" "|{\\{{") - ("RenewDocumentCommand" "|{\\{{") - ;; - ("DeclareExpandableDocumentCommand" "|{\\{{") - ("NewExpandableDocumentCommand" "|{\\{{") - ("ProvideExpandableDocumentCommand" "|{\\{{") - ("RenewExpandableDocumentCommand" "|{\\{{") - ;; - ("DeclareDocumentEnvironment" "{{{{") - ("NewDocumentEnvironment" "{{{{") - ("ProvideDocumentEnvironment" "{{{{") - ("RenewDocumentEnvironment" "{{{{")) - 'function))) - TeX-dialect) - (defvar LaTeX-xparse-package-options-list '(("log-declarations" ("true" "false"))) "Package options for the xparse package.")