如何使用包含 \tikzpicture 的 \usebox 获得节点的一致定位

如何使用包含 \tikzpicture 的 \usebox 获得节点的一致定位

我正在使用beamertikz创建一个光子在雪花之间移动的动画。我有十个Koch snowflake(因此\newcommand在我的 MWE 中是)用排版decorate{ decorate{ decorate{ decorate{...,因此我在一个框架内有许多幻灯片。由于每张幻灯片需要大约 20 秒的排版时间,我决定使用\savebox\usebox以节省时间(我首先尝试了外部化,但我严重依赖外部宏、外部引用、从一个到另一个的指针,因此放弃了)。但是,我不知道如何匹配内部tikzpicture的坐标系和我使用节点的坐标系。tikzpicturesaveboxsavebox

这个问题看起来相关,但由于我的图像在两个坐标上都偏离,而不仅仅是垂直方向,所以看起来我的问题是另一个问题。

\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{calc,spy,fit,positioning,backgrounds,arrows,shapes,intersections,decorations.fractals,decorations.markings,external}
\newcommand{\snowflake}[2]{
    \path[fill,draw] decorate{ decorate{ decorate{ decorate{ #1 ++(-150:.5*#2/0.866) -- ++(60:#2) -- ++(-60:#2) -- cycle }}}};
}
\newsavebox{\manyflakes}
\savebox{\manyflakes}{
\begin{tikzpicture}[decoration={Koch snowflake,amplitude=1pt,segment
length=1pt,start radius=1pt},draw=blue,fill=white,very thin]
\snowflake{(1.81, 1.42)}{0.89}
\end{tikzpicture}
}
\begin{document}
\begin{tikzpicture}
\node[anchor=south west,inner sep=0] at (0,0) {\usebox{\manyflakes}};
\filldraw[red] (1.81, 1.42) circle [radius=0.1];
\end{tikzpicture}
\end{document}

输出的光子未按预期居中

我如何将 的坐标系savebox与 的坐标系相匹配tikzpicture,以便 处的圆圈1.81, 1.42正好位于雪花的中间?

答案1

有一点不对,就是在 之前和 之后有两个空格,tikzpicture它们会将保存框推到右侧。请注意,源文件换行符会变成空格(除了连续两个换行符会变成 )\par。您需要%在开头后添加{以删除该空格,然后在 之后添加一个\end{tikzpicture}

然后你还应该将其outer sept设置为 0pt,这也会影响定位。

我还发现您的\showflake宏有一个错误。 路径似乎从 开始(0,0),并执行 moveto 操作到 给出的起始位置#1。 这似乎导致图片的 X 和 Y 分量略微为负,从而将保存框推到右上角。 要解决此问题,您可以使操作\path从 开始#1。 然后您需要添加一个\path包含 的空值(0,0),否则 TikZ 会裁剪图像以仅包含薄片,而不包含原点。

以下代码给出了完美匹配。我添加了第二个圆圈以便于比较。

\documentclass[border=2]{standalone}
\usepackage{tikz}
\usetikzlibrary{calc,spy,fit,positioning,backgrounds,arrows,shapes,intersections,decorations.fractals,decorations.markings,external}
\newcommand{\snowflake}[2]{%
    \path (0,0);
    \path[fill,draw] #1 decorate{ decorate{ decorate{ decorate{ #1 ++(-150:.5*#2/0.866) -- ++(60:#2) -- ++(-60:#2) -- cycle }}}};
}
\newsavebox{\manyflakes}
\savebox{\manyflakes}{%
    \begin{tikzpicture}[decoration={Koch snowflake,amplitude=1pt,segment
        length=1pt,start radius=1pt},draw=blue,fill=white,very thin]
        \snowflake{(1, 2)}{0.89}
        \filldraw[green] (1, 2) circle [radius=0.11];% For comparison
    \end{tikzpicture}%
}

\begin{document}
\begin{tikzpicture}
\node[anchor=south west,inner sep=0pt,outer sep=0pt] at (0,0) {\usebox{\manyflakes}};
\filldraw[red] (1, 2) circle [radius=0.1];
\end{tikzpicture}
\end{document}

答案2

删除anchor=south west选项并使用overlayremember picture选项;示例代码中还有一对虚假空格,我将其删除(一个在之后\savebox{\manyflakes}{,另一个在之后\end{tikzpicture}):

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{calc,spy,fit,positioning,backgrounds,arrows,shapes,intersections,decorations.fractals,decorations.markings,external}

\newcommand{\snowflake}[2]{
    \path[fill,draw] decorate{ decorate{ decorate{ decorate{ #1 ++(-150:.5*#2/0.866) -- ++(60:#2) -- ++(-60:#2) -- cycle }}}};
}
\newsavebox{\manyflakes}
\savebox{\manyflakes}{%
\begin{tikzpicture}[overlay,remember picture,decoration={Koch snowflake,amplitude=1pt,segment
length=1pt,start radius=1pt},draw=blue,fill=white,very thin]
\snowflake{(1.81, 1.42)}{0.89}
\end{tikzpicture}%
}
\begin{document}

\begin{tikzpicture}
  \node[inner sep=0] at (0,0) {\usebox{\manyflakes}};
  \filldraw[red] (1.81, 1.42) circle [radius=0.1];
\end{tikzpicture}

\end{document}

在此处输入图片描述

相关内容