我想绘制一幅与此类似的图来表示快速排序的除法部分。
最好的方法是什么?有可用的软件包吗?还是我应该使用 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}