如何相对定位节点组

如何相对定位节点组

我有一个宏(见下文示例)用于从包含 9 个项目的列表中创建一个 3x3 网格,但如果我尝试绘制其中两个,它们会相互重叠。我发现每个路径都是不同的,并从 0,0 重新开始... 寻求有关“打包”它们的最简洁方法的建议,以便我可以将它们并排绘制,而无需考虑它们的确切大小。

最终,我想将它们放入树布局算法中,以显示用于解决 3x3 滑动拼图的搜索树(以此为借口来弄清楚如何使用 tikz)。我猜我需要能够将结构打包成一个单元,以便 tikz 可以将它们视为要布局的节点。我的想法正确吗?

\documentclass{article} 
\usepackage{tikz}

\usetikzlibrary[calc]
\usepackage[active,tightpage]{preview}
\PreviewEnvironment{tikzpicture}

\newcommand{\ninepuzzle}[1] {
    \foreach [count=\i] \val in {#1} { 
        \draw  let \n{row}={int(mod(\i -1, 3))}, \n{col}={ int( ( \i - 1 ) / (-3) ) } in 
            (\n{row}, \n{col}) rectangle  +(1,1) 
            +(0.5, 0.5) node{\val};
    }
}


\begin{document}

\begin{tikzpicture}[scale=1]
    \ninepuzzle{1,2, ,3,4,5,6,7,8}
    \ninepuzzle{8,5,6,3,2,4, ,1,7}
\end{tikzpicture}


\end{document}

答案1

在他的回答中,哈里什已经展示了如何移动拼图。在这个答案中,我想展示如何使用forest包来构建树(请注意,不需要移动,尽管可以使用 提供的功能轻松完成forest):

\documentclass{standalone} 
\usepackage{forest}
\usetikzlibrary[calc]

\newcommand{\ninepuzzle}[1]{%
\begin{tikzpicture}
    \foreach [count=\i] \val in {#1} { 
        \draw  let \n{row}={int(mod(\i -1, 3))}, \n{col}={ int( ( \i - 1 ) / (-3) ) } in 
            (\n{row}, \n{col}) rectangle  +(1,1) 
            +(0.5, 0.5) node{\val};
    }
\end{tikzpicture}%    
}

\newsavebox\myboxa
\newsavebox\myboxb
\newsavebox\myboxc
\newsavebox\myboxd
\newsavebox\myboxe
\savebox\myboxa{\ninepuzzle{1,2, ,3,4,5,6,7,8}}
\savebox\myboxb{\ninepuzzle{8,5,6,3,2,4, ,1,7}}
\savebox\myboxc{\ninepuzzle{2,4,6,8,,1,3,5,7}}
\savebox\myboxd{\ninepuzzle{,1,2,4,5,3,6,8,7}}
\savebox\myboxe{\ninepuzzle{8,7,3,,4,6,5,1,2}}

\begin{document}

\begin{forest}
for tree={
  parent anchor=south,
  child anchor=north,
}
[\usebox\myboxa
  [\usebox\myboxb
    [\usebox\myboxd
    ]
    [\usebox\myboxe
    ]
  ]
  [\usebox\myboxc
  ]
]
\end{forest}

\end{document}

在此处输入图片描述

只剩下一件事需要简化,那就是需要预先将每个谜题装箱。在是否可以直接在森林中使用 \node 路径?(我受这种情况启发而提出的一个问题)我希望找到一种不必进行拳击的方法。

答案2

你可以使用scope一些xshift

\documentclass{article}
\usepackage{tikz}

\usetikzlibrary[calc]
\usepackage[active,tightpage]{preview}
\PreviewEnvironment{tikzpicture}

\newcommand{\ninepuzzle}[1] {
    \foreach [count=\i] \val in {#1} {
        \draw  let \n{row}={int(mod(\i -1, 3))}, \n{col}={ int( ( \i - 1 ) / (-3) ) } in
            (\n{row}, \n{col}) rectangle  +(1,1)
            +(0.5, 0.5) node{\val};
    }
}


\begin{document}

\begin{tikzpicture}[scale=1]
    \ninepuzzle{1,2, ,3,4,5,6,7,8}
    \begin{scope}[xshift=4cm]
    \ninepuzzle{8,5,6,3,2,4, ,1,7}
    \end{scope}
\end{tikzpicture}


\end{document}

或者您可以pictikz版本 3 开始使用。

\documentclass{article}
\usepackage{tikz}

\usetikzlibrary[calc,positioning]
\usepackage[active,tightpage]{preview}
\PreviewEnvironment{tikzpicture}

\tikzset{
ninepuzzle/.pic={
    \foreach [count=\i] \val in {#1} {
        \draw  let \n{row}={int(mod(\i -1, 3))}, \n{col}={ int( ( \i - 1 ) / (-3) ) } in
            (\n{row}, \n{col}) rectangle  +(1,1)
            +(0.5, 0.5) node{\val};
    }
    \coordinate (-mypoint) at (3,0); %% change (3,0) acc to  \n{row}={int(mod(\i -1, 3))} as 3 
}
}


\begin{document}

\begin{tikzpicture}[scale=1]
    \pic (a) {ninepuzzle={1,2, ,3,4,5,6,7,8}};
    \pic [right = of a-mypoint] {ninepuzzle={8,5,6,3,2,4, ,1,7}};
\end{tikzpicture}


\end{document}

在此处输入图片描述

相关内容