Subject: bug#57516: Fontification of single brace in an optional argument

From: Arash Esbati <[email-masked]>
Date: Tue, 21 May 2024 13:32:18 +0200

Arash Esbati <[email-masked]> writes:

> Note how the first {[ } extends the fontification until the next {] }.
> I think the issue is in the function `font-latex-find-matching-close',
> but I don't have an idea how to fix this.  Any takers?

I think we have a taker.  With the following patch:

--8<---------------cut here---------------start------------->8---
diff --git a/font-latex.el b/font-latex.el
index ccddd8b1..d814642a 100644
--- a/font-latex.el
+++ b/font-latex.el
@@ -1473,12 +1473,21 @@ ignored during the search."
         ;; closing brace gets a comment end syntax.
         ;; (2022 Mar) The latter half of the above paragraph no longer
         ;; applies since we changed the way to fontify ^^A comment.
-        (parse-sexp-lookup-properties nil))
+        (parse-sexp-lookup-properties nil)
+        (syntax (TeX-search-syntax-table openchar closechar)))
     (or
      (condition-case nil
          (progn
-           (goto-char (with-syntax-table
-                          (TeX-search-syntax-table openchar closechar)
+           ;; It is possible to have an opt. arg like \foo[key={]}].
+           ;; Since braces are always balanced in opt. arguments, we
+           ;; change the syntax to "generic comment delimiter".  For the
+           ;; backslash, we switch to "/" in order to ignore things like
+           ;; \{ and \}:
+           (unless (and (= openchar ?\{) (= closechar ?\}))
+             (modify-syntax-entry ?\{ "|" syntax)
+             (modify-syntax-entry ?\} "|" syntax)
+             (modify-syntax-entry ?\\ "/" syntax))
+           (goto-char (with-syntax-table syntax
                         (scan-sexps (point) 1)))
            ;; No error code.  See if closechar is unquoted
            (save-excursion
--8<---------------cut here---------------end--------------->8---

the .tex file in the other message looks like this with "emacs -Q":

The change also passes the tests.  Any comments welcome.

Best, Arash