使用嵌套范围时如何使 xshift 和 yshift 与 TikZ 中重新定义的单位兼容

使用嵌套范围时如何使 xshift 和 yshift 与 TikZ 中重新定义的单位兼容

我正在编写一些带有嵌套范围的代码,这些代码中应用了各种变换。具体来说,我嵌套了以下形式的范围,\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),因此应用yshift1 应该在底层坐标系中将图片向上移动 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}

相关内容