节点与点的距离不相同

节点与点的距离不相同

我有一个三角形的代码。点 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

对于AB,您正在标记坐标。对于 ,C您正在标记节点。坐标本质上是没有内容的零维节点。节点具有关联的inner sepouter 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,那么您应该记住需要命名位置。如果您不需要命名位置,\nodejust 似乎是更好的选择。但是,您可能会觉得\coordinate更容易,因为您不必担心内容或任何inner sepouter sep业务。但是,如果坐标不是要再次引用的东西,那么以明确这一意图的方式命名它:因此在上面的代码中,我将坐标命名为tmp。当我稍后重新阅读我的代码时,这立即告诉我,“这是一个我永远不会再引用的坐标。” ....这告诉了我很多:特别是,这意味着将该坐标更改为适当的坐标node不会破坏我以后的代码!如果我稍后决定稍后引用此坐标,那么我将其名称从丢弃名字tmp改为别的东西。

坐标和节点的名称应该有意义,特别是在构建复杂图表时。因此,我绝不会只命名一个坐标(或节点)<anything>。我会选择一个能帮助我理解其用途的名称。名称不必太长。它们可以非常紧凑。例如,某些图表左上角的节点可能会被命名,N/ULC但在我的代码中我也会写

%% N=node
%% U=upper
%% L=left
%% C=corner

这样一两年后,我就能理解这个晦涩难懂的名字N/ULC的含义。此外,在重构代码时,我发现一个聪明的命名约定比懒惰而快速的命名约定更好

 \node (<single letter name>) at (.....) {....};

相关内容