【问题标题】:How to hide the symbol $ when highlighting LaTeX equations in Emacs Org-mode?在 Emacs Org 模式中突出显示 LaTeX 方程时如何隐藏符号 $?
【发布时间】:2020-09-13 12:52:20
【问题描述】:

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

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

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


更新 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-mode 的函数 org-do-latex-and-related 想出了一个快速的解决方案。

(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-related 将覆盖原来的 Org-mode。

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

【问题讨论】:

    标签: emacs org-mode


    【解决方案1】:

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

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

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

    【讨论】:

    • 感谢您的建议!这也是一个不错的选择。
    【解决方案2】:

    自定义变量org-emphasis-alist 并将$ 添加为具有所有自定义选项默认值的附加制造商。为此,请键入

    M-x customize-variable [RET] org-emphasis-alist [RET]
    

    然后到自定义缓冲区的底部,点击最后一个INS,在Marker character:下面插入一个美元符号。

    最后,点击State 使此更改永久生效,要么仅适用于当前编辑会话,要么适用于所有未来会话。

    注意您必须再次输入 M-x org-mode 重新启动 org-mode 才能使此更改生效。

    【讨论】:

    • 我尝试了您的解决方案,但它不起作用。它适用于您的 Emacs 吗?
    • 是的,确实如此。您是否记得在相关缓冲区中重新启动 org-mode 以使此机会生效?为了安全起见,您也可以重新启动所有 Emacs。
    • M-x org-reload 应该这样做。
    • 哦,伙计,太糟糕了。如果以下方法有效,您可以试试吗?像这样启动 emacs:emacs -q --eval "(setq org-hide-emphasis-markers t org-emphasis-alist '((\"\$\" bold)))" /tmp/test.org - 当我运行该命令并在 $ 符号中插入 LaTeX 数学表达式时,它们被标记为粗体,$s 被隐藏。
    • 非常感谢您的代码 sn-p!这一次,我安装了 Emacs-25.2,它成功隐藏了 $ 符号。但不适用于 Emacs 26.2、26.3、27.1。所以,我确认新的 Emacs 有一个重大变化打破了 Emacs 25.2 的这个特性
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多