Як отримати розмежувачі веселки / блоки веселки для виділення лінійної математики в рівняннях LaTeX


12

Я використовую Spacemacs з AUCTeX для редагування LaTeX і хотів би, щоб райдужні роздільники та / або блоки веселки виділили математичні рівняння LaTeX. На жаль, це працює лише частково, тобто деякі рівняння виділяються, а деякі не:

Приклад: роздільники веселки

На прикладі скріншоту вкладена математика в рядку $не виділяється, тоді як решта - включаючи вкладену в рядку математику \(...\)- робить.

З rainbow-blocksцим стає гірше, оскільки він інколи працюватиме в одному місці документа, а іноді не працюватиме незалежно від обсягу.

Приклад: веселки-блоки

Питання: Хто-небудь знає, чому це відбувається або як почати rainbow-blocksпрацювати на вбудовану математику в LaTeX? Чи є якісь альтернативи роботи?


латекс-режим в ауктексі, схоже, визначає "$", щоб у таблиці синтаксису був спеціальний синтаксис, тому, можливо, синтаксична фонтифікація шрифта-блокування перекриває будь-яку фнотифікацію на основі ключових слів.
Кирило

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)))його можна замінити fontification всередині вбудованої формули. Але це не працює в навколо ради rainbow-delimiters-propertize-delimiter. Це вказує на те, що fontification of latex-modeвідбувається після fontification through rainbow-delimiters-mode.
Тобіас

веселки-роздільники використовують jit-lock безпосередньо. Можливо, синтаксичне fontification не використовує jit-lock, і через це у нас виникає проблема з тимчасовим?
Тобіас

Відповіді:


2

Далі більше нагадує коментар з тих пір

  1. він вирішує лише невелику частину проблеми ( rainbow-delimiters-mode)
  2. вона ретельно не перевірена (лише з одним файлом латексу)
  3. Я не зовсім розумію, чому це працює ( font-lock-modeце дійсно досить складна техніка)

Спочатку рішення для rainbow-delimiters-mode:

Заміняємо властивість тексту font-lock-faceна faceв 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))))

Тепер міркування:

Вбудовані формули між $ -делімітерами є синтаксисом, визначеним режимом блокування шрифтів (як уже вказував Кирилл). Реєстрація цієї основної інформації виглядає нормально (див. Змінну font-lock-syntactic-face-functionта функцію font-latex-syntactic-face-function). Але describe-charна символах вбудованої формули видно, що синтаксична фонтифікація використовує -property faceзамість -property font-lock-face.

Далі гіпотетично, оскільки я не повністю розумію механізм блокування шрифту, який є досить складним.

Здається, що faceсильніше, ніж font-lock-face. Використовує райдужні розмежувачі, в font-lock-faceяких переважає faceсинтаксична фонтіфікація. Тим не менш, ми маємо перевагу в тому, що синтаксична фонтифікація виходить першою перед фонтуванням на основі пошуку (ключового слова), яке, в свою чергу, використовує jit-lock (див. Інформаційні сторінки font-lock-mode).

Це підводить мене до висновку , що проблема вирішена , якщо ми використовуємо faceв rainbow-delimitersзамість font-lock-face. І тут я не знаю повних наслідків. Але, оскільки rainbow-delimitersтакож використовує jit-lockбезпосередньо (а не через font-lock-mode), ми все одно стоїмо на хиткій підлозі.

Зауважте, що я вже мав деякі контакти rainbow-delimiters(див. Https://stackoverflow.com/questions/19800243/highlight-first-mismatching-paren/20022030#20022030 ), але не з rainbow-blocks. Тому що у мене лише обмежений час, який я вирішив зосередити rainbow-delimiters. Можливо, ви можете вирішити rainbow-blocks-проблему аналогічним чином.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.