Ich würde gerne ein tikzpicture erstellen, wie in dieser grafik zu sehen https://www.corelan.be/wp-content/uploads/2009/07/image45.png Hab aber bisher keine hilfreiche antwort im forum dazu gefunden. |
TikZ hat eine Library eigens fürs Verschachteln: fit. Und die zweigeschossigen Nodes kann man mit der shapes.multipart Library erzeugen. Das hat den Vorteil, dann man die Exception_handler Nodes rechts von den Obergeschossen platzieren kann und dass man die Pfeile auch von/an den Ober- bzw. Untergeschossen starten bzw. enden lassen kann. Öffne in Overleaf
\documentclass[tikz,border=5pt]{standalone} \usetikzlibrary{positioning,shapes.multipart,shapes,fit,decorations.pathreplacing} % \makeatletter % from https://tex.stackexchange.com/a/88336/121799 % \newcommand{\GetCurrentNodeName}{\tikz@fig@name} % \makeatother \begin{document} \tikzset{basic/.style={ draw, rectangle split, rectangle split parts=2, rectangle split draw splits=true, text width=5cm, align=center, draw, }, murmel/.style={draw,text width=5cm,align=center} } \begin{tikzpicture}[font=\sffamily\small] % pointer nodes \node[basic, rectangle split parts=2] (pointer1) {Pointer to next SEH record \nodepart{two} Pointer to exception handler}; \node[below=1cm of pointer1,basic, rectangle split parts=2] (pointer2) {Pointer to next SEH record \nodepart{two} Pointer to exception handler}; \node[below=1cm of pointer2,basic, rectangle split parts=2] (pointer3) {Pointer to next SEH record \nodepart{two} Pointer to exception handler}; \node[below=1cm of pointer3,basic, rectangle split parts=2] (pointer4) {6xFFFFFF \nodepart{two} Default exception handler}; % Pfeile zwischen den nodeparts \draw[-latex] ([yshift=-1mm]pointer1.one east) -- ++(2mm,0) |- ([yshift=1mm]pointer2.one east); \draw[-latex] ([yshift=-1mm]pointer2.one east) -- ++(2mm,0) |- ([yshift=1mm]pointer3.one east); \draw[-latex] ([yshift=-1mm]pointer3.one east) -- ++(2mm,0) |- ([yshift=1mm]pointer4.one east); % Schachtel \node[draw,fit=(pointer1) (pointer4),label=above:stack,inner sep=4mm,yshift=2mm, xshift=1mm] (Schachtel){}; % \foreach \X in {1,...,4} { \ifnum\X=4 \xdef\mytext{MSVCRTexhandler} \else \xdef\mytext{Exception\underline{~~}handler\X ()} \fi \node[right=2cm of pointer\X.one east,murmel] (murmel\X) {\mytext}; \draw[blue,-latex] (pointer\X.two east) to[out=0,in=180] (murmel\X); % Klammer wie in cis' Antwort \draw[decorate,decoration={brace,mirror,amplitude=3pt},xshift=-1mm] ([xshift=-1mm]pointer\X.north -| Schachtel.west) -- ([xshift=-1mm]pointer\X.south -| Schachtel.west) node[midway,rotate=90,yshift=2mm,font=\tiny\sffamily]{$2\times4$ bytes}; } \end{tikzpicture} \end{document} ADDENDUM: Ja, es gibt in der Tat Probleme, wenn man obigen Code in beamer verwenden will. Ich konnte das Problem lösen, indem ich in der Schleife am Ende Öffne in Overleaf
\documentclass{beamer} \usepackage{tikz} \usetikzlibrary{positioning,shapes.multipart,shapes,fit,decorations.pathreplacing} % \makeatletter % from https://tex.stackexchange.com/a/88336/121799 % \newcommand{\GetCurrentNodeName}{\tikz@fig@name} % \makeatother \begin{document} \tikzset{arghh/.style={ draw, rectangle split, rectangle split parts=2, rectangle split draw splits=true, text width=5cm, align=center, draw, }, murmel/.style={draw,text width=5cm,align=center} } \begin{frame} \frametitle{Nodes verschachteln} \begin{overlayarea}{\textwidth}{8cm} \begin{tikzpicture}[font=\sffamily\small,scale=0.9,transform shape] % pointer nodes \node[arghh, rectangle split parts=2] (pointer1) {Pointer to next SEH record \nodepart{two} Pointer to exception handler}; \node[below=1cm of pointer1,arghh, rectangle split parts=2] (pointer2) {Pointer to next SEH record \nodepart{two} Pointer to exception handler}; \node[below=1cm of pointer2,arghh, rectangle split parts=2] (pointer3) {Pointer to next SEH record \nodepart{two} Pointer to exception handler}; \node[below=1cm of pointer3,arghh, rectangle split parts=2] (pointer4) {6xFFFFFF \nodepart{two} Default exception handler}; % Pfeile zwischen den nodeparts \draw[-latex] ([yshift=-1mm]pointer1.one east) -- ++(2mm,0) |- ([yshift=1mm]pointer2.one east); \draw[-latex] ([yshift=-1mm]pointer2.one east) -- ++(2mm,0) |- ([yshift=1mm]pointer3.one east); \draw[-latex] ([yshift=-1mm]pointer3.one east) -- ++(2mm,0) |- ([yshift=1mm]pointer4.one east); % Schachtel \node[draw,fit=(pointer1) (pointer4),label=above:stack,inner sep=6mm,yshift=1mm, xshift=1.5mm] (Schachtel){}; % % \foreach \X in {1,...,4} { \ifnum\X=4 \def\mytext{MSVCRTexhandler} \else \def\mytext{Exception\underline{~~}handler\X ()} \fi \node[right=1.4cm of pointer\X.one east,murmel] (murmel\X) {\mytext}; \draw[blue,-latex] (pointer\X.two east) to[out=0,in=180] (murmel\X); % Klammer wie in cis' Antwort \draw[decorate,decoration={brace,mirror,amplitude=3pt},xshift=-1mm] ([xshift=-1mm]pointer\X.north -| Schachtel.west) -- ([xshift=-1mm]pointer\X.south -| Schachtel.west) node[midway,rotate=90,yshift=2mm,font=\tiny\sffamily]{$2\times4$ bytes}; } \end{tikzpicture} \end{overlayarea} \end{frame} \end{document} 1
Das ist perfekt. Ich habe jedoch Probleme das ganze in einen beamer frame zu packen. wenn ich alles von tikzset bis end{tikzpicture} in eine eigene Datei packe und diese Datei in mein Hauptdokument einbinde, kommt der fehler: ! Undefined control sequence. XC@col@rlet ...2[#3]#4->begingroup edef @@cls {#1}XC@edef @@nam {#2}X... als standalone funktioniert es
(22 Apr '18, 15:51)
Blitz
@Blitz:
(22 Apr '18, 17:39)
saputello
@Blitz @saputello Ich habe eine Beamer Version hinzugefügt. Blitz hat Alles richtig gemacht, denke ich, aber aus irgendeinem Grund mag Beamer
(22 Apr '18, 20:07)
Community
1
@Blitz @saputello Ich habe eine Beamer Version hinzugefügt. Blitz hat Alles richtig gemacht, denke ich, aber xdef und underline mögen nicht so recht kooperieren in beamer. Ich habe mir erlaubt, eine dementsprechende Frage auf der Partner-Seite gestellt, und die antwort ist hier. Mir war nicht bewusst, dass
(23 Apr '18, 01:01)
Community
Der Unterstrich ist doch einfach
(23 Apr '18, 01:37)
cis
@cis Nicht exakt. Ich habe mich an der Vorlage orientiert, in der die Unterstrich unter der baseline sind. Mit
(23 Apr '18, 04:12)
Community
Ergebnis 5 von 6
show 1 more comments
|
Das muss kein Verschachteln von nodes sein (das dürfte auch kompliziert werden). Das lässt sich zum Beispiel mit einer TikZ-Matrix und diversen Annotationen umsetzen. Hier mal als Workaround: Öffne in Overleaf
%\documentclass[]{article} \documentclass[margin=5mm, tikz]{standalone} \usepackage[ngerman]{babel} \usepackage[utf8]{inputenc} \usepackage[T1]{fontenc} \usetikzlibrary{matrix} \usetikzlibrary{decorations.pathreplacing} \begin{document} \begin{tikzpicture}[ font=\sffamily\footnotesize, > = latex, % Trennstrich/.style={path picture={ \draw[] (path picture bounding box.west) --(path picture bounding box.east);}}, ] %Inhalte \newcommand\Pointer{% |[Trennstrich]|{Pointer to next SEH record \\ Pointer to Exception Handler} } \newcommand{\Handler}[1]{Exeption\_handler#1()} \newcommand{\Bytes}{2$\times$4 bytes} \matrix (m) [ matrix of nodes, row sep=1cm, column sep=1cm, nodes={draw, align=center, text width=12em}, ] { \Pointer & \Handler{1} \\ \Pointer & \Handler{2} \\ \Pointer & \Handler{3} \\ }; % % Rechteck \draw[] ([shift={(-1em,1em)}]m-1-1.north west) rectangle ([shift={(2em,-1em)}]m-3-1.south east); % Pfeile \draw[->] (m-1-1.east) -- ([xshift=3mm]m-1-1.east) |- (m-2-1); % \draw[cyan, ->, rounded corners, densely dotted] ([yshift=3mm]m-1-1.south east) -- ([xshift=4mm,yshift=3mm]m-1-1.south east) |- (m-1-2.west); % Annotationen \node[above=2em] at (m-1-1) {stack}; % Geschweifte Klammern \draw[shift={(-11em,0)}, decorate,decoration={brace,mirror,amplitude=3pt}] ([xshift=-1.5em]m-1-1.north west) -- ([xshift=-1.5em]m-1-1.south west) node[midway, rotate=90, yshift=1.5em]{\Bytes}; \end{tikzpicture} \end{document} beantwortet 20 Apr '18, 14:14 cis |
Was hast Du denn versucht? Und an welcher Stelle kommst Du nicht weiter, Rechtecke oder Pfeile oder geschweifte Klammern?
Mit seinem Verschachteln von Nodes ist er m.E. auf dem falschen Dampfer. Besser er versucht erst gar nichts in diese Richtung.