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!

  • 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
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}
| improve this answer | |
  • @mrbela You're welcome :) – TeXnician Dec 28 '18 at 15:06

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.