Cara mendapatkan pelangi-pembatas / pelangi-blok untuk menyoroti matematika in-line dalam persamaan LaTeX

12

Saya menggunakan spacemac dengan AUCTeX untuk mengedit LaTeX dan ingin membuat pelangi-pembatas dan / atau pelangi-blok menyoroti persamaan matematika LaTeX. Sayangnya ini hanya berfungsi sebagian, yaitu, beberapa persamaan disorot dan beberapa tidak:

Contoh: pembatas pelangi

Dalam contoh tangkapan layar, matematika sebaris yang disertakan $tidak disorot sementara sisanya - termasuk matematika sebaris yang terlampir \(...\)- tidak.

Dengan rainbow-blocksitu semakin buruk, karena kadang-kadang akan berfungsi di satu tempat dokumen dan kadang-kadang tidak akan berfungsi terlepas dari ruang lingkupnya.

Contoh: balok pelangi

T: Apakah ada yang tahu mengapa ini terjadi atau bagaimana cara rainbow-blocksbekerja untuk in-line matematika di LaTeX? Apakah ada alternatif yang berfungsi?

nemesit
sumber
lateks-mode dalam auctex tampaknya mendefinisikan "$" untuk memiliki sintaks khusus dalam tabel-sintaks, jadi mungkin font-kunci sintaksis font-lock menimpa setiap klasifikasi berbasis kata kunci.
Kirill
highlight-parenthesesmenggunakan overlay daripada penguncian font, dan itu akan menjadi hal yang sangat sederhana untuk menggunakan sintaks-tabel sementara untuk durasi fungsi overlay. github.com/nschum/highlight-parentheses.el Fungsi yang perlu diubah di perpustakaan itu adalah hl-paren-highlight: (let ((my-syntax-table (make-syntax-table))) (with-syntax-table my-syntax-table . . . Sayangnya, itu adalah perpustakaan lain dari yang telah Anda tentukan - Saya tidak tahu cara memperbaikinya rainbow-delimiters- mungkin Anda bisa buka masalah tentang Github dengan pengelola.
hukum
Menggunakannya (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)))dimungkinkan untuk mengganti fontifikasi dalam formula yang disematkan. Tapi ini tidak berhasil dalam saran sekitar rainbow-delimiters-propertize-delimiter. Ini menunjukkan bahwa fontifikasi latex-modedilakukan setelah fontifikasi selesai rainbow-delimiters-mode.
Tobias
pembatas pelangi menggunakan kunci-jit secara langsung. Mungkin, sintaksis sintaksis tidak menggunakan jit-lock dan kami mendapatkan masalah waktu karena itu?
Tobias

Jawaban:

2

Berikut ini lebih seperti komentar sejak itu

  1. itu hanya memecahkan sebagian kecil dari masalah ( rainbow-delimiters-mode)
  2. itu tidak diuji secara menyeluruh (hanya dengan satu file lateks)
  3. Saya tidak sepenuhnya mengerti mengapa ia bekerja ( font-lock-modebenar-benar mesin yang cukup rumit)

Awalnya solusi untuk rainbow-delimiters-mode:

Kami mengganti properti teks font-lock-facedengan facedi rainbow-delimiters-propertize-delimiterdan rainbow-delimiters-unpropertize-delimiter. Karena defsubstdigunakan dalam paket alih-alih defunkami tidak dapat menggunakan defaliastetapi harus memodifikasi fungsinya sendiri (sejauh yang saya mengerti - tolong beri komentar jika saya salah dalam hal ini).

Fungsi yang dimodifikasi adalah:

(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))))

Sekarang alasannya:

Rumus yang disematkan di antara $ -delimiters adalah sintaks yang diklasifikasi oleh font-lock-mode (seperti yang sudah ditunjukkan Kirill). Pendaftaran fontifikasi ini terlihat normal (lihat variabel font-lock-syntactic-face-functiondan fungsi font-latex-syntactic-face-function). Tetapi describe-charpada karakter formula yang disematkan menunjukkan bahwa fonta sintaksis menggunakan face-properti bukan font-lock-face-properti.

Berikut ini adalah hipotesis karena saya tidak sepenuhnya mengerti mesin font-lock yang cukup kompleks.

Sepertinya itu facelebih kuat dari font-lock-face. Penggunaan pelangi-pelangi font-lock-faceyang didominasi oleh facefontifikasi sintaksis. Namun demikian, kami memiliki keuntungan bahwa fonta sintaksis didahulukan sebelum pencarian (kata kunci) berbasis fonta yang pada gilirannya menggunakan kunci-jit (lihat info-halaman dari font-lock-mode).

Yang mengarah saya sampai pada kesimpulan bahwa masalah diselesaikan jika kita menggunakan facedi rainbow-delimitersbukannya font-lock-face. Dan di sini saya tidak tahu konsekuensinya sepenuhnya. Tapi, karena rainbow-delimitersjuga menggunakan jit-locklangsung (dan tidak melalui font-lock-mode) kita berdiri di lantai yang rapuh pula.

Perhatikan, bahwa saya sudah memiliki beberapa kontak dengan rainbow-delimiters(lihat /programming/19800243/highlight-first-mismatching-paren/20022030#20022030 ) tetapi tidak dengan rainbow-blocks. Karena saya hanya memiliki kerangka waktu terbatas, saya memilih untuk berkonsentrasi rainbow-delimiters. Mungkin, Anda bisa menyelesaikan masalah dengan rainbow-blockscara yang sama.

Tobias
sumber