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
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 v3
den node contents
Schlü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}
Antwort2
Mit ein paar verschachtelten Schleifen und einigen Bedingungen (mithilfe eines einfachen Stils aus dem forest
Paket) kann dies ziemlich einfach erreicht werden.
Möglicherweise gibt es eine kürzere graphs
Lö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
Antwort3
Während Sie auf einen TikZ-Loop-Experten warten, hier ist einMetapostVersion für Ihre Unterhaltung mit zwei verschachtelten Loops.
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