レインボーデリミタ/レインボーブロックを取得して、LaTeX方程式のインライン数学を強調表示する方法


12

私が使用していますspacemacs LaTeXの編集のためAUCTeXとするとしたいと思い虹区切り文字および/または虹ブロックは LaTeXの数学の方程式を強調表示します。残念ながら、これは部分的にしか機能しません。つまり、いくつかの方程式は強調表示され、いくつかは強調表示されません。

例:レインボー区切り文字

サンプルのスクリーンショットでは、で囲まれたインライン数学$は強調表示されませんが、残りの-で囲まれたインライン数学を含む-は強調表示され\(...\)ます。

rainbow-blocks、それが悪化し、それが時には、文書の一つの場所での作業となりますように関係なく、スコープの動作しません。

例:レインボーブロック

Q:これがなぜ発生するのかrainbow-blocks、LaTeXでインライン演算を行う方法を知っている人はいますか?有効な代替手段はありますか?


auctexのlatex-modeは、「$」を構文テーブルに特別な構文を持つように定義しているようです。そのため、おそらくfont-lockの構文フォント化は、キーワードベースのフォント化を無効にします。
キリル14

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
トバイアス

rainbow-delimitersはjit-lockを直接使用します。たぶん、構文フォント化はjit-lockを使用せず、そのためにタイミングの問題が発生しますか?
トバイアス

回答:


2

以下は、コメントのようなものです。

  1. 問題のごく一部のみを解決します(rainbow-delimiters-mode
  2. 完全にテストされていない(ラテックスファイルが1つだけある)
  3. 私はそれがなぜ機能するのか完全には理解していません(font-lock-mode実際には非常に複雑な機械です)

最初の解決策rainbow-delimiters-mode

テキストプロパティfont-lock-facefacein rainbow-delimiters-propertize-delimiterおよびrainbow-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))))

今、推論:

$ -delimitersの間に埋め込まれた式は、font-lock-modeによってフォント化された構文です(すでにKirillが指摘したように)。このフォント化の登録は正常に見えます(変数font-lock-syntactic-face-functionと関数を参照font-latex-syntactic-face-function)。しかしdescribe-char、埋め込み式の文字では、構文のフォント化ではface-propertyではなく-propertyが使用されることが示されていfont-lock-faceます。

以下は、非常に複雑なフォントロック機構を完全に理解していないため、仮説です。

それfaceはより強いようですfont-lock-face。Rainbow-delimitersは、構文のフォント化にfont-lock-face支配されていfaceます。それでも、検索(キーワード)ベースのフォント化がjit-lockを使用する前に、構文フォント化が最初に来るという利点があります(の情報ページを参照font-lock-mode)。

それはface、のrainbow-delimiters代わりにを使用すると問題が解決するという結論に至りfont-lock-faceます。そして、ここで私は完全な結果を知りません。しかし、以降rainbow-delimitersも用途jit-lock直接する(経由ではなくfont-lock-mode)、とにかく不安定な床に立っています。

私は既にrainbow-delimiters/programming/19800243/highlight-first-mismatching-paren/20022030#20022030を参照)と連絡を取りましたが、ではありませんrainbow-blocks。限られた時間しかありませんので、集中することにしましたrainbow-delimiters。たぶん、あなたはrainbow-blocks同様の方法で- 問題を解決することができます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.