21

I want to highlight all the numbers appearing in an input code of a certain program by, for example, coloring them. By numbers I mean integer, rational and floating point numbers. I am trying with the listings page but with no success. I have noticed that specific numbers can be formatted with the morekeywords and alsoletter options on defining the language but I want to acomplish this task for any number.

For example, I would like the code

vector([3/5,4,0.4566])

to appear with the three numbers with color green (or whatever). Is it possible to do this in an automatic way?

2

1 Answer 1

24

Similar to solutions in Visualization in LaTeX of hamming distance, and Problem with the alignment of characters, you could use the literate command to define a style that is to be applied to each digit. Below I included a color for the . but commented out the color for the ,.

enter image description here

As there might be a period used outside of a number context, I have defined different styles based on the assumption that any period used in a number will have a digit following it.

\documentclass[border=2pt]{standalone}
\usepackage{listings}
\usepackage{xcolor}

\newcommand*{\FormatDigit}[1]{\textcolor{blue}{#1}}
\lstdefinestyle{FormattedNumber}{%
    literate={0}{{\FormatDigit{0}}}{1}%
             {1}{{\FormatDigit{1}}}{1}%
             {2}{{\FormatDigit{2}}}{1}%
             {3}{{\FormatDigit{3}}}{1}%
             {4}{{\FormatDigit{4}}}{1}%
             {5}{{\FormatDigit{5}}}{1}%
             {6}{{\FormatDigit{6}}}{1}%
             {7}{{\FormatDigit{7}}}{1}%
             {8}{{\FormatDigit{8}}}{1}%
             {9}{{\FormatDigit{9}}}{1}%
             {.0}{{\FormatDigit{.0}}}{2}% Following is to ensure that only periods
             {.1}{{\FormatDigit{.1}}}{2}% followed by a digit are changed.
             {.2}{{\FormatDigit{.2}}}{2}%
             {.3}{{\FormatDigit{.3}}}{2}%
             {.4}{{\FormatDigit{.4}}}{2}%
             {.5}{{\FormatDigit{.5}}}{2}%
             {.6}{{\FormatDigit{.6}}}{2}%
             {.7}{{\FormatDigit{.7}}}{2}%
             {.8}{{\FormatDigit{.8}}}{2}%
             {.9}{{\FormatDigit{.9}}}{2}%
             %{,}{{\FormatDigit{,}}{1}% depends if you want the "," in color
             {\ }{{ }}{1}% handle the space
             ,
   basicstyle=\ttfamily,%  Optional to use this
}
\newcommand{\FormattedNumber}[1]{%
    \lstinline[style=FormattedNumber]{#1}%
}

\begin{document}
\FormattedNumber{a.vector([3/5,4,0.4566])}
\end{document}
6
  • One caveat: This would format \FormattedNumber{a.vector(<stuff>)} by also making the period blue. It would be possible, but somewhat round-about to get that fixed using mathescape=true and then using \FormattedNumber{a$.$vector(<stuff>)}.
    – Werner
    Commented Oct 20, 2011 at 17:07
  • @Werner: Excellent point. Have updated the solution to handle that case. Commented Oct 20, 2011 at 17:19
  • That's perfect!!! You saved me a lot of time. Thank you!!! Commented Oct 20, 2011 at 18:22
  • All replacements that include the comma should have 2 instead of 1 at the end. this defines the number of output characters and is important for the complicated spacing of listings.
    – stefanct
    Commented Mar 29, 2014 at 0:45
  • @PeterGrill excellent solution! Only caveat for me is that it still highlights integers, even when they are commented. Is there a way to correct this?
    – han-tyumi
    Commented Dec 16, 2015 at 15:35

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .