寻找适合 LaTeX3 的 Emacs/AUCTeX 设置

寻找适合 LaTeX3 的 Emacs/AUCTeX 设置

我正在尝试将我的编辑器从 vscodium(无遥测的 VS Code)切换到 Emacs。到目前为止,我已经安装了 AUCTeX 并在测试文档中尝试了一些操作。对于常规 LaTeX 代码,一切都很好。

但对于 LaTeX3 代码,到目前为止我还没能找到令人满意的解决方案。默认情况下,似乎没有适当的语法高亮支持,也没有运行 LaTeX3 代码的自动完成机制。可以在文档中使用+ 、+解析包expl3和,或者在 init 文件中使用自动完成此操作。但要做到这一点,我必须在解析之前使用或加载包。这似乎非常不必要,因为这些宏是内核的一部分。xparsectrlcctrln(setq TeX-parse-self t).emacs\usepackage\RequirePackage

除此之外,它对于xparse具有可识别语法和自动完成功能的命令效果很好。对于 LaTeX3 命令,语法高亮的结果不太令人满意(全部为暗灰色),并且完全没有自动完成机制(即使使用auto-completion-auctex包也是如此)。据我搜索,无论是在 TeX.SE 上,还是在网络上的其他地方,都没有太多关于该主题的帖子。这个问题例如,在最新的评论中提出了类似的无知(我也尝试了同一问题的其他评论/链接帖子中提出的可能性)。在我们的网站上搜索auctex/emacsexpl3/ 的组合latex3也只能得到很少的答案:1234

因此我的问题是:我知道这里有一些资深的 (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-modeemacs 附带的(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")

  1. \NewDocumentCommand现在可以通过机制访问诸如等 Xparse 宏TeX-insert-macro,包括建议插入参数说明符等,并正确突出显示。
  2. 至少,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))))))

相关内容