为什么我不能将 \rowcolor 换入 \only?(Beamer)

为什么我不能将 \rowcolor 换入 \only?(Beamer)

请参阅以下最小示例:

\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 会在单元格开头扩展宏以查找包含的\noaligns。

\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}

相关内容