在这篇文章中如何缩放 TiKZ 图片的局部?中,Martin Scharrer 演示了如何使用间谍库放大图片的某个部分TikZ
。
(1)是否有可能在监视窗口内构建不会出现在大图中的单独线条、节点等?
(2)我可以把间谍改成圆圈吗?
\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{calc}
\usetikzlibrary{spy}
\usetikzlibrary{intersections}
\begin{document}
\begin{tikzpicture}[spy using outlines]
\coordinate (F) at (2, 0);
\draw[name path = line] (F) -- ++(30:1cm and 2cm) coordinate (A);
\draw (F) -- ++(100:1cm) coordinate (P3);
\draw[name path = arc] let
\p0 = (F),
\p1 = (A),
\p2 = (P3),
\n1 = {atan2(\x1 - \x0, \y1 - \y0)},
\n2 = {atan2(\x2 - \x0, \y2 - \y0)},
\n3 = {1cm},
\n4 = {(\n2 + \n1) / 2}
in (F) +(\n1:\n3) arc[radius = \n3, start angle = \n1, end angle = \n2]
node[font = \scriptsize, fill = white, inner sep = 0cm] at
([shift = (F)] \n4:\n3) {\(\nu_A\)} coordinate (N);
\path[name intersections = {of = line and arc, by = B}];
\spy [blue, draw, height = .5cm, width = .5cm, magnification = 2,
connect spies] on ($(F)!.5!(B)$) in node at ($(F)!.5!(B) + (0, -1)$);
\end{tikzpicture}
\end{document}
(1) 的一个例子是,我能否为所监视的线构建一条法线,该线仅显示在窗口中而不显示在原始图片中?
编辑1:
使用托拜厄斯法,我可以让 MWE 工作,但是当我使用我的代码时,图片不会在节点中绘制。它绘制在节点之外和图片之外。此外,一些来自父图片的线条应该在节点中,但却不存在。没有编译错误,代码很长。由于 MWE 没有这个问题,我该怎么做才能澄清我的问题,以便得到帮助?下面是一张显示正在发生的事情的图片:
我们可以看到,在图片的边缘,画出了线条,在 spy 窗口中,红色椭圆不见了,而在父图像中,有一个圆弧,圆弧上有 phi,它应该在 spy 中。同样,没有编译错误。
答案1
第二个问题看起来很容易解决。你可以使用spy using outlines=circle
,你可以使用\spy [circle …] …
。
第一个问题的答案取决于您到底想做什么。
通常我们可以使用 来path picture
实现与路径大小相同的矩形形状。path picture
与命名节点并在稍后引用它(我也在下面的代码中这样做了)相比, 的优点是它会根据节点的形状路径进行裁剪,并且也会位于背景中。
这里的问题是,间谍机制是通过path picture
自身实现的。任何其他额外内容path picture
都会覆盖任何先前给定的路径图,或者被任何后续路径图(即执行间谍活动的路径图)覆盖。
不作任何保证,下面的解决方案包含一个附加path picture extra
键,该键仅设置默认路径图片中硬编码的宏。请注意,内部的任何路径path picture
都会从其自身继承样式spy on node
。
但是您无法引用原始图片中的任何内容,因为它已保存在 (TeX) 框中并且只是转换为spy on node
。
代码
\documentclass[tikz,convert=false]{standalone}
\usetikzlibrary{calc}
\usetikzlibrary{spy}
\usetikzlibrary{intersections}
\makeatletter
\tikzset{
path picture/.code=\tikz@addmode{\def\tikz@path@picture{#1\tikz@path@picture@extra}},
path picture extra/.code={\def\tikz@path@picture@extra{#1}}
}
\let\tikz@path@picture@extra\pgfutil@empty
\makeatother
\begin{document}
\begin{tikzpicture}
\begin{scope}[spy using outlines]
\coordinate (F) at (2, 0);
\draw[name path = line] (F) -- ++(30:1cm and 2cm) coordinate (A);
\draw (F) -- ++(100:1cm) coordinate (P3);
\draw[name path = arc] let
\p0 = (F),
\p1 = (A),
\p2 = (P3),
\n1 = {atan2(\x1 - \x0, \y1 - \y0)},
\n2 = {atan2(\x2 - \x0, \y2 - \y0)},
\n3 = {1cm},
\n4 = {(\n2 + \n1) / 2}
in (F) +(\n1:\n3) arc[radius = \n3, start angle = \n1, end angle = \n2]
node[font = \scriptsize, fill = white, inner sep = 0cm] at
([shift = (F)] \n4:\n3) {\(\nu_A\)} coordinate (N);
\path[name intersections = {of = line and arc, by = B}];
\spy [blue, circle, draw, height = .5cm, width = .5cm, magnification = 2, connect spies,
path picture extra={
\draw (path picture bounding box.north west) -- (path picture bounding box.south east);
\draw[help lines, step=.1cm] (path picture bounding box.south west) grid (path picture bounding box.north east);
}] on ($(F)!.5!(B)$) in node (s) at ($(F)!.5!(B) + (0, -1)$);
\end{scope}
\draw([shift=(left:.25)]s.west) arc [radius=.5, start angle=180, end angle=0];
\end{tikzpicture}
\end{document}