Sublime Text + LaTeXTools 语法高亮显示自定义命令?

Sublime Text + LaTeXTools 语法高亮显示自定义命令?

我有一个自定义命令,经常用它来注释掉源文件的块,定义如下:

\newcommand{\comment}[1]{}

在 Sublime Text(使用 LaTeXTools)中,此命令会关闭语法高亮:在\comment{文件的第一个块的开头,所有内容开始均匀地变灰,这是应该的,但这种情况永远不会停止;它会一直持续到结束},直到文件的其余部分。一切都编译正常;只是高亮无法正常恢复。

我希望\comment{ }块完全变灰,就像现在这样,但关闭后恢复正常突出显示。有没有办法让 Sublime Text 和 LaTeXTools 做到这一点?

答案1

首先,我想我应该说这是我第一次在文件中编写代码.sublime-syntax,所以我很可能犯了一些初学者错误,或者我的解决方案不是最佳的。然而,我发现你的问题很有趣,经过一番研究,我找到了一个似乎对我有用的解决方案。

语法高亮由LaTeX.sublime-syntax,因此要修改高亮的行为,首先要做的是访问此文件。最简单的方法是使用包资源查看器,可以使用 Package Control 安装。然后您可以使用该Open Resource工具找到该文件,该文件应该位于 LaTeX 文件夹中。

打开LaTeX.sublime-syntax文件后,需要进行两项更改。首先,您必须删除代码中在\comment{检测到命令时立即关闭所有语法突出显示的部分。这部分代码应紧跟在命令之后pkgcomment:,应该是以下内容

- match: '^(\\)comment\b'
  captures:
    0: punctuation.definition.comment.start.latex
    1: punctuation.definition.backslash.latex
  push:
    - meta_scope: meta.environment.comment.latex comment.block.command.comment.latex
    - match: '^(\\)endcomment\b'
      captures:
        0: punctuation.definition.comment.end.latex
        1: punctuation.definition.backslash.latex
      pop: true

由于我远非文件方面的专家,因此我强烈建议直接注释掉该部分代码,以防万一发生任何意外。通过在每行开头sublime-syntax放置一个,可以注释掉每行。#

一旦删除了“坏”代码,剩下的任务就是添加命令以注释掉\comment{命令和下一个命令之间的内容}。为此,您可以在文件开头的- include: comment行后prototype:部分中添加一个新段落。如果我理解得没错,将其放在此部分中会为命令提供更高的优先级,以便它也可以在数学模式下工作。

以下代码对应于文件的开头,其中包含我添加的代码,用于定义命令的突出显示\comment。新代码在注释中指出。

name: LaTeX
file_extensions:
  - tex
  - ltx
scope: text.tex.latex
contexts:
  prototype:
    - include: comments
    # The following paragraph is a replacement to the commented code block in the pkgcomment section.
    - match: '(\\)comment(\{)'
      scope: support.function.general.latex
      captures:
        0: punctuation.definition.comment.start.latex
        1: punctuation.definition.backslash.latex
      push:
        - meta_content_scope: meta.environment.comment.latex comment.block.command.comment.latex
        - match: '(\{)'
          push: comment_braces
        - match: '(\})'
          captures:
            0: punctuation.definition.comment.end.latex
            1: punctuation.definition.backslash.latex
          pop: true

  # this is used to assert that the commented section ends with the corresponding }.
  comment_braces:
    - match: '(\{)'
      push: comment_braces
    - match: '(\})'
      pop: true

此代码应跟在main:部分后面。

经过这些更改,当我\comment{some random text}在 LaTeX 文件中写入时,该\comment{部分看起来与任何其他常规命令相同,在达到some random text匹配之前,会突出显示为注释}。它也适用于数学模式,并且如果在 的参数中放置其他括号\comment{}

相关内容