Wie kann ich einen Knoten in den anderen einfügen?

Wie kann ich einen Knoten in den anderen einfügen?

Ich möchte ein Flussdiagramm mit While-Schleife und einigen darin enthaltenen Aktionen erstellen. Ich habe den folgenden Latex-Code geschrieben:

\documentclass[12pt, a4paper]{article}
\usepackage[utf8]{inputenc}
\usepackage[russian]{babel}
\usepackage{listings}
\usepackage{tikz}
\usetikzlibrary{arrows.meta,
    chains,       
    positioning,  
    quotes,       
    shapes.geometric,
    shapes.multipart,
    babel
}

\oddsidemargin=-15.4mm
\textwidth=190mm
\headheight=-32.4mm
\textheight=277mm
\tolerance=100
\parindent=0pt
\parskip=8pt
\pagestyle{empty}

\makeatletter
\tikzset{FlowChart/.style={  % <--- corrected, new
        base/.style = {draw,
            minimum width=3cm, minimum height=1cm, align=center,
            outer sep=0pt,
            on chain, join=by arrow},
        startstop/.style = {base, rounded corners, fill=blue!30},
        process/.style = {base, fill=orange!30},
        decision/.style = {base, diamond, aspect=1.3, fill=green!30},
        io/.style = {base, trapezium, trapezium stretches body,
            trapezium left angle=70, trapezium right angle=110,
            fill=red!30,
            text width =\pgfkeysvalueof{/pgf/minimum width} - 2*\pgfkeysvalueof{/pgf/inner xsep}
        },
        loop/.style = {base, rectangle split, rectangle split parts=2,
            fill=gray!50},
        arrow/.style = {thick,-Triangle},
        % suspend
        suspend join/.code={\def\tikz@after@path{}}
    }
}% end of tikzset
\makeatother

\begin{document}        
    {\textbf{Задача 2.}}
    \\
    Схема алгоритма:
    \\
    \begin{center}
        \begin{tikzpicture}[FlowChart,
            node distance = 1cm and 3cm,
            start chain = A going below
            ]
            
            \node (start) [startstop] {Start};
            
            \node (input) [io] {Input n};
            
            \node (for) [loop]{ 
                \nodepart{one} for i = 1; i<len(n); i++
                \nodepart{two} Output n[i].
            };

            \node (stop) [startstop, below of=for] {End of programm};
        \end{tikzpicture}
    \end{center}
    
\end{document}

Derzeit erhalte ich Folgendes:

Flussdiagramm des Programms

Wie kann ich den „Ausgabeknoten“ in einen For-Schleifenknoten einfügen? Außerdem muss ich für ein anderes Programm einen ganzen Entscheidungsknoten in eine For-Schleife einfügen. Ist das überhaupt möglich?

Grafisch soll der Loop-Block folgendermaßen aussehen: for-Schleife

Und für ein anderes Programm möchte ich, dass es so aussieht: for-Schleife für ein anderes Programm

Antwort1

das zweite (etwas komplexere) Beispiel:

Bildbeschreibung hier eingeben

\documentclass[12pt, a4paper]{article}
\usepackage[russian]{babel}
\usepackage{listings}
\usepackage{tikz}
\usetikzlibrary{arrows.meta,
                chains,
                fit,    % new
                positioning,
                quotes,
                shapes.geometric,
                shapes.multipart,
                babel
}
\usepackage[margin=10mm]{geometry}
\tolerance=100
\parindent=0pt
\parskip=8pt
\pagestyle{empty}

\makeatletter
\tikzset{FlowChart/.style={  
     base/.style = {draw,
                    minimum width=3cm, minimum height=1cm, align=center,
                    outer sep=0pt},
startstop/.style = {base, rounded corners, fill=blue!30},
  process/.style = {base, fill=orange!30},
 decision/.style = {base, diamond, aspect=1.3, fill=green!30},
      FIT/.style = {base, semithick, inner sep=3mm, fit=##1},  % new
       io/.style = {base, trapezium, trapezium stretches body,
                    trapezium left angle=70, trapezium right angle=110,
                    fill=red!30,
                    text width =\pgfkeysvalueof{/pgf/minimum width} - 2*\pgfkeysvalueof{/pgf/inner xsep}
                    },
     loop/.style = {base, rectangle split, rectangle split parts=2,
                    fill=gray!50},
    arrow/.style = {thick,-Triangle},
 % suspend
                suspend join/.code={\def\tikz@after@path{}}
    }
}% end of tikzset
\makeatother

\begin{document}
\begin{center}
    \begin{tikzpicture}[FlowChart,
node distance = 5mm and 7mm,
  start chain = going below
                        ]
\node (d1) [decision]                   {$n>0$};
\node (d2) [process, 
            below right=of d1.south] {n=n+1};
\coordinate[below=of d1 |- d2.south] (aux1);
\node (d3) [io, 
            below=of aux1]            {output};
%
\draw   (d1) -| node[pos=0.25,above] {Yes}    (d2)  |- (aux1)
        (d1.west) -- node[pos=0.25,above] {No} ++ 
        (-1,0) coordinate (aux2) |- (aux1);
\draw[arrow]    (aux1) -- (d3);
% fit
\node (f1) [FIT=(d1) (aux2) (d2) (d3)] {};
\node (f2) [FIT=(f1.north west) (f1.north east),
            inner sep=0pt,
            above=0pt of f1]
           {for $j=1$; $j<\mathrm{len}(r)$; $j+1$};
    \end{tikzpicture}
\end{center}
\end{document}

Notiz:

  • für dieses Bild habe ich FlowChartden Stil geändert. Dementsprechend ist er jetzt für diese neue Version korrigiert/angepasst. Siehe Ihre vorherige Frage.
  • Die erste Skizze können Sie auf die gleiche Weise wie oben zeichnen. Der Hauptunterschied besteht darin, dass sie nur einen Knoten enthält ( io)

Nachtrag:f2Angenommen, Sie haben nur ein solches zusammengesetztes Bild, können Sie mit dem Zeichnen seiner Komposition beginnen und Knoten über und unter dem Knoten hinzufügen f1. Dazu ist es notwendig, den alten Stil zu ersetzen

    arrow/.style = {thick,-Triangle},

mit zwei neuen, deren Pfeile in entgegengesetzte Richtungen zeigen:

      arr/.style = {thick,-Triangle},
      arl/.style = {thick,Triangle-},

Komplettes MWE:

\documentclass[12pt, a4paper]{article}
\usepackage[russian]{babel}
\usepackage{listings}
\usepackage{tikz}
\usetikzlibrary{arrows.meta,
                chains,
                fit,    % new
                positioning,
                quotes,
                shapes.geometric,
                shapes.multipart,
                babel
                }
\usepackage[margin=10mm]{geometry}
\tolerance=100
\parindent=0pt
\parskip=8pt
\pagestyle{empty}

\makeatletter
\tikzset{FlowChart/.style={
     base/.style = {draw,
                    minimum width=3cm, minimum height=1cm, align=center,
                    outer sep=0pt},
startstop/.style = {base, rounded corners, fill=blue!30},
  process/.style = {base, fill=orange!30},
 decision/.style = {base, diamond, aspect=1.3, fill=green!30},
      FIT/.style = {base, semithick, inner sep=3mm, fit=##1},  % new
       io/.style = {base, trapezium, trapezium stretches body,
                    trapezium left angle=70, trapezium right angle=110,
                    fill=red!30,
                    text width =\pgfkeysvalueof{/pgf/minimum width} - 2*\pgfkeysvalueof{/pgf/inner xsep}
                    },
     loop/.style = {base, rectangle split, rectangle split parts=2,
                    fill=gray!50},
      arr/.style = {thick,-Triangle},
      arl/.style = {thick,Triangle-},
 % suspend
                suspend join/.code={\def\tikz@after@path{}}
    }
}% end of tikzset
\makeatother

\begin{document}
\begin{center}
    \begin{tikzpicture}[FlowChart,
node distance = 5mm and 13mm,
  start chain = A going above,
  start chain = B going below
                        ]
% nodes in node                                         
\node (d1) [decision]                   {$n>0$};
\node (d2) [process,
            below right=of d1.south] {n=n+1};
\coordinate[below=of d1 |- d2.south] (aux1);
\node (d3) [io,
            below=of aux1]            {output};
%
\draw   (d1) -| node[pos=0.25,above] {Yes}    (d2)  |- (aux1)
        (d1.west) -- node[pos=0.25,above] {No} ++
        (-1,0) coordinate (aux2) |- (aux1);
\draw[arr]  (aux1) -- (d3);
% fit
    \begin{scope}[nodes={on chain=B, join= by arr}]
\node (f1) [FIT=(d1) (aux2) (d2) (d3)] {};
% nodes below  f1
\node (output)  [io,
                 below=of f1]   {Вывод pow};
\node (stop)    [startstop]     {Конец программы};
    \end{scope}
    \begin{scope}[nodes={on chain=A, join= by arl}]
\node (f2) [FIT=(f1.north west) (f1.north east),
            inner sep=0pt,
            above=0pt of f1]
           {for $j=1$; $j<\mathrm{len}(r)$; $j+1$};
% nodes above  f2
\node (ds1)     [decision,
                 above=of f2]   {$n = 0?$};
\node (input)   [io]            {Ввод n};
\node (start)   [startstop]     {Начало};
    \end{scope}
\node (y-case) [process,right=of ds1]   {pow = 1};
%
\draw[arr]  (ds1) to ["Yes"] (y-case);
\draw[arr]  (y-case) |- (f2);
\draw[arr]  (ds1.west) to [pos=0.2, "No" ']  ++ (-3,0) |- (f2); % new
    \end{tikzpicture}
\end{center}
\end{document}

Bildbeschreibung hier eingeben

Natürlich ist oben nur eine der möglichen Lösungen für Ihr Problem aufgeführt. Eine andere Möglichkeit wäre, dass Sie das Bild für den Knoten separat zeichnen, es irgendwo speichern \saveboxund es dann im ausgewählten Knoten verwenden \node [...] {\usebox{˙<\saveboxname>}. Um diese Option anzuzeigen, brauche ich etwas mehr Freizeit.

verwandte Informationen