TikZ 거리와 Line-To 작업을 결합하는 것이 가능합니까?

TikZ 거리와 Line-To 작업을 결합하는 것이 가능합니까?

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);

세 가지 해결책을 알려드리겠습니다.

  1. 단순한 보조 좌표입니다.
  2. 경로를 두 개의 / 경로 rectangle로 바꿉니다 .|--|
  3. 적절한 사용시간제 노동자rectangle경로를 통한 경로 에 대한 함수ext.paths.timertikz-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

|-두 개의 결합된 or -|및 위치 .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 startpos = 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]};

다음과 같이 읽어야 합니다. 에
선을 그린 다음 이 선에 투영합니다. 그런 다음 이전에 계산된 지점과 의 중간 지점을 취합니다 .AA+(0,1)BB

관련 정보