在我的一篇帖子中,Jake 使用 来\draw let
确定两条线之间的弧。我在哪里可以找到信息以更好地理解此命令?或者我该查找什么?类似地,我想了解有关 的更多信息atan2
。我假设它的意思是 arctan,但是 2 是干什么用的?
\draw let
\p0 = (F),
\p1 = (P1),
\p2 = (P2),
\n1 = {atan2(\x1 - \x0, \y1 - \y0)},
\n2 = {atan2(\x2 - \x0, \y2 - \y0)},
\n3 = {.3cm}
in (F) +(\n1:\n3) arc [radius = \n3, start angle = \n1, end angle = \n2]
node[scale = .75, pos = .5, above = .25cm] {\(\Delta\nu\)};
我希望比我现在的理解更好地理解这段代码,即中心点、右点、左点,并将其余部分添加到绘制和弧中,其中\n3
是弧的长度。
答案1
操作let
简单来说:
TikZ 如何读取内容?
TikZ 中的路径操作基于在读取流中的字符时分支到不同的机制。你会发现大量的如果下一个字符是c
做某事,如果不做,则做另一件事...举个例子,在找到e
\pgfutil@ifnextchar l{\tikz@ellipse}{\tikz@@e@char}}%
它会根据下一个字符来检查它是否是椭圆,否则会通过查看或跟随来l
检查它是否是平面。edge
edge from parent
dge
f
\def\tikz@@e@char dge{%
\pgfutil@ifnextchar f{\tikz@edgetoparent}{\tikz@edge@plain}}%
所以如果你写,大致来说,
\node (a) at (2,0) {};
TikZ 首先开始读取,\node
然后分支到节点创建,然后找到一个括号,该括号分支到节点名称读取,然后看到一个,这a
会使 TikZ 切换到搜索括号和坐标解析。长话短说,路径流上的每一项都会逐渐收集必要的信息。所以当你想要执行额外的操作(例如数学计算并插入额外的路径等)时,需要停止流读取,TikZ 有这样的机制,具体取决于你想要进入多低级别。let
操作是此类机制中最高级的一种,主要用于进行坐标和数学计算(您不能用它开始新路径)。其他较低的是\pgfextra
和pgfinterruppath
环境。
好吧,那又怎么样?
当 TikZ 在任意级别遇到其中一个时,它会将当前路径设置存储在某处并开始解析这些宏或环境内容中的内容。请注意,我实际上是在近似现实,但现在你不需要如此模糊的区别(我猜)。
当 TikZlet
在流中遇到 时,它会开始在流中寻找以逗号分隔并以 结尾的特定宏in
。let...in
扫描介于 之间的任何内容,以确定它是\p...
(一个点)还是\n...
(一个数字)。 如果它是一个p
宏,则会扫描坐标名称或表达式,否则扫描数字。 所以如果我们有
\draw let \p1=(3,2),\n1={(3-2)} in (\x1,0) -- (0,\y1);
第一个扫描名为 的坐标(或节点)(3-2)
。
\def\tikz@cc@handle@line{%
\pgfutil@ifnextchar\p{%
\tikz@cc@handle@coor%
}{%
\pgfutil@ifnextchar\n{%
\tikz@cc@handle@num%
}{%
\PackageError{tikz}{``\string\p'' or ``\string\n'' expected}{}%
}%
}%
}
为什么或如何现在并不重要。\p
并\n
接受下一个标记,无论它是一个数字\p1
还是一个单词\p{foo}
,那么该标记将成为稍后的点名称。同样,\n{foo}
成为数字的名称,就像您已发出一样
\pgfmathsetmacro{\foo}{<math operations>}
剩下的一个重要细节是,只要\p
找到 a ,由于它应该是一个坐标,TikZ 还会准备两个宏名称\x<p name>
和,\y<p name>
它们保存点的水平和垂直坐标\p<p name>
,以便以后也可以使用它们,而无需您定义和提取这些坐标。
最后,当in
找到 时,TikZ 停止执行此分配机制并返回读取原始路径。但这次,每当它找到\p
、\n
或之一时\x
,\y
它都会用 之间给出的语句替换它们let...in
。
需要强调一个命名问题,这个操作会暂时改变这些宏的含义,下面是一个简单的例子。
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{calc}
\begin{document}
\begin{tikzpicture}
\def\xf{1} %<--- xf is 1 here
\node[draw] (a) at (0,0) {Here!};
\draw let \p{f}=(10 pt,0) in (a.south east) -| ++(\x{f},\xf ); %<-- \xf IS NOT \x{f}
% so being treated as 1cm.
\draw[ultra thick ,red] (a.north east) --++(10 pt,0);
\draw let \p{f}=(10 pt,0) in (a.south west) -| ++(-\x{f},\x f ); %<-- \x f IS \x{f}
\end{tikzpicture}
\end{document}
atan
和之间的区别atan2
这在程序员中是众所周知的,因为atan
是 中的多值函数[0,2π]
。例如,atan(1)
可以是45
(+number 除以 +number) 以及225
(-number 除以 -number),因此atan2
会考虑分数的符号。仅在(或或任何其他组合)atan
上定义。[0,π]
[-π/2,π/2]