在 LaTeX 中绘制循环不变量的最佳方法是什么?

在 LaTeX 中绘制循环不变量的最佳方法是什么?

我想绘制一幅与此类似的图来表示快速排序的除法部分。

快速排序循环不变式

最好的方法是什么?有可用的软件包吗?还是我应该使用 Tikz 来做?如果是 Tikz,你能给我一些关于绘制类似上面图片的参考吗?

答案1

这是使用 TikZ 实现的一种方法(我错误地假设箭头应该指向框之间的分隔符?):

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{matrix}

\begin{document}

\begin{tikzpicture}
\matrix[matrix of nodes,
  name=matrix,
  draw, % Outer border
  inner sep=0pt,
  minimum width=2cm, % Width of boxes
  text depth=.5ex, % To ensure that lower edges line up correctly
  minimum height=.75cm, % Height of boxes
]{
  $<$ pivot & $\ge$ pivot & ?\\ % The nodes
};

% Separators
\draw (matrix-1-2.south west) -- (matrix-1-2.north west); 
\draw (matrix-1-3.south west) -- (matrix-1-3.north west);

% Define a style for all arrows, then draw the arrows with nodes
% This can be used to change the thickness or the tips for all arrows at once
\tikzstyle{arrowstyle}=[latex-]
\draw [arrowstyle] (matrix-1-1.south west) -- +(-90:0.8) node [anchor=north] {left};
\draw [arrowstyle] (matrix-1-2.south west) -- +(-90:0.8) node [anchor=north] {pivotLocation};
\draw [arrowstyle] (matrix-1-3.south west) -- +(-90:0.8) node [anchor=north] {i};
\draw [arrowstyle] (matrix-1-3.south east) -- +(-90:0.8) node [anchor=north] {right};-
\end{tikzpicture}

\end{document}

答案2

只用一些 TeX 就可以得到类似的结果:

\documentclass{article}
\begin{document}
\vbox{
  \offinterlineskip\sf
  \def\mapup{$\Big\uparrow$}
  \halign{&\vrule\vphantom{$\bigg($}\hbox to 1.5in{\hfil#\hfil}\vrule\cr
    \noalign{\hrule}
    $<$pivot&$>=$pivot&?\cr
    \noalign{\hrule}
    \omit\mapup&\omit\llap{\mapup}&\omit\mapup&\omit\llap{\mapup}\cr
    \omit\strut Left&\omit\hidewidth\llap{pivotLocation\qquad}\hidewidth&\omit $i$&\omit\llap{Right}\cr
  }
}
\end{document}

答案3

运行xelatex或者使用latex->dvips->ps2pdf

在此处输入图片描述

\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage{pst-node,tabularx,ragged2e}
\SpecialCoor
\renewcommand\tabularxcolumn[1]{>{\Centering}m{#1}}
\begin{document}

\sffamily\def\arraystretch{2}
\begin{tabularx}{\textwidth}{|X|X|X|}\hline
\rnode[lb]{l1}{}\hfill <pivot \hfill\rnode[rb]{r1}{}   & >=pivot &
\rnode[lb]{l3}{}\hfill ? \hfill\rnode[rb]{r3}{}\\\hline
\end{tabularx}
\psset{arrowscale=2,arrows=<-,offsetA=-10pt,offsetB=-15mm}
\ncline{l1}{l1}\ncline{r1}{r1}\ncline{l3}{l3}\ncline{r3}{r3}
\uput{16mm}[-90](l1){Left}
\uput{16mm}[-90](r1){pivot Location}
\uput{16mm}[-90](l3){i}
\uput{16mm}[-90](r3){Right}

\end{document}

答案4

以下是 Jake 解决方案的细微变化,涉及线条。您无需单独绘制分隔符 (!),而是可以通过绘制节点的形状直接绘制它们。唯一的问题是,如果不进行一些调整,它们将无法完美地啮合,但这可以通过将列 sep 设置为 来实现\pgflinewidth

其代码如下:

\documentclass{article}

\usepackage{tikz}
\usetikzlibrary{matrix}

\begin{document}
\begin{tikzpicture}

\matrix[matrix of nodes,column sep=-\pgflinewidth, name=matrix,every node/.style={draw},
        minimum height=0.75cm,minimum width=2cm,text depth=0.5ex]{
1&2&3\\
};

\end{tikzpicture}
\end{document}

相关内容