Emacs Auctex自定义语法高亮

6

我想强调一下我在LaTeX中创建的新命令:

\newcommand{\conceito}[3]{
  \subsection{#1} (Original: \textit{#2} #3).
}

我是这样使用这段代码的:

\conceito{Foo}{Bar}{Bla}

我按照手册中的步骤,将这段代码放入~/.emacs文件中,但它并没有生效:

(add-hook 'LaTeX-mode-hook
    (lambda ()
        (font-lock-add-keywords nil
          '((""\\<\\(\\conceito)\\>"" 1 font-lock-warning-face t)))))

有什么问题吗?

2个回答

6

编辑:Deokhwan Kim 最初指出您的正则表达式包含连续的两个双引号,并且右括号 ) 也需要用双引号进行转义:

(add-hook 'LaTeX-mode-hook
    (lambda ()
        (font-lock-add-keywords nil
          '(("\\<\\(\\conceito\\)\\>" 1 font-lock-warning-face t)))))

除了Deokhwan Kim指出的要点外,还有以下两个问题:
  • 在'conceito'之前需要四个反斜杠:\\\\conceito

  • 反斜杠序列\\<只在单词开头匹配空字符串,然而,在您的新LaTeX命令开头的反斜杠不被视为单词的一部分,因此\\<无法匹配。

请尝试使用以下内容:

(add-hook 'LaTeX-mode-hook
    (lambda ()
        (font-lock-add-keywords nil
            '(("\\(\\\\conceito\\)\\>" 1 font-lock-warning-face t)))

编辑:Deokhwan Kim提出了另一个好的观察,即在这种情况下,您实际上根本不需要括号,因为您尝试匹配整个表达式。因此,最后一行的替代方案可以是:

'(("\\\\conceito\\>" 0 font-lock-warning-face t)))))

关于括号的问题是正确的,但你实际上可以扩展你的正则表达式,仅在单词“conceito”后面跟随左花括号{时才匹配。但是,由于你不想突出显示那个括号,因此使用由括号定义的子组是正确的方法:

(add-hook 'LaTeX-mode-hook
    (lambda ()
        (font-lock-add-keywords nil
            '(("\\(\\\\conceito\\)\\s-*{" 1 font-lock-warning-face t)))

请注意,由于我们正在测试直接跟在“conceito”后面的{(除非有空格),我们不再需要测试\\>

一般来说,尝试使用M-x re-builder交互式地创建正则表达式:您可以在一个小缓冲区中编辑新的正则表达式,并立即查看从中调用re-builder的缓冲区中高亮显示的内容。

记录一下,在我删除的帖子中,我指出了一些错误,比如问题中正则表达式中连续的双引号 "" 和缺少 ) 前面的 \\。但是 Thomas 告诉我还有其他问题存在,并且我的解决方案不够完善。因此,我删除了我的帖子以避免任何麻烦。 - dkim
干得好!还有一个建议是,在最后一个例子中,最好不要使用\\s-*。在LaTeX中,参数应该紧跟在宏的后面,它们之间不应该有任何空格,对吗? - dkim
@Deokhwan Kim - 不,命令和 { 之间的空格是可以的。 - Thomas
糟糕,我到目前为止误解了它。再次感谢! - dkim

3
GNU AUCTeX内置了一种定义自定义宏高亮的方法。请查看变量font-latex-user-keyword-classesAUCTeX文档。以下是一个简单的示例(我的配置):
(setq font-latex-user-keyword-classes
      '(("shadow-hidden"    (("hide" "{"))      shadow command)
        ("shadow-mycomment" (("mycomment" "{")) shadow command)
        ("shadow-comment"   (("comment" "{"))   shadow command)))

这将展示\hide{}、\mycomment{}和\comment{}宏的内容在暗淡的阴影面中。


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