背景
我想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}
在文档正文中。