Implementando una forma de mostrar estructuras de datos en LaTeX

Implementando una forma de mostrar estructuras de datos en LaTeX

¿Existe alguna forma de implementar estructuras de datos en LaTeX?

Actualmente estoy tomando dos clases que requieren que se dibujen una gran cantidad de montones (mínimo, máximo) y colas (FIFO, LIFO) y similares después de insertar elementos.

Me gustaría que hubiera una manera de implementar algo que me permitiera pasar el número para agregar la estructura y luego dibujarla o algo así.

Actualmente, tengo pequeños programas escritos en C++ que toman las entradas y luego escupen el código látex correcto (usando una sintaxis bastante horrible), que luego copio y pego, pero esto es molesto (aunque mucho mejor que dibujar todo manualmente). ).

lo que tengo ahora:
aporte:4 ci5 ci6 ci7 cp cr cp
producción:

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

¿Hay alguna manera de hacer esto exclusivamente en LaTeX?

Respuesta1

Este es un trabajo para tikz:

ingrese la descripción de la imagen aquí

Notas:

Código:

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

Respuesta2

Mi sugerencia sería echar un vistazo a labytefieldpaquete. Si tiene muchos diagramas que representar y no está tan familiarizado con ellos TikZ, este podría ser el camino a seguir.

Para demostrarlo, aquí hay algunos ejemplos breves de la documentación del paquete:

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

Producirá:

ejemplo de campo de bytes simple

Por supuesto, puedes omitirlo \bitheader{0-31}y entonces el bis no estará numerado. Además, si desea un cuadro que abarque todo el ancho de su 'columna' (o palabra), puede usar la \wordboxmacro, como se muestra a continuación:

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

lo que resulta en:

ejemplo de campo de bytes con palabras

O incluso puede representar bloques de datos largos de una manera conveniente:

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

que después de la compilación se ve así:

bloques grandes con campo de bytes

Para estructuras más complejas, simplemente juega con estos bloques de construcción, como en el siguiente ejemplo (solo por diversión, envolví el bytefieldejemplo en un figureentorno y agregué un título):

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

y el resultado de ello:

Ejemplo de MPEG-4 con campo de bytes

Estos son algunos ejemplos relevantes con bytefield. No sé hasta qué punto debe ceñirse a la sintaxis que utilizó en su pregunta, pero tal vez estos ejemplos hayan examinado su apetito y la transición a realizar valga la pena.

información relacionada