![节点与点的距离不相同](https://linux22.com/image/310930/%E8%8A%82%E7%82%B9%E4%B8%8E%E7%82%B9%E7%9A%84%E8%B7%9D%E7%A6%BB%E4%B8%8D%E7%9B%B8%E5%90%8C.png)
我有一个三角形的代码。点 A 和 C 位于一条水平线上。我使用选项label=225
来定位标签“A”和label=-45
定位标签“C”。它们在水平线下方的距离明显不同,但我希望它们位于相同的距离。我使用了命令\coordinate[label=225:$A$] (A) at (0,0);
和\node[label=-45:$C$] at (C){};
。我猜将一个标签放置在 上\coordinate
,将另一个标签放置在 上\node
会产生不同的效果。
我尝试使用该命令\coordinate[label=-45:$C$] (C) at C;
,但TikZ
无法编译。我猜接下来的at
一定是用直角坐标或极坐标指定的点。但我在手册中没有看到任何关于这一点的内容。有没有办法使用该\coordinate
命令?
\documentclass{amsart}
\usepackage{tikz}
\usetikzlibrary{calc,positioning,intersections}
\begin{document}
\begin{tikzpicture}
\coordinate[label=225:$A$] (A) at (0,0);
\coordinate[label=90:$B$] (B) at (60:6);
%These commands position vertex C, label it C, and positions the label southeast of the vertex.
\path[overlay,name path=horizontal] (A) -- ++(10,0);
\path[overlay,name path=BC] (B) -- ($(B)!2!75:(A)$);
\path[name intersections={of= horizontal and BC, by=C}];
\node[label=-45:$C$] at (C){};
%This command draws the triangle.
\draw (A) -- (B) -- (C) -- cycle;
\end{tikzpicture}
\end{document}
答案1
对于A
和B
,您正在标记坐标。对于 ,C
您正在标记节点。坐标本质上是没有内容的零维节点。节点具有关联的inner sep
和outer sep
。将它们分别设置为零,您应该会得到所需的结果。
\node[label=-45:$C$,inner sep=0pt,outer sep=0pt] at (C){};
您可以比较使用节点和坐标之间的差异,如下所示
\documentclass{amsart}
\usepackage{tikz}
\usetikzlibrary{calc,positioning,intersections}
\begin{document}
\begin{tikzpicture}
\coordinate[label=225:$A$] (A) at (0,0);
\coordinate[label=90:$B$] (B) at (60:6);
%These commands position vertex C, label it C, and positions the label southeast of the vertex.
\path[overlay,name path=horizontal] (A) -- ++(10,0);
\path[overlay,name path=BC] (B) -- ($(B)!2!75:(A)$);
\path[name intersections={of= horizontal and BC, by=C}];
\node[label={[red]-45:$C$}] at (C){};
\coordinate[label={[blue]-45:$C$}] (tmp) at (C);
%This command draws the triangle.
\draw (A) -- (B) -- (C) -- cycle;
\end{tikzpicture}
\end{document}
关于节点和坐标命名约定的几点评论
虽然以下代码在 TikZ 3.0 版本中运行良好,但我不推荐它。
\coordinate[<various options>] (C) at (C);
首先,它是循环的,我看不出这种循环有什么好处。但更重要的是,它使你的代码更难阅读和理解。而且,当你开始在旧代码上构建时;当你想将一些你真正喜欢的代码片段移动到新环境时;……等等,这种编码方法似乎充满了潜在的错误或意想不到的副作用,并且可能很难调试。所以,除非你有非常明确的理由,否则我会避免这种类型的循环引用和命名。
node
在这里做一个相当广泛的概括,a和之间的区别coordinate
在于 anode
用于将对象(无论是文本还是图形等)放置在某个位置,而 acoordinate
用于命名您稍后想要再次引用的特定位置。语法node
允许您将这两个功能结合起来——acoordinate
只是一种非常特殊的节点(不需要内容)。
因此,如果您要使用\coordinate
,那么您应该记住需要命名位置。如果您不需要命名位置,\node
just 似乎是更好的选择。但是,您可能会觉得\coordinate
更容易,因为您不必担心内容或任何inner sep
和outer sep
业务。但是,如果坐标不是要再次引用的东西,那么以明确这一意图的方式命名它:因此在上面的代码中,我将坐标命名为tmp
。当我稍后重新阅读我的代码时,这立即告诉我,“这是一个我永远不会再引用的坐标。” ....这告诉了我很多:特别是,这意味着将该坐标更改为适当的坐标node
不会破坏我以后的代码!如果我稍后决定稍后引用此坐标,那么我将其名称从丢弃名字tmp
改为别的东西。
坐标和节点的名称应该有意义,特别是在构建复杂图表时。因此,我绝不会只命名一个坐标(或节点)<anything>
。我会选择一个能帮助我理解其用途的名称。名称不必太长。它们可以非常紧凑。例如,某些图表左上角的节点可能会被命名,N/ULC
但在我的代码中我也会写
%% N=node
%% U=upper
%% L=left
%% C=corner
这样一两年后,我就能理解这个晦涩难懂的名字N/ULC
的含义。此外,在重构代码时,我发现一个聪明的命名约定比懒惰而快速的命名约定更好
\node (<single letter name>) at (.....) {....};