org-latex-preview: Split org-create-latex-preview

* lisp/org-latex-preview.el (org-create-latex-preview,
org-create-latex-export): Split the export and preview functionality of
`org-create-latex-preview' into two functions: a rewritten
`org-create-latex-preview' that now /only/ deals with previews, and
`org-create-latex-export' for exports.
(org-latex-preview-fragments): Use the new `org-create-latex-preview`.
(org-latex-replace-fragments): Use the new `org-create-latex-export`.
This commit is contained in:
TEC 2022-12-26 18:49:33 +08:00
parent 9edfc99fda
commit 712f97aaaf
Signed by: tec
SSH Key Fingerprint: SHA256:eobz41Mnm0/iYWBvWThftS0ElEs1ftBr6jamutnXc/A
1 changed files with 79 additions and 59 deletions

View File

@ -384,7 +384,7 @@ The way this is done is set by PROCESSING-TYPE, which can be either:
- mathml, in which case the math fragment is replace by the result of - mathml, in which case the math fragment is replace by the result of
`org-format-latex-as-mathml'. `org-format-latex-as-mathml'.
- an entry in `org-preview-latex-process-alist', in which case the - an entry in `org-preview-latex-process-alist', in which case the
math fragment is replaced with `org-create-latex-preview'. math fragment is replaced with `org-create-latex-export'.
Generated image files are placed in DIR with the prefix PREFIX. Note Generated image files are placed in DIR with the prefix PREFIX. Note
that PREFIX may itself contain a directory path component. that PREFIX may itself contain a directory path component.
@ -429,9 +429,11 @@ When generating output files, MSG will be `message'd if given."
(insert (org-format-latex-as-mathml (insert (org-format-latex-as-mathml
value block-type prefix dir))) value block-type prefix dir)))
((assq processing-type org-preview-latex-process-alist) ((assq processing-type org-preview-latex-process-alist)
(org-create-latex-preview (let ((image-dir (expand-file-name prefix dir)))
prefix beg end dir nil nil processing-type (unless (file-exists-p image-dir)
value block-type 'checkdir)) (make-directory image-dir t)))
(org-create-latex-export
processing-type context prefix dir block-type))
(t (error "Unknown conversion process %s for LaTeX fragments" (t (error "Unknown conversion process %s for LaTeX fragments"
processing-type)))))))))) processing-type))))))))))
@ -456,25 +458,21 @@ The previews are placed in
(overlay-recenter (or end (point-max)))) (overlay-recenter (or end (point-max))))
(unless (eq (get-char-property (point) 'org-overlay-type) (unless (eq (get-char-property (point) 'org-overlay-type)
'org-latex-overlay) 'org-latex-overlay)
(let ((image-dir (expand-file-name
(concat org-preview-latex-image-directory "org-ltximg")
dir)))
(unless (file-exists-p image-dir)
(make-directory image-dir t)))
(save-excursion (save-excursion
(goto-char (or beg (point-min))) (goto-char (or beg (point-min)))
(while (re-search-forward org-latex-tentative-math-re end t) (while (re-search-forward org-latex-tentative-math-re end t)
(let* ((context (org-element-context)) (let* ((context (org-element-context))
(type (org-element-type context))) (type (org-element-type context)))
(when (memq type '(latex-environment latex-fragment)) (when (memq type '(latex-environment latex-fragment))
(let ((value (org-element-property :value context)) (if (assq processing-type org-preview-latex-process-alist)
(beg (org-element-property :begin context)) (org-create-latex-preview processing-type context dir)
(end (save-excursion (error "Unknown conversion process %s for previewing LaTeX fragments"
(goto-char (org-element-property :end context)) processing-type))))))))
(skip-chars-backward " \r\t\n")
(point))))
(if (assq processing-type org-preview-latex-process-alist)
(org-create-latex-preview
(concat org-preview-latex-image-directory "org-ltximg")
beg end dir 'overlay 'forbuffer processing-type
value nil 'checkdir)
(error "Unknown conversion process %s for previewing LaTeX fragments"
processing-type)))))))))
(defun org-format-latex (defun org-format-latex
(prefix &optional beg end dir overlays msg forbuffer processing-type) (prefix &optional beg end dir overlays msg forbuffer processing-type)
@ -496,63 +494,85 @@ Some of the options can be changed using the variable
(org-latex-preview-fragments processing-type beg end) (org-latex-preview-fragments processing-type beg end)
(org-latex-replace-fragments prefix processing-type dir msg))) (org-latex-replace-fragments prefix processing-type dir msg)))
(defun org-create-latex-preview (prefix beg end dir overlays forbuffer processing-type (defun org-create-latex-preview (processing-type element &optional dir)
value block-type checkdir-flag) "Create a preview of the LaTeX math fragment ELEMENT using PROCESSING-TYPE.
"The `org-preview-latex-process-alist' branch of `org-format-latex'."
(goto-char beg) The previews are placed in
`org-preview-latex-image-directory'/\"org-ltximg\", relative to DIR."
(let* ((processing-info (let* ((processing-info
(cdr (assq processing-type org-preview-latex-process-alist))) (cdr (assq processing-type org-preview-latex-process-alist)))
(face (face-at-point)) (beg (org-element-property :begin element))
;; Get the colors from the face at point. (end (save-excursion
(fg (goto-char (org-element-property :end element))
(let ((color (plist-get org-format-latex-options (skip-chars-backward " \r\t\n")
:foreground))) (point)))
(if forbuffer (value (org-element-property :value element))
(cond (face (save-excursion
((eq color 'auto) (goto-char beg)
(face-attribute face :foreground nil 'default)) (face-at-point)))
((eq color 'default) (fg (pcase (plist-get org-format-latex-options :foreground)
(face-attribute 'default :foreground nil)) ('auto (face-attribute face :foreground nil 'default))
(t color)) ('default (face-attribute 'default :foreground nil))
color))) (color color)))
(bg (bg (pcase (plist-get org-format-latex-options :background)
(let ((color (plist-get org-format-latex-options ('auto (face-attribute face :background nil 'default))
:background))) ('default (face-attribute 'default :background nil))
(if forbuffer (color color)))
(cond
((eq color 'auto)
(face-attribute face :background nil 'default))
((eq color 'default)
(face-attribute 'default :background nil))
(t color))
color)))
(hash (sha1 (prin1-to-string (hash (sha1 (prin1-to-string
(list org-format-latex-header (list org-format-latex-header
org-latex-default-packages-alist org-latex-default-packages-alist
org-latex-packages-alist org-latex-packages-alist
org-format-latex-options org-format-latex-options
forbuffer value fg bg)))) 'preview value fg bg))))
(imagetype (or (plist-get processing-info :image-output-type) "png"))
(absprefix (expand-file-name
(concat org-preview-latex-image-directory "org-ltximg")
dir))
(movefile (format "%s_%s.%s" absprefix hash imagetype))
(options (org-combine-plists
org-format-latex-options
(list :foreground fg :background bg))))
(unless (file-exists-p movefile)
(org-create-formula-image
value movefile options 'forbuffer processing-type))
(org-place-latex-image beg end movefile imagetype)))
(defun org-create-latex-export (processing-type element prefix dir &optional block-type)
"Create a export of the LaTeX math fragment ELEMENT using PROCESSING-TYPE.
Generated image files are placed in DIR with the prefix PREFIX. Note
that PREFIX may itself contain a directory path component.
BLOCK-TYPE determines whether the result is placed inline or as a paragraph."
(let* ((processing-info
(cdr (assq processing-type org-preview-latex-process-alist)))
(beg (org-element-property :begin element))
(end (save-excursion
(goto-char (org-element-property :end element))
(skip-chars-backward " \r\t\n")
(point)))
(value (org-element-property :value element))
(fg (plist-get org-format-latex-options :foreground))
(bg (plist-get org-format-latex-options :background))
(hash (sha1 (prin1-to-string
(list org-format-latex-header
org-latex-default-packages-alist
org-latex-packages-alist
org-format-latex-options
'export value fg bg))))
(imagetype (or (plist-get processing-info :image-output-type) "png")) (imagetype (or (plist-get processing-info :image-output-type) "png"))
(absprefix (expand-file-name prefix dir)) (absprefix (expand-file-name prefix dir))
(linkfile (format "%s_%s.%s" prefix hash imagetype)) (linkfile (format "%s_%s.%s" prefix hash imagetype))
(movefile (format "%s_%s.%s" absprefix hash imagetype)) (movefile (format "%s_%s.%s" absprefix hash imagetype))
(sep (and block-type "\n\n")) (sep (and block-type "\n\n"))
(link (concat sep "[[file:" linkfile "]]" sep)) (link (concat sep "[[file:" linkfile "]]" sep))
(options (options (org-combine-plists
(org-combine-plists org-format-latex-options
org-format-latex-options (list :foreground fg :background bg))))
`(:foreground ,fg :background ,bg))))
(unless checkdir-flag ; Ensure the directory exists.
(setq checkdir-flag t)
(let ((todir (file-name-directory absprefix)))
(unless (file-directory-p todir)
(make-directory todir t))))
(unless (file-exists-p movefile) (unless (file-exists-p movefile)
(org-create-formula-image (org-create-formula-image
value movefile options forbuffer processing-type)) value movefile options nil processing-type))
(if overlays (org-place-latex-image-link link block-type beg end value)))
(org-place-latex-image beg end movefile imagetype)
(org-place-latex-image-link link block-type beg end value))))
(defun org-place-latex-image (beg end movefile imagetype) (defun org-place-latex-image (beg end movefile imagetype)
"Place an overlay from BEG to END showing MOVEFILE. "Place an overlay from BEG to END showing MOVEFILE.