%20%EC%9D%B4%EB%A6%84%EC%9D%84%20%EC%A7%80%EC%A0%95%ED%95%98%EC%84%B8%EC%9A%94..png)
나는 tikz 사진에 대해 혼란스러워합니다. 문제 없이 자유롭게 정의할 수 있으며, (-A)
예를 들어 에서와 같이 이름 상속을 통해 사용할 수 있는 좌표를 내부에 추가할 수도 있습니다 \pic (S) at (0,0) {myPic}; \draw (S-A) -- ++(0,0);
. 이것은 모두 p 주위에 문서화되어 있습니다. pgf 매뉴얼 255.
그러나 위의 사진과 같이 사진 안에 좌표가 정의되어 있지 않은 경우 사진에 이름을 지정할 수 없는 이유를 이해하지 못합니다. 기본적으로 일반 노드처럼 작동할 수 있다면 좋을 것입니다.
MWE:
\documentclass{minimal}
\usepackage{tikz}
\tikzset{
myBlock/.pic = {
\node[draw,minimum width=1cm,minimum height=0.5cm] at (0,0) {};
},
myBlockNamed/.pic = {
\node[draw,minimum height=1cm,minimum width=0.5cm] (-m) at (0,0) {};
},
}
\begin{document}
\begin{tikzpicture}
\pic () at (0,0) {myBock}; % can't give it a name
\pic (S) at (3,0) {myBlockNamed}; % can give it a name
\draw (S-A) -- ++(2,0);
\end{tikzpicture}
\end{document}
기본 요점은 제어 블록 라이브러리를 작업 중이라는 것입니다(아래에서 @Alenanno와의 채팅을 중지할 수 있도록). 예를 들어 수학 연산자의 정의는 다음과 같습니다.
\tikzset{
mySum background/.style = {
circle, minimum size=1.5em, fill=white,
},
mySum edge/.style = {
draw=black, circle, minimum size=1.5em, line width=.5pt,
},
pics/bOp/.style = {
code = {
\node [mySum background] {};
\foreach \t [count=\i] in {#1}{
\pgfmathsetmacro{\angle}{\i*90}
\node[anchor=center, font=\tiny] at (\angle:0.45em) {$\t$};
}
\node [mySum edge] {};
},
},
}
답변1
a가 키로 이름이 지정될 수 있는 pic
a 내부에 배치된다는 사실을 활용하는 일부 상황에서 사용할 수 있는 트릭이 있습니다 . 이는 트리나 그래프에서는 작동하지 않습니다.scope
local bounding box
\documentclass[tikz,border=5]{standalone}
\tikzset{pics/.cd,
pic a/.style={code={
\node [fill=red!20, shape=circle] {A};
}}
}
\begin{document}
\begin{tikzpicture}
\pic [local bounding box=A1] at (0,0) {pic a};
\pic [local bounding box=A2] at (3,0) {pic a};
\foreach \i in {0,15,...,345}{
\draw [red, ->] (\i:1) -- (A1);
\draw [blue, ->] (3,0)++(\i:1) -- (A2);
}
\end{tikzpicture}
\end{document}
pic
코드에 범위를 명시적으로 추가하는 "래퍼" 키를 정의하여 에 지정된 이름을 사용할 수도 있습니다 .
\documentclass[tikz,border=5]{standalone}
\usetikzlibrary{fit}%
\makeatletter
\tikzset{pics/named scope code/.style={code={\tikz@fig@mustbenamed%
\begin{scope}[local bounding box/.expanded=\tikz@fig@name]#1\end{scope}%
}}}
\makeatother
\tikzset{pics/.cd,
pic a/.style={named scope code={
\node [fill=red!20, shape=circle] {A};
}}
}
\begin{document}
\begin{tikzpicture}
\pic (A1) at (0,0) {pic a};
\pic (A2) at (3,0) {pic a};
\foreach \i in {0,15,...,345}{
\draw [red, ->] (\i:1) -- (A1);
\draw [blue, ->] (3,0)++(\i:1) -- (A2);
}
\end{tikzpicture}
\end{document}
결과는 이전과 같습니다.
답변2
로부터PGF 매뉴얼(버전 3.0.0), 252페이지:
노드와 달리 사진은 나중에 참조할 수 없습니다. 사진 내부에 있는 노드를 참조할 수 있지만 "사진 자체"는 참조할 수 없습니다. 특히, 노드 사이에 선을 그리는 것처럼 사진 사이에 선을 그릴 수 없습니다. 일반적으로 일부 그림이 다른 노드형 항목에 연결될 수 있다고 판단되면 노드가 그림보다 낫습니다.
사진을 사용하여 노드의 전체 성능을 에뮬레이션하는 경우(원칙적으로 가능함) 동일한 효과를 달성하는 노드보다 구성 속도가 더 느리고 더 많은 메모리를 차지합니다.
따라서 노드가 잘하는 일을 하고 있는데, 노드를 사용할 특별한 이유가 없다면pic
노드를 사용하는 것이 더 좋습니다. "라는 질문에 대한 답변에 해결 방법이 있습니다.\pic에 이름을 지정하는 방법"하지만 정확히는 해결 방법입니다.
그러나 다른 노드 주위에 노드를 배치하려면 얼마 전에 내가 물었던 이 질문을 확인하면 됩니다(TiKZ에서 다른 노드 주위에 노드를 배치하는 방법은 무엇입니까?) 또는 일반 노드와 함께 Tikz foreach를 사용합니다.
업데이트된 답변
이제 필요한 것이 무엇인지 알았으니 Tikz를 사용한 솔루션을 소개합니다. new 명령 \mySumn
(이름을 바꿀 수 있음)은 와 같은 두 개의 인수를 사용합니다 \mySumn{#1}{#2}
. 여기서 #1
는 노드 이름이고 #2
는 위치입니다.
다음을 사용하여 선택적 인수를 추가하려고 시도했지만 above of
성공하지 못했습니다. 그러나 이 코드를 사용하여 동일한 작업을 수행할 수 있지만 다른 방식으로 수행할 수 있습니다. 다음을 고려하세요:
\mySumn{p1}{0,0};
\mySumn{p2}{$(p1.north east)+(1em,1em)$};
p1
좌표에 노드를 배치한 다음 x 및 y 축(오른쪽 대각선 위)에서 p1의 북동쪽 +1em에 (0,0)
다른 노드를 배치합니다 .p2
물론 여전히 한 노드에서 다른 노드로 가장자리를 그릴 수 있습니다.
산출
암호
\documentclass[margin=10pt]{standalone}
\usepackage{tikz}
\usepackage{xparse}
\usetikzlibrary{calc,arrows.meta,positioning}
\tikzset{
mySumbk/.style = {
draw, circle, minimum size=1.5em, fill=white,
},
}
\newcommand{\mySumn}[2]{
\node[mySumbk,fill=white] (#1) at (#2) {};
\foreach \angle/\maop in {
90/+,
180/-
}{
\node[anchor=center, font=\tiny] at ($(#1)+(\angle:.45em)$) {$\maop$};
}}
\begin{document}
\begin{tikzpicture}[>=latex]
\mySumn{p1}{0,0};
\mySumn{p2}{$(p1.north east)+(1em,1em)$};
\draw (p1) -- (3,0);
\draw (p1) edge[out=90,in=180] (p2);
\end{tikzpicture}
\end{document}
답변3
local bounding box
오래된 질문이지만 더 잘 제어할 수 있는 방법(예: 내부 콘텐츠까지의 거리)을 찾을 수 없었기 때문에 솔루션이 만족스럽지 않았습니다 .
pic
내 해결책은 옵션 과 함께 에 중첩된 그림을 사용하는 것이었습니다 remember picture
. 이름은 계단식 방식으로 인수로 전달됩니다. 이를 통해 pic
노드로 참조할 수 있을 뿐만 아니라(실제로는 노드이므로) 해당 내용도 참조할 수 있습니다.
또 다른 요점은 이 솔루션을 사용하면 a의 콘텐츠가 pic
항상 중앙 집중화된다는 것입니다. 이는 제가 이 코드를 작업할 때 찾고 있던 것이기도 합니다.
주의 사항:
- 때문에 문서를 두 번 컴파일해야 합니다
remember picture
. - 중첩된 노드는 상속으로 인해 까다로울 수 있습니다.
코드는 다음과 같습니다.
\documentclass[tikz]{standalone}
\usetikzlibrary{positioning}
\begin{document}
\begin{tikzpicture}[remember picture]
\tikzset{
mine/.pic={
\node[draw](#1){
\begin{tikzpicture}[remember picture]
\node[draw](#1-1){#1-1};
\node[draw, right=of #1-1](#1-2){#1-2};
\end{tikzpicture}
};
},
}
\pic{mine=a};
\pic[right=of a]{mine=b};
\draw[thick, blue, <->](a-1)to[out=90, in=90](b-1);
\draw[thick, blue, <->](a-2)to[out=-90, in=-90](b-2);
\draw[thick, red](a)to(b);
\end{tikzpicture}
\end{document}
답변4
내 운영자에게 다음과 같은 명령을 정의하면 다음과 같습니다.
\tikzset{
mySum background/.style = {
circle, minimum size=1.5em, fill=white,
},
mySum edge/.style = {
draw=black, circle, minimum size=1.5em, line width=.5pt,
},
}
\newcommand{\bOp}[1]{
\tikz[outer sep=0pt]{
\node [mySum background] {};
\foreach \t [count=\i] in {#1}{
\pgfmathsetmacro{\angle}{\i*90}
\node[anchor=center, font=\tiny] at (\angle:0.45em) {$\t$};
}
\node [mySum edge] {};
}
}
그러면 위의 내용이 사진을 정의하는 데 사용되는 것과 정확히 같기 때문에 가짜 사진이 포함된 노드를 생성할 수 있습니다.
\node (1) at (0,0) {\bOp{+,-,,}};
\draw (4,0) -- (1);