
Ich bin ziemlich neu darin tikz
, verstehe also die Grundlagen, bin mir jedoch wirklich nicht sicher, wie ich am besten ein Verfahren wie Konstrukte erstelle: Es scheint so viele Mechanismen zu geben und ich kann nicht herausfinden, welcher der beste ist.
Hier ist eine Beispielzeichnung, die ich gemacht habe. Ich könnte LaTeX verwenden, um den Code prägnanter und wartungsfreundlicher zu gestalten, aber ich bin mir nicht sicher, welche Konstruktion die beste ist.
\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}
Die Ausgabe ist beigefügt. Ja, ich weiß, sie ist nicht besonders schön, aber das ist alles, was ich in diesem Stadium tun kann.
Meine Frage ist dann: Welche Abstraktionskonstrukte würden Sie zur Vereinfachung des obigen Codes empfehlen? Allgemeiner: Was befindet sich in der Tikz/LaTeX-Toolbox und wann sollte man jedes dieser Tools verwenden?
Antwort1
Ihre Frage ist meiner Meinung nach zu vage (oder allgemein), aber mir fallen folgende Möglichkeiten ein:
scope
Umgebungen verwendenVerwendung von vordefinierten oder selbst definierten Stilen
\node [body,minimum width=1cm]
In Ihrem Beispiel hätten Sie statt sieben Mal schreiben können:
\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}
oder Sie hätten einen Stil mit folgendem definieren können \tikzset
:
\tikzset{bodynode/.style={body,minimum width=1cm}}% self-defined style
Da Sie bereits verwendet haben \tikzset
, können Sie dies einfach zu den anderen Definitionen hinzufügen.
\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}
Und mit einer Kombination aus allen könnte man sich auch die wiederholte bodynode
Addition sparen:
\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}