Emacs-lisp:LaTeX的美化符号模式

时间:2014-04-08 12:42:54

标签: emacs latex elisp font-lock

我试图移植"漂亮的实体"使用Emacs内置org-modelatex-modeprettify-symbols-mode的行为。此模式使用font-lock-mode将缓冲区中的字符序列显示为单个(unicode)字符。默认情况下,例如emacs-lisp代码

(lambda () t)

成为

(λ () t)
然而,它似乎要求字符序列被某些字符分隔,例如白色空间。例如在我的设置中,替换

\alpha \beta -> α β`

可以工作,但是当字符串没有分开时它会失败,例如

\alpha\beta -> \alphaβ

这是一个特别的问题,因为我想使用这种预处理使量子力学方程更具可读性,例如像

这样的替代品
|\psi\rangle -> |ψ⟩

是否可以使用prettify-symbols-mode来避免此分隔符问题?如果不是,可以在较低级别使用font-lock-mode吗?

2 个答案:

答案 0 :(得分:6)

这是应该做你想做的代码:

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

如上所示,pretty-alist从希腊字符开始。然后我补充说 \rangle只是为了演示如何添加新内容。 要自动启用它,请将其添加到钩子:

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

我使用here中的代码作为起点 点,你可以在那里寻找参考。

答案 1 :(得分:2)

美化符号模式的代码源自为像Haskell和其他一些语言开发的代码,它们不使用类似TeX的\之类的东西。所以你可能确实遇到了麻烦。我建议您M-x report-emacs-bug请求改善美化符号模式,以支持TeX风格的语法。

同时,你必须按照abo-abo建议的方式“手工完成”。

一个注意事项:在Emacs-21时代,我将X-Symbol移植到Emacs上工作,特别是因为我想在LaTeX中看到这样漂亮的东西。然而,我发现它对我来说几乎没用。我认为现在情​​况更是如此。原因如下:

  • 您现在可以在LaTeX代码中使用实际的ψ字符,而不是\psi。所以你不需要显示技巧让它看起来“正确”。
  • 而不是重复|\psi\rangle我更喜欢定义宏,然后使用\Qr{\Vangle}(其中\ Vangle变成\ psi(“V”代表“metaVariable”),\ Qr将其包含在一个braket)所以我可以轻松调整这些宏,并知道文档将保持一致。那时,\ psi和\ rangle的漂亮显示并不重要。