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:
Nicolas Goaziou 2016-06-23 00:54:39 +02:00
parent 24852ef060
commit a24f339f58
2 changed files with 140 additions and 141 deletions

View file

@ -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.

View 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)