我正在尝试使用 TikZ 绘制 Ising 模型(在我的情况下,是同一行或列上相邻节点之间具有无向边的节点网格)。我使用 foreach 循环很好地完成了节点网格,但在绘制节点之间的线条时遇到了麻烦。问题在于,当我尝试在\draw
计算的节点名称之间划线时,出现了语法错误。
以下是我目前所掌握的信息:
以下是我使用的代码:
\documentclass{minimal}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\scriptsize
\foreach \i in {1,...,25}
{
\pgfmathtruncatemacro{\y}{(\i - 1) / 5};
\pgfmathtruncatemacro{\x}{\i - 5 * \y};
\pgfmathtruncatemacro{\label}{\x + 5 * (4 - \y)};
\node[circle,draw=black,fill=white!80!black,minimum size=20]
(\label) at (1.5*\x,1.5*\y) {\label};
}
% These draw commands are working as intended.
\draw (1) -- (2);
\draw (1) -- (6);
\draw (6) -- (7);
\draw (7) -- (2);
% The loop, however, is not =(
%\foreach \x in {1,...,4}
%\foreach \y in {0,...,4}
%{
% \pgfmathtruncatemacro{\cur}{\x + 5 * \y};
% \pgfmathtruncatemacro{\next}{\cur + 1};
% \draw (\cur) -- (\next);
%}
\end{tikzpicture}
\end{document}
非常感谢您的帮助!
答案1
可以使用最小代码
\documentclass{minimal}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}[darkstyle/.style={circle,draw,fill=gray!40,minimum size=20}]
\foreach \x in {0,...,4}
\foreach \y in {0,...,4}
{\pgfmathtruncatemacro{\label}{\x - 5 * \y +21}
\node [darkstyle] (\x\y) at (1.5*\x,1.5*\y) {\label};}
\foreach \x in {0,...,4}
\foreach \y [count=\yi] in {0,...,3}
\draw (\x\y)--(\x\yi) (\y\x)--(\yi\x) ;
\end{tikzpicture}
\end{document}
仅供参考,您可以通过 tkz-berge 获取网格
\documentclass[border=0.25cm]{standalone}
\usepackage{tkz-berge}
\begin{document}
\begin{tikzpicture}
\GraphInit[vstyle=Shade]
\grGrid[Math,RA=2,RB=2]{5}{5}
\end{tikzpicture}
\end{document}
答案2
使用你的循环:
\foreach \x in {1,...,4}
\foreach \y in {0,...,4}
{
\pgfmathtruncatemacro{\cur}{\x + 5* \y}
\pgfmathtruncatemacro{\next}{\cur + 1}
\draw (\cur) -- (\next);
}
你实际上只是画了水平线。因此,如果我正确理解了这个问题,你需要画垂直线。
为了简单起见,我使用了另一个循环:
% Vertical connections
\foreach \start in {1,...,20}
{
\pgfmathtruncatemacro{\down}{\start+5}
\draw (\start) -- (\down);
}
完整代码如下:
\documentclass{minimal}
\usepackage{tikz}
\usetikzlibrary{positioning}
\tikzset{darkstyle/.style={circle,draw,fill=gray!40}}
\begin{document}
\begin{tikzpicture}
\foreach \i in {1,...,25}
{
\pgfmathtruncatemacro{\y}{(\i - 1) / 5}
\pgfmathtruncatemacro{\x}{\i - 5 * \y}
\pgfmathtruncatemacro{\label}{\x + 5 * (4 - \y)}
\node[darkstyle,minimum size=20] (\label) at (1.5*\x,1.5*\y)
{\label};
}
% Horizontal connections
\foreach \x in {1,...,4}
\foreach \y in {0,...,4}
{
\pgfmathtruncatemacro{\cur}{\x + 5* \y}
\pgfmathtruncatemacro{\next}{\cur + 1}
\draw (\cur) -- (\next);
}
% Vertical connections
\foreach \start in {1,...,20}
{
\pgfmathtruncatemacro{\down}{\start+5}
\draw (\start) -- (\down);
}
\end{tikzpicture}
\end{document}
结果是:
答案3
由于这看起来像一个grid
,您也可以使用一个(可能还有两个嵌套foreach
循环来生成节点):
\documentclass{standalone}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\draw[step=1.5,thick] (0,-6) grid (6,0);
\foreach \x in {0,...,4}
{ \foreach \y in {0,...,4}
{ \pgfmathtruncatemacro{\nodelabel}{\x+\y*5+1}
\node[circle,draw=black,fill=white!80!black,minimum size=20] (\nodelabel) at (1.5*\x,-1.5*\y) {\nodelabel};
}
}
\end{tikzpicture}
\end{document}
答案4
你可以让 TikZ 使用graphs
库/\graph
语法和子图Grid_n
来自graphs.standard
图书馆。
如果你想要改变特定的边缘而不必手动绘制所有边缘,你可以使用simple
钥匙并手动为各个边指定选项(甚至可以使用 将其删除-!-
)。
代码
\documentclass[tikz]{standalone}
\usetikzlibrary{graphs.standard}
\begin{document}
\tikz[x=+1.5cm, y=+1.5cm]
\graph[
grid placement,
nodes={circle, draw=black, fill=white!80!black, minimum size=+20pt}
]{ subgraph Grid_n [n = 25] };
\end{document}