我发现很难表述这个问题简要地。因此,我将尝试以这样一种方式构建它,至少我会问它清楚地。
我的问题具体到:LaTeX 包中的“otherkeywords”:“listings”。
我的问题的背景是:我尝试创建一个规则来语法高亮代码(这语言在今天并不重要,我想要一个原则/“概念证明”)。具体来说,我想强调变量、函数和方法之间的区别。原因是它们可能同名(例如全局函数、类方法和类常量)。
考虑以下虚构语言,其中“打印”显然具有三种不同的含义。
print 'HelloWorld'
my_class.print()
my_class::print
我的解决方案产生了如下所示的 LaTeX 输出(这说明了我的想法“不同含义,相同名称”)。当我第一的将“.print”和“::print”定义为“其他关键字”,并且之后使用“更多关键字”在不同的“classoffset”中重新定义它们。问题是我无法解释为什么这会产生我想要的输出(请参阅\lstdefinestyle
LaTeX 代码中的语言定义)。
我的问题是:
- “otherkeywords” 是否总是与最低的“classoffset” 相链接,如果是,它是否仅仅是“keywords” 的扩展?
- 为什么在“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(字面意思)。手册上说,所有关键字(应该)由一个字母和字母数字字符组成。也就是说ab
,a2
是好的关键字12
,1b
,1?
,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
将关键字添加到头等舱后者似乎是在三等舱。(猜猜为什么~~)