背景

背景

背景

我想alert使用 Beamer 覆盖“”表格的每一行,一次一行。使用Martin Scharrer 的回答为什么我不能将 \rowcolor 换入 \only?(Beamer),我想出了以下代码:

\documentclass{beamer}
\usepackage{tabu}

\makeatletter
\newcommand{\rowonly}{%
    \noalign{\ifnum0=`}\fi
    \@rowonly
}
\newcommand<>{\@rowonly}[1]{%
    \only#2%
        {\ifnum0=`{\fi}#1{\ifnum0=`}\fi}%
    \ifnum0=`{\fi}%
    \ignorespaces
}
\makeatother

\newcommand*{\alertrow}{\rowonly{\rowfont{\color{red}}}}

\begin{document}
\begin{frame}{}
  \onslide<+->
  \begin{tabu}{ll}
    \rowfont{\itshape\color{structure}}
                 Fruit    & Price \\
    \alertrow<+> Apples   & \$1 \\
    \alertrow<+> Bananas  & \$2 \\
    \alertrow<+> Cherries & \$3
  \end{tabu}
\end{frame}
\end{document}

最终,我想将这种表打包到自定义环境中,例如alertedfruitprices,以便可以干净地重用它。在此环境中,重新定义\\为与\\ \alertrow上述相同的函数可能会很好。也就是说,以下内容的行为可能与上述tabu内容相同。

\begin{frame}{Example}
  \onslide<+->
  \begin{alertedfruitprices}
    \\<+> Apples   & \$1
    \\<+> Bananas  & \$2
    \\<+> Cherries & \$3
  \end{alertedfruitprices}
\end{frame}

问题

不幸的是,我无法让它工作。忽略环境alertedfruitprices并坚持直接使用tabu,我尝试在第一列的序言中使用\let\def\\,改编自如何在表格环境中重新定义 \\?

\documentclass{beamer}
\usepackage{tabu}

\makeatletter
\newcommand{\rowonly}{%
    \noalign{\ifnum0=`}\fi
    \@rowonly
}
\newcommand<>{\@rowonly}[1]{%
    \only#2%
        {\ifnum0=`{\fi}#1{\ifnum0=`}\fi}%
    \ifnum0=`{\fi}%
    \ignorespaces
}
\makeatother

\newcommand*{\alertrow}{\rowonly{\rowfont{\color{red}}}}

\begin{document}
\begin{frame}{Example}
  \onslide<+->
  \begin{tabu}{>{\let\oldcr\\%
                 \def\\{\oldcr\alertrow}}
               ll}
    \rowfont{\itshape\color{structure}}
          Fruit    & Price
    \\<+> Apples   & \$1
    \\<+> Bananas  & \$2
    \\<+> Cherries & \$3
  \end{tabu}
\end{frame}
\end{document}

由于某种原因,此代码似乎没有正确地重新定义,证据是没有覆盖并且在每行的开头\\打印:<+>

在此处输入图片描述

问题

有人可以解释一下为什么\def\\在内不起作用吗tabu

答案1

表格中的每个单元格都包含在一个组中,因此您的\def操作在一行的第一个单元格中执行,但在第二个单元格中无效。所以

\begin{tabu}{l >{\let\oldcr\\\def\\{\oldcr\alertrow}}l}

甚至更好,说

\newcommand{\beamerbackslash}{\let\oldcr\\\def\\{\oldcr\alertrow}}

在序言和

\begin{tabu}{l >{\beamerbackslash}l}

在文档正文中。

相关内容