上下文相关的关键字颜色(列表)。关于(滥用)使用“其他关键字”的问题

上下文相关的关键字颜色(列表)。关于(滥用)使用“其他关键字”的问题

我发现很难表述这个问题简要地。因此,我将尝试以这样一种方式构建它,至少我会问它清楚地

我的问题具体到:LaTeX 包中的“otherkeywords”:“listings”。


我的问题的背景是:我尝试创建一个规则来语法高亮代码(语言在今天并不重要,我想要一个原则/“概念证明”)。具体来说,我想强调变量、函数和方法之间的区别。原因是它们可能同名(例如全局函数、类方法和类常量)。

考虑以下虚构语言,其中“打印”显然具有三种不同的含义。

print 'HelloWorld'
my_class.print()
my_class::print

我的解决方案产生了如下所示的 LaTeX 输出(这说明了我的想法“不同含义,相同名称”)。当我第一的将“.print”和“::print”定义为“其他关键字”,并且之后使用“更多关键字”在不同的“classoffset”中重新定义它们。问题是我无法解释为什么这会产生我想要的输出(请参阅\lstdefinestyleLaTeX 代码中的语言定义)。

LaTeX 输出


我的问题是:

  1. “otherkeywords” 是否总是与最低的“classoffset” 相链接,如果是,它是否仅仅是“keywords” 的扩展?
  2. 为什么在“otherkeywords”中定义“.print”和“::print”后,可以在“morekeywords”中使用它们?(我的逻辑决定“。”和“:”仍然应该是“其他”字符。)

对于那些有兴趣回顾我的步骤的人来说:

使用下面的 LaTeX 文件生成前面显示的输出。

\documentclass{standalone}
\usepackage{xcolor,listings}

% Define Dummy (empty) language
\makeatletter
\lst@definelanguage{prettyprint}%
{%
}[keywords]
\makeatother

\lstdefinestyle{PRETTYPRINT}{
  language=prettyprint,%
  classoffset=0,%
    keywordstyle=\color{red!70!brown}\ttfamily,%
    morekeywords={print},%
    otherkeywords={.print,::print},%
  classoffset=1,%
    keywordstyle=\color{cyan!80!black}\ttfamily,%
    morekeywords={.print},%        
  classoffset=2,%
    keywordstyle=\color{orange!90!black}\ttfamily,%
    morekeywords={::print},%
}

\lstnewenvironment{print}{%
  \lstset{style=PRETTYPRINT}
}{}


\begin{document}
\begin{minipage}{5cm}
This is a hack...
\begin{print}
print 'HelloWorld'
my_class.print()
my_class::print()
\end{print}
\end{minipage}
\end{document}

感谢您一直关注到最后。如果您对我的问题有答案、有替代方法的想法或任何其他建议/意见,请发表评论。

附注二:我已阅读文档,并且我知道自己不是应该在多个列表中使用一个关键字。此外,尽管我知道还有其他选择,但我还是“坚决”使用 listings 包。

答案1

在 的世界中listings,主要有三类人物:数字, 和其他. (它不是发音或形容词,而是一个名为o--H--r(字面意思)。手册上说,所有关键字(应该)由一个字母和字母数字字符组成。也就是说aba2是好的关键字121b1?a?!b!2, 和!?不是关键词。

那么,是什么让其他有什么特别的?答案是其他s 用于分隔标记。在您的示例中,我们将其识别print为方法/函数,因为它由./::和分隔()。否则,如果.:所以我们只能看到两个标记,即my_class.print()my_class::print

在这个例子中,只有第二个bar是粗体,因为listings设置alsoletter={.},[5.0]Lua

\begin{lstlisting}[language={[5.0]Lua},morekeywords={bar}]
    foo.bar
    foo:bar
\end{lstlisting}

但有时我们确实需要给这些符号上色。因此listings允许写otherkeywords={=>}。请注意,第二个bar仍然是粗体 --- 因为listings仍然=认为其他

\begin{lstlisting}[language={Haskell},morekeywords={bar}]
    foo=>bar
    foo<=bar
\end{lstlisting}

otherkeywords不支持班级编号在您的示例中,

classoffset=2,
keywordstyle=\hakuna,
morekeywords={matata},

相当于keywordstyle=[2]\hakuna,意味着适用\hakuna于所有第二类关键字,并且morekeywords=[2]{matata},意味着添加matata作为第二类关键字

但是,正如您的问题 1 一样,没有otherkeywords=[2]语法。

对于问题 2,很难说清楚为什么有用剩下的是我的猜测:写作morekeywords=[3]{Aal::Izz.Well}将使listings添加Aal::Izz.Well成为三级关键词。但listings在解析代码时不会看到此关键字,因为正如我所解释的那样,其他s 分隔标记。但是,在读取之后,otherkeywords={Aal::Izz.Well}强制listings查看并进行进一步检查。Aal:

您可以尝试以下方法:

\lstnewenvironment{print}{%
    \lstset{style=PRETTYPRINT}
    \tracingmacros1
    \lstset{morekeywords=[1]{Aal::Izz.Well}}
    \tracingmacros0
    \lstset{otherkeywords={Aal::Izz.Well}}
}{}

发现即使otherkeywords将关键字添加到头等舱后者似乎是在三等舱。(猜猜为什么~~)

相关内容