Tikz 개념/라이브러리를 결합하여 상대적인 정렬/거리로 복잡한 그림 그리기

Tikz 개념/라이브러리를 결합하여 상대적인 정렬/거리로 복잡한 그림 그리기

내 생각엔 모두문제과거에 나 또는 다른 사람들이 요청한 적이 있습니다. 그러나 나의 전체적인 문제는 내가 그리고 싶은 실제 그림에 이 모든 해결책을 결합할 수 없다는 것입니다. 일반적으로 복잡한 문제를 더 간단한 문제로 분리하여 질문하는 것이 좋습니다. 하지만 여기서는 솔루션이 서로 영향을 미치는(내 경우에는 부정적) 것을 경험했기 때문에 복잡한 질문을 하려고 합니다.

여기에 이미지 설명을 입력하세요

요구사항/문제에 대한 설명:

  1. 왼쪽 노드( Phase)는 회전되어야 합니다. 나는 \rotatebox( ) 로 해결하는 것을 선호합니다 node contents={\rotatebox{90}{#1}}}.
  2. 노드(더 나은 것은) 오른쪽은 수평 중앙에 위치합니다.
  3. 논리적인 그림에는 4개가 있습니다왼쪽과 오른쪽의 노드는 이를 표시해야 합니다. 이는 하나의 노드(예: right of B)가 수직 중심에 있음 을 의미합니다.~에 맞서왼쪽 노드. 가 , 및 에 PhaseC속하므로 수직 정렬이 이를 나타내도록 하십시오. (C1C2long C3여기서 논의됨)
  4. 화살표로 노드를 연결하는 것은 그리 어렵지 않을 것 같습니다.
  5. 모든 것은 상대적으로 이루어져야 합니다. 이는 아니오 cm, mm또는 pt이와 유사한 것을 의미합니다.
  6. 노드 수는 고정되어 있지 않습니다. 행 1의 노드 수가 행 4의 노드보다 적을 수 있습니다.

일부 솔루션:

\documentclass[tikz]{standalone}
\usepackage{xltxtra}
\usepackage{polyglossia}
\setdefaultlanguage[spelling=new]{german}
\usepackage{tikz}
\usetikzlibrary{scopes,matrix,positioning,chains}

\begin{document}
\begin{tikzpicture}
    [
        items/.style = {
            draw,
            align=center},
        phase/.style = {
            items,
            fill=red!20,
            node contents={\rotatebox{90}{#1}}}
    ]
    {[
        start chain=P going below
    ]
        \node [on chain,phase=PhaseA];
        {[
            start branch=A going right,
            every on chain/.append style=items,
            every node/.style=on chain
        ]
            \node {One};
            \node {Two};
            \node {Three};
            \node {Four};
        }
        \node [on chain,phase=PhaseB];
        \node [on chain,phase=PhaseC];
        \node [on chain,phase=PhaseD];
        {[
            start branch=D going right,
            every on chain/.append style=items,
            every node/.style=on chain
        ]
            \node {D1};
            \node {D2};
        }
    }

    % B
    \node [right=of P-2,items] {right of B};

    % C
    \matrix (C) [
        matrix of nodes,
        row sep=5pt, %2\textheight doesn't work here, maybe a \nodeheight exists?
        every node/.append style=items,
        right=of P-3]
    {
        C1 \\
        C2 \\
        long C3\\
    };
\end{tikzpicture}
\end{document}

이것을 생산하다

여기에 이미지 설명을 입력하세요

2번과 5번은 채워지지 않았습니다. 그리고 6번은 앞으로 문제가 될 것 같아요.

답변1

실제로 이 작업을 수행하는 방법은 다음과 같습니다. 이것이 확실한 해결책이라고 생각하지는 않지만 코드가 간결하고 전체 다이어그램에 대해 쉽게 조정할 수 있습니다.

라벨이 붙은 다이어그램

집에서 이것을 시도해보고 싶은 사람이 있으면 알려주세요. 사용하는 실험 패키지의 사본을 제공해 드리겠습니다. (나는 그 자매를 CTAN에 곧 데려오고 싶고 아마도 이것도 마찬가지일 것입니다. 그러나 아직은 없습니다.)

이는 다음을 사용합니다.버전 2. 버전 1에서는 테스트되지 않았습니다.

\documentclass[tikz, border=10pt, multi]{standalone}
\usepackage{justtrees}% version 0.07; forest version 2
\begin{document}
\forestset{%
  grouped/.style={
    !u.l sep=2.5pt,
    l=2.5pt,
    no edge
  }
}
\begin{justtree}
{
    for tree={
      draw,
      text height=1.5ex,
      l+=10mm,
      edge={->, thick},
      thick,
      font=\sffamily
    },
    just format={fill=red!20, rotate=90, anchor=south, yshift=2.5mm, xshift=.75ex, font=\sffamily}
}
  [one, left just=PhaseA]
  [two]
  [
    [right of B, left just=PhaseB, no edge, tikz+={\foreach \i in {1,2,4,5} \draw [<-, thick] (.child anchor) -- (!uu\i.parent anchor); }
      [C1
        [C2, left just=PhaseC, grouped
          [long C3, grouped
            [D1, left just=PhaseD]
            [D2]
          ]
        ]
      ]
    ]
  ]
  [three]
  [four]
\end{justtree}
\end{document}

답변2

오류 없이 MWE 컴파일을 수행했지만 결과가 스케치와 다른 것 같습니다. 유사한 질문에 대한 답변을 이미 얻었으므로 문제에서 강조한 문제도 해결하므로 이전 답변을 바탕으로 다음 순서도를 만들었습니다. :

여기에 이미지 설명을 입력하세요

다음 코드를 사용합니다.

\documentclass{article}
    \usepackage{tikz}
    \usetikzlibrary{arrows.meta,calc,chains,fit,positioning,scopes}
%%%% for show flowchart only
    \usepackage[active,tightpage]{preview}
    \PreviewEnvironment{tikzpicture}
    \setlength\PreviewBorder{3mm}

    \begin{document}
%---------------------------------------------------------------%
%   forth example                                               %
%---------------------------------------------------------------%
    \begin{tikzpicture}
%---------------------------------------------------------------%
suspend join/.code={\def\tikz@after@path{}},
    node distance = 7mm and 5mm,
      start chain = MR going right,
      start chain = MB going below,
      base/.style = {% common parameters
            draw, minimum size=4ex, inner sep=1mm},
        MR/.style = {% My Row nodes
            base, on chain=MR},
        MB/.style = {% My right Branch nodes
            base, on chain=MB},
        ML/.style = {% My Left branch nodes
            draw=cyan!60!black, rounded corners, fill=cyan!30,
            minimum size=4ex,
            label=center:\rotatebox{90}{#1},
            node contents={\rotatebox{90}{\phantom{#1}}}},
     arrow/.style = {thick,-{Triangle[]}},
       }
%---------------------------------------------------------------%
% FIRST ROW, names MR-1 ... MR-4
\node [MR] {one};
\node [MR] {two};
\node [MR] {tree};
\node [MR] {four};
% RIGHT BRANCH, names MB-1 ... MB-4
%   start point is below of middle of the first row
    \begin{scope}[every node/.style={MB,join=by arrow}]
\node[below=15mm of $(MR-1.south west)!0.5!(MR-4.south east)$] 
        {belong to Phase B}; % name=MB-1,
\node   {belong to Phase C};
\node   {belong to Phase C};
\node   {also belong to Phase C};% name=MB-4,
    \end{scope}
% LAST ROW, names MR-5 ... MR-6
\node[MR,below  left=of MB-4.south]   {D1};% name=MR-5,
\node[MR,below right=of MB-4.south]   {D2};
% LEFT BRANCH, 
\node (ML1) [ML=Phase A,left=of MR-1.west];
\node (ML2) [ML=Phase B,left=of MR-1.west |- MB-1];
\node (ML3) [ML=Phase C, inner ysep=0pt,
             fit=(ML1 |- MB-2.north) (ML1 |- MB-4.south)];
\node (ML4) [ML=Phase D,left=of MR-1.west |- MR-5];
% ARROWS NOT DETERMINED BY "JOIN" MACRO
\foreach \i in {1,2,3,4}
\draw[arrow]    (MR-\i) -- (MB-1);
\draw[arrow]    (MB-4) -- (MR-5);
\draw[arrow]    (MB-4) -- (MR-6);
    \end{tikzpicture}
\end{document}

이에 대한 코드는 다음과 같은 가정으로 설계되었습니다.

  • 오른쪽 가지에서 가장 넓은 행이 맨 위 행이므로 왼쪽 가지가 왼쪽에 정렬됩니다.
  • 오른쪽 체인의 첫 번째 행에 있는 노드는 오른쪽으로 가는 체인에 있습니다.
  • 오른쪽 가지는 첫 번째 행의 중앙 아래에 있습니다. 에 의해 간단히 결정될 수 있습니다 $(MR-1.south west)!0.5!(MR-4.south east)$. 그 안에 있는 노드는 체인에 있고 아래로 이동합니다.
  • 마지막 행에는 두 개의 노드만 있으므로 위의 노드에 상대적으로 배치됩니다.
  • 왼쪽 분기의 파란색 노드는 첫 번째 행의 왼쪽을 기준으로 배치되고 ML1이 상단 좌표인 (ML1 |- MB-2.north)경우 에 의해 결정되는 좌표에 맞는 노드 "Phase C"를 제외하고 오른쪽 분기에 속하는 노드의 위치가 지정됩니다. (ML1 |- MB-4.south)파란색 노드 및 MB-2오른쪽 MB-4분기에 속한 노드의 이름
  • 노드가 그리드에 없습니다
  • 맨 윗줄의 노드, 오른쪽 가지에는 자체 스타일이 있으며 체인 이름이 다릅니다.
  • 파란색 노드에도 고유한 스타일이 있습니다. 일부 좌표에 맞는 노드의 텍스트가 더 이상 중앙에 있지 않기 때문에 텍스트의 경우 노드 중앙에 위치한 레이블이 활용됩니다.

경우에 따라 오른쪽 가지에 있는 노드의 해당 텍스트에는 노드 스타일에 추가할 수 있는 것보다 더 많은 줄에 텍스트가 포함됩니다 text width( align=center또는 왼쪽은 정렬하려는 항목에 따라 다름).

관련 정보