如何在样式文件(lstlang0.sty)中定义颜色

如何在样式文件(lstlang0.sty)中定义颜色

根据listings软件包文档,我在与 .tex 文件(好吧,.lyx 文件)相同的目录中有一个文件lstlang0.sty,它定义了一种新语言。我以前在序言中有过这种语言定义,但由于现在至少有四份文档使用它,所以我非常想将其保留为单独的样式文件。

我已经定义了颜色来提供语法突出显示,但事情却在这里挂起了。

此块之前位于我的序言中,现在位于我的lstlang0.sty文件中。请注意,它在序言中使用lstdefinelanguage(没有“@”)。此外,为了方便起见,我删去了大部分关键字。

\lst@definelanguage[CR]{Basic}{%
  basicstyle={\ttfamily\footnotesize},%
  sensitive=false,%
  upquote=true,%
  string=[bd][\color{crbString}]{"},%
  showstringspaces=false,%
  morekeywords=[1]{Const, Public, <snip> ...},%
  keywordstyle={[1]{\color{crbKeyword}}},%
  otherkeywords={=, /, *, +, -, *=, /=, +=, -=, <<, >>, ^, <, >},%
  morekeywords=[2]{=, /, *, +, -, *=, /=, +=, -=, <<, >>, ^, <, >},%
  keywordstyle={[2]{\color{crbKeyword}}},%
  morecomment={[l][\color{crbComment}\ttfamily\itshape]{'}}%
}
\endinput

只要颜色(,,)定义正确,编译crbKeywordcrbString可以crbComment正确在序言中尝试在样式文件中定义它们,如下所示:

\definecolor{crbString}{RGB}{255,0,255}
\definecolor{crbKeyword}{RGB}{0,0,255}
\definecolor{crbComment}{RGB}{0,128,128}
\lst@definelanguage[CR]{Basic}{%
  ...

给出了一长串错误:

LaTeX Error: Undefined color 'crbKeyword'.
LaTeX Error: Undefined color 'crbKeyword'.
LaTeX Error: Undefined color 'crbComment'.
...

我尝试\RequirePackage{color}在样式文件中添加上述颜色定义,但 LaTeX 首先会提示“只能在序言中使用”,然后出现相同的未定义颜色错误。使用 包围颜色定义会\AtBeginDocument{..}产生相同的结果。

我需要改变什么才能获得颜色定义lstlang0.sty


我确实注意到其他listings语言定义都没有包含语法着色。有什么(技术)原因吗?

答案1

尽管使用了文件扩展名,但语言定义文件.sty并不是常规包,因此除了\lst@definelanguage命令之外,您不能在其中放置任何东西。相反,对于其他与 LaTeX 代码相关的列表,例如您的颜色定义,您应该使用该listings.cfg文件。

因此将颜色定义放在那里,一切都会按您预期的方式工作。

如果您只希望这些定义适用于特定语言(在您的例子中是 Basic),则可以将它们放入名为的文件中listings-<language>.prf,然后在lstlocal.cfg文件中添加\input{listings-<language>.prf}。 这两个文件都可以放在listings本地texmf目录内的目录中。

因此,为了更明确您的特定示例,您可以创建以下文件:

listings-basic.prf

\definecolor{crbString}{RGB}{255,0,255}
\definecolor{crbKeyword}{RGB}{0,0,255}
\definecolor{crbComment}{RGB}{0,128,128}
\endinput

本地配置文件

\input{listings-basic.prf}

或者简单地将定义直接放入lstlocal.cfg,它们将可用于任何使用它们的语言定义。

相关内容