![使用嵌套范围时如何使 xshift 和 yshift 与 TikZ 中重新定义的单位兼容](https://linux22.com/image/427073/%E4%BD%BF%E7%94%A8%E5%B5%8C%E5%A5%97%E8%8C%83%E5%9B%B4%E6%97%B6%E5%A6%82%E4%BD%95%E4%BD%BF%20xshift%20%E5%92%8C%20yshift%20%E4%B8%8E%20TikZ%20%E4%B8%AD%E9%87%8D%E6%96%B0%E5%AE%9A%E4%B9%89%E7%9A%84%E5%8D%95%E4%BD%8D%E5%85%BC%E5%AE%B9.png)
我正在编写一些带有嵌套范围的代码,这些代码中应用了各种变换。具体来说,我嵌套了以下形式的范围,\begin{scope}[x={(a,b)},y={(c,d)}]
重新定义了坐标系的单位,以及以下形式的变换\begin{scope}[xshift=a,yshift=b]
。
现在,这两件事似乎都与他们自己很好;如果我尝试
\begin{scope}[x={(2,0)},y={(0.5,2)}]
%code A
\begin{scope}[x={(2,0)},y={(0.5,2)}]
%code B
\end{scope}
\end{scope}
则将code A
用 x 向量 (2,0) 和 y 向量 (1,2) 绘制。(我认为这是因为y={(0.5,2)}
在 的重新定义之后出现x
,因此0.5
系数应用于向量x
。)同时,code B
将用 x 向量 (4,0) 和 y 向量 (4,4) 绘制,这正是我期望从这两个变换矩阵组合中得到的。
同样,组合shift
变换的行为也正如我所期望的那样。
然而,我遇到的麻烦是将两者结合起来。
\newcommand{\exampleshape}{
\draw[fill=red!20](0,0) -- (1,0) -- (1,1) -- (0,1) -- cycle;
\draw[fill=green!20](0,0) -- (1,0) -- (1,0.5) -- cycle;
}
\begin{tikzpicture}
\draw (0,0) grid (3,3);
\exampleshape
\begin{scope}[y={(0,2)}]
\begin{scope}[yshift=1cm]
\exampleshape
\end{scope}
\end{scope}
我期望这里的第二个范围“相信”y
是向量 (0,2),因此应用yshift
1 应该在底层坐标系中将图片向上移动 2 个单位。相反,似乎是yshift
相对于绝对坐标执行的。
为什么不会发生这种情况,我应该怎么做才能获得所需的行为?(显然,在这种情况下,我可以手动调整一些东西,但实际上我处理的是更复杂的嵌套范围,这是不太可行的。)
答案1
在 TikZ 中,有两种类型的操作:一些受变换影响,一些则不受。前者用于一般绘图,后者用于调整、标签等,xshift
属于yshift
第二组,而shift
属于第一组。因此,yshift=1cm
请使用而不是shift={(0,1)}
。
\documentclass[border=2pt]{standalone}
\usepackage{tikz}
\begin{document}
\newcommand{\exampleshape}{
\draw[fill=red!20](0,0) -- (1,0) -- (1,1) -- (0,1) -- cycle;
\draw[fill=green!20](0,0) -- (1,0) -- (1,0.5) -- cycle;
}
\begin{tikzpicture}
\draw (0,0) grid (3,3);
\exampleshape
\begin{scope}[y={(0,2)},shift={(0,1)}]
\exampleshape
\end{scope}
\end{tikzpicture}
\end{document}