포지셔닝 사용 시 TikZ 노드 정렬 불량

포지셔닝 사용 시 TikZ 노드 정렬 불량

TikZ 사진 자체를 포함하는 여러 노드를 서로 상대적으로 배치할 때( positioningTikZ 라이브러리를 사용하여) 포함된 사진의 노드가 약간 잘못 정렬된 것처럼 보입니다.

노드 정렬 불량

이 그림은 다음 코드의 결과입니다.

\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

귀하의 코드는 불행히도 tikzpictures를 중첩합니다. 주변 그림의 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}

관련 정보