有没有办法在 LaTeX 中实现数据结构?
我目前正在上两门课,需要在插入元素后绘制大量的堆(min,max)和队列(FIFO,LIFO)等。
我希望有一种方法可以让我实现某些东西,让我传入数字来添加结构,然后绘制它或者其他什么?
目前,我有一些用 C++ 编写的小程序,可以接收输入,然后输出正确的乳胶代码(使用一些相当糟糕的语法),然后我复制并粘贴这些代码,但这很烦人(尽管比手动绘制所有内容要好得多)。
我现在拥有的:
输入:4 ci5 ci6 ci7 cp cr cp
输出:
\[\begin{array}{|c|c|c|c|}
\hline
5 &6 &7 & \\
\hline
\end{array}\]
\[\begin{array}{|c|c|c|c|}
\hline
6 &7 & & \\
\hline
\end{array}\]
有没有办法仅使用 LaTeX 来做到这一点?
答案1
这是一份工作tikz
:
笔记:
- 此代码改编自更复杂的用法:使用 TikZ 绘制 DNA 序列的显示问题
代码:
\documentclass{article}
\usepackage{tikz}
\usepackage{xstring}
\usetikzlibrary{calc}
\newcommand*{\NodeSize}{0.5cm}%
\tikzset{My Style/.style={minimum size=0.5cm, draw=gray, line width=1pt}}{}
\newcommand*{\DrawNodes}[2][fill=none]{%
% https://tex.stackexchange.com/questions/12091/tikz-foreach-loop-with-macro-defined-list
\def\Sequence{#2}
\foreach [count=\xi] \Label in \Sequence {%
\pgfmathsetmacro{\XShift}{\NodeSize*\xi}
\node [My Style, xshift=\XShift, #1] (\Label) {\Label};
}
}
\begin{document}
\begin{tikzpicture}
\DrawNodes[fill=red!20]{5,6,7,}
\DrawNodes[yshift=-1.0cm, fill=gray!15]{6,7,,,}
\end{tikzpicture}
\end{document}
答案2
我的建议是看看bytefield
包。如果您有许多图表需要表示,但又不太熟悉TikZ
,那么这可能是可行的方法。
为了演示这一点,下面是包文档中的几个简短示例:
\begin{bytefield}{32}
\bitheader{0-31} \\
\bitbox{4}{Four} & \bitbox{8}{Eight} &
\bitbox{16}{Sixteen} & \bitbox{4}{Four}
\end{bytefield}
将产生:
当然,您可以省略\bitheader{0-31}
,这样 bis 就不会被编号。此外,如果您想要一个跨越“列”(或单词)整个宽度的框,您可以使用宏\wordbox
,如下所示:
\begin{bytefield}{16}
\wordbox{1}{A 16-bit field} \\
\bitbox{8}{8 bits} & \bitbox{8}{8 more bits} \\
\wordbox{2}{A 32-bit field. Note that text wraps within the box.}
\end{bytefield}
结果是:
或者,您甚至可以用一种方便的方式来表示长数据块:
\begin{bytefield}{16}
\wordbox{1}{Some data} \\
\wordbox[lrt]{1}{Lots of data} \\
\skippedwords \\
\wordbox[lrb]{1}{} \\
\wordbox{2}{More data}
\end{bytefield}
编译后如下所示:
对于更复杂的结构,您只需使用这些构建块,如以下示例所示(只是为了好玩,我将示例包装bytefield
到figure
环境中并添加了标题):
\documentclass[a4paper]{article}
\usepackage{bytefield}
\begin{document}
RTP packetization of an MPEG-4 Visual bitstream according to the Internet Engineering Task Force's Request for Comments (RFC) number 3016:
\begin{figure}[hb!]
\centering
\begin{bytefield}[bitwidth=1.1em]{32}
\bitheader{0-31} \\
\begin{rightwordgroup}{RTP \\ Header}
\bitbox{2}{V=2} & \bitbox{1}{P} & \bitbox{1}{X}
& \bitbox{4}{CC} & \bitbox{1}{M} & \bitbox{7}{PT}
& \bitbox{16}{sequence number} \\
\bitbox{32}{timestamp}
\end{rightwordgroup} \\
\bitbox{32}{synchronization source (SSRC) identifier} \\
\wordbox[tlr]{1}{contributing source (CSRC) identifiers} \\
\wordbox[blr]{1}{$\cdots$} \\
\begin{rightwordgroup}{RTP \\ Payload}
\wordbox[tlr]{3}{MPEG-4 Visual stream (byte aligned)} \\
\bitbox[blr]{16}{}
& \bitbox{16}{\dots\emph{optional} RTP padding}
\end{rightwordgroup}
\end{bytefield}
\caption{MPEG-4 RTP package}
\end{figure}
\end{document}
其结果如下:
因此,这些是一些相关示例bytefield
。我不知道您需要在多大程度上坚持您在问题中使用的语法,但也许这些例子已经满足了您的胃口,并且值得付出努力。