tikz 算术与数字和长度

tikz 算术与数字和长度

考虑这个例子:

\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

问题在于你添加/合并带有和不带有单位的表达式。TiZ 区分了有单位和无单位的表达式。我建议阅读这个答案。 如果你有

 \path (x,y) coordinate (p);

xy量纲,则该点将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);

其中xy进位单位,那么该点将p位于x右上方y(当然是模数变换,如旋转)。对于单位向量的初始值

 \path (1,2) coordinate (p);

 \path (1cm,2cm) coordinate (p);

产生相同的结果,但一般来说它们不一样。你也可以让一个坐标有单位,另一个坐标没有单位,例如

 \path (1cm,2) coordinate (p);

将导致1cm向右移动两倍的点y unit vector

现在,回到你的问题,如果你提出 TiZ 混合

 \path (a+b,y) coordinate (p);

其中,a携带单位,b不携带单位,则 TiZ 会将单位附加ptb。因此,例如在

 \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}

在此处输入图片描述

相关内容