La iteración sobre los nombres de los nodos en \foreach da un error \inaccesible

Aug 20 2020

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 \foreachbucle. 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 \foreachbucle no funciona. LaTeX arroja un \inaccessibleerror durante la compilación. Parece que no puedo acceder a los nombres de los nodos en el segundo \foreachbucle de la forma en que lo hice.

Respuestas

4 egreg Aug 20 2020 at 03:46

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 \name1es 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.

4 AndréC Aug 20 2020 at 03:43

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}