如何使 beamer、tikzmark 和 tabularray 兼容?

如何使 beamer、tikzmark 和 tabularray 兼容?

问题描述

beamertikzmark在环境中正常工作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}

这确保盒子始终在那里。

使用 tabularray 在 beamer 中显示正在工作的 tikzmarknode

(包括页码以表明这是第二滑动)

答案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}

在此处输入图片描述

相关内容