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
:
Notas:
- Este código é adaptado de um uso mais complicado:Exibir problemas ao desenhar sequências de DNA com 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}
Responder2
Minha sugestão seria dar uma olhada nobytefield
pacote. 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:
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 \wordbox
macro, 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:
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:
Para estruturas mais complexas, você apenas brinca com esses blocos de construção, como no exemplo a seguir (só por diversão, envolvi o bytefield
exemplo em um figure
ambiente 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:
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.