数组和线如何绘制?

数组和线如何绘制?

我想知道如何绘制下图右侧的线条,以及如何写入图片左侧的数组。

树

答案1

这本质上是两个问题:

  1. 数组。

    使用array具有列规范的环境,例如{c|c}

    我将其包装在一个新环境中sarray,该环境添加了括号(\left[和),并且左侧和右侧\right]没有其他内容,因此括号很紧。它接受一个参数,即列规范,即。\arraycolsepc|c

    另一个环境是Sarray接受列数,6变为c|c|c|c|c|c。可选参数可用于将列从 更改c为任何列类型(即\begin{Sarray}[r]{5}

    对于环境sarraySarray列分隔符的长度局部减半,因为在我看来这样更好。

    在下面的 MWE 中可以找到一些示例。

  2. 线条。我会用 Ti Z(→) 为了这。

    half-我为路径运算符提供了附加样式to。此样式经过了一点优化,因为它会自动用于.south起点和.north目标,只要起点和目标名称中没有.(带锚点的节点)或(坐标)。,

代码

\documentclass[tikz]{standalone}% loads tikz automatically, 
                                % in any normal class you'll need \usepackage{tikz}
\usetikzlibrary{
    positioning,                % for left below=of
    shapes.arrows               % for the arrow
}
\newenvironment{sarray}[1]{     % #1 = column specifications, e.g. c|c|c
    \begingroup
    \setlength{\arraycolsep}{.5\arraycolsep}
    \left[
    \begin{array}{@{}#1@{}}
}{
    \end{array}
    \right]
    \endgroup
}
\newenvironment{Sarray}[2][c]{  % #1 = (optional, default = c) column specification
                                % #2 = number of columns
    \begin{sarray}{#1*{\numexpr#2-1\relax}{|#1}}
}{
    \end{sarray}
}
\makeatletter
\def\qrr@pgfutil@add@anchor#1#2{% ... if node without anchor
    \qrr@pgfutil@in@,{#1}% -> coordinate
    \ifpgfutil@in@\else
        \qrr@pgfutil@in@.{#1}% -> already node with anchor
        \ifpgfutil@in@\else
            \edef#1{#1#2}\fi\fi}
\def\qrr@pgfutil@in@#1#2{% to save \expandafters for #2
    \expandafter\pgfutil@in@\expandafter#1\expandafter{#2}}

\tikzset{
  half-/.style={% this style automatically uses .south (for the start)
                %                           and .north (for the target node)
                % if no anchor is specified
    to path={
      \pgfextra
        \qrr@pgfutil@add@anchor{\tikztostart}{.south}%
        \qrr@pgfutil@add@anchor{\tikztotarget}{.north}%
        \tikz@scan@one@point\pgfutil@firstofone(\tikztostart)\relax
        \pgf@xa\pgf@x\[email protected]\pgf@y
        \tikz@scan@one@point\pgfutil@firstofone(\tikztotarget)\relax
        \advance\[email protected]\pgf@y
      \endpgfextra
      (\tikztostart) -- (\pgf@xa, \pgf@ya) -| (\tikztotarget) \tikztonodes
    }
  }
}
\makeatother
\begin{document}
\begin{tikzpicture}
\node (nSA1) {$\begin{sarray}{c|c}
                   0, 1, 2, 4, 5, 6, 7 & 3 \\
                   0, 1, 2, 4, 5, 6, 7 & 3
               \end{sarray}$};

\node[
    below left=1cm and -1cm of nSA1
  ] (nSA2) {$\begin{Sarray}{4}% or \begin{sarray}{c|c|c|c}
                  0, 1, 2, 6 & 5, 7 & 4 & 3 \\
                  0, 1, 2, 6 & 5, 7 & 4 & 3
              \end{Sarray}$};

\node[
    below left=of nSA2
  ] (nSA3) {$\begin{Sarray}{6}% or \begin{sarray}{c*5{|c}}
                 0, 1, 2 & 6 & 7 & 5 & 4 & 3 \\
                 0, 1, 2 & 6 & 7 & 5 & 4 & 3
             \end{Sarray}$};

\node[% this is the arrow
    left=.5cm of nSA2,
    draw,
    single arrow,
    minimum height=1cm
  ] {};

\draw[very thick] (nSA1) to[half-] node[pos=.75,left] {$4 \to 4$} (nSA2)
                  (nSA2) to[half-] node[pos=.75,left] {$5 \to 5$} (nSA3);

\draw (-4,0) to[half-] +(-1,-1);% works with normal coordinates, too.
\end{tikzpicture}
\end{document}

输出

在此处输入图片描述

相关内容