编辑

编辑

更新(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

嵌套 TiZ 图片不受支持。就是这样。有时它们能用,但预计会坏掉。

\tikzmark创建 TiZ 图片。虽然现在可以在环境内部使用它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。请注意,手册中的示例不包括这些选项。特别是,overlayoveroverlay没有任何意义。您覆盖包含标记的图片,然后用引用它的图片覆盖它。但标记的重点在于它们的具体位置,不是吗?

无论如何,如果没有这些选项,我就无法使inside语法正常工作......

编辑

我认为新语法不是为了与 Beamer 使用的特殊代码协同工作的。

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

该库这样做是为了使\tikzmark叠加规范可感知。它还需要确保\tikzmark幻灯片与 Beamer 框架内的特定幻灯片相关联

tikzmark suffix=-\the\beamer@slideinframe

扩展出了问题,所以 TiZ 尝试解析类似{[}节点名称的内容....

如果您的框架不使用叠加规范,因此一个框架只有一个幻灯片(至少在您想要使用它的地方),您可以使用

\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在创建标记时使用它有什么意义。它使标记变得无形。也许我不明白这有什么用。是的。但我甚至不明白它怎么可能连贯。

手册中的示例很有意义,因为它们没有这样做。但是,在这里,你以一种我无法理解的方式将东西叠加在叠加的东西上。

相关内容