Kombinieren von Tikz-Konzepten/Bibliotheken zum Zeichnen eines komplexen Bildes mit relativer Ausrichtung/Abständen

Kombinieren von Tikz-Konzepten/Bibliotheken zum Zeichnen eines komplexen Bildes mit relativer Ausrichtung/Abständen

Ich denke, alleProblemewurde in der Vergangenheit von mir oder anderen gestellt. Aber mein Gesamtproblem ist, dass ich nicht in der Lage bin, all diese Lösungen zu dem wirklichen Bild zu kombinieren, das ich zeichnen möchte. Normalerweise ist es gut, ein komplexes Problem in einfachere aufzuteilen und zu stellen. Aber hier versuche ich, die komplexe Frage zu stellen, weil ich erfahren habe, dass sich die Lösungen gegenseitig beeinflussen (in meinem Fall negativ).

Bildbeschreibung hier eingeben

Beschreibung der Bedürfnisse/Probleme:

  1. Die linken Knoten ( ) sollten gedreht werden. Mir wäre eine Lösung mit ( ) Phaselieber .\rotateboxnode contents={\rotatebox{90}{#1}}}
  2. Die Knoten (besser wäreReihen) rechts sind horizontal zentriert.
  3. Logischerweise hat das Bild vierReihenund die Knoten links und rechts müssen das anzeigen. Das bedeutet, dass ein Knoten (z. B. right of B) vertikal zentriert istgegensein linker Knoten. Bitte beachten Sie, dass zu PhaseCund gehört , sodass die vertikale Ausrichtung dies darstellen sollte. (C1C2long C3hier besprochen)
  4. Ich denke, das Verbinden der Knoten mit Pfeilen sollte nicht so schwer sein.
  5. Alles muss relativ erfolgen. Das heißt, kein cm, mm, ptoder so etwas.
  6. Die Anzahl der Knoten ist nicht festgelegt. Es kann sein, dass in Zeile eins weniger Knoten sind als in Zeile vier.

Einige Lösungen:

\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}

Produzieren Sie dieses

Bildbeschreibung hier eingeben

Nummer 2 und 5 sind nicht erfüllt. Und ich denke, Nummer 6 wird in Zukunft Probleme bereiten.

Antwort1

So würde ich es wahrscheinlich tatsächlich machen. Ich behaupte nicht, dass dies eine offensichtliche Lösung ist, aber der Code ist prägnant und kann leicht für das gesamte Diagramm angepasst werden.

beschriftetes Diagramm

Wenn jemand dies zu Hause ausprobieren möchte, lassen Sie es mich wissen und ich gebe Ihnen eine Kopie des experimentellen Pakets, das es verwendet. (Ich hoffe, in Kürze das Schwesterpaket von CTAN zu bekommen, und vielleicht auch dieses hier, aber so weit ist es noch nicht.)

Dies verwendetWaldVersion 2. Es wurde nicht mit Version 1 getestet.

\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}

Antwort2

Ihr MWE wurde ohne Fehler kompiliert, aber das Ergebnis scheint sich von Ihrer Skizze zu unterscheiden ... Da Sie bereits Antworten auf Ihre ähnlichen Fragen erhalten haben, die auch die in der Frage hervorgehobenen Probleme lösen, habe ich (auf der Grundlage meiner vorherigen Antworten) das folgende Flussdiagramm erstellt:

Bildbeschreibung hier eingeben

mit folgendem Code:

\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}

Der Code hierfür basiert auf den folgenden Annahmen:

  • Die breiteste Reihe im rechten Zweig ist die oberste Reihe, daher ist der linke Zweig an seiner linken Seite ausgerichtet
  • Knoten in der ersten Reihe in rechten Ketten sind in der Kette nach rechts
  • Der rechte Zweig liegt unterhalb der Mitte der ersten Reihe. Dies kann einfach durch bestimmt werden $(MR-1.south west)!0.5!(MR-4.south east)$. Die Knoten darin sind in einer Kette und gehen unter
  • in der letzten Zeile gibt es nur zwei Knoten, daher sind sie relativ zum darüber liegenden Knoten positioniert
  • Die blauen Knoten im linken Zweig sind in Bezug auf die linke Seite der ersten Zeile und die Positionierung der zugehörigen Knoten im rechten Zweig positioniert, mit Ausnahme des Knotens „Phase C“, der auf die durch (ML1 |- MB-2.north)und bestimmten Koordinaten passt (ML1 |- MB-4.south), wobei ML1 die Koordinate des oberen blauen Knotens ist und MB-2die MB-4Namen der zugehörigen Knoten im rechten Zweig
  • Knoten sind nicht im Raster
  • Knoten in der oberen Reihe, rechter Zweig haben einen eigenen Stil, der sich im Kettennamen unterscheidet
  • Blaue Knoten haben auch einen eigenen Stil. Da Text in Knoten, der zu bestimmten Koordinaten passt, nicht mehr zentriert wird, wird für Text ein Label verwendet, das in der Knotenmitte positioniert ist.

Falls der Text in den Knoten im rechten Zweig mehr Zeilen enthält, als Sie zum Knotenstil hinzufügen können text width( align=centeroder links, je nachdem, wie Sie ihn ausrichten möchten).

verwandte Informationen