La iteración sobre los nombres de los nodos en \foreach da un error \inaccesible
Me gustaría conectar mis masas cilíndricas con una línea horizontal en negrita como se muestra en la siguiente imagen:

El siguiente código funciona bien para la primera conexión:
\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{shapes,intersections}
\begin{document}
\begin{tikzpicture}
\tikzstyle{mass} = [draw, fill=gray!20, cylinder, shape aspect=1, minimum width=1.5cm, minimum height=1cm, shape border rotate=180];
\foreach \xpos/\name/\tag in {0/J1/J_1, 2/J2/J_2, 4/J3/J_3, 6/J4/\cdots, 8/J5/J_n}
{
\node[mass, name=\name] at (\xpos cm,0cm) {};
\draw[shift=(\name.center)] node[] {$\tag$};
}
\path[name path=line1] (J2.before top) -- (J2.after top);
\path[name path=line2] (J2.top) -- (J2.bottom);
\draw[name intersections={of=line1 and line2}, thick] (J1.east) -- (intersection-1);
\end{tikzpicture}
Por las razones obvias, me gustaría hacer las conexiones usando un \foreach
bucle. Intenté lo siguiente:
\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{shapes,intersections}
\begin{document}
\begin{tikzpicture}
\tikzstyle{mass} = [draw, fill=gray!20, cylinder, shape aspect=1, minimum width=1.5cm, minimum height=1cm, shape border rotate=180];
\foreach \xpos/\name/\tag in {0/J1/J_1, 2/J2/J_2, 4/J3/J_3, 6/J4/\cdots, 8/J5/J_n}
{
\node[mass, name=\name] at (\xpos cm,0cm) {};
\draw[shift=(\name.center)] node[] {$\tag$};
}
\foreach \name1/\name2 in {J1/J2, J2/J3, J3/J4, J4/J5}
{
\path[name path=line1] (\name2.before top) -- (\name2.after top);
\path[name path=line2] (\name2.top) -- (\name2.bottom);
\draw[name intersections={of=line1 and line2}, thick] (\name1.east) -- (intersection-1);
}
\end{tikzpicture}
Desafortunadamente, en el segundo ejemplo, el segundo \foreach
bucle no funciona. LaTeX arroja un \inaccessible
error durante la compilación. Parece que no puedo acceder a los nombres de los nodos en el segundo \foreach
bucle de la forma en que lo hice.
Respuestas
No puede usar números junto con letras en secuencias de control.
Un nombre de secuencia de control puede ser una sola letra o una secuencia de una o más letras.
También lo \name1
es un nombre ilegal en este contexto y en general; en algunas situaciones podría parecer que funciona, pero no cuente con esto.
Usar
\foreach \namea/\nameb in {J1/J2, J2/J3, J3/J4, J4/J5}
{
\path[name path=line1] (\nameb.before top) -- (\nameb.after top);
\path[name path=line2] (\nameb.top) -- (\nameb.bottom);
\draw[name intersections={of=line1 and line2}, thick] (\namea.east) -- (intersection-1);
}
Los números en nombres de rutas o coordenadas son legales, pero por razones completamente diferentes.
Dado que egreg corrigió su código, lo simplifico usando bucles con una sola variable, ya que los otros dos pueden generarse con una sola variable.

\documentclass[border=5mm,tikz]{standalone}
\usetikzlibrary{shapes,intersections}
\begin{document}
\begin{tikzpicture}
\tikzset{mass/.style={draw, fill=gray!20, cylinder, shape aspect=1, minimum width=1.5cm, minimum height=1cm, shape border rotate=180}}
\foreach \tag[count=\xpos from 0] in {J_1,J_2,J_3,\cdots,J_n}
{
\node[mass, name=J\xpos] at (2*\xpos,0) {};
\draw[shift=(J\xpos.center)] node[] {$\tag$};
}
\foreach \n [evaluate=\n as \lastn using int(\n+1)] in {0,1,2,3}
{
\path[name path=line1] (J\lastn.before top) -- (J\lastn.after top);
\path[name path=line2] (J\lastn.top) -- (J\lastn.bottom);
\draw[name intersections={of=line1 and line2}, thick] (J\n.east) -- (intersection-1);
}
\end{tikzpicture}
\end{document}