繁体   English   中英

Emacs Auctex自定义语法高亮

[英]Emacs Auctex custom syntax highlight

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

除了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”之后(除非两者之间有空格),我们根本不需要对\\\\>进行测试。

通常,尝试使用Mx重构器以交互方式创建正则表达式:您可以在小缓冲区中编辑新的正则表达式,并立即查看缓冲区中突出显示的内容,从中调用重构器。

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 {}宏的内容。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM