L'itération sur les noms de nœuds dans \foreach donne une erreur \inaccessible
Je voudrais connecter mes masses cylindriques avec une ligne horizontale en gras comme illustré dans l'image suivante :

Le code suivant fonctionne bien pour la première connexion :
\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}
Pour des raisons évidentes, je voudrais faire les connexions à l'aide d'une \foreach
boucle. J'ai essayé ce qui suit :
\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}
Malheureusement, dans le deuxième exemple, la deuxième \foreach
boucle ne fonctionne pas. LaTeX génère une \inaccessible
erreur lors de la compilation. Il semble que je ne puisse pas accéder aux noms de nœuds dans la deuxième \foreach
boucle comme je l'ai fait ?
Réponses
Vous ne pouvez pas utiliser de chiffres avec des lettres dans des séquences de contrôle.
Un nom de séquence de contrôle peut être soit une seule non-lettre, soit une séquence d'une ou plusieurs lettres.
Est donc \name1
un nom illégal dans ce contexte et en général ; dans certaines situations, cela peut sembler fonctionner, mais ne comptez pas là-dessus.
Utilisation
\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);
}
Les nombres dans les noms de chemin ou de coordonnées sont légaux, mais pour des raisons complètement différentes.
Depuis qu'egreg a corrigé votre code, je le simplifie en utilisant des boucles avec une seule variable puisque les deux autres peuvent être générées par une seule 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}