branch: main commit 3bbe51275c98e945f984128a6dc9e38d4185c64c Merge: 1e8a495a 2ccd88ac Author: Tassilo Horn <t...@gnu.org> Commit: Tassilo Horn <t...@gnu.org>
Merge remote-tracking branch 'origin/master' into externals/auctex --- doc/auctex.texi | 3 +- doc/changes.texi | 10 +++ latex/preview.dtx | 2 +- style/xparse.el | 240 ++++++++++++++++++++++++++++++++++++++++++++++++------ 4 files changed, 229 insertions(+), 26 deletions(-) diff --git a/doc/auctex.texi b/doc/auctex.texi index ab69dd08..079179c4 100644 --- a/doc/auctex.texi +++ b/doc/auctex.texi @@ -2383,7 +2383,8 @@ finds a closing dollar sign or till the end of the buffer. As a remedy you can make the verbatim construct known to @fontlatex{}, @pxref{Verbatim content}. If this is not possible, you can insert a commented dollar sign (@samp{%$}) at the next suitable end of line as a -quick workaround. +quick workaround. In docTeX documents, @samp{^^A$} is also available +for similar purpose. @c As a last resort one can set `font-lock-keywords-only', but we should @c probably not advise users to do this. diff --git a/doc/changes.texi b/doc/changes.texi index 1c09683a..bc2bfb6f 100644 --- a/doc/changes.texi +++ b/doc/changes.texi @@ -11,6 +11,16 @@ @heading News in 12.3 @itemize @bullet +@item +The function @code{font-latex-update-font-lock} has been obsoleted in +order to fix @samp{bug#37945}. That function was used by several style +files in order to refresh fontification after adding new symbols or +verbatim constructs. It is better to call @code{font-lock-flush} in the +former case and @code{font-latex-set-syntactic-keywords} in the latter +case. The function @code{font-latex-update-font-lock} still exists as a +no-op which only shows a warning explaining how to update font-lock as +mentioned above. + @item Math expression highlighting was improved. Highlighting for documents with a lot of inline math expressions @samp{$...$} won't get scrambled diff --git a/latex/preview.dtx b/latex/preview.dtx index a2f3db64..2563bcd3 100644 --- a/latex/preview.dtx +++ b/latex/preview.dtx @@ -137,7 +137,7 @@ % \item[|textmath|] will make all text math subject to previews. % Since math mode is used throughly inside of \LaTeX\ even for other % purposes, this works by redefining \cmd\(, \cmd\) -% and |$| and the |math| environment (apparently some people use +% and |$| and the |math| environment (apparently some people use ^^A$ % that). Only occurences of these text math delimiters in later % loaded packages and in the main document will thus be affected. % \item[|graphics|] will subject all \cmd{\includegraphics} commands diff --git a/style/xparse.el b/style/xparse.el index 271ec615..79ab6042 100644 --- a/style/xparse.el +++ b/style/xparse.el @@ -1,9 +1,9 @@ -;;; xparse.el --- AUCTeX style for `xparse.sty' version 4467. +;;; xparse.el --- AUCTeX style for `xparse.sty' version 2020-03-06 -;; Copyright (C) 2013, 2018 Free Software Foundation, Inc. +;; Copyright (C) 2013, 2020 Free Software Foundation, Inc. ;; Maintainer: auctex-devel@gnu.org -;; Author: Mosè Giordano <giordano.m...@libero.it> +;; Author: Mosè Giordano <m...@gnu.org> ;; Keywords: tex ;; This file is part of AUCTeX. @@ -25,8 +25,13 @@ ;;; Commentary: -;; This file adds basic support for `xparse.sty' version 4467. It -;; doesn't parse argument specification of macros and environments. +;; This file adds basic support for `xparse.sty' version 2020-03-06. +;; It parses argument specification of macros and environments. + +;; Currently, this style doesn't parse the embellishments specifiers +;; `e' and `E'. The "yet not more supported" specifiers `l', `u', `g' +;; and `G' are ignored completely and may lead to wrong parsing +;; results. ;;; Code: @@ -35,33 +40,206 @@ "font-latex" (keywords class)) +;; Needed for auto-parsing. +(require 'tex) + +(TeX-auto-add-type "xparse-macro" "LaTeX") + (defvar LaTeX-xparse-macro-regexp - (concat "\\\\\\(?:Declare\\|New\\|Renew\\|Provide\\|DeclareExpandable\\)" - "DocumentCommand[ \t\n\r]*{?[ \t\n\r]*\\\\\\([A-Za-z]+\\)[ \t\n\r]*}?" - ;; The following is the opening brace of argument specification and is - ;; needed to skip internal macros containing `:' or `_'. - "[ \t\n\r]*{") + `(,(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]*" + "{\\([^}{]*\\({[^}{]*\\({[^}{]*\\({[^}{]*}[^}{]*\\)*}[^}{]*\\)*}[^}{]*\\)*\\)}") + (1 2) LaTeX-auto-xparse-macro) "Matches macros by xparse package.") +(TeX-auto-add-type "xparse-environment" "LaTeX") + (defvar LaTeX-xparse-environment-regexp - (concat "\\\\\\(?:Declare\\|New\\|Renew\\|Provide\\)DocumentEnvironment" - "[ \t\n\r]*{[ \t\n\r]*\\([A-Za-z]+\\)[ \t\n\r]*}") + `(,(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]*" + "{\\([^}{]*\\({[^}{]*\\({[^}{]*\\({[^}{]*}[^}{]*\\)*}[^}{]*\\)*}[^}{]*\\)*\\)}") + (1 2) 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-xparse-macro-parse (type) + "Process parsed macro and environment definitions. +TYPE is one of the symobols mac or env." + (dolist (xcmd (if (eq type 'mac) + (LaTeX-xparse-macro-list) + (LaTeX-xparse-environment-list))) + (let ((name (car xcmd)) + (spec (cadr xcmd)) + 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 (;; + or !: Long argument or space aware: Move over + ;; them. b is special; only available for + ;; enviroments + (looking-at-p "[+!b]") + (forward-char 1)) + ((looking-at-p ">") + ;; Argument processors: Move over > and a balanced + ;; {} + (forward-char 1) + (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) + (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) + (forward-sexp) + (push (vector "Text") args)) + ;; D<token1><token2>{default} + ((looking-at-p "D") + (re-search-forward "D\\(?:\\(.\\)\\(.\\)\\)" (+ (point) 3) t) + (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 & E are currently ignored. e: If looking at a + ;; {, move one balanced expression, otherwise only + ;; one character. + ((looking-at-p "e") + (forward-char) + (if (looking-at-p TeX-grop) + (forward-sexp) + (forward-char))) + ;; E + ((looking-at-p "E") + (forward-char) + (if (looking-at-p TeX-grop) + (forward-sexp) + (forward-char)) + (if (looking-at-p TeX-grop) + (forward-sexp) + (forward-char))) + ;; Finished: + (t nil)))) + (if (eq type 'env) + (LaTeX-add-environments `(,name + LaTeX-env-args + ,@(reverse (copy-sequence args)))) + (TeX-add-symbols (cons name + (reverse (copy-sequence args)))) + (when opt-star + (TeX-add-symbols (cons (concat name "*") + (reverse (copy-sequence args))))) + (when opt-token + (TeX-add-symbols (cons (concat name opt-token) + (reverse (copy-sequence 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 1 TeX-auto-symbol)) - (TeX-auto-add-regexp - `(,LaTeX-xparse-environment-regexp 1 LaTeX-auto-environment)) + (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 - '("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) '("DeclareDocumentEnvironment" TeX-arg-define-environment "Argument specification" t t) '("NewDocumentEnvironment" TeX-arg-define-environment @@ -70,9 +248,17 @@ "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" 3) @@ -97,18 +283,24 @@ '("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" "|{\\{{") - ("RenewDocumentCommand" "|{\\{{") + ("NewDocumentCommand" "|{\\{{") ("ProvideDocumentCommand" "|{\\{{") + ("RenewDocumentCommand" "|{\\{{") + ;; ("DeclareExpandableDocumentCommand" "|{\\{{") + ("NewExpandableDocumentCommand" "|{\\{{") + ("ProvideExpandableDocumentCommand" "|{\\{{") + ("RenewExpandableDocumentCommand" "|{\\{{") + ;; ("DeclareDocumentEnvironment" "{{{{") - ("NewDocumentEnvironment" "{{{{") - ("RenewDocumentEnvironment" "{{{{") - ("ProvideDocumentEnvironment" "{{{{")) + ("NewDocumentEnvironment" "{{{{") + ("ProvideDocumentEnvironment" "{{{{") + ("RenewDocumentEnvironment" "{{{{")) 'function))) LaTeX-dialect)