Beamer:当使用 \only 命令拆分 src 时,如何突出显示 src?

Beamer:当使用 \only 命令拆分 src 时,如何突出显示 src?

谢谢马克·范·东根有一个“分步”编程教程的模板(在他的问题中有一个示例布局):如何在 LaTeX 中创建分步带注释的编程教程?

我想知道是否可以通过源突出显示实现类似的功能?

简单地将环境从 更改semiverbatimlstlisting,是不起作用的(很容易猜到)。

%Generate with : `pdflatex filename`
\documentclass{beamer}
\usepackage{listings}
\lstset{
    language=C++,
    basicstyle=\small,
    numbers=left,
    numberstyle=\tiny\color{gray},
}
\begin{document}
\begin{frame}[fragile]%
%\begin{semiverbatim}
\begin{lstlisting}[language=C++,caption={C++ as C++ TexTests},label=cppascpptextests]
\only<1-2>{\frametitle{General program structure}}
\only<3>{\frametitle{Variables}}
\only<4>{\frametitle{Reading numbers from standard input}}
\only<5>{\frametitle{Printing results on standard output}}
\only<6>{\frametitle{Assigning results of computation}}
\only<7>{\frametitle{Working example :)}}
\only<8>{\frametitle{Enjoy programming :)}}
\only<4>{(4)How to include needed header file?}\only<5->{\#include <cstdio>}
\only<1>{(1) How to construct main function ?}\only<2->{int main() \{}
   \only<3>{(3) How to declare variables?}\only<4->{long a,b,c;}
   \only<4>{(4) How to read data?}\only<5->{scanf("\%ld\%ld", \&a, \&b);}
   \only<6>{(6) How to compute result?}\only<7->{c = a * b;}
   \only<5>{(5) How to print result?}\only<6->{printf("\%ld\textbackslash n", c);}
   \only<2>{(2) How to exit program correctly?}\only<3->{return 0;}
\only<2->{\}}
\end{lstlisting}
%\end{semiverbatim}
\end{frame}

\end{document}

答案1

beamer以下是将覆盖与 相结合的可能解决方案lstlisting

\documentclass{beamer}
\usepackage{listings}
\usepackage{beramono}
\usepackage{pgf,pgffor}
\lstset{
    language=C++,
    basicstyle=\small,
    numbers=left,
    numberstyle=\tiny\color{gray},
}

\lstdefinestyle{highlight}{
  keywordstyle=\bfseries,
}
\lstdefinestyle{base}{
  language=C++,
  basicstyle=\color{white},
  keywordstyle=\color{white},
  commentstyle=\sffamily\scriptsize\color{white},
  moredelim=**[is][\only<1->{\color{black}\lstset{style=highlight}}]{@1}{@},
  moredelim=**[is][\only<2->{\color{black}\lstset{style=highlight}}]{@2}{@},
  moredelim=**[is][\only<3->{\color{black}\lstset{style=highlight}}]{@3}{@},
  moredelim=**[is][\only<4->{\color{black}\lstset{style=highlight}}]{@4}{@},
  moredelim=**[is][\only<5->{\color{black}\lstset{style=highlight}}]{@5}{@},
  moredelim=**[is][\only<6->{\color{black}\lstset{style=highlight}}]{@6}{@},
  moredelim=**[is][\only<7->{\color{black}\lstset{style=highlight}}]{@7}{@},
  moredelim=**[is][\only<8->{\color{black}\lstset{style=highlight}}]{@8}{@},
  moredelim=**[is][\only<9->{\color{black}\lstset{style=highlight}}]{@9}{@},
  texcl=true,escapebegin=\hskip-6cm\color{red}
}


\begin{document}
\begin{frame}[fragile]%

  \foreach \o/\t in {%
    1-2/{General program structure},
    3/{Variables},
    4/{Reading numbers from standard input}
  }{
    \only<\o>{\expandafter\frametitle\expandafter{\t}}%
  }

\begin{lstlisting}[style=base,caption={C++ as C++ TexTests},label=cppascpptextests]
  @2int main() {@            // \only<1>{(1) How to construct main?}
    @4long a,b,c;@           // \only<3>{(3) How to declare variables?}
    @5scanf("%ld%ld",&a,&b);@// \only<4>{(3) How to read data?}
    @3return 0;@             // \only<2>{(2) How to exit correctly?}
  @3}@  
\end{lstlisting}
\end{frame}

\end{document}

评论:

\frametitle我利用包\foreach中的循环简化了您的规范pgffor。但这不是重点。主要思想是拥有两种不同的列表样式。

  • 样式base基本上通过将所有元素呈现为白色来“隐藏”列表。
  • 样式highlight应用真实的格式。
  • 然后,诀窍是使用moredelim选项仅在给定幻灯片上lstlisting注入样式highlight。不幸的是,无法将参数传递给moredelim,因此我定义了一系列分隔符@1@2等等。

对于“评论”,我使用了另一个技巧。评论总是以白色呈现(这就是你看不到评论分隔符的原因//),但使用texcl选项自动转为 LaTeX内容注释。由于我们在 LaTeX 领域之后//,我们可以使用\only<>来实现覆盖规范。使用escapebegin我们在排版注释内容之前插入的附加命令lstlisting。在这里,我还使用它(有点粗暴地)将插入位置向左移动,以便注释出现在源代码行的开头附近。

结果:

在此处输入图片描述

在此处输入图片描述

相关内容