我在 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 版数学解析器中的一个错误。