新插件:Org-mode LaTeX 即时预览

重度LaTeX用户,也用Org-mode做数学笔记。一直希望里面的LaTeX能实时预览。 fuxialexanderwebkit-katex-render基于xwidget实现了这个功能,但是遗憾的是,很多发行版上的Emacs都没有xwidget支持。因此我用MathJax导出到SVG的功能实现了即时预览。优点是不再依赖需要编译支持的xwidget,但需要安装mathjax-node-cli

21 个赞

好耶!昨天才说, 今天就有了w

紫薯布丁

所以你们一般用 org 写 latex 是不会全部预览吗?就是直接不显示代码而是图片,我一般就直接全部图片了,需要编辑的用 org-edit-special 编辑。而且感觉没写完就一直显示预览意义也不大的样子 :face_with_monocle:

如果LaTeX片段不长,我一般直接打。但如果比较长,比如五六行的连等,能有即时反馈会很爽,可以边想边写。记笔记的时候尤其是这样。另外,即时预览也能更好地避免一些小typo。

repo里面的录屏,用什么能把操作也显示出来的?

也是,等有空了试试看

那是screenkey

screenkey

加上异步了,也加上了自动关闭posframe的功能。

你好,安装上出个问题,请教下,谢谢。 Debugger entered–Lisp error: (error “Package ‘org-latex-instant-preview-’ is unavailable”) signal(error (“Package ‘org-latex-instant-preview-’ is unavailable”)) error(“Package `%s-%s’ is unavailable” org-latex-instant-preview “”) package-compute-transaction(nil ((org-latex-instant-preview))) package-install(org-latex-instant-preview) use-package-ensure-elpa(org-latex-instant-preview (t) nil) (progn (use-package-ensure-elpa (quote org-latex-instant-preview) (quote (t)) (quote nil)) (setq org-latex-instant-preview-tex2svg-bin “~/node_modules/mathjax-node-cli/bin/tex2svg”)) eval((progn (use-package-ensure-elpa (quote org-latex-instant-preview) (quote (t)) (quote nil)) (setq org-latex-instant-preview-tex2svg-bin “~/node_modules/mathjax-node-cli/bin/tex2svg”)) nil) elisp–eval-last-sexp(nil) eval-last-sexp(nil) funcall-interactively(eval-last-sexp nil) call-interactively(eval-last-sexp nil nil) command-execute(eval-last-sexp)

麻烦给一下你安装的代码?我暂时还没有放到melpa上,所以package.el肯定是找不到的。如果你需要安装的话可以选择

  • 直接把代码存到本地,或
  • 使用quelpa,或
  • 使用straight

用起来了,不错啊。要是能够别等停下了才显示就好了。

停下来才显示是刻意这么设计的:从编译到显示需要时间。如果你光标到处动就立即编译的话,会导致每运行一个command之后,都会跑一次编译。等异步编译出结果的时候,你的光标很可能已经不在原来的地方了,于是需要重新编译。这样的反复编译容易浪费系统资源,造成Emacs卡顿,引发race condition。因此现在的设计是:Emacs空闲一段时间之后,会检测光标下是否存在LaTeX fragment,如果存在,判断它跟上次编译的是否一致。如果不一致就重新编译,然后视情况刷新preview的位置。要想几乎实时显示,我能想到的一个办法是做一个cache,里面放各种编译好的SVG,根据光标的位置进行调整。但是这个会比较复杂,我需要考虑一下怎么实现。或者你觉得你希望是怎样的更新逻辑?

如果你希望等待的时间短一些,可以把org-latex-instant-preview-delay改小一点。

改小之后体验有改善,不过还是不够完美。我现在也没想到更好的更新逻辑。类似 MathJax那种在网页上的实时预览应该才是理想状态。以目前emacs的条件不太容易实现。

另外,刚才发现一个小问题,重启Emacs之后预览的svg就不再更新了,一直显示同一个图片。

(use-package org-latex-instant-preview
  :defer t
  :hook (org-mode . org-latex-instant-preview-mode)
  :init
  (setq org-latex-instant-preview-tex2svg-bin
        ;; location of tex2svg executable
        "~/node_modules/mathjax-node-cli/bin/tex2svg"))

那我明白了,谢谢

赞,我去试试

我发现这插件无法预览BEGIN_EXPORT latex里的东西,因为我喜欢用org-edit-latex,这插件会生成一对BEGIN_EXPORT latex (太久没写latex彻底记错了,不是这个插件的功能)

你是指 C-c ’ 进入编辑时由于生成了 BEGIN_SRC latex 没法实时预览?

不是进入临时编辑buffer,临时buffer又不是org-mode (当然如果这个插件extend到latex-mode那就更好了)

在org文件,光标移动到BEGIN_EXPORT里的latex内容无法预览

那你不需要加 begin_scr 呀,直接 \begin{equation},你看那个 readme 里面的 snippets 也是这样的,C-c ’ 的时候 org-edit-latex 会自动补上 begin_src

等下:我去年写作业👆🏻️那样都可以的,刚刚试了试突然不行了_(:з」∠)_