![Beamer:当使用 \only 命令拆分 src 时,如何突出显示 src?](https://linux22.com/image/246085/Beamer%EF%BC%9A%E5%BD%93%E4%BD%BF%E7%94%A8%20%5Conly%20%E5%91%BD%E4%BB%A4%E6%8B%86%E5%88%86%20src%20%E6%97%B6%EF%BC%8C%E5%A6%82%E4%BD%95%E7%AA%81%E5%87%BA%E6%98%BE%E7%A4%BA%20src%EF%BC%9F.png)
谢谢马克·范·东根有一个“分步”编程教程的模板(在他的问题中有一个示例布局):如何在 LaTeX 中创建分步带注释的编程教程?。
我想知道是否可以通过源突出显示实现类似的功能?
简单地将环境从 更改semiverbatim
为lstlisting
,是不起作用的(很容易猜到)。
%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
。在这里,我还使用它(有点粗暴地)将插入位置向左移动,以便注释出现在源代码行的开头附近。
结果: