![如何在列表中每次出现 EOL 字符时执行一些代码?](https://linux22.com/image/280237/%E5%A6%82%E4%BD%95%E5%9C%A8%E5%88%97%E8%A1%A8%E4%B8%AD%E6%AF%8F%E6%AC%A1%E5%87%BA%E7%8E%B0%20EOL%20%E5%AD%97%E7%AC%A6%E6%97%B6%E6%89%A7%E8%A1%8C%E4%B8%80%E4%BA%9B%E4%BB%A3%E7%A0%81%EF%BC%9F.png)
我的问题和 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}