最近从 Prime Day 解放,我终于又有时间捣鼓我的 Orgmode 了。其实缘起是同事给我看了他直接用 vscode ssh 到 cloud desktop 上写码运行 debug 的流程,让我很是心动。但是作为一个 Emacs 资深病患,我的第一反应是能不能用 Emacs 实现这套流程。不过我一直没怎么搞明白如何不卡顿地使用 Tramp,Emacs 在运行 Jupyter Notebook 上也需要更多的设置,就此作罢。

不过既然起了这个钻研 Orgmode 的头,我不经又想起了几个让我很纠结的问题。

Latex 公式

首先是 Latex 的显示。Orgmode 中,可以使用几种方式显示 latex 公式,分别是

1
2
3
4
5
6
7
#+name: eq:a
\begin{equation}
x=\sqrt{b}
\end{equation}

If $a^2=b$ and \( b=2 \), then the solution must be
either $$ a=+\sqrt{2} $$ or \[ a=-\sqrt{2} \].

效果如下:

If and , then the solution must be either or .

而要切换公式显示,则需要 C-c C-x C-l 。我并不擅长记这些快捷键,所以经常想预览的时候就忘记了。Kitchin 曾给出一个采用鼠标切换的方案,但是年久失修,已经不能用了。今天搜了一下,已经有 org-fragtog 可以完成鼠标切换了。

解决了切换的问题,下一个则是自动编号的问题。Kitchin 曾给出一个方案,但是同样年久失修。Youtube 上有人秀出了他的自动编号方案,然而没有代码,也就相当于没有。唯一可行的方案是在 Stackoverflow 上利用 tag 的,略有些复杂。首先定义一个 function:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
(Defun update-eqn-numbers-in-section ()
  (interactive)
  (let ((beg (if (org-before-first-heading-p) (point-min)
           (save-excursion
         (org-with-limited-levels (org-back-to-heading t) (point)))))
    (end (org-with-limited-levels (org-entry-end-position)))
        (count 1))
    (save-excursion
      (goto-char beg)
      (while (re-search-forward "\\tag{\\([0-9]+\\)}" end t)
        (replace-match (format "%d" count) nil nil nil 1)
        (setq count (1+ count))))))

然后给公式加上 tag。

1
2
3
\begin{equation}
x=\sqrt{b}\tag{1}
\end{equation}

然后运行这个 function 就可以自动编号了。

效果如下:

Latex 公式在 retina 屏幕下会非常的糊,一是因为它会先转换成图片格式再显示,也是因为 Emacs 在 Mac 上有 known blurry issueStackoverflow 中有几种解决方案,有说将 org-preview-latex-default-process 从 dvipng 换成 dvisvgm 的,有生成 2 倍的图片再缩放显示的。我操作下来感觉还是 emacs-plus 的问题,用 emacs-mac build 了之后就非常清晰了,但是随之而来的就是 Emacs 肉眼可见变得卡顿了,关掉 flycheck 后会一点帮助,但还是比 emacs-plus 卡一点。可能我要体验一段时间才知道这是不是我可以忍受的范围。

优化显示效果的 minor mode 总结

  • org-indent: 自动给各级标题缩排
  • org-num: 自动给各级标题编号
  • org-bars (git): 在 org-indent 的基础上给 org-mode 增加树状线和标题展开收缩状态标。不过这和我的标签对齐设置有一点冲突,我个人觉得 org-indent 已经够用了。
  • org-fragtog (git): 可以用鼠标来切换 Latex 公式显示与否。
  • Valign (git): 可以对齐不等宽字符和中英文,而且加上 valign-fancy-bar 后表格也会更好看。
    1
    2
    3
    4
    5
    6
    
    (require-package 'valign)
    (use-package valign
      :config
      (setq valign-fancy-bar t)
      (add-hook 'org-mode-hook #'valign-mode)
      )
    

其他优化

样式:orgmode 默认不会将带引号的词渲染成代码或等字样式,所以需要对 org-emphasis-regexp-components 这个 list 进行魔改。这个 list 由渲染字段前后允许字符,禁止的边界字符,允许渲染的字符以及允许渲染的行数组成,而我的设置如下:

1
2
3
(setcar (nthcdr 2 org-emphasis-regexp-components) " \t\r\n,\"")
(setcar (nthcdr 4 org-emphasis-regexp-components) 1)
(org-set-emph-re 'org-emphasis-regexp-components org-emphasis-regexp-components)

代码框:我一般使用以下设置来使代码框中的代码自动排版:

1
2
3
4
5
6
7
(setq org-src-fontify-natively t
      org-src-tab-acts-natively t
      org-src-preserve-indentation nil
      org-hide-block-startup t
      org-confirm-babel-evaluate nil
      org-edit-src-content-indentation 0
      org-hide-leading-stars nil)

中英文自动空格:

1
2
3
4
5
6
(require-package 'pangu-spacing)
(use-package pangu-spacing
  :config
  (global-pangu-spacing-mode 1)
  (setq pangu-spacing-real-insert-separtor t)
  )

显示标题收缩状态

1
(setq org-ellipsis "›")