Change `org-toggle-latex-fragment' behaviour

* lisp/org.el (org-remove-latex-fragment-image-overlays): Allow to
  limit overlay removal through optional arguments.  Define a new
  return value.
(org-toggle-latex-fragment): Change behaviour.  Update docstring
accordingly.
(org-format-latex): Update docstring.  Remove overlay when LaTeX
fragment is deleted.

* etc/ORG-NEWS: Signal change.

The new behaviour is the following:

  - With a double prefix argument or with a single prefix argument
    when point is before the first headline, toggle overlays in the
    whole buffer;

  - With a single prefix argument, toggle overlays in the current
    subtree;

  - On latex code, toggle overlay at point;

  - Otherwise, toggle overlays in the current section.

Suggested-by: <kuangdash@163.com>
<http://permalink.gmane.org/gmane.emacs.orgmode/95492>
This commit is contained in:
Nicolas Goaziou 2015-02-28 00:30:43 +01:00
parent 4fcc7d1a35
commit 1362c2d22b
2 changed files with 110 additions and 53 deletions

View File

@ -120,6 +120,20 @@ end-users browser. You may force initial usage of MathML via
~org-html-mathjax-template~ or by setting the ~path~ property of
~org-html-mathjax-options~.
** New features
*** New behaviour for `org-toggle-latex-fragment'.
The new behaviour is the following:
- With a double prefix argument or with a single prefix argument
when point is before the first headline, toggle overlays in the
whole buffer;
- With a single prefix argument, toggle overlays in the current
subtree;
- On latex code, toggle overlay at point;
- Otherwise, toggle overlays in the current section.
*** Additional markup with =#+INCLUDE= keyword
The content of the included file can now be optionally marked up, for
instance as HTML. See the documentation for details.

View File

@ -18748,77 +18748,119 @@ looks only before point, not after."
"List of overlays carrying the images of latex fragments.")
(make-variable-buffer-local 'org-latex-fragment-image-overlays)
(defun org-remove-latex-fragment-image-overlays ()
"Remove all overlays with LaTeX fragment images in current buffer."
(mapc 'delete-overlay org-latex-fragment-image-overlays)
(setq org-latex-fragment-image-overlays nil))
(defun org-remove-latex-fragment-image-overlays (&optional beg end)
"Remove all overlays with LaTeX fragment images in current buffer.
When optional arguments BEG and END are non-nil, remove all
overlays between them instead. Return t when some overlays were
removed, nil otherwise."
(let (removedp)
(setq org-latex-fragment-image-overlays
(let ((beg (or beg (point-min)))
(end (or end (point-max))))
(org-remove-if
(lambda (o)
(and (>= (overlay-start o) beg)
(<= (overlay-end o) end)
(progn (delete-overlay o)
(or removedp (setq removedp t)))))
org-latex-fragment-image-overlays)))
removedp))
(define-obsolete-function-alias
'org-preview-latex-fragment 'org-toggle-latex-fragment "24.4")
(defun org-toggle-latex-fragment (&optional subtree)
(defun org-toggle-latex-fragment (&optional arg)
"Preview the LaTeX fragment at point, or all locally or globally.
If the cursor is in a LaTeX fragment, create the image and overlay
it over the source code. If there is no fragment at point, display
all fragments in the current text, from one headline to the next. With
prefix SUBTREE, display all fragments in the current subtree. With a
double prefix arg \\[universal-argument] \\[universal-argument], or when \
the cursor is before the first headline,
display all fragments in the buffer.
The images can be removed again with \\[org-toggle-latex-fragment]."
If the cursor is on a LaTeX fragment, create the image and overlay
it over the source code, if there is none. Remove it otherwise.
If there is no fragment at point, display all fragments in the
current section.
With prefix ARG, preview or clear image for all fragments in the
current subtree or in the whole buffer when used before the first
headline. With a double prefix ARG \\[universal-argument] \
\\[universal-argument] preview or clear images
for all fragments in the buffer."
(interactive "P")
(unless (buffer-file-name (buffer-base-buffer))
(user-error "Can't preview LaTeX fragment in a non-file buffer"))
(if org-latex-fragment-image-overlays
(progn (org-remove-latex-fragment-image-overlays)
(message "LaTeX fragments images removed"))
(when (display-graphic-p)
(org-remove-latex-fragment-image-overlays)
(org-with-wide-buffer
(let (beg end msg)
(cond
((equal subtree '(16))
(setq beg (point-min) end (point-max)
msg "Creating images for buffer...%s"))
((equal subtree '(4))
(org-back-to-heading)
(setq beg (point) end (org-end-of-subtree t)
msg "Creating images for subtree...%s"))
((let ((context (org-element-context)))
(when (memq (org-element-type context)
'(latex-environment latex-fragment))
(setq beg (org-element-property :begin context)
end (org-element-property :end context)
msg "Creating image...%s"))))
((org-before-first-heading-p)
(setq beg (point-min) end (point-max)
msg "Creating images for buffer...%s"))
(t
(org-back-to-heading)
(setq beg (point) end (progn (outline-next-heading) (point))
msg "Creating images for entry...%s")))
(message msg "")
(narrow-to-region beg end)
(goto-char beg)
(org-format-latex
(concat org-latex-preview-ltxpng-directory
(file-name-sans-extension
(file-name-nondirectory
(buffer-file-name (buffer-base-buffer)))))
default-directory 'overlays msg 'forbuffer
org-latex-create-formula-image-program)
(message msg "done. Use `C-c C-x C-l' to remove images."))))))
(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")
(throw 'exit nil))
(setq msg "Creating images for section...")
(narrow-to-region beg end))))))
(org-format-latex
(concat org-latex-preview-ltxpng-directory
(file-name-sans-extension
(file-name-nondirectory
(buffer-file-name (buffer-base-buffer)))))
default-directory 'overlays msg 'forbuffer
org-latex-create-formula-image-program))
;; Work around a bug that doesn't restore window's start
;; when widening back the buffer.
(set-window-start nil window-start)
(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.
When optional argument OVERLAYS is non-nil, display the image on
top of the fragment instead of replacing it.
PROCESSING-TYPE is the conversion method to use, as a symbol.
Some of the options can be changed using the variable
`org-format-latex-options'."
`org-format-latex-options', which see."
(when (and overlays (fboundp 'clear-image-cache)) (clear-image-cache))
(unless (eq processing-type 'verbatim)
(let* ((math-regexp "\\$\\|\\\\[([]\\|^[ \t]*\\\\begin{[A-Za-z0-9*]+}")
(cnt 0)
checkdir-flag)
(goto-char (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)
(unless (and overlays
(eq (get-char-property (point) 'org-overlay-type)
@ -18893,6 +18935,7 @@ Some of the options can be changed using the variable
(overlay-put ov
'org-overlay-type
'org-latex-overlay)
(overlay-put ov 'evaporate t)
(if (featurep 'xemacs)
(progn
(overlay-put ov 'invisible t)