From f0f165ef1b3a3e3d161da509cf0548171a6f68fb Mon Sep 17 00:00:00 2001 From: Nicolas Goaziou Date: Sun, 10 Feb 2013 00:07:48 +0100 Subject: [PATCH] Fontify latex, entities and sub/superscript again * lisp/org-faces.el (org-latex-and-special): Renamed from `org-latex-and-export-specials', which wasn't appropriate anymore. * lisp/org.el (org-highlight-latex-and-special, org-latex-and-special-regexp): New variables. (org-compute-latex-and-special-regexp, org-do-latex-and-special): New function, revived from a previous commit. (org-set-regexps-and-options, org-set-font-lock-defaults): Use new functions. --- lisp/org-faces.el | 2 +- lisp/org.el | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+), 1 deletion(-) diff --git a/lisp/org-faces.el b/lisp/org-faces.el index de5a08c..a841ba3 100644 --- a/lisp/org-faces.el +++ b/lisp/org-faces.el @@ -765,7 +765,7 @@ level org-n-level-faces" :version "24.1" :type 'boolean) -(defface org-latex-and-export-specials +(defface org-latex-and-special (let ((font (cond ((assq :inherit custom-face-attributes) '(:inherit underline)) (t '(:underline t))))) diff --git a/lisp/org.el b/lisp/org.el index 2bfca4e..908fcb4 100644 --- a/lisp/org.el +++ b/lisp/org.el @@ -3889,6 +3889,11 @@ org-level-* faces." :group 'org-appearance :type 'boolean) +(defcustom org-highlight-latex-and-special nil + "Non-nil means fontify LaTeX stuff, entities and sub/superscript." + :group 'org-appearance + :type 'boolean) + (defcustom org-hide-emphasis-markers nil "Non-nil mean font-lock should hide the emphasis marker characters." :group 'org-appearance @@ -4987,6 +4992,7 @@ but the stars and the body are.") (mapcar (lambda (w) (substring w 0 -1)) (list org-scheduled-string org-deadline-string org-clock-string org-closed-string))) + (org-compute-latex-and-special-regexp) (org-set-font-lock-defaults)))) (defun org-file-contents (file &optional noerror) @@ -5837,9 +5843,49 @@ by a #." (goto-char e) t))) +(defvar org-latex-and-special-regexp nil + "Regular expression for highlighting LaTeX, entities and sub/superscript.") (defvar org-match-substring-regexp) (defvar org-match-substring-with-braces-regexp) +(defun org-compute-latex-and-special-regexp () + "Compute regular expression for LaTeX stuff, entities and sub/superscript." + (org-set-local + 'org-latex-and-special-regexp + (if (not org-highlight-latex-and-special) nil + (let* ((re-sub + (cond ((eq org-use-sub-superscripts '{}) + (list org-match-substring-with-braces-regexp)) + (org-use-sub-superscripts + (list org-match-substring-regexp)))) + (matchers (plist-get org-format-latex-options :matchers)) + (re-latex (delq nil + (mapcar (lambda (x) + (and (member (car x) matchers) (nth 1 x))) + org-latex-regexps))) + (re-macros (list "\\\\\\(there4\\|sup[123]\\|frac[13][24]\\|[a-zA-Z]+\\)\\($\\|{}\\|[^[:alpha:]]\\)"))) + (mapconcat 'identity (append re-latex re-macros re-sub) "\\|"))))) + +(defun org-do-latex-and-special (limit) + "Search down to LIMIT and fontify LaTeX snippets and entities. +Fontification happens only if `org-latex-and-special-regexp' is +non-nil." + (when org-latex-and-special-regexp + (let (rtn d) + (while (and (not rtn) + (re-search-forward org-latex-and-special-regexp limit t)) + (unless (memq (car-safe (get-text-property (1+ (match-beginning 0)) + 'face)) + '(org-code org-verbatim underline)) + (setq + rtn t + d (if (memq (char-after (1+ (match-beginning 0))) '(?_ ?^)) 1 0)) + (font-lock-prepend-text-property + (+ d (match-beginning 0)) (match-end 0) 'face 'org-latex-and-special) + (add-text-properties (+ d (match-beginning 0)) (match-end 0) + '(font-lock-multiline t)))) + rtn))) + (defun org-restart-font-lock () "Restart `font-lock-mode', to force refontification." (when (and (boundp 'font-lock-mode) font-lock-mode) @@ -6000,6 +6046,7 @@ needs to be inserted at a specific position in the font-lock sequence.") "\\(.*:" org-archive-tag ":.*\\)") '(1 'org-archived prepend)) ;; Specials + '(org-do-latex-and-special) '(org-fontify-entities) '(org-raise-scripts) ;; Code -- 1.8.1.3