投影机覆盖和表格规则

投影机覆盖和表格规则

我尝试\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}

相关内容