tikz 如何解析括号内的坐标,如(2cm,1cm)

tikz 如何解析括号内的坐标,如(2cm,1cm)

我对 tikz 中的坐标有一个疑问:当我通过 设置节点的样式时shift={(1, 1)},会发生什么,以及如何将坐标解析为相应的偏移量应用于要绘制的图形的每个点?

如果我想定义一个带有类似坐标的参数的 pgfkey,以便当我传递类似的字符串时(2, 3, 4),它会被解析并将值分别保存到三个宏中,模仿 tikz 处理的方式是否可行或者还有其他一些方便的方法?

答案1

我们可以理清底层发生了什么。首先,shift定义为

\tikzoption{shift}{\tikz@addtransform{\tikz@scan@one@point\pgftransformshift#1\relax}}%

执行扫描点的繁重工作的宏是\tikz@scan@one@point。结果是 ,\pgfpoint然后将其传递给\pgftransformshift。然后,此转换被添加到由 管理的转换堆栈中\tikz@addtransform

这个过程\tikz@scan@one@point有点复杂。下面是大致内部发生的树状图。

                         \tikz@scan@one@point
                                   |
                         if next character is +
                        /yes                 no\
                scan relative point             |
                       |                        |
             if next character is +             |
             /yes                no\            |
  relative to previous       relative to first  |
             \                     /            |
               scan absolute point --------------
                       |
                if character is (
               /yes            no\
              |           expand tokens (at most 100 times)
              |                  |
              |            valid coordinate found?
              |           /yes                  no\
              |          |                    Give up.
              |          |           "Cannot parse this coordinate"
              |          |
              -- if next character is [
                /yes                 no\
scan until ] and pass to \tikzset       |
               \                       /
                 if next character is $
                /yes                 no\
     <--- calc library                 |
                          if coordinate contains with cs:
                         /yes                          no\
                parse coordinate system                   |
                                          if coordinate contains intersection
                                         /yes                              no\
                                parse intersection              if coordinate contains with |
                                                               /yes                        no\
                                                    if coordinate contains -|                 |
                                                   /yes                    no\                |
                                          parse -| specifier      parse |- specifier          |
                                                                                              |
                                                                                   if coordinate contains :
                                                                                  /yes                   no\
                                                                        parse polar coordinate             |
                                                                                                if coordinate contains ,
                                                                                               /yes                   no\
                                                                                    parse regular coordinate     parse node name

在您的情况下,它将下降到parse regular coordinate分支,其中点将在逗号处被分割,并且每个组件都将用 进行评估\pgfmathparse

关于你问题的第二部分:

如果我想定义一个带有类似坐标的参数的 pgfkey,以便当我传递像(2、3、4)这样的字符串时,它会被解析并且值分别保存到三个宏中,模仿 tikz 处理的方式是否可行或者还有其他一些方便的方法?

在这种情况下,我认为你最好手动解析它,例如以下这些:

\tikzset{
  triple/x/.store in=\triplex,
  triple/y/.store in=\tripley,
  triple/z/.store in=\triplez,
  triple/.style args={(#1,#2,#3)}{
    triple/x=#1,
    triple/y=#2,
    triple/z=#3,
  }
}

\tikzset{triple={(1,2,3)}}

答案2

shift={(1, 1)}解析为

移位 1*e_1 + 1*e_2 ,

其中 e_1 和 e_2 是单位向量。这与 不同shift={(1cm, 1cm)},后者在 x 方向产生 1cm 的偏移,在 y 方向产生 1cm 的偏移。在默认设置下,e_1=(1cm,0)e_2=(0,1cm),因此两者“意外地”产生相同的结果。阅读这个不错的答案确实很有启发性。TiZ 还根据某些维度来解析和解释坐标,这些维度指定了它们在屏幕坐标中的位置(以 pt 为单位)。

在某些情况下,Z 会存储用于定义坐标的字符串。它适用于

\path (<coord>) coordinate (<A>);

句法。

\documentclass{article}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\path (2,3,4) coordinate (A) (5,1) coordinate (B);
\coordinate (C) at (5,4,3);
\end{tikzpicture}

\makeatletter
$(A)=\tikz@dcl@coord@A$

$(B)=\tikz@dcl@coord@B$

$(C)=\tikz@dcl@coord@C$
\makeatother
\end{document}

在此处输入图片描述

该示例还显示了语法

\coordinate (C) at (5,4,3);

还不起作用。

相关内容