45

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?

33

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:

enter image description here

\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}
  • 1
    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 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 at 9:02
50

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
  • 1
    Does this only add the keyword to the current language? – Eric May 22 '17 at 23:36
4

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}
}

instead.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.