答案1
这本质上是两个问题:
数组。
使用
array
具有列规范的环境,例如{c|c}
。我将其包装在一个新环境中
sarray
,该环境添加了括号(\left[
和),并且左侧和右侧\right]
没有其他内容,因此括号很紧。它接受一个参数,即列规范,即。\arraycolsep
c|c
另一个环境是
Sarray
接受列数,6
变为c|c|c|c|c|c
。可选参数可用于将列从 更改c
为任何列类型(即\begin{Sarray}[r]{5}
。对于环境
sarray
和Sarray
列分隔符的长度局部减半,因为在我看来这样更好。在下面的 MWE 中可以找到一些示例。
线条。我会用 Ti钾 Z(→tikz-pgf) 为了这。
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}