根据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
只要颜色(,,)定义正确,编译crbKeyword
就crbString
可以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
,它们将可用于任何使用它们的语言定义。