如何在列表中每次出现 EOL 字符时执行一些代码?

如何在列表中每次出现 EOL 字符时执行一些代码?

我的问题和 Peter Grill 的问题很相似,如何在处理列表列表中的文字时检测制表符?

^^M我正在尝试计算列表中遇到的字符数幕后,使用literate如下:

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

其全部目的\ProcessNewline是增加计数器插入一个^^M字符(为了在列表中产生换行符,就好像我literate根本没有弄乱一样)。

增加计数器不是问题,但我尝试插入一个^^M字符却没有成功。我认为我最好的尝试如下代码所示,但我得到了一个TeX capacity exceeded错误。

我做错了什么?我该怎么办?

\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}

答案1

这似乎有效:

\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}

相关内容