我试图移植"漂亮的实体"使用Emacs内置org-mode
从latex-mode
到prettify-symbols-mode
的行为。此模式使用font-lock-mode
将缓冲区中的字符序列显示为单个(unicode)字符。默认情况下,例如emacs-lisp代码
(lambda () t)
成为
(λ () t)
然而,它似乎要求字符序列被某些字符分隔,例如白色空间。例如在我的设置中,替换
\alpha \beta -> α β`
可以工作,但是当字符串没有分开时它会失败,例如
\alpha\beta -> \alphaβ
这是一个特别的问题,因为我想使用这种预处理使量子力学方程更具可读性,例如像
这样的替代品|\psi\rangle -> |ψ⟩
是否可以使用prettify-symbols-mode
来避免此分隔符问题?如果不是,可以在较低级别使用font-lock-mode
吗?
答案 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中看到这样漂亮的东西。然而,我发现它对我来说几乎没用。我认为现在情况更是如此。原因如下:
ψ
字符,而不是\psi
。所以你不需要显示技巧让它看起来“正确”。|\psi\rangle
我更喜欢定义宏,然后使用\Qr{\Vangle}
(其中\ Vangle变成\ psi(“V”代表“metaVariable”),\ Qr将其包含在一个braket)所以我可以轻松调整这些宏,并知道文档将保持一致。那时,\ psi和\ rangle的漂亮显示并不重要。