[原创]在 TikZ 中利用 scope 环境实现平移做图

TikZ 宏包除了提供 tikzpicture 环境外还提供了一个可以嵌套在 tikzpicture 里的子环境 scope, 简单点说就是可以通过 scope 环境把同一标准的画图命令放在一起, 而只需要声明一次标准, 比如 scale, thick, -> 等等之类. 个人用的更多的是通过 scope 环境完成平移做图, 当然命令不多的的时候也可以直接平移做图, 如上图中圆心位于点 $(1,1)$ 的圆.

另外三个小圆都是通过 scope 环境完成的, 需要注意的是通过 shift 用直角坐标表示偏移向量时需要把坐标用 花括号 括起来, 而用 极坐标 表示时则不需要, 用 xshiftyshift 表示也不需要.

TikZ 宏包还提供了一个 scopes library, 以简化 scope 环境的调用, 当个人觉得直接显示 scope 似乎更有利于代码的可读性.

上图完整代码如下, 欢迎交流探讨.

\documentclass{standalone}

\usepackage{tikz}

\begin{document}

\begin{tikzpicture}
	\draw (0,0) circle (1cm);
	\draw [shift={(1,1)}] (0,0) circle (0.414cm);
	\begin{scope}[xshift=-1cm,yshift=1cm]
		\draw (0,0) circle (0.414cm);
	\end{scope}
	\begin{scope}[shift=(225:{sqrt(2)})]
		\draw (0,0) circle (0.414cm);
	\end{scope}
	\begin{scope}[shift={(1,-1)}]
		\draw (0,0) circle (0.414cm);
	\end{scope}

	\begin{scope}[xshift=2cm]
		\draw (0,0) circle (1cm);
	\end{scope}
	\begin{scope}[xshift=-2cm]
		\draw (0,0) circle (1cm);
	\end{scope}
\end{tikzpicture}

\end{document}

另外一个有时很有用的功能是 scope 里承认在它之前定义的点 (nodecoordinate), 如在 scope 环境之外提前定义了

\coordinate (A) at (3,4);

那在 scope 中就可以不用再定义, 直接使用 (A); 需要注意的是这个位置还是 scope 外的 位置, 而不会跟着 scope 的偏移量而改变.

另外还可以通过 scope 实现子图的排列, 如下代码即可实现简单的一个排列, 不过个人更建议使用 subcaption 之类处理, 可能更方便以后的维护.

\documentclass{standalone}

\usepackage{tikz}

\begin{document}

\begin{tikzpicture}
	\draw (0,0) circle (1);
	\draw [-stealth] (-1,-1) -- ++(2,2);
	\node [below] at (0,-1) {(a)};
	\begin{scope}[xshift=3cm]
		\draw (0,0) circle (1);
		\draw [-stealth] (-1,-1) -- ++(2,2);
		\node [below] at (0,-1) {(b)};
	\end{scope}
\end{tikzpicture}

\end{document}