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
:
Anmerkungen:
- Dieser Code basiert auf einer komplizierteren Verwendung:Anzeigeprobleme beim Zeichnen von DNA-Sequenzen mit TikZ
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 diebytefield
Paket. 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:
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 \wordbox
Makro 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:
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:
Für komplexere Strukturen spielt man einfach mit diesen Bausteinen, wie im folgenden Beispiel (nur aus Spaß habe ich das bytefield
Beispiel in eine figure
Umgebung 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:
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.