答案1
这只是说编写一个 Ti 程序相当容易钾Z 矩阵产生类似这样的结果。然后您需要做的就是输入行。
\documentclass[tikz,border=3mm]{standalone}
\usetikzlibrary{matrix}
\begin{document}
\begin{tikzpicture}
\matrix[matrix of nodes,column sep=-\pgflinewidth/2,row sep=-\pgflinewidth/2,
cells={nodes={minimum width=1em,text height=1.5ex,
/utils/exec=\ifnum\the\pgfmatrixcurrentcolumn<6
\tikzset{draw}
\ifnum\the\pgfmatrixcurrentcolumn>2
\tikzset{fill=gray!30}
\fi\fi}}] (mat) {
a & b & a & b & a & c & a & & & & &\\
& & a & b & a & b & a & c & a & & & \\
& & & & a & b & a & b & a & c & a & \\
& & & & & a & b & a & b & a & c & a \\
};
\end{tikzpicture}
\end{document}
您会看到它的工作原理:单元格的位置分别由 TeX 计数\pgfmatrixcurrentcolumn
和给出\pgfmatrixcurrentrow
。/utils/exec
您可以使用这些计数定义指令并执行某些操作。在这里,它们用于在最左边的 5 个单元格(即\the\pgfmatrixcurrentcolumn<6
)周围绘制框并填充最后三个单元格(即\ifnum\the\pgfmatrixcurrentcolumn>2
)。
当然,我们不必止步于此。下面是其中稍微更花哨的版本,如果存在相应的节点,则绘制垂直连接。这是使用键完成的execute at end matrix
,该键尚未进入pgfmanual
(但我怀疑将来会在那里提到它)。它还显示了如何推翻指令,如 epsilon 条目中所示,它|[draw=none,fill=none]|
确保没有框也没有填充,即使此列中的其他非空节点有一个填充的框。键foreach
和count
可以remember
在本网站的许多帖子中找到,并且在 pgf 手册中有很好的记录。
\documentclass[tikz,border=3mm]{standalone}
\usetikzlibrary{matrix}
\makeatletter% https://tex.stackexchange.com/a/85531
\long\def\ifnodedefined#1#2#3{%
\@ifundefined{pgf@sh@ns@#1}{#3}{#2}%
}
\makeatother
\begin{document}
\begin{tikzpicture}
\matrix[matrix of math nodes,column sep=-\pgflinewidth/2,row sep=1.5ex,
cells={nodes={minimum width=1em,text height=1.5ex,
/utils/exec=\ifnum\the\pgfmatrixcurrentcolumn<6
\tikzset{draw}
\ifnum\the\pgfmatrixcurrentcolumn>2
\tikzset{fill=gray!30}
\fi\fi}},execute at end matrix={
\foreach \XX in {3,...,5}
{\foreach \YY in {1,...,\the\numexpr\the\pgfmatrixcurrentrow-2}
{\ifnodedefined{mat-\YY-\XX}{\ifnodedefined{mat-\the\numexpr\YY+1\relax-\XX}{%
\draw[densely dotted] (mat-\YY-\XX) -- (mat-\the\numexpr\YY+1\relax-\XX);
}{}}{}} }
}] (mat) {
a & b & a & b & a & c & a & & & & &\\
& & a & b & a & b & a & c & a & & & \\
& & & & a & b & a & b & a & c & a & \\
& & & & |[draw=none,fill=none]| \varepsilon & a & b & a & b & a & c & a \\
};
\path foreach \X [count=\Y,remember=\X as \LastX] in {5,3,1,0} {
(mat.west|-mat-\Y-6) node[left]{$P_\Y$}
\ifnum\Y>1
(mat.east|-mat-\Y-6) node[right]{$\pi[\LastX]=\X$}
\fi};
\end{tikzpicture}
\end{document}