# Using listings: "zebra effects" AND line numbers

I just made a code listing with a "zebra effect", just like here: Creating a zebra effect using listings

But afterwards, the line numbers at the left side of the listing don't appear any more.

This is some of the code that makes the numbers dissapear:

\documentclass[a4paper, 10pt]{article}
\usepackage[T1]{fontenc}
\usepackage{beramono}
% monospaced font with bold variant

\usepackage[usenames,dvipsnames]{xcolor}
\colorlet{keyword}  {blue!100!black!80}
\colorlet{comment}  {green!70!black!100}
\colorlet{STD}        {Yellow}

\usepackage{color}
\usepackage{xcolor}
\definecolor{dkgreen}{rgb}{0,0.6,0}
\definecolor{gray}{rgb}{0.5,0.5,0.5}
\definecolor{mauve}{rgb}{0.58,0,0.82}

\usepackage[top     =   2.5 cm,
bottom  =   2.5 cm,
left    =   2.5 cm,
right   =   2.5 cm]{geometry}

\usepackage{listings}

\newcommand\realnumberstyle[1]{}
\makeatletter
\newcommand{\zebra}[3]{%
{\realnumberstyle{#3}}%
\begingroup
\lst@basicstyle
\ifodd\value{lstnumber}%
\color{#1}%
\else
\color{#2}%
\fi
\rlap{\hspace*{\lst@numbersep }%
\color@block{\linewidth}{\ht\strutbox}{\dp\strutbox}%
}%
\endgroup
}
\makeatother

\lstset
{                                                           %
language            =   C,                      % the     language of the code
basicstyle          =   \ttfamily\footnotesize,     % the size of the fonts that are used for the code
numbers             =left  ,                    % where to put the line-numbers
numberstyle         =   \tiny\color{black},         % the style that is used for the line-numbers
stepnumber          =   1,                          % the step between two line-numbers. If it's 1, each line
% will be numbered
numbersep           =   25pt,                       % how far the line-numbers are from the code
backgroundcolor     =   \color{white},              % choose the background color. You must add \usepackage{color}
showspaces          =   false,                      % show spaces adding particular underscores
showstringspaces    =   false,                      % underline spaces within strings
showtabs            =   false,                      % show tabs within strings adding particular underscores
frame               =   single,                     % adds a frame around the code
rulecolor           =   \color{black},              % if not set, the frame-color may be changed on line-breaks within not-black text (e.g. comments (green here))
tabsize             =   4,                          % sets default tabsize to 4 spaces
captionpos          =   b,                          % sets the caption-position to bottom
breaklines          =   true,                       % sets automatic line breaking
breakatwhitespace   =   false,                      % sets if automatic breaks should only happen at whitespace
title               =   \lstname,                   % show the filename of files included with \lstinputlisting;
% also try caption instead of title
keywordstyle        =   [1]\color{keyword}
\bfseries,                  % keyword style
keywordstyle        =   [2]\color{STD}
\bfseries,                  % keyword style
commentstyle        =   \color{comment},            % comment style
stringstyle         =   \color{mauve},              % string literal style
escapeinside        =   {\%*}{*)},                  % if you want to add LaTeX within your code
%morekeywords       =   [1]{*,
%                           bla,
%                           },                      % keywords to the set
%morekeywords       =   [2]{
%                           bla,
%                           },                      % keywords to the set
deletekeywords      =   {...}                   % if you want to delete keywords from the given language
}

\begin{document}

% version with number highlighting "zebra"-style
\lstinputlisting[firstline = 0, lastline = 100,numberstyle=\zebra{gray!20}{lightgray!15}{}]{test.txt}

% version without: missing third brackets {}
\lstinputlisting[firstline = 0, lastline = 100,numberstyle=\zebra{gray!20}{lightgray!15}]{test.txt}

\end{document}

• Welcome to TeX.SX! Can you supplement the code with a full (minimal) example from \documentclass to \end{document}? Jan 20 '14 at 18:55
• i've edited it to the code which i'm using to test the listing. the original code and the current solution are in it. Jan 21 '14 at 16:37

If you don't want to use the package lstlinebgrd, this is what you can do with the code borrowed from that answer.

The command \zebra takes three arguments. If you use only two as in that answer

numberstyle=\zebra{green!35}{yellow!35}


you don't get the line numbers printed. To have them you have to give a third empty argument like

numberstyle=\zebra{green!35}{yellow!35}{}


\documentclass{article}

\usepackage[T1]{fontenc}
\usepackage{listings}
\usepackage{xcolor}

\newcommand\realnumberstyle[1]{}

\makeatletter
\newcommand{\zebra}[3]{%
{\realnumberstyle{#3}}%
\begingroup
\lst@basicstyle
\ifodd\value{lstnumber}%
\color{#1}%
\else
\color{#2}%
\fi
\rlap{\hspace*{\lst@numbersep}%
\color@block{\linewidth}{\ht\strutbox}{\dp\strutbox}%
}%
\endgroup
}
\makeatother

\begin{document}

\begin{lstlisting}[language=C,basicstyle=\ttfamily,numberstyle=\zebra{green!35}{yellow!35}{},numbers=left]
/**
* Prints Hello World.
**/
#include <stdio.h>

int main(void) {
printf("Hello World!");
return 0;
}
\end{lstlisting}

\end{document}


Output:

If you don't want to give the third argument, replace the lines

\newcommand\realnumberstyle[1]{}

\makeatletter
\newcommand{\zebra}[3]{%
{\realnumberstyle{#3}}%
\begingroup
\lst@basicstyle
\ifodd\value{lstnumber}%
\color{#1}%
\else
\color{#2}%
\fi
\rlap{\hspace*{\lst@numbersep}%
\color@block{\linewidth}{\ht\strutbox}{\dp\strutbox}%
}%
\endgroup
}
\makeatother


with

\makeatletter
\newcommand{\zebra}[2]{%
\begingroup
\lst@basicstyle
\ifodd\value{lstnumber}%
\color{#1}%
\else
\color{#2}%
\fi
\rlap{\hspace*{\lst@numbersep}%
\color@block{\linewidth}{\ht\strutbox}{\dp\strutbox}%
}%
\endgroup
}
\makeatother


and you will have the line numbers printed only using things like

numberstyle=\zebra{green!35}{yellow!35}


## EDIT

If I was you, I would have a look at the package lstlinebgrd, but if you still want to use some custom code, the following should meet your settings. Try it.

\makeatletter
\newcommand{\zebra}[2]{%
\begingroup
\lst@basicstyle
\ifodd\value{lstnumber}%
\color{#1}%
\else
\color{#2}%
\fi
\ifnum\value{lstnumber}>9
\rlap{\hspace*{\lst@numbersep}\hspace*{1.14em}%
\color@block{\linewidth}{\ht\strutbox}{\dp\strutbox}%
}%
\else
\rlap{\hspace*{\lst@numbersep}\hspace*{0.6em}%
\color@block{\linewidth}{\ht\strutbox}{\dp\strutbox}%
}%
\fi
\endgroup
}
\makeatother


Note that

• @Jubobs Thanks for the appreciation. I've added a solution which doesn't require the empty argument. Jan 20 '14 at 19:44
• Thank you! It's already better (as there ARE numbers now:), but i've still got two problems: First, the background color now goes out of my frame. Second, with a number higher then nine, the background color has got a step. i just made a pdf: dropbox.com/s/x58cepcbt23f3it/Syntax.pdf Jan 21 '14 at 16:41
• @user44467 see the edit. Jan 21 '14 at 17:23
• very good. now it works fine. i have a closer look at the named package, too. :) Jan 21 '14 at 18:22