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)))))

怎么了?

4

2 回答 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”之后的 a(除非中间有空格),因此我们根本不需要测试\\>

通常,尝试M-x re-builder以交互方式制作正则表达式:您可以在一个小缓冲区中编辑一个新的正则表达式,并立即查看您调用重新构建器的缓冲区中突出显示的内容。

于 2012-08-07T14:40:54.223 回答
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{} 宏的内容。

于 2014-01-28T10:18:43.283 回答