为列表包的现有语言添加关键字

为列表包的现有语言添加关键字

我想在现有的语言定义中添加更多关键字,以便当我使用时\begin{lstlisting} ... \end{lstlisting},新关键字会与预定义关键字一起突出显示。

这个问题已被问过很多次,但我发现没有一个解决方案有效。

让我们回顾一下以前的一些工作:

  1. 问题,所选答案是要么定义一种新语言,要么为该语言定义一种新样式。但我不想定义一种新语言或样式。我想使用现有的样式向现有语言添加关键字。

  2. 这个其他问题,标记为重复,评论被要求使用\lstset{language=Lisp, morekeywords={define}},但对我而言不起作用。一位评论者告诉 OP 参考手册的第 3.2 节,但其中实际上没有提到任何有关修改现有语言定义的内容。

  3. 完后还有问题,解决方案是不设置关键字,而只是告诉包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

希望这可以帮助

相关内容