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.

alt text

gefragt 20 Apr '18, 12:37

Blitz's gravatar image

Blitz
146711
Akzeptiert-Rate: 0%

bearbeitet 20 Apr '18, 14:17

cis's gravatar image

cis
9.5k75452491

Was hast Du denn versucht? Und an welcher Stelle kommst Du nicht weiter, Rechtecke oder Pfeile oder geschweifte Klammern?

(20 Apr '18, 13:53) stefan ♦♦

Mit seinem Verschachteln von Nodes ist er m.E. auf dem falschen Dampfer. Besser er versucht erst gar nichts in diese Richtung.

(20 Apr '18, 14:25) cis

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.

alt text

Ö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 \xdef durch \def ersetzt habe. Aber warum beamer \xdef nicht mag, weiss ich nicht wirklich.

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

alt text

Permanenter link

beantwortet 20 Apr '18, 19:14

Community's gravatar image

Community
21
Akzeptiert-Rate: 56%

bearbeitet 22 Apr '18, 20:02

Gel%C3%B6scht's gravatar image

Gelöscht
(ausgesetzt)

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: \usetikzlibrary{positioning,shapes.multipart,shapes,fit,decorations.pathreplacing} in der Dokumentpräambel vergessen? Leider kann man an der nicht als Code markierten und nicht mit dem notwendigen Umbruch versehenen Fehlermeldung nicht erkennen, was nun tatsächlich nicht definiert ist.

(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 \xdef nicht. In diesem Fall ist das nicht wichtig, \def tut's auch (und es ist möglicherweise sogar nicht 100% richtig, dass ich im oberen Code \xdef verwendet habe). Ich habe keine Ahnung, wieso \xdef hier nicht funktioniert, könnte damit zusammenhängen, dass beamer das Zeug erst später expandiert, damit Dinge wie \pause funtionieren. Aber das sind Spekulationen.

(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 \underline fragile ist.

(23 Apr '18, 01:01) Community

Der Unterstrich ist doch einfach \_ Naja, egal.

(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 \_ bekommst Du etwas, was oberhalb der baseline ist. Aber klar, wenn ich gewusst hätte, was das für Konsequenzen hat, hätte ich sicher nicht \underline genommen. Mir war nicht klar, dass der Befehl fragil ist und mit beamer in dieser Weise clasht. (Ohne beamer gab es ja die Probleme nicht.)

(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:

alt text

Ö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}
Permanenter link

beantwortet 20 Apr '18, 14:14

cis's gravatar image

cis
9.5k75452491
Akzeptiert-Rate: 29%

bearbeitet 20 Apr '18, 14:22

Deine Antwort
Vorschau umschalten

Folgen dieser Frage

Per E-Mail:

Wenn sie sich anmelden, kommen Sie für alle Updates hier in Frage

Per RSS:

Antworten

Antworten und Kommentare

Markdown-Grundlagen

  • *kursiv* oder _kursiv_
  • **Fett** oder __Fett__
  • Link:[Text](http://url.com/ "Titel")
  • Bild?![alt Text](/path/img.jpg "Titel")
  • nummerierte Liste: 1. Foo 2. Bar
  • zum Hinzufügen ein Zeilenumbruchs fügen Sie einfach zwei Leerzeichen an die Stelle an der die neue Linie sein soll.
  • grundlegende HTML-Tags werden ebenfalls unterstützt

Frage-Themen:

×728

gestellte Frage: 20 Apr '18, 12:37

Frage wurde gesehen: 6,056 Mal

zuletzt geändert: 23 Apr '18, 04:12