为什么这个 let 表达式在 TikZ 中不起作用(计算中点)?

为什么这个 let 表达式在 TikZ 中不起作用(计算中点)?

我在 TikZ 中有一个矩形,左上角和右下角分别称为 (topleft) 和 (bottomright)。我想在矩形左侧中间放置一个标签,因此我尝试了以下操作,但均失败并显示神秘的错误消息:

\draw let \p1 = (topleft), \p2 = (bottomright) 
in (\x1,\pgfmathparse{0.5*(\y1 + \y2)}\pgfmathresult) node[right]{6 metres};

\draw let \p1 = (topleft), \p2 = (bottomright) 
in (\x1,{0.5*(\y1 + \y2)}) node[right]{6 metres};

我以一种迂回的方式得到了想要的结果:

\draw let \p1 = (topleft), \p2 = (bottomright) 
in ($(\x1,\y1)!.5!(\x1,\y2)$) node[right]{6 metres};

但为什么前两次尝试都没有成功呢?

编辑(响应更多详细信息的请求):如果有帮助,您可以假设上述命令的上下文如下:

\usetikzlibrary{calc}
\begin{tikzpicture}
\draw (0,10) coordinate (topleft) rectangle (6,0) coordinate (bottomright);
%% relevant let statement would go just below here
\end{tikzpicture}

但我不想要使用坐标为(0,10)和(6,0)的知识的解决方案。

答案1

在路径中使用 \pgfmathparse

如果您需要在路径内进行计算,我建议暂停此路径,进行计算,然后恢复路径。可以使用宏\pgfextra{code}执行来完成“转义” code

在您的示例中,\pgfextra可能包含\pgfmathparse计算,\pgfmathresult可能会在稍后的路径中使用。

这是对您的第一个例子的修改:

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{calc}
\begin{document}
\begin{tikzpicture}
\draw (0,10) coordinate (topleft) rectangle (6,0) coordinate (bottomright);
\draw let \p1 = (topleft), \p2 = (bottomright) 
  in \pgfextra{\pgfmathparse{0.5*(\y1 + \y2)}}
    (\x1,\pgfmathresult pt) node[right]{6 metres};
\end{tikzpicture}
\end{document}

输出:

替代文本

此建议适用于您需要进行更复杂的计算(而简单的表达式或交集无法轻松完成)的情况。

答案2

我不需要做“所有那些算术”,而是让 Tikz 帮我做。尝试这样做:

\begin{tikzpicture}[scale=1,>=stealth]
\draw(-10,0)  node (topleft) {TL}; 
\draw(0,-10)  node (bottomright) {BR}; 
\draw (topleft) rectangle (bottomright);
\path (topleft) edge node (here) {Here} (topleft |- bottomright);
\end{tikzpicture}

这两个秘密是:节点将绘制在路径的中点,并且 |-(或 -|)代表垂直/水平交点(即,在示例中,“从(左上角)垂直放置一条线,直到它与通过(右下角)的水平线相遇)。尝试将 -| 替换为 |-,您就会明白我的意思。


您还可以改进一些东西,比如:

\path (topleft) edge[draw opacity=0] 
     node [right,pos=0.25] (here) {Here} 
     (topleft |- bottomright);`

draw opacity=0抑制 \path 通常绘制的线

right将文本置于右侧

pos=0.25将节点放置在路径的 1/4 处(依此类推),节省算术运算以用于更好的事情......

答案3

我遇到了类似的问题。我不确定,但它似乎好像 TikZ 在评估嵌套表达式时存在一些问题。因此,不要计算

0.5*(\y1 + \y2)

我建议计算

0.5*\y1+0.5*\y2

这对我有用。

答案4

您的第二个示例在 TikZ v2.10 中确实有效。所以我怀疑这是 2.00 版数学解析器中的一个错误。

相关内容