我正在使用beamer
和tikz
创建一个光子在雪花之间移动的动画。我有十个Koch snowflake
(因此\newcommand
在我的 MWE 中是)用排版decorate{ decorate{ decorate{ decorate{...
,因此我在一个框架内有许多幻灯片。由于每张幻灯片需要大约 20 秒的排版时间,我决定使用\savebox
和\usebox
以节省时间(我首先尝试了外部化,但我严重依赖外部宏、外部引用、从一个到另一个的指针,因此放弃了)。但是,我不知道如何匹配内部tikzpicture
的坐标系和我使用节点的坐标系。tikzpicture
savebox
savebox
这个问题看起来相关,但由于我的图像在两个坐标上都偏离,而不仅仅是垂直方向,所以看起来我的问题是另一个问题。
\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
选项并使用overlay
和remember 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}