我正在为某种代码的演示设置模板。因此,我希望有一个环境,其中包含一个框架(已完成\usepackage{environ}
),其中有一个 lstlisting 环境。
未定义为新环境的最小工作示例如下:
\documentclass{beamer}
\usepackage{listings}
\begin{document}
\begin{frame}[fragile]
\begin{center}
\begin{minipage}{0.9\linewidth}
\begin{lstlisting}
for i=1:2:10
do something
end
\end{lstlisting}
\end{minipage}
\end{center}
\end{frame}
\end{document}
现在我想要实现的是这样的:
\NewEnviron{TFListing}[1][]{
\begin{frame}[fragile]{#1}
\begin{center}
\begin{minipage}{0.9\linewidth}
\begin{lstlisting}
\BODY
\end{lstlisting}
\end{minipage}
\end{center}
\end{frame}
}
我可以将其用作:
\begin{TFListing}[Title]
for i=1:2:10
do something
end
\end{TFListing}
然而,主要的问题是 latex 不允许读取\BODY
表示新定义环境内容的参数,因为它被转义了\begin{lstlisting}
。这种环境的好处是每帧可以节省大约八行代码。
提前感谢您的所有帮助。
答案1
您的方法存在一些问题:
- 使用 后
\NewEnviron
,换行符将会丢失。 - 这种环境的内容被吸收为命令的参数,并且
lstlisting
可以绝不出现在命令的参数中。 - 无论如何,隐藏
frame
都是糟糕的编程。
这是一个不同的实现。
\documentclass{beamer}
\usetheme{Warsaw}
\usepackage{listings}
\lstnewenvironment{tflisting}[1][]
{%
\lstset{
linewidth=0.9\textwidth,
xleftmargin=0.05\textwidth,
#1
}%
}{}
\begin{document}
\begin{frame}[fragile]
\begin{tflisting}
for i=1:2:10
do something
end
\end{tflisting}
\end{frame}
\end{document}
您还可以使用
\begin{tflisting}[<listings options>]
答案2
据我所知,这不容易实现。但至少可以通过以下方式部分实现:
\documentclass{beamer}
\usepackage{listings}
\lstnewenvironment{TFListing}[1][]{
\lstset{caption={#1}}%
\centering\minipage{.9\textwidth}%
}{
\endminipage%
}
\begin{document}
\begin{frame}[fragile]
\begin{TFListing}[Title]
for i=1:2:10
do something
end
\end{TFListing}
\end{frame}
\end{document}
环境center
会添加一些间距,但\centering
宏不会。因此,您可能需要手动添加一些垂直间距。