Make use of the new org-latex-preview
This commit is contained in:
parent
0cd49e0c6e
commit
8f0a7f6a61
172
config.org
172
config.org
|
@ -9615,20 +9615,16 @@ passed, and so we can override the background as discussed above.
|
||||||
(add-to-list 'org-src-block-faces '("latex" (:inherit default :extend t)))
|
(add-to-list 'org-src-block-faces '("latex" (:inherit default :extend t)))
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
***** More eager rendering
|
***** Automatic previewing
|
||||||
|
|
||||||
#+call: confpkg("!Pkg org-fragtog")
|
It would be nice if fragments could automatically be previewed after being
|
||||||
|
typed, and the overlays automatically showed and hidden when moving the point in
|
||||||
|
and out of the LaTeX fragments.
|
||||||
|
|
||||||
What's better than syntax-highlighted LaTeX is /rendered/ LaTeX though, and we can
|
Thankfully, all we need to do to make this happen is use ~org-latex-preview-auto-mode~.
|
||||||
have this be performed automatically with =org-fragtog=.
|
|
||||||
|
|
||||||
#+begin_src emacs-lisp :tangle packages.el
|
|
||||||
(package! org-fragtog :pin "c675563af3f9ab5558cfd5ea460e2a07477b0cfd")
|
|
||||||
#+end_src
|
|
||||||
|
|
||||||
#+begin_src emacs-lisp
|
#+begin_src emacs-lisp
|
||||||
(use-package! org-fragtog
|
(add-hook 'org-mode-hook #'org-latex-preview-auto-mode)
|
||||||
:hook (org-mode . org-fragtog-mode))
|
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
***** Prettier rendering
|
***** Prettier rendering
|
||||||
|
@ -9645,20 +9641,6 @@ templates to be filled in by ~org-latex-default-packages-alist~ and
|
||||||
\documentclass{article}
|
\documentclass{article}
|
||||||
[DEFAULT-PACKAGES]
|
[DEFAULT-PACKAGES]
|
||||||
[PACKAGES]
|
[PACKAGES]
|
||||||
\pagestyle{empty} % do not remove
|
|
||||||
% The settings below are copied from fullpage.sty
|
|
||||||
\setlength{\textwidth}{\paperwidth}
|
|
||||||
\addtolength{\textwidth}{-3cm}
|
|
||||||
\setlength{\oddsidemargin}{1.5cm}
|
|
||||||
\addtolength{\oddsidemargin}{-2.54cm}
|
|
||||||
\setlength{\evensidemargin}{\oddsidemargin}
|
|
||||||
\setlength{\textheight}{\paperheight}
|
|
||||||
\addtolength{\textheight}{-\headheight}
|
|
||||||
\addtolength{\textheight}{-\headsep}
|
|
||||||
\addtolength{\textheight}{-\footskip}
|
|
||||||
\addtolength{\textheight}{-3cm}
|
|
||||||
\setlength{\topmargin}{1.5cm}
|
|
||||||
\addtolength{\topmargin}{-2.54cm}
|
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
To this, we make two additions:
|
To this, we make two additions:
|
||||||
|
@ -9675,25 +9657,25 @@ To this, we make two additions:
|
||||||
|
|
||||||
Since we can, instead of making the background colour match the =default= face,
|
Since we can, instead of making the background colour match the =default= face,
|
||||||
let's make it transparent.
|
let's make it transparent.
|
||||||
|
|
||||||
#+begin_src emacs-lisp
|
#+begin_src emacs-lisp
|
||||||
(setq org-format-latex-options
|
(plist-put org-format-latex-options :background "Transparent")
|
||||||
(plist-put org-format-latex-options :background "Transparent"))
|
(plist-put org-format-latex-options :zoom 0.93) ; Calibrated based on the TeX font and org-buffer font.
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
With the background taken care of, we just need to make sure we're using the
|
With the background taken care of, we just need to make sure we're using the
|
||||||
theme-appropriate foreground.
|
theme-appropriate foreground.
|
||||||
|
|
||||||
# TODO check that this is still needed.
|
|
||||||
|
|
||||||
#+begin_src emacs-lisp
|
#+begin_src emacs-lisp
|
||||||
(add-hook! 'doom-load-theme-hook
|
(defun +org-refresh-latex-images-previews-h ()
|
||||||
(setq org-preview-latex-image-directory
|
|
||||||
(concat doom-cache-dir "org-latex/" (symbol-name doom-theme) "/"))
|
|
||||||
(dolist (buffer (doom-buffers-in-mode 'org-mode (buffer-list)))
|
(dolist (buffer (doom-buffers-in-mode 'org-mode (buffer-list)))
|
||||||
(with-current-buffer buffer
|
(with-current-buffer buffer
|
||||||
(+org--toggle-inline-images-in-subtree (point-min) (point-max) 'refresh)
|
(+org--toggle-inline-images-in-subtree (point-min) (point-max) 'refresh)
|
||||||
(org-clear-latex-preview (point-min) (point-max))
|
(unless (eq org-latex-preview-default-process 'dvisvgm)
|
||||||
(org--latex-preview-region (point-min) (point-max)))))
|
(org-clear-latex-preview (point-min) (point-max))
|
||||||
|
(org--latex-preview-region (point-min) (point-max))))))
|
||||||
|
|
||||||
|
(add-hook 'doom-load-theme-hook #'+org-refresh-latex-images-previews-h)
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
***** Rendering speed tests
|
***** Rendering speed tests
|
||||||
|
@ -9705,9 +9687,7 @@ We can either render from a ~dvi~ or ~pdf~ file, so let's benchmark ~latex~ and
|
||||||
| 135 \pm 2 ms | 215 \pm 3 ms |
|
| 135 \pm 2 ms | 215 \pm 3 ms |
|
||||||
|
|
||||||
On the rendering side, there are two ~.dvi~-to-image converters which I am
|
On the rendering side, there are two ~.dvi~-to-image converters which I am
|
||||||
interested in: ~dvipng~ and ~dvisvgm~. Then with the a ~.pdf~ we have ~pdf2svg~.
|
interested in: ~dvipng~ and ~dvisvgm~.
|
||||||
For inline preview we care about speed, while for exporting we care about file
|
|
||||||
size and prefer a vector graphic.
|
|
||||||
|
|
||||||
Using the above latex expression and benchmarking lead to the following results:
|
Using the above latex expression and benchmarking lead to the following results:
|
||||||
| ~dvipng~ time | ~dvisvgm~ time | ~pdf2svg~ time |
|
| ~dvipng~ time | ~dvisvgm~ time | ~pdf2svg~ time |
|
||||||
|
@ -9715,7 +9695,7 @@ Using the above latex expression and benchmarking lead to the following results:
|
||||||
| 89 \pm 2 ms | 178 \pm 2 ms | 12 \pm 2 ms |
|
| 89 \pm 2 ms | 178 \pm 2 ms | 12 \pm 2 ms |
|
||||||
|
|
||||||
Now let's combine this to see what's best
|
Now let's combine this to see what's best
|
||||||
| Tool chain | Total time | Resultant file size |
|
| Tool chain | Total time | Resulting file size |
|
||||||
|--------------------+------------+---------------------|
|
|--------------------+------------+---------------------|
|
||||||
| ~latex~ + ~dvipng~ | 226 \pm 2 ms | 7 KiB |
|
| ~latex~ + ~dvipng~ | 226 \pm 2 ms | 7 KiB |
|
||||||
| ~latex~ + ~dvisvgm~ | 392 \pm 4 ms | 8 KiB |
|
| ~latex~ + ~dvisvgm~ | 392 \pm 4 ms | 8 KiB |
|
||||||
|
@ -9727,122 +9707,6 @@ So, let's use ~dvipng~ for previewing LaTeX fragments in-Emacs, but ~dvisvgm~ fo
|
||||||
Unfortunately, it seems that SVG sizing is annoying ATM, so let's actually not do this right now.
|
Unfortunately, it seems that SVG sizing is annoying ATM, so let's actually not do this right now.
|
||||||
#+end_warning
|
#+end_warning
|
||||||
|
|
||||||
**** Stolen from [[https://github.com/jkitchin/scimax][scimax]] (semi-working right now)
|
|
||||||
|
|
||||||
I want fragment justification
|
|
||||||
#+begin_src emacs-lisp
|
|
||||||
(defun scimax-org-latex-fragment-justify (justification)
|
|
||||||
"Justify the latex fragment at point with JUSTIFICATION.
|
|
||||||
JUSTIFICATION is a symbol for 'left, 'center or 'right."
|
|
||||||
(interactive
|
|
||||||
(list (intern-soft
|
|
||||||
(completing-read "Justification (left): " '(left center right)
|
|
||||||
nil t nil nil 'left))))
|
|
||||||
(let* ((ov (ov-at))
|
|
||||||
(beg (ov-beg ov))
|
|
||||||
(end (ov-end ov))
|
|
||||||
(shift (- beg (line-beginning-position)))
|
|
||||||
(img (overlay-get ov 'display))
|
|
||||||
(img (and (and img (consp img) (eq (car img) 'image)
|
|
||||||
(image-type-available-p (plist-get (cdr img) :type)))
|
|
||||||
img))
|
|
||||||
space-left offset)
|
|
||||||
(when (and img
|
|
||||||
;; This means the equation is at the start of the line
|
|
||||||
(= beg (line-beginning-position))
|
|
||||||
(or
|
|
||||||
(string= "" (s-trim (buffer-substring end (line-end-position))))
|
|
||||||
(eq 'latex-environment (car (org-element-context)))))
|
|
||||||
(setq space-left (- (window-max-chars-per-line) (car (image-size img)))
|
|
||||||
offset (floor (cond
|
|
||||||
((eq justification 'center)
|
|
||||||
(- (/ space-left 2) shift))
|
|
||||||
((eq justification 'right)
|
|
||||||
(- space-left shift))
|
|
||||||
(t
|
|
||||||
0))))
|
|
||||||
(when (>= offset 0)
|
|
||||||
(overlay-put ov 'before-string (make-string offset ?\ ))))))
|
|
||||||
|
|
||||||
(defun scimax-org-latex-fragment-justify-advice (beg end image imagetype)
|
|
||||||
"After advice function to justify fragments."
|
|
||||||
(scimax-org-latex-fragment-justify (or (plist-get org-format-latex-options :justify) 'left)))
|
|
||||||
|
|
||||||
|
|
||||||
(defun scimax-toggle-latex-fragment-justification ()
|
|
||||||
"Toggle if LaTeX fragment justification options can be used."
|
|
||||||
(interactive)
|
|
||||||
(if (not (get 'scimax-org-latex-fragment-justify-advice 'enabled))
|
|
||||||
(progn
|
|
||||||
(advice-add 'org--format-latex-make-overlay :after 'scimax-org-latex-fragment-justify-advice)
|
|
||||||
(put 'scimax-org-latex-fragment-justify-advice 'enabled t)
|
|
||||||
(message "Latex fragment justification enabled"))
|
|
||||||
(advice-remove 'org--format-latex-make-overlay 'scimax-org-latex-fragment-justify-advice)
|
|
||||||
(put 'scimax-org-latex-fragment-justify-advice 'enabled nil)
|
|
||||||
(message "Latex fragment justification disabled")))
|
|
||||||
#+end_src
|
|
||||||
There's also this lovely equation numbering stuff I'll nick
|
|
||||||
#+begin_src emacs-lisp
|
|
||||||
;; Numbered equations all have (1) as the number for fragments with vanilla
|
|
||||||
;; org-mode. This code injects the correct numbers into the previews so they
|
|
||||||
;; look good.
|
|
||||||
(defun scimax-org-renumber-environment (orig-func &rest args)
|
|
||||||
"A function to inject numbers in LaTeX fragment previews."
|
|
||||||
(let ((results '())
|
|
||||||
(counter -1)
|
|
||||||
(numberp))
|
|
||||||
(setq results (cl-loop for (begin . env) in
|
|
||||||
(org-element-map (org-element-parse-buffer) 'latex-environment
|
|
||||||
(lambda (env)
|
|
||||||
(cons
|
|
||||||
(org-element-property :begin env)
|
|
||||||
(org-element-property :value env))))
|
|
||||||
collect
|
|
||||||
(cond
|
|
||||||
((and (string-match "\\\\begin{equation}" env)
|
|
||||||
(not (string-match "\\\\tag{" env)))
|
|
||||||
(cl-incf counter)
|
|
||||||
(cons begin counter))
|
|
||||||
((string-match "\\\\begin{align}" env)
|
|
||||||
(prog2
|
|
||||||
(cl-incf counter)
|
|
||||||
(cons begin counter)
|
|
||||||
(with-temp-buffer
|
|
||||||
(insert env)
|
|
||||||
(goto-char (point-min))
|
|
||||||
;; \\ is used for a new line. Each one leads to a number
|
|
||||||
(cl-incf counter (count-matches "\\\\$"))
|
|
||||||
;; unless there are nonumbers.
|
|
||||||
(goto-char (point-min))
|
|
||||||
(cl-decf counter (count-matches "\\nonumber")))))
|
|
||||||
(t
|
|
||||||
(cons begin nil)))))
|
|
||||||
|
|
||||||
(when (setq numberp (cdr (assoc (point) results)))
|
|
||||||
(setf (car args)
|
|
||||||
(concat
|
|
||||||
(format "\\setcounter{equation}{%s}\n" numberp)
|
|
||||||
(car args)))))
|
|
||||||
|
|
||||||
(apply orig-func args))
|
|
||||||
|
|
||||||
|
|
||||||
(defun scimax-toggle-latex-equation-numbering ()
|
|
||||||
"Toggle whether LaTeX fragments are numbered."
|
|
||||||
(interactive)
|
|
||||||
(if (not (get 'scimax-org-renumber-environment 'enabled))
|
|
||||||
(progn
|
|
||||||
(advice-add 'org-create-formula-image :around #'scimax-org-renumber-environment)
|
|
||||||
(put 'scimax-org-renumber-environment 'enabled t)
|
|
||||||
(message "Latex numbering enabled"))
|
|
||||||
(advice-remove 'org-create-formula-image #'scimax-org-renumber-environment)
|
|
||||||
(put 'scimax-org-renumber-environment 'enabled nil)
|
|
||||||
(message "Latex numbering disabled.")))
|
|
||||||
|
|
||||||
(advice-add 'org-create-formula-image :around #'scimax-org-renumber-environment)
|
|
||||||
(put 'scimax-org-renumber-environment 'enabled t)
|
|
||||||
#+end_src
|
|
||||||
|
|
||||||
**** Org Plot
|
**** Org Plot
|
||||||
|
|
||||||
We can use some of the variables in =org-plot= to use the current doom theme
|
We can use some of the variables in =org-plot= to use the current doom theme
|
||||||
|
@ -11301,7 +11165,7 @@ There are also some obsolete entries in the default value, specifically
|
||||||
(setq org-latex-default-packages-alist
|
(setq org-latex-default-packages-alist
|
||||||
'(("AUTO" "inputenc" t ("pdflatex"))
|
'(("AUTO" "inputenc" t ("pdflatex"))
|
||||||
("T1" "fontenc" t ("pdflatex"))
|
("T1" "fontenc" t ("pdflatex"))
|
||||||
("" "xcolor" nil) ; Generally useful
|
("" "xcolor" t) ; Generally useful
|
||||||
("" "hyperref" nil)))
|
("" "hyperref" nil)))
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue