假设我有一个像这样开始的 tikzpicture:
\begin{tikzpicture}[x = 20mm, y = 10mm]
现在让我们假设我想将图片的子部分放在“范围”环境中,并且我希望图片的整个部分向右移动 40 毫米,即当前 x 向量的两倍。但是,如果我稍后在“tikzpicture”选项中更改 x 向量,我希望移动量尊重新的 x 向量。例如,如果我将 x 向量从 20 毫米更改为 15 毫米,我希望子图片自动移动 30 毫米而不是 40 毫米,而无需修改“范围”选项。
如果我这样做:
\begin{scope}[xshift = 2]
然后 TikZ 将其解释为我想要向右移动 2pt 的距离,也就是说,“2”不被解释为当前 x 向量的倍数。从概念上讲,我想要类似
\begin{scope}[xshift = 2 * \x]
但我不知道向 TikZ 表达这一点的正确方法是什么。我该怎么做?
附录
我接受了 Jake 提供的答案,但这里介绍如何使用他的技术来定义一个使一维移位变得非常简单的密钥。将其放入文档序言中:
\tikzset{myxshift/.style = {shift = {(#1, 0)}}}
\tikzset{myyshift/.style = {shift = {(0, #1)}}}
现在你可以做这样的事情:
\begin{scope}[myxshift = 2]
答案1
无需提取单位长度:如果使用shift={(<x>,<y>)}
,则将自动使用单位向量(与使用xshift
和不同yshift
,它们需要长度)。
\documentclass{article}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}[x=2cm,y=1cm]
\node[draw] at (-3.5cm,0.5) {$x = 2$ cm};
\begin{scope}[shift={(2,0)}]
\draw (0,0) node[below] {2} -- (0,1);
\end{scope}
\begin{scope}[shift={(0,0)}]
\draw (0,0) node[below] {0} -- (0,1);
\end{scope}
\begin{scope}[shift={(-1,0)}]
\draw (0,0) node[below] {-1} -- (0,1);
\end{scope}
\end{tikzpicture}
\begin{tikzpicture}[x=1cm,y=1cm]
\node[draw] at (-3.5cm,0.5) {$x = 1$ cm};
\begin{scope}[shift={(2,0)}]
\draw (0,0) node[below] {2} -- (0,1);
\end{scope}
\begin{scope}[shift={(0,0)}]
\draw (0,0) node[below] {0} -- (0,1);
\end{scope}
\begin{scope}[shift={(-1,0)}]
\draw (0,0) node[below] {-1} -- (0,1);
\end{scope}
\end{tikzpicture}
\end{document}
答案2
您可以提取向量的长度(1,0)
并使用该长度来应用移位:
笔记:
- 可能借助一些
\expandafter
魔法,这一切都可以在一个宏内实现。
参考:
代码:
\documentclass{article}
\usepackage{tikz}
% https://tex.stackexchange.com/questions/33703/extract-x-y-coordinate-of-an-arbitrary-point-in-tikz
\newlength{\XCoord}
\newlength{\YCoord}
\newcommand*{\ExtractCoordinate}[1]{\path (#1); \pgfgetlastxy{\XCoord}{\YCoord};}%
\newlength{\ScaledXShift}
\newcommand*{\ApplyXVec}[1]{%
\ExtractCoordinate{1,0}%
\pgfmathsetlength{\ScaledXShift}{#1*\XCoord}%
%\ScaledXShift%
}
\begin{document}
\begin{tikzpicture}[x = 20mm, y = 10mm]
\draw [blue, ultra thick, <->](0,0.5) -- (0,-0.5);
\begin{scope}[xshift = 2]
\draw [red,ultra thick,->] (0,0) -- (1,0);
\end{scope}
\end{tikzpicture}
\begin{tikzpicture}[x = 5mm, y = 10mm]
\draw [blue, ultra thick, <->](0,0.5) -- (0,-0.5);
\ApplyXVec{2}%
\begin{scope}[xshift = \ScaledXShift]
\draw [red,ultra thick,->] (0,0) -- (1,0)
node [right, black] {xshift = 2x, x=5mm};
\end{scope}
\end{tikzpicture}
\begin{tikzpicture}[x = 10mm, y = 10mm]
\draw [blue, ultra thick, <->](0,0.5) -- (0,-0.5);
\ApplyXVec{1}%
\begin{scope}[xshift = \ScaledXShift]
\draw [red,ultra thick,->] (0,0) -- (1,0)
node [right, black] {xshift = 1x, x=10mm};
\end{scope}
\end{tikzpicture}
\begin{tikzpicture}[x = 10mm, y = 10mm]
\draw [blue, ultra thick, <->](0,0.5) -- (0,-0.5);
\ApplyXVec{2}%
\begin{scope}[xshift = \ScaledXShift]
\draw [red,ultra thick,->] (0,0) -- (1,0)
node [right, black] {xshift = 2x, x=10mm};
\end{scope}
\end{tikzpicture}
\end{document}
答案3
另一个(也许更简单?)解决方案是使用calc
库
\usetikzlibrary{calc}
并自然地将您的英语问题翻译成 tikz 指令:
\pgfmathsetmacro\myscalingfactor{2}
\begin{scope}[shift={(${\myscalingfactor}*(1,0)$)}] % The factor * the vector
\end{scope}
MWE(不如 Peter 的漂亮):
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{calc}
\begin{document}
\begin{tikzpicture}[x=2cm,y=1cm]
\node[draw] at (-3.5cm,0.5) {$x = 2$ cm};
\pgfmathsetmacro\myscalingfactor{2}
\begin{scope}[shift={(${\myscalingfactor}*(1,0)$)}]
\draw (0,0) node[below] {2} -- (0,1);
\end{scope}
\pgfmathsetmacro\myscalingfactor{0}
\begin{scope}[shift={(${\myscalingfactor}*(1,0)$)}]
\draw (0,0) node[below] {0} -- (0,1);
\end{scope}
\pgfmathsetmacro\myscalingfactor{-1}
\begin{scope}[shift={(${\myscalingfactor}*(1,0)$)}]
\draw (0,0) node[below] {-1} -- (0,1);
\end{scope}
\end{tikzpicture}
\begin{tikzpicture}[x=1cm,y=1cm]
\node[draw] at (-3.5cm,0.5) {$x = 1$ cm};
\pgfmathsetmacro\myscalingfactor{2}
\begin{scope}[shift={(${\myscalingfactor}*(1,0)$)}]
\draw (0,0) node[below] {2} -- (0,1);
\end{scope}
\pgfmathsetmacro\myscalingfactor{0}
\begin{scope}[shift={(${\myscalingfactor}*(1,0)$)}]
\draw (0,0) node[below] {0} -- (0,1);
\end{scope}
\pgfmathsetmacro\myscalingfactor{-1}
\begin{scope}[shift={(${\myscalingfactor}*(1,0)$)}]
\draw (0,0) node[below] {-1} -- (0,1);
\end{scope}
\end{tikzpicture}
\结束{文档}