Fix LaTeX fragments fontification

* lisp/org.el (org-do-latex-and-related): Limit false positive, e.g.,
in ORG-NEWS file.  Small speedup.
This commit is contained in:
Nicolas Goaziou 2020-04-24 00:52:14 +02:00
parent a5696b6e4f
commit 12515da332

View file

@ -5412,33 +5412,46 @@ Result depends on variable `org-highlight-latex-and-related'."
(append re-latex re-entities re-sub)
"\\|"))))
(defun org-do-latex-and-related (_limit)
(defun org-do-latex-and-related (limit)
"Highlight LaTeX snippets and environments, entities and sub/superscript.
Stop at first highlighted object, if any. Return t if some
highlighting was done, nil otherwise."
(when (org-string-nw-p org-latex-and-related-regexp)
(catch 'found
(while (re-search-forward org-latex-and-related-regexp
nil t) ;; on purpose, we ignore LIMIT
(unless (cl-some (lambda (f) (memq f '(org-code org-verbatim underline
org-special-keyword)))
(save-excursion
(goto-char (1+ (match-beginning 0)))
(face-at-point nil t)))
(let* ((offset (if (memq (char-after (1+ (match-beginning 0)))
'(?_ ?^))
1
0))
(start (+ offset (match-beginning 0)))
(end (match-end 0)))
(if (memq 'native org-highlight-latex-and-related)
(org-src-font-lock-fontify-block "latex" start end)
(font-lock-prepend-text-property start end
'face 'org-latex-and-related))
(add-text-properties (+ offset (match-beginning 0)) (match-end 0)
'(font-lock-multiline t)))
(throw 'found t)))
nil)))
(let ((latex-prefix-re (rx (or "$" "\\(" "\\[")))
(blank-line-re (rx (and "\n" (zero-or-more (or " " "\t")) "\n"))))
(catch 'found
(while (and (< (point) limit)
(re-search-forward org-latex-and-related-regexp nil t))
(cond
((cl-some (lambda (f)
(memq f '(org-code org-verbatim underline
org-special-keyword)))
(save-excursion
(goto-char (1+ (match-beginning 0)))
(face-at-point nil t))))
;; Try to limit false positives. In this case, ignore
;; $$...$$, \(...\), and \[...\] LaTeX constructs if they
;; contain an empty line.
((save-excursion
(goto-char (match-beginning 0))
(and (looking-at-p latex-prefix-re)
(save-match-data
(re-search-forward blank-line-re (1- (match-end 0)) t)))))
(t
(let* ((offset (if (memq (char-after (1+ (match-beginning 0)))
'(?_ ?^))
1
0))
(start (+ offset (match-beginning 0)))
(end (match-end 0)))
(if (memq 'native org-highlight-latex-and-related)
(org-src-font-lock-fontify-block "latex" start end)
(font-lock-prepend-text-property start end
'face 'org-latex-and-related))
(add-text-properties (+ offset (match-beginning 0)) (match-end 0)
'(font-lock-multiline t))
(throw 'found t)))))
nil))))
(defun org-restart-font-lock ()
"Restart `font-lock-mode', to force refontification."