我正在尝试将我的编辑器从 vscodium(无遥测的 VS Code)切换到 Emacs。到目前为止,我已经安装了 AUCTeX 并在测试文档中尝试了一些操作。对于常规 LaTeX 代码,一切都很好。
但对于 LaTeX3 代码,到目前为止我还没能找到令人满意的解决方案。默认情况下,似乎没有适当的语法高亮支持,也没有运行 LaTeX3 代码的自动完成机制。可以在文档中使用+ 、+解析包expl3
和,或者在 init 文件中使用自动完成此操作。但要做到这一点,我必须在解析之前使用或加载包。这似乎非常不必要,因为这些宏是内核的一部分。xparse
ctrlcctrln(setq TeX-parse-self t)
.emacs
\usepackage
\RequirePackage
除此之外,它对于xparse
具有可识别语法和自动完成功能的命令效果很好。对于 LaTeX3 命令,语法高亮的结果不太令人满意(全部为暗灰色),并且完全没有自动完成机制(即使使用auto-completion-auctex
包也是如此)。据我搜索,无论是在 TeX.SE 上,还是在网络上的其他地方,都没有太多关于该主题的帖子。这个问题例如,在最新的评论中提出了类似的无知(我也尝试了同一问题的其他评论/链接帖子中提出的可能性)。在我们的网站上搜索auctex
/emacs
和expl3
/ 的组合latex3
也只能得到很少的答案:1,2,3,4。
因此我的问题是:我知道这里有一些资深的 (La)TeX 老手,他们几十年来一直使用 emacs。您在使用 LaTeX3 代码时使用什么设置?是否有我遗漏的解决方案(这确实有可能),您是否自己编辑/创建了所需的 lisp 代码,或者您只是不太在意代码高亮等。
编辑: @AndrewStacey 提供了一个很好的解决方案一个答案链接到我之前提到的帖子。它在许多情况下都能产生良好的语法突出显示。有些东西我可能会改变,因为以\str_
或开头的命令\int_
会像标记列表或序列一样突出显示,但这可以通过编辑他的 lisp 代码来实现(例如,将str\\
和插入int\\
到初始specials
正则表达式中)。这至少是一个我可以使用的解决方案,也许可以随着时间的推移适应我的需求。但由于它依赖于 emacs 标准latex-mode
(不带大写字母),它不提供 AUCTeX 的附加语法突出显示功能。我确信这可以实现,但我目前的 emacs/lisp 知识太少,无法做到这一点。
除此之外,它没有解决自动完成问题,而这对于编程目的来说会更有帮助。尤其是关于NewDocumentCommand
及其同类产品。因此,我对更多经验报告/自己的解决方案等感兴趣。
答案1
我查看过(诚然,不是很仔细),和你一样,没有发现太多。因此,我目前使用自写的(在 elisp 中)LaTeX3-mode
,它是处理 LaTeX3 样式和类文件时的基本latex-mode
(不是 AucTeX)的扩展。我的大部分代码都是语法高亮,几乎所有其他功能(组合键、自动完成、缩进等)都继承自LaTeX-mode
emacs 附带的(tex-mode.el
)。我不确定它与.dtx
文件配合得如何(如果有的话),或者我是否也需要为这些文件编写一个模块。
我确实打算“马上”出版它(所以,最终——可能是明年晚些时候)。如果兴趣足够大,我可能会加大努力和关注,时间会是“明年年初”,而不是“可能明年,最早可能在 9 月左右”。(感谢表示感兴趣的评论,以及关于如何以及在何处出版和宣布出版物以获得最佳效果的建议。)
我对其他人的解决方案也很感兴趣,主要是这样我知道我是否应该继续研究自己的解决方案,或者使用他们的解决方案并放弃我的尝试。
编辑以添加:
我正在研究的模式类似于(但不基于)@AndrewStacy 的模式,该模式链接到这里。至少,不是直接基于。我相当确定我在编写我的代码之前看到了 Andrew 的模式,但没有直接复制任何东西。
进一步编辑,以防评论在任何时候被删减:这篇文章现已发布于github。
答案2
到目前为止的许多评论和提示向我展示了适应 LaTeX 设置的不同方法,这是一个很好的解决方法。
我将其作为部分答案提供,以展示一些可能的解决方案,并可能引发更多评论/建议。只要存在一些未解决的问题,我不会接受它作为我自己问题的答案,并用新的见解更新它。当然,其他答案仍然非常受欢迎。由于到目前为止似乎还没有最终的原生解决方案,也许我们可以在这里收集不同的方法/技巧。
目前,我在我的.emacs.d/init.el
文件中使用以下(非常简化的)设置:
(custom-set-faces
'(font-latex-sedate-face ((t (:foreground "dark orange"))))
'(font-lock-comment-face ((t (:foreground "dim gray")))))
;;LaTeX;;
(setq TeX-parse-self t) ; Enable parse on load.
(setq TeX-auto-save t) ; Enable parse on save.
;; parse xparse by default
(add-hook 'LaTeX-mode-hook 'my/LaTeX-mode-setup)
(add-hook 'docTeX-mode-hook 'my/LaTeX-mode-setup)
(defun my/LaTeX-mode-setup ()
(TeX-run-style-hooks "xparse")
(visual-line-mode)
(electric-pair-local-mode))
关于语法,最重要的部分是withlatex3
的自动解析。它部分解决了两个问题:xparse.el
(TeX-run-style-hooks "xparse")
\NewDocumentCommand
现在可以通过机制访问诸如等 Xparse 宏TeX-insert-macro
,包括建议插入参数说明符等,并正确突出显示。- 至少,
xparse.el
解析expl3.el
自身会导致latex3
命令被识别为有凝聚力的命令名。这些命令的突出显示可以更改设置(font-latex-sedate-face ((t (:foreground "dark orange")))
(此处为橙色)。
这两个方面结合起来确实支持了编程latex3
。很遗憾,latex3
诸如此类的命令\seq_new:N
在自动完成/宏插入中仍然完全缺失!
正如@gusbrs 和@enkorvaks 的回答和评论所暗示的那样,这样的改编可能不太容易正确实施。我自己的lisp
知识太少,无法评估这个问题。
关于更好的语法高亮,@AndrewStacey 的解决方案也非常有趣。他的语法高亮latex3
绝对优于提供的简单解决方案expl3.el
。如果能将此代码适配到 AUCTeX 的,那就太好了LaTeX-mode-hook
。也许我(或其他人)将来能够意识到这一点。此外,我迫不及待地想看看 enkorvaks 自己的解决方案。
到目前为止,有些事情可以做/调整,但其他事情仍有待解决。
至少就我而言,上述调整足以让我最终从 VSCode/vscodium 切换到 emacs。我对后者还很陌生,但使用所有这些快捷键管理编程任务(尤其是在 LaTeX 中)的速度完全让我信服。因此,latex3
识别方面的缺陷并不那么严重。
编辑
再次感谢@gusbrs 提供他的解决方法使用 AUCTeX进行latex3
语法高亮。我采用了它并添加了一些新面孔font-lock
,这些面孔是为高亮latex3
命令保留的,以避免与latex2e
命令混淆。到目前为止,它运行良好,我希望其他人也可以使用它。如果有人发现不一致或类似情况,我很高兴听到它。
这是我改编的代码.emacs.d/init.el
(刚刚添加到上面发布的代码片段下方):
;; try own face setup ; https://emacs.stackexchange.com/a/53023/41665
(defface flo-font-lock-latex3-variable-face `((t (:foreground "chocolate"))) "Chocolate highlight")
(defvar flo-font-lock-latex3-variable-face 'flo-font-lock-latex3-variable-face
"Variable for face flo-font-lock-latex3-variable-face.")
(defface flo-font-lock-latex3-keyword-face `((t (:foreground "orchid"))) "Orchid highlight")
(defvar flo-font-lock-latex3-keyword-face 'flo-font-lock-latex3-keyword-face
"Variable for face flo-font-lock-latex3-keyword-face.")
(defface flo-font-lock-latex3-type-face `((t (:foreground "dark orchid"))) "Dark Orchid highlight")
(defvar flo-font-lock-latex3-type-face 'flo-font-lock-latex3-type-face
"Variable for face flo-font-lock-latex3-type-face.")
;; latex3 highlighting, adapted from https://gist.github.com/gusbrs/730758305ae701c915eb928f8c803328
(with-eval-after-load 'font-latex
(add-hook 'LaTeX-mode-hook 'flo/LaTeX-expl3-font-lock-setup)
(add-hook 'docTeX-mode-hook 'flo/LaTeX-expl3-font-lock-setup)
(defun flo/LaTeX-expl3-font-lock-setup ()
(let ((signatures "NncVvoxefTFpwD")
(vartypes '("clist" "dim" "fp" "int" "muskip" "seq" "skip"
"str" "tl" "bool" "box" "coffin" "flag" "fparray"
"intarray" "ior" "iow" "prop" "regex")))
(font-lock-add-keywords
nil
`((,(concat "\\(\\\\\\(?:@@_\\|\\(?:__\\)?[a-zA-Z]+_\\)[a-zA-Z_]+\\)"
"\\(:[" signatures "]*\\)")
.
((1 'flo-font-lock-latex3-keyword-face)
(2 'flo-font-lock-latex3-type-face)))
(,(concat "\\(\\\\[lgc]_[a-zA-Z@_]+"
"_\\(?:" (mapconcat #'identity vartypes "\\|") "\\)\\_>"
"\\)")
1 'flo-font-lock-latex3-variable-face))))))