我试图了解listings
'otherkeywords
选项的实际工作原理。文档对此进行了说明:
定义包含其他字符或以数字开头的关键字。每个给定的“关键字”都以关键字样式打印,但不改变字符的“字母”、“数字”和“其他”状态。此键用于定义关键字,如
=>
、->
、-->
、--
、::
等。如果一个关键字是另一个关键字的子序列(如--
和-->
),则必须先指定较短的那个。
此外,关键字被定义为一个“字母”后跟一系列“字母”或“数字”字符。
我们来看一个例子。
\documentclass{article}
\usepackage{listings}
\usepackage{xcolor}
\lstdefinelanguage{mylang}{
% alsodigit={<,>,-,*},
otherkeywords={<,>,-,<-,->,<->,<--,-->,***},
morekeywords=[1]{-},
morekeywords=[2]{<,>,<-,->},
morekeywords=[3]{<->,<--,-->,***}
}
\begin{document}
\lstset{
language={mylang},
basicstyle=\ttfamily,
keywordstyle=[1]{\color{red}},
keywordstyle=[2]{\color{green}},
keywordstyle=[3]{\color{blue}}
}
\begin{lstlisting}
- red
< > <- -> green
<-> <-- --> *** blue
\end{lstlisting}
\end{document}
第一行的输出看起来不错,-
应该被视为 1 类关键字并以红色打印。
在第二行,混乱开始了。<
和>
正确地以绿色打印,但<-
和->
不是。文档(如上所述)说,作为其他关键字子序列的关键字应该首先定义。这正是示例代码中所做的,输出仍然是错误的。
即使listings
会错误地分解<-
为<
和-
,我仍希望第一个<
打印<-
为绿色。但它也打印为红色,这确实令人困惑,因为它<
从未出现在第 1 类中。
第三行也是错误的,除了***
关键字,这可能是因为无论是*
还是都没有**
作为单独的关键字出现。
如果我们不跳过otherkeywords
描述中的第一行,尤其是“或以数字开头”部分,将 、<
和>
更改-
为“数字”字符应该可以满足文档要求的所有条件。但是,添加alsodigit={<,>,-,*}
不会对输出产生任何影响。
有人能对这里发生的事情提供更多见解吗?我很想说这是一个错误,或者至少文档中缺少一些额外的信息。不幸的是,调试宏扩展太冗长,无法遵循确切的程序。