我有一个宏(见下文示例)用于从包含 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}
或者您可以pic
从tikz
版本 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}