¿Usando bucles con cadenas?

¿Usando bucles con cadenas?

¿Existe una manera más inteligente de lograr el mismo resultado que el del siguiente MWE?

1) usando algún tipo de bucle en lugar de escribir manualmente cada nodo,

2) dibujando las flechas con tikz en lugar de usar el modo matemático LaTeX

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

PD: sí, sé que los nombres de los nodos se usan muchas veces

ingrese la descripción de la imagen aquí

Respuesta1

No creo que esto sea exactamente lo que se requiere, pero de todos modos... opté por la brevedad por encima de cualquier otra cosa. Necesidades PGF v3de la node contentsllave.

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

ingrese la descripción de la imagen aquí

Respuesta2

Con algunos bucles anidados y algunas condiciones (con la ayuda de un estilo simple del forestpaquete), esto se puede hacer con bastante facilidad.

Puede que haya una graphssolución más corta que haga básicamente lo mismo.

Código

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

Producción

ingrese la descripción de la imagen aquí

Respuesta3

Mientras esperas a un experto en bucles TikZ, aquí tienes unMetapostVersión para tu entretenimiento que cuenta con dos bucles anidados.

ingrese la descripción de la imagen aquí

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

información relacionada