众所周知,要确保<counter>
同一帧的后续幻灯片上自动重置某个值,必须使用\resetcounteronoverlays{<counter>}
(对于 LaTeX 计数器)或\resetcountonoverlays{<counter>}
(对于 TeX 计数器)。但是,这似乎不适用于在使用密钥的环境lstnumber
中用于编号行的计数器,如以下简单的 MWE 所示:lstlisting
name
\documentclass{beamer}
\usepackage{listings}
\lstset{numbers=left}
\resetcounteronoverlays{lstnumber}
\begin{document}
\begin{frame}[fragile]
\begin{onlyenv}<1>
\begin{lstlisting}[name=first]
test line in first listing
\end{lstlisting}
\end{onlyenv}
\begin{onlyenv}<2>
\begin{lstlisting}[name=second]
test line in second listing
\end{lstlisting}
\end{onlyenv}
\end{frame}
\end{document}
输出:
如果name
不使用该选项,则效果\resetcounteronoverlays{lstnumber}
是预期的,并且会得到正确的结果。
如何lstnumber
防止使用name
按键和beamer
覆盖层时发生踩踏?
答案1
对于命名列表,例如name=myprog
,行号的值在相应的宏中保持跟踪\lstno@myprog
。不幸的是,它们确实是宏而不是计数器,因此通常的 beamer 重置命令不起作用。在单个列表中,您始终可以提供firstnumber
指定起始行号的选项。否则,您需要对宏进行一些手动重置\lstno@...
等。
下面我们用这两种不同的方法重新设置第二个列表系列的编号。这样
第一个覆盖:name=first
,确定
第二个覆盖:name=second
,行号明确设置,OK
第二张幻灯片,第一层覆盖:name=first
,没有重置,出错
第二张幻灯片,第二个叠加层:name=second
,在框架前重置,确定
还可以在框架内的覆盖之间进行重置。
\documentclass{beamer}
\usepackage{listings}
\lstset{numbers=left}
\begin{document}
\begin{frame}[fragile]
\begin{onlyenv}<1>
\begin{lstlisting}[name=first]
test line in first listing
\end{lstlisting}
\end{onlyenv}
\begin{onlyenv}<2>
\begin{lstlisting}[name=second,firstnumber=1]
test line in second listing
\end{lstlisting}
\end{onlyenv}
\end{frame}
\makeatletter
\def\lstno@second{1}
\makeatother
\begin{frame}[fragile]
\begin{onlyenv}<1>
\begin{lstlisting}[name=first]
test line in first listing
\end{lstlisting}
\end{onlyenv}
\begin{onlyenv}<2>
\begin{lstlisting}[name=second]
test line in second listing
\end{lstlisting}
\end{onlyenv}
\end{frame}
\end{document}
请注意,设置\lst@firstnumber
不是正确的做法,而是设置所有列表的起始编号。