TikZ:绘制一个矩形然后将其分割

TikZ:绘制一个矩形然后将其分割

我想制作一个矩形,然后将其分割。我的 MWE 如下:

\documentclass[tikz]{standalone}
\usetikzlibrary{shapes.multipart}
\begin{document}
\begin{tikzpicture}[
    my shape/.style={
          rectangle split
        , rectangle split parts=#1
        , draw
        , anchor=center
        }
    ]
\node [my shape=1, rectangle split horizontal] at (0, 0) (R1A1) {};
\node[above of=R1A1]{Test};
\node [my shape=5, rectangle split horizontal] at (0, 0)
    {a \nodepart{two}b \nodepart{three}c \nodepart{four}d \nodepart{five}e};
\end{tikzpicture}    
\end{document}

此代码未按预期运行。任何帮助都将不胜感激。谢谢

答案1

这里有一个选项,您可以将其转换为动画 GIF:

\documentclass{beamer}
\usepackage{tikz}
\usetikzlibrary{calc}

\newlength\CellWd
\setlength\CellWd{1.5cm}

\newcommand\DivRec[3]{%
\node<+->[draw,text width=6\CellWd,minimum height=30pt] (#3) {};
\foreach \a/\texto in {#2}
{\draw<+-> let 
  \p1=(#3.south west),
  \p2=( $ (#3.north east) - (#3.north west) $ ),
  \n1={veclen(\x2,\y2)/#1}
  in (\x1+\a*\n1,0|-#3.north) -- (\x1+\a*\n1,0|-#3.south);
\path let 
  \p1=(#3.south west),
  \p2=( $ (#3.north east) - (#3.north west) $ ),
  \n1={veclen(\x2,\y2)/#1}
  in  node[xshift=-\n1/2] at (\x1+\a*\n1,0|-#3.center) {\texto};
  }
}

\begin{document}

\begin{frame}
\centering
\begin{tikzpicture}
\DivRec{6}{1/m,2/z,3/a,4/d,5/l,6/v}{rect}
\end{tikzpicture}    
\end{frame}

\end{document}

语法是

\DivRec{<number of divisions>}{<part/text>}{<name of node>}

其中<part/text>是一个以逗号分隔的形式列表1/text1,2/text2,...。长度\CellWd与第一个参数一起\DivRec控制矩形每个细分的宽度和总宽度(= <number of divisions>*\CellWd)。

我使用了上面的代码和 ImageMagick

convert -delay 80 -density 300 test.pdf test.gif

生产

在此处输入图片描述

答案2

这是一个替代解决方案。

它使用rectangle split类似于 OP 的代码但避免最初用 绘制分割线rectangle split draw splits=false

一旦绘制了节点,每个分割线都会使用迭代命令添加到path picture节点样式的选项中。

感谢percusse提供该功能的人,此解决方案得以实现\numname 将数字转换为文本以及marmot谁写的\GetCurrentNodeName宏基于Jake 的解决方案是了解当前节点的名称

\documentclass{beamer}
\usepackage{tikz}
\usetikzlibrary{shapes.multipart}

\newcommand\numname[1]{%
  \ifcase#1zero\or one\or two\or 
  three\or four\or five\or six\or 
  seven\or eight\or nine\fi%
}

\makeatletter
\newcommand{\GetCurrentNodeName}{\tikz@fig@name}
\makeatother

\tikzset{
    my shape/.style={
        rectangle split,
        rectangle split horizontal,
        rectangle split part align=base,
        rectangle split parts = #1,
        draw,
        minimum height=1cm,
        text width=1cm,
        align=center,
        anchor=center,
        rectangle split draw splits=false,
        path picture={
            \foreach \i [count=\ni] in {2,...,#1}
                \draw<+-> (\GetCurrentNodeName.\numname{\ni} split north)--
                (\GetCurrentNodeName.\numname{\ni} split south);
        }
    }
}

\begin{document}
\begin{frame}
\centering
\begin{tikzpicture}[
    ]
\node<+->[my shape=5] (mynode) {
    a
    \nodepart{two}
    b
    \nodepart{three}
    c
    \nodepart{four}
    d
    \nodepart{five}
    e
    };
\end{tikzpicture}
\end{frame}
\end{document}

在此处输入图片描述

相关内容