请参阅以下最小示例:
\documentclass[table]{beamer}
\begin{document}
\begin{frame}{Boo}
\begin{table}
\centering
\small
\begin{tabular}{rcc}
\only<1>{\rowcolor{green}}Hey & 32.0 & 26.7\\
\only<2>{\rowcolor{green}}Hey & 28.5 & 24.5\\
\end{tabular}
\caption{My caption}
\end{table}
\end{frame}
\end{document}
这给出了错误! Misplaced \noalign
为什么这不起作用以及如何获得在不同的覆盖上突出显示行的所需结果?
答案1
该\rowcolor
命令用于\noalign
添加一些不应像通常的表格内容那样对齐的代码。相同的宏用于绘制水平表格线。它只能在行之间使用,即直接在之后使用\\
。\only
已经启动了行的第一个单元格,因此\noalign
无法工作。
这里有三种不同的解决方案,它们越来越通用:
实现此目的的一种方法是将\rowcolor
代码放入自定义宏中,否则该宏为空。这是可以的,因为 TeX 会在单元格开头扩展宏以查找包含的\noalign
s。
\documentclass[table]{beamer}
\begin{document}
\begin{frame}{Boo}
\begin{table}
\centering
\small
\def\firstrowcolor{}
\def\secondrowcolor{}
\only<1>{\def\firstrowcolor{\rowcolor{green}}}
\only<2>{\def\secondrowcolor{\rowcolor{green}}}
\begin{tabular}{rcc}
\firstrowcolor Hey & 32.0 & 26.7\\
\secondrowcolor Hey & 28.5 & 24.5\\
\end{tabular}
\caption{My caption}
\end{table}
\end{frame}
\end{document}
另一种方法是直接改变\rowcolor
以接受beamer
覆盖规范:
\documentclass[table]{beamer}
% Redefine `\rowcolor` to allow a beamer overlay specifier
% New syntax: \rewcolor<overlay>[color model]{color}[left overhang][right overhang]
\makeatletter
% Open `\noalign` and check for overlay specification:
\def\rowcolor{\noalign{\ifnum0=`}\fi\bmr@rowcolor}
\newcommand<>{\bmr@rowcolor}{%
\alt#1%
{\global\let\CT@do@color\CT@@do@color\@ifnextchar[\CT@rowa\CT@rowb}% Rest of original `\rowcolor`
{\ifnum0=`{\fi}\@gooble@rowcolor}% End `\noalign` and gobble all arguments of `\rowcolor`.
}
% Gobble all normal arguments of `\rowcolor`:
\newcommand{\@gooble@rowcolor}[2][]{\@gooble@rowcolor@}
\newcommand{\@gooble@rowcolor@}[1][]{\@gooble@rowcolor@@}
\newcommand{\@gooble@rowcolor@@}[1][]{\ignorespaces}
\makeatother
\begin{document}
\begin{frame}{Test}%
\begin{tabular}{ll}
\rowcolor<1>{green} A & B \\
\rowcolor<2>{green} D & C \\
\end{tabular}
\begin{tabular}{ll}
\rowcolor<1>{green}[0pt][1pt] A & B \\
\rowcolor<2>{green}[0pt][1pt] D & C \\
\end{tabular}
\begin{tabular}{ll}
\rowcolor<1>[named]{green}[0pt][1pt] A & B \\
\rowcolor<2>[named]{green}[0pt][1pt] D & C \\
\end{tabular}
\end{frame}
\end{document}
我最终想到提供一些叠加感知宏,这些宏将行特定的宏(如\hline
或 )\rowcolor
作为参数。这样,您可以在不同的幻灯片上使用不同的行颜色。有\rowonly
、\rowalt
和 ,\rowtemporal
其工作方式类似于\only
、\alt
和\temporal
。请参阅最后的示例。
\documentclass[table]{beamer}
\makeatletter
\newcommand{\rowonly}{%
\noalign{\ifnum0=`}\fi
\@rowonly
}
\newcommand<>{\@rowonly}[1]{%
\only#2%
{\ifnum0=`{\fi}#1{\ifnum0=`}\fi}%
\ifnum0=`{\fi}%
\ignorespaces
}
\newcommand{\rowalt}{%
\noalign{\ifnum0=`}\fi
\@rowalt
}
\newcommand<>{\@rowalt}[2]{%
\alt#3%
{\ifnum0=`{\fi}#1{\ifnum0=`}\fi}%
{\ifnum0=`{\fi}#2{\ifnum0=`}\fi}%
\ifnum0=`{\fi}%
\ignorespaces
}
\newcommand{\rowtemporal}{%
\noalign{\ifnum0=`}\fi
\@rowtemporal
}
\newcommand<>{\@rowtemporal}[3]{%
\temporal#4%
{\ifnum0=`{\fi}#1{\ifnum0=`}\fi}%
{\ifnum0=`{\fi}#2{\ifnum0=`}\fi}%
{\ifnum0=`{\fi}#3{\ifnum0=`}\fi}%
\ifnum0=`{\fi}%
\ignorespaces
}
\makeatother
\begin{document}
\begin{frame}<1-3>{Test}%
\begin{tabular}{ll}
\rowcolor{blue} A & B \\
\rowonly<1>{\hline} A & B \\
\rowonly<1>{\rowcolor{yellow}} A & B \\
\rowalt<3>{\rowcolor{green}}{\rowcolor{red}} C & D \\
\rowtemporal<2>{\rowcolor{green}}{\rowcolor{yellow}}{\rowcolor{red}} E & F \\
\end{tabular}
\end{frame}
\end{document}
答案2
Martin Scharrer 很好地解释了这个问题,但我认为有一个更好(更简单)的解决方案。试试
\documentclass[table]{beamer}
\begin{document}
\begin{frame}{Boo}
\begin{table}
\centering
\small
\begin{tabular}{rcc}
\rowcolor{green}}Hey & 32.0 & 26.7\only<1>{\\}
\only<2>{\\\rowcolor{green}}Hey & 28.5 & 24.5\\
\end{tabular}
\caption{My caption}
\end{table}
\end{frame}
\end{document}
答案3
错误消息对于编译来说并不重要。您可以尝试第一行
\batchmode
在您的文档中,然后应该像往常一样创建 pdf。
答案4
对于简单的表格,您可以使用\only
整个表格:
\documentclass[table]{beamer}
\begin{document}
\begin{frame}{Boo}
\only<1>{%
\begin{tabular}{rcc}
\rowcolor{green}Hey & 32.0 & 26.7\\
Hey & 28.5 & 24.5\\
\end{tabular}}
\only<2>{%
\begin{tabular}{rcc}
Hey & 32.0 & 26.7\\
\rowcolor{green}Hey & 28.5 & 24.5\\
\end{tabular}}
\end{frame}
\end{document}