【问题标题】:Configuring emacs for latex - void-variable LaTeX-mode-hook为乳胶配置 emacs - void-variable LaTeX-mode-hook
【发布时间】:2012-06-06 17:47:29
【问题描述】:

this pdf document 之后,我将以下内容添加到我的~/.emacs 文件中:

(load "auctex.el" nil t t)
(setq TeX-auto-save t)
(setq TeX-parse-self t)
(setq TeX-PDF-mode t) ;; .pdf statt .dvi per default:
;;Zeilenumbruch
;;(add-hook ’LaTeX-mode-hook ’turn-on-auto-fill)
;;Syntax Higlight
(add-hook ’LaTeX-mode-hook ’turn-on-font-lock)
;; Mathe Modus
(add-hook ’LaTeX-mode-hook ’LaTeX-math-mode)
;; Reftex einflechten und laden
(setq reftex-plug-into-AUCTeX t)
(add-hook ’LaTeX-mode-hook ’turn-on-reftex)
;; Satzende ". " statt ". ". " fuer M-k: loeschen bis Satzende usw.
;;(setq sentence-end "[.?!][]\"’)}]*\\($\\| \\| \\)[
;;]*") ;; Da ist ein "Newline in der Zeile!"
;;(setq sentence-end-double-space nil)
;;direkte Rechtschreib Korrektur:
;;(add-hook ’LaTeX-mode-hook ’flyspell-mode)
;; Nur benutzen falls Auctex > 11.81 mit preview-latex:
(load "preview-latex.el" nil t t)
;; aspell ist besser als ispell.
;; Zeile kommentieren, falls nicht installiert:
(setq-default ispell-program-name "aspell")
;; Deutsche Rechtschreibung falls \usepackage{ngerman}
;; oder german benutzt wird
(add-hook ’TeX-language-de-hook
(function (lambda () (ispell-change-dictionary "german8"))))

不幸的是,emacs 现在没有启动,而是报错

Warning (initialization): An error occurred while loading `/home/../.emacs':

Symbol's value as variable is void: ’LaTeX-mode-hook

To ensure normal operation, you should investigate and remove the
cause of the error in your initialization file.  Start Emacs with
the `--debug-init' option to view a complete error backtrace.

当以--debug-init 开头时,它会提供以下信息

Debugger entered--Lisp error: (void-variable ’LaTeX-mode-hook)
  (add-hook ’LaTeX-mode-hook ’turn-on-font-lock)
  eval-buffer(#<buffer  *load*> nil "/home/../.emacs" nil t)  ; Reading at buffer position 812
  load-with-code-conversion("/home/../.emacs" "/home/../.emacs" t t)
  load("~/.emacs" t t)
...

我尝试改用latex-mode-hook。我搜索了一个解决方案,但我似乎是唯一遇到这个问题的人。

我正在使用带有最新 Emacs 和 Auctex 的 Ubuntu 12.04。如果需要,我会发布版本信息,但我宁愿认为必须将某些内容添加到配置中,或者必须安装任何软件包。

如何让 emacs 使用该配置?

【问题讨论】:

  • 如果您在.emacs 中仅包含(load "auctex.el" nil t t) 会发生什么情况?似乎由于某种原因 AucTeX 没有被加载。如果您在 Emacs 菜单中没有看到 LaTeX 的条目,那么 AucTeX 没有被加载。
  • @rvf0068 如果我不包含(load "auctex.el" nil t t),我可以在Emacs 中看到LaTeX 菜单。当在我的.emacs 中包含该行时,Emacs 也启动时没有任何错误。如果我包含该行,LaTeX 菜单就会消失。
  • 好的,那么 auctex 包可能会将初始化 AucTeX 所需的行添加到一些全局(或特定于 Debian)的 Emacs 初始化文件中。如果您只将(add-hook ’LaTeX-mode-hook ’LaTeX-math-mode) 添加到您的.emacs,会发生什么情况?你可以使用 AucTeX 吗? (也就是说,LaTeX 文件中的C-c C-c 是否提供编译文件?)
  • 我尝试添加(add-hook ’LaTeX-mode-hook ’LaTeX-math-mode),但给出了同样的错误。然后正如答案中提到的,我尝试添加(add-hook 'LaTeX-mode-hook 'LaTeX-math-mode),它没有给出错误。

标签: emacs configuration latex auctex


【解决方案1】:

您是否使用了错误的单引号字符?它似乎是某种反向引用,而不是普通的单引号。试试

'LaTeX-mode-hook

而不是

’LaTeX-mode-hook

(对于该字符的所有其他出现也是如此)。

【讨论】:

  • 天哪! 感谢的回答,它解决了问题 - 至少 Emacs 启动时没有错误。现在我可以利用周末来玩这些功能了。
【解决方案2】:

正如Thomas 所说,后引号不是您要在此处使用的字符,它应该是单引号。但是,一般来说,如果你得到“symbol's value as variable is void”的错误,这意味着与其他语言中的NPE(空指针异常)相同。检查问题的方法是这样的:

移动指向给出问题的变量和 C-h v(或M-x describe-variable [不带引号的变量名称])。您可以在键入时使用 TAB 来完成变量名称,以查看您是否偶然没有输入错误。 一旦你看到描述变量的缓冲区 - 你就知道你已经修复了错误。

现在,如果您通过 auctex.el 设置了 LaTeX 模式,那么 latex-mode-hook 必须存在。但是,您需要确保 auctex.el 实际加载并需要 latex-mode。它这样做的方式不是 Emacs 的惯用方式,大多数时候您将模式的源文件添加到 load-path 变量然后 (require 'mode-name) 或在 Emacs 打开类型后有条件地加载模式通过autoload 与它关联的文件(使 Emacs 的启动时间更短)如下所述:Emacs: Best-practice for lazy loading modes in .emacs?

但是,每当您看到名为[something]-mode-hook 的变量时,这意味着这是您要在[something] 模式加载时调用的函数列表。如果[something] 模式完全存在,那么变量也存在的可能性为 99.99%(不能为空)。因此,如果它 无效 - 您需要确保它在所有负载时都属于该模式。

【讨论】:

  • 感谢您的进一步解释。我认为这会在将来再次看到此类错误时对我有所帮助:)