考虑这个例子:
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{calc}
\begin{document}
\begin{tikzpicture}
\def\starty{3}
\def\length{1};
\coordinate(a1) at (1, \starty);
\coordinate(b1) at ($(a1) + (0, -\length)$);
\coordinate(a2) at (2, \starty - \length);
\coordinate(b2) at ($(a2) + (0, \length)$);
\draw[red, ->](a1) -- (b1);
\draw[red, ->](b2) -- (a2);
\draw (0, 0) -- (3, 0);
\draw (0, 0) -- (0, 3);
\end{tikzpicture}
\end{document}
结果是 2 个水平位移的箭头,正如简单的算术检查所显示的那样:
然而,当我更换
\def\length{1};
经过
\def\length{1cm};
结果出乎意料:
是什么导致了这种差异?我应该如何修复这个例子?
答案1
问题在于你添加/合并带有和不带有单位的表达式。Ti钾Z 区分了有单位和无单位的表达式。我建议阅读这个答案。 如果你有
\path (x,y) coordinate (p);
且x
无y
量纲,则该点将p
位于 处x*(x unit vector)+y*(y unit vector)
。这些单位向量的初始值分别为(1cm,0)
和(0,1cm)
,但您可以更改它们,例如使用x=(1cm,0.2cm)
。(如果您不提供单位,这些更改会很棘手,因为如果使用x={({cos(20)},{(sin(20)})},y={({cos(20+90)},{(sin(20+90)})}
,则得到的不仅仅是旋转的坐标系。相反,在y=...
解析 时,它已经使用了重新定义的x unit vector
。这就是为什么像附加单元这样的包tikz-3dplot
来定义旋转的坐标系的原因。)
如果你有
\path (x,y) coordinate (p);
其中x
和y
进位单位,那么该点将p
位于x
右上方y
(当然是模数变换,如旋转)。对于单位向量的初始值
\path (1,2) coordinate (p);
和
\path (1cm,2cm) coordinate (p);
产生相同的结果,但一般来说它们不一样。你也可以让一个坐标有单位,另一个坐标没有单位,例如
\path (1cm,2) coordinate (p);
将导致1cm
向右移动两倍的点y unit vector
。
现在,回到你的问题,如果你提出 Ti钾Z 混合
\path (a+b,y) coordinate (p);
其中,a
携带单位,b
不携带单位,则 Ti钾Z 会将单位附加pt
到b
。因此,例如在
\path (1cm+1,2) coordinate (p);
p
将有一个x
坐标1cm+1pt
,而在
\path (1+1,2) coordinate (p);
它的坐标为x
的 2 倍x unit vector
。
为了说明这一点,我将您的 MWE 的坐标与我附加到无量纲表达式的坐标进行比较pt
,并表明它们匹配。
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{calc}
\begin{document}
\subsection*{No units}
\begin{tikzpicture}
\def\starty{3}
\def\length{1};
\coordinate(a1) at (1, \starty);
\coordinate(b1) at ($(a1) + (0, -\length)$);
\coordinate(a2) at (2, \starty - \length);
\coordinate(b2) at ($(a2) + (0, \length)$);
\draw[red, ->](a1) -- (b1);
\draw[red, ->](b2) -- (a2);
\draw (0, 0) -- (3, 0);
\draw (0, 0) -- (0, 3);
\end{tikzpicture}
\subsection*{Mix of expressions with and without units}
\begin{tikzpicture}
\def\starty{3}
\def\length{1cm};
\coordinate(a1) at (1, \starty);
\coordinate(b1) at ($(a1) + (0, -\length)$);
\coordinate(a2) at (2, \starty - \length);
\coordinate(b2) at ($(a2) + (0, \length)$);
\draw[red, ->](a1) -- (b1);
\draw[red, ->](b2) -- (a2);
\draw (0, 0) -- (3, 0);
\draw (0, 0) -- (0, 3);
\draw[<->,blue] (2,3pt-1cm) -- ++ (1,0) -- (2,3pt);
\end{tikzpicture}
\end{document}