33

如果我使用 lstlisting 的内联版本,如图所示:

\lstinline{!$omp parallel for}

vim 中的语法高亮出现错误,latex 文件的其余部分被涂成红色,就好像它是代码清单的一部分一样。$导致问题的是美元。我怎样才能避免这种情况?

4

8 回答 8

29

让我们最终一劳永逸地解决这个问题!

我给 的维护者 Charles E. Campbell 发了邮件tex.vim,建议他为 Listing 包添加高亮规则。然而事实证明,缺乏对列表包的支持tex.vim实际上是故意的。推理可以找到:h tex-package。简而言之,您应该创建自己的扩展语法突出显示规则(见帖子底部):

Tex:想要突出显示更多命令?

LaTeX 是一种可编程语言,因此有成千上万个包,其中包含专门的 LaTeX 命令、语法和字体。如果你正在使用这样的包,你会经常希望分布式的 syntax/tex.vim 支持它。然而,显然这是不切实际的。所以请考虑使用 mysyntaxfile-add 中的技术来扩展或修改 syntax/tex.vim 提供的突出显示。请考虑将您编写的任何扩展(通常位于 $HOME/after/syntax/tex/[pkgname].vim 中)上传到 http://vim.sf.net/

我个人认为它没有被包括在内有点不幸,因为它肯定会增加普通用户使用 Vim 编写他或她的 LaTeX 的门槛。lstlisting为等查找和添加语法高亮显示lstinline并不容易。在查看此线程时,它看起来也不会很快改变。

DevSolar 似乎已经找到了它(感谢我的功劳!),但 Campbell 提供了几个示例 LaTeX 包支持 vimballs。第一个,lstlisting.vba.gzlstlisting ,包括和的突出显示规则lstinputlisting。但是,它确实缺少lstinline本主题的主题。

最后,这是我listings.vim居住的地方$HOME/.vim/after/syntax/tex/

syn region texZone start="\\begin{lstlisting}" end="\\end{lstlisting}\|%stopzone\>"
syn region texZone  start="\\lstinputlisting" end="{\s*[a-zA-Z/.0-9_^]\+\s*}"
syn match texInputFile "\\lstinline\s*\(\[.*\]\)\={.\{-}}" contains=texStatement,texInputCurlies,texInputFileOpt

-

正确突出显示逐字、lstlisting 和 lstinline 环境。

这似乎是首选的解决方案。它不需要更改系统范围的文件/usr/share/vim/..,您不必下载和获取 vimball 或更改环境,而不需要修复语法突出显示本身。我可能会考虑将其作为一个简单的插件发布,以使其更易于访问。

最后,请记住检查您是否确实在运行tex文件类型,而不是plaintex缺少太多而无法使用的文件类型。已经在上面的评论中发布了这个,但是可以在我添加到 LaTeX-Box的票中找到更多信息。

于 2014-02-08T20:16:28.300 回答
6

这并不是真正的错误——这是设计使然。为了正确突出这一点,Vim 必须解析和解释整个 TeX 文档,直到出现这段代码,因为 TeX 是一种上下文相关的语言。对于语法高亮插件来说,这既太复杂又太耗时。

唯一可以接受的解决方法是从头开始重写语法高亮,使用一个完整的 TeX 实现,它为源代码中的每个标记发出元信息。这是一个巨大的工程。据我所知,目前没有可用的 TeX 实现提供这样的信息,这意味着真的必须自己编写。

于 2011-08-27T16:00:46.233 回答
6

在我看来,最初的问题是 tex 文件的其余部分以混乱的语法突出显示。所以也许简单可行的解决方案可能是使用

%stopzone

在 lstlisting-Region 之后。

于 2014-05-28T07:38:59.967 回答
4

这对我有用:

\lstinline[mathescape]{!$\$$omp parallel for}

据我了解,它在数学模式下排版美元符号,但我看不到任何明显的差异。

于 2012-06-09T11:48:30.650 回答
3

我在 tex 文件中为 knitr 插入 R 命令时遇到了类似的问题。我有很多$和其他特殊字符\rinline{}。我修复了它,以便 Vim 忽略此命令中的文本。

你想编辑 tex.vim 文件,在我的发行版上是sudo vim /usr/share/vim/vim73/syntax/tex.vim

大约在 第 228 行:

syn match texInputFile      "\\\(epsfig\|input\|usepackage\)\s*\(\[.*\]\)\={.\{-}}"     contains=texStatement,texInputCurlies,texInputFileOpt

改成:

syn match texInputFile      "\\\(epsfig\|input\|usepackage\|rinline\)\s*\(\[.*\]\)\={.\{-}}"        contains=texStatement,texInputCurlies,texInputFileOpt

...或为lstinline

syn match texInputFile      "\\\(epsfig\|input\|usepackage\|lstinline\)\s*\(\[.*\]\)\={.\{-}}"      contains=texStatement,texInputCurlies,texInputFileOpt
于 2013-08-28T16:56:22.770 回答
1

根据timss的回答,创建一个名为~/.vim/after/syntax/tex/listings.tex并添加以下规则的文件。替换YOURENV为您要为其突出显示异常的环境!

syn region texZone start="\\begin{YOURENV}" end="\\end{YOURENV}\|%stopzone\>"

下次您使用现有.tex文件打开 Vim 时,现在应该会自动加载此规则。

添加规则前后的高亮截图

于 2020-12-02T14:31:34.833 回答
0

我没有这个问题。我正在使用 filetype=tex 运行 Vim 7.3.46。(我的默认为 .tex 文件上的“plaintex”;您可能想使用 :set ft 检查文件类型?)

于 2011-08-25T23:32:16.183 回答
0

通过 timss 在 user1174052 的回答中发布的链接,我找到了 Dr Chip 的 Vim Page,它提供了lstlisting.vba.gz Vimball 插件。下载,在 Vim 中打开...

vim lstlisting.vba.gz

...执行 vimball ...

:so %

...下次打开 LaTeX 文件时,lstlisting语法突出显示会完全忽略环境的内容。

归功于用户 timss,他发布了 LaTeX-Box 票的链接,他还发布了 Chip 博士页面的链接。我仅将此答案添加为“直接链接”快捷方式。

于 2014-01-14T13:07:28.407 回答