Реализация способа отображения структур данных в LaTeX

Реализация способа отображения структур данных в LaTeX

Есть ли способ реализовать структуры данных в LaTeX?

В настоящее время я изучаю два курса, которые требуют отрисовки большого количества куч (мин., макс.) и очередей (FIFO, LIFO) и т. п. после вставки элементов.

Мне бы хотелось, чтобы был способ реализовать что-то, что позволит мне передавать число для добавления структуры, а затем рисовать ее или что-то в этом роде?

В настоящее время у меня есть небольшие программы, написанные на C++, которые принимают входные данные, а затем выдают правильный код Latex (используя довольно ужасный синтаксис), который я затем копирую и вставляю, но это раздражает (хотя гораздо лучше, чем рисовать все вручную).

что у меня сейчас есть:
вход: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:

введите описание изображения здесь

Примечания:

Код:

\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

Я бы посоветовал вам взглянуть наbytefieldpackage. Если вам нужно отобразить много диаграмм и вы с ними не очень хорошо знакомы 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}

и вот результат:

Пример MPEG-4 с байтовым полем

Итак, вот несколько соответствующих примеров с bytefield. Я не знаю, в какой степени вам нужно придерживаться синтаксиса, который вы использовали в своем вопросе, но, возможно, эти примеры проверили ваш аппетит и переход на make стоит усилий.

Связанный контент