2

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!

mrbela
  • 1,129
  • 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
  • @sztruks If I remember correctly there might already be an old question along these lines with an answer by @ egreg -- unfortunately this does not make searching easier, there are simply too many answers by egreg :) – samcarter_is_at_topanswers.xyz Dec 28 '18 at 15:49

1 Answers1

4

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}
TeXnician
  • 33,589