![为列表包的现有语言添加关键字](https://linux22.com/image/304162/%E4%B8%BA%E5%88%97%E8%A1%A8%E5%8C%85%E7%9A%84%E7%8E%B0%E6%9C%89%E8%AF%AD%E8%A8%80%E6%B7%BB%E5%8A%A0%E5%85%B3%E9%94%AE%E5%AD%97.png)
我想在现有的语言定义中添加更多关键字,以便当我使用时\begin{lstlisting} ... \end{lstlisting}
,新关键字会与预定义关键字一起突出显示。
这个问题已被问过很多次,但我发现没有一个解决方案有效。
让我们回顾一下以前的一些工作:
在这问题,所选答案是要么定义一种新语言,要么为该语言定义一种新样式。但我不想定义一种新语言或样式。我想使用现有的样式向现有语言添加关键字。
在这个其他问题,标记为重复,评论被要求使用
\lstset{language=Lisp, morekeywords={define}}
,但对我而言不起作用。一位评论者告诉 OP 参考手册的第 3.2 节,但其中实际上没有提到任何有关修改现有语言定义的内容。在完后还有问题,解决方案是不设置关键字,而只是告诉包
listings
强调新的单词列表,这意味着您必须将强调样式与关键字样式复制。
如果这些解决方案中的任何一个实际上是正确的,但对我来说不起作用,那么请帮助我指出我做错了什么。这是我的 MWE:
\documentclass{article}
\usepackage{listings}
\begin{document}
Listing 1:
\begin{lstlisting}[language=Haskell, morekeywords={fix}]
fibs = fix ((0:) . scanl (+) 1)
\end{lstlisting}
Listing 2:
\begin{lstlisting}[language=Haskell]
fibs = fix ((0:) . scanl (+) 1)
\end{lstlisting}
\end{document}
如果您处理此文档,您会发现第一个列表已fix
突出显示,而第二个列表未突出显示,因为fix
它不在预定义关键字列表中。使用morekeywords
将其添加到该列表中。
我以为在序言部分(紧接着上面)添加以下内容\begin{document}
会使其适用于所有列表,但事实并非如此。输出与上面的输出相同。
\lstset{language=Haskell, morekeywords={fix}}
您会注意到这与我上面提到的第二个问题中的建议相同。
您如何对所有列表执行此操作?
答案1
为什么morekeywords
似乎不起作用
你的问题源于对morekeywords
关键的误解。与你的想法相反,写作
\lstset{language=Haskell, morekeywords={fix}}
做不是listings
改变“语言”的定义Haskell
。这就是为什么fix
标识符没有在第二个列表中突出显示的原因。
如何修改现有语言
不listings
提供“更新”或修改现有语言的机制。在您提到的三种方法中,第一种方法最有意义。请注意,您不必从头开始重新定义语言;您可以简单地根据现有语言定义自定义语言并进行修改,
\lstdefinelanguage{Haskellana}{%
language = Haskell,
morekeywords = {fix},
}
然后在需要的地方调用它来代替原始语言:
\documentclass{article}
\usepackage{listings}
\lstdefinelanguage{Haskellana}{
language = Haskell,
morekeywords = {fix},
}
\begin{document}
Listing 1:
\begin{lstlisting}[language=Haskellana]
fibs = fix ((0:) . scanl (+) 1)
\end{lstlisting}
Listing 2:
\begin{lstlisting}[language=Haskellana]
fibs = fix ((0:) . scanl (+) 1)
\end{lstlisting}
\end{document}
作为 Haskeller,努力保持懒惰:)
为了避免必须为每个 Haskell 列表调用语言,我建议声明一个自定义lstlisting
环境:
\documentclass{article}
\usepackage{listings}
\lstdefinelanguage{Haskellana}{
language = Haskell,
morekeywords = {fix},
}
\lstnewenvironment{haskellcode}
{\lstset{language = Haskellana}}
{}
\begin{document}
Listing 1:
\begin{haskellcode}
fibs = fix ((0:) . scanl (+) 1)
\end{haskellcode}
Listing 2:
\begin{haskellcode}
fibs = fix ((0:) . scanl (+) 1)
\end{haskellcode}
\end{document}
答案2
我也遇到过同样的问题。当你并不总是想在打开列表之前明确设置关键字时,似乎无法将关键字添加到现有的语言定义中(即没有\lstupdatelanguage
等效项\lstdefinelanguage
)。
但是,我发现使用该\lstnewenvironment
命令来定义一个新环境很方便,该命令添加了额外的关键字(在我的情况下是 Python 的“yield”):
% new environment for Python with the extra keyword 'yield'
\lstnewenvironment{Python}[1][]{\lstset{language=python, morekeywords={yield}, #1}}{}
% this is for using inline Python code with the extra keyword:
\newcommand{\py}{\lstinline[language=python, morekeywords={yield}]}
使用新命令如下所示:
% The new environment:
\begin{Python}
code goes here...
\end{Python}
% or inline:
Now the \py|yield| Keyword is also highlighted
希望这可以帮助