我的目的是突出显示等式中的一个术语,并画出指向另一个术语的箭头。
这是我的代码
\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
版本也会很有用,所以我会把两者都放进去。