如何获取彩虹定界符/彩虹块以突出LaTeX方程式中的嵌入式数学


12

我使用spacemacs与AUCTeX为LaTeX的编辑,想使彩虹分隔符和/或彩虹块亮点LaTeX的数学方程。不幸的是,这仅部分起作用,即,某些方程式被突出显示,而另一些则不能:

示例:rainbow-delimiters

在示例屏幕截图中,包含$在内的嵌入式数学不会突出显示,而其余部分(包括包含在内的嵌入式数学)则会突出显示\(...\)

随着rainbow-blocks它变得更糟,因为它有时会在文档的一个位置工作,有时不管范围如何都无法工作。

示例:rainbow-blocks

问:有谁知道为什么会这样,或者如何rainbow-blocks在LaTeX中进行在线数学运算?有其他可行的选择吗?


auctex中的latest-mode似乎在语法表中定义了“ $”以具有特殊语法,因此字体锁的句法字体化可能会覆盖任何基于关键字的字体化。
Kirill 2014年

highlight-parentheses使用覆盖而不是字体锁定,在覆盖功能期间使用临时语法表将是非常简单的事情。 github.com/nschum/highlight-parentheses.el 该库中需要更改的功能是hl-paren-highlight(let ((my-syntax-table (make-syntax-table))) (with-syntax-table my-syntax-table . . . 不幸的是,这是不同于您指定的库-我不知道如何解决rainbow-delimiters-也许您可以与维护者一起在Github上发布问题。
法律名单

使用(with-silent-modifications (remove-text-properties (region-beginning) (region-end) '(face nil font-lock-face nil)) (add-text-properties (region-beginning) (region-end) '(face rainbow-delimiters-depth-1-face)))它可以替换嵌入公式中的字体。但这不适用于的建议rainbow-delimiters-propertize-delimiter。这表明的字体化latex-mode是通过进行的rainbow-delimiters-mode
Tobias 2015年

rainbow-delimiters直接使用jit-lock。也许,语法字体化不使用jit-lock,因此我们会遇到计时问题?
Tobias 2015年

Answers:


2

以下更像是一条评论,因为

  1. 它只能解决一小部分问题(rainbow-delimiters-mode
  2. 它未经彻底测试(仅使用一个乳胶文件)
  3. 我不完全了解为什么它起作用(font-lock-mode实际上是相当复杂的机器)

首先,以下解决方案rainbow-delimiters-mode

我们替换文本属性font-lock-face通过facerainbow-delimiters-propertize-delimiterrainbow-delimiters-unpropertize-delimiter。由于defsubst在包中使用,而不是defun我们不能使用,defalias而是必须自己修改功能(据我所知-如果我在这方面有误,请发表评论)。

修改后的功能为:

(defsubst rainbow-delimiters-propertize-delimiter (loc depth)
  "Highlight a single delimiter at LOC according to DEPTH.

LOC is the location of the character to add text properties to.
DEPTH is the nested depth at LOC, which determines the face to use.

Sets text properties:
`font-lock-face' to the appropriate delimiter face.
`rear-nonsticky' to prevent color from bleeding into subsequent characters typed by the user."
  (with-silent-modifications
    (let ((delim-face (if (<= depth 0)
                          'rainbow-delimiters-unmatched-face
                        (rainbow-delimiters-depth-face depth))))
      ;; (when (eq depth -1) (message "Unmatched delimiter at char %s." loc))
      (add-text-properties loc (1+ loc)
               ;; 2015-05-24: Changed font-lock-face to face to enable rainbow after syntax fontification in latex-mode
               ;; (see http://emacs.stackexchange.com/questions/4260/how-to-get-rainbow-delimiters-rainbow-blocks-to-highlight-in-line-math-in-latex)
                           `(face ,delim-face
                             rear-nonsticky t)))))


(defsubst rainbow-delimiters-unpropertize-delimiter (loc)
  "Remove text properties set by rainbow-delimiters mode from char at LOC."
  (with-silent-modifications
    (remove-text-properties loc (1+ loc)
                ;; 2015-05-24: See corresponding line in `rainbow-delimiters-propertize-delimiter'.
                            '(face nil
                              rear-nonsticky nil))))

现在进行推理:

$分隔符之间的嵌入式公式由font-lock-mode字体化(正如Kirill指出的那样)。这种字体的注册看起来很正常(请参见variable font-lock-syntactic-face-function和function font-latex-syntactic-face-function)。但是describe-char在一个嵌入式公式的字符处显示,语法字体化使用face-property而不是font-lock-face-property。

以下是假设,因为我还没有完全理解非常复杂的字体锁定机制。

似乎face比强大font-lock-face。Rainbow分隔符的使用font-lock-face主要由face句法字体构成。不过,我们有一个优势,即语法字体化首先出现在基于搜索(关键字)的字体化之前,后者依次使用jit-lock(请参阅参考资料页font-lock-mode)。

得出的结论是,如果使用facein rainbow-delimiters代替,则可以解决问题font-lock-face。在这里,我不知道全部后果。但是,由于rainbow-delimitersjit-lock直接使用(而不是通过font-lock-mode),所以我们还是站在摇摇欲坠的地板上。

请注意,我已经与接触过rainbow-delimiters(请参阅/programming/19800243/highlight-first-mismatching-paren/20022030#20022030),但尚未与接触rainbow-blocks。因为我的时间有限,所以我选择专心rainbow-delimiters。也许,您可以rainbow-blocks通过类似的方式解决-problem问题。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.