diff --git a/lisp/org-element.el b/lisp/org-element.el index da17de6b6..6b4dd29a0 100644 --- a/lisp/org-element.el +++ b/lisp/org-element.el @@ -2495,6 +2495,7 @@ LIMIT bounds the search. Return value is a cons cell whose CAR is `entity' or `latex-fragment' and CDR is beginning position." (save-excursion + (unless (bolp) (backward-char)) (let ((matchers (remove "begin" (plist-get org-format-latex-options :matchers))) ;; ENTITY-RE matches both LaTeX commands and Org entities. @@ -3189,6 +3190,7 @@ LIMIT bounds the search. Return value is a cons cell whose CAR is either `subscript' or `superscript' and CDR is beginning position." (save-excursion + (unless (bolp) (backward-char)) (when (re-search-forward org-match-substring-regexp limit t) (cons (if (string= (match-string 2) "_") 'subscript 'superscript) (match-beginning 2))))) @@ -3984,8 +3986,14 @@ type, as a symbol. OBJECTS is the previous candidates alist." ;; Filter out any object found but not belonging to RESTRICTION. - (setq objects (org-remove-if-not (lambda (obj) (memq (car obj) restriction)) - objects)) + (setq objects + (org-remove-if-not + (lambda (obj) + (let ((type (car obj))) + (memq (or (cdr (assq type org-element-object-successor-alist)) + type) + restriction))) + objects)) (let (next-candidates types-to-search) ;; If no previous result, search every object type in RESTRICTION. ;; Otherwise, keep potential candidates (old objects located after diff --git a/testing/lisp/test-org-element.el b/testing/lisp/test-org-element.el index b3b7e4c1e..3c4ef81b7 100644 --- a/testing/lisp/test-org-element.el +++ b/testing/lisp/test-org-element.el @@ -1093,7 +1093,13 @@ e^{i\\pi}+1=0 (should (org-test-with-temp-text "\\[a\\]" (org-element-map - (org-element-parse-buffer) 'latex-fragment 'identity))))) + (org-element-parse-buffer) 'latex-fragment 'identity))) + ;; Test fragment at the beginning of an item. + (should + (eq 'latex-fragment + (org-test-with-temp-text "- $x$" + (progn (search-forward "$") + (org-element-type (org-element-context)))))))) ;;;; Line Break @@ -1576,7 +1582,19 @@ Outside list" ;; With braces. (should (org-test-with-temp-text "a_{b}" - (org-element-map (org-element-parse-buffer) 'subscript 'identity)))) + (org-element-map (org-element-parse-buffer) 'subscript 'identity))) + ;; At the beginning of an item. + (should + (eq 'subscript + (org-test-with-temp-text "- _b" + (progn (search-forward "_") + (org-element-type (org-element-context)))))) + ;; Multiple subscripts in a paragraph. + (should + (= 2 + (org-test-with-temp-text "a_b and c_d" + (length + (org-element-map (org-element-parse-buffer) 'subscript 'identity)))))) ;;;; Superscript @@ -1590,7 +1608,20 @@ Outside list" ;; With braces. (should (org-test-with-temp-text "a^{b}" - (org-element-map (org-element-parse-buffer) 'superscript 'identity)))) + (org-element-map (org-element-parse-buffer) 'superscript 'identity))) + ;; At the beginning of an item. + (should + (eq 'superscript + (org-test-with-temp-text "- ^b" + (progn (search-forward "^") + (org-element-type (org-element-context)))))) + ;; Multiple superscript in a paragraph. + (should + (= 2 + (org-test-with-temp-text "a^b and c^d" + (length + (org-element-map + (org-element-parse-buffer) 'superscript 'identity)))))) ;;;; Table