
Soy bastante nuevo en tikz
esto, pero entiendo los conceptos básicos; sin embargo, estoy realmente confundido sobre cuál es la mejor manera de crear un procedimiento como construcciones: parece haber tantos mecanismos y no puedo determinar cuál es el mejor.
Aquí hay un dibujo de ejemplo que hice. Podría descubrir LaTeX para que el código sea más conciso y fácil de mantener, pero no estoy seguro de cuál es la mejor construcción.
\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{shapes.multipart}
\begin{document}
\tikzset{%
body/.style={inner sep=0pt,outer sep=0pt,shape=rectangle,draw,ultra thick,minimum height=0.5cm,anchor=south west},
dimen/.style={<->,>=latex,thin,
every rectangle node/.style={fill=white,midway}},
symmetry/.style={dashed,thin},
}
\begin{tikzpicture}[array/.style={
rectangle split,
rectangle split horizontal,
rectangle split parts=#1,
thick,draw,
anchor=center,
}]]
\node [array=10, align=center,,minimum width=\textwidth] at (0,0) (pool) {
\nodepart{one} \rotatebox{-90}{\begin{tabular}{ll}\textbf{\texttt{struct}}\\\texttt{Cons}\end{tabular}}
\nodepart{two} \rotatebox{-90}{\begin{tabular}{ll}\textbf{\texttt{struct}}\\\texttt{Cons}\end{tabular}}
\nodepart{three} $\cdots\cdots\cdots$
\nodepart{four} \rotatebox{-90}{\begin{tabular}{ll}\textbf{\texttt{struct}}\\\texttt{Cons}\end{tabular}}
\nodepart{five} $\cdots\cdots\cdots$
\nodepart{six} \rotatebox{-90}{\begin{tabular}{ll}\textbf{\texttt{struct}}\\\texttt{Cons}\end{tabular}}
\nodepart{seven} $\cdots\cdots\cdots$
\nodepart{eight} \rotatebox{-90}{\begin{tabular}{ll}\textbf{\texttt{struct}}\\\texttt{Cons}\end{tabular}}
\nodepart{nine} $\cdots\cdots\cdots$
\nodepart{ten} \rotatebox{-90}{\begin{tabular}{ll}\textbf{\texttt{struct}}\\\texttt{Cons}\end{tabular}}
};
\draw (pool.south west) -- ++(0,-1.5) coordinate (A1) -- ++(0,-5pt);
\draw (pool.south east) -- ++(0,-1.5) coordinate (A2) -- ++(0,-5pt);
\draw [dimen] (A1) -- (A2) node {$2^{\texttt{LG2\_POOLSIZE}} = 2^{14} = 16,384$};
\node (last) at (0,-1.5) {{\Large \emph{Pool of ``\textup{\texttt{\textbf{struct} Cons}}'' Records}}};
\node [body,minimum width=1cm] (last) at (-6,3.5) { \texttt{car} };
\draw (last.north west) -- ++(0,0.3) coordinate (A1) -- ++(0,5pt);
\draw (last.north east) -- ++(0,0.3) coordinate (A2) -- ++(0,5pt);
\draw [dimen] (A1) -- (A2) node {14b};
\draw[->] (last.south) -- (pool.one north);
\node [body,minimum width=1cm] (last) at (-5,2) { \texttt{cdr} };
\draw (last.north west) -- ++(0,0.3) coordinate (A1) -- ++(0,5pt);
\draw (last.north east) -- ++(0,0.3) coordinate (A2) -- ++(0,5pt);
\draw [dimen] (A1) -- (A2) node {14b};
\draw[->] (last.south) -- (pool.two north);
\node [body,minimum width=1cm] (last) at (-4,3.4) { \texttt{cdr} };
\draw (last.north west) -- ++(0,0.3) coordinate (A1) -- ++(0,5pt);
\draw (last.north east) -- ++(0,0.3) coordinate (A2) -- ++(0,5pt);
\draw [dimen] (A1) -- (A2) node {14b};
\draw[latex->] (last.south) -- (pool.four north);
\node [body,minimum width=1cm] (last) at (-2.5,3) { \texttt{cdr} };
\draw (last.north west) -- ++(0,0.3) coordinate (A1) -- ++(0,5pt);
\draw (last.north east) -- ++(0,0.3) coordinate (A2) -- ++(0,5pt);
\draw [dimen] (A1) -- (A2) node {14b};
\draw[->] (last.south) -- (pool.six north);
\node [body,minimum width=1cm] (last) at (0,2.5) { \texttt{car} };
\draw (last.north west) -- ++(0,0.3) coordinate (A1) -- ++(0,5pt);
\draw (last.north east) -- ++(0,0.3) coordinate (A2) -- ++(0,5pt);
\draw [dimen] (A1) -- (A2) node {14b};
\draw[->] (last.south) -- (pool.eight north);
\node [body,minimum width=1cm] (last) at (2,4) { \texttt{cdr} };
\draw (last.north west) -- ++(0,0.3) coordinate (A1) -- ++(0,5pt);
\draw (last.north east) -- ++(0,0.3) coordinate (A2) -- ++(0,5pt);
\draw [dimen] (A1) -- (A2) node {14b};
\draw[->] (last.south) -- (pool.ten north);
\node [body,minimum width=1cm] (last) at (5,2.5) { \texttt{car} };
\draw (last.north west) -- ++(0,0.3) coordinate (A1) -- ++(0,5pt);
\draw (last.north east) -- ++(0,0.3) coordinate (A2) -- ++(0,5pt);
\draw [dimen] (A1) -- (A2) node {14b};
\draw[->] (last.south) -- (pool.eight north);
\end{tikzpicture}
\end{document}
Se adjunta el resultado; Sí, ya sé que no es muy bonito, pero eso es lo que puedo hacer en este momento.
Entonces mi pregunta es: ¿qué construcciones abstractas recomendaría para simplificar el código anterior? En términos más generales, ¿qué hay en la caja de herramientas de tikz/LaTeX y cuándo se debe utilizar cada una de estas herramientas?
Respuesta1
Su pregunta es demasiado vaga (o amplia) en mi opinión, pero las posibilidades que me vienen a la mente son
usando
scope
entornosusando estilos, predefinidos o autodefinidos
Para tu ejemplo en lugar de escribir siete veces \node [body,minimum width=1cm]
podrías haber escrito
\begin{tikzpicture}
% …
\begin{scope}[every node/.style={body,minimum width=1cm}]% scope and pre-defined style
\node (last) at (-6,3.5) { \texttt{car} };
\draw (last.north west) -- ++(0,0.3) coordinate (A1) -- ++(0,5pt);
\draw (last.north east) -- ++(0,0.3) coordinate (A2) -- ++(0,5pt);
\draw [dimen] (A1) -- (A2) node {14b};
\draw[->] (last.south) -- (pool.one north);
\node (last) at (-5,2) { \texttt{cdr} };
\draw (last.north west) -- ++(0,0.3) coordinate (A1) -- ++(0,5pt);
\draw (last.north east) -- ++(0,0.3) coordinate (A2) -- ++(0,5pt);
\draw [dimen] (A1) -- (A2) node {14b};
\draw[->] (last.south) -- (pool.two north);
\node (last) at (-4,3.4) { \texttt{cdr} };
\draw (last.north west) -- ++(0,0.3) coordinate (A1) -- ++(0,5pt);
\draw (last.north east) -- ++(0,0.3) coordinate (A2) -- ++(0,5pt);
\draw [dimen] (A1) -- (A2) node {14b};
\draw[latex->] (last.south) -- (pool.four north);
\node (last) at (-2.5,3) { \texttt{cdr} };
\draw (last.north west) -- ++(0,0.3) coordinate (A1) -- ++(0,5pt);
\draw (last.north east) -- ++(0,0.3) coordinate (A2) -- ++(0,5pt);
\draw [dimen] (A1) -- (A2) node {14b};
\draw[->] (last.south) -- (pool.six north);
\node (last) at (0,2.5) { \texttt{car} };
\draw (last.north west) -- ++(0,0.3) coordinate (A1) -- ++(0,5pt);
\draw (last.north east) -- ++(0,0.3) coordinate (A2) -- ++(0,5pt);
\draw [dimen] (A1) -- (A2) node {14b};
\draw[->] (last.south) -- (pool.eight north);
\node (last) at (2,4) { \texttt{cdr} };
\draw (last.north west) -- ++(0,0.3) coordinate (A1) -- ++(0,5pt);
\draw (last.north east) -- ++(0,0.3) coordinate (A2) -- ++(0,5pt);
\draw [dimen] (A1) -- (A2) node {14b};
\draw[->] (last.south) -- (pool.ten north);
\node (last) at (5,2.5) { \texttt{car} };
\draw (last.north west) -- ++(0,0.3) coordinate (A1) -- ++(0,5pt);
\draw (last.north east) -- ++(0,0.3) coordinate (A2) -- ++(0,5pt);
\draw [dimen] (A1) -- (A2) node {14b};
\draw[->] (last.south) -- (pool.eight north);
\end{scope}
\end{tikzpicture}
o podrías haber definido un estilo con \tikzset
:
\tikzset{bodynode/.style={body,minimum width=1cm}}% self-defined style
Como ya ha utilizado \tikzset
, simplemente puede agregar esto a las otras definiciones.
\begin{tikzpicture}
% …
\node[bodynode] (last) at (-6,3.5) { \texttt{car} };
% …
\node[bodynode] (last) at (-5,2) { \texttt{cdr} };
% …
\node[bodynode] (last) at (-4,3.4) { \texttt{cdr} };
% …
\node[bodynode] (last) at (-2.5,3) { \texttt{cdr} };
% …
\node[bodynode] (last) at (0,2.5) { \texttt{car} };
% …
\node[bodynode] (last) at (2,4) { \texttt{cdr} };
% …
\node[bodynode] (last) at (5,2.5) { \texttt{car} };
% …
\end{tikzpicture}
Y con una combinación de todos ellos podrías ahorrarte también la bodynode
suma repetida:
\tikzset{bodynode/.style={body,minimum width=1cm}}% self-defined style
\begin{tikzpicture}
% …
\begin{scope}[every node/.style=bodynode]% scope and pre-defined style calling
% self-defined style
\node (last) at (-6,3.5) { \texttt{car} };
% …
\node (last) at (-5,2) { \texttt{cdr} };
% …
\node (last) at (-4,3.4) { \texttt{cdr} };
% …
\node (last) at (-2.5,3) { \texttt{cdr} };
% …
\node (last) at (0,2.5) { \texttt{car} };
% …
\node (last) at (2,4) { \texttt{cdr} };
% …
\node (last) at (5,2.5) { \texttt{car} };
% …
\end{scope}
\end{tikzpicture}