
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
パス上のノードの配置が 2 つの座標間の直線上にのみあるため、次の 2 つのパス上のノードは同じ場所にあり、同じであることです<pos>
。
\path (c1) -- node[pos=<pos>] {} (c2);
\path (c1) rectangle node[pos=<pos>] {} (c2);
3つの解決策をご紹介します。
- 単なる補助座標。
- パスを 2 つの/パス
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
|-
または を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
。
あなたがしたいのは、最大限のええ座標を選択してから半分を選択しますバツ座標です。バツそしてええ各点の座標。
さらに、一度もない!を使用して座標を指定します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)$) {...};
上記は計算を行っている道の上でのバツそしてええ最上位のポイントの座標を\p<int> = (<coordinate>)
保存しますバツそしてええ\x<int>,\y<int>
行内でさらに計算するために入力するlet
。\n{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