emacs - 在 Emacs Org 模式下突出显示 LaTeX 方程时如何隐藏符号 $?

标签 emacs org-mode

我知道在 Org 模式下,像 *、~、=、+、_ 这样的强调标记可以通过以下设置隐藏:(setq org-hide-emphasis-markers t).

我想知道是否有任何选项可以隐藏 LaTeX 的 $\(, \) 等标记?

当 LaTeX 数学方程可以通过设置突出显示时,这将很有用: (setq org-highlight-latex-and-lated '(latex 脚本实体))


更新1

我在新的emacs -q上尝试了@Thomas提出的解决方案,但不知何故符号$仍然没有隐藏,而其他标记如*, + 是。\

不确定我的 Emacs 是否有问题?我正在使用 Emacs 27.1 的 Org 9.3


更新2

Thomas 的解决方案适用于 Emacs 25.2!

但不知何故,Emacs 26.2、26.3、27.1 中发生了重大变化,破坏了此功能...:(


更新3

由于 Thomas 建议的解决方案不适用于最新的 Emacs(26 或更高版本),我最终通过自定义函数 org-do-latex-and-lated 提出了一个快速解决方案组织模式。

(defun org-do-latex-and-related (_limit)
  "Highlight LaTeX snippets and environments, entities and sub/superscript.
Stop at first highlighted object, if any.  Return t if some
highlighting was done, nil otherwise."
  (when (org-string-nw-p org-latex-and-related-regexp)
    (catch 'found
      (while (re-search-forward org-latex-and-related-regexp
                                        nil t) ;; on purpose, we ignore LIMIT
    (unless (cl-some (lambda (f) (memq f '(org-code org-verbatim underline
                            org-special-keyword)))
             (save-excursion
               (goto-char (1+ (match-beginning 0)))
               (face-at-point nil t)))
      (let* ((offset (if (memq (char-after (1+ (match-beginning 0)))
                   '(?_ ?^))
                 1
               0))
         (start (+ offset (match-beginning 0)))
         (end (match-end 0)))
        (if (memq 'native org-highlight-latex-and-related)
              (org-src-font-lock-fontify-block "latex" start end)
          (font-lock-prepend-text-property start end
                                                   'face 'org-latex-and-related))
      ;;<<<<<<<<<<<<<<<<<<<<<
      ;; my code starts here
      (when (and org-hide-emphasis-markers (< (+ start 4) end))
        (cond ((member (buffer-substring start (+ start 2)) '("$$" "\\("))
               (add-text-properties start (+ start 2) '(invisible org-link)))
              ((string= (buffer-substring (1+ start) (+ start 2)) "$")
               (add-text-properties (1+ start) (+ start 2) '(invisible org-link))))
        (cond ((member (buffer-substring end (- end 2)) '("$$" "\\)"))
               (add-text-properties end (- end 2) '(invisible org-link)))
              ((string= (buffer-substring (1- end) (- end 2)) "$")
               (add-text-properties (1- end) (- end 2) '(invisible org-link)))))
      ;; my code ends here
      ;;>>>>>>>>>>>>>>>>>>>>>
        (add-text-properties (+ offset (match-beginning 0)) (match-end 0)
                                   '(font-lock-multiline t)))
      (throw 'found t)))
      nil)))

如果有人对此功能感兴趣,您可以在加载 Org-mode 后将上述函数放置在 Emacs 配置文件中的某个位置,以便新的 org-do-latex-and-lated将覆盖原来的 Org-mode。

这是我使用上面的代码获得的结果:

enter image description here

最佳答案

另一种方法是根本不隐藏 $ 符号,而是使用 org-fragtog 。当光标进入和退出时,它会自动切换组织模式 latex 片段预览。

但是,当您打开包含方程的文件时,它只会在光标进入和离开方程时切换方程的预览。我还有一个用于 org-latex-preview 的键绑定(bind) (f5)。如果我打开一个包含许多方程的组织模式文件,我可以输入 C-u C-u f5 来切换缓冲区中所有方程的 latex 预览。如果我想改变一些方程,我只需将光标移到那里,org-fragtog-mode就会关闭预览。然后我可以编辑方程,光标离开方程时,预览将再次自动启用。

org-highlight-latex-and-lated 设置为任何可能的选择以及使用 prettify-symbols-mode 时,这也可以正常工作。

关于emacs - 在 Emacs Org 模式下突出显示 LaTeX 方程时如何隐藏符号 $?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63870998/

相关文章:

emacs - 我怎样才能最好地在 Emacs 中浏览源代码?

emacs - 如何在 evil-mode 下映射 `q:i`

emacs - 如何获取给定键盘快捷键的 emacs 命令?

emacs - 我如何使Emacs在没有那么大张扬的情况下启动?

python - Emacs 组织模式 : Executing simple python code

Emacs 斜体组织模式

elisp - 每第二个月的第三个星期三重复一个项目

emacs - Org-mode 8 中的 Fontify R 代码块

emacs - 无法打开加载文件 :/yasnippet

emacs - Orgmode 标题级别高度