Implementando uma forma de mostrar estruturas de dados em LaTeX

Implementando uma forma de mostrar estruturas de dados em LaTeX

Existe uma maneira de implementar estruturas de dados em LaTeX?

Atualmente estou cursando duas aulas que exigem que um grande número de heaps (min, max) e filas (FIFO, LIFO) e similares sejam desenhados após a inserção de elementos.

Eu gostaria que houvesse uma maneira de implementar algo que me permitisse passar o número para somar a estrutura e depois desenhá-la ou algo assim?

Atualmente, tenho pequenos programas escritos em C++ que recebem as entradas e depois cospem o código látex correto (usando uma sintaxe bastante horrível), que copio e colo, mas isso é irritante (embora muito melhor do que desenhar tudo manualmente ).

o que tenho agora:
entrada:4 ci5 ci6 ci7 cp cr cp
saída:

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

Existe uma maneira de fazer isso puramente em LaTeX?

Responder1

Este é um trabalho para tikz:

insira a descrição da imagem aqui

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}

Responder2

Minha sugestão seria dar uma olhada nobytefieldpacote. Se você tem muitos diagramas para representar e está menos familiarizado com eles TikZ, este pode ser o caminho a seguir.

Para demonstrar isso, aqui estão alguns pequenos exemplos da documentação do pacote:

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

vai produzir:

exemplo simples de campo de bytes

Claro, você pode omitir \bitheader{0-31}e assim o bis não será numerado. Além disso, se você quiser uma caixa que ocupe toda a largura da sua 'coluna' (ou palavra), você pode usar a \wordboxmacro, conforme abaixo:

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

o que resulta em:

exemplo de bytefield com palavras

Ou você pode até representar longos blocos de dados de maneira 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 após a compilação fica assim:

grandes blocos com bytefield

Para estruturas mais complexas, você apenas brinca com esses blocos de construção, como no exemplo a seguir (só por diversão, envolvi o bytefieldexemplo em um figureambiente e adicionei uma legenda):

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

e o resultado disso:

Exemplo de MPEG-4 com campo de bytes

Portanto, estes são alguns exemplos relevantes com bytefield. Não sei até que ponto você precisa seguir a sintaxe usada em sua pergunta, mas talvez esses exemplos tenham controlado seu apetite e a transição a ser feita valha o esforço.

informação relacionada