
使用 LaTeX 和 TikZ,是否可以在同一命令中使用 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
my 的路徑的函數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
圖書館)。
你想要做的是獲得最大y座標,然後選擇一半X協調。所以你需要X和y每個點的座標。
此外,你應該絕不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和y頂點的座標。\p<int> = (<coordinate>)
會保存X和y用於\x<int>,\y<int>
在線內進一步計算let
。該\n{x}
行計算出X- 頂點的座標,\n{y}
線計算最大值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
。