
Когда я пытаюсь наложить на lstlisting
код C экранирующий символ (чтобы можно было вставить \colorbox
), я получаю следующую ошибку:
! Missing number, treated as zero.
<to be read again>
\let
l.15 }
Ниже приведен beamer
код, воспроизводящий ошибку. Обратите внимание, что если я закомментирую инструкции наложения (см. аннотацию % comment this
в моем коде), код компилируется и работает идеально.
Я хотел бы, чтобы наложение работало с моей lstlisting
средой. Есть ли какие-нибудь подсказки, как решить эту проблему?
\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}
решение1
Вот минимальный код, воспроизводящий ошибку(и).
\documentclass{beamer}
\usepackage{listings}
\begin{document}
\begin{frame}[fragile]
\only<1>{
\begin{lstlisting}
\colorbox{blue}{x++;}
\end{lstlisting}
}
\end{frame}
\end{document}
Если удалить макрос наложения ( \only
), код компилируется нормально. Это говорит о том, что проблема не связана с escapechar
. Скорее, проблемы, похоже, в том, что \only
не ценит дословный контент ( lstlisting
в данном случае — вашу среду).
Одним из обходных путей является хранение ваших списков во внешних файлах и вставка их с помощью \lstinputlisting
; см. ниже.
Примечание: beamer
предоставляет две среды columns
и column
, которые более идиоматичны minipage
, чем здесь. Используйте их.
\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}
решение2
Замените \only<1>{...}
на \begin{onlyenv}<1>...\end{onlyenv}
, чтобы использовать дословный код внутри:
\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}