¿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
:
Notas:
- Este código está adaptado de un uso más complicado:Problemas de visualización al dibujar secuencias de ADN con TikZ
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 labytefield
paquete. 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á:
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 \wordbox
macro, 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:
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í:
Para estructuras más complejas, simplemente juega con estos bloques de construcción, como en el siguiente ejemplo (solo por diversión, envolví el bytefield
ejemplo en un figure
entorno 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:
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.