问题描述
beamer
和tikzmark
在环境中正常工作matrix
。但是当它们在环境中使用时,会出现很大的差距。如何解决这个问题?最好tblr
使用。tikzmarknode
梅威瑟:
\documentclass{beamer}
\usepackage{amsmath}
\usepackage{tabularray}
\usepackage{tikz}
\usetikzlibrary{tikzmark, calc}
\begin{document}
\begin{frame}
\frametitle{tikzmarknode works for matrix}
\begin{equation*}
\begin{matrix}
1 & \tikzmarknode{A}{\frac{1}{2}} \\
3 & 4
\end{matrix}
\end{equation*}
\onslide<2->{
\begin{tikzpicture}[overlay, remember picture]
\node (B) at ($(A) + (45:2)$) {fraction!};
\draw[->,red] (A) -- (B);
\end{tikzpicture}
}
\end{frame}
\begin{frame}
\frametitle{tikzmarknode doesn't work for tblr and one layer}
\begin{equation*}
\begin{tblr}{cells = {mode = imath}}
1 & \tikzmarknode{A}{\frac{1}{2}} \\
3 & 4
\end{tblr}
\end{equation*}
\begin{tikzpicture}[overlay, remember picture]
\node (B) at ($(A) + (45:2)$) {fraction!};
\draw[->,red] (A) -- (B);
\end{tikzpicture}
\end{frame}
\begin{frame}
\frametitle{tikzmarknode doesn't work for tblr and multiple layers}
\begin{equation*}
\begin{tblr}{cells = {mode = imath}}
1 & \tikzmarknode{A}{\frac{1}{2}} \\
3 & 4
\end{tblr}
\end{equation*}
\only<2->{
\begin{tikzpicture}[overlay, remember picture]
\node (B) at ($(A) + (45:2)$) {fraction!};
\draw[->,red] (A) -- (B);
\end{tikzpicture}
}
\end{frame}
\begin{frame}
\frametitle{a second example}
\begin{equation*}
\begin{tblr}{cells = {mode = imath}}
1 & \tikzmarknode{A}{\frac{1}{2}} \\
3 & 4
\end{tblr}
\end{equation*}
\begin{tikzpicture}[overlay, remember picture]
\node (B) at ($(A) + (45:2)$) {important};
\draw[->,red] (A) -- (B);
\end{tikzpicture}
\begin{itemize}
\item<2-> Don't forget the fraction
\item<3-> It's $\frac{1}{2}$
\end{itemize}
\end{frame}
\end{document}
答案1
所以...这很复杂...
我几乎一无所知tabularray
,但从我所发现的,它确实很多测量东西来确定如何在表格中布局单元格。在我的实验中,每个单元格都排版至少五次,实际上是第四实际渲染的版本。这意味着节点\tikzmarknode
被定义了五次(至少 - 当你将数学运算加入其中时,它会变得更加复杂,因为然后\tikzmarknode
进行一些内部操作以\mathchoice
匹配外部数学模式)。
多年来,我建立了一个复杂的系统来\tikzmark
确保记住的页面上的点实际上是页面上出现的点,因此如果\tikzmark
在随后被丢弃的框中处理了,则结果\tikzmark
也会被丢弃。这其中的一部分与有关,beamer
因为如果位于\tikzmark
具有多张幻灯片的框架上,则实际标记可能会根据其他框架内容在幻灯片之间移动,但名称保持不变。解决此问题的方法是默默地将投影仪幻灯片编号附加到每个幻灯片上\tikzmark
- 无论是在定义时还是在使用时。这确保\tikzmark
正在使用的与定义的相同。
现在我们回到\tikzmarknode
。这存在同样的问题 - 由于有多张幻灯片,您在不同的幻灯片上重复使用相同的节点名称。通常,这不是问题,因为定义节点会覆盖以前的定义,这意味着节点的当前定义始终是最新的(这与底层不同,\tikzmark
因为底层必须通过文件工作,aux
这意味着最后一个\tikzmark
具有给定名称的定义是整个文档中使用的定义)。但是,由于tabularray
定义并多次丢弃其单元格,因此节点定义会纠缠在一起。具体而言,在关键阶段,第二张幻灯片上使用的节点定义实际上是第一张幻灯片中的节点定义。至关重要的是,这用于设置 ,baseline
并且\tikzmarknode
会影响单元格的高度。
所以有两个选择,一个简单,一个稍微复杂一点。我同时介绍这两个选择,部分是为了让我记住这两个选择都存在,因为我可以想象到以后简单的选择不适合的情况。
简单的解决方案是模拟幻灯片修复\tikzmark
。\tikzmarknode
这是将幻灯片编号默默地附加到节点名称:
\makeatletter
\tikzset{
name suffix=-\the\beamer@slideinframe
}
\makeatother
(如果您在文档中name suffix/.append=\the\beamer@slideinframe
使用其他s ,则可能需要这样做。)name suffix
\tikzmarknode
这可以通过使用样式在 s上完成every tikzmarknode picture
。
更复杂的方法是禁用未渲染的baseline
设置\tikzmarknode
。为此,我们需要定义一个新键,用于测试是否\tikzmarknode
实际渲染,并允许我们根据是否渲染来执行不同的样式。
\makeatletter
\tikzset{
if picture is remembered/.code 2 args={
\ifpgfrememberpicturepositiononpage
\@ifundefined{pgf@sys@pdf@mark@pos@\pgfpictureid}{%
\pgfkeysalso{#2}%
}{%
\pgfkeysalso{#1}%
}%
\fi
},
every tikzmarknode picture/.style={
if picture is remembered={
}{
baseline=default
}
}
}
\makeatother
完整代码:
\documentclass{beamer}
%\url{https://tex.stackexchange.com/q/654140/86}
\usepackage{amsmath}
\usepackage{tabularray}
\usepackage{tikz}
\usetikzlibrary{tikzmark, calc}
\makeatletter
\tikzset{
if picture is remembered/.code 2 args={
\ifpgfrememberpicturepositiononpage
\@ifundefined{pgf@sys@pdf@mark@pos@\pgfpictureid}{%
\pgfkeysalso{#2}%
}{%
\pgfkeysalso{#1}%
}%
\fi
},
every tikzmarknode picture/.style={
if picture is remembered={
}{
baseline=default
}
},
% name suffix=-\the\beamer@slideinframe
}
\makeatother
\begin{document}
\begin{frame}
\frametitle{tikzmarknode doesn't work for tblr}
\begin{equation*}
\begin{tblr}{cells = {mode = imath}}
1 & \tikzmarknode{A}{\frac{1}{2}} \\
3 & 4
\end{tblr}
\end{equation*}
\only<2->{
\begin{tikzpicture}[overlay, remember picture]
\node (B) at ($(A) + (45:2)$) {fraction!};
\draw[->,red] (A) -- (B);
\end{tikzpicture}
}
\end{frame}
\end{document}
顺便说一句,将整个 封闭tikzpicture
在 中\only
会导致页面上环境的整体位置发生很小的跳跃tblr
。这是因为即使overlay
, 也会tikzpicture
形成一个框,尽管它是空的,但可以稍微移动一些东西。一个简单的解决方法是:
\begin{tikzpicture}[overlay, remember picture]
\node<2-> (B) at ($(A) + (45:2)$) {fraction!};
\draw<2->[->,red] (A) -- (B);
\end{tikzpicture}
这确保盒子始终在那里。
(包括页码以表明这是第二滑动)
答案2
为了完全避免该问题,您可以\tikzmark
使用\tikzmarknode
:
\documentclass{beamer}
\usepackage{tabularray}
\usepackage{tikz}
\usetikzlibrary{tikzmark, calc}
\begin{document}
\begin{frame}
\frametitle{tikzmarknode doesn't work for tblr}
\begin{equation*}
\begin{tblr}{cells = {mode = imath}}
1 & \frac{1}{2}\tikzmark{A} \\
3 & 4
\end{tblr}
\end{equation*}
\begin{tikzpicture}[overlay, remember picture]
\node<2-> (B) at ($(pic cs:A) + (45:2)$) {fraction!};
\draw<2->[->,red] (pic cs:A) -- (B);
\end{tikzpicture}
\end{frame}
\end{document}
如果您由于某种原因需要,您可以通过仅在第二个覆盖上\tikzmarknode
使用来解决问题:\tikzmarknode
\documentclass{beamer}
\usepackage{tabularray}
\usepackage{tikz}
\usetikzlibrary{tikzmark, calc}
\begin{document}
\begin{frame}
\frametitle{tikzmarknode doesn't work for tblr}
\begin{equation*}
\begin{tblr}{cells = {mode = imath}}
1 & \alt<2>{\tikzmarknode{A}{\frac{1}{2}}}{\frac{1}{2}} \\
3 & 4
\end{tblr}
\end{equation*}
\begin{tikzpicture}[overlay, remember picture]
\node<2> (B) at ($(A) + (45:2)$) {fraction!};
\draw<2>[->,red] (A) -- (B);
\end{tikzpicture}
\end{frame}
\end{document}