Extend a language with additional keywords?

I'm using listings and I want to extend a language with additional keywords for highlightning. I know there is an option morekeywords available, but that only works for a particular lstset declaration and I don't want to have to copy-paste all keywords into all listings. I've tried declaring the keywords as part of a command but that doesn't work (probably because the command is not expanded and I don't know how to fix that).

So is there any way of declaring a new language by copying an existing one and just adding more keywords?

You can define the keywords in a separate file and just include it in your preamble. Here is an example of adding for and downto as new keywords:

\documentclass{article}
\usepackage{listings}%
\usepackage{xcolor}

\lstset{%
backgroundcolor=\color{yellow!20},%
basicstyle=\small\ttfamily,%
numbers=left, numberstyle=\tiny, stepnumber=2, numbersep=5pt,%
}%

% Add your keywords here, and have this in a separate file
% and include it in your preamble
\lstset{emph={%
downto, for%
},emphstyle={\color{red}\bfseries\underbar}%
}%

\begin{document}
\begin{lstlisting}
y = 0
for i = n downto 0
y = a_i + x * y
\end{lstlisting}
\end{document}

• I never thought about using a separate \lstset to define the keywords! This solved my problem! – gablin Sep 13 '11 at 6:51
• How do I use this to define multiple types of formatting (i.e. make "foo" red and "bar" green)? If I put subsequent \lstset{emph=... commands only the last one seems to take effect and all previous ones are ignored. – PGmath Apr 1 '19 at 7:17
• @PGmath: I think the way to do that would be to define styles (similar too the other answers) and invoke the desired style. If that does not answer your question, I would suggest you ask a new question and be sure to include a MWE including \documentclass and the appropriate packages that sets up the problem. – Peter Grill Apr 1 '19 at 9:02

It seems that morekeywords also works for extending a language. For instance the Python keyword super isn't in the list of default keywords. In my preamble, I can set it as a keyword by doing:

\lstset{language=Python}
\lstset{
morekeywords={super}
}


Of course, it would be ideal to contribute those missing keywords to the listings package.

• Works like a charm... – mtsz Feb 28 '13 at 17:27
• Does this only add the keyword to the current language? – Eric May 22 '17 at 23:36
• This does not work for me. – 71GA May 21 at 14:41

As Dominique said,

\lstset{language=Python}
\lstset{
morekeywords={super}
}


works, but doing so firstly add the Python language to all listing and then adds the keyword to all languages.

To add the keyword only for one language use

\lstdefinestyle{Python}{
morekeywords={super}
}


\lstdefinestyle{python}{language=Python,
morekeywords={super},
... % more settings for python language
}

\lstdefinestyle{c}{language=C,
... % settings for C language
}

...
\begin{lstlisting}[style = python]
... super
\end{lstlisting}

% changing language
\begin{lstlisting}[style = c]
...
\end{lstlisting}

% back to python
\begin{lstlisting}[style = python]
... super
\end{lstlisting}


This will add the keyword super to only Python language.

• Note that this doesn't add the keyword to the Python language, it just sets it on top of the keywords loaded for this language. As soon as you switch to another language, the setting will be gone. – siracusa Oct 26 '19 at 18:17
• @siracusa: That's the whole idea. To set the keyword for only one language only. – ASarkar Oct 30 '19 at 11:34
• But that's not what it does. Try setting language=Python for another listing and you'll see that the keyword will be gone again. – siracusa Oct 30 '19 at 12:48