当使用可选参数时,如何修复 AucTeX 的 lstlisting 环境的语法高亮?

当使用可选参数时,如何修复 AucTeX 的 lstlisting 环境的语法高亮?

标题确实说明了一切,因此我将提供一个示例和一个屏幕截图:

输出

\documentclass{article}
\usepackage{listings}
\begin{document}
For example, if we wished to create a predicate
  to determine if a node could mark itself
  (considering the \Algorithm{IndSet} problem),
  we could put~\autoref{lst:logic:pred-def}
\begin{lstlisting}[
float,
caption={caption}
label={label}
]
marked = v['marked']
neighbor_marked = any(map(lambda n: n['marked'], N))
return not (marked or neighbor_marked)
\end{lstlisting}
\end{document}

值得注意的是,Emacs 无法找到用于结束的开启器]

答案1

带有可选参数的逐字环境的语法突出显示已修复上游自 AUCTeX 11.88 起,开箱即用。不再需要应用我之前在原始答案中建议的 hack(见下文)。

如果你有文件解析启用(无论如何都强烈推荐,以便利用 AUCTeX 的所有功能)并且listings在您的文档中加载包,AUCTeX 将自动识别lstlisting为逐字环境并正确突出显示它,包括可选参数。

在此处输入图片描述

如果可选参数(例如语言的方言)中有一对括号,这也有效:

在此处输入图片描述

或者如果后面的换行符被一个字符\begin{environment}注释掉%

在此处输入图片描述


原始答案(仅适用于 AUCTeX 11.87 或之前的版本)

在函数内部font-latex-set-syntactic-keywords,定义在font-latex.el,替换

(add-to-list 'font-latex-syntactic-keywords
             `(,(concat "^[ \t]*\\\\begin *{\\(?:" verb-envs
                        "\\)}.*\\(\n\\)")
           (1 "|" t)))

(add-to-list 'font-latex-syntactic-keywords
         `(,(concat
         "^[ \t]*\\\\begin *{\\(?:" verb-envs "\\)}[\t ]*\\(?:%.*\n[\t ]*\\)?"
         "\\(?:\\[[^\]\[]*\\(?:\\[[^\]\[]*\\][^\]\[]*\\)*\\]\\)?"
         "\\(\n\\)")
           (1 "|" t)))

答案2

StackExchange 上的这篇文章中有一个更好的解决方案这里

只需添加

(setq LaTeX-verbatim-environments-local '("Verbatim" "lstlisting"))

到您的 .emacs 文件,使 AUCTeX 被视为lstlisting逐字处理。它对我来说效果很好,无需破解auctex-package 源。

相关内容