diff --git a/lisp/textmodes/tex-mode.el b/lisp/textmodes/tex-mode.el index d990a2dbfa9..b2a6416f379 100644 --- a/lisp/textmodes/tex-mode.el +++ b/lisp/textmodes/tex-mode.el @@ -705,17 +705,36 @@ tex-verbatim-environments "\\(?:_+\\(?:[^][[:space:][:cntrl:][:digit:]:\\\\{}()/#_=]+\\|" "#+[1-9]\\)\\)+\\)\\([:_]?\\)") (1 (ignore - (let* ((expr (buffer-substring-no-properties (match-beginning 1) - (match-end 1))) - (list (seq-positions expr ?_))) - (dolist (pos list) - (put-text-property (+ pos (match-beginning 1)) - (1+ (+ pos (match-beginning 1))) - 'syntax-table (string-to-syntax "_")))))) + (when tex-expl-region-list + (let ((match (match-beginning 1))) + (catch 'result + (dolist (range tex-expl-region-list) + (and (> match (car range)) + (< match (cdr range)) + (let* ((expr (buffer-substring-no-properties + (match-beginning 1) + (match-end 1))) + (list (seq-positions expr ?_))) + (dolist (pos list) + (put-text-property (+ pos (match-beginning 1)) + (1+ (+ pos (match-beginning 1))) + 'syntax-table + (string-to-syntax "_")))) + (throw 'result t)))))))) (2 "_")) ("\\\\[[:alpha:]]+\\(:\\)[[:alpha:][:space:]\n]" (1 "_"))))) +(defvar-local tex-expl-region-list nil) + +(defun tex-expl-region-set (_beg _end) + (setq tex-expl-region-list nil) + (goto-char (point-min)) + (while (re-search-forward "\\ExplSyntaxOn" nil t) + (let ((new-beg (point)) + (new-end (re-search-forward "\\ExplSyntaxOff" nil t))) + (add-to-list 'tex-expl-region-list (cons new-beg new-end) t)))) + (defun tex-env-mark (cmd start end) (when (= cmd (line-beginning-position)) (let ((arg (buffer-substring-no-properties (1+ start) (1- end)))) @@ -1308,6 +1327,8 @@ tex-common-initialization #'tex--prettify-symbols-compose-p) (setq-local syntax-propertize-function (syntax-propertize-rules latex-syntax-propertize-rules)) + (add-hook 'syntax-propertize-extend-region-functions + #'tex-expl-region-set nil t) ;; TABs in verbatim environments don't do what you think. (setq-local indent-tabs-mode nil) ;; Set up xref backend in TeX buffers.