更新(2018 年 8 月 3 日):此问题已在最新版本的 tikzmark 包中修复。 cfr 提出的解决方法,用于\beameroriginal
重新定义\tikzmark
内部 beamer 环境,现已纳入 tikzmark 包。因此,这个问题现在仅具有历史意义。
以前,这是可行的,包括 pgf 版本 3.0.1a:
\documentclass{beamer}
%\documentclass{article}
\usepackage{tikz,pgfplots}
\usetikzlibrary{positioning,calc,tikzmark}
\begin{document}
\begin{frame}\frametitle{A SLIDE}
meaningless filler\tikzmark{a}
\begin{tikzpicture}[overlay,>=latex,shorten >=1pt,->,remember picture]
% old preferred syntax for using tikz marks inside tikz pictures
\node (foo) at (1,-3) {\tikzmark{b}};
% new preferred syntax for using tikz marks inside tikz pictures
% \tikzmark{b}{(1,-3)}
\end{tikzpicture}
\begin{tikzpicture}[overlay,>=latex,shorten >=1pt,->,remember picture]
\draw[black] (pic cs:a) -- (4,-3);
\draw[black] (pic cs:b) -- (4,-3);
\end{tikzpicture}
\end{frame}
\end{document}
现在我更新了一些软件包(可能包括 beamer),但它失败了,并出现错误“无法解析此坐标”。在互联网上搜索了一下,发现\tikzmark
现在在 tikzpicture 内部使用的首选方式是\tikzmark{b}{(1,-3)}
。然而,这也失败了,并出现相同的错误:
\documentclass{beamer}
%\documentclass{article}
\usepackage{tikz,pgfplots}
\usetikzlibrary{positioning,calc,tikzmark}
\begin{document}
\begin{frame}\frametitle{A SLIDE}
meaningless filler\tikzmark{a}
\begin{tikzpicture}[overlay,>=latex,shorten >=1pt,->,remember picture]
% old preferred syntax for using tikz marks inside tikz pictures
% \node (foo) at (1,-3) {\tikzmark{b}};
% new preferred syntax for using tikz marks inside tikz pictures
\tikzmark{b}{(1,-3)}
\end{tikzpicture}
\begin{tikzpicture}[overlay,>=latex,shorten >=1pt,->,remember picture]
\draw[black] (pic cs:a) -- (4,-3);
\draw[black] (pic cs:b) -- (4,-3);
\end{tikzpicture}
\end{frame}
\end{document}
另一方面,问题似乎只出现在投影机上,因为这样做有效:
%\documentclass{beamer}
\documentclass{article}
\usepackage{tikz,pgfplots}
\usetikzlibrary{positioning,calc,tikzmark}
\begin{document}
%\begin{frame}\frametitle{A SLIDE}
meaningless filler\tikzmark{a}
\begin{tikzpicture}[overlay,>=latex,shorten >=1pt,->,remember picture]
% old preferred syntax for using tikz marks inside tikz pictures
% \node (foo) at (1,-3) {\tikzmark{b}};
% new preferred syntax for using tikz marks inside tikz pictures
\tikzmark{b}{(1,-3)}
\end{tikzpicture}
\begin{tikzpicture}[overlay,>=latex,shorten >=1pt,->,remember picture]
\draw[black] (pic cs:a) -- (4,-3);
\draw[black] (pic cs:b) -- (4,-3);
\end{tikzpicture}
%\end{frame}
\end{document}
(最后,为了完整性,\node (foo) at (1,-3) {\tikzmark{b}};
在文章类中使用,但使用新的包,也会失败,也许正如预期的那样。)
我害怕浏览 beamer 类文件。我是否首先遗漏了“明显”的东西?
答案1
嵌套 Ti钾Z 图片不受支持。就是这样。有时它们能用,但预计会坏掉。
\tikzmark
创建 Ti钾Z 图片。虽然现在可以在环境内部使用它tikzpicture
,但它不应该在环境内部的节点内部使用tikzpicture
。
图书馆为此类情况tikzmark
提供了服务。\subnode{}{}
\documentclass{beamer}
\usepackage{tikz}
\usetikzlibrary{tikzmark}
\begin{document}
\begin{frame}\frametitle{A SLIDE}
meaningless filler\tikzmark{a}
\begin{tikzpicture}[overlay,>=latex,shorten >=1pt,->,remember picture]
% this has never been preferred: \tikzmark shouldn't be used inside a tikzpicture with any syntax
\node (foo) at (1,-3) {\subnode{b}{}};
\end{tikzpicture}
\begin{tikzpicture}[overlay,>=latex,shorten >=1pt,->,remember picture]
\draw[black] (pic cs:a) -- (4,-3);
\draw[black] (b) -- (4,-3);
\end{tikzpicture}
\end{frame}
\end{document}
但是,您实际上并不需要,\subnode{}{}
因为您的主文件中没有其他内容\node {}
。
所以你可以使用
\documentclass{beamer}
\usepackage{tikz}
\usetikzlibrary{tikzmark}
\begin{document}
\begin{frame}\frametitle{A SLIDE}
meaningless filler\tikzmark{a}
\begin{tikzpicture}[overlay,>=latex,shorten >=1pt,->,remember picture]
% this has never been preferred: \tikzmark shouldn't be used inside a tikzpicture with any syntax
\node (foo) at (1,-3) {};
\end{tikzpicture}
\begin{tikzpicture}[overlay,>=latex,shorten >=1pt,->,remember picture]
\draw[black] (pic cs:a) -- (4,-3);
\draw[black] (foo) -- (4,-3);
\end{tikzpicture}
\end{frame}
\end{document}
我用过,\node ...
因为它给出了完全相同的结果。但\coordinate
在大多数情况下,显然这是一个更明显的选择。
\tikzmark
内钛使用钾此外,Z 图片可能不适用于使用选项的图片remember picture, overlay
。请注意,手册中的示例不包括这些选项。特别是,overlay
overoverlay
没有任何意义。您覆盖包含标记的图片,然后用引用它的图片覆盖它。但标记的重点在于它们的具体位置,不是吗?
无论如何,如果没有这些选项,我就无法使inside
语法正常工作......
编辑
我认为新语法不是为了与 Beamer 使用的特殊代码协同工作的。
\renewcommand<>{\tikzmark}[2][]{\only#3{\beameroriginal{\tikzmark}[{#1}]{#2}}}
该库这样做是为了使\tikzmark
叠加规范可感知。它还需要确保\tikzmark
幻灯片与 Beamer 框架内的特定幻灯片相关联
tikzmark suffix=-\the\beamer@slideinframe
扩展出了问题,所以 Ti钾Z 尝试解析类似{[}
节点名称的内容....
如果您的框架不使用叠加规范,因此一个框架只有一个幻灯片(至少在您想要使用它的地方),您可以使用
\begin{frame}\frametitle{A SLIDE}
meaningless filler\tikzmark{d}
\begin{tikzpicture}[>=latex,shorten >=1pt,->,remember picture,overlay]
\beameroriginal{\tikzmark}{e}{(1,-3)}
\end{tikzpicture}
\begin{tikzpicture}[overlay,>=latex,shorten >=1pt,->,remember picture]
\draw[black] (pic cs:d) -- (4,-3);
\draw[black] (pic cs:e) -- (4,-3);
\end{tikzpicture}
\end{frame}
然而,据我所知,它并没有被记录为最终用户宏,所以将来这可能会被破坏。
不过,我真不明白overlay
在创建标记时使用它有什么意义。它使标记变得无形。也许我不明白这有什么用。是的。但我甚至不明白它怎么可能连贯。
手册中的示例很有意义,因为它们没有这样做。但是,在这里,你以一种我无法理解的方式将东西叠加在叠加的东西上。