Modifiqué una solución dada porcfren esta publicaciónDiagrama de ruta usando Tikz.
Mi código se ve así:
\documentclass[tikz]{standalone}
\usetikzlibrary{arrows.meta,calc,positioning}
\begin{document}
\begin{tikzpicture}
[
rect/.style={draw, text centered},
>={Stealth[]}
]
\node (input) {Input};
\node [rect, right=of input] (gen) {Generator};
\node [above right=of gen] (C1) {$Candidate_1$};
\node [below right=of gen] (Cn) {$Candidate_n$};
\node [rect, below right=of C1] (eval) {Evaluator};
\node [right=of eval] (output) {Optimal Output};
\foreach \i [count=\ino] in {Candidate_2,Candidate\ldots}
{
\node at ($(C1)!\ino/3!(Cn)$) (\i) {$\i$};
\draw [->] (gen) -- (\i);
\draw [->] (\i) -- (eval);
}
\foreach \i/\j in {input/gen,gen/C1,gen/Cn,C1/eval,Cn/eval,eval/output} \draw [->] (\i) -- (\j);
\end{tikzpicture}
\end{document}
El problema está en esta línea.
\foreach \i [count=\ino] in {Candidate_2,Candidate\ldots}
que hacen que la compilación falle con error:
! Missing \endcsname inserted.
<to be read again>
\protect
l.20 }
ya que no puedo encontrar una solución para tener puntos en ese entorno.
Básicamente quiero mostrar que se puede tener un número de "Candidatos" desde 1, 2, ..., hasta n. ¿Pero cómo puedo tener "Candidato..." ahí?
Respuesta1
No puedes usar tokens no expandibles para nombrar una coordenada; puedes utilizar el contador \ino
(adecuadamente adornado para evitar confusiones con otras coordenadas).
También arreglé el formato con \mathrm
.
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{arrows.meta,calc,positioning}
\begin{document}
\begin{tikzpicture}[
rect/.style={draw, text centered},
>={Stealth[]},
]
\node (input) {Input};
\node [rect, right=of input] (gen) {Generator};
\node [above right=of gen] (C1) {$\mathrm{Candidate}_1$};
\node [below right=of gen] (Cn) {$\mathrm{Candidate}_n$};
\node [rect, below right=of C1] (eval) {Evaluator};
\node [right=of eval] (output) {Optimal Output};
\foreach \i [count=\ino] in {\mathrm{Candidate}_2,\mathrm{Candidate}\ldots}
{
\node at ($(C1)!\ino/3!(Cn)$) (c\ino) {$\i$};
\draw [->] (gen) -- (c\ino);
\draw [->] (c\ino) -- (eval);
}
\foreach \i/\j in {input/gen,gen/C1,gen/Cn,C1/eval,Cn/eval,eval/output} \draw [->] (\i) -- (\j);
\end{tikzpicture}
\end{document}
Respuesta2
Te sugiero una solución alternativa con un archivo tikz matrix
.
Lo he usado \vdots
en lugar de Canditate...
porque me parece más limpio.
\documentclass[tikz]{standalone}
\usetikzlibrary{arrows.meta,calc,positioning, matrix}
\begin{document}
\begin{tikzpicture}
[
rect/.style={draw, text centered},
>={Stealth[]}
]
\matrix[%
matrix of nodes,
nodes={inner sep=4pt},
inner sep=0pt,
column sep=30pt,
row sep= 10pt,
] (C) {%
& & $\mathrm{Candidate}_{1}$ \\
& & $\mathrm{Candidate}_{2}$ \\[-15pt]
Input & |[rect]| Generator & & |[rect]| Evaluator & Optimal Output \\[-15pt]
& & $\vdots$ \\
& & $\mathrm{Candidate}_{n}$ \\
};
\foreach \i in {1,2,5}
{%
\draw [->] (C-3-2) -- (C-\i-3);
\draw [->] (C-\i-3) -- (C-3-4);
}
\draw [->] (C-3-1) -- (C-3-2);
\draw [->] (C-3-4) -- (C-3-5);
\end{tikzpicture}
\end{document}
PD = Si absolutamente lo deseas \mathrm{Candidate}\ldots
, simplemente sustitúyelo \vdots
y agrégalo 4,
a \foreach
: \foreach \i in {1,2,4,5}
.