Beamer 的框架易碎问题

Beamer 的框架易碎问题

我找到了一个很好的解决方案,即重新使用 beamer 框架的标题这里通过定义:

\newenvironment{slide}[0]{
    \begin{frame}\ifx \insertsubsection \empty
    \frametitle{\insertsection} \else
    \frametitle{\insertsubsection}\framesubtitle{\insertsection} \fi
}{\end{frame}}

根据这个定义,我不能使用lstlistings,因为框架必须是脆弱的。

因此,我尝试将定义改为:

\newenvironment{slide}[0]{
    \begin{frame}[fragile]\ifx \insertsubsection \empty
    \frametitle{\insertsection} \else
    \frametitle{\insertsubsection}\framesubtitle{\insertsection} \fi
}{\end{frame}}

但它不工作,错误如下:

File ended while scanning use of \next.

这是我的小例子:

\documentclass{beamer}

\usepackage{listings}

\newenvironment{slide}[0]{
    \begin{frame}[fragile]\ifx \insertsubsection \empty
    \frametitle{\insertsection} \else
    \frametitle{\insertsubsection}\framesubtitle{\insertsection} \fi
}{\end{frame}}

\begin{document}

\begin{slide}
    \begin{lstlisting}[caption={A simple listing.}, label={lst:simple}]
    public static void main(String[] args) {
    // hello world
    }
\end{lstlisting}
\end{slide}

\end{document}

感谢您的帮助!

答案1

您需要使用该environment选项。由于逐字环境在环境结尾方面有点特殊,因此必须知道如何调用环境。

顺便说一句:我用命令替换了你的低级\ifx测试,etoolbox以确保它们在\empty定义时也能工作;)

\documentclass{beamer}

\usepackage{listings}

\newenvironment{slide}{
\begin{frame}[fragile,environment=slide]
  \ifdefvoid{\insertsubsection}{%
    \frametitle{\insertsection}}{%
    \frametitle{\insertsubsection}\framesubtitle{\insertsection}}}
{\end{frame}}

\begin{document}

\begin{slide}
    \begin{lstlisting}[caption={A simple listing.}, label={lst:simple}]
    public static void main(String[] args) {
    // hello world
    }
\end{lstlisting}
\end{slide}

\end{document}

相关内容