2014-04-08 12 views
5

Tôi đã cố gắng chuyển sang hành vi "thực thể xinh đẹp" từ org-mode đến latex-mode bằng cách sử dụng nội dung Emacs prettify-symbols-mode. Chế độ này sử dụng font-lock-mode để hiển thị chuỗi ký tự trong bộ đệm dưới dạng ký tự đơn (unicode). Theo mặc định cho mã dụ emacs-lispEmacs-lisp: prettify-symbols-mode cho LaTeX

(lambda() t) 

trở thành

(λ() t) 

Nó dường như tuy nhiên để yêu cầu các chuỗi ký tự được ngăn cách bởi một số nhân vật, ví dụ khoảng trắng. Ví dụ: trong thiết lập của tôi, thay thế

\alpha \beta -> α β` 

sẽ hoạt động, nhưng sẽ không thành công khi không tách riêng các chuỗi, ví dụ:

\alpha\beta -> \alphaβ 

Đây là vấn đề đặc biệt, bởi vì tôi muốn sử dụng nguyên mẫu này để làm cho phương trình cơ học lượng tử dễ đọc hơn, ví dụ: thay thế như

|\psi\rangle -> |ψ⟩ 

Có thể tránh vấn đề phân tách bằng cách sử dụng prettify-symbols-mode không? Và nếu không, có thể sử dụng font-lock-mode ở cấp độ thấp hơn không?

Trả lời

5

Dưới đây là đoạn code mà nên làm những gì bạn muốn:

(defvar pretty-alist 
    (cl-pairlis '("alpha" "beta" "gamma" "delta" "epsilon" "zeta" "eta" 
       "theta" "iota" "kappa" "lambda" "mu" "nu" "xi" 
       "omicron" "pi" "rho" "sigma_final" "sigma" "tau" 
       "upsilon" "phi" "chi" "psi" "omega") 
       (mapcar 
       (lambda (x) (make-char 'greek-iso8859-7 x)) 
       (number-sequence 97 121)))) 
(add-to-list 'pretty-alist '("rangle" . ?\⟩)) 
(defun pretty-things() 
    (mapc 
    (lambda (x) 
    (let ((word (car x)) 
      (char (cdr x))) 
     (font-lock-add-keywords 
     nil 
     `((,(concat "\\(^\\|[^a-zA-Z0-9]\\)\\(" word "\\)[a-zA-Z]") 
      (0 (progn 
       (decompose-region (match-beginning 2) (match-end 2)) 
       nil))))) 
     (font-lock-add-keywords 
     nil 
     `((,(concat "\\(^\\|[^a-zA-Z0-9]\\)\\(" word "\\)[^a-zA-Z]") 
      (0 (progn 
       (compose-region (1- (match-beginning 2)) (match-end 2) 
        ,char) 
       nil))))))) 
    pretty-alist)) 

Như bạn thấy ở trên, pretty-alist bắt đầu với ký tự Hy Lạp. Sau đó, tôi thêm \rangle chỉ để minh họa cách thêm nội dung mới. Để kích hoạt nó tự động, thêm nó vào móc:

(add-hook 'LaTeX-mode-hook 'pretty-things) 

tôi đã sử dụng mã từ here như một bắt đầu điểm, bạn có thể xem xét có cho một tham chiếu.

+0

Cảm ơn, tôi sẽ cố gắng ot càng sớm càng tốt. – kdb

+0

Bất kỳ ý tưởng nào về cách tôi có thể thêm Σ vào danh sách tùy chọn để tính tổng. sigma cho thấy 'ς' này thay thế? –

+0

Chỉ cần làm theo ví dụ với 'rangle'. –

2

Mã của chế độ prettify-symbols-mode bắt nguồn từ mã phát triển cho các ngôn ngữ như Haskell và một số khác, không sử dụng thứ gì đó giống như của TeX \. Vì vậy, bạn thực sự có thể gặp rắc rối. Tôi đề nghị bạn M-x report-emacs-bug yêu cầu chế độ prettify-symbol-mode được cải thiện để hỗ trợ cú pháp kiểu TeX.

Đồng thời, bạn sẽ phải "làm điều đó bằng tay" dọc theo những gì mà abo-abo gợi ý.

Một lưu ý, tho: trở lại trong ngày của Emacs-21, tôi đã chuyển X-Symbol để làm việc trên Emacs, đặc biệt là vì tôi muốn xem những thứ đẹp như vậy trong LaTeX. Tuy nhiên, tôi phát hiện ra rằng nó hầu như vô dụng đối với tôi. Và tôi nghĩ rằng nó thậm chí còn nhiều hơn bây giờ. Đây là lý do:

  • Bạn chỉ có thể sử dụng ký tự thực tế ψ trong mã LaTeX thay vì \psi ngày nay. Vì vậy, bạn không cần thủ thuật hiển thị để nó trông "đúng".
  • Thay vì lặp lại |\psi\rangle Tôi thích định nghĩa macro hơn và sau đó sử dụng \Qr{\Vangle} (trong đó \ Vangle biến thành \ psi ("V" là viết tắt của "metaVariable"), và \ Qr kết thúc tốt đẹp nó) macro và biết rằng tài liệu sẽ vẫn nhất quán. Tại thời điểm đó, hiển thị đẹp \ psi và \ rangle là không quan trọng.
+0

Tôi đã thực sự nghĩ đến việc mở rộng mã của mình để cho phép các định nghĩa phức tạp hơn, ví dụ: bằng cách viết nhận xét tuyên bố cách thay thế văn bản một macro nhất định. Không bao giờ theo dõi về điều đó mặc dù, bởi vì tôi chuyển sang LyX (nơi hiển thị đồ họa của các macro toán học do người dùng định nghĩa). Điều đó nói rằng, tôi đã tìm thấy các macro đó - không có một biểu diễn đồ họa như trong LyX - để giết khả năng của riêng tôi sau này để hiểu mã nguồn nếu tôi quay lại để chỉnh sửa lại tệp, vì vậy tôi không muốn biết làm thế nào xấu sẽ nhận được khi đọc TeX của người khác. – kdb

+0

Đối với ψ trực tiếp trong nguồn: Trong khi tôi yêu phương thức nhập 'TeX', kết quả hợp lý sẽ chỉ thu được khi sử dụng LuaTeX hoặc XeTeX, hạn chế (mặc dù tôi rất thành thật nếu tất cả các ấn phẩm đều có ký hiệu unicode thích hợp). Khi sử dụng PDFLaTeX với '\ usepackage [utf8 (x)] {inputenc}' các biểu tượng không được nhận dạng đáng buồn được bỏ qua âm thầm thay vì gây ra lỗi. PS: Xin lỗi vì câu trả lời muộn màng. – kdb