org-latex-preview: Collect math fragments in fun

* lisp/org-latex-preview.el (org-latex-preview-fragments,
org-latex-replace-fragments, org-latex-collect-fragments): Introduce a
new function to collect all LaTeX math fragments in a
region (`org-latex-collect-fragments') and use it in
`org-latex-preview-fragments' and `org-latex-replace-fragments'.
This commit is contained in:
TEC 2022-12-26 20:02:22 +08:00
parent 712f97aaaf
commit e827bb8a24
Signed by: tec
SSH Key Fingerprint: SHA256:eobz41Mnm0/iYWBvWThftS0ElEs1ftBr6jamutnXc/A
1 changed files with 58 additions and 54 deletions

View File

@ -373,6 +373,18 @@ fragments in the buffer."
(org--latex-preview-region beg end)
(message "Creating LaTeX previews in section... done.")))))
(defun org-latex-collect-fragments (&optional beg end)
"Collect all LaTeX maths fragments/environments between BEG and END."
(let (fragments)
(save-excursion
(goto-char (or beg (point-min)))
(while (re-search-forward org-latex-tentative-math-re end t)
(let ((obj (org-element-context)))
(when (memq (org-element-type obj)
'(latex-fragment latex-environment))
(push obj fragments)))))
(nreverse fragments)))
(defun org-latex-replace-fragments (prefix processing-type &optional dir msg)
"Replace all LaTeX fragments in the buffer with export appropriate forms.
The way this is done is set by PROCESSING-TYPE, which can be either:
@ -392,16 +404,13 @@ that PREFIX may itself contain a directory path component.
When generating output files, MSG will be `message'd if given."
(let* ((cnt 0))
(save-excursion
(goto-char (point-min))
(while (re-search-forward org-latex-tentative-math-re nil t)
(let* ((context (org-element-context))
(type (org-element-type context)))
(when (memq type '(latex-environment latex-fragment))
(let ((block-type (eq type 'latex-environment))
(value (org-element-property :value context))
(beg (org-element-property :begin context))
(dolist (element (org-latex-collect-fragments))
(let ((block-type (eq (org-element-type element)
'latex-environment))
(value (org-element-property :value element))
(beg (org-element-property :begin element))
(end (save-excursion
(goto-char (org-element-property :end context))
(goto-char (org-element-property :end element))
(skip-chars-backward " \r\t\n")
(point))))
(cond
@ -433,9 +442,9 @@ When generating output files, MSG will be `message'd if given."
(unless (file-exists-p image-dir)
(make-directory image-dir t)))
(org-create-latex-export
processing-type context prefix dir block-type))
processing-type element prefix dir block-type))
(t (error "Unknown conversion process %s for LaTeX fragments"
processing-type))))))))))
processing-type))))))))
(defun org-latex-preview-fragments (processing-type &optional beg end dir)
"Produce image overlays of LaTeX math fragments between BEG and END.
@ -463,16 +472,11 @@ The previews are placed in
dir)))
(unless (file-exists-p image-dir)
(make-directory image-dir t)))
(save-excursion
(goto-char (or beg (point-min)))
(while (re-search-forward org-latex-tentative-math-re end t)
(let* ((context (org-element-context))
(type (org-element-type context)))
(when (memq type '(latex-environment latex-fragment))
(if (assq processing-type org-preview-latex-process-alist)
(org-create-latex-preview processing-type context dir)
(dolist (element (org-latex-collect-fragments beg end))
(org-create-latex-preview processing-type element dir))
(error "Unknown conversion process %s for previewing LaTeX fragments"
processing-type))))))))
processing-type))))
(defun org-format-latex
(prefix &optional beg end dir overlays msg forbuffer processing-type)