什么是Emacs中tex-mode、latex-mode和LaTeX-mode的区别?

11

我正在emacs中配置AUCTeX。

大部分的配置都放在LaTeX-mode-hook中。当我打开一个main.tex文件时,我注意到主模式是latex-mode,我的钩子配置没有被激活。我必须使用M-x Tex-latex-mode来激活它们。但是主模式仍然是latex-mode。

(add-hook 'LaTeX-mode-hook
      (lambda ()

        ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
        ;; auctex

        (setq TeX-auto-save t)
        (setq TeX-parse-self t)
       ))

我想知道这些模式的区别,以及如何在打开*.tex文件时自动启用AUCTeX。

2个回答

11

AUCTeX提供的模式列在https://www.gnu.org/software/auctex/manual/auctex.html#Modes-and-Hooks,包括:

  • plain-TeX-mode
  • LaTeX-mode
  • ams-TeX-mode
  • ConTeXt-mode
  • Texinfo-mode
  • docTeX-mode

相反地,TeX mode包含以下重要模式:

  • tex-mode
  • plain-tex-mode
  • latex-mode
  • slitex-mode
  • doctex-mode

(请注意大写字母的不同)。

如果您想使用AUCTeX LaTeX模式打开所有*.tex文件,请将以下代码添加到您的.emacs中:

(add-to-list 'auto-mode-alist '("\\.tex$" . LaTeX-mode))

实际上,这并不是必需的,因为AUCTeX将tex-mode.el模式名称定义为其自身模式的别名。


1
我认为这些信息已经过时了。LaTeX-mode似乎是latex-mode的别名,而TeX-latex-mode是由AUCTeX(版本12.3)定义的模式。无论如何,我完全困惑了。如果我想设置按键绑定,我应该使用哪个映射:latex-mode-map还是LaTeX-mode-map还是两者都要用? - Dominik Schrempf
经过深入挖掘,似乎AUCTeX正在覆盖LaTeX-mode的别名,但我找不到原因...我想知道为什么这么复杂。 - Dominik Schrempf
对于您的键绑定,您应该仅使用 LaTeX-mode-map,这是官方 AUCTeX 名称。 - giordano
这个答案缺少对TeX-latex-mode的解释,这似乎是OP最初询问的内容。 LaTeX-mode没有文档字符串,而TeX-latex-mode被记录为“用于编辑LaTeX文件的AUCTeX的主要模式”。 - Clément

1
TLDR: 使用 latex-modeLaTeX-mode(它们的意思是相同的),无需更改 auto-mode-alist,并使用 LaTeX-mode-hook 钩子来连接到 AucTeX。
设置 AucTeX 可能会让人感到困惑,因为它使用 advice 来覆盖 Emacs 对 TeX 和其相关工具的内置支持。
因此,在从 ELPA 安装 AucTeX 后,您应该在 C-h f latex-mode 中看到以下内容:
This function has :override advice: ‘TeX-latex-mode’.

对于其他所有的tex模式也是如此,不过AucTeX覆盖的模式列表取决于TeX-modes变量的值。

LaTeX-mode函数在AucTeX中已经不存在了吗?它在Emacs核心中定义,并带有一条关于兼容性的神秘注释。

;; The following three autoloaded aliases appear to conflict with
;; AUCTeX.  However, even though AUCTeX uses the mixed case variants
;; for all mode relevant variables and hooks, the invocation function
;; and setting of `major-mode' themselves need to be lowercase for
;; AUCTeX to provide a fully functional user-level replacement.  So
;; these aliases should remain as they are, in particular since AUCTeX
;; users are likely to use them.
;; Note from Stef: I don't understand the above explanation, the only
;; justification I can find to keep those confusing aliases is for those
;; users who may have files annotated with -*- LaTeX -*- (e.g. because they
;; received them from someone using AUCTeX).

;;;###autoload
(defalias 'TeX-mode #'tex-mode)
;;;###autoload
(defalias 'plain-TeX-mode #'plain-tex-mode)
;;;###autoload
(defalias 'LaTeX-mode #'latex-mode)

在2021年,这意味着您不需要更改auto-mode-alist即可使用AucTeX;只需安装它就足以覆盖Emacs的内置功能。遗憾的是,还有一个令人困惑的最后一点。尽管LaTeX-mode现在基本上只是对latex-mode的无用别名,但事实证明,覆盖latex-mode的AucTeX中的代码不会调用latex-mode-hook(它调用LaTeX-mode-hook,这是不同的)。因此,LaTeX-变量仍然有用,它们是AucTeX的变量(与Emacs内置的小写变量不同)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接