Jak uzyskać ograniczniki tęczy / bloki tęczy, aby wyróżnić matematykę liniową w równaniach LaTeX

12

Używam znaków przestrzennych z AUCTeX do edycji LaTeX i chciałbym, aby ograniczniki tęczy i / lub bloki tęczy podkreślały równania matematyczne LaTeX. Niestety działa to tylko częściowo, tzn. Niektóre równania są podświetlone, a niektóre nie:

Przykład: ograniczniki tęczy

W przykładowym zrzucie ekranu wbudowana matematyka $nie jest podświetlana, podczas gdy reszta - w tym matematyka dołączona \(...\)- jest zaznaczona .

Z rainbow-blocksczasem jest gorzej, ponieważ czasami będzie działać w jednym miejscu dokumentu, a czasem nie będzie działać, niezależnie od zakresu.

Przykład: tęczowe bloki

P: Czy ktoś wie, dlaczego tak się dzieje lub jak rozpocząć rainbow-blockspracę w matematyce liniowej w LaTeX? Czy są jakieś działające alternatywy?

nemesit
źródło
tryb lateksowy w auctex wydaje się definiować „$”, aby mieć specjalną składnię w tabeli składni, więc być może czcionkowa blokada czcionek jest nadrzędna wobec czcionek opartych na słowach kluczowych.
Kirill,
highlight-parenthesesużywa nakładek zamiast blokowania czcionek, i bardzo łatwo byłoby użyć tymczasowej tabeli składni na czas trwania funkcji nakładki. github.com/nschum/highlight-parentheses.el Funkcja, którą należałoby zmienić w tej bibliotece to hl-paren-highlight: (let ((my-syntax-table (make-syntax-table))) (with-syntax-table my-syntax-table . . . Niestety, jest to inna biblioteka niż ta, którą określiłeś - nie wiem jak to naprawić rainbow-delimiters- być może mógłbyś otwórz problem na Githubie z opiekunem.
prawnik
Korzystanie z (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)))niej umożliwia zastąpienie czcionki w osadzonej formule. Ale to nie działa w przypadku porady rainbow-delimiters-propertize-delimiter. Wskazuje to, że fontifikacja latex-modema miejsce po jej zakończeniu rainbow-delimiters-mode.
Tobias
ograniczniki tęczy używają blokady Jit-Lock bezpośrednio. Być może czcionkowanie składniowe nie wykorzystuje blokady Jit i przez to mamy problem z synchronizacją?
Tobias

Odpowiedzi:

2

Od tego czasu bardziej przypomina komentarz

  1. rozwiązuje tylko niewielką część problemu ( rainbow-delimiters-mode)
  2. nie jest dokładnie testowany (tylko z jednym plikiem lateksowym)
  3. Nie do końca rozumiem, dlaczego to działa ( font-lock-modeto naprawdę dość skomplikowana maszyneria)

Na początku rozwiązanie dla rainbow-delimiters-mode:

Zastępujemy właściwość text font-lock-faceprzez facein rainbow-delimiters-propertize-delimiteri rainbow-delimiters-unpropertize-delimiter. Ponieważ defsubstjest używany w pakiecie, zamiast tego defunnie możemy zastosować, defaliasale musimy zmodyfikować same funkcje (o ile rozumiem - proszę o komentarz, jeśli się mylę pod tym względem).

Zmodyfikowane funkcje to:

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

Teraz rozumowanie:

Wbudowane formuły między $ -delimiterami są składniane czcionką według trybu blokowania czcionek (jak już wskazał Kirill). Rejestracja tej czcionki wygląda normalnie (patrz zmienna font-lock-syntactic-face-functioni funkcja font-latex-syntactic-face-function). Ale describe-charna znakach osadzonej formuły pokazuje, że czcionka składniowa używa face-property zamiast font-lock-face-property.

Poniższe jest hipotetyczne, ponieważ nie do końca rozumiem maszynę do blokowania czcionek, która jest dość złożona.

Wydaje się, że facejest silniejszy niż font-lock-face. Zastosowania ograniczników tęczy, w font-lock-facektórych dominuje faceskładniowa czcionka. Niemniej jednak mamy tę zaletę, że czcionkowanie składniowe jest na pierwszym miejscu przed czcionkami opartymi na wyszukiwaniu (słowach kluczowych), które z kolei używają blokady jit (patrz strony informacyjne font-lock-mode).

Która prowadzi mnie do wniosku, że problem jest rozwiązany, jeśli używamy facew rainbow-delimiterszamiast font-lock-face. I tutaj nie znam pełnych konsekwencji. Ponieważ rainbow-delimitersjednak używa się jit-lockbezpośrednio (a nie przez font-lock-mode), i tak stoimy na chwiejnej podłodze.

Zauważ, że miałem już jakiś kontakt rainbow-delimiters(patrz /programming/19800243/highlight-first-mismatching-paren/20022030#20022030 ), ale nie z rainbow-blocks. Ponieważ mam ograniczony czas, na którym postanowiłem się skoncentrować rainbow-delimiters. Być może możesz rozwiązać rainbow-blocksproblem w podobny sposób.

Tobiasz
źródło