# Problems with fragile frames in Beamer

I found a nice solution of re-using titles of beamer frames here by defining:

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


With this definition I can't use lstlistings because the frame has to be fragile.

So, I've tried to change the definition to:

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


But it don't work with the error:

File ended while scanning use of \next.


Here is my little example:

\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}


Thank you for your help!

• Hiding the frame environment behind a new name is a very bad idea. Why not redefine the frametitle to show the section and subsection? Should all frames have the section and subsection as farmetitle, or only this frame? – samcarter_is_at_topanswers.xyz Dec 28 '18 at 14:50
• @samcarter: I agree that with beamer, redefining title may be easier, but could you explain why using another name is a bad idea? The only reason I can think about is that using other names make parsing and scripting more complicated. – sztruks Dec 28 '18 at 15:13
• @sztruks Oh, there are a couple of reasons - in no particular order: It often reduces the functionality, because redefinitions often don't think about optional arguments, e.g. \begin{frame}<beamer:1-4|handout:0>[plain]{frametitle}{subtitle}. -- If the appearance of the frametitle should be changed the corresponding template should be adjusted instead of working around like this -- In my opinion it obscures the code with no gain -- It makes the code less portable between presentations and more difficult to create MWE. – samcarter_is_at_topanswers.xyz Dec 28 '18 at 15:42
• @sztruks cont. -- it tempts users to use dangerous options like allowframeberaks or fragile as default for all frames. – samcarter_is_at_topanswers.xyz Dec 28 '18 at 15:43
• @samcarter Thanks. I was wondering if I should turn my comment to a question, to whom your answer would be accepted (provided it hasn't already been asked, of course). – sztruks Dec 28 '18 at 15:46

## 1 Answer

You need to use the environment option. As verbatim environments are a bit special concerning environment endings it has to be known how the environment is called.

Btw: I replaced your low-level \ifx tests with etoolbox commands to ensure they even work when \empty is defined ;)

\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}

• @mrbela You're welcome :) – TeXnician Dec 28 '18 at 15:06