使用行号、“name”和“beamer”覆盖时出现列表问题

使用行号、“name”和“beamer”覆盖时出现列表问题

众所周知,要确保<counter>同一帧的后续幻灯片上自动重置某个值,必须使用\resetcounteronoverlays{<counter>}(对于 LaTeX 计数器)或\resetcountonoverlays{<counter>}(对于 TeX 计数器)。但是,这似乎不适用于在使用密钥的环境lstnumber中用于编号行的计数器,如以下简单的 MWE 所示:lstlistingname

\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不是正确的做法,而是设置所有列表的起始编号。

相关内容