如果我尝试以下代码:
\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{calc, positioning, decorations.pathmorphing}
\begin{document}
\begin{tikzpicture}
\foreach \x/\y in {1/1, 2/2, 3/1, 4/2, 5/1}
\node[fill=black!30, circle] (m\x) {$m_{\y}$} at (1.5*{\x}, 0);
\foreach \x in {1,2,3,4}
\draw[decorate, decoration={coil}] (m\x) -- node[above] {$K$} (m{\x+1});
\end{tikzpicture}
\end{document}
然后出现错误。我该如何解决这个问题?
答案1
宏在节点名称中展开,但不执行算术运算。您可以使用\the\numexpr\x+1\relax
。
我还修正了一些错误。
\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{calc, positioning, decorations.pathmorphing}
\begin{document}
\begin{tikzpicture}
\foreach \x/\y in {1/1, 2/2, 3/1, 4/2, 5/1}
\node[fill=black!30, circle] (m\x) at ({1.5*\x}, 0) {$m_{\y}$};
\foreach \x in {1,2,3,4}
\draw[decorate, decoration={coil}] (m\x) -- node[above] {$K$} (m\the\numexpr\x+1\relax);
\end{tikzpicture}
\end{document}
答案2
执行相同操作的更 TikZ 式方法是使用evaluate
。在此过程中,我演示了编写第一个循环的不同方法。输出与 egreg 的答案相同。
请注意,您需要使用int
,否则\x+1
将为小数,2.0
例如\x=1
。
\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{calc, positioning, decorations.pathmorphing}
\begin{document}
\begin{tikzpicture}
\foreach [evaluate=\x as \y using {int(2-mod(\x,2))}] \x in {1,...,5}
%\x/\y in {1/1, 2/2, 3/1, 4/2, 5/1}
\node[fill=black!30, circle] (m\x) at (1.5*\x, 0) {$m_{\y}$};
\foreach [evaluate=\x as \y using int(\x+1)] \x in {1,...,4}
\draw[decorate, decoration={coil}] (m\x) -- node[above] {$K$} (m\y);
\end{tikzpicture}
\end{document}
答案3
仅剩两个选项:count
第一个循环和remember
第二个循环。
\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{calc, positioning, decorations.pathmorphing}
\begin{document}
\begin{tikzpicture}
\foreach \y [count=\x] in {1, 2, 1, 2, 1}
\node[fill=black!30, circle] (m\x) at (1.5*\x, 0) {$m_{\y}$} ;
\foreach \x [remember=\x as \lastx (initially 1)] in {2,...,5}
\draw[decorate, decoration={coil}] (m\lastx) -- node[above] {$K$} (m\x);
\end{tikzpicture}
\end{document}