Beamer-Overlay und Listing-Dilemma

Beamer-Overlay und Listing-Dilemma

Wenn ich versuche, den lstlistingC-Code mit Escape-Zeichen zu überlagern (damit ich ein einfügen kann \colorbox), erhalte ich die folgende Fehlermeldung:

! Missing number, treated as zero.
<to be read again>
               \let
l.15    }

Unten finden Sie beamerCode, der den Fehler reproduziert. Beachten Sie, dass der Code kompiliert wird und einwandfrei funktioniert, wenn ich die Overlay-Anweisungen auskommentiere (siehe die Anmerkung % comment thisin meinem Code).

Ich möchte, dass das Overlay in meiner Umgebung funktioniert lstlisting. Gibt es Hinweise, wie sich dieses Problem lösen lässt?

\documentclass[smaller]{beamer}
\usepackage{graphicx}
\usepackage{color,xcolor}  
\usepackage{boxedminipage}
\usepackage{listings}
\usepackage{pgf,pgfpages}
\usepackage{tikz, subfig}
\usetikzlibrary{arrows,shapes,positioning}
\usetheme{boxes}
\usefonttheme[stillsansseriftext,stillsansserifsmall]{serif} 
\setbeamerfont{frametitle}{size=\large,series=\bfseries,shape=\sf}

\definecolor{red}       {rgb}{.8,0,0}
\definecolor{blue}      {rgb}{0,0,.9}

\begin{document}

\begin{frame}[fragile]
\frametitle{C Program}
\only<1>{ % comment this
\begin{minipage}{\textwidth}
 \begin{minipage}{0.5\textwidth}
  \begin{lstlisting}     [language=C,keywordstyle=\color{red},escapechar=\!,basicstyle=\ttfamily\scriptsize]
    !\colorbox{blue}{x++;}!
  \end{lstlisting}
 \end{minipage}
 \begin{minipage}{0.5\textwidth}
  \begin{lstlisting}[language=C,keywordstyle=\color{red},escapechar=\!, basicstyle=\ttfamily\scriptsize]
    !\colorbox{red}{y++;}!
  \end{lstlisting}
 \end{minipage}
\end{minipage}
} % comment this
\only<2>{ % comment this
\begin{tikzpicture}[font=\footnotesize]
\node at (0,0) {$P_M$};
\node at (1,0) {$P_{W_1}$};
\node at (2,0) {$P_{W_2}$};
\draw (-1,-0.3) -- (3,-0.3);
\end{tikzpicture}
} % Comment this
\end{frame}
\end{document}

Antwort1

Hier ist ein minimaler Code, der den/die Fehler reproduziert.

\documentclass{beamer}

\usepackage{listings}

\begin{document}
\begin{frame}[fragile]
\only<1>{ 
\begin{lstlisting}
\colorbox{blue}{x++;}
\end{lstlisting}
}
\end{frame}
\end{document}

Wenn Sie das Overlay-Makro ( \only) entfernen, wird der Code einwandfrei kompiliert. Dies zeigt Ihnen, dass das Problem nichts mit zu tun hat escapechar. Das Problem scheint eher darin zu liegen, dass \onlywörtlichen Inhalt nicht zu schätzen weiß ( lstlistingin diesem Fall Ihre Umgebung).

Eine Problemumgehung besteht darin, Ihre Einträge in externen Dateien zu speichern und sie mithilfe von einzufügen \lstinputlisting; siehe unten.

Randbemerkung: beamerbietet zwei Umgebungen columnsund column, die idiomatischer sind als minipagehier. Verwenden Sie sie.

Bildbeschreibung hier eingeben

\documentclass[smaller]{beamer}
\usepackage{graphicx}
\usepackage{color,xcolor}  
\usepackage{boxedminipage}
\usepackage{listings}
\usepackage{pgf,pgfpages}
\usepackage{tikz, subfig}
\usetikzlibrary{arrows,shapes,positioning}
\usepackage{filecontents}

\usetheme{boxes}
\usefonttheme[stillsansseriftext,stillsansserifsmall]{serif} 
\setbeamerfont{frametitle}{size=\large,series=\bfseries,shape=\sf}

\definecolor{red}{rgb}{.8,0,0}
\definecolor{blue}{rgb}{0,0,.9}

\begin{filecontents*}{samplex.c}
!\colorbox{blue}{x++;}!
\end{filecontents*}

\begin{filecontents*}{sampley.c}
!\colorbox{red}{y++;}!
\end{filecontents*}

\lstdefinestyle{myC}
{
  language=C,
  keywordstyle=\color{red},
  escapechar=!,
  basicstyle=\ttfamily\scriptsize,
}

\begin{document}

\begin{frame}[fragile]
\frametitle{C Program}
\only<1>{
    \begin{columns}
      \begin{column}{.5\textwidth}
        \lstinputlisting[style=myC]{samplex.c}
      \end{column}
      \begin{column}{.5\textwidth}
        \lstinputlisting[style=myC]{sampley.c}
      \end{column}
    \end{columns}
}
\only<2>{
    \begin{tikzpicture}[font=\footnotesize]
    \node at (0,0) {$P_M$};
    \node at (1,0) {$P_{W_1}$};
    \node at (2,0) {$P_{W_2}$};
    \draw (-1,-0.3) -- (3,-0.3);
    \end{tikzpicture}
}
\end{frame}
\end{document}

Antwort2

Ersetzen Sie es \only<1>{...}durch \begin{onlyenv}<1>...\end{onlyenv}, um den darin enthaltenen Code wörtlich zu verwenden:

\documentclass[smaller]{beamer}
\usepackage{graphicx}
\usepackage{color,xcolor}
\usepackage{boxedminipage}
\usepackage{listings}
\usepackage{pgf,pgfpages}
\usepackage{tikz, subfig}
\usetikzlibrary{arrows,shapes,positioning}
\usetheme{boxes}
\usefonttheme[stillsansseriftext,stillsansserifsmall]{serif}
\setbeamerfont{frametitle}{size=\large,series=\bfseries,shape=\sf}

\definecolor{red}       {rgb}{.8,0,0}
\definecolor{blue}      {rgb}{0,0,.9}

\begin{document}

\begin{frame}[fragile]
\frametitle{C Program}
\begin{onlyenv}<1>
\begin{minipage}{\textwidth}
 \begin{minipage}{0.5\textwidth}
  \begin{lstlisting}     [language=C,keywordstyle=\color{red},escapechar=\!,basicstyle=\ttfamily\scriptsize]
    !\colorbox{blue}{x++;}!
  \end{lstlisting}
 \end{minipage}
 \begin{minipage}{0.5\textwidth}
  \begin{lstlisting}[language=C,keywordstyle=\color{red},escapechar=\!, basicstyle=\ttfamily\scriptsize]
    !\colorbox{red}{y++;}!
  \end{lstlisting}
 \end{minipage}
\end{minipage}
\end{onlyenv}
\begin{onlyenv}<2>
\begin{tikzpicture}[font=\footnotesize]
\node at (0,0) {$P_M$};
\node at (1,0) {$P_{W_1}$};
\node at (2,0) {$P_{W_2}$};
\draw (-1,-0.3) -- (3,-0.3);
\end{tikzpicture}
\end{onlyenv}
\end{frame}
\end{document}

verwandte Informationen