tikzmark 位置在 beamer 的套印环境中不稳定

tikzmark 位置在 beamer 的套印环境中不稳定

我的目的是突出显示等式中的一个术语,并画出指向另一个术语的箭头。

这是我的代码

\documentclass{beamer}

\usepackage{tikz}
\usetikzlibrary{arrows,calc,tikzmark}%decorations.markings,shapes,positioning

%% Beamer %%
\usefonttheme{professionalfonts}

%% TikZ %%
\tikzset{>=stealth,%
         annotations/.style={overlay,remember picture}
}

\newcommand{\hilitTerm}[2]{\tikz[remember picture,baseline,inner xsep=0pt]\node[fill=red!20,anchor=base] (#1) {#2};}

%% Commands%
\newcommand{\uf}{\boldsymbol{u}}
\renewcommand{\vec}[1]{\boldsymbol{#1}}


\begin{document}

\begin{frame}{Balance of momentum}

  \begin{overprint}

  \onslide<1-2>
  \begin{block}{}
  \begin{align*}
    \rho(\partial_t \uf + (\uf\cdot\nabla)\uf) =- \tikzmark{pPos}\nabla p + \mu \Delta \uf +  \hilitTerm{bodForce}{$\displaystyle \rho \only<1>{\vec{f}}\only<2>{\vec{g}}$}
  \end{align*}
  ~
  \end{block}
  \begin{itemize}
    \item Body forces\visible<2-3>{: gravity}
  \end{itemize}
  \begin{tikzpicture}[annotations]
    \useasboundingbox (0,0);
    \draw<2>[red,->] (bodForce.north) to[bend right=45] ($(pic cs:pPos) + (1em,2ex)$);
  \end{tikzpicture}

  \end{overprint}  

\end{frame}

\end{document}

如果绘制箭头后有另一张幻灯片(例如由于visible示例中设置的命令隐藏了单词“重力”),则箭头指向幻灯片的左下角。

在此处输入图片描述

如果绘制箭头后框架中没有其他幻灯片(例如通过将命令限制visible<2>),那么我就会得到我想要的。

在此处输入图片描述

如何防止箭头取决于是否有后续幻灯片?(当下一张幻灯片没有时也会发生同样的现象tikzmark。)

答案1

我想我需要做更多的分析来弄清楚是什么真的正在发生,但我暂时有一个解决方案,所以我暂时发布这个。如果这不管用,我得再想想。

问题是\tikzmark被调用得太频繁了。我认为是overprint环境和 都align*调用得太频繁了。两者都多次重置了它们的内容(以弄清楚间距之类的东西),并且当\tikzmark在框内调用时然后被扔掉那么它就不高兴了:它记录了一个标记,但该标记没有对应的坐标,因此使用默认值(在本例中,默认值恰好位于页面的下角)。overprint我认为,这里真正的问题是环境,因为它在幻灯片 3 上排版了方程式并将其丢弃,这是最后一次排版方程式,因此记住的位置是获胜的位置。

(临时) 解决方案是确保\tikzmark幻灯片 3 上不调用。最简单的方法是使其具有覆盖感知功能。将以下内容放在序言中:

\renewcommand<>{\tikzmark}[2][]{\only#3{\beameroriginal{\tikzmark}[{#1}]{#2}}}

(我认为这会对软件包做出很好的补充tikzmark,但我想在更新之前彻底解决这个问题。)

然后在等式中调用\tikzmark\tikzmark<2>{pPos}这将确保在第三次运行时不会调用它,因此不会覆盖第二次运行时保存的位置。


更新经过几分钟的测试...

看起来,盒子的问题是由于我使用了\immediate\write。看起来\protected@write效果更好。相关的修复将是:

\makeatletter
\tikzset{
  save picture id/.code={%
      \protected@write\pgfutil@auxout{}{%
      \string\savepointas{#1}{\pgfpictureid}}%
  },
}
\makeatother

\pgfmark宏也需要类似的修复。)

我认为该beamer版本也会很有用,所以我会把两者都放进去。

相关内容