我找到了一个很好的解决方案,即重新使用 beamer 框架的标题这里通过定义:
\newenvironment{slide}[0]{
\begin{frame}\ifx \insertsubsection \empty
\frametitle{\insertsection} \else
\frametitle{\insertsubsection}\framesubtitle{\insertsection} \fi
}{\end{frame}}
根据这个定义,我不能使用lstlisting
s,因为框架必须是脆弱的。
因此,我尝试将定义改为:
\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}