Как получить радужные разделители / радужные блоки для выделения математики в уравнениях LaTeX

12

Я использую Spacemacs с AUCTeX для редактирования LaTeX и хотел бы, чтобы радужные разделители и / или радужные блоки выделяли математические уравнения LaTeX. К сожалению, это работает только частично, то есть некоторые уравнения подсвечиваются, а некоторые нет:

Пример: разделители радуги

На снимке экрана с примером встроенная математика, заключенная в $, не выделяется, в то время как остальные - в том числе встроенная математика \(...\)- включены.

С rainbow-blocksэтим становится хуже, так как иногда он будет работать в одном месте документа, а иногда не будет работать независимо от области действия.

Пример: радужные блоки

В: Кто-нибудь знает, почему это происходит или как начать rainbow-blocksработать над математической матрицей в LaTeX? Есть ли рабочие альтернативы?

nemesit
источник
Латексный режим в auctex, кажется, определяет «$», чтобы иметь специальный синтаксис в таблице синтаксиса, поэтому, возможно, синтаксическая фонификация font-lock переопределяет любую фонтификацию на основе ключевых слов.
Кирилл
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. это не полностью проверено (только с одним латексным файлом)
  3. Я не совсем понимаю, почему это работает ( font-lock-modeэто действительно довольно сложный механизм)

Сначала решение для rainbow-delimiters-mode:

Заменим свойство text font-lock-faceна facein 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 (как уже указывал Кирилл). Регистрация этого шрифта выглядит нормально (см. Переменную font-lock-syntactic-face-functionи функцию font-latex-syntactic-face-function). Но describe-charна символах встроенной формулы видно, что синтаксическая фонификация использует -property faceвместо font-lock-face-property.

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

Кажется, что 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аналогичным образом.

Тобиас
источник