(分享)为 org 公式实现“富文本”的上下标显示而不隐藏 {}, _ 和 ^

实现类似 tex 的上下标

默认的实现会隐藏 {}, _, ^ 编辑起来很不舒服

(defconst org-match-substring-regexp
    (concat
     "\\(\\S-\\)\\([_^]\\)\\("
     "\\(?:" (org-create-multibrace-regexp "{" "}" org-match-sexp-depth) "\\)"
     "\\|"
     "\\(?:" (org-create-multibrace-regexp "(" ")" org-match-sexp-depth) "\\)"
     "\\|"
     "\\(?:.\\)"
     "\\|"
     "\\(?:\\\\[[:alnum:].,\\]*[[:alnum:]]\\)"
     "\\)")
    "The regular expression matching a sub- or superscript.")

(defun +org-raise-scripts (limit)
    "Add raise properties to sub/superscripts."
    (when (and org-pretty-entities org-pretty-entities-include-sub-superscripts
               (re-search-forward org-match-substring-regexp limit t))
      (let* ((pos (point)) table-p comment-p
             (mpos (match-beginning 3))
             (emph-p (get-text-property mpos 'org-emphasis))
             (link-p (get-text-property mpos 'mouse-face))
             (keyw-p (eq 'org-special-keyword (get-text-property mpos 'face)))
             (tex-p (eq 'org-latex-and-related (get-text-property mpos 'face))))
        (goto-char (line-beginning-position))
        (setq table-p (looking-at-p org-table-dataline-regexp)
              comment-p (looking-at-p "^[ \t]*#[ +]"))
        (goto-char pos)
        ;; Handle a_b^c
        (when (member (char-after) '(?_ ?^)) (goto-char (1- pos)))
        (if (not (or comment-p emph-p link-p keyw-p))
          (put-text-property (match-beginning 3) (match-end 0)
                             'display
                             (if (equal (char-after (match-beginning 2)) ?^)
                                 (nth (if table-p 3 1) org-script-display)
                               (nth (if table-p 2 0) org-script-display)))
          (put-text-property (match-beginning 2) (match-end 3) 'org-emphasis t))
        t)))

(advice-add #'org-raise-scripts :override #'+org-raise-scripts)

缺点:暂时没法做到只处理公式,但是不影响导出

image


另一种方法:

  (add-hook! 'org-mode-hook
    (defun +org-enable-sub-superscript ()
      (require 'tex-mode)
      (font-lock-add-keywords nil tex-font-lock-keywords-3)))

我觉得有点脏,所以自己实现了一下

1 个赞

其实用 org-appear 就可以了,它可以自动展开。

具体效果:

Peek 2023-11-22 21-04

2 个赞

很好用的包!唯一的小问题就是这个和 tex 的行为还是微小的差距,比如 A_12 这样不能很好渲染成 A_{1}2

因为我平常主要是写公式的时候用到,还是希望和 tex 的行为同步起来,方便发现错误

我一般都是结合 org-cdlatex-modecdlatex-mode 用, _^ 会自动加括号,这样就不会有混淆的情况了。

1 个赞

org-appear 会把整个latex块都给appear了,如果公式太长的话,会比较费眼睛👁

我倾向开着 org-pretty-entities 同时把 org-apear-inside-latex 给 nil 了,然后用roife的方案。

我发现这样相对而言舒服一些

我的理解是把 org-appear-autoentities 关了不就是一样的效果?

好像是这么一回事,哈哈😄