8

My question is very similar to Peter Grill's, How to detect a tab character when processing a literate in lstlistings?

I'm trying to count the number of ^^M characters encountered in my listing behind the scenes, using literate as follows:

literate={\^^M}{{\ProcessNewline}}1,

where the whole purpose of \ProcessNewline is to increment a counter and insert a ^^M character (in order to effect a line break in the listing as if I wasn't messing around with literate at all).

Incrementing the counter is not a problem, but my attempts at inserting a ^^M character back have been infructuous. What I think was my best shot is shown in the code below, but I get a TeX capacity exceeded error.

What am I doing wrong and what should I do?

\documentclass{article}

\usepackage{listings}

\newcounter{foo}
\setcounter{foo}{0}

% the following four lines are adapted from Martin Scharrer's lstautogobble package
\begingroup
\catcode `\^^M=\active%
\gdef\activenl{^^M}% Active CR (ASCII 13) ↙character which is used as line break
\endgroup

\newcommand*{\ProcessNewline}{%
    \stepcounter{foo}%
    % \activenl% You'll get an error if you uncomment his line
}%

\lstset{%
    literate={\^^M}{{\ProcessNewline}}1,
}

\begin{document} 
\begin{lstlisting}
one
two
three   
\end{lstlisting}
\end{document}
3

1 Answer 1

8

This seems to work:

\documentclass{article}

\usepackage{listings}

\newcounter{foo}
\setcounter{foo}{0}

\newcommand*{\ProcessNewline}{%
    \stepcounter{foo}%
}

\makeatletter
\lst@AddToHook{EOL}{\ProcessNewline}
\makeatother


\begin{document} 
\begin{lstlisting}
one
 two
  three   
\end{lstlisting}

[\thefoo]
\end{document}
0

You must log in to answer this question.

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