I'm trying to typeset some python code, and I would like integer literals to be highlighted. I've come up, after about two hours of fighting with the documentation and various other questions here and on SO, with the following:
\lstset{ %
language=Python,
otherkeywords={1, 2, 3, 4, 5, 6, 7, 8, 9, 0},
morekeywords=[2]{1, 2, 3, 4, 5, 6, 7, 8, 9, 0},
keywordstyle=[2]{\color{orange}},
keywordstyle=\color{blue}\bfseries,
stringstyle=\color{red},
}
Unfortunately, that doesn't work. Numbers found in strings are also highlighted, which is rather annoying, and not only are they highlighted: they are highlighted in blue
. Numerals in regular program text, on the other hand, are rightly highlighted in red
.
Help?
EDIT: Thanks Peter Grill for your very nice solution. Is there a way to not break string colouring, though? When I use you code, the stringstyle=\color{red}
doesn't seem to work anymore (strings are just plain black). Similarly, comments can be enclosed in triple quotes in python, and if I adapt your quote to detect """
blocks, then the corresponding
comments are not highlighted anymore.
Best Answer
It seems that you want the coloring of the digits, but not when they are within a string. If I correctly understand, you can use a conditional to define if we should apply the color or not. Then when we encounter a quote, we disable to coloring until the next quote.
Here I have disabled coloring within both single and double quotes. If this is not desired, simply comment out the corresponding line in
\lstset
.Below I have used
newtoggle
from theetoolbox
package as I like that syntax much better than the\newif
syntax. But if you don't want to include an additional package it should be pretty straightforward to adapt this to use\newif
or some other conditional methods.Further Enhancements:
If you desire to extend this to handle floating point numbers, and highlight the decimal separator (but not periods), see Listings package: How can I format all numbers?
A further enhancement would be to disable the coloring within comments in the code. However, this is dependent on the particular language being typeset, but a similar technique could be applied to disable coloring at the beginning of a comment and re enable it at the end of the comment. This should be straightforward for comments that have a begin and end delimiter (i.e.,
/* ... */
C-style comments), but for comments that go to end of line (i.e.,//
C-style comments), the end of line will need to be detected and used to re enable comments.Simpler Solution:
Code: