Emacs Auctex 自定义语法突出显示



我想强调一下我在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)))))

怎么了?

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

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

除了金德焕指出的要点外,还有以下两个问题:

    你需要四个反斜杠
  • ,而不是"自负"前面的两个反斜杠:\\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 重新构建器以交互方式制作正则表达式:您可以在一个小缓冲区中编辑新的正则表达式,并立即查看您从中调用重新构建器的缓冲区中突出显示的内容。

GNU AUCTeX 有一种内置的方式来定义用户定义的宏的自定义突出显示。 查看变量font-latex-user-keyword-classes和 AUCTeX 文档。

这是一个简单的例子(我的配置):

(setq font-latex-user-keyword-classes
      '(("shadow-hidden"    (("hide" "{"))      shadow command)
        ("shadow-mycomment" (("mycomment" "{")) shadow command)
        ("shadow-comment"   (("comment" "{"))   shadow command)))

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

最新更新