我对 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)
,因此两者“意外地”产生相同的结果。阅读这个不错的答案确实很有启发性。Ti钾Z 还根据某些维度来解析和解释坐标,这些维度指定了它们在屏幕坐标中的位置(以 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);
还不起作用。