背景:在 Beamer 中叠加 tikz 时,我遇到了一些意外情况matrix
。latex 代码在最后给出(笔记:您也可以阅读并复制分享Latex:TikzMatrixOverlay)。有两个 tikz 矩阵,第一个没有叠加的矩阵用于比较。第二个有叠加的矩阵在以下方面不令人满意:
- 针对 (2,1) 单元格(第二行,第一列)的指令
|[red]|
不起作用;请注意,|[red]|
针对 (3,2) 单元格的指令确实起作用。- 我不能用 替换
\only<4>{4444 & 4444 & 4444} \\
。\only<4>{4444 & 4444 & 4444 \\}
否则,我会收到Missing \endgroup inserted
错误。- 如果我使用
\only<4>{4444 & 4444 & 4444} \\
(如源代码所示),则覆盖期间会显示一个额外的空单元格(在第四行)。
请注意,您还可以看到源代码中的注释和下图中这三个问题。
问题:因此,我的问题是如何解决这三个问题。具体来说,
- 启用
|[red]|
(2,1)单元格的指令;- 消除叠加过程中多余的空单元格(在第四行);
- 逐行叠加 tikz 矩阵。
\documentclass{beamer}
\usepackage{tikz}
\usetikzlibrary{matrix}
\begin{document}
\begin{frame}[fragile]{TikzMatrixOverlay}
\begin{tikzpicture}
% matrix without overlay for comparison
\matrix [align = center, matrix of nodes, nodes = {text width = 16mm, draw}]
{
1 & 1 & 1 \\
|[red]| 22 & 22 & 22 \\
333 & |[red]| 333 & 333 \\
4444 & 4444 & 4444 \\
};
% matrix with overlay
\matrix [align = center, xshift = 6.0cm, matrix of nodes, nodes = {text width = 16mm, draw}]
{
1 & 1 & 1 \\
\only<2->{|[red]| 22 & 22 & 22 \\} % Problem 1: the |[red]| instruction does not work.
\only<3->{333 & |[red]| 333 & 333 \\} % this |[red]| instruction does work.
\only<4>{4444 & 4444 & 4444} \\ % Problem 2: it cannot be: \only<4>{4444 & 4444 & 4444 \\}
};
\end{tikzpicture}
\end{frame}
\end{document}
答案1
就在最近,昨天,我给 CTAN 发了一个新的包裹,名为aobs-tikz
正是为这些工作而设计的。它基于 Daniel 的方法,思维导图 tikzpicture 在 beamer 中 (逐步显示)它扩展了我定义的样式使用 TikZ 节点在 Beamer 中突出显示。
其用法预览:
\documentclass{beamer}
\usepackage{lmodern,tikz}
\usetikzlibrary{overlay-beamer-styles,matrix}
\begin{document}
\begin{frame}[fragile]{TikzMatrixOverlay}
\begin{tikzpicture}[
background default draw=black, % define default behaviour
background default text=black, % define default behaviour
background default aspect={solid}, % define default behaviour
highlight/.style={background draw=red, % define modified behaviour
background text=red, % define modified behaviour
background aspect=dashed,% define modified behaviour
},
]
% matrix without overlay for comparison
\matrix [align = center, matrix of nodes, nodes = {text width = 16mm, draw},]
{
1 & 1 & 1 \\
|[red]| 22 & 22 & 22 \\
333 & |[red]| 333 & 333 \\
4444 & 4444 & 4444 \\
};
% matrix with overlay
\matrix [align = center, xshift = 6.0cm, matrix of nodes, nodes = {text width = 16mm,draw},
row 4/.style={visible on=<3>}% original visible on style by Daniel
]{
1 & 1 & 1 \\
|[highlight, draw on=<1->, text on=<1->, aspect on=<3>]| 22 & 22 & 22 \\ % new styles
333 & |[highlight, draw on=<2->, text on=<2->, aspect on=<3>]| 333 & 333 \\ % new styles
4444 & 4444 & 4444\\
};
\end{tikzpicture}
\end{frame}
\end{document}
答案2
困难在于,TikZ 在测试单元格如何开始或单元格是否存在时不会进行任何扩展。因此,\only
即使没有内容,所有 s 也被视为“这是一个新单元格”。此外,它们被视为单元格的开头,意味着样式选项(例如 )的测试|[red]|
失败。此外,由于 TikZ 矩阵必须以 结尾\\
,因此它后面的任何内容都被视为新行,这就是空方块存在的原因。一种解决方案是确保所有 s\only
都不会出现在单元格的开头。这不是我所说的完美解决方案,但在这种情况下有效。本质上,我们将行视为以\\
在上一行。这确保当\\
看到 时,\only
已经展开,所有问题都会悄悄消失。(使用此解决方案时,必须对空格稍加注意。)
\documentclass{beamer}
%\url{http://tex.stackexchange.com/q/153782/86}
\usepackage{tikz}
\usetikzlibrary{matrix}
\begin{document}
\begin{frame}[fragile]{TikzMatrixOverlay}
\begin{tikzpicture}[baseline = 0pt]
% matrix without overlay for comparison
\matrix [anchor=north,align = center, matrix of nodes, nodes = {text width = 16mm, draw}]
{
1 & 1 & 1 \\
|[red]| 22 & 22 & 22 \\
333 & |[red]| 333 & 333 \\
4444 & 4444 & 4444 \\
};
% matrix with overlay
\matrix [anchor = north, align = center, xshift = 6.0cm, matrix of nodes, nodes = {text width = 16mm, draw}]
{
1 & 1 & 1\only<2->{\\
|[red]| 22 & 22 & 22}% Problem 1: the |[red]| instruction does not work.
\only<3->{\\ 333 & |[red]| 333 & 333}% this |[red]| instruction does work.
\only<4>{\\ 4444 & 4444 & 4444}\\ % Problem 2: it cannot be: \only<4>{4444 & 4444 & 4444 \\}
};
\end{tikzpicture}
\end{frame}
\end{document}