Subject: bug#34712: Fontification of simple macros

From: Arash Esbati <[email-masked]>
Date: Sat, 02 Mar 2019 21:53:15 +0100

Hi all,

while looking at this message[1], it seems that there is a bug in
font-latex.el.  This code

    \documentclass{beamer}

    \begin{document}

    \begin{frame}
      \frametitle<presentation>{MySlide}
                 |            |
             font-latex-sedate-face
    \end{frame}

    \foo<bar>-19+*

    \end{document}

looks like this for me:

Have a look at <...> and \foo<bar>-19+*.  I think the issue is that the
regexp in `font-latex-match-simple-command' is too greedy.  A possible
fix is attached below: We introduce a new variable
`font-latex-match-simple-include-list' for styles to add their special
characters for fontification to `font-latex-match-simple-command' which
is modified as shown below:

    \documentclass{beamer}

    \begin{document}

    \begin{frame}
      \frametitle<presentation>{MySlide}
                 |            |
             font-latex-sedate-face
    \end{frame}

    \foo<bar>-19+*

    \begin{verbatim}
    (defvar font-latex-match-simple-include-list nil
      "List of characters allowed in a macro for fontification.
    Each character is a string.")
    (make-variable-buffer-local 'font-latex-match-simple-include-list)

    (defun font-latex-match-simple-command (limit)
      "Search for command like \\foo before LIMIT."
      ;; \s_ matches chars with symbol syntax, \sw chars with word syntax,
      ;; \s. chars with punctuation syntax.  We must exclude matches where
      ;; the first character after the \ is a reserved character and
      ;; should not be fontified (e.g. \, in foo\,bar or \- in foo\-bar).
      ;; These characters are stored in
      ;; `font-latex-match-simple-exclude-list'.  In docTeX mode, we
      ;; remove "_" from this list to get correct fontification for macros
      ;; like `\__module_foo:nnn'
      (let* ((search (lambda ()
                       (TeX-re-search-forward-unescaped
                        (concat
                         ;; Chars directly after backslash
                         "\\\\\\(\\s_\\|\\sw\\|\\s.\\)"
                         ;; Start group of the following chars
                         "\\(?:["
                         ;; a-zA-Z are always allowed:
                         "a-zA-Z"
                         ;; Allow `@' used often to redefine internals
                         "@"
                         ;; Check for additional characters added by AUCTeX styles
                         (when font-latex-match-simple-include-list
                           (mapconcat #'identity
                                      font-latex-match-simple-include-list
                                      ""))
                         ;; End group
                         "]\\)*")
                        limit t)))
             (pos (funcall search)))
        (while (and pos
                    (member (match-string 1)
                            (if (eq major-mode 'doctex-mode)
                                (remove "_" font-latex-match-simple-exclude-list)
                              font-latex-match-simple-exclude-list)))
          (setq pos (funcall search)))
        pos))

    (font-latex-update-font-lock)

    \end{verbatim}

    \end{document}

E.g., `expl3.el' must do:

    (setq font-latex-match-simple-include-list '("_" ":"))

Any comments welcome.

Best, Arash

Footnotes:
[1]  http://lists.gnu.org/archive/html/auctex/2019-02/msg00005.html