TikZ 사진 자체를 포함하는 여러 노드를 서로 상대적으로 배치할 때( positioning
TikZ 라이브러리를 사용하여) 포함된 사진의 노드가 약간 잘못 정렬된 것처럼 보입니다.
이 그림은 다음 코드의 결과입니다.
\documentclass{article}
\usepackage{tikz}
\usepackage{fp}
\usetikzlibrary{positioning}
\tikzstyle{vertex}=[circle, fill=black, minimum size=2pt, inner sep=0pt]
\newcommand{\makeTikzTree}[1]{%
\FPeval{\result}{#1/2}
\begin{tikzpicture}[thick, scale=0.4]
\draw (0, 0) -- (0, -1) node[vertex]{};
\ifodd#1
\draw (0, 1) node[vertex]{} -- (0, 0);
\foreach \x in {1, ..., \result} {
\draw (-\x, 1) node[vertex]{} -- (0, 0);
\draw (\x, 1) node[vertex]{} -- (0, 0);
}
\else
\foreach \x in {0.5, ..., \result} {
\draw (-\x, 1) node[vertex]{} -- (0, 0);
\draw (\x, 1) node[vertex]{} -- (0, 0);
}
\fi
\end{tikzpicture}
}
\begin{document}
\begin{center}
\begin{tikzpicture}
\node (tree1) {\makeTikzTree{5}};
\node [right=of tree1] (tree2) {\makeTikzTree{4}};
\node [right=of tree2] (tree3) {\makeTikzTree{7}};
\end{tikzpicture}
\end{center}
\end{document}
첫 번째 트리의 정렬이 얼마나 좋은지 확인하세요. 여기서 무슨 일이 일어나고 있는 걸까요? 노드의 절대 위치를 지정하는 경우에는 이것이 잘 작동하지만 상대 위치 지정에서는 작동하지 않는 이유는 무엇입니까?
답변1
귀하의 코드는 불행히도 tikzpicture
s를 중첩합니다. 주변 그림의 pgf 키 값이 상속되므로 이는 피해야 합니다. 너도 그러지 않아도 돼 Ti케이Z는 pic
그 목적을 위해 s를 가지고 있습니다. 그럼에도 불구하고 가 vertex
위치 지정에서 앵커를 상속하지 않는지 확인해야 합니다 . right
이는 앵커가 임을 의미하며 west
이는 모든 정점이 왼쪽에 연결된다는 것을 설명합니다. anchor=center
의 옵션을 추가하면 이를 방지할 수 있습니다 vertex
.
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{positioning}
\begin{document}
\begin{center}
\begin{tikzpicture}[vertex/.style={circle, fill=black, minimum
size=2pt,inner sep=0pt,anchor=center},
pics/little tree/.style={code={
\pgfmathtruncatemacro{\xmax}{#1/2}
\draw (0, 0) -- (0, -1) node[vertex]{};
\ifodd#1
\draw (0, 1) node[vertex]{} -- (0, 0);
\foreach \x in {1, ..., \xmax} {
\draw (-\x, 1) node[vertex]{} -- (0, 0);
\draw (\x, 1) node[vertex]{} -- (0, 0);
}
\else
\foreach \x in {0.5, ..., \xmax} {
\draw (-\x, 1) node[vertex]{} -- (0, 0);
\draw (\x, 1) node[vertex]{} -- (0, 0);
}
\fi}}]
\node[matrix] (tree1) {\pic[scale=0.4]{little tree=5};\\};
\node[matrix,right=of tree1] (tree2) {\pic[scale=0.4]{little tree=4};\\};
\node[matrix,right=of tree2] (tree3) {\pic[scale=0.4]{little tree=7};\\};
\end{tikzpicture}
\end{center}
\end{document}
답변2
슈뢰딩거의 고양이가 그랬듯이, 나는 당신의 나무를 pic
. 다음과 같이 코드를 단순화할 수 있습니다.
\tikzset{
vertex/.style={circle, fill=black, minimum size=2pt, inner sep=0pt},
pics/tree/.style = {
code = {
\begin{scope}[scale=0.4, thick]
\node[vertex] (0) at (0,0){};
\draw(0)--(0,1);
\foreach \x in {1,...,#1} {
\node[vertex] (n\x) at (\x-#1/2-1/2,2){};
\draw(0,1)--(n\x);
}
\end{scope}
}
}
}
특히, 필요하지 않거나 \FPeval
사용할 필요가 없다는 점에 유의하십시오 \ifodd
. 또한 \tikzstyle
에 비해 감가상각되었습니다 \tikzset
.
이를 통해 예제의 위치 지정 라이브러리에 대한 이해는 다음 코드가 작동해야 한다는 것입니다.
\begin{tikzpicture}
\pic (tree1) at (0,0){tree=5};
\pic[right=of tree1] (tree2) {tree=4};
\pic[right=of tree2] (tree3) {tree=7};
\end{tikzpicture}
그러나 내가 이해하지 못하는 이유로 인해 오류가 발생합니다. 나는 다음을 positioning library
제공하기 위해 수동으로 나무를 심는 것을 선호합니다.
또는 슈뢰딩거의 고양이의 멋진 트릭을 사용할 수도 있습니다.
\begin{tikzpicture}
\node[matrix] (tree1) {\pic{tree=5};\\};
\node[matrix,right=of tree1] (tree2) {\pic{tree=4};\\};
\node[matrix,right=of tree2] (tree3) {\pic{tree=7};\\};
\end{tikzpicture}
전체 코드는 다음과 같습니다.
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{positioning}
\tikzset{
vertex/.style={circle, fill=black, minimum size=2pt, inner sep=0pt},
pics/tree/.style = {
code = {
\begin{scope}[scale=0.4, thick]
\node[vertex] (0) at (0,0){};
\draw(0)--(0,1);
\foreach \x in {1,...,#1} {
\node[vertex] (n\x) at (\x-#1/2-1/2,2){};
\draw(0,1)--(n\x);
}
\end{scope}
}
}
}
\begin{document}
\begin{center}
\begin{tikzpicture}
\pic at (0,0){tree=5};
\pic at (2,0){tree=4};
\pic at (4.5,0){tree=7};
\end{tikzpicture}
\end{center}
% Schrödinger's cat's nice trick
\begin{tikzpicture}
\node[matrix] (tree1) {\pic{tree=5};\\};
\node[matrix,right=of tree1] (tree2) {\pic{tree=4};\\};
\node[matrix,right=of tree2] (tree3) {\pic{tree=7};\\};
\end{tikzpicture}
\end{document}