org-inside-LaTeX-fragment-p: Use more accurate org-element API

* lisp/org.el (org-inside-LaTeX-fragment-p): Use `org-element-context'
to analyze context at point instead of ad-hoc regexp matching.  Do not
return undocumented cons cell.  Update docstring dropping all the
previously listed caveats.  Add new optional argument ELEMENT to
provide element at point.
(org--math-always-on): Follow new `org-inside-LaTeX-fragment-p' return
value spec.  Do no rely on previous undocumented convention.

Reported-by: Justin Silverman <jsilve24@gmail.com>
Link: https://orgmode.org/list/87v8mktt38.fsf@gmail.com
This commit is contained in:
Ihor Radchenko 2022-12-10 12:22:04 +03:00
parent 90db6d5b9c
commit f01390cf05
No known key found for this signature in database
GPG Key ID: 6470762A7DA11D8B
1 changed files with 12 additions and 51 deletions

View File

@ -15439,14 +15439,12 @@ an embedded LaTeX fragment, let `texmathp' do its job.
(setq texmathp-why '("cdlatex-math-symbol in org-mode" . 0)) (setq texmathp-why '("cdlatex-math-symbol in org-mode" . 0))
t) t)
(t (t
(let ((p (org-inside-LaTeX-fragment-p))) (let ((element (org-element-context)))
(when p ;; FIXME: Shouldn't we return t when `p' is nil? (or (not (org-inside-LaTeX-fragment-p element))
(if (member (car p) (if (not (eq (org-element-type element) 'latex-fragment))
(plist-get org-format-latex-options :matchers)) (apply orig-fun args)
(progn (setq texmathp-why '("Org mode embedded math" . 0))
(setq texmathp-why '("Org mode embedded math" . 0)) t))))))
t)
(apply orig-fun args)))))))
(defun turn-on-org-cdlatex () (defun turn-on-org-cdlatex ()
"Unconditionally turn on `org-cdlatex-mode'." "Unconditionally turn on `org-cdlatex-mode'."
@ -15549,50 +15547,13 @@ environment remains unintended."
;;;; LaTeX fragments ;;;; LaTeX fragments
(defun org-inside-LaTeX-fragment-p () (defun org-inside-LaTeX-fragment-p (&optional element)
"Test if point is inside a LaTeX fragment. "Test if point is inside a LaTeX fragment or environment.
I.e. after a \\begin, \\(, \\[, $, or $$, without the corresponding closing
sequence appearing also before point.
Even though the matchers for math are configurable, this function assumes
that \\begin, \\(, \\[, and $$ are always used. Only the single dollar
delimiters are skipped when they have been removed by customization.
The return value is nil, or a cons cell with the delimiter and the
position of this delimiter.
This function does a reasonably good job, but can locally be fooled by When optional argument ELEMENT is non-nil, it should be element/object
for example currency specifications. For example it will assume being in at point."
inline math after \"$22.34\". The LaTeX fragment formatter will only format (memq (org-element-type (or element (org-element-context)))
fragments that are properly closed, but during editing, we have to live '(latex-fragment latex-environment)))
with the uncertainty caused by missing closing delimiters. This function
looks only before point, not after."
(catch 'exit
(let ((pos (point))
(dodollar (member "$" (plist-get org-format-latex-options :matchers)))
(lim (progn
(re-search-backward (concat "^\\(" paragraph-start "\\)") nil
'move)
(point)))
dd-on str (start 0) m re)
(goto-char pos)
(when dodollar
(setq str (concat (buffer-substring lim (point)) "\000 X$.")
re (nth 1 (assoc "$" org-latex-regexps)))
(while (string-match re str start)
(cond
((= (match-end 0) (length str))
(throw 'exit (cons "$" (+ lim (match-beginning 0) 1))))
((= (match-end 0) (- (length str) 5))
(throw 'exit nil))
(t (setq start (match-end 0))))))
(when (setq m (re-search-backward "\\(\\\\begin{[^}]*}\\|\\\\(\\|\\\\\\[\\)\\|\\(\\\\end{[^}]*}\\|\\\\)\\|\\\\\\]\\)\\|\\(\\$\\$\\)" lim t))
(goto-char pos)
(and (match-beginning 1) (throw 'exit (cons (match-string 1) m)))
(and (match-beginning 2) (throw 'exit nil))
;; count $$
(while (re-search-backward "\\$\\$" lim t)
(setq dd-on (not dd-on)))
(goto-char pos)
(when dd-on (cons "$$" m))))))
(defun org-inside-latex-macro-p () (defun org-inside-latex-macro-p ()
"Is point inside a LaTeX macro or its arguments?" "Is point inside a LaTeX macro or its arguments?"