我在 emacs 中输入 tex 文档中的引号时遇到了一个非常奇怪的问题。我是一名编辑,所以我从出版商那里收到 tex 源文件并对其进行处理。我在 Ubuntu 14.04 上使用 emacs 24.3.1 和 auctex 11.87 进行工作。
几天前,出现了以下行为:当我"
在源缓冲区中键入双引号键时,emacs 会插入 guillemets\og
和\fg{}
,而不是``
和''
,这"
在 LaTeX 模式下按下时通常会发生。
以下是我所能收集到的信息:
- 这只发生在我从发布商收到的文件中。这不会发生在我机器上现有的 tex 文件上,也不会发生在我创建的新文件中。
- 即使我使用该
emacs -q
命令启动 emacs 也会发生这种情况,因此它不会读取我的.emacs
文件。 - 如果我从命令行将文件复制或移动到另一个位置,这种情况仍然会发生。
- 如果我从命令行将文件复制或移动到另一个位置,然后在 emacs 中删除其内容,仍然会发生这种情况。
- 如果我从 emacs 内部将文件内容复制到新缓冲区中,就不会发生这种情况。
- 如果我删除
.aux
和.log
文件,这种情况仍然会发生。 - 该
"
键与命令绑定TeX-insert-quote
。 TeX-open-quote
变量和的值分别TeX-close-quote
为``
和''
,与往常一样。
由此我得出结论,emacs 正在读取与文件相关的一些我不知道的“秘密”信息。它不在我的设置中,似乎与文件内容无关。
任何想法/建议/修复都非常感谢。
更新:问题消失了一段时间,然后再次出现。根据 giordano 在评论中的建议,我检查了 的值TeX-quote-language
,发现它是:
("french" "\\og "
(lambda nil (concat "\\fg" (unless (member "xspace" TeX-active-styles)"{}"))) nil)
TeX-quote-language-alist
(但是,的值为nil
。)我认为这是由于我需要用于工作的自定义类文件造成的。有没有办法在我的文件中添加一行来.emacs
覆盖此行为?我只想要我的正常引号!
答案1
这是一个不会禁用法语文档中的 guillemets 的解决方案。感谢 Giordano 和 David Carlisle 提供收集信息所需的所有信息。
AUCTeX 认为任何加载您正在使用的类(称为foo.cls
)的文档都是法语的。它认为,因为它已编译foo.cls
成文件(foo.el
或foo.elc
),每次您加载加载该类的文档时,它都会读取该文件。
因此,为了避免出现您所看到的行为,您可以采取以下几种措施之一:
选项 1:删除
foo.el
或foo.elc
。(使用locate
或操作系统的查找器来查找它;如果它位于您没有写入权限的目录中,例如/var/lib/auctex/emacs24
,则您需要具有管理权限。)选项 2:编辑
foo.el
以删除有问题的行(它说francais
因为foo.cls
包含行\RequirePackage[english,francais]{babel}
,尽管在条件分支中。同样,您可能需要具有管理权限。选项 3:如果您无法编辑或删除
foo.el
,请创建您自己的 版本,foo.cls
例如myfoo.cls
,并将其替换\RequirePackage[english,francais]{babel}
为\@nameuse{RequirePackage}[english,francais]{babel}
;然后在您的文档中使用它。(如果您愿意,您可以myfoo.el
通过M-x TeX-auto-generate
在 emacs 中输入来创建。)
最后,当您确实需要处理法语文档并希望插入双引号键时,您可以通过添加到\usepackage[francais]{babel}
序言中来告诉 AUCTeX 文档是法语的。(从 LaTeX 的角度来看,这是多余的,但无害。)
答案2
我找到了一个合理的解决方法这里在 SuperUser 上 (由 giordano 编写)。修复该问题的代码是:
(add-hook 'TeX-language-fr-hook
(lambda ()
(setq TeX-quote-language `("francais" "``" "''" ,TeX-quote-after-quote))))
显然,这并不能解决 AUCTeX 在不需要时进入法国模式的根本问题,但它确实为该问题提供了有效的解决办法。