Implementierung einer Möglichkeit zur Anzeige von Datenstrukturen in LaTeX

Implementierung einer Möglichkeit zur Anzeige von Datenstrukturen in LaTeX

Gibt es eine Möglichkeit, Datenstrukturen in LaTeX zu implementieren?

Ich besuche derzeit zwei Kurse, bei denen nach dem Einfügen von Elementen eine große Anzahl von Heaps (min, max) und Warteschlangen (FIFO, LIFO) usw. gezeichnet werden müssen.

Ich hätte gern eine Möglichkeit, etwas zu implementieren, bei dem ich nur die Nummer eingeben muss, die der Struktur hinzugefügt werden soll, und es dann zeichnen kann oder so etwas?

Derzeit habe ich kleine Programme in C++ geschrieben, die die Eingaben entgegennehmen und dann den richtigen Latex-Code ausspucken (unter Verwendung einer ziemlich schrecklichen Syntax), den ich dann kopiere und einfüge, aber das ist lästig (aber weitaus besser, als alles manuell zu zeichnen).

was ich jetzt habe:
Eingang:4 ci5 ci6 ci7 cp cr cp
Ausgabe:

\[\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}\]

Gibt es eine Möglichkeit, dies rein in LaTeX zu tun?

Antwort1

Dies ist ein Job für tikz:

Bildbeschreibung hier eingeben

Anmerkungen:

Code:

\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}

Antwort2

Mein Vorschlag wäre, einen Blick auf diebytefieldPaket. Wenn Sie viele Diagramme darstellen müssen und weniger vertraut sind mit TikZ, ist dies möglicherweise die richtige Möglichkeit.

Zur Veranschaulichung hier ein paar kurze Beispiele aus der Paketdokumentation:

\begin{bytefield}{32}
\bitheader{0-31} \\
\bitbox{4}{Four} & \bitbox{8}{Eight} &
\bitbox{16}{Sixteen} & \bitbox{4}{Four}
\end{bytefield}

wird herstellen:

einfaches Bytefeld-Beispiel

Natürlich können Sie es weglassen, \bitheader{0-31}dann werden die Bis nicht nummeriert. Wenn Sie außerdem eine Box wünschen, die sich über die gesamte Breite Ihrer „Spalte“ (oder Ihres Wortes) erstreckt, können Sie das \wordboxMakro wie folgt verwenden:

\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}

was dazu führt:

Bytefield-Beispiel mit Wörtern

Oder Sie können auch lange Datenblöcke auf komfortable Weise darstellen:

\begin{bytefield}{16}
\wordbox{1}{Some data} \\
\wordbox[lrt]{1}{Lots of data} \\
\skippedwords \\
\wordbox[lrb]{1}{} \\
\wordbox{2}{More data}
\end{bytefield}

was nach der Kompilierung folgendermaßen aussieht:

große Blöcke mit Bytefeld

Für komplexere Strukturen spielt man einfach mit diesen Bausteinen, wie im folgenden Beispiel (nur aus Spaß habe ich das bytefieldBeispiel in eine figureUmgebung gepackt und eine Überschrift hinzugefügt):

\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}

und das Ergebnis davon:

MPEG-4-Beispiel mit Bytefeld

Dies sind also einige relevante Beispiele mit bytefield. Ich weiß nicht, inwieweit Sie sich an die Syntax halten müssen, die Sie in Ihrer Frage verwendet haben, aber vielleicht haben diese Beispiele Ihr Interesse geweckt und der Übergang ist die Mühe wert.

verwandte Informationen