Làm cách nào để có các dấu phân cách cầu vồng / khối cầu vồng để làm nổi bật toán học nội tuyến trong các phương trình LaTeX


12

Tôi đang sử dụng các spacemac với AocateeX để chỉnh sửa LaTeX và muốn tạo các dấu phân cách cầu vồng và / hoặc khối cầu vồng làm nổi bật các phương trình toán học LaTeX. Thật không may, điều này chỉ hoạt động một phần, tức là, một số phương trình được tô sáng và một số không:

Ví dụ: phân định cầu vồng

Trong ảnh chụp màn hình ví dụ, toán học nội tuyến kèm theo $không được tô sáng trong khi phần còn lại - bao gồm cả toán học nội tuyến kèm theo \(...\)- thực hiện.

Với rainbow-blocksnó trở nên tồi tệ hơn, vì đôi khi nó sẽ hoạt động ở một nơi của tài liệu và đôi khi sẽ không hoạt động bất kể phạm vi.

Ví dụ: khối cầu vồng

H: Có ai biết tại sao điều này xảy ra hoặc làm thế nào để rainbow-blockslàm việc cho toán học nội tuyến trong LaTeX không? Có bất kỳ lựa chọn thay thế làm việc?


Chế độ latex trong auctex dường như định nghĩa "$" để có cú pháp đặc biệt trong bảng cú pháp, do đó, có thể phông chữ cú pháp của phông chữ đang ghi đè bất kỳ phông chữ dựa trên từ khóa nào.
Kirill

highlight-parenthesessử dụng lớp phủ thay vì khóa phông chữ và việc sử dụng bảng cú pháp tạm thời trong thời gian của chức năng lớp phủ sẽ là một điều rất đơn giản. github.com/nschum/highlight-parentheses.el Chức năng cần được thay đổi trong thư viện đó là hl-paren-highlight: (let ((my-syntax-table (make-syntax-table))) (with-syntax-table my-syntax-table . . . Thật không may, đó là một thư viện khác so với thư viện bạn đã chỉ định - Tôi không biết cách khắc phục rainbow-delimiters- có lẽ bạn có thể sửa mở ra một vấn đề trên Github với người bảo trì.
luật

Sử dụng (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)))nó có thể thay thế phông chữ trong một công thức nhúng. Nhưng điều này không làm việc trong một lời khuyên xung quanh rainbow-delimiters-propertize-delimiter. Điều này chỉ ra rằng việc phông chữ latex-modediễn ra sau khi phông chữ thông qua rainbow-delimiters-mode.
Tobias

cầu vồng phân định sử dụng jit-lock trực tiếp. Có lẽ, phông chữ cú pháp không sử dụng jit-lock và chúng ta gặp vấn đề về thời gian vì điều đó?
Tobias

Câu trả lời:


2

Sau đây là giống như một nhận xét kể từ

  1. nó chỉ giải quyết được một phần nhỏ của vấn đề ( rainbow-delimiters-mode)
  2. nó không được kiểm tra kỹ lưỡng (chỉ với một tệp latex)
  3. Tôi hoàn toàn không hiểu tại sao nó hoạt động ( font-lock-modethực sự là một máy móc khá phức tạp)

Đầu tiên, giải pháp cho rainbow-delimiters-mode:

Chúng tôi thay thế tài sản văn bản font-lock-facebằng facetrong rainbow-delimiters-propertize-delimiterrainbow-delimiters-unpropertize-delimiter. Vì defsubstđược sử dụng trong gói thay vì defunchúng tôi không thể sử dụng defaliasmà phải tự sửa đổi các chức năng (theo như tôi hiểu - vui lòng nhận xét nếu tôi sai về vấn đề này).

Các chức năng sửa đổi là:

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

Bây giờ lý do:

Các công thức được nhúng giữa $ -d006iter được cú pháp phông chữ theo chế độ khóa-phông chữ (như Kirill đã chỉ ra). Việc đăng ký phông chữ này trông bình thường (xem biến font-lock-syntactic-face-functionvà chức năng font-latex-syntactic-face-function). Nhưng describe-chartại các ký tự của một công thức nhúng cho thấy rằng phông chữ cú pháp sử dụng face-property thay vì font-lock-face-property.

Sau đây là giả thuyết vì tôi không hoàn toàn hiểu máy móc khóa phông chữ khá phức tạp.

Dường như facemạnh hơn font-lock-face. Rainbow-delimiter sử dụng font-lock-facemà bị chi phối bởi facephông chữ cú pháp. Tuy nhiên, chúng tôi có lợi thế là phông chữ cú pháp xuất hiện trước tiên trước khi phông chữ dựa trên tìm kiếm (từ khóa) sử dụng jit-lock (xem trang thông tin của font-lock-mode).

Đó là dẫn tôi đến kết luận rằng vấn đề đã được giải quyết nếu chúng ta sử dụng facetrong rainbow-delimitersthay vì font-lock-face. Và ở đây tôi không biết hậu quả đầy đủ. Nhưng, vì rainbow-delimiterscũng sử dụng jit-locktrực tiếp (và không thông qua font-lock-mode) nên chúng tôi đang đứng trên một sàn rung lắc.

Lưu ý, rằng tôi đã có một số liên hệ với rainbow-delimiters(xem /programming/19800243/highlight-first-mismatching-paren/20022030#20022030 ) nhưng không phải với rainbow-blocks. Bởi vì tôi chỉ có một khung thời gian giới hạn mà tôi chọn để tập trung vào rainbow-delimiters. Có lẽ, bạn có thể giải quyết rainbow-blocksvấn đề theo cách tương tự.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.