![수학에서는](https://rvso.com/image/328834/%EC%88%98%ED%95%99%EC%97%90%EC%84%9C%EB%8A%94.png)
나는 이미 TikZ에 대해 잘 알고 있으며 마치 TikZ가 기술적이지 않은 것처럼 기술적 답변을 찾고 있다는 점에 유의해야 합니다.
이 질문은 다음 질문과 관련이 있습니다. 이러한 질문의 차이점은 무엇입니까?
\def\pointA{\pgfpoint{0cm}{0cm}}
\coordinate (A) at (current page.north east);
\coordinate (A) at (1,1);
(current page.north east)
\node [anchor=east] {}
<-- 앵커요? :-피(단순히 용어가 겹치는 것을 보여줌)\pgfpointanchor
<-- 그런데 이게 정말 닻이겠군요, 아니면 요점인가요? :-피
내 이해가 부족하다고 생각하며 아래에 표시된 내 시도를 방해하고 있습니다.
수학에서는
ㅏ가리키다다음과 같이 정의됩니다.
점은 평면 표면의 정확한 위치 또는 위치입니다. 지점은 사물이 아니라 장소라는 것을 이해하는 것이 중요합니다.
ㅏ동등 어구다음과 같이 정의됩니다.
좌표는 점의 위치를 정의하는 일련의 숫자 집합입니다.
앵커는 다음과 같습니다.
나는 실제 사례를 통해 이를 명확히 하고 싶다.
좌표를 정의해 보겠습니다.
\coordinate (rightmid) at ($ (current page.north east) + (0,-18cm) $); % use tikz calc library
다음과 같은 암시적 좌표가 많이 있습니다(좌표, 점, 앵커 또는 기타 다른 이름으로 불러야 할까요?).
- (현재 페이지.북서쪽)
- (현재 페이지.북쪽)
- (현재페이지.북동쪽)
- (현재 페이지.east)
- (현재 페이지.남동쪽)
- (현재 페이지.남쪽)
- (현재 페이지.남서쪽)
- (현재 페이지.center)
두 가지 사이의 수직 거리를 계산하고(의도적으로 "things"라는 단어를 선택함) 현재 범위 외부에서 사용하기 위해 이 변수를 저장한다고 가정해 보겠습니다.
예를 들어 두 가지는 (현재 페이지.북동쪽)과 (rightmid)입니다.
산술을 수행하려면 다음 옵션을 알고 있습니다(이게 전부인가요?).
\pgfmathparse
나는 산술을 평가하는 데 사용할 수 있습니다구문 을 사용할 수 있습니다
\path let \p1=
.
옵션 1을 사용하여 계산에 대해 , 를 설정하고 로 결과 를 \pgfxa
얻을 수 있습니다 .\pgfya
\pgfx
\pgfy
\pgfmathresult
그런 다음 고유한 길이(전역)를 정의할 수 있습니다 \setlength{\mylength}{2cm}
. 그런 다음 \mylength
이를 검색하는 데 사용할 수 있습니다 . 이 \setlength
매크로는 한 번만 정의할 수 있기 때문에 모든 내용을 자체 포함 매크로에 작성하는 것을 허용하지 않습니다 . 대안은 을 사용하는 것입니다 \global\let\mylength{2cm}
. 이 방법이 작업에 더 적합하다고 생각됩니다(내가 틀렸다면 정정해 주십시오. 이것이 값+단위/차원에 영향을 미칩니까)?
함께 모아서
- 한 TikZ 노드의 너비를 사용하여 다른 노드의 너비를 계산할 수 있습니까?
- 좌표를 pgfpoint로 변환하거나 그 반대로 변환하려면 어떻게 해야 합니까?
- 좌표 A, B: |BA| 계산 +x와 (BA) 사이의 각도
- 노드를 반환하는 pgf 매크로
여기에 실험이 있습니다.컴파일되지 않습니다몇 가지 답변을 바탕으로 :
\documentclass{article}
\usepackage{fontspec}
\usepackage{tikz}
\usetikzlibrary{calc}
% A4 Paper
\pdfpagewidth=210mm \pdfpageheight=297mm % for PDF output
\paperwidth=210mm \paperheight=297mm % for TikZ
\newcommand{\getdistance}[3]{
\makeatletter
% Syntax: <length variable/macro> <coordinate1> <coordinate2>
\pgfpointdiff{\pgfpointanchor{#2}{center}} % https://tex.stackexchange.com/a/39325/13552
{\pgfpointanchor{#3}{center}} % https://tex.stackexchange.com/a/39325/13552
\pgf@xa=\pgf@x
\pgf@ya=\pgf@y
\pgfmathparse{veclen(\pgf@xa,\pgf@ya)}
\global\let#1\pgfmathresult % <-- I want the pgfmathresult to be a dimension like 510 pt
\makeatother
}
\begin{document}
\begin{tikzpicture}[overlay]
\coordinate (rightmidtest) at ($ (current page.north east) + (0,-10cm) $); % use tikz calc library
\coordinate (rightmid) at ($ (current page.north east) + (0,-18cm) $); % use tikz calc library
\end{tikzpicture}
\getdistance{\globalresult}{rightmidtest}{rightmid}
\getdistance{\globalresult}{current page.north east}{rightmid}
\getdistance % <-- Should expand to last distance measured
\end{document}
업데이트된 코드 2016-02-25일하고 있는
Percusse의 답변을 분석하고 새롭게 이해한 후에 나는 다른 것을 생각해 냈습니다.
기억하다:
(current page)
암시적이다- 앵커 .center는 TikZ에 암시되어 있지만 PGF에는 암시되어 있지 않습니다.
\pgfpointanchor{<ref>}{<anchor e.g. center>}
xparse
읽기 쉽기 때문에 매크로 구문을 사용했습니다 .
\documentclass{article}
\usepackage{fontspec}
\usepackage{tikz}
\usetikzlibrary{calc}
\usepackage{xparse}
\makeatletter
\NewDocumentCommand{\getdistance}{ m m O{center} m O{center} }{%
%Syntax: {\<macro>} {<ref1>} [<anchor>] {<ref2>} [<anchor>]
\pgfpointdiff{\pgfpointanchor{#2}{#3}}% https://tex.stackexchange.com/a/39325/13552
{\pgfpointanchor{#4}{#5}}% https://tex.stackexchange.com/a/39325/13552
\pgf@xa=\pgf@x
\pgf@ya=\pgf@y
\pgfmathparse{veclen(\pgf@xa,\pgf@ya)} % result as number (floating point)
%\pgfmathveclen{\pgf@xa}{\pgf@ya} % alternate syntax to pgfmathparse: result as number (floating point)
%\global\let#1\pgfmathresult pt % does not recognize pt.
\global\edef#1{\pgfmathresult\ pt}
%\pgfmathprintnumber{\pgfmathresult}%
}
\makeatother
\begin{document}
\begin{tikzpicture}[remember picture,overlay]
% (current page) is implicit
% .center is implicit in TikZ but not in PGF \pgfpointanchor{<ref>}{<anchor e.g. center>}
\coordinate (referral1) at ($ (current page.north east) + (0,-18cm) $); % use tikz calc library
\node [minimum height=2cm] (referral2) {};
\end{tikzpicture}
\begin{tikzpicture}[remember picture,overlay]
\getdistance{\globalresultA}{current page}{referral1}
\getdistance{\globalresultB}{current page}[north east]{referral1}
\getdistance{\globalresultC}{current page}[north east]{referral2}[north]
\getdistance{\globalresultD}{current page}[north east]{referral2}[south]
\end{tikzpicture}
\globalresultA
\globalresultB
\globalresultC
\globalresultD
\end{document}
답변1
TikZ가 개체가 아닌 추천을 사용하여 작동한다는 사실에서 혼란이 발생한다고 생각합니다. 특정 노드 이름이 a
언급된 경우. 일반적으로 사용자가 중심 좌표를 의미한다고 가정합니다. 또는 두 가지 사이에 그림을 그리는 경우 그 중 하나가 노드이면 사용자가 눈치채지 못하도록 마법처럼 경계의 점을 계산합니다.
하지만 이 모든 일은 내부적으로 이루어집니다. 그리고 노드나 다른 것과 관련된 것은 없습니다. 노드에는 참조할 수 있는 이름과 노드가 이해할 수 있는 사전 정의된 위치가 있습니다.
이들 중 어느 것도 저장되지 않습니다. 그들은 단순히 존재 여부를 확인하거나 실행됩니다. 즉, 라고 쓰면 shape=duck
가능한 모든 모양 이름을 거치지 않고 단순히 종류의 존재 확인만 수행합니다(실제 매크로에는 말도 안되는 이름을 사용하고 있습니다).
\pgfutil@ifdefined\pgf@Shape@#1@...{<if it exists use>}{<if not err>}
앵커는 동일한 거래입니다. 라고 말하면 일부 등을 anchor=heel
통해 해당 이름을 요청합니다 .\pgf@sh@#1@anchor@#2
이제 이것들은 어디서 오는 걸까요? 이는 \savedanchor
등 을 통해 모양 선언에서 정의됩니다 \anchor
.
따라서 참조할 때 텍스트 상자 너비 높이부터 모양 경로까지 모든 것이 고통스럽게 손으로 코딩되도록 세심하게 배열되어 있습니다. 그렇기 때문에 새로운 형태를 정의하는 것은 매우 지루한 작업입니다. 그리고 이를 참조할 때 앵커 위치가 길이 레지스터 내부에 (전역적으로!) 기록되는 방식으로 배열됩니다.\pgf@<x,y>
어쨌든 간단히 말해서, 노드 앵커를 참조할 때 실제로 좌표를 가져오는 데는 꽤 복잡한 절차가 있습니다.
또한, 좌표형 노드인 \pgf@<x,y>
와 좌표형 노드 사이에는 차이가 있습니다 \coordinate
.
마지막으로, 노드를 참조할 때 TikZ는 일부 키 입력을 절약할 수 있도록 중앙 앵커를 의미한다고 가정하여 도움을 주려고 노력하지만 때로는 거리 측정과 같은 더 미세한 작업을 수행해야 합니다.
추천 이름으로는 벗어날 수 없습니다. 실제 좌표가 필요합니다(역시 \coordinate
s가 아님). Mark Wibrow가 언급했듯이 어떻게든 컨텍스트를 이해해야 하며 이는 \pgf@process
리터럴 좌표인지 (1,1)
, 노드 이름인지, 노드 앵커인지 등과 같은 질문에 답하기 위해 수행됩니다. 그런 다음 결과 \pgf@<x,y>
레지스터를 사용할 수 있습니다.
그러면 당신은 그들과 함께 원하는 것은 무엇이든 할 수 있습니다. 귀하의 예제 let
구문은 이를 단순화하는 놀라운 작업을 수행하지만 여전히 귀하가 설명한 작업을 수행하고 있습니다. 실제로 귀하의 질문은 기본적으로 TikZ가 PGF 위에 존재하는 이유입니다. 이는 매우 장황하지만 강력한 PGF 구문에 대해 매우 잘 설계된 프런트 엔드입니다.
답변2
\def\pointA{\pgfpoint{0cm}{0cm}}
PGF(Ti의 기초)에 익숙한 경우에만 이 항목을 사용하십시오.케이지). 어쨌든, \pgfpoint
TeX에서 무엇을 하는지는 중요하지 않습니다 . 이 명령은 단독으로 존재하지 않습니다. 일반적으로 이는 구문의 일부입니다. 예를 들어
\coordinate (A) at (current page.north east);
포인트에 이름을 부여합니다. 실제 x 및 y 좌표가 무엇인지는 중요하지 않습니다. 우리는 어디에 있는지 알고 (A)
있으며 그것이 우리가 알아야 할 전부입니다.
\coordinate (A) at (1,1);
이전과 비슷합니다. 일반적으로 우리는 (A) 코드 길이/복잡성을 줄이고 (B) 가독성을 향상시키는 점을 지적합니다. 예를 들어
(current page.north east)
괄호를 사용하면이동하다행동. 펜을 들고 무언가를 그리고 싶은 다음 위치로 손을 움직이는 것과 매우 비슷합니다. 예를 들어
이 코드는 Ti를 만듭니다.케이Z는 캔버스 전체에서 펜을 움직이고 노드/좌표를 선언합니다.
\node [anchor=east] {}
펜의 현재 위치 "근처"에 노드를 배치합니다. "근처"라는 말은 당신이 제공하는 앵커가 펜의 위치와 일치해야 함을 의미합니다. 그것은 마치 배 위에서 원하는 곳에 닻을 던지면 그 닻이 배를 고칠 수 있는 것과 같습니다.
실용적인 부분
- 당신은 필요합니다
\makeatletter
. - 당신은 아마도
\pgfmathsetlength
대신에\pgfmathsetmacros
또는 를 원할 것입니다\pgfmathparse
.- 하지만 사용하기 전에 모든 차원을 선언해야 한다는 점을 기억하세요.
- 노드를 사용할 때는 주의하세요
(current page)
. 일반적으로[overlay]
. tikzpicture
환경 에서 만든 모든 항목을 검색하려면 환경 내부에 있어야 합니다tikzpicture
.- 동일한 환경에서 작업을 수행하지 않는 경우 가
tikzpicture
필요합니다[remember picture]
.
- 동일한 환경에서 작업을 수행하지 않는 경우 가
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{calc}
\makeatletter
\newcommand{\getdistance}[3]{
% Syntax: <length variable/macro> <coordinate1> <coordinate2>
\pgfpointdiff{\pgfpointanchor{#2}{center}} % http://tex.stackexchange.com/a/39325/13552
{\pgfpointanchor{#3}{center}} % http://tex.stackexchange.com/a/39325/13552
\pgf@xa=\pgf@x
\pgf@ya=\pgf@y
\pgfmathparse{veclen(\pgf@xa,\pgf@ya)}
\global\let#1\pgfmathresult % <-- I want the pgfmathresult to be a dimension like 510 pt
}
\begin{document}
\begin{tikzpicture}[remember picture,overlay]
\coordinate (rightmidtest) at ($ (current page.north east) + (0,-10cm) $); % use tikz calc library
\coordinate (rightmid) at ($ (current page.north east) + (0,-18cm) $); % use tikz calc library
\end{tikzpicture}
\tikz[remember picture,overlay]{
\getdistance{\globalresulta}{rightmidtest}{rightmid}
\getdistance{\globalresultb}{current page}{rightmid}
}
\globalresulta
\globalresultb
\end{document}
답변3
\def\pointA{\pgfpoint{0cm}{0cm}}
이는 기본적으로 다음과 같습니다.
\coordinate (A) at (0,0);
\coordinate (A) at (current page.north east);
여기서는 페이지 오른쪽 상단의 이름을 으로 지정합니다
A
. 위치 이름이 이미 지정되어 있다는 점에서는 의미가 없지만, 해당 위치를 모두 입력하지 않고 그냥 이라고 쓰면 도움이 될 수 있습니다A
.\coordinate (A) at (1,1);
TikZ의 좌표는 기본적으로
coordinate
모양이 있는 노드이며 캡션이 필요하지 않으며 특히 중요한 것은sep
. 그래서 그것은 요점입니다. 그래도 글쓰기\node[coordinate] (a) at (0,0) {};
는 같다\coordinate (a) at (0,0);
(current page.north east)
이는 현재 "페이지"의 오른쪽 상단을 나타냅니다. 일반적으로 이는 A4 페이지이지만 어떤 차원이라도 가능합니다. 이 경우 페이지는 반드시 일반적인 종이 조각으로 의도된 것은 아니지만 지정된 영역일 수 있습니다.
\node [anchor=east] {}
<-- 앵커요?아니요, 이것은 앵커가 아닙니다. 설계된 앵커를 좌표에 배치하여 위치가 결정되는 노드입니다. 따라서 앵커
\node [anchor=east] at (4,0) {};
가 있는 노드를east
좌표와 일치하게 배치합니다(4,0)
.
답변4
이전 답변을 편집하는 방법을 모르겠습니다. 그냥 새로 쓰겠습니다.
티에케이Z 점을 지정하는 방법에는 여러 가지가 있습니다.
숫자 좌표를 제공합니다.
예를 들어(1,2)
,(3mm,4in,5pt)
,(6:7)
,(axis cs:x=8)
.사전 정의된 노드 이름과 앵커 이름을 제공합니다.
예를 들어(current page.south east)
,(current bounding box.north west)
.사전 정의된 노드 이름을 제공합니다.
예를 들어(current page)
. 이는 다음과 같습니다.(current page.center)
미리 정의된 을 제공합니다
coordinate
.
예를 들어\coordinate(X)at(1,2);\path(X);
. A는coordinate
실제로 앵커가 "사라지는" 노드입니다.(X)
,(X.center)
,(X.south)
및(X.34)
모두 동일한 결과를 제공합니다.
PGF 카운터 부품은 다음과 같습니다.
\pgfpointxy
,\pgfpointxyz
,\pgfpointpolar
, 등등\pgfpointanchor{#1}{#2}
\pgfpointanchor{#1}{center}
\pgfpointanchor{#1}{center}
이제 의 정의에서 \getdistance
노드 이름만 입력할 수 있고 앵커는 center
필수로 선택된다는 것을 알 수 있습니다. 그러므로
\getdistance{\globalresultb}{current page.north east}{rightmid}
current page.north east
더 이상 노드가 아니기 때문에 컴파일되지 않습니다 . 하지만
\coordinate (A) at (current page.north east);
\getdistance{\globalresultb}{A}{rightmid}
(A)
노드의 이름이기 때문에 컴파일됩니다 .
어떤 종류의 입력을 처리할 수 있는지는 사용자에게 달려 있습니다 \getdistance
. 예를 들어 Ti에서케이Z는 및 를 \tikz@parse@node
모두 처리할 수 있습니다 . 하지만 . 보다 일반적으로 는 , 및 을 처리합니다 . 훨씬 더 일반적으로 처리할 수 있습니다 . 하나를 선택해야 합니다.(X)
(Y.Z)
(1,2)
\tikz@@scan@@no@calculator
(X)
(Y.Z)
(1,2)
\tikz@@@scan@@absolute
($ (current page.north east) + (0,-10cm) $)