创建一个 \NewEnviron,其中包含 beamer 框架内的列表

创建一个 \NewEnviron,其中包含 beamer 框架内的列表

我正在为某种代码的演示设置模板。因此,我希望有一个环境,其中包含一个框架(已完成\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

您的方法存在一些问题:

  1. 使用 后\NewEnviron,换行符将会丢失。
  2. 这种环境的内容被吸收为命令的参数,并且lstlisting可以绝不出现在命令的参数中。
  3. 无论如何,隐藏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宏不会。因此,您可能需要手动添加一些垂直间距。

相关内容