我尝试\only{...}
在表格中使用 来选择性地添加行块。只要我没有\midrule
或\bottomrule
包含 或 包含 中的部分,这种方法就有效\only{...}
。
为什么会发生这种情况?有没有什么办法可以实现这一点?
以下是一个示例:
\documentclass{beamer}
\usepackage{booktabs}
\begin{document}
\begin{frame}{Example}
\begin{tabular}{ll}
\toprule
bla & bla \\
\midrule
A & A \\
B & B \\
\only<1>{%
\midrule
C & C \\
D & D \\ }
\bottomrule
\end{tabular}
\only<2>{Something else}
\end{frame}
\end{document}
答案1
我设法让它工作,并仔细放置了一些注释,例如,见下文。似乎 LaTeX 不喜欢将\\
和\*rule
放在不同的行上。
\documentclass{beamer}
\usepackage{booktabs}
\begin{document}
\begin{frame}{Example}
\begin{tabular}{ll}
\toprule
bla & bla \\
\midrule
A & A \\
B & B %
\only<1>{%
\\\midrule
C & C %
}%
\only<2>%
{%
\\
D & D %
}%
\\ \bottomrule
\end{tabular}
\end{frame}
\end{document}
答案2
您之所以得到一个,是因为在完全展开之后,在 中使用的TeX 基元和(用于宏! Misplaced \noalign
)之间可能没有剩余的标记。在展开过程中消失的标记(如)是可以的。但是它不能完全展开,因为它需要跟踪此幻灯片上有多少个叠加层。因此它不能在和之间使用。(顺便说一下, 也是如此)。\cr
\\
\noalign
\*rule
\if
\only
\\
\*rule
\multicolumn
我不会使用,\only
因为它不会在参数隐藏的覆盖层上放置任何内容,从而导致框架内容跳动。相反,我会使用\uncover
,其默认行为类似于\visible
。这意味着参数在非匹配的覆盖层上不可见,但如果参数确实放在那里,则会保留所需的空间。这避免了不必要的跳转。如果您以后想要不同的行为,您可以轻松地使用来更改它\setbeamercovered
,例如将其设置为transparent
。但当然,这对手头的问题没有任何改变。
\only
和\uncover
都是\alt
命令的特殊情况,它将第一个参数放在匹配的覆盖上,将第二个参数放在不匹配的覆盖上。我已经实现了一个简化的、完全可扩展的版本\alt
。因为它无法跟踪覆盖,所以必须单独声明现有的覆盖——要么在框架的开头使用,\begin{frame}<-5>
要么通过通常的覆盖感知命令,如\only
。我已经用它\xalt
来定义宏的覆盖感知版本\*rule
。
我没有重新实现覆盖规范的全部功能,而只实现了最重要的功能:
<n>
单一覆盖<n-m>
一系列叠加<n->
所有覆盖≥n<-m>
所有覆盖≤m<*>
所有叠加层
预测宏后面是否有可选的覆盖规范\*rule
并不像平常那么安全,因为它需要完全可扩展。因此,您应该确保{
后面没有我重新定义的\*rule
宏。但无论如何,我想不出任何以 , 开头单元格有意义的情况{
。
我已经获取了需要插入多少空间而不是\*rule
宏的信息booktabs 文档第七节命令技术摘要。
\documentclass{beamer}
\usepackage{booktabs}
% ------- \xalt -------
\makeatletter
\providecommand\@secondofthree[3]{#2}
\def\xalt<#1>{%
\if *#1%
% matches any overlay
\expandafter \@secondofthree
\else
% continue overlay check
\expandafter \@firstofone
\fi
{\@xalt@checkrange<#1->}%
}
\def\@xalt@checkrange<#1-#2>{%
\ifx \relax#2\relax
% is not a range
\expandafter \@firstoftwo
\else
% is a range
\expandafter \@secondoftwo
\fi
{\@xalt@checknumber<#1>}%
{\@xalt@checklower<#1-#2>}%
}
\def\@xalt@checknumber<#1>{%
\ifnum \beamer@slideinframe=#1
% overlay is matched
\expandafter \@firstoftwo
\else
% overlay is *not* matched
\expandafter \@secondoftwo
\fi
}
\def\@xalt@checklower<#1-#2>{%
\ifx \relax#1\relax
% lower bound not given => match
\expandafter \@firstofone
\else \ifnum \beamer@slideinframe<#1
% overlay is *not* matched
\expandafter\expandafter\expandafter \@thirdofthree
\else
% lower bound is matched
\expandafter\expandafter\expandafter \@firstofone
\fi \fi
{\@xalt@checkupper<-#2>}%
}
% #2 ends with an additional -
\def\@xalt@checkupper<-#1->{%
\ifx \relax#1\relax
% upper bound not given => match
\expandafter \@firstoftwo
\else \ifnum \beamer@slideinframe>#1
% overlay is *not* matched
\expandafter\expandafter\expandafter \@secondoftwo
\else
% upper bound is matched
\expandafter\expandafter\expandafter \@firstoftwo
\fi \fi
}
\makeatother
% ------- \toprule -------
\let\originaltoprule=\toprule
\def\overlayawaretoprule<#1>{%
\xalt<#1>%
{\toprule}%
{\addlinespace[\dimexpr \abovetopsep + \heavyrulewidth + \belowrulesep \relax]}%
}
\renewcommand{\toprule}[1]{%
\ifx <#1%
\expandafter \overlayawaretoprule
\else
\expandafter \originaltoprule
\fi
#1%
}
% ------- \midrule -------
\let\originalmidrule=\midrule
\def\overlayawaremidrule<#1>{%
\xalt<#1>%
{\midrule}%
{\addlinespace[\dimexpr \aboverulesep + \lightrulewidth + \belowrulesep \relax]}%
}
\renewcommand{\midrule}[1]{%
\ifx <#1%
\expandafter \overlayawaremidrule
\else
\expandafter \originalmidrule
\fi
#1%
}
% ------- \bottomrule -------
\let\originalbottomrule=\bottomrule
\def\overlayawarebottomrule<#1>{%
\xalt<#1>%
{\bottomrule}%
{\addlinespace[\dimexpr \aboverulesep + \heavyrulewidth + \belowbottomsep \relax]}%
}
\renewcommand{\bottomrule}[1]{%
\ifx <#1%
\expandafter \overlayawarebottomrule
\else
\expandafter \originalbottomrule
\fi
#1%
}
% ------- test document -------
\begin{document}
\begin{frame}{Example}
\begin{table}
\begin{tabular}{ll}
\toprule
bla & bla \\
\midrule
A & A \\
B & B \\
\midrule<2->
\uncover<2->{C & C} \\
\uncover<2->{D & D} \\
\bottomrule
\end{tabular}
\end{table}
\uncover<3->{Something else}
\end{frame}
\end{document}
如果您想要的行为,\only
您可以简单地将第二个参数留空\xalt
:
\def\xonly<#1>#2{\xalt<#1>{#2}{}}
\begin{document}
\begin{frame}{Example}
\begin{table}
\begin{tabular}{ll}
\toprule
bla & bla \\
\midrule
A & A \\
B & B \\
\xonly<2->{\midrule}
\xonly<2->{C & C \\}
\xonly<2->{D & D \\}
\bottomrule
\end{tabular}
\end{table}
\only<3->{Something else}
\end{frame}
\end{document}
答案3
我不确定为什么会发生这种情况,但这里有一个严厉的解决方案:在不同的\only
语句中写两次表格环境。
\begin{frame}{Example}
\only<1>{\begin{tabular}{ll}
\toprule
bla & bla \\
\midrule
A & A \\
B & B \\
\midrule
C & C \\
D & D \\
\bottomrule
\end{tabular}
}
\only<2->{\begin{tabular}{ll}
\toprule
bla & bla \\
\midrule
A & A \\
B & B \\
\bottomrule
\end{tabular}
}
\only<2>{Something else}
\end{frame}