org-latex-impatient
org-latex-impatient
provides instant preview of LaTeX snippets via MathJax outputed SVG. Unlike webkit-katex-render, this does not need xwidget support. Currently org-mode
and its derived modes, e.g. org-journal, are fully supported. Markdown-mode
support is new, but seems decent as long as you have correct highlight for math fragments. Support for latex-mode
is experimental and under construction (no support for custom \newcommand
yet).
Dependencies
Installation
You can install MathJax-node-cli
via npm
:
npm install mathjax-node-cli
You need to set org-latex-impatient-tex2svg-bin
to the location of the executable tex2svg
.
Usage
(use-package org-latex-impatient
:defer t
:hook (org-mode . org-latex-impatient-mode)
:init
(setq org-latex-impatient-tex2svg-bin
;; location of tex2svg executable
"~/node_modules/mathjax-node-cli/bin/tex2svg"))
Or just enable minor mode org-latex-impatient-mode
manually when it is needed.
Customization
org-latex-impatient-delay
: change the number of seconds to wait before re-compilation after Emacs is idle. Default to be 0.1.org-latex-impatient-tex2svg-bin
: set the location oftex2svg
executable.org-latex-impatient-border-color
: border color.org-latex-impatient-border-width
: border width (an integer), 0 will disable border.org-latex-impatient-scale
: set the scale of the preview. Due to limitations in the way Emacs handles SVG pictures, it is implemented by manipulating SVG directly.org-latex-impatient-posframe-position
: at which point shall the posframe be positioned. Can take two choices,point
at the current point, ortex-end
at the end of the LaTeX snippet. See the next option for detail.org-latex-impatient-posframe-position-handler
: set the posframe position handler. Default value isorg-latex-impatient-poshandler
, which uses end point of current LaTeX fragment for inline math, and centering right below the end point otherwise. You might want to useposframe-poshandler-point-bottom-left-corner
for showing it using the point specified byorg-latex-impatient-posframe-position
, orposframe-poshandler-point-window-center
for a position centering right below the end point. Check the documentation ofposframe-show
for other options.org-latex-impatient-user-latex-definitions
: custom LaTeX definitions used in the preview. Should be a list of strings. Default: ~β(β\newcommand{\ensuremath}[1]{#1}β β\renewcommand{\usepackage}[2][]{}β)~, which handles\ensuremath
correctly forMathJax
. In general, it is recommended to add your custom LaTeX command via the following:#+LATEX_HEADER: \newcommand{\someNewCommand}{Some Definition}
org-latex-impatient-inhibit-envs
: a list of LaTeX environments. If a LaTeX fragment contains one of them, preview will be disabled. This exists to avoid previewing environments unsupported by MathJax, e.g.tikzpicture
.org-latex-impatient-inhibit-commands
: a list of LaTeX commands. If a LaTeX fragment contains one of them, preview will be disabled. This exists to avoid previewing commands unsupported by MathJax, e.g.\tikz
FAQ
TeX parse error: Undefined control sequence
There are many LaTeX commands that are not supported by MathJax, therefore also unsupported by org-latex-impatient-mode
. Mostly, such commands are not important for a preview.
If this is the case, you can ignore it by override its definition with a place holder in org-latex-impatient-user-definitions
. For example, if you are using beamer, you would be calling \setbeamertemplate
in the setup file or header. You will see errors like βTeX parse error: Undefined control sequence \setbeamercolor
β. This is a command that receives two parameters, so you can run
(add-to-list 'org-latex-impatient-user-latex-definitions "\\renewcommand{\\setbeamertemplate}[2]{}" t)
It is recommended to override top level commands for obvious reasons. Repeat this process for every such command.
Since most LaTeX packages are not relevant in math preview, we assume that all package usage are not necessary in producing a preview, and override the \usepackage
call in the header. If this prevents you from using certain commands defined by an external package, add this in the *front* of ~org-latex-impatient-user-latex-definitions~ like the following:
Known Issue
- Some SVG files get cropped slightly more than it should. This happens with
librsvg
2.45 or below. It can also happen on Emacs 28, problem introduced in commit8f42b94f
and fixed inb42481e2
. (bug #44065) - Some report problem of showing scaled SVG on Mac OSX. A workaround is to avoid customization of
org-latex-impatient-scale
. - For
latex-mode
, currently we do not support customizednewcommand
orrenewcommand
. One workaround is to manually add the definitions toorg-latex-impatient-user-latex-definitions
.
Future Plans
- Add support for
latex-mode
. There is experimental support, but it does not support any customized commands. Such a support would require either parsingtex
file, or actually compiling atex
file withlatex/pdflatex/xelatex
. - Use
latex/pdflatex/xelatex
for image generation instead ofmathjax
. Some progress made, but needs refactoring to make things consistent. - Support for scaling in different Emacs versions.
License
This piece work is licensed under GPLv3.