使用 LaTeX 和 TikZ,是否可以在同一个命令中使用 Line-To 操作和距离操作?我想绘制一个矩形,然后在矩形上边缘的中点创建一个命名节点。为此,我使用距离操作来查找矩形的中心,然后使用 Line-To 操作来查找上边缘。请参阅下面的 MWE 代码,我认为它应该可以工作,但实际上不起作用。
\documentclass[11pt]{article}
\usepackage{tikz}
\usetikzlibrary{calc}
\begin{document}
\begin{tikzpicture}
\node (A) at (0,0) {};
\node (B) at (10,10) {};
\node [above right] at (A) {A};
\node [below left] at (B) {B};
\draw [draw=black] (B) rectangle (A);
\node at ($(A)!0.5!(B)$ |- B) {Top of Rect [incorrect]};
\node (ABMid) [below] at ($(A)!0.5!(B)$) {Midpoint AB};
\node (rectTop) [above] at (ABMid|-B) {Top of Rect [correct]};
\end{tikzpicture}
\end{document}
答案1
我不会使用这样的数学计算来获得顶线中间的坐标。路径上的节点可以非常智能地放置。
这里的问题是,原始rectangle
路径上的节点放置仅在两个坐标之间的直线上,因此以下两条路径上的节点位于相同的位置<pos>
:
\path (c1) -- node[pos=<pos>] {} (c2);
\path (c1) rectangle node[pos=<pos>] {} (c2);
我会为您提供三个解决方案。
- 一个简单的辅助坐标。
rectangle
用两个|-
/路径替换该路径-|
。- 使用适当的计时器通过我的
rectangle
路径函数ext.paths.timer
tikz-ext
包裹。
解决方案 1
使用辅助坐标你只需做
\draw (B) rectangle coordinate (aux1) (A) node[above] at (aux1 |- B) {Top of the Rect};
代码
\documentclass[tikz]{standalone}
\begin{document}
\begin{tikzpicture}
\coordinate [label=above right:A] (A) at (0,0);
\coordinate [label=below left:B] (B) at (20,10);
\draw (B) rectangle coordinate (aux1) (A) node[above] at (aux1 |- B) {Top of the Rect};
\end{tikzpicture}
\end{document}
解决方案 2
使用两个组合的|-
或-|
和位置.75
或.25
(分别)。角具有位置.5
(→关节 TikZ 路径上的节点)。
代码
\documentclass[tikz]{standalone}
\begin{document}
\begin{tikzpicture}
\coordinate [label=above right:A] (A) at (0,0);
\coordinate [label=below left:B] (B) at (20,10);
\draw (B) -| node[pos=.25, above] {Top of the Rect} (A) -| (B);
\end{tikzpicture}
\end{document}
解决方案 3
加载ext.paths.timer
库然后您可以使用very near start
(pos = 0.125
)访问第一侧(顶部)的中间。
代码
\documentclass[tikz]{standalone}
\usetikzlibrary{ext.paths.timer}
\begin{document}
\begin{tikzpicture}
\coordinate [label=above right:A] (A) at ( 0, 0);
\coordinate [label=below left:B] (B) at (20,10);
\draw (B) rectangle node[very near start, above] {Top of the Rect} (A);
\end{tikzpicture}
\end{document}
输出
答案2
编辑:在底部看到一个内联计算。
原则上是的。我还没有真正优化以下内容,它可以稍微减少一些。
您可以使用let
操作符(它也来自calc
库)。
你想要做的是获得最大是坐标,然后选择一半X坐标。因此你需要X和是每个点的坐标。
此外你应该绝不使用 指定坐标node
!这可能会带来意想不到的问题。请记住,节点保留大小,而坐标不保留。
我会按照如下方式来设置你的系统:
\begin{tikzpicture}
\coordinate (A) at (0,0);
\node[above right] at (A) {A};
\coordinate (B) at (10,10);
\node[below left] at (B) {B};
\draw [draw=black] (A) rectangle (B);
\draw let \p1 = (A),
\p2 = (B),
\n{x} = {(\x1+\x2)/2},
\n{y} = {max(\y1,\y2)} in
(\n{x},\n{y}) node[above] {Top of Rect [incorrect]};
\coordinate (ABMid) at ($(A)!0.5!(B)$);
\node at (ABMid) {Midpoint AB};
\end{tikzpicture}
当然,如果你不需要坐标,ABMid
那么就这样做\node at ($(A)!.5!(B)$) {...};
上面的操作是计算在路上这X和是顶点的坐标。\p<int> = (<coordinate>)
将保存X和是进行\x<int>,\y<int>
进一步的计算let
。该\n{x}
行计算X-顶点的坐标,然后该\n{y}
线计算最大值是-协调。
上述代码将得出:
我意识到你确实想要一些内联的东西(这是可行的,但是丑陋的)。因此,您可以做的是B
从 开始投射到垂直线上A
,然后计算该点和 之间的中点B
,这样就可以得到所需线的一半。
因此可以通过以下方式完成朦胧构造:
\coordinate (ABMidTop) at ($(A)!(B)!($(A)+(0,1)$)!.5!(B)$);
\node[above] at (ABMidTop) {Top of Rect [incorrect]};
应该这样理解:
画一条线A
到A+(0,1)
,然后投影B
到这条线上。然后取前一个计算点和 之间的中点B
。