我在 beamer 中有一张如下的表格。
\documentclass{beamer}
\usepackage[utf8]{inputenc}
\usepackage{default}
\begin{document}
\begin{frame}
\frametitle{test}
\begin{center}
\huge \Huge
\begin{tabular}{|c|c|c|c|c|c|c|}
\hline
A&
B&
C&
B&
A&
B&
C\\
\hline
\end{tabular}
\end{center}
\end{frame}
我希望在第一帧中突出显示前三个单元格,方法是将包含这三个单元格的矩形的外边框加粗并使用不同的颜色。在下一帧中,单元格 2 至 4 将使用此边框,在下一帧中,单元格 3 至 5 将使用此边框,在最后一帧中,单元格 4 至 6 将使用此边框。
我们怎样才能做到这一点?
我觉得我可以通过设置四个大部分重复的框架来实现这一点,并且每个框架中的表格都并排粘在一起。然而,这似乎不是一个好的解决方案。
答案1
您可以使用 TikZ 矩阵(而不是tabular
)来执行此操作。
代码
\documentclass{beamer}
\usepackage{tikz}
\usetikzlibrary{matrix}
\begin{document}
\begin{frame}{test}
\centering
\begin{tikzpicture}
\tikzset{
mstyle/.style={column sep=-\pgflinewidth,nodes={draw},font=\huge},
window/.style={draw,very thick,blue},
}
\matrix(m)[matrix of nodes,ampersand replacement=\&,mstyle]{
A \& B \& C \& B \& A \& B \& C \\
};
\foreach \j [count=\i] in {3,...,7}{
\onslide<\i>{
\draw[window](m-1-\i.north west)rectangle(m-1-\j.south east);
}}
\end{tikzpicture}
\end{frame}
\end{document}
输出
答案2
您可以尝试这样的事情:
\documentclass{beamer}
\usepackage[utf8]{inputenc}
\usepackage{default,tikz}
\usetikzlibrary{tikzmark,calc}
\begin{document}
\begin{frame}
\frametitle{test}
\centering
\begin{tikzpicture}[remember picture, ultra thick, font=\Huge]
\node{%
\begin{tabular}{|*{7}{c|}}
\hline
\subnode{a}{A}&
\subnode{b}{B}&
\subnode{c}{C}&
\subnode{d}{D}&
\subnode{e}{E}&
\subnode{f}{F}&
\subnode{g}{G}\\
\hline
\end{tabular}
};
\onslide<1>{%
\draw [blue] ($(a.north west) - (-.25em,.5em)$) -- ($(c.north east) - (.25em,.5em)$);
\draw [blue] ($(a.south west) - (-.25em,0)$) -- ($(c.south east) - (.25em,0)$);
}
\onslide<2>{%
\draw [blue] ($(b.north west) - (-.25em,.5em)$) -- ($(d.north east) - (.25em,.5em)$);
\draw [blue] ($(b.south west) - (-.25em,0)$) -- ($(d.south east) - (.25em,0)$);
}
\onslide<3>{%
\draw [blue] ($(c.north west) - (-.25em,.5em)$) -- ($(e.north east) - (.25em,.5em)$);
\draw [blue] ($(c.south west) - (-.25em,0)$) -- ($(e.south east) - (.25em,0)$);
}
\onslide<4>{%
\draw [blue] ($(d.north west) - (-.25em,.5em)$) -- ($(f.north east) - (.25em,.5em)$);
\draw [blue] ($(d.south west) - (-.25em,0)$) -- ($(f.south east) - (.25em,0)$);
}
\end{tikzpicture}
\end{frame}
\end{document}
编辑
正如评论中所要求的那样,此代码通过连接垂直线将粗线变成“窗口”。
因为粗线现在勾勒出一个矩形,形成一条连续的线,所以\draw
每帧可以使用一个而不是两个命令,我们可以用来-- cycle
完成矩形形状:
\documentclass{beamer}
\usepackage[utf8]{inputenc}
\usepackage{default,tikz}
\usetikzlibrary{tikzmark,calc}
\begin{document}
\begin{frame}
\frametitle{test}
\centering
\begin{tikzpicture}[remember picture, ultra thick, font=\Huge]
\node{%
\begin{tabular}{|*{7}{c|}}
\hline
\subnode{a}{A}&
\subnode{b}{B}&
\subnode{c}{C}&
\subnode{d}{D}&
\subnode{e}{E}&
\subnode{f}{F}&
\subnode{g}{G}\\
\hline
\end{tabular}
};
\onslide<1>{%
\draw [blue] ($(a.north west) - (-.275em,.425em)$) -- ($(c.north east) - (.2em,.425em)$) -- ($(c.south east) - (.2em,.05em)$) -- ($(a.south west) - (-.275em,.05em)$) -- cycle;
}
\onslide<2>{%
\draw [blue] ($(b.north west) - (-.275em,.425em)$) -- ($(d.north east) - (.2em,.425em)$) -- ($(d.south east) - (.2em,.05em)$) -- ($(b.south west) - (-.275em,.05em)$) --cycle;
}
\onslide<3>{%
\draw [blue] ($(c.north west) - (-.275em,.425em)$) -- ($(e.north east) - (.2em,.425em)$) -- ($(e.south east) - (.2em,.05em)$) -- ($(c.south west) - (-.275em,.05em)$) -- cycle;
}
\onslide<4>{%
\draw [blue] ($(d.north west) - (-.275em,.425em)$) -- ($(f.north east) - (.2em,.425em)$) -- ($(f.south east) - (.2em,.05em)$) -- ($(d.south west) - (-.275em,.05em)$) -- cycle;
}
\end{tikzpicture}
\end{frame}
\end{document}
\foreach
可以使用循环遍历由幻灯片编号、所需“窗口”左侧的节点和所需“窗口”右侧的节点组成的三元组集来简化此代码。我们可以使用\slide/\leftside/\rightside
我们想要循环的变量,如下所示:
\documentclass{beamer}
\usepackage[utf8]{inputenc}
\usepackage{default,tikz}
\usetikzlibrary{tikzmark,calc}
\begin{document}
\begin{frame}
\frametitle{test}
\centering
\begin{tikzpicture}[remember picture, ultra thick, font=\Huge]
\node{%
\begin{tabular}{|*{7}{c|}}
\hline
\subnode{a}{A}&
\subnode{b}{B}&
\subnode{c}{C}&
\subnode{d}{D}&
\subnode{e}{E}&
\subnode{f}{F}&
\subnode{g}{G}\\
\hline
\end{tabular}
};
\foreach \slide/\leftside/\rightside in {1/a/c,2/b/d,3/c/e,4/d/f}
\onslide<\slide>{%
\draw [blue] ($(\leftside.north west) - (-.275em,.425em)$) -- ($(\rightside.north east) - (.2em,.425em)$) -- ($(\rightside.south east) - (.2em,.05em)$) -- ($(\leftside.south west) - (-.275em,.05em)$) -- cycle;
};
\end{tikzpicture}
\end{frame}
\end{document}
这使得调整“窗口”的大小、位置或其他特征变得更加容易,并且可以直接将滑动框架延伸到更长的一排“窗格”。