用 xwidget-webkit 得到更加 WYSIWYG 的 latex 实时预览

TL;DR: mathjax 的优秀速度让“在预览中看到光标位置”的想法变得可行

因为在 org-mode 编辑 LaTeX 是我几乎天天都会做的事情,所以我对这方面能够提升效率或者减轻心智负担的技巧一直比较感兴趣。

目前来说即将实装于 org 9.7 的 latex-preview 使用体验上已经令我很满意了(见这个帖子中的介绍)。

之前 karthink 写了和 org-latex-preview 一样基于 TeX engine 和 dvisvgm 的 live preview,即编辑 latex-fragment 过程中能在后面的 overlay 中看到预览用的 svg。不过相比较 vscode/obsidian 等软件中基于 mathjax 的方案,这种方法的预览速度有明显的弱势。这当然可以理解:org-latex-preview 能处理的是一般情形,即每个 fragment 都是和 latex-header 一起编译出来的,而 mathjax 只实现了数目有限的 commands。有限的功能性换来的是几乎和输入同步的预览,且 mathjax 支持的指令在不少情形中也够用了,这也是为什么 Emacs 社区之前就有不少基于 mathjax 的预览 package (比如 webkit-katex-rendermath-preview, popweb-latex)的原因吧。

这两天试用了来自 @ksqsf 新鲜出炉的 org-xlatex,这个 package 采用了 xwidget-webkitmathjax,并且没有 posframe 依赖,非常的精简:

This package provides instant latex preview for org buffers using xwidget and mathjax.

我一开始在 i3wm 中遇到了一些问题(后来 @ksqsf 快速修复了),就看了看能不能通过大量 M-w C-y 糊出一份自己能用的版本。

  • 我个人不是太喜欢会弹出来一直改变位置的窗口,平时在 org-mode 也是不开 company 或者 corfu 的,所以干脆在一个比较小的 vertical split 中显示了。
  • 之前在 discord org 9.7 latex-preview 的讨论中,tecosaur 提出在 live-preview 过程中用某些字符标记位置。我觉得现在就可以拿 mathjax 试一试嘛!想法很简单,就是在光标处插入一个红色的|,在 mathjax 中就是 {\color{red}{|}}.

上效果:

wplb-2023-07-03_01.07.34

撇去糟糕的画质,我们可以看到,在连续的 forward-word 下预览的反应速度还是很快的。不少位置(主要是在 command 中间)在插入 {\color{red}{|}} 后会使得 latex fragment 语法出错。但实际在敲长公式的时候我意外的感觉还行,因为习惯上一个 command 输入结束后才会才会留意预览是不是正确。

再来一个即时编辑的 inline formula:

wplb2-2023-07-03_01.21.06

只看上面的 buffer 甚至有一种在用 TeXmacs 的感觉 :slight_smile:

最后感谢 @ksqsf 和 tecosaur 给我这次尝试提供了灵感,也欢迎大家在这里讨论关于 latex 实时预览的技巧和想法!

EDIT 2023-07-03 01:39:修改语法。

18 个赞

请问一下,这个红色是怎么实现的,{\color{red}{|}} 是加在源 tex 代码中吗

恩是的 紫薯布丁

已经更新了 add org-xlatex-position-indicator · ksqsf/org-xlatex@0956919 · GitHub

1 个赞

Error running timer ‘org-xlatex–timer-function’: (void-function pixel-line-height) [4 times] 更新版本后出现了新问题了,咱办啊,spacemacs

试试

(require 'pixel-scroll)

可以去提个 issue

好像可以了,很厉害啊。但是那个光标功能还是没出现。

(setq org-xlatex-position-indicator t)
1 个赞

可以了,多谢哈,我去写个RP,把你这个写上去

呜呜呜,为什么不来参与texmacs或者mogan editor的开发呢?

我很喜欢 TeXmacs, 以前也高强度使用过。主要吸引我的特点有

  • 真正的 WYSIWYG
  • 非常高的公式输入效率
  • 画图很好使

不过也有一些因素让我更倾向于 org-mode + LaTeX

  • TeXmacs 在 search/replace 等方面的编辑效率还是远远不如 emacs
  • 我不知道 TeXmacs 怎么实现类似 emacs eval-expression 和 M-x 的操作(还是 Emacs 用习惯了)
  • 碍于对 c++, scheme 都不熟悉,我除了改键位就没怎么定制过 TeXmacs,所以也不了解 TeXmacs 的实现。
  • 促使我从 TeXmacs 回到 org-mode 的主要原因还是对交换图的支持吧。如果我没弄错的话,TeXmacs 里面插入交换图只能调用 latex engine,把得到的 pdf(?) 插入到 TeXmacs 文档里面,所以交换图的大小和字体是不能和 TeXmacs 文档同步的。而数学系一节课或者一份作业经常要画十几张交换图,所以继续用 TeXmacs 对我来说就不太现实了。
    • 换言之,如果 TeXmacs 能有 native 的交换图支持,我对 TeXmacs 的投入肯定会更多。
1 个赞

texmacs确实可以在数学环境下插入交换图, 但是实质上和它的绘图差不多, 功能可能实在有些少

debian源里的emacs不带xwidget,只能自己编译了吗?

TeXmacs是有原生的交换图的支持的。

而且今年我们参加了OSPP开源之夏,7月到9月就有一个开发者在做绘图工具相关改进。

TeXmacs是有原生的交换图的支持的。

我之前读过 the jolly writer 里面 commutative diagrams 那一节,似乎作者的方法是打开画图里面的 grid 然后手绘,感觉这样的过程还是不容易自动化。请问你说的原生支持是指这个吗?

是的。可以写Scheme自动化的。

我看到今年 TeXmacs forum 上有相关的讨论,但看起来设计和实现都比较有难度。