5

I am writing some code with the listings package and I need to detect the words starting with the number sign (#) and apply certain style. For example, if I have this code:

 something #foo anotherThing

I would like to put blue colors to '#foo'.

So far I have:

\lstset{
....
identifierstyle=\idstyle, 
}

And then:

 \makeatletter
 \newcommand*\idstyle{%
         \expandafter\id@style\the\lst@token\relax
 }
 \def\id@style#1#2\relax{%
         \ifcat#1\relax\else
                 \ifnum`#1=\uccode`#1%
                    \small\ttfamily\color{red!100!black}
                \fi
                 \ifnum\pdfstrcmp{#1}{\#}=0
         \small\ttfamily\color{blue!100!black}

         \fi
           \ifnum`#1= 35%
                         \small\ttfamily\color{blue!100!black}
                 \fi
         \fi
 }
 \makeatother

So I am trying to put a blue color for words starting with #. The first try (using \pdfstrcmp) works perfect with others type of characters but not with #. I cannot scape it. I tried to scape # in lots of ways such as \#, \#\, |\verb#|, etc et, but no one worked.

In the second try, I am trying to go by comparing the unicode value, but I am not successful either.

Notice also that at the same time I wanted to put colors (different color) to words that start with uppercase. So how can I have both at the same time (set different colors to both, words that start with uppercase and those that start with \#?

Sorry for the question but I am newbie with Latex...

Any ideas how can I get this?

2 Answers2

6

You can use keywordsprefix=\# to specify that anything beginning with # is to be treated as a keyword:

enter image description here

Notes:

Code:

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

\lstset{% backgroundcolor=\color{yellow!20},% basicstyle=\small\ttfamily,% keywordstyle=\color{blue}\bfseries,% language=Java,% keywordsprefix=#,% alsoletter=#,% if you also want the "#" to be highlighted }%

\begin{document} \begin{lstlisting} something #foo anotherThing \end{lstlisting} \end{document}

Peter Grill
  • 223,288
  • Hi. Thanks for the answer. However, that means that I would have to apply the same styles to those words starting with # and keywords. In my case I need both and both with different styles. – Mariano Martinez Peck Jun 02 '12 at 16:38
4

I will try to answer your question. The symbol # is a specific character, also within listings. To detect the symbol inside the identifier style you must declare # as a letter. By default it is declared as "other". Table 2: Standard character table of the great documentation shows the default setting. So you can do the following:

enter image description here

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

\lstset{%
alsoletter=\#,
identifierstyle=\idstyle, 
}

\makeatletter
\newcommand*\idstyle[1]{%
         \expandafter\id@style\the\lst@token{#1}\relax%
 }
 \def\id@style#1#2\relax{%
           \ifnum\pdfstrcmp{#1}{\#}=0%
                \small\ttfamily\color{blue!100!black} \the\lst@token%
            \else%
              \edef\tempa{\uccode`#1}%
              \edef\tempb{`#1}%
              \ifnum\tempa=\tempb%
                  \small\ttfamily\color{red!100!black} \the\lst@token%
              \else%
                  \the\lst@token%
             \fi%
            \fi%
 }
 \makeatother
\begin{document}
\begin{lstlisting}
something #foo another Thing
\end{lstlisting}
\end{document}
Marco Daniel
  • 95,681