有哪些工具/库可用于显示字符串算法?

有哪些工具/库可用于显示字符串算法?

我想编写一个类似于下面所示的图像的字符串算法,但我不确定哪种工具最适合此目的。

字符串算法图像

我可以使用tabular它们来制作方框或tikz在基于网格的系统上生成节点,但对我来说似乎都不是正确的解决方案(除非tikz有一些软件包可以做到这一点)。通常使用哪些工具在这样的网格上书写文本,并可选择添加箭头、线条和封闭框?

答案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]|确保没有框也没有填充,即使此列中的其他非空节点有一个填充的框。键foreachcount可以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}

在此处输入图片描述

相关内容