2012-08-07 13 views
5

Tôi muốn nhấn mạnh một lệnh mới, tôi tạo ra trong LaTeX:Emacs Auctex cú pháp tùy chỉnh nổi bật

\newcommand{\conceito}[3]{ 
    \subsection{#1} (Original: \textit{#2} #3). 
} 

tôi sử dụng mã này theo cách này:

\conceito{Foo}{Bar}{Bla} 

Tôi làm theo các manual và đặt mã này trong số ~/.emacs của tôi, nhưng nó không hoạt động:

(add-hook 'LaTeX-mode-hook 
    (lambda() 
     (font-lock-add-keywords nil 
      '((""\\<\\(\\conceito)\\>"" 1 font-lock-warning-face t))))) 

Có gì sai?

Trả lời

6

EDIT: Deokhwan Kim ban đầu chỉ ra rằng regexp của bạn có chứa hai dấu ngoặc kép liên tiếp, và rằng đóng ngoặc ) cần phải được thoát với dấu ngoặc kép cũng như:

(add-hook 'LaTeX-mode-hook 
    (lambda() 
     (font-lock-add-keywords nil 
      '(("\\<\\(\\conceito\\)\\>" 1 font-lock-warning-face t))))) 

Ngoài những điểm đã chỉ ra bởi Deokhwan Kim, cũng có hai vấn đề sau đây:

  • Bạn cần bốn backslashs thay vì hai ở phía trước 'conceito': \\\\conceito

  • Trình tự dấu chéo ngược \\< khớp với chuỗi trống chỉ ở đầu từ, tuy nhiên dấu gạch chéo ngược ở đầu lệnh LaTeX mới của bạn không được coi là một phần của từ, vì vậy \\< sẽ không khớp.

Hãy thử điều này thay vì:

(add-hook 'LaTeX-mode-hook 
    (lambda() 
     (font-lock-add-keywords nil 
      '(("\\(\\\\conceito\\)\\>" 1 font-lock-warning-face t))) 

EDIT: Một quan sát tốt mà Deokhwan Kim thực hiện là trong trường hợp đặc biệt này, bạn không thực sự cần ngoặc ở tất cả, bởi vì bạn đang cố gắng để khớp toàn bộ biểu thức. Vì vậy, một thay thế cho dòng cuối cùng có thể là:

'(("\\\\conceito\\>" 0 font-lock-warning-face t))))) 

Điểm về ngoặc là đúng, nhưng bạn thực sự có thể mở rộng regexp của bạn chỉ match khi mở xoăn cú đúp { sau chữ "conceito". Nhưng kể từ khi bạn không thực sự muốn làm nổi bật cú đúp đó, sử dụng các nhóm được xác định bằng dấu ngoặc đơn là con đường để đi:

(add-hook 'LaTeX-mode-hook 
    (lambda() 
     (font-lock-add-keywords nil 
      '(("\\(\\\\conceito\\)\\s-*{" 1 font-lock-warning-face t))) 

Lưu ý rằng kể từ khi chúng tôi đang thử nghiệm cho một { rằng sau trực tiếp sau khi "conceito" (trừ khi có khoảng trắng ở giữa), chúng tôi không cần thử nghiệm cho bất kỳ chi tiết nào nữa.

Nói chung, hãy thử M-x tái xây dựng để thủ biểu hiện thường xuyên tương tác: bạn có thể chỉnh sửa một regexp mới trong một bộ đệm nhỏ và ngay lập tức nhìn thấy những gì được đánh dấu trong bộ đệm mà từ đó bạn gọi việc tái xây dựng.

+0

Để ghi lại, trong bài đăng đã xóa của mình, tôi đã chỉ ra một số lỗi, chẳng hạn như dấu ngoặc kép liên tiếp '" "' và thiếu \\ trước ')', trong biểu thức chính quy trong câu hỏi. Nhưng Thomas đã thông báo với tôi rằng các vấn đề khác vẫn còn ẩn nấp ở đó và giải pháp của tôi là không đủ. Vì vậy, tôi đã xóa bài đăng của mình để tránh bất kỳ biến chứng nào. – dkim

+0

Làm tốt lắm! Một gợi ý nữa là, trong ví dụ cuối, '\\ s- *' tốt hơn là không có ở đó. Trong LaTeX, một đối số nên ngay lập tức theo vĩ mô của nó mà không có bất kỳ khoảng trống nào giữa chúng, phải không? – dkim

+0

@Deokhwan Kim - Không, khoảng trắng là tốt giữa lệnh và '{'. – Thomas

2

GNU AUCTeX có cách tích hợp để xác định làm nổi bật tùy chỉnh cho các macro do người dùng xác định. Hãy xem biến số font-latex-user-keyword-classesAUCTeX documentation.

Dưới đây là một ví dụ đơn giản (cấu hình của tôi):

(setq font-latex-user-keyword-classes 
     '(("shadow-hidden" (("hide" "{"))  shadow command) 
     ("shadow-mycomment" (("mycomment" "{")) shadow command) 
     ("shadow-comment" (("comment" "{")) shadow command))) 

này sẽ hiển thị các nội dung của \ hide {}, \ mycomment {} và \ comment {} macro trong bộ mặt bóng mờ.

Các vấn đề liên quan