列表中 otherkeywords 选项的正确使用

列表中 otherkeywords 选项的正确使用

我试图了解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={<,>,-,*}不会对输出产生任何影响。

有人能对这里发生的事情提供更多见解吗?我很想说这是一个错误,或者至少文档中缺少一些额外的信息。不幸的是,调试宏扩展太冗长,无法遵循确切的程序。

相关内容