Iterasi atas nama node di \ foreach memberikan \ kesalahan tidak dapat diakses

Aug 20 2020

Saya ingin menghubungkan massa silinder saya dengan garis horizontal tebal seperti yang ditunjukkan pada gambar berikut:

Kode berikut berfungsi dengan baik untuk koneksi pertama:

\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}

Untuk alasan yang jelas, saya ingin membuat koneksi menggunakan \foreachloop. Saya mencoba yang berikut ini:

\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}

Sayangnya, pada contoh kedua, \foreachloop kedua tidak berfungsi. LaTeX membuat \inaccessiblekesalahan selama kompilasi. Tampaknya saya tidak dapat mengakses nama node di \foreachloop kedua seperti yang saya lakukan?

Jawaban

4 egreg Aug 20 2020 at 03:46

Anda tidak dapat menggunakan angka bersama dengan huruf dalam urutan kontrol.

Nama urutan kontrol bisa berupa satu nonletter atau urutan satu atau lebih huruf.

Begitu \name1juga nama ilegal dalam konteks ini dan umumnya; dalam beberapa situasi ini tampaknya berhasil, tetapi jangan mengandalkan ini.

Menggunakan

\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); 
    }

Nomor dalam nama jalur atau koordinat sah, tetapi untuk alasan yang sangat berbeda.

4 AndréC Aug 20 2020 at 03:43

Karena egreg mengoreksi kode Anda, saya menyederhanakannya dengan menggunakan loop dengan satu variabel karena dua lainnya dapat dihasilkan oleh satu variabel.

\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}