forked from mirrors/org-mode
Work around a display bug when previewing LaTeX fragments
* lisp/org.el (org-format-latex): Change signature. (org-toggle-latex-fragment): * lisp/ox-html.el (org-html-format-latex): Apply signature change.
This commit is contained in:
parent
24852ef060
commit
a24f339f58
277
lisp/org.el
277
lisp/org.el
|
@ -19114,65 +19114,64 @@ for all fragments in the buffer."
|
|||
(when (display-graphic-p)
|
||||
(catch 'exit
|
||||
(save-excursion
|
||||
(let ((window-start (window-start)) msg)
|
||||
(save-restriction
|
||||
(cond
|
||||
((or (equal arg '(16))
|
||||
(and (equal arg '(4))
|
||||
(org-with-limited-levels (org-before-first-heading-p))))
|
||||
(if (org-remove-latex-fragment-image-overlays)
|
||||
(progn (message "LaTeX fragments images removed from buffer")
|
||||
(throw 'exit nil))
|
||||
(setq msg "Creating images for buffer...")))
|
||||
((equal arg '(4))
|
||||
(org-with-limited-levels (org-back-to-heading t))
|
||||
(let ((beg (point))
|
||||
(end (progn (org-end-of-subtree t) (point))))
|
||||
(if (org-remove-latex-fragment-image-overlays beg end)
|
||||
(progn
|
||||
(message "LaTeX fragment images removed from subtree")
|
||||
(throw 'exit nil))
|
||||
(setq msg "Creating images for subtree...")
|
||||
(narrow-to-region beg end))))
|
||||
((let ((datum (org-element-context)))
|
||||
(when (memq (org-element-type datum)
|
||||
'(latex-environment latex-fragment))
|
||||
(let* ((beg (org-element-property :begin datum))
|
||||
(end (org-element-property :end datum)))
|
||||
(if (org-remove-latex-fragment-image-overlays beg end)
|
||||
(progn (message "LaTeX fragment image removed")
|
||||
(throw 'exit nil))
|
||||
(narrow-to-region beg end)
|
||||
(setq msg "Creating image..."))))))
|
||||
(t
|
||||
(org-with-limited-levels
|
||||
(let ((beg (if (org-at-heading-p) (line-beginning-position)
|
||||
(outline-previous-heading)
|
||||
(point)))
|
||||
(end (progn (outline-next-heading) (point))))
|
||||
(if (org-remove-latex-fragment-image-overlays beg end)
|
||||
(progn
|
||||
(message "LaTeX fragment images removed from section")
|
||||
(let (beg end msg)
|
||||
(cond
|
||||
((or (equal arg '(16))
|
||||
(and (equal arg '(4))
|
||||
(org-with-limited-levels (org-before-first-heading-p))))
|
||||
(if (org-remove-latex-fragment-image-overlays)
|
||||
(progn (message "LaTeX fragments images removed from buffer")
|
||||
(throw 'exit nil))
|
||||
(setq msg "Creating images for section...")
|
||||
(narrow-to-region beg end))))))
|
||||
(let ((file (buffer-file-name (buffer-base-buffer))))
|
||||
(org-format-latex
|
||||
(concat org-preview-latex-image-directory "org-ltximg")
|
||||
;; Emacs cannot overlay images from remote hosts.
|
||||
;; Create it in `temporary-file-directory' instead.
|
||||
(if (or (not file) (file-remote-p file))
|
||||
temporary-file-directory
|
||||
default-directory)
|
||||
'overlays msg 'forbuffer org-preview-latex-default-process)))
|
||||
;; Work around a bug that doesn't restore window's start
|
||||
;; when widening back the buffer.
|
||||
(set-window-start nil window-start)
|
||||
(setq msg "Creating images for buffer...")))
|
||||
((equal arg '(4))
|
||||
(org-with-limited-levels (org-back-to-heading t))
|
||||
(setq beg (point))
|
||||
(setq end (progn (org-end-of-subtree t) (point)))
|
||||
(if (org-remove-latex-fragment-image-overlays beg end)
|
||||
(progn
|
||||
(message "LaTeX fragment images removed from subtree")
|
||||
(throw 'exit nil))
|
||||
(setq msg "Creating images for subtree...")))
|
||||
((let ((datum (org-element-context)))
|
||||
(when (memq (org-element-type datum)
|
||||
'(latex-environment latex-fragment))
|
||||
(setq beg (org-element-property :begin datum))
|
||||
(setq end (org-element-property :end datum))
|
||||
(if (org-remove-latex-fragment-image-overlays beg end)
|
||||
(progn (message "LaTeX fragment image removed")
|
||||
(throw 'exit nil))
|
||||
(setq msg "Creating image...")))))
|
||||
(t
|
||||
(org-with-limited-levels
|
||||
(setq beg (if (org-at-heading-p) (line-beginning-position)
|
||||
(outline-previous-heading)
|
||||
(point)))
|
||||
(setq end (progn (outline-next-heading) (point)))
|
||||
(if (org-remove-latex-fragment-image-overlays beg end)
|
||||
(progn
|
||||
(message "LaTeX fragment images removed from section")
|
||||
(throw 'exit nil))
|
||||
(setq msg "Creating images for section...")))))
|
||||
(let ((file (buffer-file-name (buffer-base-buffer))))
|
||||
(org-format-latex
|
||||
(concat org-preview-latex-image-directory "org-ltximg")
|
||||
beg end
|
||||
;; Emacs cannot overlay images from remote hosts. Create
|
||||
;; it in `temporary-file-directory' instead.
|
||||
(if (or (not file) (file-remote-p file))
|
||||
temporary-file-directory
|
||||
default-directory)
|
||||
'overlays msg 'forbuffer org-preview-latex-default-process))
|
||||
(message (concat msg "done")))))))
|
||||
|
||||
(defun org-format-latex
|
||||
(prefix &optional dir overlays msg forbuffer processing-type)
|
||||
"Replace LaTeX fragments with links to an image, and produce images.
|
||||
(prefix &optional beg end dir overlays msg forbuffer processing-type)
|
||||
"Replace LaTeX fragments with links to an image.
|
||||
|
||||
The function takes care of creating the replacement image.
|
||||
|
||||
Only consider fragments between BEG and END when those are
|
||||
provided.
|
||||
|
||||
When optional argument OVERLAYS is non-nil, display the image on
|
||||
top of the fragment instead of replacing it.
|
||||
|
@ -19186,11 +19185,11 @@ Some of the options can be changed using the variable
|
|||
(let* ((math-regexp "\\$\\|\\\\[([]\\|^[ \t]*\\\\begin{[A-Za-z0-9*]+}")
|
||||
(cnt 0)
|
||||
checkdir-flag)
|
||||
(goto-char (point-min))
|
||||
(goto-char (or beg (point-min)))
|
||||
;; Optimize overlay creation: (info "(elisp) Managing Overlays").
|
||||
(when (and overlays (memq processing-type '(dvipng imagemagick)))
|
||||
(overlay-recenter (point-max)))
|
||||
(while (re-search-forward math-regexp nil t)
|
||||
(overlay-recenter (or end (point-max))))
|
||||
(while (re-search-forward math-regexp end t)
|
||||
(unless (and overlays
|
||||
(eq (get-char-property (point) 'org-overlay-type)
|
||||
'org-latex-overlay))
|
||||
|
@ -19205,87 +19204,87 @@ Some of the options can be changed using the variable
|
|||
(skip-chars-backward " \r\t\n")
|
||||
(point))))
|
||||
(cond
|
||||
((eq processing-type 'mathjax)
|
||||
;; Prepare for MathJax processing.
|
||||
(if (not (string-match "\\`\\$\\$?" value))
|
||||
(goto-char end)
|
||||
(delete-region beg end)
|
||||
(if (string= (match-string 0 value) "$$")
|
||||
(insert "\\[" (substring value 2 -2) "\\]")
|
||||
(insert "\\(" (substring value 1 -1) "\\)"))))
|
||||
((assq processing-type org-preview-latex-process-alist)
|
||||
;; Process to an image.
|
||||
(cl-incf cnt)
|
||||
(goto-char beg)
|
||||
(let* ((processing-info
|
||||
(cdr (assq processing-type org-preview-latex-process-alist)))
|
||||
(face (face-at-point))
|
||||
;; Get the colors from the face at point.
|
||||
(fg
|
||||
(let ((color (plist-get org-format-latex-options
|
||||
:foreground)))
|
||||
(if (and forbuffer (eq color 'auto))
|
||||
(face-attribute face :foreground nil 'default)
|
||||
color)))
|
||||
(bg
|
||||
(let ((color (plist-get org-format-latex-options
|
||||
:background)))
|
||||
(if (and forbuffer (eq color 'auto))
|
||||
(face-attribute face :background nil 'default)
|
||||
color)))
|
||||
(hash (sha1 (prin1-to-string
|
||||
(list org-format-latex-header
|
||||
org-latex-default-packages-alist
|
||||
org-latex-packages-alist
|
||||
org-format-latex-options
|
||||
forbuffer value fg bg))))
|
||||
(imagetype (or (plist-get processing-info :image-output-type) "png"))
|
||||
(absprefix (expand-file-name prefix dir))
|
||||
(linkfile (format "%s_%s.%s" prefix hash imagetype))
|
||||
(movefile (format "%s_%s.%s" absprefix hash imagetype))
|
||||
(sep (and block-type "\n\n"))
|
||||
(link (concat sep "[[file:" linkfile "]]" sep))
|
||||
(options
|
||||
(org-combine-plists
|
||||
org-format-latex-options
|
||||
`(:foreground ,fg :background ,bg))))
|
||||
(when msg (message msg cnt))
|
||||
(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)
|
||||
(org-create-formula-image
|
||||
value movefile options forbuffer processing-type))
|
||||
(if overlays
|
||||
(progn
|
||||
(dolist (o (overlays-in beg end))
|
||||
(when (eq (overlay-get o 'org-overlay-type)
|
||||
'org-latex-overlay)
|
||||
(delete-overlay o)))
|
||||
(org--format-latex-make-overlay beg end movefile imagetype)
|
||||
(goto-char end))
|
||||
(delete-region beg end)
|
||||
(insert
|
||||
(org-add-props link
|
||||
(list 'org-latex-src
|
||||
(replace-regexp-in-string "\"" "" value)
|
||||
'org-latex-src-embed-type
|
||||
(if block-type 'paragraph 'character)))))))
|
||||
((eq processing-type 'mathml)
|
||||
;; Process to MathML.
|
||||
(unless (org-format-latex-mathml-available-p)
|
||||
(user-error "LaTeX to MathML converter not configured"))
|
||||
(cl-incf cnt)
|
||||
(when msg (message msg cnt))
|
||||
(goto-char beg)
|
||||
(delete-region beg end)
|
||||
(insert (org-format-latex-as-mathml
|
||||
value block-type prefix dir)))
|
||||
(t
|
||||
(error "Unknown conversion process %s for LaTeX fragments"
|
||||
processing-type)))))))))))
|
||||
((eq processing-type 'mathjax)
|
||||
;; Prepare for MathJax processing.
|
||||
(if (not (string-match "\\`\\$\\$?" value))
|
||||
(goto-char end)
|
||||
(delete-region beg end)
|
||||
(if (string= (match-string 0 value) "$$")
|
||||
(insert "\\[" (substring value 2 -2) "\\]")
|
||||
(insert "\\(" (substring value 1 -1) "\\)"))))
|
||||
((assq processing-type org-preview-latex-process-alist)
|
||||
;; Process to an image.
|
||||
(cl-incf cnt)
|
||||
(goto-char beg)
|
||||
(let* ((processing-info
|
||||
(cdr (assq processing-type org-preview-latex-process-alist)))
|
||||
(face (face-at-point))
|
||||
;; Get the colors from the face at point.
|
||||
(fg
|
||||
(let ((color (plist-get org-format-latex-options
|
||||
:foreground)))
|
||||
(if (and forbuffer (eq color 'auto))
|
||||
(face-attribute face :foreground nil 'default)
|
||||
color)))
|
||||
(bg
|
||||
(let ((color (plist-get org-format-latex-options
|
||||
:background)))
|
||||
(if (and forbuffer (eq color 'auto))
|
||||
(face-attribute face :background nil 'default)
|
||||
color)))
|
||||
(hash (sha1 (prin1-to-string
|
||||
(list org-format-latex-header
|
||||
org-latex-default-packages-alist
|
||||
org-latex-packages-alist
|
||||
org-format-latex-options
|
||||
forbuffer value fg bg))))
|
||||
(imagetype (or (plist-get processing-info :image-output-type) "png"))
|
||||
(absprefix (expand-file-name prefix dir))
|
||||
(linkfile (format "%s_%s.%s" prefix hash imagetype))
|
||||
(movefile (format "%s_%s.%s" absprefix hash imagetype))
|
||||
(sep (and block-type "\n\n"))
|
||||
(link (concat sep "[[file:" linkfile "]]" sep))
|
||||
(options
|
||||
(org-combine-plists
|
||||
org-format-latex-options
|
||||
`(:foreground ,fg :background ,bg))))
|
||||
(when msg (message msg cnt))
|
||||
(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)
|
||||
(org-create-formula-image
|
||||
value movefile options forbuffer processing-type))
|
||||
(if overlays
|
||||
(progn
|
||||
(dolist (o (overlays-in beg end))
|
||||
(when (eq (overlay-get o 'org-overlay-type)
|
||||
'org-latex-overlay)
|
||||
(delete-overlay o)))
|
||||
(org--format-latex-make-overlay beg end movefile imagetype)
|
||||
(goto-char end))
|
||||
(delete-region beg end)
|
||||
(insert
|
||||
(org-add-props link
|
||||
(list 'org-latex-src
|
||||
(replace-regexp-in-string "\"" "" value)
|
||||
'org-latex-src-embed-type
|
||||
(if block-type 'paragraph 'character)))))))
|
||||
((eq processing-type 'mathml)
|
||||
;; Process to MathML.
|
||||
(unless (org-format-latex-mathml-available-p)
|
||||
(user-error "LaTeX to MathML converter not configured"))
|
||||
(cl-incf cnt)
|
||||
(when msg (message msg cnt))
|
||||
(goto-char beg)
|
||||
(delete-region beg end)
|
||||
(insert (org-format-latex-as-mathml
|
||||
value block-type prefix dir)))
|
||||
(t
|
||||
(error "Unknown conversion process %s for LaTeX fragments"
|
||||
processing-type)))))))))))
|
||||
|
||||
(defun org-create-math-formula (latex-frag &optional mathml-file)
|
||||
"Convert LATEX-FRAG to MathML and store it in MATHML-FILE.
|
||||
|
|
|
@ -2784,8 +2784,8 @@ INFO is a plist containing export properties."
|
|||
(setq latex-frag (concat latex-header latex-frag))))
|
||||
(with-temp-buffer
|
||||
(insert latex-frag)
|
||||
(org-format-latex cache-relpath cache-dir nil "Creating LaTeX Image..."
|
||||
nil processing-type)
|
||||
(org-format-latex cache-relpath nil nil cache-dir nil
|
||||
"Creating LaTeX Image..." nil processing-type)
|
||||
(buffer-string))))
|
||||
|
||||
(defun org-html-latex-environment (latex-environment _contents info)
|
||||
|
|
Loading…
Reference in a new issue