Schlaufen mit Ketten verwenden?

Schlaufen mit Ketten verwenden?

Gibt es einen intelligenteren Weg, um dasselbe Ergebnis zu erzielen wie mit dem folgenden MWE:

1) durch die Verwendung einer Art Schleife, anstatt jeden Knoten manuell einzugeben,

2) indem Sie die Pfeile mit Tikz zeichnen, anstatt den Mathematikmodus von LaTeX zu verwenden

\documentclass[border=0.5cm]{standalone}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{tikz}
  \usetikzlibrary{arrows,
chains,
scopes}

\begin{document}
  \tikzset{>=stealth',
  monomer/.style={
    rectangle, 
    rounded corners, 
    draw=black, very thick,
    text width=1em, 
    minimum height=1.5em, 
    text centered, 
    on chain},
  fleche/.style={
    text width=1.5em, 
    text centered, 
    on chain},
  plus/.style={ 
    text width=1em,
  text centered,
  on chain},
  }

\begin{tikzpicture}
[node distance=.3cm and 0.1cm,
  start chain=going right,scale=0.45]
{ [start chain=vert going below]
  \node[monomer, fill=yellow!55] (G12r) {G};
    { [start branch=first going right]
      \node[monomer, join, fill=yellow!55] (G11r) {G};
      \node[monomer, join, fill=yellow!55] (G10r) {G};       
      \node[monomer, join, fill=yellow!55] (G9r) {G};
      \node[monomer, join, fill=yellow!55] (G8r) {G};        
      \node[monomer, join, fill=yellow!55] (G7r) {G};
      \node[monomer, join, fill=yellow!55] (G6r) {G};
      \node[monomer, join, fill=yellow!55] (G5r) {G};
      \node[monomer, join, fill=yellow!55] (G4r) {G};
      \node[monomer, join, fill=yellow!55] (G3r) {G};
      \node[monomer, join, fill=yellow!55] (G2r) {G};
      \node[monomer, join, fill=yellow!55] (G1r) {G};
      \node[fleche] (A) {$\rightarrow$};
      \node[monomer, fill=yellow!50] (G11p) {G};
      \node[monomer, join, fill=yellow!50] (G10p) {G};       
      \node[monomer, join, fill=yellow!50] (G9p) {G};
      \node[monomer, join, fill=yellow!50] (G8p) {G};        
      \node[monomer, join, fill=yellow!50] (G7p) {G};
      \node[monomer, join, fill=yellow!50] (G6p) {G};        
      \node[monomer, join, fill=yellow!50] (G5p) {G};        
      \node[monomer, join, fill=yellow!50] (G4p) {G};
      \node[monomer, join, fill=yellow!50] (G3p) {G};
      \node[monomer, join, fill=yellow!50] (G2p) {G};
      \node[monomer, join, fill=yellow!50] (G1p) {G};
      \node[plus] (B) {+};  
      \node[monomer] (M) {M};     
    } 
  \node[monomer, fill=yellow!50] (G11r) {G};
    { [start branch=first going right]
     \node[monomer, join, fill=yellow!50] (G10r) {G};
     \node[monomer, join, fill=yellow!50] (G9r) {G};
     \node[monomer, join, fill=yellow!50] (G8r) {G};         
     \node[monomer, join, fill=yellow!50] (G7r) {G};
     \node[monomer, join, fill=yellow!50] (G6r) {G};
     \node[monomer, join, fill=yellow!50] (G5r) {G};
     \node[monomer, join, fill=yellow!50] (G4r) {G};
     \node[monomer, join, fill=yellow!50] (G3r) {G};
     \node[monomer, join, fill=yellow!50] (G2r) {G};
     \node[monomer, join, fill=yellow!50] (G1r) {G};
     \node[fleche] (A) {$\rightarrow$};
     \node[monomer, fill=yellow!45] (G10p) {G};
     \node[monomer, join, fill=yellow!45] (G9p) {G};
     \node[monomer, join, fill=yellow!45] (G8p) {G};         
     \node[monomer, join, fill=yellow!45] (G7p) {G};
     \node[monomer, join, fill=yellow!45] (G6p) {G};         
     \node[monomer, join, fill=yellow!45] (G5p) {G};         
     \node[monomer, join, fill=yellow!45] (G4p) {G};
     \node[monomer, join, fill=yellow!45] (G3p) {G};
     \node[monomer, join, fill=yellow!45] (G2p) {G};
     \node[monomer, join, fill=yellow!45] (G1p) {G};
     \node[plus] (B) {+};  
     \node[monomer] (M) {M};      
   }  
 \node[monomer, fill=yellow!45] (G10r) {G};
   { [start branch=first going right]
     \node[monomer, join, fill=yellow!45] (G9r) {G};
     \node[monomer, join, fill=yellow!45] (G8r) {G};         
     \node[monomer, join, fill=yellow!45] (G7r) {G};
     \node[monomer, join, fill=yellow!45] (G6r) {G};
     \node[monomer, join, fill=yellow!45] (G5r) {G};
     \node[monomer, join, fill=yellow!45] (G4r) {G};
     \node[monomer, join, fill=yellow!45] (G3r) {G};
     \node[monomer, join, fill=yellow!45] (G2r) {G};
     \node[monomer, join, fill=yellow!45] (G1r) {G};
     \node[fleche] (A) {$\rightarrow$};
     \node[monomer, fill=yellow!40] (G9p) {G};
     \node[monomer, join, fill=yellow!40] (G8p) {G};
     \node[monomer, join, fill=yellow!40] (G7p) {G};
     \node[monomer, join, fill=yellow!40] (G6p) {G};         
     \node[monomer, join, fill=yellow!40] (G5p) {G};         
     \node[monomer, join, fill=yellow!40] (G4p) {G};
     \node[monomer, join, fill=yellow!40] (G3p) {G};
     \node[monomer, join, fill=yellow!40] (G2p) {G};
     \node[monomer, join, fill=yellow!40] (G1p) {G};
     \node[plus] (B) {+};  
     \node[monomer] (M) {M};      
   } 
\node[monomer, fill=yellow!40] (G9r) {G};
   { [start branch=first going right]
     \node[monomer, join, fill=yellow!40] (G8r) {G};
     \node[monomer, join, fill=yellow!40] (G7r) {G};
     \node[monomer, join, fill=yellow!40] (G6r) {G};
     \node[monomer, join, fill=yellow!40] (G5r) {G};
     \node[monomer, join, fill=yellow!40] (G4r) {G};
     \node[monomer, join, fill=yellow!40] (G3r) {G};
     \node[monomer, join, fill=yellow!40] (G2r) {G};
     \node[monomer, join, fill=yellow!40] (G1r) {G};
     \node[fleche] (A) {$\rightarrow$};
     \node[monomer, fill=yellow!35] (G8p) {G};
     \node[monomer, join, fill=yellow!35] (G7p) {G};
     \node[monomer, join, fill=yellow!35] (G6p) {G};         
     \node[monomer, join, fill=yellow!35] (G5p) {G};         
     \node[monomer, join, fill=yellow!35] (G4p) {G};
     \node[monomer, join, fill=yellow!35] (G3p) {G};
     \node[monomer, join, fill=yellow!35] (G2p) {G};
     \node[monomer, join, fill=yellow!35] (G1p) {G};
     \node[plus] (B) {+};  
     \node[monomer] (M) {M};      
   } 
\node[monomer, fill=yellow!35] (G8r) {G};
   { [start branch=first going right]
     \node[monomer, join, fill=yellow!35] (G7r) {G};
     \node[monomer, join, fill=yellow!35] (G6r) {G};
     \node[monomer, join, fill=yellow!35] (G5r) {G};
     \node[monomer, join, fill=yellow!35] (G4r) {G};
     \node[monomer, join, fill=yellow!35] (G3r) {G};
     \node[monomer, join, fill=yellow!35] (G2r) {G};
     \node[monomer, join, fill=yellow!35] (G1r) {G};
     \node[fleche] (A) {$\rightarrow$};
     \node[monomer, fill=yellow!30] (G7p) {G};
     \node[monomer, join, fill=yellow!30] (G6p) {G};         
     \node[monomer, join, fill=yellow!30] (G5p) {G};         
     \node[monomer, join, fill=yellow!30] (G4p) {G};
     \node[monomer, join, fill=yellow!30] (G3p) {G};
     \node[monomer, join, fill=yellow!30] (G2p) {G};
     \node[monomer, join, fill=yellow!30] (G1p) {G};
     \node[plus] (B) {+};  
     \node[monomer] (M) {M};      
   } 
\node[monomer, fill=yellow!30] (Gr7) {G};
   { [start branch=first going right]
     \node[monomer, join, fill=yellow!30] (G6r) {G};
     \node[monomer, join, fill=yellow!30] (G5r) {G};
     \node[monomer, join, fill=yellow!30] (G4r) {G};
     \node[monomer, join, fill=yellow!30] (G3r) {G};
     \node[monomer, join, fill=yellow!30] (G2r) {G};
     \node[monomer, join, fill=yellow!30] (G1r) {G};
     \node[fleche] (A) {$\rightarrow$};
     \node[monomer, fill=yellow!25] (G6p) {G};
     \node[monomer, join, fill=yellow!25] (G5p) {G};         
     \node[monomer, join, fill=yellow!25] (G4p) {G};
     \node[monomer, join, fill=yellow!25] (G3p) {G};
     \node[monomer, join, fill=yellow!25] (G2p) {G};
     \node[monomer, join, fill=yellow!25] (G1p) {G};
     \node[plus] (B) {+};  
     \node[monomer] (M) {M};      
   }  
\node[monomer, fill=yellow!25] (G6r) {G};
   { [start branch=first going right]
     \node[monomer, join, fill=yellow!25] (G5r) {G};
     \node[monomer, join, fill=yellow!25] (G4r) {G};
     \node[monomer, join, fill=yellow!25] (G3r) {G};
     \node[monomer, join, fill=yellow!25] (G2r) {G};
     \node[monomer, join, fill=yellow!25] (G1r) {G};
     \node[fleche] (A) {$\rightarrow$};
     \node[monomer, fill=yellow!20] (G5p) {G};
     \node[monomer, join, fill=yellow!20] (G4p) {G};
     \node[monomer, join, fill=yellow!20] (G3p) {G};
     \node[monomer, join, fill=yellow!20] (G2p) {G};
     \node[monomer, join, fill=yellow!20] (G1p) {G};
     \node[plus] (B) {+};  
     \node[monomer] (M) {M};      
   }
\node[monomer, fill=yellow!20] (G5r) {G};
   { [start branch=first going right]
     \node[monomer, join, fill=yellow!20] (G4r) {G};
     \node[monomer, join, fill=yellow!20] (G3r) {G};
     \node[monomer, join, fill=yellow!20] (G2r) {G};
     \node[monomer, join, fill=yellow!20] (G1r) {G};
     \node[fleche] (A) {$\rightarrow$};
     \node[monomer, fill=yellow!15] (G4p) {G};
     \node[monomer, join, fill=yellow!15] (G3p) {G};
     \node[monomer, join, fill=yellow!15] (G2p) {G};
     \node[monomer, join, fill=yellow!15] (G1p) {G};
     \node[plus] (B) {+};  
     \node[monomer] (M) {M};      
   }
\node[monomer, fill=yellow!15] (G4r) {G};
    { [start branch=second going right]
     \node[monomer, join, fill=yellow!15] (G3r) {G};
     \node[monomer, join, fill=yellow!15] (G2r) {G};
     \node[monomer, join, fill=yellow!15] (G1r) {G};
     \node[fleche] (A) {$\rightarrow$};
     \node[monomer, fill=yellow!10] (G3p) {G};
     \node[monomer, join, fill=yellow!10] (Gp2) {G};
     \node[monomer, join, fill=yellow!10] (G1p) {G};
     \node[plus] (B) {+};  
     \node[monomer] (M) {M};      
   }
\node[monomer, fill=yellow!10] (G3r) {G};
    { [start branch=third going right]
      \node[monomer, join, fill=yellow!10] (G2r) {G};
      \node[monomer, join, fill=yellow!10] (G1r) {G};
      \node[fleche] (A) {$\rightarrow$};
      \node[monomer, fill=yellow!5] (G2p) {G};
      \node[monomer, join, fill=yellow!5] (G1p) {G};
      \node[plus] (B) {+};  
      \node[monomer] (M) {M};     
   }
\node[monomer, fill=yellow!5] (G2r) {G};
   { [start branch=fouth going right]
     \node[monomer, join, fill=yellow!5] (G1r) {G};
     \node[fleche] (A) {$\rightarrow$};
     \node[monomer] (G1pp) {M};
     \node[plus] (B) {+};  
     \node[monomer] (M) {M};      
   }
}
\end{tikzpicture}

\end{document}

PS: ja, ich weiß, dass die Namen der Knoten oft verwendet werden

Bildbeschreibung hier eingeben

Antwort1

Ich glaube nicht, dass das wirklich das ist, was erforderlich ist, aber egal ... ich habe mich für Kürze entschieden. Benötigt PGF v3den node contentsSchlüssel.

\documentclass[tikz, border=5]{standalone}
\begin{document}
\begin{tikzpicture}[x=2.5em, y=2.5em,  
  every slot/.style={fill=yellow!\m!white, draw, very thick, 
    rounded corners, node contents=G, text width=1em, align=center}]
\foreach \i [evaluate={\j=int(\i+1); \k=int(\i*2+1); 
  \l=int(\k+1); \m=\i*5;}] in {12,11,...,2}{
 \draw (1,\i-12) -- (\i,\i-12)  (\i+2,\i-12) -- (2*\i,\i-12);
 \tikzset{%
   slot \j/.style={draw=none, fill=none, node contents=$\rightarrow$},
   slot \k/.style={draw=none, fill=none, node contents=$+$},
   slot \l/.style={node contents=M}
 }
 \foreach \j in {1,...,\l} 
   \node at (\j, \i-12) [every slot/.try, slot \j/.try];
}
\end{tikzpicture}  
\end{document}

Bildbeschreibung hier eingeben

Antwort2

Mit ein paar verschachtelten Schleifen und einigen Bedingungen (mithilfe eines einfachen Stils aus dem forestPaket) kann dies ziemlich einfach erreicht werden.

Möglicherweise gibt es eine kürzere graphsLösung, die im Wesentlichen dasselbe bewirkt.

Code

\documentclass[tikz]{standalone}
\usepackage{forest}
\usetikzlibrary{arrows.meta,chains}
\tikzset{if/.style={/forest/if=#1},
         If/.style n args=3{if={#1}{/utils/exec={#2}}{/utils/exec={#3}}}}
\begin{document}
\begin{tikzpicture}[monomer/.style={
   rectangle, rounded corners, 
   draw=black, very thick, text width=1em, 
   minimum height=1.5em, align=center},
monomer G/.style=monomer, monomer M/.style=monomer,
fleche/.style={text width=1.5em, align=center, on chain},
plus/.style={text width=1em, align=center},
start chain=mch going below, node distance=.3cm and 0.1cm,
monomer G join/.style={
 xshift=.1cm+1em+2*\pgfkeysvalueof{/pgf/inner xsep}+2*\pgfkeysvalueof{/pgf/outer xsep},
 join=by {-Stealth, shorten >=4\pgflinewidth, shorten <=4\pgflinewidth}},
monomer M join/.style={
 xshift=.1cm+1em+2*\pgfkeysvalueof{/pgf/inner xsep}+2*\pgfkeysvalueof{/pgf/outer xsep},
 join=by {draw=none, to path={-- node[midway, plus] {+} (\tikztotarget) }}}]
\foreach \row[evaluate={\col=int(\row-1);
                        \val=int(min(100,(\row-1)*5));
                        \valB=int(min(100,(\row-2)*5));
                       }] in {12, ..., 2}{
  \tikzset{monomer G/.append style={fill=yellow!\val}}
  \node [monomer G, on chain=mch] {G};
  \begin{scope}[start branch/.expanded=br-\row\space going base right]
    \foreach \throwaway in {1,...,\col} \node[monomer G, on chain, join] {G};

    \tikzset{
      If={\col>1}{
        \foreach \throwaway in {1,...,\col}
          \node[monomer G, fill=yellow!\valB, on chain,
            if={\throwaway==1}{monomer G join}{join}] {G};
      }{\node[on chain, monomer M, monomer G join] {M};}}
    \node[on chain, monomer M, monomer M join] {M};
  \end{scope}}
\end{tikzpicture}
\end{document}

Ausgabe

Bildbeschreibung hier eingeben

Antwort3

Während Sie auf einen TikZ-Loop-Experten warten, hier ist einMetapostVersion für Ihre Unterhaltung mit zwei verschachtelten Loops.

Bildbeschreibung hier eingeben

prologues := 3;
outputtemplate := "%j%c.eps";
beginfig(1);
path s; s = superellipse(7 right, 6 up, 7 left,6 down, 0.8);
color yellow, filler; yellow = .4[red+green,white];
boolean connect; 
pair t;
y = 0;
for n=12 downto 2:
  filler := ((14-n)/11)[yellow,white];
  y := y - 20;
  connect := false;
  for x=1 upto 2n+2:
     t := (18x,y);
     if x=n+1:
       label(btex $\to$ etex, t);
       connect := false;
     elseif x=2n+1:
       label(btex $+$ etex, t);
     elseif (x=2n+2) or ((x=2n)and(n=2)):
       draw s shifted t;
       label("M",t);
     else:
       if connect:
         draw t+11left--t;
       fi
       fill s shifted t withcolor filler;
       draw s shifted t;
       label("G",t);
       connect := true;
     fi
  endfor
endfor
endfig;
end

verwandte Informationen